diff --git a/src/ifcopenshell-python/ifcopenshell/api/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/__init__.py
index 2e6e2c1370..e24870d956 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/__init__.py
@@ -27,7 +27,6 @@ relationships are all handled automatically.
import json
import numpy
-import pkgutil
import inspect
import importlib
import ifcopenshell
@@ -328,50 +327,15 @@ def wrap_usecase(usecase_path, usecase):
return wrapper
-# Expose all submodules. This means that the user can just type `import ifcopenshell.api`.
-import ifcopenshell.api.aggregate as aggregate
-import ifcopenshell.api.attribute as attribute
-import ifcopenshell.api.boundary as boundary
-import ifcopenshell.api.classification as classification
-import ifcopenshell.api.constraint as constraint
-import ifcopenshell.api.context as context
-import ifcopenshell.api.control as control
-import ifcopenshell.api.cost as cost
-import ifcopenshell.api.document as document
-import ifcopenshell.api.drawing as drawing
-import ifcopenshell.api.geometry as geometry
-import ifcopenshell.api.georeference as georeference
-import ifcopenshell.api.grid as grid
-import ifcopenshell.api.group as group
-import ifcopenshell.api.layer as layer
-import ifcopenshell.api.library as library
-import ifcopenshell.api.material as material
-import ifcopenshell.api.nest as nest
-import ifcopenshell.api.owner as owner
-import ifcopenshell.api.profile as profile
-import ifcopenshell.api.project as project
-import ifcopenshell.api.pset as pset
-import ifcopenshell.api.pset_template as pset_template
-import ifcopenshell.api.resource as resource
-import ifcopenshell.api.root as root
-import ifcopenshell.api.sequence as sequence
-import ifcopenshell.api.spatial as spatial
-import ifcopenshell.api.structural as structural
-import ifcopenshell.api.style as style
-import ifcopenshell.api.system as system
-import ifcopenshell.api.type as type # Whoohoo!
-import ifcopenshell.api.unit as unit
-import ifcopenshell.api.void as void
+def wrap_usecases(path, name):
+ """This developer feature wraps an API module's usecases with listeners."""
+ import sys
+ import pkgutil
-# Wrap all submodule usecases with listeners.
-# This for loop also conveniently ensures that the above imports are comprehensive.
-for loader, module_name, is_pkg in pkgutil.iter_modules(__path__, __name__ + "."):
- # Check if it's a direct child (only one level deep)
- if module_name.count(".") == __name__.count(".") + 1:
- module_name = module_name.split(".")[-1]
- module = globals()[module_name]
- for usecase_name in vars(module):
- usecase = getattr(module, usecase_name)
- if callable(usecase):
- usecase_path = f"{module_name}.{usecase_name}"
- setattr(module, usecase_name, wrap_usecase(usecase_path, usecase))
+ module_name = name.split(".")[-1]
+ module = sys.modules[name]
+ for loader, usecase_name, is_pkg in pkgutil.iter_modules(path):
+ usecase = getattr(module, usecase_name)
+ if callable(usecase):
+ usecase_path = f"{module_name}.{usecase_name}"
+ setattr(module, usecase_name, wrap_usecase(usecase_path, usecase))
diff --git a/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py
index bf452c8e2b..21630a9be4 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/aggregate/__init__.py
@@ -16,12 +16,15 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
-"""Aggregates are the concept of breaking down larger wholes into smaller parts.
+"""Aggregates is the concept of breaking down larger wholes into smaller parts.
-One common use is spatial elements, such as how a site has multiple buildings,
-and a building has multiple storeys. Another is for regular elements, such as
-how a wall is made out of members and coverings.
+For example, spatial elements such as sites are broken down into one or more
+buildings, and a building is broken down into storeys. Another example is for
+physical elements, such as how a wall is made out of members and coverings.
"""
+from .. import wrap_usecases
from .assign_object import assign_object
from .unassign_object import unassign_object
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py
index 31a605de5d..6d1164b4bd 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/attribute/__init__.py
@@ -16,4 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Basic modification of the attributes of an element.
+
+All IFC entities have attributes. Some of these attributes contain rules about
+inheritance and what they are allowed to contain. These usecases make sure that
+any editing complies with these rules.
+"""
+
+from .. import wrap_usecases
from .edit_attributes import edit_attributes
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py
index fff4c4e7f5..027c2cf00b 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/boundary/__init__.py
@@ -18,9 +18,15 @@
"""Boundaries are primarily used for representing virtual interfaces between
spaces for energy analysis.
+
+Boundaries may be associated with spaces or physical elements that enclose
+spaces such as walls, doors, and windows.
"""
+from .. import wrap_usecases
from .assign_connection_geometry import assign_connection_geometry
from .copy_boundary import copy_boundary
from .edit_attributes import edit_attributes
from .remove_boundary import remove_boundary
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py
index 6616ff6f89..1ad42def0c 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/classification/__init__.py
@@ -16,9 +16,23 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Classification systems are a way of categorising objects
+
+Although IFC itself comes with a built-in classification hierarchy (e.g.
+IfcWall and its predefined types of PARTITIONING, etc), there are many external
+or custom classification systems such as Uniclass, Omniclass and more. IFC is
+able to integrate with any external classification system.
+
+This API allows you to manage and assign external classification systems and
+references.
+"""
+
+from .. import wrap_usecases
from .add_classification import add_classification
from .add_reference import add_reference
from .edit_classification import edit_classification
from .edit_reference import edit_reference
from .remove_classification import remove_classification
from .remove_reference import remove_reference
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py
index 7309050851..3e17e6a708 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/constraint/__init__.py
@@ -16,6 +16,13 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Constraints are an advanced feature allowing you to specify parametric
+limits on properties
+
+Warning: usage of constraints are mostly untested in real life applications.
+"""
+
+from .. import wrap_usecases
from .add_metric import add_metric
from .add_metric_reference import add_metric_reference
from .add_objective import add_objective
@@ -25,3 +32,5 @@ from .edit_objective import edit_objective
from .remove_constraint import remove_constraint
from .remove_metric import remove_metric
from .unassign_constraint import unassign_constraint
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py
index 1edb3ee252..556d45145c 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/context/__init__.py
@@ -16,6 +16,18 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Contexts allow you to classify when geometry should be used in different
+purposes
+
+For example, a door may have many geometries assigned to it: a 3D body
+geometry, a clearance zone for disabled access and egress, and a 2D top down
+plan view representation annotating swing extents. Each geometry is assigned to
+a context to distinguish its purpose and level of detail.
+"""
+
+from .. import wrap_usecases
from .add_context import add_context
from .edit_context import edit_context
from .remove_context import remove_context
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py
index 792f5eec35..7aa970005e 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/control/__init__.py
@@ -16,5 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Processes and costs may be controlled by other entities which indicate
+constraints that determine how they can change
+
+This is an advanced feature mostly used in 4D/5D
+"""
+
+from .. import wrap_usecases
from .assign_control import assign_control
from .unassign_control import unassign_control
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py
index 4cf5fc63c6..713f243c4a 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/cost/__init__.py
@@ -16,6 +16,15 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Manage cost schedules, cost items, cost estimation and parametric quantity
+take-off
+
+IFC supports storing cost schedules and detailed cost breakdown structures,
+including formulas, subtotals, and parametric links to model element
+quantities.
+"""
+
+from .. import wrap_usecases
from .add_cost_item import add_cost_item
from .add_cost_item_quantity import add_cost_item_quantity
from .add_cost_schedule import add_cost_schedule
@@ -35,3 +44,5 @@ from .remove_cost_item_quantity import remove_cost_item_quantity
from .remove_cost_schedule import remove_cost_schedule
from .remove_cost_value import remove_cost_value
from .unassign_cost_item_quantity import unassign_cost_item_quantity
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py
index b1affe3a71..0e18a16fee 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/document/__init__.py
@@ -16,6 +16,15 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Reference external project documents and associate them to model elements
+
+Some project information (drawings, specifications, certificates, reports, etc)
+may be stored in external documents (locally or in a CDE). IFC lets you store a
+register of documents with metadata and associate them with elements (both
+physical and non-physical).
+"""
+
+from .. import wrap_usecases
from .add_information import add_information
from .add_reference import add_reference
from .assign_document import assign_document
@@ -24,3 +33,5 @@ from .edit_reference import edit_reference
from .remove_information import remove_information
from .remove_reference import remove_reference
from .unassign_document import unassign_document
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py
index dd010e886e..50c8838cd6 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/drawing/__init__.py
@@ -16,6 +16,15 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Create relationships necessary for smart annotations for drawings
+
+Drawings may be generated from modeled elements and annotations. These
+annotations may have relationships which indicate smart data being populated.
+"""
+
+from .. import wrap_usecases
from .assign_product import assign_product
from .edit_text_literal import edit_text_literal
from .unassign_product import unassign_product
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py
index 0aa8756ea0..e0b6f83319 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/__init__.py
@@ -16,6 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Create geometric representations and assign them to elements
+
+These functions support both the creation of arbitrary geometry as well as
+geometry that follows parametric rules (e.g. layered geometry or profiled
+geometry extrusions).
+"""
+
+from .. import wrap_usecases
from .add_axis_representation import add_axis_representation
from .add_boolean import add_boolean
try:
@@ -51,3 +59,5 @@ from .map_representation import map_representation
from .remove_boolean import remove_boolean
from .remove_representation import remove_representation
from .unassign_representation import unassign_representation
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py
index 1aa858db17..5488015977 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/georeference/__init__.py
@@ -16,6 +16,16 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Manage georeferencing metadata
+
+IFC model geometry may have a coordinate reference system (CRS) assigned to it.
+It may also optionally have a map conversion defined to transform to and from
+map coordinates and project local engineering coordinates.
+"""
+
+from .. import wrap_usecases
from .add_georeferencing import add_georeferencing
from .edit_georeferencing import edit_georeferencing
from .remove_georeferencing import remove_georeferencing
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py
index 9991a7bc06..bdbe764870 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/grid/__init__.py
@@ -16,9 +16,17 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Manages grid and grid axes
+
+A grid in IFC may contain two or more axes running in two or more directions.
+"""
+
+from .. import wrap_usecases
try:
from .create_axis_curve import create_axis_curve
except ModuleNotFoundError as e:
print(f"Note: API not available due to missing dependencies: grid.create_axis_curve - {e}")
from .create_grid_axis import create_grid_axis
from .remove_grid_axis import remove_grid_axis
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py
index 5b729b0dfc..e5f9c9db67 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/group/__init__.py
@@ -16,9 +16,19 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Elements may be arbitrarily assigned to groups for organisation
+
+Groups are useful for filtering elements or non-hierarchical organisation of a
+model. Note that this only targets arbitrary groups. If you want to group
+elements into a distribution system, see :mod:`ifcopenshell.api.system`.
+"""
+
+from .. import wrap_usecases
from .add_group import add_group
from .assign_group import assign_group
from .edit_group import edit_group
from .remove_group import remove_group
from .unassign_group import unassign_group
from .update_group_products import update_group_products
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py
index 03145bf34a..d06b0189d9 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/layer/__init__.py
@@ -16,8 +16,20 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Manage CAD layers
+
+Note that in IFC, elements cannot be assigned to CAD layers. Instead, the
+geometric representation of the element is associated to a layer.
+
+If you want to associated a whole element to a "layer", consider using
+:mod:`ifcopenshell.api.classification`.
+"""
+
+from .. import wrap_usecases
from .add_layer import add_layer
from .assign_layer import assign_layer
from .edit_layer import edit_layer
from .remove_layer import remove_layer
from .unassign_layer import unassign_layer
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py
index dbb74de3d4..f5984dbfff 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/library/__init__.py
@@ -16,6 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Manage references to external libraries
+
+An external library is any system which uses a key to store information. This
+allows you to associate IFC entities with any arbitrary external database, API,
+system, and so on. This is typically useful in smart building systems.
+"""
+
+from .. import wrap_usecases
from .add_library import add_library
from .add_reference import add_reference
from .assign_reference import assign_reference
@@ -24,3 +32,5 @@ from .edit_reference import edit_reference
from .remove_library import remove_library
from .remove_reference import remove_reference
from .unassign_reference import unassign_reference
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py
index 2831915f76..a03ccba9aa 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/material/__init__.py
@@ -16,6 +16,22 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Manage physical materials (concrete, steel, etc) and their association to
+elements
+
+IFC supports both simple materials and parametric materials (materials that
+have layered thicknesses or cross sectional profiles).
+
+Parametric materials will include parametric constraints on the geometry of
+the element. These API functions do not cover that responsibility. See
+:mod:`ifcopenshell.api.geometry`.
+
+Note that this API only covers physical materials, not visual styles. If you
+want to look at visual styles such as colours, transparency, shading, or
+rendering options, see :mod:`ifcopenshell.api.style`.
+"""
+
+from .. import wrap_usecases
from .add_constituent import add_constituent
from .add_layer import add_layer
from .add_list_item import add_list_item
@@ -40,3 +56,5 @@ from .remove_material_set import remove_material_set
from .remove_profile import remove_profile
from .reorder_set_item import reorder_set_item
from .unassign_material import unassign_material
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py
index 242e12eb11..162f9c07a2 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/nest/__init__.py
@@ -16,7 +16,21 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Nesting is when a component is attached to a host element
+
+Examples include when a faucet is attached using a predrilled hole in a basin,
+or when a modular connection occurs through a connection point. This implies
+that when a host element moves, the child nested components must move as well.
+
+Note that this API is not meant to be used for connection points on
+distribution systems. For that purpose, such as for pipe fittings and
+equipment, please see :mod:`ifcopenshell.api.system`.
+"""
+
+from .. import wrap_usecases
from .assign_object import assign_object
from .change_nest import change_nest
from .reorder_nesting import reorder_nesting
from .unassign_object import unassign_object
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py
index 755fa4fc5f..f61689b906 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/owner/__init__.py
@@ -16,6 +16,15 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""An element may have an owner, indicating who is responsible, liable, or
+contactable regarding that element
+
+Note that in IFC2X3, element ownership is mandatory and must be addressed prior
+to the creation of any element at all. See :func:`create_owner_history` for
+examples.
+"""
+
+from .. import wrap_usecases
from .add_actor import add_actor
from .add_address import add_address
from .add_application import add_application
@@ -39,3 +48,5 @@ from .remove_person_and_organisation import remove_person_and_organisation
from .remove_role import remove_role
from .unassign_actor import unassign_actor
from .update_owner_history import update_owner_history
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py
index 7decc6750b..6b4a5a1efd 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/profile/__init__.py
@@ -16,8 +16,17 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Handles the definition of cross sectional profiles
+
+Maintaining a clean profile library is important for structural simulations and
+identification of standardised profiles for fabrication and carbon counting.
+"""
+
+from .. import wrap_usecases
from .add_arbitrary_profile import add_arbitrary_profile
from .add_arbitrary_profile_with_voids import add_arbitrary_profile_with_voids
from .add_parameterized_profile import add_parameterized_profile
from .edit_profile import edit_profile
from .remove_profile import remove_profile
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py
index e9c21fbddd..2641ad8ab8 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/project/__init__.py
@@ -16,7 +16,20 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Create an IFC project
+
+All IFCs must have one, and only one IFC project before any data may be
+associated. If you are starting from scratch, see :func:create_file.
+
+Once a project exists, you may optionally create project libraries and
+associate type assets with it. You may also append assets from other projects
+into your project.
+"""
+
+from .. import wrap_usecases
from .append_asset import append_asset
from .assign_declaration import assign_declaration
from .create_file import create_file
from .unassign_declaration import unassign_declaration
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py
index c3e01e30df..dbb4fb84c2 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/pset/__init__.py
@@ -16,8 +16,18 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Property sets and quantity sets let you store simple key value metadata
+associated with elements
+
+This is the simplest and most common way to store information about an element.
+For example, if a door has a fire rating, it is stored as a property.
+"""
+
+from .. import wrap_usecases
from .add_pset import add_pset
from .add_qto import add_qto
from .edit_pset import edit_pset
from .edit_qto import edit_qto
from .remove_pset import remove_pset
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py
index 1c5963479c..971067d074 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/__init__.py
@@ -16,9 +16,20 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Manage property templates to standard project property names and data types
+
+To help standardise the naming, data types, and association of properties to
+elements, IFC supports property set templates. buildingSMART provides their own
+built-in ISO-standardised property templates, but governments, companies, and
+individuals may also create their own.
+"""
+
+from .. import wrap_usecases
from .add_prop_template import add_prop_template
from .add_pset_template import add_pset_template
from .edit_prop_template import edit_prop_template
from .edit_pset_template import edit_pset_template
from .remove_prop_template import remove_prop_template
from .remove_pset_template import remove_pset_template
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py
index 8fcff6a7fc..7d318f8900 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/resource/__init__.py
@@ -16,6 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Manage construction and maintenance resources
+
+Resources include equipment (cranes, etc), labour, material, and products. They
+are typically referenced in construction planning, maintenance schedules, or
+cost items.
+"""
+
+from .. import wrap_usecases
from .add_resource import add_resource
from .add_resource_quantity import add_resource_quantity
from .add_resource_time import add_resource_time
@@ -28,3 +36,5 @@ from .edit_resource_time import edit_resource_time
from .remove_resource import remove_resource
from .remove_resource_quantity import remove_resource_quantity
from .unassign_resource import unassign_resource
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py
index 309f87cfff..8845c8e663 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/root/__init__.py
@@ -16,7 +16,20 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Create, copy, or remove physical elements such as walls, doors, slabs, etc
+
+This is one of the most used API modules and should be used any time you want
+to create, remove, copy, or change a physical or spatial element. See
+:func:`create_entity` to get started.
+
+This module should also be used to create types. To then associate types with
+elements, see :mod:`ifcopenshell.api.type`.
+"""
+
+from .. import wrap_usecases
from .copy_class import copy_class
from .create_entity import create_entity
from .reassign_class import reassign_class
from .remove_product import remove_product
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py
index 90cb5f4922..a901acec9c 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/__init__.py
@@ -16,6 +16,13 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Manage work schedules, tasks, calendars, and more for 4D
+
+These are typically used for construction planning, but may also be used in
+managing recurring facility maintenance schedules.
+"""
+
+from .. import wrap_usecases
from .add_task import add_task
from .add_task_time import add_task_time
from .add_time_period import add_time_period
@@ -59,3 +66,5 @@ from .unassign_process import unassign_process
from .unassign_product import unassign_product
from .unassign_recurrence_pattern import unassign_recurrence_pattern
from .unassign_sequence import unassign_sequence
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py
index 22891f5c83..564c91606f 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/spatial/__init__.py
@@ -16,7 +16,16 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Assign spatial relationships such as when an element is in a space
+
+Physical elements (walls, doors, etc) may be contained in or reference spatial
+elements (spaces, storeys, buildings, etc).
+"""
+
+from .. import wrap_usecases
from .assign_container import assign_container
from .dereference_structure import dereference_structure
from .reference_structure import reference_structure
from .unassign_container import unassign_container
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py
index 3bdaf8c004..d466add6ce 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/structural/__init__.py
@@ -16,6 +16,13 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Manage analytical properties for structural simulation
+
+This only handles authoring the analytical model, and does not actually perform
+any structural simulation. To perform the simulation, see IFC2CA.
+"""
+
+from .. import wrap_usecases
from .add_structural_activity import add_structural_activity
from .add_structural_analysis_model import add_structural_analysis_model
from .add_structural_boundary_condition import add_structural_boundary_condition
@@ -37,3 +44,5 @@ from .remove_structural_load import remove_structural_load
from .remove_structural_load_case import remove_structural_load_case
from .remove_structural_load_group import remove_structural_load_group
from .unassign_structural_analysis_model import unassign_structural_analysis_model
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py
index df9fd47518..e32e13a5b1 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/style/__init__.py
@@ -16,6 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Manage visual styles of geometry (colours, transparency, rendering, etc)
+
+Geometry may have visual styles associated with it, including surface styles,
+2D curve styles, text styles, and more. Surface styles are most commonly used
+for simple colouring.
+"""
+
+from .. import wrap_usecases
from .add_style import add_style
from .add_surface_style import add_surface_style
from .add_surface_textures import add_surface_textures
@@ -28,3 +36,5 @@ from .remove_styled_representation import remove_styled_representation
from .remove_surface_style import remove_surface_style
from .unassign_material_style import unassign_material_style
from .unassign_representation_styles import unassign_representation_styles
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py
index 14213ca168..0d374c830c 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/system/__init__.py
@@ -16,6 +16,15 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Manage distribution systems and port connectivity
+
+Service distribution systems (mechanical, electrical, hydraulic, fire,
+logistical, etc) consist of connected distribution segments, fittings,
+terminals, control equipment, and more. This module handles port connectivity
+and relationships describing distribution flow.
+"""
+
+from .. import wrap_usecases
from .add_port import add_port
from .add_system import add_system
from .assign_flow_control import assign_flow_control
@@ -28,3 +37,5 @@ from .remove_system import remove_system
from .unassign_flow_control import unassign_flow_control
from .unassign_port import unassign_port
from .unassign_system import unassign_system
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py
index dddd90a49f..39a523123d 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/type/__init__.py
@@ -16,7 +16,18 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Manage common construction types of physical elements
+
+Almost all constructed elements may be grouped into "types". Types include wall
+types, window types, column types, equipment types, and more.
+
+Using types is critical to the success of any project.
+"""
+
+from .. import wrap_usecases
from .assign_type import assign_type
from .get_related_objects import get_related_objects
from .map_type_representations import map_type_representations
from .unassign_type import unassign_type
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py
index 3813724dd7..058e3f2c72 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/unit/__init__.py
@@ -16,6 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Define units (length, area, monetary, pressure, etc)
+
+Units can be defined as a default project unit or used specifically for certain
+properties. Units may be especially complex when dealing with services and
+equipment.
+"""
+
+from .. import wrap_usecases
from .add_context_dependent_unit import add_context_dependent_unit
from .add_conversion_based_unit import add_conversion_based_unit
from .add_monetary_unit import add_monetary_unit
@@ -26,3 +34,5 @@ from .edit_monetary_unit import edit_monetary_unit
from .edit_named_unit import edit_named_unit
from .remove_unit import remove_unit
from .unassign_unit import unassign_unit
+
+wrap_usecases(__path__, __name__)
diff --git a/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py b/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py
index 51e0db158b..ae02decb95 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/void/__init__.py
@@ -16,7 +16,18 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see .
+"""Create void relationships between openings and physical elements
+
+An opening is a special element (created using
+:func:`ifcopenshell.api.root.create_entity`) that may then be used to create
+voids in other elements (such as walls and slabs). These voids may then be
+filled with doors, trapdoors, skylights, and so on.
+"""
+
+from .. import wrap_usecases
from .add_filling import add_filling
from .add_opening import add_opening
from .remove_filling import remove_filling
from .remove_opening import remove_opening
+
+wrap_usecases(__path__, __name__)