mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-20 15:08:51 +00:00
ifcopenshell.util - make ifc_file argument optional if it can be deduced from ifc element
This commit is contained in:
@@ -66,7 +66,7 @@ class Clipping:
|
|||||||
raise Exception(f"Unexpected clipping type provided: {raw_data}")
|
raise Exception(f"Unexpected clipping type provided: {raw_data}")
|
||||||
|
|
||||||
def apply(
|
def apply(
|
||||||
self, ifc_file: ifcopenshell.file, first_operand: ifcopenshell.entity_instance, unit_scale: float
|
self, ifc_file: Union[ifcopenshell.file, None], first_operand: ifcopenshell.entity_instance, unit_scale: float
|
||||||
) -> ifcopenshell.entity_instance:
|
) -> ifcopenshell.entity_instance:
|
||||||
"""Applies the clipping data as an IfcBooleanClippingResult to an operand
|
"""Applies the clipping data as an IfcBooleanClippingResult to an operand
|
||||||
|
|
||||||
@@ -76,6 +76,9 @@ class Clipping:
|
|||||||
:return: An IfcBooleanClippingResult which uses an IfcHalfSpaceSolid to clip the first operand
|
:return: An IfcBooleanClippingResult which uses an IfcHalfSpaceSolid to clip the first operand
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if not ifc_file:
|
||||||
|
ifc_file = first_operand.file
|
||||||
|
|
||||||
location = ifc_file.createIfcCartesianPoint([i / unit_scale for i in self.location])
|
location = ifc_file.createIfcCartesianPoint([i / unit_scale for i in self.location])
|
||||||
direction = ifc_file.createIfcDirection(self.normal)
|
direction = ifc_file.createIfcDirection(self.normal)
|
||||||
|
|
||||||
|
|||||||
@@ -689,7 +689,7 @@ def get_styles(element: ifcopenshell.entity_instance) -> list[ifcopenshell.entit
|
|||||||
# TODO: ifc_file argument is unnecessary for some methods now
|
# TODO: ifc_file argument is unnecessary for some methods now
|
||||||
# since we have entity_instance.file, so we can deprecate it.
|
# since we have entity_instance.file, so we can deprecate it.
|
||||||
def get_elements_by_material(
|
def get_elements_by_material(
|
||||||
ifc_file: ifcopenshell.file, material: ifcopenshell.entity_instance
|
ifc_file: Union[ifcopenshell.file, None], material: ifcopenshell.entity_instance
|
||||||
) -> set[ifcopenshell.entity_instance]:
|
) -> set[ifcopenshell.entity_instance]:
|
||||||
"""Retrieves the elements related to a material.
|
"""Retrieves the elements related to a material.
|
||||||
|
|
||||||
@@ -707,6 +707,8 @@ def get_elements_by_material(
|
|||||||
material = file.by_type("IfcMaterial")[0]
|
material = file.by_type("IfcMaterial")[0]
|
||||||
elements = ifcopenshell.util.element.get_elements_by_material(file, material)
|
elements = ifcopenshell.util.element.get_elements_by_material(file, material)
|
||||||
"""
|
"""
|
||||||
|
if not ifc_file:
|
||||||
|
ifc_file = material.file
|
||||||
results = set()
|
results = set()
|
||||||
for inverse in ifc_file.get_inverse(material):
|
for inverse in ifc_file.get_inverse(material):
|
||||||
if inverse.is_a("IfcRelAssociatesMaterial"):
|
if inverse.is_a("IfcRelAssociatesMaterial"):
|
||||||
@@ -730,7 +732,7 @@ def get_elements_by_material(
|
|||||||
|
|
||||||
|
|
||||||
def get_elements_by_style(
|
def get_elements_by_style(
|
||||||
ifc_file: ifcopenshell.file, style: ifcopenshell.entity_instance
|
ifc_file: Union[ifcopenshell.file, None], style: ifcopenshell.entity_instance
|
||||||
) -> set[ifcopenshell.entity_instance]:
|
) -> set[ifcopenshell.entity_instance]:
|
||||||
"""Retrieves the elements whose geometric representation uses a style
|
"""Retrieves the elements whose geometric representation uses a style
|
||||||
|
|
||||||
@@ -745,6 +747,8 @@ def get_elements_by_style(
|
|||||||
style = file.by_type("IfcSurfaceStyle")[0]
|
style = file.by_type("IfcSurfaceStyle")[0]
|
||||||
elements = ifcopenshell.util.element.get_elements_by_style(file, style)
|
elements = ifcopenshell.util.element.get_elements_by_style(file, style)
|
||||||
"""
|
"""
|
||||||
|
if not ifc_file:
|
||||||
|
ifc_file = style.file
|
||||||
results = set()
|
results = set()
|
||||||
inverses = list(ifc_file.get_inverse(style))
|
inverses = list(ifc_file.get_inverse(style))
|
||||||
while inverses:
|
while inverses:
|
||||||
@@ -778,7 +782,7 @@ def get_elements_by_style(
|
|||||||
|
|
||||||
|
|
||||||
def get_elements_by_representation(
|
def get_elements_by_representation(
|
||||||
ifc_file: ifcopenshell.file, representation: ifcopenshell.entity_instance
|
ifc_file: Union[ifcopenshell.file, None], representation: ifcopenshell.entity_instance
|
||||||
) -> set[ifcopenshell.entity_instance]:
|
) -> set[ifcopenshell.entity_instance]:
|
||||||
"""Gets all elements using a geometric representation
|
"""Gets all elements using a geometric representation
|
||||||
|
|
||||||
@@ -793,6 +797,8 @@ def get_elements_by_representation(
|
|||||||
representation = file.by_type("IfcShapeRepresentation")[0]
|
representation = file.by_type("IfcShapeRepresentation")[0]
|
||||||
elements = ifcopenshell.util.element.get_elements_by_representation(file, representation)
|
elements = ifcopenshell.util.element.get_elements_by_representation(file, representation)
|
||||||
"""
|
"""
|
||||||
|
if not ifc_file:
|
||||||
|
ifc_file = representation.file
|
||||||
results = set()
|
results = set()
|
||||||
[results.update(pr.ShapeOfProduct) for pr in representation.OfProductRepresentation]
|
[results.update(pr.ShapeOfProduct) for pr in representation.OfProductRepresentation]
|
||||||
for rep_map in representation.RepresentationMap:
|
for rep_map in representation.RepresentationMap:
|
||||||
@@ -838,7 +844,7 @@ def get_elements_by_profile(profile: ifcopenshell.entity_instance) -> set[ifcope
|
|||||||
|
|
||||||
|
|
||||||
def get_elements_by_layer(
|
def get_elements_by_layer(
|
||||||
ifc_file: ifcopenshell.file, layer: ifcopenshell.entity_instance
|
ifc_file: Union[ifcopenshell.file, None], layer: ifcopenshell.entity_instance
|
||||||
) -> set[ifcopenshell.entity_instance]:
|
) -> set[ifcopenshell.entity_instance]:
|
||||||
"""Get all the elements that are used by a presentation layer
|
"""Get all the elements that are used by a presentation layer
|
||||||
|
|
||||||
@@ -846,6 +852,8 @@ def get_elements_by_layer(
|
|||||||
:param layer: The IfcPresentationLayerAssignment layer
|
:param layer: The IfcPresentationLayerAssignment layer
|
||||||
:return: The elements using the geometric representation
|
:return: The elements using the geometric representation
|
||||||
"""
|
"""
|
||||||
|
if not ifc_file:
|
||||||
|
ifc_file = layer.file
|
||||||
results = set()
|
results = set()
|
||||||
for item in layer.AssignedItems or []:
|
for item in layer.AssignedItems or []:
|
||||||
if item.is_a("IfcShapeRepresentation"):
|
if item.is_a("IfcShapeRepresentation"):
|
||||||
@@ -858,7 +866,7 @@ def get_elements_by_layer(
|
|||||||
|
|
||||||
|
|
||||||
def get_layers(
|
def get_layers(
|
||||||
ifc_file: ifcopenshell.file, element: ifcopenshell.entity_instance
|
ifc_file: Union[ifcopenshell.file, None], element: ifcopenshell.entity_instance
|
||||||
) -> list[ifcopenshell.entity_instance]:
|
) -> list[ifcopenshell.entity_instance]:
|
||||||
"""Get the CAD layers that an element is part of
|
"""Get the CAD layers that an element is part of
|
||||||
|
|
||||||
@@ -876,6 +884,8 @@ def get_layers(
|
|||||||
element = ifcopenshell.by_type("IfcWall")[0]
|
element = ifcopenshell.by_type("IfcWall")[0]
|
||||||
layers = ifcopenshell.util.element.get_layers(element)
|
layers = ifcopenshell.util.element.get_layers(element)
|
||||||
"""
|
"""
|
||||||
|
if not ifc_file:
|
||||||
|
ifc_file = element.file
|
||||||
layers = []
|
layers = []
|
||||||
representations = []
|
representations = []
|
||||||
if representation := getattr(element, "Representation", None):
|
if representation := getattr(element, "Representation", None):
|
||||||
@@ -1352,12 +1362,14 @@ def has_element_reference(value: Any, element: ifcopenshell.entity_instance) ->
|
|||||||
return value == element
|
return value == element
|
||||||
|
|
||||||
|
|
||||||
def remove_deep(ifc_file: ifcopenshell.file, element: ifcopenshell.entity_instance) -> None:
|
def remove_deep(ifc_file: Union[ifcopenshell.file, None], element: ifcopenshell.entity_instance) -> None:
|
||||||
"""Recursively purges a subgraph safely.
|
"""Recursively purges a subgraph safely.
|
||||||
|
|
||||||
Do not use, use remove_deep2() instead.
|
Do not use, use remove_deep2() instead.
|
||||||
"""
|
"""
|
||||||
# @todo maybe some sort of try-finally mechanism.
|
# @todo maybe some sort of try-finally mechanism.
|
||||||
|
if not ifc_file:
|
||||||
|
ifc_file = element.file
|
||||||
ifc_file.batch()
|
ifc_file.batch()
|
||||||
subgraph = list(ifc_file.traverse(element, breadth_first=True))
|
subgraph = list(ifc_file.traverse(element, breadth_first=True))
|
||||||
subgraph_set = set(subgraph)
|
subgraph_set = set(subgraph)
|
||||||
@@ -1431,7 +1443,7 @@ def unbatch_remove_deep2(ifc_file: ifcopenshell.file) -> ifcopenshell.file:
|
|||||||
|
|
||||||
|
|
||||||
def remove_deep2(
|
def remove_deep2(
|
||||||
ifc_file: ifcopenshell.file,
|
ifc_file: Union[ifcopenshell.file, None],
|
||||||
element: ifcopenshell.entity_instance,
|
element: ifcopenshell.entity_instance,
|
||||||
also_consider: list[ifcopenshell.entity_instance] = [],
|
also_consider: list[ifcopenshell.entity_instance] = [],
|
||||||
do_not_delete: set[ifcopenshell.entity_instance] = set(),
|
do_not_delete: set[ifcopenshell.entity_instance] = set(),
|
||||||
@@ -1468,6 +1480,8 @@ def remove_deep2(
|
|||||||
:param element: The starting element that defines the subgraph
|
:param element: The starting element that defines the subgraph
|
||||||
"""
|
"""
|
||||||
# ifc_file.batch()
|
# ifc_file.batch()
|
||||||
|
if not ifc_file:
|
||||||
|
ifc_file = element.file
|
||||||
total_inverses = ifc_file.get_total_inverses(element)
|
total_inverses = ifc_file.get_total_inverses(element)
|
||||||
if total_inverses > 0:
|
if total_inverses > 0:
|
||||||
|
|
||||||
@@ -1527,7 +1541,9 @@ def remove_deep2(
|
|||||||
# ifc_file.unbatch()
|
# ifc_file.unbatch()
|
||||||
|
|
||||||
|
|
||||||
def copy(ifc_file: ifcopenshell.file, element: ifcopenshell.entity_instance) -> ifcopenshell.entity_instance:
|
def copy(
|
||||||
|
ifc_file: Union[ifcopenshell.file, None], element: ifcopenshell.entity_instance
|
||||||
|
) -> ifcopenshell.entity_instance:
|
||||||
"""
|
"""
|
||||||
Copy a single element. Any referenced elements are not copied.
|
Copy a single element. Any referenced elements are not copied.
|
||||||
|
|
||||||
@@ -1537,6 +1553,8 @@ def copy(ifc_file: ifcopenshell.file, element: ifcopenshell.entity_instance) ->
|
|||||||
:param element: The IFC element to copy
|
:param element: The IFC element to copy
|
||||||
:return: The newly copied element
|
:return: The newly copied element
|
||||||
"""
|
"""
|
||||||
|
if not ifc_file:
|
||||||
|
ifc_file = element.file
|
||||||
new = ifc_file.create_entity(element.is_a())
|
new = ifc_file.create_entity(element.is_a())
|
||||||
for i, attribute in enumerate(element):
|
for i, attribute in enumerate(element):
|
||||||
if attribute is None:
|
if attribute is None:
|
||||||
@@ -1549,7 +1567,7 @@ def copy(ifc_file: ifcopenshell.file, element: ifcopenshell.entity_instance) ->
|
|||||||
|
|
||||||
|
|
||||||
def copy_deep(
|
def copy_deep(
|
||||||
ifc_file: ifcopenshell.file,
|
ifc_file: Union[ifcopenshell.file, None],
|
||||||
element: ifcopenshell.entity_instance,
|
element: ifcopenshell.entity_instance,
|
||||||
exclude: Optional[Sequence[str]] = None,
|
exclude: Optional[Sequence[str]] = None,
|
||||||
exclude_callback: Optional[Callable[[ifcopenshell.entity_instance], bool]] = None,
|
exclude_callback: Optional[Callable[[ifcopenshell.entity_instance], bool]] = None,
|
||||||
@@ -1572,6 +1590,8 @@ def copy_deep(
|
|||||||
be left as None.
|
be left as None.
|
||||||
:return: The newly copied element
|
:return: The newly copied element
|
||||||
"""
|
"""
|
||||||
|
if not ifc_file:
|
||||||
|
ifc_file = element.file
|
||||||
if copied_entities is None:
|
if copied_entities is None:
|
||||||
copied_entities = {}
|
copied_entities = {}
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ def get_subtypes(
|
|||||||
|
|
||||||
|
|
||||||
def reassign_class(
|
def reassign_class(
|
||||||
ifc_file: ifcopenshell.file, element: ifcopenshell.entity_instance, new_class: str
|
ifc_file: Union[ifcopenshell.file, None], element: ifcopenshell.entity_instance, new_class: str
|
||||||
) -> ifcopenshell.entity_instance:
|
) -> ifcopenshell.entity_instance:
|
||||||
"""
|
"""
|
||||||
Attempts to change the class (entity name) of `element` to `new_class` by
|
Attempts to change the class (entity name) of `element` to `new_class` by
|
||||||
@@ -156,6 +156,9 @@ def reassign_class(
|
|||||||
It's unlikely that this affects real-world usage of this function.
|
It's unlikely that this affects real-world usage of this function.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if not ifc_file:
|
||||||
|
ifc_file = element.file
|
||||||
|
|
||||||
schema: ifcopenshell_wrapper.schema_definition = ifcopenshell_wrapper.schema_by_name(ifc_file.schema)
|
schema: ifcopenshell_wrapper.schema_definition = ifcopenshell_wrapper.schema_by_name(ifc_file.schema)
|
||||||
try:
|
try:
|
||||||
declaration = schema.declaration_by_name(new_class)
|
declaration = schema.declaration_by_name(new_class)
|
||||||
|
|||||||
@@ -456,7 +456,7 @@ def get_project_unit(
|
|||||||
|
|
||||||
|
|
||||||
def get_property_unit(
|
def get_property_unit(
|
||||||
prop: ifcopenshell.entity_instance, ifc_file: ifcopenshell.file, use_cache: bool = False
|
prop: ifcopenshell.entity_instance, ifc_file: Union[ifcopenshell.file, None], use_cache: bool = False
|
||||||
) -> Union[ifcopenshell.entity_instance, None]:
|
) -> Union[ifcopenshell.entity_instance, None]:
|
||||||
"""Gets the unit definition of a property or quantity
|
"""Gets the unit definition of a property or quantity
|
||||||
|
|
||||||
@@ -499,11 +499,13 @@ def get_property_unit(
|
|||||||
measure_class = value.is_a()
|
measure_class = value.is_a()
|
||||||
|
|
||||||
if measure_class and (unit_type := get_measure_unit_type(measure_class)):
|
if measure_class and (unit_type := get_measure_unit_type(measure_class)):
|
||||||
|
if not ifc_file:
|
||||||
|
ifc_file = prop.file
|
||||||
return get_project_unit(ifc_file, unit_type, use_cache=use_cache)
|
return get_project_unit(ifc_file, unit_type, use_cache=use_cache)
|
||||||
|
|
||||||
|
|
||||||
def get_property_table_unit(
|
def get_property_table_unit(
|
||||||
prop: ifcopenshell.entity_instance, ifc_file: ifcopenshell.file, use_cache: bool = False
|
prop: ifcopenshell.entity_instance, ifc_file: Union[ifcopenshell.file, None], use_cache: bool = False
|
||||||
) -> Dict[str, Union[ifcopenshell.entity_instance, None]]:
|
) -> Dict[str, Union[ifcopenshell.entity_instance, None]]:
|
||||||
"""
|
"""
|
||||||
Gets the unit definition of a property table
|
Gets the unit definition of a property table
|
||||||
@@ -523,6 +525,8 @@ def get_property_table_unit(
|
|||||||
If a unit-entity is missing,
|
If a unit-entity is missing,
|
||||||
the value associated to the key is `null`.
|
the value associated to the key is `null`.
|
||||||
"""
|
"""
|
||||||
|
if not ifc_file:
|
||||||
|
ifc_file = prop.file
|
||||||
defining_unit = None
|
defining_unit = None
|
||||||
if unit := prop.DefiningUnit:
|
if unit := prop.DefiningUnit:
|
||||||
defining_unit = unit
|
defining_unit = unit
|
||||||
|
|||||||
Reference in New Issue
Block a user