From be32c3c37513e65793da97022055c76515c4ecab Mon Sep 17 00:00:00 2001 From: John O'Connor Date: Thu, 23 Oct 2025 14:58:25 -0700 Subject: [PATCH 1/3] Added Mac-OS specific render logic since the embed is not supported in QT <6 --- .../downloader/materialx_downloader.py | 4 +- Render/subcontainer.py | 44 +++++++++++++------ 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/Render/plugins/materialx/downloader/materialx_downloader.py b/Render/plugins/materialx/downloader/materialx_downloader.py index 6fbe3513..b248cc27 100644 --- a/Render/plugins/materialx/downloader/materialx_downloader.py +++ b/Render/plugins/materialx/downloader/materialx_downloader.py @@ -235,8 +235,8 @@ class ImporterWorker(QObject): """ # Signals - finished = Signal(int) - _report_progress = Signal(int, int) + finished = Signal(object) + _report_progress = Signal(object, object) def __init__( self, diff --git a/Render/subcontainer.py b/Render/subcontainer.py index b8fc03f0..0bafb682 100644 --- a/Render/subcontainer.py +++ b/Render/subcontainer.py @@ -46,7 +46,7 @@ from threading import Thread, Event import pathlib import configparser - +import sys import FreeCADGui as Gui import FreeCAD as App @@ -69,6 +69,7 @@ Qt, QEventLoop, ) + from PySide.QtGui import ( QWidget, QWindow, @@ -76,6 +77,8 @@ QGuiApplication, ) +from PySide.QtWidgets import QWidget, QLabel, QVBoxLayout + class ConnectionServer(QObject): """A server to connect the host process and the sub process.""" @@ -121,7 +124,7 @@ class PythonSubprocess(QProcess): - a communication server to interact with process """ - winid_available = Signal(int) + winid_available = Signal(object) detach_required = Signal() def __init__(self, python, args, parent=None): @@ -332,21 +335,34 @@ def start(self): self.setWindowTitle("Render") mdiarea.addSubWindow(self) - @Slot(int) + @Slot(object) def attach_process(self, winid): """Attach subprocess to FreeCAD Gui.""" # Create container and embed process inside - self.window = QWindow.fromWinId(winid) - self.window.setObjectName("RenderWindowFromWinid") - self.container = QWidget.createWindowContainer( - self.window, - parent=None, - flags=Qt.FramelessWindowHint | Qt.ForeignWindow, - ) - self.container.setObjectName("RenderProcessWindowContainer") - self.setWidget(self.container) - self.container.setParent(self) - self.show() + # QWindow.fromWinId is not supported on macOS and QT <6, so open a new window instead. + if sys.platform == "darwin": + print("QWindow.fromWinId not supported on macOS – showing placeholder window.") + self.container = QWidget() + layout = QVBoxLayout(self.container) + label = QLabel("Renderer running in external window.\nEmbedding not supported on macOS.") + label.setAlignment(Qt.AlignCenter) + layout.addWidget(label) + self.setWidget(self.container) + self.container.setParent(self) + self.show() + return + else: + self.window = QWindow.fromWinId(winid) + self.window.setObjectName("RenderWindowFromWinid") + self.container = QWidget.createWindowContainer( + self.window, + parent=None, + flags=Qt.FramelessWindowHint | Qt.ForeignWindow, + ) + self.container.setObjectName("RenderProcessWindowContainer") + self.setWidget(self.container) + self.container.setParent(self) + self.show() @Slot() def detach_process(self): From ef5a402c4991f0c907daf4c9140c315c6ffab96c Mon Sep 17 00:00:00 2001 From: John O'Connor Date: Thu, 23 Oct 2025 15:03:15 -0700 Subject: [PATCH 2/3] Reverted changes from int to object that were unnecessary --- Render/plugins/materialx/downloader/materialx_downloader.py | 4 ++-- Render/subcontainer.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Render/plugins/materialx/downloader/materialx_downloader.py b/Render/plugins/materialx/downloader/materialx_downloader.py index b248cc27..6fbe3513 100644 --- a/Render/plugins/materialx/downloader/materialx_downloader.py +++ b/Render/plugins/materialx/downloader/materialx_downloader.py @@ -235,8 +235,8 @@ class ImporterWorker(QObject): """ # Signals - finished = Signal(object) - _report_progress = Signal(object, object) + finished = Signal(int) + _report_progress = Signal(int, int) def __init__( self, diff --git a/Render/subcontainer.py b/Render/subcontainer.py index 0bafb682..58dab6e8 100644 --- a/Render/subcontainer.py +++ b/Render/subcontainer.py @@ -124,7 +124,7 @@ class PythonSubprocess(QProcess): - a communication server to interact with process """ - winid_available = Signal(object) + winid_available = Signal(int) detach_required = Signal() def __init__(self, python, args, parent=None): @@ -335,7 +335,7 @@ def start(self): self.setWindowTitle("Render") mdiarea.addSubWindow(self) - @Slot(object) + @Slot(int) def attach_process(self, winid): """Attach subprocess to FreeCAD Gui.""" # Create container and embed process inside From e1ac8850c6bf2cf402089a593ee95e6c0decf004 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 Oct 2025 22:08:34 +0000 Subject: [PATCH 3/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- Render/subcontainer.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Render/subcontainer.py b/Render/subcontainer.py index 58dab6e8..158d4b49 100644 --- a/Render/subcontainer.py +++ b/Render/subcontainer.py @@ -341,10 +341,14 @@ def attach_process(self, winid): # Create container and embed process inside # QWindow.fromWinId is not supported on macOS and QT <6, so open a new window instead. if sys.platform == "darwin": - print("QWindow.fromWinId not supported on macOS – showing placeholder window.") + print( + "QWindow.fromWinId not supported on macOS – showing placeholder window." + ) self.container = QWidget() layout = QVBoxLayout(self.container) - label = QLabel("Renderer running in external window.\nEmbedding not supported on macOS.") + label = QLabel( + "Renderer running in external window.\nEmbedding not supported on macOS." + ) label.setAlignment(Qt.AlignCenter) layout.addWidget(label) self.setWidget(self.container)