Document api modules and require explicit imports of API submodules

This commit is contained in:
Dion Moult
2024-05-08 17:00:35 +10:00
parent 984b1212a6
commit 10d30b0de7
34 changed files with 358 additions and 51 deletions
@@ -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))
@@ -16,12 +16,15 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,4 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -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__)
@@ -16,9 +16,23 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,13 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,18 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,5 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,15 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,15 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,15 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,16 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,9 +16,17 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,9 +16,19 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,8 +16,20 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,22 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,7 +16,21 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,15 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,8 +16,17 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,7 +16,20 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,8 +16,18 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,9 +16,20 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,7 +16,20 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,13 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,7 +16,16 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,13 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,15 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,7 +16,18 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,6 +16,14 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)
@@ -16,7 +16,18 @@
# You should have received a copy of the GNU Lesser General Public License
# along with IfcOpenShell. If not, see <http://www.gnu.org/licenses/>.
"""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__)