From 8b66274a7ade0933b1a747442b7f3a8b9454e377 Mon Sep 17 00:00:00 2001 From: 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