From 7896d5b6e53b868cd86669a7e9bed8e422541836 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Thu, 13 Jul 2023 13:45:50 +0500 Subject: [PATCH] Fixing errors on loading ifc after ef8f82501 The error was: RuntimeError: Operator bpy.ops.object.editmode_toggle.poll() failed, context is incorrect Location: C:\software\Steam\steamapps\common\Blender\3.6\scripts\modules\bpy\ops.py:113 Traceback (most recent call last): File "\3.6\scripts\addons\blenderbim\bim\module\project\operator.py", line 594, in execute bpy.ops.bim.load_project_elements() File "C:\software\Steam\steamapps\common\Blender\3.6\scripts\modules\bpy\ops.py", line 113, in __call__ ret = _op_call(self.idname_py(), None, kw) RuntimeError: Error: Python: Traceback (most recent call last): File "\3.6\scripts\addons\blenderbim\bim\module\project\operator.py", line 653, in execute ifc_importer.execute() File "\3.6\scripts\addons\blenderbim\bim\import_ifc.py", line 265, in execute self.clean_mesh() File "\3.6\scripts\addons\blenderbim\bim\import_ifc.py", line 1347, in clean_mesh bpy.ops.object.editmode_toggle(context_override) File "C:\software\Steam\steamapps\common\Blender\3.6\scripts\modules\bpy\ops.py", line 111, in __call__ ret = _op_call(self.idname_py(), C_dict, kw, C_exec, C_undo) RuntimeError: Operator bpy.ops.object.editmode_toggle.poll() failed, context is incorrect Location: C:\software\Steam\steamapps\common\Blender\3.6\scripts\modules\bpy\ops.py:113 --- .../blenderbim/bim/module/project/operator.py | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index b9839b807f..3cd930fe0c 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -36,6 +36,7 @@ from blenderbim.bim.ui import IFCFileSelector from blenderbim.bim import import_ifc from blenderbim.bim import export_ifc from pathlib import Path +from bpy.app.handlers import persistent class NewProject(bpy.types.Operator): @@ -578,13 +579,28 @@ class LoadProject(bpy.types.Operator, IFCFileSelector): should_start_fresh_session: bpy.props.BoolProperty(name="Should Start Fresh Session", default=True) def execute(self, context): - if self.should_start_fresh_session: - bpy.ops.wm.read_homefile() - + @persistent + def load_handler(*args): + bpy.app.handlers.load_post.remove(load_handler) if tool.Blender.is_default_scene(): for obj in bpy.data.objects: bpy.data.objects.remove(obj) + self.finish_loading_project(context) + if self.should_start_fresh_session: + # WARNING: wm.read_homefile clears context + # which could lead to some operators to fail: + # https://blender.stackexchange.com/a/282558/135166 + # So we continue using the load_post handler + # thats triggered when context is already restored + bpy.app.handlers.load_post.append(load_handler) + bpy.ops.wm.read_homefile() + return {"FINISHED"} + else: + return self.finish_loading_project(context) + + + def finish_loading_project(self, context): if not self.is_existing_ifc_file(): return {"FINISHED"} context.scene.BIMProperties.ifc_file = self.get_filepath() @@ -592,7 +608,8 @@ class LoadProject(bpy.types.Operator, IFCFileSelector): context.scene.BIMProjectProperties.total_elements = len(tool.Ifc.get().by_type("IfcElement")) if not self.is_advanced: bpy.ops.bim.load_project_elements() - return {"FINISHED"} + return {"FINISHED"} + def invoke(self, context, event): context.window_manager.fileselect_add(self)