mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-21 23:00:53 +00:00
Blender now helps prevent saving Blender without having an exported IFC. See #1323.
This commit is contained in:
@@ -165,6 +165,7 @@ if bpy is not None:
|
|||||||
bpy.app.handlers.depsgraph_update_post.append(on_register)
|
bpy.app.handlers.depsgraph_update_post.append(on_register)
|
||||||
bpy.app.handlers.load_post.append(handler.setDefaultProperties)
|
bpy.app.handlers.load_post.append(handler.setDefaultProperties)
|
||||||
bpy.app.handlers.load_post.append(handler.loadIfcStore)
|
bpy.app.handlers.load_post.append(handler.loadIfcStore)
|
||||||
|
bpy.app.handlers.save_pre.append(handler.ensureIfcExported)
|
||||||
bpy.app.handlers.save_pre.append(handler.storeIdMap)
|
bpy.app.handlers.save_pre.append(handler.storeIdMap)
|
||||||
bpy.types.TOPBAR_MT_file_export.append(menu_func_export)
|
bpy.types.TOPBAR_MT_file_export.append(menu_func_export)
|
||||||
bpy.types.TOPBAR_MT_file_import.append(menu_func_import)
|
bpy.types.TOPBAR_MT_file_import.append(menu_func_import)
|
||||||
@@ -191,6 +192,7 @@ if bpy is not None:
|
|||||||
bpy.app.handlers.load_post.remove(handler.setDefaultProperties)
|
bpy.app.handlers.load_post.remove(handler.setDefaultProperties)
|
||||||
bpy.app.handlers.load_post.remove(handler.loadIfcStore)
|
bpy.app.handlers.load_post.remove(handler.loadIfcStore)
|
||||||
bpy.app.handlers.save_pre.remove(handler.storeIdMap)
|
bpy.app.handlers.save_pre.remove(handler.storeIdMap)
|
||||||
|
bpy.app.handlers.save_pre.remove(handler.ensureIfcExported)
|
||||||
bpy.types.TOPBAR_MT_file_export.remove(menu_func_export)
|
bpy.types.TOPBAR_MT_file_export.remove(menu_func_export)
|
||||||
bpy.types.TOPBAR_MT_file_import.remove(menu_func_import)
|
bpy.types.TOPBAR_MT_file_import.remove(menu_func_import)
|
||||||
del bpy.types.Scene.BIMProperties
|
del bpy.types.Scene.BIMProperties
|
||||||
|
|||||||
@@ -10,22 +10,34 @@ def loadIfcStore(scene):
|
|||||||
IfcStore.file = None
|
IfcStore.file = None
|
||||||
IfcStore.schema = None
|
IfcStore.schema = None
|
||||||
props = bpy.context.scene.BIMProperties
|
props = bpy.context.scene.BIMProperties
|
||||||
IfcStore.id_map = {int(k): bpy.data.objects.get(v) for k, v in json.loads(props.id_map).items()} if props.id_map else {}
|
IfcStore.id_map = (
|
||||||
|
{int(k): bpy.data.objects.get(v) for k, v in json.loads(props.id_map).items()} if props.id_map else {}
|
||||||
|
)
|
||||||
IfcStore.guid_map = (
|
IfcStore.guid_map = (
|
||||||
{k: bpy.data.objects.get(v) for k, v in json.loads(props.guid_map).items()} if props.id_map else {}
|
{k: bpy.data.objects.get(v) for k, v in json.loads(props.guid_map).items()} if props.id_map else {}
|
||||||
)
|
)
|
||||||
|
|
||||||
# Purge data cache
|
# Purge data cache
|
||||||
from blenderbim.bim import modules
|
from blenderbim.bim import modules
|
||||||
|
|
||||||
for module in modules.values():
|
for module in modules.values():
|
||||||
if not module:
|
if not module:
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
getattr(getattr(module, 'data'), 'Data').purge()
|
getattr(getattr(module, "data"), "Data").purge()
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@persistent
|
||||||
|
def ensureIfcExported(scene):
|
||||||
|
print('ensuring')
|
||||||
|
if IfcStore.get_file() and not bpy.context.scene.BIMProperties.ifc_file:
|
||||||
|
# The invocation pops up a file select window.
|
||||||
|
# This is non-blocking, therefore the Blend file is saved before we export.
|
||||||
|
bpy.ops.export_ifc.bim("INVOKE_DEFAULT", should_force_resave=True)
|
||||||
|
|
||||||
|
|
||||||
@persistent
|
@persistent
|
||||||
def storeIdMap(scene):
|
def storeIdMap(scene):
|
||||||
bpy.context.scene.BIMProperties.id_map = json.dumps({k: v.name for k, v in IfcStore.id_map.items()})
|
bpy.context.scene.BIMProperties.id_map = json.dumps({k: v.name for k, v in IfcStore.id_map.items()})
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ class ExportIFC(bpy.types.Operator):
|
|||||||
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
|
||||||
json_version: bpy.props.EnumProperty(items=[("4", "4", ""), ("5a", "5a", "")], name="IFC JSON Version")
|
json_version: bpy.props.EnumProperty(items=[("4", "4", ""), ("5a", "5a", "")], name="IFC JSON Version")
|
||||||
json_compact: bpy.props.BoolProperty(name="Export Compact IFCJSON", default=False)
|
json_compact: bpy.props.BoolProperty(name="Export Compact IFCJSON", default=False)
|
||||||
|
should_force_resave: bpy.props.BoolProperty(name="Resave .blend", default=False)
|
||||||
|
|
||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
if not self.filepath:
|
if not self.filepath:
|
||||||
@@ -103,6 +104,8 @@ class ExportIFC(bpy.types.Operator):
|
|||||||
new.name = output_file
|
new.name = output_file
|
||||||
if not bpy.context.scene.BIMProperties.ifc_file:
|
if not bpy.context.scene.BIMProperties.ifc_file:
|
||||||
bpy.context.scene.BIMProperties.ifc_file = output_file
|
bpy.context.scene.BIMProperties.ifc_file = output_file
|
||||||
|
if self.should_force_resave:
|
||||||
|
bpy.ops.wm.save_as_mainfile(filepath=bpy.data.filepath)
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user