mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-26 10:11:46 +00:00
Minor fix
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user