From d3258693b2384b135289c6d38f10f9070d89f1ff Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 22 Sep 2023 11:41:50 +0500 Subject: [PATCH] Clear constraint and transform lock on duplicating array child object Previously it was locked even though it's not part of an array anymore. --- .../bim/module/geometry/operator.py | 24 ++++--------------- src/blenderbim/blenderbim/tool/blender.py | 12 ++++++---- src/blenderbim/blenderbim/tool/model.py | 18 ++++++++++++++ 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index f17d68fb54..272b6706f0 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -737,10 +737,7 @@ class OverrideDuplicateMove(bpy.types.Operator): tool.Blender.remove_data_block(temp_data) if new: - array_pset = ifcopenshell.util.element.get_pset(new, "BBIM_Array") - if array_pset: - array_pset = tool.Ifc.get().by_id(array_pset["id"]) - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=new, pset=array_pset) + tool.Model.remove_array_from_element(new) old_to_new[tool.Ifc.get_entity(obj)] = [new] if new.is_a("IfcRelSpaceBoundary"): tool.Boundary.decorate_boundary(new_obj) @@ -807,10 +804,7 @@ class OverrideDuplicateMoveLinked(bpy.types.Operator): # Copy the actual class new = blenderbim.core.root.copy_class(tool.Ifc, tool.Collector, tool.Geometry, tool.Root, obj=new_obj) if new: - array_pset = ifcopenshell.util.element.get_pset(new, "BBIM_Array") - if array_pset: - array_pset = tool.Ifc.get().by_id(array_pset["id"]) - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=new, pset=array_pset) + tool.Model.remove_array_from_element(new) old_to_new[tool.Ifc.get_entity(obj)] = new # Recreate decompositions tool.Root.recreate_decompositions(relationships, old_to_new) @@ -1054,12 +1048,7 @@ class OverrideDuplicateMoveAggregate(bpy.types.Operator): ) if new_entity: - # Checks if the object belongs to an Ifc Array - array_pset = ifcopenshell.util.element.get_pset(new_entity, "BBIM_Array") - if array_pset: - array_pset = tool.Ifc.get().by_id(array_pset["id"]) - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=new_entity, pset=array_pset) - + tool.Model.remove_array_from_element(new_entity) blenderbim.core.aggregate.unassign_object( tool.Ifc, tool.Aggregate, @@ -1187,12 +1176,7 @@ class RefreshAggregate(bpy.types.Operator): ) if new_entity: - # Checks if the object belongs to an Ifc Array - array_pset = ifcopenshell.util.element.get_pset(new_entity, "BBIM_Array") - if array_pset: - array_pset = tool.Ifc.get().by_id(array_pset["id"]) - ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=new_entity, pset=array_pset) - + tool.Model.remove_array_from_element(new_entity) blenderbim.core.aggregate.unassign_object( tool.Ifc, tool.Aggregate, diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 31027b4290..d544a67787 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -484,6 +484,13 @@ class Blender: if obj: return obj + @classmethod + def lock_transform(cls, obj, lock_state=True): + for prop in ("lock_location", "lock_rotation", "lock_scale"): + attr = getattr(obj, prop) + for axis_idx in range(3): + attr[axis_idx] = lock_state + class Modifier: @classmethod def is_eligible_for_railing_modifier(cls, obj): @@ -560,10 +567,7 @@ class Blender: modifier_data = list(cls.get_modifiers_data(parent_element))[item] children = cls.get_children_objects(modifier_data) for child_obj in children: - for prop in ("lock_location", "lock_rotation", "lock_scale"): - attr = getattr(child_obj, prop) - for axis_idx in range(3): - attr[axis_idx] = lock_state + Blender.lock_transform(child_obj, lock_state) @classmethod def remove_constraints(cls, parent_element): diff --git a/src/blenderbim/blenderbim/tool/model.py b/src/blenderbim/blenderbim/tool/model.py index 1c12b9a92a..58f0826a1c 100644 --- a/src/blenderbim/blenderbim/tool/model.py +++ b/src/blenderbim/blenderbim/tool/model.py @@ -539,6 +539,24 @@ class Model(blenderbim.core.tool.Model): ] return axes + @classmethod + def remove_array_from_element(cls, element): + array_pset = ifcopenshell.util.element.get_pset(element, "BBIM_Array") + if not array_pset: + return + + array_pset_data = array_pset["Data"] + array_pset = tool.Ifc.get().by_id(array_pset["id"]) + ifcopenshell.api.run("pset.remove_pset", tool.Ifc.get(), product=element, pset=array_pset) + + # remove constraints + obj = tool.Ifc.get_object(element) + if not array_pset_data and ( + constraint := next((c for c in obj.constraints if c.type == "CHILD_OF"), None) + ): # skip array parents + obj.constraints.remove(constraint) + tool.Blender.lock_transform(obj, False) + @classmethod def regenerate_array(cls, parent, data, keep_objs=False): tool.Blender.Modifier.Array.remove_constraints(tool.Ifc.get_entity(parent))