From f118c50d1d861956985bfbf255b4d8dc0b368fca Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 8 Feb 2023 19:08:39 +1100 Subject: [PATCH] Fix bug where removing a drawing didn't remove its references. --- src/blenderbim/blenderbim/core/drawing.py | 10 ++++++++-- src/blenderbim/blenderbim/core/tool.py | 1 + src/blenderbim/blenderbim/tool/drawing.py | 8 ++++++++ src/blenderbim/test/core/test_drawing.py | 4 ++++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/core/drawing.py b/src/blenderbim/blenderbim/core/drawing.py index 6093e2cd20..06b904cf9d 100644 --- a/src/blenderbim/blenderbim/core/drawing.py +++ b/src/blenderbim/blenderbim/core/drawing.py @@ -181,12 +181,18 @@ def duplicate_drawing(ifc, drawing_tool, drawing=None): def remove_drawing(ifc, drawing_tool, drawing=None): - collection = drawing_tool.get_drawing_collection(drawing) group = drawing_tool.get_drawing_group(drawing) if group: drawing_tool.delete_drawing_elements(drawing_tool.get_group_elements(group)) ifc.run("group.remove_group", group=group) - drawing_tool.delete_collection(collection) + collection = drawing_tool.get_drawing_collection(drawing) + if collection: + drawing_tool.delete_collection(collection) + for reference in drawing_tool.get_drawing_references(drawing): + reference_obj = ifc.get_object(reference) + if reference_obj: + drawing_tool.delete_object(reference_obj) + ifc.run("root.remove_product", product=reference) ifc.run("root.remove_product", product=drawing) drawing_tool.import_drawings() diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 50bdc50b28..9f40ce2388 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -186,6 +186,7 @@ class Drawing: def get_document_uri(cls, document): pass def get_drawing_collection(cls, drawing): pass def get_drawing_group(cls, drawing): pass + def get_drawing_references(cls, drawing): pass def get_drawing_target_view(cls, drawing): pass def get_group_elements(cls, group): pass def get_ifc_representation_class(cls, object_type): pass diff --git a/src/blenderbim/blenderbim/tool/drawing.py b/src/blenderbim/blenderbim/tool/drawing.py index 8e93e837b0..aa3199b841 100644 --- a/src/blenderbim/blenderbim/tool/drawing.py +++ b/src/blenderbim/blenderbim/tool/drawing.py @@ -215,6 +215,14 @@ class Drawing(blenderbim.core.tool.Drawing): if rel.is_a("IfcRelAssignsToGroup"): return rel.RelatingGroup + @classmethod + def get_drawing_references(cls, drawing): + results = set() + for inverse in tool.Ifc.get().get_inverse(drawing): + if inverse.is_a("IfcRelAssignsToProduct") and inverse.RelatingProduct == drawing: + results.update(inverse.RelatedObjects) + return results + @classmethod def get_drawing_target_view(cls, drawing): return ifcopenshell.util.element.get_psets(drawing)["EPset_Drawing"].get("TargetView", "MODEL_VIEW") diff --git a/src/blenderbim/test/core/test_drawing.py b/src/blenderbim/test/core/test_drawing.py index 41beb95d0f..3ec2f61d8c 100644 --- a/src/blenderbim/test/core/test_drawing.py +++ b/src/blenderbim/test/core/test_drawing.py @@ -269,6 +269,10 @@ class TestRemoveDrawing: drawing.delete_drawing_elements("elements").should_be_called() ifc.run("group.remove_group", group="group").should_be_called() drawing.delete_collection("collection").should_be_called() + drawing.get_drawing_references("drawing").should_be_called().will_return(["reference"]) + ifc.get_object("reference").should_be_called().will_return("reference_obj") + drawing.delete_object("reference_obj").should_be_called() + ifc.run("root.remove_product", product="reference").should_be_called() ifc.run("root.remove_product", product="drawing").should_be_called() drawing.import_drawings().should_be_called() subject.remove_drawing(ifc, drawing, drawing="drawing")