2021-01-27 19:00:35 +11:00
|
|
|
import ifcopenshell
|
2021-08-10 11:48:38 +10:00
|
|
|
import ifcopenshell.util.element
|
2021-01-27 19:00:35 +11:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class Usecase:
|
2021-03-27 19:14:32 +11:00
|
|
|
def __init__(self, file, **settings):
|
2021-01-27 19:00:35 +11:00
|
|
|
self.file = file
|
|
|
|
|
self.settings = {"product": None}
|
|
|
|
|
for key, value in settings.items():
|
|
|
|
|
self.settings[key] = value
|
|
|
|
|
|
|
|
|
|
def execute(self):
|
|
|
|
|
self.schema = ifcopenshell.ifcopenshell_wrapper.schema_by_name(self.file.schema)
|
2021-08-10 11:48:38 +10:00
|
|
|
result = ifcopenshell.util.element.copy(self.file, self.settings["product"])
|
2021-10-14 16:13:48 +11:00
|
|
|
self.copy_direct_attributes(result)
|
2021-08-10 11:48:38 +10:00
|
|
|
self.copy_indirect_attributes(self.settings["product"], result)
|
2021-01-27 19:00:35 +11:00
|
|
|
return result
|
|
|
|
|
|
2021-10-14 16:13:48 +11:00
|
|
|
def copy_direct_attributes(self, to_element):
|
|
|
|
|
self.remove_representations(to_element)
|
|
|
|
|
self.copy_object_placements(to_element)
|
|
|
|
|
|
2021-08-10 11:48:38 +10:00
|
|
|
def copy_indirect_attributes(self, from_element, to_element):
|
|
|
|
|
for inverse in self.file.get_inverse(from_element):
|
|
|
|
|
if inverse.is_a("IfcRelDefinesByProperties"):
|
2021-09-21 14:19:41 +10:00
|
|
|
# Properties must not be shared between objects for convenience of authoring
|
2021-08-10 11:48:38 +10:00
|
|
|
inverse = ifcopenshell.util.element.copy(self.file, inverse)
|
|
|
|
|
inverse.RelatedObjects = [to_element]
|
|
|
|
|
pset = ifcopenshell.util.element.copy_deep(self.file, inverse.RelatingPropertyDefinition)
|
|
|
|
|
inverse.RelatingPropertyDefinition = pset
|
2021-09-21 14:19:41 +10:00
|
|
|
elif inverse.is_a("IfcRelAggregates") and inverse.RelatingObject == from_element:
|
|
|
|
|
continue
|
2021-10-14 15:52:38 +11:00
|
|
|
elif inverse.is_a("IfcRelContainedInSpatialStructure") and inverse.RelatingStructure == from_element:
|
|
|
|
|
continue
|
2021-09-21 14:19:41 +10:00
|
|
|
elif inverse.is_a("IfcRelFillsElement"):
|
2021-08-30 18:59:50 +10:00
|
|
|
continue
|
2021-01-27 19:00:35 +11:00
|
|
|
else:
|
2021-08-10 11:48:38 +10:00
|
|
|
for i, value in enumerate(inverse):
|
|
|
|
|
if value == from_element:
|
|
|
|
|
new_inverse = ifcopenshell.util.element.copy(self.file, inverse)
|
|
|
|
|
new_inverse[i] = to_element
|
|
|
|
|
elif isinstance(value, (tuple, list)) and from_element in value:
|
|
|
|
|
new_value = list(value)
|
|
|
|
|
new_value.append(to_element)
|
|
|
|
|
inverse[i] = new_value
|
|
|
|
|
|
|
|
|
|
def remove_representations(self, element):
|
|
|
|
|
if element.is_a("IfcProduct"):
|
|
|
|
|
element.Representation = None
|
|
|
|
|
elif element.is_a("IfcTypeProduct"):
|
|
|
|
|
element.RepresentationMaps = None
|
2021-10-14 16:13:48 +11:00
|
|
|
|
|
|
|
|
def copy_object_placements(self, element):
|
|
|
|
|
if not element.is_a("IfcProduct") or not element.ObjectPlacement:
|
|
|
|
|
return
|
|
|
|
|
element.ObjectPlacement = ifcopenshell.util.element.copy(self.file, element.ObjectPlacement)
|