From 46adb2b4db39079a212041c4f5482c0409929918 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Sat, 6 Apr 2024 23:37:30 +1100 Subject: [PATCH] Fix bug where drawing psets were needlessly updated and random objects would get drawing psets added on them The prop update callbacks on has_underlay, has_linework, and has_annotation would edit the active object, which is not necessarily the camera. Yikes! Also, this means that when activating the drawing, it would sync references and every time it synced a reference it would attempt to sync these properties too which was slow and wasteful. --- src/blenderbim/blenderbim/bim/module/drawing/prop.py | 8 +++++--- src/blenderbim/blenderbim/core/drawing.py | 2 +- src/blenderbim/blenderbim/tool/drawing.py | 6 ++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/drawing/prop.py b/src/blenderbim/blenderbim/bim/module/drawing/prop.py index 3e4d3e1d03..3cdafc8144 100644 --- a/src/blenderbim/blenderbim/bim/module/drawing/prop.py +++ b/src/blenderbim/blenderbim/bim/module/drawing/prop.py @@ -194,7 +194,7 @@ def update_document_name(self, context): def update_has_underlay(self, context): update_layer(self, context, "HasUnderlay", self.has_underlay) # making sure that camera is active - if self.has_underlay and (context.active_object and context.active_object.data == self.id_data): + if self.has_underlay and (context.scene.camera and context.scene.camera.data == self.id_data): bpy.ops.bim.reload_drawing_styles() bpy.ops.bim.activate_drawing_style() @@ -208,10 +208,12 @@ def update_has_annotation(self, context): def update_layer(self, context, name, value): - element = tool.Ifc.get_entity(context.active_object) + if not context.scene.camera or context.scene.camera.data != self.id_data: + return + element = tool.Ifc.get_entity(context.scene.camera) if not element: return - pset = ifcopenshell.util.element.get_psets(element).get("EPset_Drawing") + pset = ifcopenshell.util.element.get_pset(element, "EPset_Drawing") if pset: pset = tool.Ifc.get().by_id(pset["id"]) else: diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index e74865e484..f8039488f2 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -394,7 +394,7 @@ def sync_references(ifc, collector, drawing_tool, drawing=None): if reference_obj and (ifc.is_moved(reference_obj) or ifc.is_edited(reference_obj)): should_delete_existing_annotation = True - if (should_delete_existing_annotation or not annotation): + if should_delete_existing_annotation or not annotation: should_create_annotation = True if should_delete_existing_annotation: diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index 69a6815bc4..f708eeb444 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -671,8 +671,7 @@ class Drawing(blenderbim.core.tool.Drawing): camera.angle = fov - psets = ifcopenshell.util.element.get_psets(drawing) - pset = psets.get("EPset_Drawing") + pset = ifcopenshell.util.element.get_pset(drawing, "EPset_Drawing") if pset: if "TargetView" in pset: camera.BIMCameraProperties.target_view = pset["TargetView"] @@ -1124,8 +1123,7 @@ class Drawing(blenderbim.core.tool.Drawing): cls.import_annotations_in_group(cls.get_drawing_group(drawing)) tool.Blender.get_layer_collection(obj.users_collection[0]).hide_viewport = True - psets = ifcopenshell.util.element.get_psets(reference_element) - target_view = psets.get("EPset_Drawing", {}).get("TargetView", None) + target_view = ifcopenshell.util.element.get_pset(reference_element, "EPset_Drawing", "TargetView") if target_view == "ELEVATION_VIEW": ensure_referenced_drawing_obj_exists(reference_element) return cls.generate_elevation_reference_annotation(drawing, reference_element, context)