diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py index 0e0bd0fed1..59ee5c0e95 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/operator.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/operator.py @@ -40,11 +40,16 @@ class BIM_OT_aggregate_assign_object(bpy.types.Operator, Operator): bl_label = "Assign Object To Aggregation" bl_options = {"REGISTER", "UNDO"} relating_object: bpy.props.IntProperty() + related_object: bpy.props.IntProperty() def _execute(self, context): relating_obj = None if self.relating_object: relating_obj = tool.Ifc.get_object(tool.Ifc.get().by_id(self.relating_object)) + elif self.related_object: + aggregate = ifcopenshell.util.element.get_aggregate(tool.Ifc.get().by_id(self.related_object)) + if aggregate: + relating_obj = tool.Ifc.get_object(aggregate) elif context.active_object: relating_obj = context.active_object if not relating_obj: diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/prop.py b/src/blenderbim/blenderbim/bim/module/aggregate/prop.py index 5faa2760eb..852eee7abf 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/prop.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/prop.py @@ -34,15 +34,27 @@ from bpy.props import ( def update_relating_object(self, context): def message(self, context): - self.layout.label(text="Please select a valid Ifc Element") + self.layout.label(text="Please select a valid IFC Element") - if self.relating_object is None: - return - if not self.relating_object.BIMObjectProperties.ifc_definition_id: - context.window_manager.popup_menu(message, title="Invalid Element Selected", icon="INFO") + if self.relating_object: + self.related_object = None + if not self.relating_object.BIMObjectProperties.ifc_definition_id: + context.window_manager.popup_menu(message, title="Invalid Element Selected", icon="INFO") + self.relating_object = None + + +def update_related_object(self, context): + def message(self, context): + self.layout.label(text="Please select a valid IFC Element") + + if self.related_object: self.relating_object = None + if not self.related_object.BIMObjectProperties.ifc_definition_id: + context.window_manager.popup_menu(message, title="Invalid Element Selected", icon="INFO") + self.related_object = None class BIMObjectAggregateProperties(PropertyGroup): is_editing: BoolProperty(name="Is Editing") - relating_object: PointerProperty(name="Aggregate", type=bpy.types.Object, update=update_relating_object) + relating_object: PointerProperty(name="Relating Whole", type=bpy.types.Object, update=update_relating_object) + related_object: PointerProperty(name="Related Part", type=bpy.types.Object, update=update_related_object) diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py index d3f08557b3..35a1e8161c 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py @@ -53,12 +53,21 @@ class BIM_PT_aggregate(Panel): props = context.active_object.BIMObjectAggregateProperties if props.is_editing: + row = layout.row() + row.prop(props, "relating_object", text="Whole") + row = layout.row() + row.prop(props, "related_object", text="Or Part") row = layout.row(align=True) - row.prop(props, "relating_object", text="") + col = row.column(align=True) + if not props.relating_object and not props.related_object: + col.enabled = False + op = col.operator("bim.aggregate_assign_object", icon="CHECKMARK") if props.relating_object: - op = row.operator("bim.aggregate_assign_object", icon="CHECKMARK", text="") op.relating_object = props.relating_object.BIMObjectProperties.ifc_definition_id + elif props.related_object: + op.related_object = props.related_object.BIMObjectProperties.ifc_definition_id row.operator("bim.disable_editing_aggregate", icon="CANCEL", text="") + return else: row = layout.row(align=True) if AggregateData.data["has_relating_object"]: @@ -73,7 +82,7 @@ class BIM_PT_aggregate(Panel): row.operator("bim.add_aggregate", icon="ADD", text="") op = row.operator("bim.aggregate_unassign_object", icon="X", text="") else: - row.label(text="No Whole relation defined", icon="TRIA_UP") + row.label(text="No Whole Relationship Found", icon="TRIA_UP") row.operator("bim.enable_editing_aggregate", icon="GREASEPENCIL", text="") row.operator("bim.add_aggregate", icon="ADD", text="")