mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-21 14:23:53 +00:00
Fix bug where you could save geometry with no data (no vertices / splines) which is invalid.
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user