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")
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")
@@ -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:
@@ -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")