Fix bug where you could save geometry with no data (no vertices / splines) which is invalid.

This commit is contained in:
Dion Moult
2023-04-18 18:10:01 +10:00
parent eea93265f7
commit 2fc74fd440
3 changed files with 27 additions and 4 deletions
@@ -78,6 +78,9 @@ def register():
km = wm.keyconfigs.addon.keymaps.new(name="Mesh", space_type="EMPTY") km = wm.keyconfigs.addon.keymaps.new(name="Mesh", space_type="EMPTY")
kmi = km.keymap_items.new("bim.override_mode_set_object", "TAB", "PRESS") 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") 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_paste_buffer", "V", "PRESS", ctrl=True)
kmi = km.keymap_items.new("bim.override_outliner_delete", "X", "PRESS") kmi = km.keymap_items.new("bim.override_outliner_delete", "X", "PRESS")
@@ -815,10 +815,17 @@ class OverrideModeSetObject(bpy.types.Operator):
) )
def draw(self, context): def draw(self, context):
row = self.layout.row(align=True) if self.is_valid:
row.prop(self, "should_save") 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): def invoke(self, context, event):
self.is_valid = True
self.should_save = True
bpy.ops.object.mode_set(mode="EDIT", toggle=True) bpy.ops.object.mode_set(mode="EDIT", toggle=True)
if not tool.Ifc.get(): if not tool.Ifc.get():
@@ -834,16 +841,19 @@ class OverrideModeSetObject(bpy.types.Operator):
continue continue
element = tool.Ifc.get_entity(obj) element = tool.Ifc.get_entity(obj)
if not element or element.is_a("IfcAnnotation"): if not element:
continue continue
if obj.data.BIMMeshProperties.ifc_definition_id: 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) representation = tool.Ifc.get().by_id(obj.data.BIMMeshProperties.ifc_definition_id)
if tool.Geometry.is_meshlike( if tool.Geometry.is_meshlike(
representation representation
) and obj.data.BIMMeshProperties.mesh_checksum != tool.Geometry.get_mesh_checksum(obj.data): ) and obj.data.BIMMeshProperties.mesh_checksum != tool.Geometry.get_mesh_checksum(obj.data):
self.edited_objs.append(obj) self.edited_objs.append(obj)
elif element.HasOpenings: elif getattr(element, "HasOpenings", None):
self.unchanged_objs_with_openings.append(obj) self.unchanged_objs_with_openings.append(obj)
if self.edited_objs: if self.edited_objs:
@@ -247,6 +247,16 @@ class Geometry(blenderbim.core.tool.Geometry):
def has_data_users(cls, data): def has_data_users(cls, data):
return data.users != 0 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 @classmethod
def import_representation(cls, obj, representation, apply_openings=True): def import_representation(cls, obj, representation, apply_openings=True):
logger = logging.getLogger("ImportIFC") logger = logging.getLogger("ImportIFC")