From 8e44ed2f7581f82bfb8d0a941930c26233f6456f Mon Sep 17 00:00:00 2001 From: Zoe Forbes Date: Thu, 29 Jan 2026 22:42:15 -0600 Subject: [PATCH] Fix SIGSEGV: defer document open after dialog close Opening documents (especially assemblies) inside the QDialog nested event loop can crash FreeCAD when the Assembly solver triggers during document restore. Move FreeCAD.openDocument() to after dialog.exec_() returns. --- pkg/freecad/silo_commands.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/pkg/freecad/silo_commands.py b/pkg/freecad/silo_commands.py index a5e1ca2..f7591c1 100644 --- a/pkg/freecad/silo_commands.py +++ b/pkg/freecad/silo_commands.py @@ -988,17 +988,14 @@ class Silo_Open: results_table.setItem(row, 4, QtGui.QTableWidgetItem(data["modified"])) results_table.resizeColumnsToContents() + _open_after_close = [None] + def open_selected(): selected = results_table.selectedItems() if not selected: return row = selected[0].row() - data = results_data[row] - - if data["path"]: - FreeCAD.openDocument(data["path"]) - else: - _sync.open_item(data["part_number"]) + _open_after_close[0] = dict(results_data[row]) dialog.accept() search_input.textChanged.connect(lambda: do_search()) @@ -1018,6 +1015,16 @@ class Silo_Open: do_search() dialog.exec_() + # Open the document AFTER the dialog has fully closed so that + # heavy document loads (especially Assembly files) don't run + # inside the dialog's nested event loop, which can cause crashes. + data = _open_after_close[0] + if data is not None: + if data.get("path"): + FreeCAD.openDocument(data["path"]) + else: + _sync.open_item(data["part_number"]) + def IsActive(self): return True