diff --git a/src/bonsai/bonsai/bim/import_ifc.py b/src/bonsai/bonsai/bim/import_ifc.py index 90855053c8..c30bbca3db 100644 --- a/src/bonsai/bonsai/bim/import_ifc.py +++ b/src/bonsai/bonsai/bim/import_ifc.py @@ -1126,7 +1126,7 @@ class IfcImporter: if parts: relating_obj = tool.Ifc.get_object(element) if relating_obj: - tool.Aggregate.constrain_parts_to_aggregate(relating_obj) + tool.Aggregate.constrain_all_parts_to_aggregate(relating_obj) bpy.context.scene.BIMAggregateProperties.aggregate_decorator = True diff --git a/src/bonsai/bonsai/bim/module/aggregate/decorator.py b/src/bonsai/bonsai/bim/module/aggregate/decorator.py index 362c5baa4b..5726d063b9 100644 --- a/src/bonsai/bonsai/bim/module/aggregate/decorator.py +++ b/src/bonsai/bonsai/bim/module/aggregate/decorator.py @@ -343,6 +343,8 @@ class AggregateModeDecorator: new_objs = [o for o in new_objs if o.data] for obj in new_objs: element = tool.Ifc.get_entity(obj) + if (aggregate := ifcopenshell.util.element.get_aggregate(element)) == tool.Ifc.get_entity(props.editing_aggregate): + continue if element and element.is_a("IfcElement"): data = ItemDecorator.get_obj_data(obj) if data: diff --git a/src/bonsai/bonsai/bim/module/aggregate/operator.py b/src/bonsai/bonsai/bim/module/aggregate/operator.py index 04c55d19d4..8555a4168c 100644 --- a/src/bonsai/bonsai/bim/module/aggregate/operator.py +++ b/src/bonsai/bonsai/bim/module/aggregate/operator.py @@ -67,7 +67,7 @@ class BIM_OT_aggregate_assign_object(bpy.types.Operator, tool.Ifc.Operator): relating_obj=relating_obj, related_obj=obj, ) - tool.Aggregate.constrain_parts_to_aggregate(relating_obj) + tool.Aggregate.constrain_part_to_aggregate(obj, relating_obj) props = context.scene.BIMAggregateProperties if relating_obj == props.editing_aggregate and props.in_aggregate_mode: new_editing_obj = props.editing_objects.add() @@ -185,7 +185,7 @@ class BIM_OT_add_aggregate(bpy.types.Operator, tool.Ifc.Operator): element_obj=aggregate, ) core.assign_object(tool.Ifc, tool.Aggregate, tool.Collector, relating_obj=aggregate, related_obj=obj) - tool.Aggregate.constrain_parts_to_aggregate(aggregate) + tool.Aggregate.constrain_all_parts_to_aggregate(aggregate) def create_aggregate(self, context, ifc_class, aggregate_name): aggregate = bpy.data.objects.new(aggregate_name, None) @@ -424,13 +424,17 @@ class BIM_OT_aggregate_assing_new_objects_in_aggregate_mode(bpy.types.Operator): new_objs = [o for o in new_objs if o.data] for obj in new_objs: element = tool.Ifc.get_entity(obj) + if (aggregate := ifcopenshell.util.element.get_aggregate(element)) == tool.Ifc.get_entity(props.editing_aggregate): + continue if element and element.is_a("IfcElement"): obj.select_set(True) editing_obj = props.editing_objects.add() editing_obj.obj = obj props.editing_aggregate.select_set(True) + context.view_layer.objects.active = new_objs[0] self.relating_object = tool.Ifc.get_entity(props.editing_aggregate).id() self.related_object = tool.Ifc.get_entity(obj).id() + BIM_OT_aggregate_assign_object._execute(self, context) return {"FINISHED"} diff --git a/src/bonsai/bonsai/tool/aggregate.py b/src/bonsai/bonsai/tool/aggregate.py index 55cdf57427..926f98fdbc 100644 --- a/src/bonsai/bonsai/tool/aggregate.py +++ b/src/bonsai/bonsai/tool/aggregate.py @@ -85,7 +85,7 @@ class Aggregate(bonsai.core.tool.Aggregate): return parts @classmethod - def constrain_parts_to_aggregate(cls, aggregate: bpy.types.Object): + def constrain_all_parts_to_aggregate(cls, aggregate: bpy.types.Object): agg_element = tool.Ifc.get_entity(aggregate) parts = ifcopenshell.util.element.get_parts(agg_element) parts_objs = [tool.Ifc.get_object(p) for p in parts]