Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dev #436

Merged
merged 9 commits into from
Aug 4, 2024
Merged

Dev #436

Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 25 additions & 10 deletions InitGui.py
Original file line number Diff line number Diff line change
@@ -21,28 +21,32 @@
# ***************************************************************************
"""Gui initialization module for Render Workbench."""

import FreeCAD as App
import FreeCADGui as Gui

# Caveat: do not import Render here (too early, will slow down global startup)


class RenderWorkbench(Gui.Workbench):
"""The Render Workbench."""

def __init__(self):
"""Initialize object."""
# pylint: disable=import-outside-toplevel
from Render.utils import translate
from Render import TRANSDIR
# Caveat: do not import Render here
# (too early, will slow down global startup)

from FreeCADGui import addLanguagePath, updateLocale
# pylint: disable=import-outside-toplevel
import FreeCAD

addLanguagePath(TRANSDIR)
updateLocale()
try:
translate = FreeCAD.Qt.translate
except AttributeError:
translate = lambda _, x: x

self.__class__.MenuText = "Render"
self.__class__.ToolTip = translate(
"Workbench",
"The Render workbench is a "
"modern replacement for "
"The Render workbench is a modern replacement for "
"the Raytracing workbench",
)
self.__class__.Icon = """
@@ -110,9 +114,20 @@ def Initialize(self):
from PySide.QtCore import QT_TRANSLATE_NOOP
from Render.utils import translate
from FreeCAD import Console
from FreeCADGui import addIconPath, addPreferencePage
from Render import RENDER_COMMANDS, ICONDIR, PreferencesPage
from FreeCADGui import (
addIconPath,
addPreferencePage,
addLanguagePath,
updateLocale,
)

from Render import RENDER_COMMANDS, ICONDIR, TRANSDIR, PreferencesPage

# Translations
addLanguagePath(TRANSDIR)
updateLocale()

# GUI
self.appendToolbar(
QT_TRANSLATE_NOOP("Workbench", "Render"), RENDER_COMMANDS
)
75 changes: 55 additions & 20 deletions Render/resources/ui/RenderSettings.ui
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>453</width>
<height>1318</height>
<height>1339</height>
</rect>
</property>
<property name="windowTitle">
@@ -20,13 +20,13 @@
<string>Plugins</string>
</property>
<layout class="QGridLayout" name="gridLayout_12">
<item row="0" column="0">
<widget class="QLabel" name="label_28">
<item row="1" column="0">
<widget class="QLabel" name="label_30">
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="text">
<string>Enable MaterialX features</string>
<string>Update Pip when reloading</string>
</property>
</widget>
</item>
@@ -40,42 +40,49 @@
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="Gui::PrefCheckBox" name="checkBox_14">
<item row="1" column="1">
<widget class="Gui::PrefCheckBox" name="checkBox_9">
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="text">
<string/>
</property>
<property name="prefEntry" stdset="0">
<cstring>PluginDisableEmbedding</cstring>
<cstring>UpdatePip</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Render</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="Gui::PrefCheckBox" name="checkBox_7">
<item row="0" column="0">
<widget class="QLabel" name="label_28">
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="text">
<string/>
<string>Enable MaterialX features</string>
</property>
<property name="checked">
<bool>true</bool>
</widget>
</item>
<item row="4" column="1">
<widget class="Gui::PrefCheckBox" name="checkBox_14">
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="text">
<string/>
</property>
<property name="prefEntry" stdset="0">
<cstring>MaterialX</cstring>
<cstring>PluginDisableEmbedding</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Render</cstring>
</property>
</widget>
</item>
<item row="5" column="0">
<item row="6" column="0">
<widget class="QPushButton" name="ResetVenv">
<property name="locale">
<locale language="English" country="UnitedStates"/>
@@ -85,26 +92,54 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_30">
<item row="0" column="1">
<widget class="Gui::PrefCheckBox" name="checkBox_7">
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="text">
<string>Update Pip when reloading</string>
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>MaterialX</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Render</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="Gui::PrefCheckBox" name="checkBox_9">
<item row="5" column="1">
<widget class="Gui::PrefCheckBox" name="checkBox_11">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Standard behavior is to download virtual environment package ('venv') from pypa.io.&lt;/p&gt;&lt;p&gt;If checked, Render will use the package provided by system Python installation instead.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="text">
<string/>
</property>
<property name="prefEntry" stdset="0">
<cstring>UpdatePip</cstring>
<cstring>UseSystemVenv</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Render</cstring>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_32">
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="text">
<string>Use system virtualenv package</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
36 changes: 35 additions & 1 deletion Render/virtualenv.py
Original file line number Diff line number Diff line change
@@ -121,7 +121,7 @@ def rendervenv_worker():

# Step 4: Update pip (optional)
if PARAMS.GetBool("UpdatePip"):
_log(">>> Updating pip")
_msg(">>> Updating pip")
pip_install(
"pip",
options=[
@@ -337,8 +337,42 @@ def _create_virtualenv():
# Instead, we will bootstrap everything from pypi
# https://pypi.org/project/bootstrap-env
url = "https://bootstrap.pypa.io/virtualenv.pyz"

# Check Python
if not (python := find_python()):
raise VenvError(0)

# Issue #431: we introduce the option to try system virtualenv
# prior to download a fresh one
if PARAMS.GetBool("UseSystemVenv"):
_log("Using system virtualenv package (as required by settings)")
command = [
python,
"-I",
"-u",
"-m",
"venv",
RENDER_VENV_DIR,
]
_log(" ".join(command))
try:
subprocess.run(
command,
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True,
)
except subprocess.CalledProcessError as err:
msg = (
f"Error using system 'venv' package - return code = {err.returncode}\n"
f"{err.stdout}"
"Falling back to download 'venv' from pypa.io"
)
_warn(msg)
else:
return

with tempfile.TemporaryDirectory() as tmp:
pyz = os.path.join(tmp, "virtualenv.pyz")
urllib.request.urlretrieve(url, pyz)
4 changes: 2 additions & 2 deletions package.xml
Original file line number Diff line number Diff line change
@@ -4,8 +4,8 @@
<description>A workbench to produce high-quality rendered images from your FreeCAD document, using open-source external rendering engines.

Designed as a modern replacement for deprecated internal Raytracing Workbench.</description>
<version>2024.07.04</version>
<date>2024-07-04</date>
<version>2024.08.04</version>
<date>2024-08-04</date>
<maintainer email="@howetuft">howetuft</maintainer>
<maintainer email="@yorikvanhavre">Yorik Van Havre</maintainer>
<license file="LICENSE">LGPL-2.1-or-later</license>