From 2fc74fd440ebf8c7728eb6c03d57a9a266693cd0 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Tue, 18 Apr 2023 18:10:01 +1000 Subject: [PATCH] Fix bug where you could save geometry with no data (no vertices / splines) which is invalid. --- .../blenderbim/bim/module/geometry/__init__.py | 3 +++ .../blenderbim/bim/module/geometry/operator.py | 18 ++++++++++++++---- src/blenderbim/blenderbim/tool/geometry.py | 10 ++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py index a503a9dbd1..8ae77d88a0 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/__init__.py @@ -78,6 +78,9 @@ def register(): km = wm.keyconfigs.addon.keymaps.new(name="Mesh", space_type="EMPTY") kmi = km.keymap_items.new("bim.override_mode_set_object", "TAB", "PRESS") + km = wm.keyconfigs.addon.keymaps.new(name="Curve", space_type="EMPTY") + kmi = km.keymap_items.new("bim.override_mode_set_object", "TAB", "PRESS") + km = wm.keyconfigs.addon.keymaps.new(name="Outliner", space_type="OUTLINER") kmi = km.keymap_items.new("bim.override_paste_buffer", "V", "PRESS", ctrl=True) kmi = km.keymap_items.new("bim.override_outliner_delete", "X", "PRESS") diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index 4680094562..f23e778c5e 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -815,10 +815,17 @@ class OverrideModeSetObject(bpy.types.Operator): ) def draw(self, context): - row = self.layout.row(align=True) - row.prop(self, "should_save") + if self.is_valid: + row = self.layout.row() + row.prop(self, "should_save") + else: + row = self.layout.row() + row.label(text="No Geometry Found: Object will revert to previous state.") def invoke(self, context, event): + self.is_valid = True + self.should_save = True + bpy.ops.object.mode_set(mode="EDIT", toggle=True) if not tool.Ifc.get(): @@ -834,16 +841,19 @@ class OverrideModeSetObject(bpy.types.Operator): continue element = tool.Ifc.get_entity(obj) - if not element or element.is_a("IfcAnnotation"): + if not element: continue if obj.data.BIMMeshProperties.ifc_definition_id: + if not tool.Geometry.has_geometric_data(obj): + self.is_valid = False + self.should_save = False representation = tool.Ifc.get().by_id(obj.data.BIMMeshProperties.ifc_definition_id) if tool.Geometry.is_meshlike( representation ) and obj.data.BIMMeshProperties.mesh_checksum != tool.Geometry.get_mesh_checksum(obj.data): self.edited_objs.append(obj) - elif element.HasOpenings: + elif getattr(element, "HasOpenings", None): self.unchanged_objs_with_openings.append(obj) if self.edited_objs: diff --git a/src/blenderbim/blenderbim/tool/geometry.py b/src/blenderbim/blenderbim/tool/geometry.py index 1ab05739f8..48101164db 100644 --- a/src/blenderbim/blenderbim/tool/geometry.py +++ b/src/blenderbim/blenderbim/tool/geometry.py @@ -247,6 +247,16 @@ class Geometry(blenderbim.core.tool.Geometry): def has_data_users(cls, data): return data.users != 0 + @classmethod + def has_geometric_data(cls, obj): + if not obj.data: + return False + if isinstance(obj.data, bpy.types.Mesh): + return bool(obj.data.vertices) + elif isinstance(obj.data, bpy.types.Curve): + return bool(obj.data.splines) + return False + @classmethod def import_representation(cls, obj, representation, apply_openings=True): logger = logging.getLogger("ImportIFC")