From 65a5c2c1f5e99d4ffee8175e184bf1063cae7749 Mon Sep 17 00:00:00 2001 From: Massimo Fabbro Date: Sun, 7 Jan 2024 15:28:59 +0100 Subject: [PATCH] Small refactor clone opening operator in order to better understand and reuse it rebase --- .../blenderbim/bim/module/model/opening.py | 18 ++++++++--------- src/blenderbim/blenderbim/core/geometry.py | 20 +++++++++++++++++++ 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/opening.py b/src/blenderbim/blenderbim/bim/module/model/opening.py index fe127b6e5e..6849f4593b 100644 --- a/src/blenderbim/blenderbim/bim/module/model/opening.py +++ b/src/blenderbim/blenderbim/bim/module/model/opening.py @@ -762,8 +762,6 @@ class EditOpenings(Operator, tool.Ifc.Operator): def _execute(self, context): props = bpy.context.scene.BIMModelProperties building_objs = set() - model = tool.Ifc.get() - all_openings = model.by_type("IfcOpeningElement") for obj in context.selected_objects: element = tool.Ifc.get_entity(obj) @@ -774,9 +772,13 @@ class EditOpenings(Operator, tool.Ifc.Operator): obj = tool.Ifc.get_object(element) openings = [r.RelatedOpeningElement for r in element.HasOpenings] for opening in openings: - similar_openings = [o for o in all_openings if o.ObjectPlacement == opening.ObjectPlacement] opening_obj = tool.Ifc.get_object(opening) building_objs.add(obj) + + similar_openings = blenderbim.core.geometry.get_similar_openings(tool.Ifc, opening) + similar_openings_building_objs = blenderbim.core.geometry.get_similar_openings_building_objs(tool.Ifc, similar_openings) + building_objs.update(similar_openings_building_objs) + if opening_obj: if tool.Ifc.is_edited(opening_obj): tool.Geometry.run_geometry_update_representation(obj=opening_obj) @@ -784,13 +786,11 @@ class EditOpenings(Operator, tool.Ifc.Operator): blenderbim.core.geometry.edit_object_placement( tool.Ifc, tool.Geometry, tool.Surveyor, obj=opening_obj ) - for similar_opening in similar_openings: - similar_opening.ObjectPlacement = opening.ObjectPlacement - element = similar_opening.VoidsElements[0].RelatingBuildingElement - obj = tool.Ifc.get_object(element) - building_objs.add(obj) - building_objs.update(self.get_all_building_objects_of_similar_openings(opening)) + blenderbim.core.geometry.edit_similar_opening_placement(opening, similar_openings) + #TODO delete also the old placement + + building_objs.update(self.get_all_building_objects_of_similar_openings(opening)) #NB this has nothing to do with clone similar_opening tool.Ifc.unlink(element=opening, obj=opening_obj) bpy.data.objects.remove(opening_obj) diff --git a/src/blenderbim/blenderbim/core/geometry.py b/src/blenderbim/blenderbim/core/geometry.py index a69987164c..4a706d641b 100644 --- a/src/blenderbim/blenderbim/core/geometry.py +++ b/src/blenderbim/blenderbim/core/geometry.py @@ -191,3 +191,23 @@ def select_connection(geometry, connection=None): def remove_connection(geometry, connection=None): geometry.remove_connection(connection) + +def get_similar_openings(ifc, opening): + model = ifc.get() + all_openings = model.by_type("IfcOpeningElement") + similar_openings = [o for o in all_openings if o.ObjectPlacement == opening.ObjectPlacement and o != opening] + return similar_openings + +def get_similar_openings_building_objs(ifc, similar_openings): + building_objs = [] + for similar_opening in similar_openings: + building_objs.append(ifc.get_object(similar_opening.VoidsElements[0].RelatingBuildingElement)) + return building_objs + +def edit_similar_opening_placement(opening = None, similar_openings = None): + if not opening or not similar_openings: + return + for similar_opening in similar_openings: + similar_opening.ObjectPlacement = opening.ObjectPlacement + +