diff --git a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py index f585787162..d3f08557b3 100644 --- a/src/blenderbim/blenderbim/bim/module/aggregate/ui.py +++ b/src/blenderbim/blenderbim/bim/module/aggregate/ui.py @@ -144,7 +144,7 @@ class BIM_PT_linked_aggregate(Panel): row.label(text="Not a Linked Aggregate") else: row.label(text=f"{Number_Linked_Aggregates} Linked Aggregates") - op = row.operator("bim.object_duplicate_move_linked_aggregate", text="", icon="DUPLICATE") + op = row.operator("bim.duplicate_linked_aggregate_to_3d_cursor", text="", icon="DUPLICATE") if type(Number_Linked_Aggregates) is int: if Number_Linked_Aggregates > 0: op = row.operator("bim.select_linked_aggregates", text="", icon="OUTLINER_DATA_POINTCLOUD") diff --git a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py index 816718cb06..0bf808c2ef 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py @@ -29,6 +29,7 @@ classes = ( operator.GetRepresentationIfcParameters, operator.DuplicateMoveLinkedAggregate, operator.DuplicateMoveLinkedAggregateMacro, + operator.DuplicateLinkedAggregateTo3dCursor, operator.OverrideDelete, operator.OverrideDuplicateMove, operator.OverrideDuplicateMoveLinked, diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 2bbdf948b8..a4a9ae5abe 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -977,15 +977,15 @@ class OverrideDuplicateMoveLinked(bpy.types.Operator): class DuplicateMoveLinkedAggregateMacro(bpy.types.Macro): - bl_description = "Create a new linked aggregate" + bl_description = "Create and move a new linked aggregate" bl_idname = "bim.object_duplicate_move_linked_aggregate_macro" - bl_label = "IFC Duplicate Linked Aggregate" + bl_label = "IFC Duplicate and Move Linked Aggregate" bl_options = {"REGISTER", "UNDO"} class DuplicateMoveLinkedAggregate(bpy.types.Operator): bl_idname = "bim.object_duplicate_move_linked_aggregate" - bl_label = "IFC Duplicate Linked Aggregate" + bl_label = "IFC Duplicate and Move Linked Aggregate" bl_options = {"REGISTER", "UNDO"} is_interactive: bpy.props.BoolProperty(name="Is Interactive", default=True) @@ -1000,7 +1000,7 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): return DuplicateMoveLinkedAggregate.execute_ifc_duplicate_linked_aggregate_operator(self, context) @staticmethod - def execute_ifc_duplicate_linked_aggregate_operator(self, context): + def execute_ifc_duplicate_linked_aggregate_operator(self, context, location_from_3d_cursor=False): self.new_active_obj = None self.group_name = "BBIM_Linked_Aggregate" self.pset_name = "BBIM_Linked_Aggregate" @@ -1113,6 +1113,16 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): ] tool.Ifc.run("group.assign_group", group=linked_aggregate_group[0], products=new) + def get_location_from_3d_cursor(old_to_new, aggregate): + base_obj = tool.Ifc.get_object(aggregate) + base_obj_location = base_obj.location.copy() + + for new in old_to_new.values(): + new_obj = tool.Ifc.get_object(new[0]) + location_diff = new_obj.location - base_obj_location + new_obj.location = context.scene.cursor.location + location_diff + + if len(context.selected_objects) != 1: return {"FINISHED"} @@ -1139,11 +1149,29 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): custom_incremental_naming_for_element_assembly(old_to_new) + if location_from_3d_cursor: + get_location_from_3d_cursor(old_to_new, selected_element) + blenderbim.bim.handler.refresh_ui_data() return old_to_new +class DuplicateLinkedAggregateTo3dCursor(bpy.types.Operator): + bl_idname = "bim.duplicate_linked_aggregate_to_3d_cursor" + bl_label = "IFC Duplicate Linked Aggregate to 3d Cursor" + bl_options = {"REGISTER", "UNDO"} + + @classmethod + def poll(cls, context): + return len(context.selected_objects) > 0 + + def execute(self, context): + return OverrideDuplicateMove.execute_duplicate_operator(self, context, linked=False) + + def _execute(self, context): + return DuplicateMoveLinkedAggregate.execute_ifc_duplicate_linked_aggregate_operator(self, context, location_from_3d_cursor=True) + class RefreshLinkedAggregate(bpy.types.Operator): bl_idname = "bim.refresh_linked_aggregate" bl_label = "IFC Refresh Linked Aggregate"