Minor fix

This commit is contained in:
Dion Moult
2021-07-10 10:32:34 +10:00
parent 519a53dc61
commit edd737aa5d
@@ -7,7 +7,7 @@ import ifcopenshell.util.placement
class Usecase: class Usecase:
def __init__(self, file, **settings): def __init__(self, file, **settings):
self.file = file self.file = file
self.settings = {"product": None, "matrix": np.eye(4), "should_cascade": True} self.settings = {"product": None, "matrix": np.eye(4), "should_transform_children": False}
for key, value in settings.items(): for key, value in settings.items():
self.settings[key] = value self.settings[key] = value
@@ -16,16 +16,9 @@ class Usecase:
return return
self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file) self.unit_scale = ifcopenshell.util.unit.calculate_unit_scale(self.file)
dependent_objects = [] children_settings = []
if self.settings["should_cascade"] and self.settings["product"].ObjectPlacement: if not self.settings["should_transform_children"]:
for referenced_placement in self.settings["product"].ObjectPlacement.ReferencedByPlacements: children_settings = self.get_children_settings(self.settings["product"].ObjectPlacement)
for placed_obj in referenced_placement.PlacesObject:
dependent_objects.append(
{
"product": placed_obj,
"matrix": ifcopenshell.util.placement.get_local_placement(referenced_placement),
}
)
placement_rel_to = None placement_rel_to = None
if hasattr(self.settings["product"], "ContainedInStructure") and self.settings["product"].ContainedInStructure: if hasattr(self.settings["product"], "ContainedInStructure") and self.settings["product"].ContainedInStructure:
@@ -45,25 +38,33 @@ class Usecase:
placement = self.file.createIfcLocalPlacement(placement_rel_to, self.get_relative_placement(placement_rel_to)) placement = self.file.createIfcLocalPlacement(placement_rel_to, self.get_relative_placement(placement_rel_to))
if self.settings["product"].ObjectPlacement: if self.settings["product"].ObjectPlacement:
for inverse in self.file.get_inverse(self.settings["product"]): old_placement = self.settings["product"].ObjectPlacement
ifcopenshell.util.element.replace_attribute( old_placement.PlacementRelTo = None
inverse, self.settings["product"].ObjectPlacement, placement
)
old = self.settings["product"].ObjectPlacement
old.PlacementRelTo = None
self.settings["product"].ObjectPlacement = None self.settings["product"].ObjectPlacement = None
if not self.file.get_inverse(old): for inverse in self.file.get_inverse(old_placement):
ifcopenshell.util.element.remove_deep(self.file, old) ifcopenshell.util.element.replace_attribute(inverse, old_placement, placement)
ifcopenshell.util.element.remove_deep(self.file, old_placement)
self.settings["product"].ObjectPlacement = placement self.settings["product"].ObjectPlacement = placement
ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": self.settings["product"]}) ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": self.settings["product"]})
for settings in dependent_objects: for settings in children_settings:
self.settings = settings self.settings = settings
self.execute() self.execute()
return placement return placement
def get_children_settings(self, placement):
if not placement:
return []
results = []
for referenced_placement in placement.ReferencedByPlacements:
matrix = ifcopenshell.util.placement.get_local_placement(referenced_placement)
for obj in referenced_placement.PlacesObject:
results.append({"product": obj, "matrix": matrix, "should_transform_children": False})
results.extend(self.get_children_settings(referenced_placement))
return results
def get_relative_placement(self, placement_rel_to): def get_relative_placement(self, placement_rel_to):
if placement_rel_to: if placement_rel_to:
relating_object_matrix = ifcopenshell.util.placement.get_local_placement(placement_rel_to) relating_object_matrix = ifcopenshell.util.placement.get_local_placement(placement_rel_to)