From 36f2ed6da6a7e56005819d93df4d06d313d8f3cd Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 1 Sep 2022 11:16:33 +1000 Subject: [PATCH] Allow disabling undo on save The transaction system does not scale on large scale or complex remove_deep deletions. So if you want to delete a mesh with many thousands of vertices, it becomes very, very slow. Unfortunately we cannot also clear Blender's undo history, so this advanced feature should be used carefully. Tested: - deleting 250 average objects: 264s before, 246s after (6.8% faster) - deleting 1 object with 6,000 vertices: 5 minutes and counting (basically impractical) before, 11s after --- .../blenderbim/bim/module/project/operator.py | 11 ++++++++++- src/blenderbim/blenderbim/bim/module/project/prop.py | 1 + src/ifcopenshell-python/ifcopenshell/file.py | 3 ++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index f634cea3a7..30e08ad57c 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -828,7 +828,16 @@ class ExportIFC(bpy.types.Operator): return {"RUNNING_MODAL"} def execute(self, context): - return IfcStore.execute_ifc_operator(self, context) + if context.scene.BIMProjectProperties.should_disable_undo_on_save: + old_history_size = tool.Ifc.get().history_size + old_undo_steps = context.preferences.edit.undo_steps + tool.Ifc.get().history_size = 0 + context.preferences.edit.undo_steps = 0 + IfcStore.execute_ifc_operator(self, context) + if context.scene.BIMProjectProperties.should_disable_undo_on_save: + tool.Ifc.get().history_size = old_history_size + context.preferences.edit.undo_steps = old_undo_steps + return {"FINISHED"} def _execute(self, context): start = time.time() diff --git a/src/blenderbim/blenderbim/bim/module/project/prop.py b/src/blenderbim/blenderbim/bim/module/project/prop.py index 9ef5dda676..9f3f09d94c 100644 --- a/src/blenderbim/blenderbim/bim/module/project/prop.py +++ b/src/blenderbim/blenderbim/bim/module/project/prop.py @@ -159,6 +159,7 @@ class BIMProjectProperties(PropertyGroup): false_origin: StringProperty(name="False Origin", default="0,0,0") element_offset: IntProperty(name="Element Offset", default=0) element_limit: IntProperty(name="Element Offset", default=30000) + should_disable_undo_on_save: BoolProperty(name="Disable Undo When Saving (Faster saves, no undo for you!)", default=False) links: CollectionProperty(name="Links", type=Link) active_link_index: IntProperty(name="Active Link Index") export_schema: EnumProperty(items=get_export_schema, name="IFC Schema") diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index 73bd62c8e0..3ce5442942 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -203,7 +203,8 @@ class file(object): self.history.pop(0) def begin_transaction(self): - self.transaction = Transaction(self) + if self.history_size: + self.transaction = Transaction(self) def end_transaction(self): if self.transaction: