ifcopenshell.api.project.append_asset

Module Contents

class ifcopenshell.api.project.append_asset.SafeRemovalContext(ifc_file: ifcopenshell.file, reuse_identities: dict[int, ifcopenshell.entity_instance])
file: ifcopenshell.file
reuse_identities: dict[int, ifcopenshell.entity_instance]
class ifcopenshell.api.project.append_asset.Usecase
add_element(element: ifcopenshell.entity_instance) ifcopenshell.entity_instance | None
add_inverse_element(element: ifcopenshell.entity_instance) None
append_cost_schedule()
append_material()
append_presentation_style()
append_product()
append_profile_def()
append_type_product()
by_guid(guid: str) ifcopenshell.entity_instance | None
check_inverses(element: ifcopenshell.entity_instance) None
create_equivalent_context(added_context: ifcopenshell.entity_instance) ifcopenshell.entity_instance
execute()
file_add(element: ifcopenshell.entity_instance, conversion_factor: float | None = None) ifcopenshell.entity_instance

Reimplementation of file.add but taking into account that some elements (profiles, materials) are already existing (checking by their name) and shouldn’t be duplicated.

The problem with file.add it’s recursively adding element and all it’s attributes and there is no control to prevent it from adding certain type of elements.

get_equivalent_existing_context(added_context: ifcopenshell.entity_instance) ifcopenshell.entity_instance | None
get_existing_element(element: ifcopenshell.entity_instance) ifcopenshell.entity_instance | None
has_whitelisted_inverses(element: ifcopenshell.entity_instance) bool
is_another_asset(element: ifcopenshell.entity_instance) bool

Is IFC entity from inverse attribute is another asset to append that should be skipped.

reuse_existing_contexts() None
assume_asset_uniqueness_by_name: bool
file: ifcopenshell.file
settings: dict[str, Any]
whitelisted_inverse_attributes: dict[str, list[str]]
ifcopenshell.api.project.append_asset.append_asset(file: ifcopenshell.file, library: ifcopenshell.file, element: ifcopenshell.entity_instance, reuse_identities: dict[int, ifcopenshell.entity_instance] | None = None, assume_asset_uniqueness_by_name: bool = True) ifcopenshell.entity_instance

Appends an asset from a library into the active project

A BIM library asset may be a type product (e.g. wall type), product (e.g. pump), material, profile, or cost schedule.

This copies the asset from the specified library file into the active project. It handles all details like ensuring that product materials, styles, properties, quantities, and so on are preserved.

If an asset contains geometry, the geometric contexts are also intelligentely transplanted such that existing equivalent contexts are reused.

Do not mix units.

Parameters:
  • library – The file object containing the asset.

  • element – An element in the library file of the asset. It may be an IfcTypeProduct, IfcProduct, IfcMaterial, IfcCostSchedule, or IfcProfileDef.

  • reuse_identities – Optional dictionary of mapped entities’ identities to the already created elements. It will be used to avoid creating duplicated inverse elements during multiple project.append_asset calls. If you want to add just 1 asset or if added assets won’t have any shared elements, then it can be left empty.

  • assume_asset_uniqueness_by_name – If True, checks if elements (profiles, materials, styles) with the same name already exist in the project and reuses them instead of appending new ones.

Returns:

The appended element

Example:

# Programmatically generate a library. You could do this visually too.
library = ifcopenshell.api.project.create_file()
root = ifcopenshell.api.root.create_entity(library, ifc_class="IfcProject", name="Demo Library")
context = ifcopenshell.api.root.create_entity(library,
    ifc_class="IfcProjectLibrary", name="Demo Library")
ifcopenshell.api.project.assign_declaration(library, definitions=[context], relating_context=root)

# Assign units for our example library
unit = ifcopenshell.api.unit.add_si_unit(library,
    unit_type="LENGTHUNIT", prefix="MILLI")
ifcopenshell.api.unit.assign_unit(library, units=[unit])

# Let's create a single asset of a 200mm thick concrete wall
wall_type = ifcopenshell.api.root.create_entity(library, ifc_class="IfcWallType", name="WAL01")
concrete = ifcopenshell.api.material.add_material(usecase.file, name="CON", category="concrete")
rel = ifcopenshell.api.material.assign_material(library,
    products=[wall_type], type="IfcMaterialLayerSet")
layer = ifcopenshell.api.material.add_layer(library,
    layer_set=rel.RelatingMaterial, material=concrete)
layer.Name = "Structure"
layer.LayerThickness = 200

# Mark our wall type as a reusable asset in our library.
ifcopenshell.api.project.assign_declaration(library,
    definitions=[wall_type], relating_context=context)

# Let's imagine we're starting a new project
model = ifcopenshell.api.project.create_file()
project = ifcopenshell.api.root.create_entity(model, ifc_class="IfcProject", name="Test")

# Now we can easily append our wall type from our library
wall_type = ifcopenshell.api.project.append_asset(model, library=library, element=wall_type)

Example of adding multiple assets and avoiding duplicated inverses:

# since occurrences of IfcWindow of the same type
# might have shared inverses (e.g. IfcStyledItem)
# we provide a dictionary that will be populated with newly created items
# and reused to avoid duplicated elements
reuse_identities = dict()

for element in ifcopenshell.util.selector.filter_elements(model, "IfcWindow"):
    ifcopenshell.api.project.append_asset(
        model, library=library,
        element=wall_type
        reuse_identities=reuse_identities
    )
ifcopenshell.api.project.append_asset.APPENDABLE_ASSET
ifcopenshell.api.project.append_asset.APPENDABLE_ASSET_TYPES