From fca039449b9115521080180c52de9f8aef395bf4 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Fri, 21 Nov 2025 14:14:00 +0100 Subject: [PATCH 01/34] first commit, app opening! --- .gitignore | 1 + .mac_env | 9 +++ README.md | 11 +++ Rayforge.spec | 50 ++++++++++++ pyinstaller_dyld_env.py | 20 +++++ pyproject.toml | 4 + rayforge/app.py | 32 ++++++-- rayforge/image/svg/svgutil.py | 138 +++++----------------------------- rayforge/version.txt | 1 + scripts/mac_build.sh | 66 ++++++++++++++++ scripts/mac_setup.sh | 64 ++++++++++++++++ 11 files changed, 268 insertions(+), 128 deletions(-) create mode 100644 .mac_env create mode 100644 Rayforge.spec create mode 100644 pyinstaller_dyld_env.py create mode 100644 rayforge/version.txt create mode 100755 scripts/mac_build.sh create mode 100755 scripts/mac_setup.sh diff --git a/.gitignore b/.gitignore index 4fa4fa77..6c5eba19 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ venv .venv +.venv-mac *.swp *.py[oc] __pycache__ diff --git a/.mac_env b/.mac_env new file mode 100644 index 00000000..3c2ea1f6 --- /dev/null +++ b/.mac_env @@ -0,0 +1,9 @@ +export BREW_PREFIX="/usr/local" +export LIBFFI_PREFIX="/usr/local/opt/libffi" +export PATH="/usr/local/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/Cellar/ffmpeg/4.3.1_2/bin:/usr/local/bin/python3:/usr/local/Cellar/python@3.11/3.11.2_1/bin/python3:/opt/X11/bin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/var/folders/qy/j2t2sz113nl3p_l7kc22ybb80000gn/T/.tmpr0xjAy:/usr/local/opt/node@20/bin:/opt/local/ffmpeg42/lib/pkgconfig:/Applications/Inkscape.app/Contents/MacOS:/opt/local/bin:/opt/local/sbin:/usr/local/opt/coreutils/libexec/gnubin:/usr/local/Cellar/python@3.11/3.11.2_1/Frameworks/Python.framework/Versions/3.11/Python:/usr/local/bin/python:/usr/local/opt/openexr@2/bin:/usr/local/sbin:/Users/pablo/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/Users/pablo/.vscode/extensions/openai.chatgpt-0.4.46-darwin-x64/bin/macos-x86_64" +export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/local/opt/libffi/lib/pkgconfig:/opt/local/lib/pkgconfig:/opt/local/ffmpeg42/lib/pkgconfig:/Applications/Inkscape.app/Contents/MacOS:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/usr/local/opt/coreutils/libexec/gnubin:/usr/local/Cellar/python@3.11/3.11.2_1/Frameworks/Python.framework/Versions/3.11/Python:/usr/local/bin/python3:/usr/local/bin/python:/usr/local/opt/openexr@2/bin:/usr/local/sbin:/usr/local/bin:/Users/pablo/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/Cellar/ffmpeg/4.3.1_2/bin:/usr/local/bin/python3:/usr/local/Cellar/python@3.11/3.11.2_1/bin/python3:/opt/X11/bin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands" +export GI_TYPELIB_PATH="/usr/local/lib/girepository-1.0:" +export DYLD_FALLBACK_LIBRARY_PATH="/usr/local/lib:" +if ! echo "/opt/local/lib/pkgconfig:/opt/local/ffmpeg42/lib/pkgconfig:/Applications/Inkscape.app/Contents/MacOS:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/usr/local/opt/coreutils/libexec/gnubin:/usr/local/Cellar/python@3.11/3.11.2_1/Frameworks/Python.framework/Versions/3.11/Python:/usr/local/bin/python3:/usr/local/bin/python:/usr/local/opt/openexr@2/bin:/usr/local/sbin:/usr/local/bin:/Users/pablo/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/Cellar/ffmpeg/4.3.1_2/bin:/usr/local/bin/python3:/usr/local/Cellar/python@3.11/3.11.2_1/bin/python3:/opt/X11/bin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands" | tr ':' '\n' | grep -qx "/usr/local/lib/pkgconfig"; then + export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:/opt/local/lib/pkgconfig:/opt/local/ffmpeg42/lib/pkgconfig:/Applications/Inkscape.app/Contents/MacOS:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/usr/local/opt/coreutils/libexec/gnubin:/usr/local/Cellar/python@3.11/3.11.2_1/Frameworks/Python.framework/Versions/3.11/Python:/usr/local/bin/python3:/usr/local/bin/python:/usr/local/opt/openexr@2/bin:/usr/local/sbin:/usr/local/bin:/Users/pablo/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/Cellar/ffmpeg/4.3.1_2/bin:/usr/local/bin/python3:/usr/local/Cellar/python@3.11/3.11.2_1/bin/python3:/opt/X11/bin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands" +fi diff --git a/README.md b/README.md index f00ac21f..8977bac9 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,17 @@ For detailed information about developing for Rayforge, including setup instruct testing, and contribution guidelines, please see the [Developer Documentation](https://rayforge.org/docs/latest/developer/getting-started/). +## macOS build notes + +macOS builds rely on Homebrew because libadwaita is not available from the +conda-forge stack used by the Linux tooling. To prepare a build: + +1. Run `scripts/mac_setup.sh --install` to install the native GTK stack + (gtk4, libadwaita, libvips, etc.) and write `.mac_env`. +2. Source the environment with `source .mac_env`. +3. Build the wheel with `scripts/mac_build.sh`. Pass `--bundle` to also produce + a PyInstaller `.app` directory that uses the Homebrew libraries on the host. + ## License This project is licensed under the **MIT License**. See the `LICENSE` file for details. diff --git a/Rayforge.spec b/Rayforge.spec new file mode 100644 index 00000000..17656658 --- /dev/null +++ b/Rayforge.spec @@ -0,0 +1,50 @@ +# -*- mode: python ; coding: utf-8 -*- + + +a = Analysis( + ['rayforge/app.py'], + pathex=[], + binaries=[], + datas=[('rayforge/version.txt', 'rayforge'), ('rayforge/resources', 'rayforge/resources'), ('rayforge/locale', 'rayforge/locale')], + hiddenimports=['gi._gi_cairo'], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name='Rayforge', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=False, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) +coll = COLLECT( + exe, + a.binaries, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name='Rayforge', +) +app = BUNDLE( + coll, + name='Rayforge.app', + icon=None, + bundle_identifier='org.rayforge.rayforge', +) diff --git a/pyinstaller_dyld_env.py b/pyinstaller_dyld_env.py new file mode 100644 index 00000000..c5411648 --- /dev/null +++ b/pyinstaller_dyld_env.py @@ -0,0 +1,20 @@ +import os +import sys +from pathlib import Path + +if hasattr(sys, "_MEIPASS"): + frameworks_dir = Path(sys._MEIPASS).parent / "Frameworks" + lib_path = str(frameworks_dir) + existing_dyld = os.environ.get("DYLD_LIBRARY_PATH") + os.environ["DYLD_LIBRARY_PATH"] = ( + lib_path if not existing_dyld else f"{lib_path}:{existing_dyld}" + ) + os.environ.setdefault("DYLD_FALLBACK_LIBRARY_PATH", lib_path) + + typelib_dir = frameworks_dir / "gi_typelibs" + if typelib_dir.exists(): + os.environ["GI_TYPELIB_PATH"] = str(typelib_dir) + + gio_modules = frameworks_dir / "gio_modules" + if gio_modules.exists(): + os.environ.setdefault("GIO_EXTRA_MODULES", str(gio_modules)) diff --git a/pyproject.toml b/pyproject.toml index aafa1e23..0d115d9a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: POSIX :: Linux", + "Operating System :: MacOS :: MacOS X", "Intended Audience :: End Users/Desktop", "Intended Audience :: Manufacturing", ] @@ -70,6 +71,9 @@ test = [ "pytest-cov", # Add coverage tool "pygobject-stubs", ] +build = [ + "pyinstaller>=6.11,<7", +] [tool.pytest.ini_options] asyncio_mode = "strict" diff --git a/rayforge/app.py b/rayforge/app.py index 16bf104e..e158a8ce 100644 --- a/rayforge/app.py +++ b/rayforge/app.py @@ -47,14 +47,32 @@ # -------------------------------------------------------- # GObject Introspection Repository (gi) # -------------------------------------------------------- -# When running in a PyInstaller bundle, we need to set the GI_TYPELIB_PATH -# environment variable to point to the bundled typelib files. +# When running in a PyInstaller bundle, point GI to the typelibs we ship. if hasattr(sys, "_MEIPASS"): - typelib_path = base_dir / "gi" / "repository" - logger.info(f"GI_TYPELIB_PATH is {typelib_path}") - os.environ["GI_TYPELIB_PATH"] = str(typelib_path) - files = [p.name for p in typelib_path.iterdir()] - logger.info(f"Files in typelib path: {files}") + frameworks_dir = Path(sys._MEIPASS).parent / "Frameworks" + bundled_typelibs = frameworks_dir / "gi_typelibs" + bundled_gio_modules = frameworks_dir / "gio_modules" + lib_path = str(frameworks_dir) + existing_dyld = os.environ.get("DYLD_LIBRARY_PATH") + os.environ["DYLD_LIBRARY_PATH"] = ( + lib_path if not existing_dyld else f"{lib_path}:{existing_dyld}" + ) + os.environ.setdefault("DYLD_FALLBACK_LIBRARY_PATH", lib_path) + seen = set() + candidates = [] + for path in [bundled_typelibs]: + if path.exists(): + resolved = str(path.resolve()) + if resolved not in seen: + seen.add(resolved) + candidates.append(resolved) + if candidates: + os.environ["GI_TYPELIB_PATH"] = ":".join(candidates) + logger.info(f"GI_TYPELIB_PATH is {os.environ['GI_TYPELIB_PATH']}") + else: + logger.warning("No GI typelibs found for bundled build.") + if bundled_gio_modules.exists(): + os.environ.setdefault("GIO_EXTRA_MODULES", str(bundled_gio_modules)) def handle_exception(exc_type, exc_value, exc_traceback): diff --git a/rayforge/image/svg/svgutil.py b/rayforge/image/svg/svgutil.py index 03df41f3..9c7b8396 100644 --- a/rayforge/image/svg/svgutil.py +++ b/rayforge/image/svg/svgutil.py @@ -1,7 +1,6 @@ import warnings -from typing import Tuple, Optional, List, Dict, Any +from typing import Tuple, Optional from xml.etree import ElementTree as ET -import logging with warnings.catch_warnings(): warnings.simplefilter("ignore", DeprecationWarning) @@ -9,8 +8,6 @@ from ..util import parse_length, to_mm -logger = logging.getLogger(__name__) - # A standard fallback conversion factor for pixel units. Corresponds to 96 DPI. PPI: float = 96.0 """Standard Pixels Per Inch, used for fallback conversions.""" @@ -18,34 +15,6 @@ MM_PER_PX: float = 25.4 / PPI """Conversion factor for pixels to millimeters, based on 96 PPI.""" -INKSCAPE_NS = "http://www.inkscape.org/namespaces/inkscape" -SVG_NS = "http://www.w3.org/2000/svg" - -# Tags that represent vector geometry -SHAPE_TAGS = { - "path", - "rect", - "circle", - "ellipse", - "line", - "polyline", - "polygon", - "text", - "image", -} - - -# Register namespaces to prevent ElementTree from mangling them (ns0:tags) -try: - ET.register_namespace("", SVG_NS) - ET.register_namespace("inkscape", INKSCAPE_NS) - ET.register_namespace( - "sodipodi", "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - ) - ET.register_namespace("xlink", "http://www.w3.org/1999/xlink") -except Exception: - pass # Best effort registration - def _get_margins_from_data( data: bytes, @@ -84,21 +53,22 @@ def _get_margins_from_data( render_w = measurement_size * aspect_ratio # 3. Modify SVG for a large, proportional render. + # DO NOT set preserveAspectRatio="none", as this causes distortion. root.set("width", f"{render_w}px") root.set("height", f"{render_h}px") - root.set("preserveAspectRatio", "none") # Create viewBox if it's missing, which is crucial for the renderer # to have a coordinate system. if not root.get("viewBox"): root.set("viewBox", f"0 0 {orig_w} {orig_h}") - # Add overflow:visible to ensure all geometry, including parts - # defined by control points outside the viewBox, is rendered for - # accurate margin calculation. - root.set("style", "overflow: visible") + try: + svg_loader = getattr(pyvips.Image, "svgload_buffer") + except Exception: + # Libvips compiled without SVG loader; skip trimming. + return 0.0, 0.0, 0.0, 0.0 - img = pyvips.Image.svgload_buffer(ET.tostring(root)) + img = svg_loader(ET.tostring(root)) if img.bands < 4: img = img.bandjoin(255) # Ensure alpha channel for trimming @@ -119,7 +89,13 @@ def _get_margins_from_data( (render_w - (left + w)) / render_w, (render_h - (top + h)) / render_h, ) - except (pyvips.Error, ET.ParseError, ValueError): + except ( + pyvips.Error, + ET.ParseError, + ValueError, + AttributeError, + ModuleNotFoundError, + ): # Return zero margins if SVG is invalid or processing fails return 0.0, 0.0, 0.0, 0.0 @@ -183,11 +159,8 @@ def trim_svg(data: bytes) -> bytes: root.set("width", f"{new_w_val}{w_unit or 'px'}") root.set("height", f"{new_h_val}{h_unit or 'px'}") - # This attribute forces non-proportional scaling and causes issues - # when rendering filtered layers. It's safer to rely on librsvg's - # default proportional scaling. - if "preserveAspectRatio" in root.attrib: - del root.attrib["preserveAspectRatio"] + # The content should fill the new view, so set aspect ratio to none + root.set("preserveAspectRatio", "none") return ET.tostring(root) @@ -228,80 +201,3 @@ def get_natural_size(data: bytes) -> Optional[Tuple[float, float]]: except (ValueError, ET.ParseError): return None - - -def _get_local_tag_name(element: ET.Element) -> str: - """Robustly gets the local tag name, ignoring any namespace.""" - return element.tag.rsplit("}", 1)[-1] - - -def extract_layer_manifest(data: bytes) -> List[Dict[str, Any]]: - """ - Parses the SVG to find top-level groups with IDs, treating them as layers. - Also counts the number of geometric elements in each layer. - """ - if not data: - return [] - - layers = [] - logger.debug("--- Starting SVG Layer Extraction ---") - try: - root = ET.fromstring(data) - for child in root: - tag = _get_local_tag_name(child) - layer_id = child.get("id") - - if tag == "g" and layer_id: - label = child.get(f"{{{INKSCAPE_NS}}}label") or layer_id - - # Count visual elements recursively to detect empty layers - feature_count = 0 - for elem in child.iter(): - if _get_local_tag_name(elem) in SHAPE_TAGS: - feature_count += 1 - - layers.append( - { - "id": layer_id, - "name": label, - "count": feature_count, - } - ) - logger.debug( - f"Found layer: ID='{layer_id}', " - f"Name='{label}', Count={feature_count}" - ) - except ET.ParseError as e: - logger.error(f"Failed to parse SVG for layer extraction: {e}") - return [] - - return layers - - -def filter_svg_layers(data: bytes, visible_layer_ids: List[str]) -> bytes: - """ - Returns a modified SVG with only specified top-level groups visible. - """ - if not data: - return b"" - - try: - root = ET.fromstring(data) - elements_to_remove = [] - - for child in root: - tag = _get_local_tag_name(child) - if tag == "g": - layer_id = child.get("id") - # If ID exists AND it is NOT in the visible list, remove it. - if layer_id and layer_id not in visible_layer_ids: - elements_to_remove.append(child) - - for elem in elements_to_remove: - root.remove(elem) - - # Registering namespaces at module level helps, but ET.tostring - # needs to know we want to preserve the environment. - return ET.tostring(root, encoding="utf-8") - except ET.ParseError: - return data diff --git a/rayforge/version.txt b/rayforge/version.txt new file mode 100644 index 00000000..e4f84429 --- /dev/null +++ b/rayforge/version.txt @@ -0,0 +1 @@ +0.24-31-gc930829 diff --git a/scripts/mac_build.sh b/scripts/mac_build.sh new file mode 100755 index 00000000..b50bbd2c --- /dev/null +++ b/scripts/mac_build.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash +set -euo pipefail + +BUNDLE=0 +VERSION_OVERRIDE="" +while (($#)); do + case "$1" in + --bundle) + BUNDLE=1 + ;; + --version) + VERSION_OVERRIDE="$2" + shift + ;; + *) + echo "Unknown option: $1" >&2 + exit 1 + ;; + esac + shift +done + +if [ ! -f .mac_env ]; then + echo ".mac_env not found. Run scripts/mac_setup.sh first." >&2 + exit 1 +fi + +source .mac_env + +if ! command -v python3 >/dev/null 2>&1; then + echo "python3 is required to build Rayforge on macOS." >&2 + exit 1 +fi + +VENV_PATH=${VENV_PATH:-.venv-mac} +if [ ! -d "$VENV_PATH" ]; then + python3 -m venv "$VENV_PATH" +fi + +source "$VENV_PATH/bin/activate" + +python -m pip install --upgrade pip +python -m pip install --upgrade build pyinstaller +python -m pip install -r requirements.txt + +bash scripts/update_translations.sh --compile-only + +VERSION=${VERSION_OVERRIDE:-$(git describe --tags --always 2>/dev/null || \ + echo "v0.0.0-local")} +echo "$VERSION" > rayforge/version.txt + +python -m build + +if (( BUNDLE == 1 )); then + pyinstaller --onedir --windowed \ + --log-level INFO \ + --name "Rayforge" \ + --osx-bundle-identifier "org.rayforge.rayforge" \ + --add-data "rayforge/version.txt:rayforge" \ + --add-data "rayforge/resources:rayforge/resources" \ + --add-data "rayforge/locale:rayforge/locale" \ + --hidden-import "gi._gi_cairo" \ + rayforge/app.py +fi + +echo "Build artifacts created in dist/ and dist/*.whl" diff --git a/scripts/mac_setup.sh b/scripts/mac_setup.sh new file mode 100755 index 00000000..113aeb22 --- /dev/null +++ b/scripts/mac_setup.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +set -euo pipefail + +INSTALL=0 +if [[ "${1:-}" == "--install" ]]; then + INSTALL=1 +fi + +if ! command -v brew >/dev/null 2>&1; then + echo "Homebrew is required to set up the macOS toolchain." >&2 + exit 1 +fi + +BREW_PREFIX=$(brew --prefix) +LIBFFI_PREFIX=$(brew --prefix libffi 2>/dev/null || true) +if [[ -z "$LIBFFI_PREFIX" ]]; then + LIBFFI_PREFIX="$BREW_PREFIX/opt/libffi" +fi + +DEPS=( + gtk4 + libadwaita + gobject-introspection + librsvg + libvips + openslide + pkg-config + meson + ninja + cairo + pango + harfbuzz +) + +MISSING=() +for dep in "${DEPS[@]}"; do + if ! brew list --versions "$dep" >/dev/null 2>&1; then + MISSING+=("$dep") + fi +done + +if (( ${#MISSING[@]} > 0 )); then + if (( INSTALL == 1 )); then + brew install "${MISSING[@]}" + else + echo "Missing Homebrew packages: ${MISSING[*]}" >&2 + echo "Re-run with --install to install them automatically." >&2 + exit 1 + fi +fi + +cat > .mac_env < Date: Sun, 23 Nov 2025 16:46:19 +0100 Subject: [PATCH 02/34] app icon --- website/content/assets/icon_app.svg | 858 ++++++++++++++++++++++++++++ 1 file changed, 858 insertions(+) create mode 100644 website/content/assets/icon_app.svg diff --git a/website/content/assets/icon_app.svg b/website/content/assets/icon_app.svg new file mode 100644 index 00000000..11c7644e --- /dev/null +++ b/website/content/assets/icon_app.svg @@ -0,0 +1,858 @@ + + + + From 42c6ab09bbc93cbfd46482a2e58ecec3f81e90e6 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Sun, 23 Nov 2025 16:47:21 +0100 Subject: [PATCH 03/34] importing and 2D view working --- Rayforge.spec | 14 +- hooks/hook-gi.repository.Gtk.py | 53 +++ rayforge/image/svg/importer.py | 553 ++++++++++++++++++++------- rayforge/image/svg/renderer.py | 3 + rayforge/pipeline/artifact/store.py | 4 +- rayforge/resources/icons/icon.icns | Bin 0 -> 465535 bytes rayforge/ui_gtk/canvas/element.py | 20 +- rayforge/ui_gtk/canvas3d/gl_utils.py | 3 + rayforge/version.txt | 2 +- scripts/mac_build.sh | 103 ++++- scripts/macos_create_icon.sh | 117 ++++++ 11 files changed, 714 insertions(+), 158 deletions(-) create mode 100644 hooks/hook-gi.repository.Gtk.py create mode 100644 rayforge/resources/icons/icon.icns create mode 100755 scripts/macos_create_icon.sh diff --git a/Rayforge.spec b/Rayforge.spec index 17656658..7a80a0d0 100644 --- a/Rayforge.spec +++ b/Rayforge.spec @@ -7,8 +7,15 @@ a = Analysis( binaries=[], datas=[('rayforge/version.txt', 'rayforge'), ('rayforge/resources', 'rayforge/resources'), ('rayforge/locale', 'rayforge/locale')], hiddenimports=['gi._gi_cairo'], - hookspath=[], - hooksconfig={}, + hookspath=['hooks'], + hooksconfig={ + 'gi': { + 'module-versions': { + 'Gtk': '4.0', + 'Adw': '1', + }, + }, + }, runtime_hooks=[], excludes=[], noarchive=False, @@ -32,6 +39,7 @@ exe = EXE( target_arch=None, codesign_identity=None, entitlements_file=None, + icon=['rayforge/resources/icons/icon.icns'], ) coll = COLLECT( exe, @@ -45,6 +53,6 @@ coll = COLLECT( app = BUNDLE( coll, name='Rayforge.app', - icon=None, + icon='rayforge/resources/icons/icon.icns', bundle_identifier='org.rayforge.rayforge', ) diff --git a/hooks/hook-gi.repository.Gtk.py b/hooks/hook-gi.repository.Gtk.py new file mode 100644 index 00000000..aa2965e7 --- /dev/null +++ b/hooks/hook-gi.repository.Gtk.py @@ -0,0 +1,53 @@ +#----------------------------------------------------------------------------- +# Custom hook for Gtk 4.0 (overrides PyInstaller's default Gtk 3.0 hook) +#----------------------------------------------------------------------------- + +import os +import os.path + +from PyInstaller.compat import is_win +from PyInstaller.utils.hooks import get_hook_config +from PyInstaller.utils.hooks.gi import GiModuleInfo, collect_glib_etc_files, collect_glib_share_files, \ + collect_glib_translations + + +def hook(hook_api): + # Use GTK 4.0 instead of the default 3.0 + module_info = GiModuleInfo('Gtk', '4.0', hook_api=hook_api) + if not module_info.available: + return + + binaries, datas, hiddenimports = module_info.collect_typelib_data() + + # Collect fontconfig data + datas += collect_glib_share_files('fontconfig') + + # Icons, themes, translations + icon_list = get_hook_config(hook_api, "gi", "icons") + if icon_list is not None: + for icon in icon_list: + datas += collect_glib_share_files(os.path.join('icons', icon)) + else: + datas += collect_glib_share_files('icons') + + # Themes + theme_list = get_hook_config(hook_api, "gi", "themes") + if theme_list is not None: + for theme in theme_list: + datas += collect_glib_share_files(os.path.join('themes', theme)) + else: + datas += collect_glib_share_files('themes') + + # Translations - use gtk40 for GTK 4.0 + lang_list = get_hook_config(hook_api, "gi", "languages") + datas += collect_glib_translations('gtk40', lang_list) + + # These only seem to be required on Windows + if is_win: + datas += collect_glib_etc_files('fonts') + datas += collect_glib_etc_files('pango') + datas += collect_glib_share_files('fonts') + + hook_api.add_datas(datas) + hook_api.add_binaries(binaries) + hook_api.add_imports(*hiddenimports) diff --git a/rayforge/image/svg/importer.py b/rayforge/image/svg/importer.py index 70a5b068..59b5f2be 100644 --- a/rayforge/image/svg/importer.py +++ b/rayforge/image/svg/importer.py @@ -1,170 +1,445 @@ -from typing import Optional +import io +import math +import logging +from typing import List, Optional, Tuple, Union +from xml.etree import ElementTree as ET + +from svgelements import ( + SVG, + Arc, + Close, + CubicBezier, + Line, + Move, + Path, + QuadraticBezier, +) + +from ...core.geo import Geometry +from ...core.source_asset_segment import SourceAssetSegment +from ...core.item import DocItem +from ...core.matrix import Matrix from ...core.source_asset import SourceAsset from ...core.vectorization_spec import ( - VectorizationSpec, - TraceSpec, PassthroughSpec, + TraceSpec, + VectorizationSpec, ) -from ..base_importer import ( - Importer, - ImporterFeature, -) -from ..structures import ( - ParsingResult, - VectorizationResult, - ImportResult, - ImportManifest, -) -from .svg_trace import SvgTraceImporter -from .svg_vector import SvgVectorImporter - - -import logging +from ...core.workpiece import WorkPiece +from ..base_importer import Importer, ImportPayload +from .. import image_util +from ..tracing import trace_surface, VTRACER_PIXEL_LIMIT +from .renderer import SVG_RENDERER +from .svgutil import PPI, get_natural_size, trim_svg logger = logging.getLogger(__name__) class SvgImporter(Importer): - """ - A Facade importer for SVG files. - - It routes the import request to either the Vector strategy (for path - extraction) or the Trace strategy (for rendering and tracing bitmaps), - depending on the provided VectorizationSpec. - """ - label = "SVG files" mime_types = ("image/svg+xml",) extensions = (".svg",) - features = { - ImporterFeature.DIRECT_VECTOR, - ImporterFeature.BITMAP_TRACING, - ImporterFeature.LAYER_SELECTION, - } - - def scan(self) -> ImportManifest: - # Use Vector importer for scanning as it's lightweight/standard - return SvgVectorImporter(self.raw_data, self.source_file).scan() def get_doc_items( - self, vectorization_spec: Optional[VectorizationSpec] = None - ) -> Optional[ImportResult]: + self, vectorization_spec: Optional["VectorizationSpec"] = None + ) -> Optional[ImportPayload]: """ - Delegates the full import process to the appropriate strategy. + Generates DocItems from SVG data. + + If a TraceSpec is provided, it renders the SVG to a bitmap and + traces it. This is robust but may lose fidelity. + + Otherwise, it attempts to parse the SVG path and shape data + directly for a high-fidelity vector import. """ - spec_to_use = vectorization_spec - # If no spec is provided, default to the vector strategy. - if spec_to_use is None: - spec_to_use = PassthroughSpec() - - if isinstance(spec_to_use, TraceSpec): - logger.debug("SvgImporter: Delegating to SvgTraceImporter.") - delegate = SvgTraceImporter(self.raw_data, self.source_file) + source = SourceAsset( + source_file=self.source_file, + original_data=self.raw_data, + renderer=SVG_RENDERER, + ) + + if isinstance(vectorization_spec, TraceSpec): + # Path 1: Render to bitmap and trace + items = self._get_doc_items_from_trace(source, vectorization_spec) else: - # This is the direct vector import path. - # If no layers are specified (e.g. from CLI), assume the user wants - # all layers imported into the current document layer. - if ( - isinstance(spec_to_use, PassthroughSpec) - and not spec_to_use.active_layer_ids - ): - logger.debug( - "Empty PassthroughSpec detected in facade. " - "Scanning for all available layers." + # Path 2: Direct vector parsing with pre-trimming + trimmed_data = trim_svg(self.raw_data) + source.base_render_data = trimmed_data + self._populate_metadata(source) + items = self._get_doc_items_direct(source) + + # If direct import failed, fall back to tracing to ensure + # the user at least sees something. + if not items: + logger.warning( + "Direct SVG import produced no items; falling back to " + "traced import." ) - manifest = self.scan() - all_layer_ids = [layer.id for layer in manifest.layers] - if all_layer_ids: - logger.debug( - f"Populating spec with all layers: {all_layer_ids}" - ) - # Create a new spec object that matches the UI's default. - # This ensures the "merge" strategy is used in the engine. - spec_to_use = PassthroughSpec( - active_layer_ids=all_layer_ids, - create_new_layers=False, - ) - - logger.debug("SvgImporter: Delegating to SvgVectorImporter.") - delegate = SvgVectorImporter(self.raw_data, self.source_file) - - import_result = delegate.get_doc_items(spec_to_use) - - # --- DIAGNOSTIC LOGGING --- - if ( - import_result - and import_result.payload - and import_result.payload.items - ): - from ...core.workpiece import WorkPiece - from ...core.layer import Layer - - def count_workpieces(items): - count = 0 - for item in items: - if isinstance(item, WorkPiece): - count += 1 - elif isinstance(item, Layer): - count += count_workpieces(item.children) - return count - - def check_for_geometry(items): - for item in items: - if isinstance(item, WorkPiece): - if ( - item.source_segment - and item.source_segment.pristine_geometry - ): - return True - elif isinstance(item, Layer): - if check_for_geometry(item.children): - return True - return False - - item_count = len(import_result.payload.items) - wp_count = count_workpieces(import_result.payload.items) - - has_geo_in_segment = check_for_geometry( - import_result.payload.items + items = self._get_doc_items_from_trace(source, TraceSpec()) + + if not items: + return None + + return ImportPayload(source=source, items=items) + + def _populate_metadata(self, source: SourceAsset): + """Calculates and stores metadata for direct SVG import.""" + metadata = {} + try: + # Get size of original, untrimmed SVG + untrimmed_size = get_natural_size(source.original_data) + if untrimmed_size: + source.width_mm = untrimmed_size[0] + source.height_mm = untrimmed_size[1] + metadata["untrimmed_width_mm"] = untrimmed_size[0] + metadata["untrimmed_height_mm"] = untrimmed_size[1] + + # Get size of the new, trimmed SVG + if source.base_render_data: + trimmed_size = get_natural_size(source.base_render_data) + if trimmed_size: + metadata["trimmed_width_mm"] = trimmed_size[0] + metadata["trimmed_height_mm"] = trimmed_size[1] + + # Get viewBox from trimmed SVG for direct import + root = ET.fromstring(source.base_render_data) + vb_str = root.get("viewBox") + if vb_str: + metadata["viewbox"] = tuple(map(float, vb_str.split())) + + source.metadata.update(metadata) + except Exception as e: + logger.warning(f"Could not calculate SVG metadata: {e}") + + def _get_doc_items_from_trace( + self, source: SourceAsset, vectorization_spec: TraceSpec + ) -> Optional[List[DocItem]]: + """ + Renders the original SVG data to a bitmap, traces it, and creates a + single masked WorkPiece. + """ + size_mm = get_natural_size(source.original_data) + if not size_mm or not size_mm[0] or not size_mm[1]: + logger.warning("Cannot trace SVG: failed to determine size.") + return None + + # Populate intrinsic dimensions + source.width_mm, source.height_mm = size_mm + + # Calculate render dimensions that preserve the original aspect ratio, + # maximizing the render resolution for better tracing quality. + w_mm, h_mm = size_mm + aspect = w_mm / h_mm if h_mm > 0 else 1.0 + TARGET_DIM = math.sqrt(VTRACER_PIXEL_LIMIT) + + if aspect >= 1.0: # Landscape or square + w_px = int(TARGET_DIM) + h_px = int(TARGET_DIM / aspect) + else: # Portrait + h_px = int(TARGET_DIM) + w_px = int(TARGET_DIM * aspect) + w_px, h_px = max(1, w_px), max(1, h_px) + + vips_image = SVG_RENDERER.render_base_image( + source.original_data, width=w_px, height=h_px + ) + if not vips_image: + logger.error("Failed to render SVG to vips image for tracing.") + return None + + # Manually set the resolution metadata on the rendered image. This is + # crucial for create_single_workpiece_from_trace to calculate the + # correct physical size of the cropped area. + if w_mm > 0 and h_mm > 0: + xres = w_px / w_mm # pixels per mm + yres = h_px / h_mm # pixels per mm + vips_image = vips_image.copy(xres=xres, yres=yres) + + normalized_vips = image_util.normalize_to_rgba(vips_image) + if not normalized_vips: + return None + surface = image_util.vips_rgba_to_cairo_surface(normalized_vips) + + geometries = trace_surface(surface, vectorization_spec) + + # Use the standard helper for creating a single, masked workpiece + return image_util.create_single_workpiece_from_trace( + geometries, + source, + vips_image, + vectorization_spec, + self.source_file.stem, + ) + + def _get_doc_items_direct(self, source: SourceAsset) -> Optional[List[DocItem]]: + """ + Orchestrates the direct parsing of SVG data into DocItems. + """ + if not source.base_render_data: + logger.error("source has no data to process for direct import") + return None + + # 1. Establish authoritative dimensions in millimeters. + final_dims_mm = self._get_final_dimensions(source) + if not final_dims_mm: + msg = ( + "SVG is missing width or height attributes; " + "falling back to trace method for direct import." ) + logger.warning(msg) + return self._get_doc_items_from_trace(source, TraceSpec()) + final_width_mm, final_height_mm = final_dims_mm + + # 2. Parse SVG data into an object model. + svg = self._parse_svg_data(source) + if svg is None: + return None - item_info = ( - f"{item_count} total items ({wp_count} WorkPieces). " - f"Pristine geometry in segment: {has_geo_in_segment}" + # 3. Convert SVG shapes to internal geometry (in pixel coordinates). + geo = self._convert_svg_to_geometry(svg, final_dims_mm) + + # 4. Get pixel dimensions for normalization. + pixel_dims = self._get_pixel_dimensions(svg) + if not pixel_dims: + msg = ( + "Could not determine valid pixel dimensions from SVG; " + "falling back to trace method." ) - elif import_result: - item_info = "0 items." - else: - item_info = "None (import failed)." + logger.warning(msg) + return self._get_doc_items_from_trace(source, TraceSpec()) + width_px, height_px = pixel_dims + + # 5. Normalize geometry into physical millimeter space so it renders + # with the expected size in the canvas. + self._normalize_geometry( + geo, + width_px, + height_px, + final_width_mm, + final_height_mm, + ) + + # 6. Create the final workpiece. + wp = self._create_workpiece( + geo, source, final_width_mm, final_height_mm + ) + return [wp] + + def _get_final_dimensions( + self, source: SourceAsset + ) -> Optional[Tuple[float, float]]: + """ + Extracts the final width and height in millimeters from source + metadata. + """ + width = source.metadata.get("trimmed_width_mm") + height = source.metadata.get("trimmed_height_mm") + if width and height: + return width, height + return None - logger.debug(f"SvgImporter delegate returned result with: {item_info}") - # --- END DIAGNOSTIC --- + def _parse_svg_data(self, source: SourceAsset) -> Optional[SVG]: + """Parses SVG byte data into an svgelements.SVG object.""" + if not source.base_render_data: + logger.error("Source has no working_data to parse.") + return None + try: + svg_stream = io.BytesIO(source.base_render_data) + return SVG.parse(svg_stream, ppi=PPI) + except Exception as e: + logger.error(f"Failed to parse SVG for direct import: {e}") + return None - # If we have a result, ensure the facade's errors (if any were - # collected before delegation) are merged, though usually facade - # does little before delegation. - if import_result: - import_result.warnings.extend(self._warnings) - import_result.errors.extend(self._errors) + def _get_pixel_dimensions(self, svg: SVG) -> Optional[Tuple[float, float]]: + """ + Extracts the pixel width and height from a parsed SVG object. + """ + if svg.width is None or svg.height is None: + return None - return import_result + width_px = svg.width.px if hasattr(svg.width, "px") else float(svg.width) + height_px = svg.height.px if hasattr(svg.height, "px") else float(svg.height) - # These abstract methods must be implemented to satisfy the ABC contract, - # but get_doc_items bypasses them in this facade. + if width_px <= 1e-9 or height_px <= 1e-9: + return None - def parse(self) -> Optional[ParsingResult]: - raise NotImplementedError( - "SvgImporter is a facade; parse is delegated via get_doc_items" + msg = ( + "Normalizing vectors using final pixel dimensions from " + "svgelements: {width_px:.3f}px x {height_px:.3f}px" ) + logger.debug(msg) + return width_px, height_px + + def _convert_svg_to_geometry( + self, svg: SVG, final_dims_mm: Tuple[float, float] + ) -> Geometry: + """ + Converts an SVG object into a Geometry object in pixel coordinates. + """ + geo = Geometry() + final_width_mm, final_height_mm = final_dims_mm + + # Calculate tolerance for curve flattening. + avg_dim = max(final_width_mm, final_height_mm, 1.0) + avg_scale = avg_dim / 960 # Assuming typical viewBox size + tolerance = 0.1 / avg_scale if avg_scale > 1e-9 else 0.1 + + for shape in svg.elements(): + try: + path = Path(shape) + path.reify() # Apply transforms + self._add_path_to_geometry(path, geo, tolerance) + except (AttributeError, TypeError): + continue # Skip non-shape elements like + return geo + + def _add_path_to_geometry( + self, path: Path, geo: Geometry, tolerance: float + ) -> None: + """Converts a single Path object's segments to Geometry commands.""" + for seg in path: + # Use a local variable to help strict type checkers. + end = seg.end + if end is None or end.x is None or end.y is None: + continue + + if isinstance(seg, Move): + geo.move_to(float(end.x), float(end.y)) + elif isinstance(seg, Line): + geo.line_to(float(end.x), float(end.y)) + elif isinstance(seg, Close): + geo.close_path() + elif isinstance(seg, Arc): + self._add_arc_to_geometry(seg, geo) + elif isinstance(seg, (CubicBezier, QuadraticBezier)): + self._flatten_bezier_to_geometry(seg, geo, tolerance) + + def _add_arc_to_geometry(self, seg: Arc, geo: Geometry) -> None: + """Adds an Arc segment to the Geometry.""" + # Local variables help type checkers confirm non-None status. + start = seg.start + center = seg.center + end = seg.end - def vectorize( - self, parse_result: ParsingResult, spec: VectorizationSpec - ) -> VectorizationResult: - raise NotImplementedError( - "SvgImporter is a facade; vectorize is delegated via get_doc_items" + if ( + start is None + or start.x is None + or start.y is None + or center is None + or center.x is None + or center.y is None + or end is None + or end.x is None + or end.y is None + ): + return + + start_x, start_y = float(start.x), float(start.y) + center_x, center_y = float(center.x), float(center.y) + + center_offset_x = center_x - start_x + center_offset_y = center_y - start_y + # Per SVG spec, sweep-flag=1 is positive-angle (clockwise). + # svgelements preserves this as sweep=1 and correctly flips it on + # transforms with negative determinants. + is_clockwise = bool(seg.sweep) + geo.arc_to( + float(end.x), + float(end.y), + center_offset_x, + center_offset_y, + clockwise=is_clockwise, ) - def create_source_asset(self, parse_result: ParsingResult) -> SourceAsset: - raise NotImplementedError( - "SvgImporter is a facade; create_source_asset is delegated" + def _flatten_bezier_to_geometry( + self, + seg: Union[CubicBezier, QuadraticBezier], + geo: Geometry, + tolerance: float, + ) -> None: + """Flattens a Bezier curve into a series of lines in the Geometry.""" + # Use a local variable to help Pylance avoid 'Unbound' issues. + end = seg.end + + if end is None: + return + if end.x is None or end.y is None: + return + + length = seg.length() + end_x, end_y = float(end.x), float(end.y) + + # If the curve is very short, treat it as a straight line. + if length is None or length <= 1e-9: + geo.line_to(end_x, end_y) + return + + num_steps = max(2, int(length / tolerance)) + + for i in range(1, num_steps + 1): + t = i / num_steps + p = seg.point(t) + if p is not None and p.x is not None and p.y is not None: + geo.line_to(float(p.x), float(p.y)) + + def _normalize_geometry( + self, + geo: Geometry, + width_px: float, + height_px: float, + width_mm: float, + height_mm: float, + ) -> None: + """ + Scales geometry into a normalized, Y-down coordinate system. + + The geometry is first converted from pixel to millimeter space and + then normalized into a 0-1 box so that downstream consumers can apply + physical sizing via the workpiece transform without double-scaling. + """ + if ( + width_px <= 0 + or height_px <= 0 + or width_mm <= 0 + or height_mm <= 0 + ): + return + + scale_x = width_mm / width_px + scale_y = height_mm / height_px + geo.transform(Matrix.scale(scale_x, scale_y).to_4x4_numpy()) + + min_x, min_y, max_x, max_y = geo.rect() + content_w = max_x - min_x + content_h = max_y - min_y + if content_w <= 1e-9 or content_h <= 1e-9: + return + + geo.transform(Matrix.translation(-min_x, -min_y).to_4x4_numpy()) + geo.transform( + Matrix.scale(1.0 / width_mm, 1.0 / height_mm).to_4x4_numpy() + ) + + def _create_workpiece( + self, + geo: Geometry, + source: SourceAsset, + width_mm: float, + height_mm: float, + ) -> WorkPiece: + """Creates and configures the final WorkPiece.""" + gen_config = SourceAssetSegment( + source_asset_uid=source.uid, + segment_mask_geometry=geo, + vectorization_spec=PassthroughSpec(), + ) + wp = WorkPiece( + name=self.source_file.stem, + source_segment=gen_config, ) + wp.natural_width_mm = width_mm + wp.natural_height_mm = height_mm + wp.set_size(width_mm, height_mm) + wp.pos = (0, 0) + logger.info(f"Workpiece set size: {width_mm:.3f}mm x {height_mm:.3f}mm") + return wp diff --git a/rayforge/image/svg/renderer.py b/rayforge/image/svg/renderer.py index bc84e7c4..fe1fd120 100644 --- a/rayforge/image/svg/renderer.py +++ b/rayforge/image/svg/renderer.py @@ -1,3 +1,4 @@ +import logging import warnings import logging from typing import Optional, TYPE_CHECKING, List, Tuple @@ -7,6 +8,8 @@ from ...core.vectorization_spec import TraceSpec +logger = logging.getLogger(__name__) + with warnings.catch_warnings(): warnings.simplefilter("ignore", DeprecationWarning) import pyvips diff --git a/rayforge/pipeline/artifact/store.py b/rayforge/pipeline/artifact/store.py index 888a30b9..d85e403e 100644 --- a/rayforge/pipeline/artifact/store.py +++ b/rayforge/pipeline/artifact/store.py @@ -83,7 +83,9 @@ def put( total_bytes = sum(arr.nbytes for arr in arrays.values()) # Create the shared memory block - shm_name = f"rayforge_artifact_{creator_tag}_{uuid.uuid4()}" + # macOS has a 31-character limit for shared memory names + short_uuid = str(uuid.uuid4())[:8] + shm_name = f"rf_{short_uuid}" try: # Prevent creating a zero-size block, which raises a ValueError. # A 1-byte block is a safe, minimal placeholder. diff --git a/rayforge/resources/icons/icon.icns b/rayforge/resources/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..c65a2588c190d160a3c3203548eb52483d92a555 GIT binary patch literal 465535 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 z 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�q3Nb)F0G`$0;%diLWuUcF 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�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

F>s{>$91&!~_Yf97 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 bool: self._update_future.cancel() if not self.canvas: + logger.debug(f"{self.__class__.__name__}: No canvas, skipping update") return False # Calculate the total transformation from this element's local space @@ -386,17 +387,24 @@ def _start_update(self) -> bool: render_width = round(self.width * scale_x) render_height = round(self.height * scale_y) + logger.debug( + f"{self.__class__.__name__}: Calculated render size: {render_width}x{render_height} " + f"(element size: {self.width}x{self.height}, scale: {scale_x:.2f}x{scale_y:.2f})" + ) + # Clamp the render dimensions to the maximum allowed size render_width = min(render_width, MAX_BUFFER_DIM) render_height = min(render_height, MAX_BUFFER_DIM) if render_width <= 0 or render_height <= 0: # Don't try to render to a zero or negative size surface. + logger.debug(f"{self.__class__.__name__}: Render size is zero or negative, clearing surface") self.surface = None # Ensure any old surface is cleared if self.canvas: self.canvas.queue_draw() return False + logger.debug(f"{self.__class__.__name__}: Submitting render_to_surface task ({render_width}x{render_height})") # Submit the thread-safe part to the executor with correct pixel dims. self._update_future = self._executor.submit( self.render_to_surface, render_width, render_height @@ -957,12 +965,14 @@ def draw(self, ctx: cairo.Context): source_h = self.surface.get_height() if source_w > 0 and source_h > 0: - # Draw the buffered surface. We need to scale it to fit the - # element's width and height. + # Draw the buffered surface. The surface was rendered at screen + # resolution (pixels), but the Cairo context is in element space + # (where element dimensions are self.width x self.height). + # We need to scale from pixel space back to element space. ctx.save() - scale_x = self.width / source_w - scale_y = self.height / source_h - ctx.scale(scale_x, scale_y) + scale_x = source_w / self.width + scale_y = source_h / self.height + ctx.scale(1.0 / scale_x, 1.0 / scale_y) ctx.set_source_surface(self.surface, 0, 0) ctx.get_source().set_filter(cairo.FILTER_GOOD) ctx.paint() diff --git a/rayforge/ui_gtk/canvas3d/gl_utils.py b/rayforge/ui_gtk/canvas3d/gl_utils.py index c4a7b9cf..f5ad6ba6 100644 --- a/rayforge/ui_gtk/canvas3d/gl_utils.py +++ b/rayforge/ui_gtk/canvas3d/gl_utils.py @@ -43,9 +43,12 @@ def __init__(self, vertex_source: str, fragment_source: str): fragment_source = frag_header + fragment_source try: + # Disable validation on macOS to avoid "invalid framebuffer" errors + # during initialization when no framebuffer is bound yet self.program = shaders.compileProgram( shaders.compileShader(vertex_source, GL.GL_VERTEX_SHADER), shaders.compileShader(fragment_source, GL.GL_FRAGMENT_SHADER), + validate=False, ) except Exception as e: logger.error(f"Shader Compilation Failed: {e}", exc_info=True) diff --git a/rayforge/version.txt b/rayforge/version.txt index e4f84429..2069bdbe 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -0.24-31-gc930829 +0.24-32-gfbceef7 diff --git a/scripts/mac_build.sh b/scripts/mac_build.sh index b50bbd2c..69ab3492 100755 --- a/scripts/mac_build.sh +++ b/scripts/mac_build.sh @@ -52,15 +52,100 @@ echo "$VERSION" > rayforge/version.txt python -m build if (( BUNDLE == 1 )); then - pyinstaller --onedir --windowed \ - --log-level INFO \ - --name "Rayforge" \ - --osx-bundle-identifier "org.rayforge.rayforge" \ - --add-data "rayforge/version.txt:rayforge" \ - --add-data "rayforge/resources:rayforge/resources" \ - --add-data "rayforge/locale:rayforge/locale" \ - --hidden-import "gi._gi_cairo" \ - rayforge/app.py + # Generate macOS icon if it doesn't exist or if SVG is newer + if [ ! -f "rayforge/resources/icons/icon.icns" ] || \ + [ "website/content/assets/icon.svg" -nt "rayforge/resources/icons/icon.icns" ]; then + echo "Generating macOS icon..." + bash scripts/macos_create_icon.sh + else + echo "Icon is up to date, skipping generation." + fi + + pyinstaller --clean Rayforge.spec + + APP_ROOT="dist/Rayforge.app/Contents" + FW_DIR="$APP_ROOT/Frameworks" + BIN_DIR="$APP_ROOT/MacOS" + + chmod -R u+w "dist/Rayforge.app" || true + + # Remove conflicting libiconv bundled by cv2. + rm -f "$FW_DIR/libiconv.2.dylib" + + # Ship critical libs from Homebrew and fix their IDs. + for lib in \ + libpng16.16.dylib \ + libfontconfig.1.dylib \ + libfreetype.6.dylib \ + libintl.8.dylib \ + libvips.42.dylib \ + libvips-cpp.42.dylib + do + if [ -f "/usr/local/lib/$lib" ]; then + rm -f "$FW_DIR/$lib" + cp "/usr/local/lib/$lib" "$FW_DIR/" + install_name_tool -id "@rpath/$lib" "$FW_DIR/$lib" + fi + done + + # Fix all library references to use @rpath instead of absolute paths + echo "Fixing library references..." + for dylib in "$FW_DIR"/*.dylib; do + [ -f "$dylib" ] || continue + # Get all dependencies + otool -L "$dylib" | grep '/usr/local/' | awk '{print $1}' | while read dep; do + libname=$(basename "$dep") + # Only rewrite if we've bundled this library + if [ -f "$FW_DIR/$libname" ]; then + install_name_tool -change "$dep" "@rpath/$libname" "$dylib" 2>/dev/null || true + fi + done + done + + # Refresh cv2 dylib symlinks to the parent copies. + if [ -d "$FW_DIR/cv2/__dot__dylibs" ]; then + pushd "$FW_DIR/cv2/__dot__dylibs" >/dev/null + for lib in libpng16.16.dylib libfontconfig.1.dylib \ + libfreetype.6.dylib libintl.8.dylib + do + ln -sf ../"$lib" "$lib" + done + popd >/dev/null + fi + + # Note: GTK4 typelibs are automatically bundled by PyInstaller to Resources/gi_typelibs + + # TODO: Bundle vips modules and gdk-pixbuf loaders when vips is installed with SVG support + # if [ -d "/usr/local/lib/vips-modules-8.17" ]; then + # cp -r "/usr/local/lib/vips-modules-8.17" "$FW_DIR/" || true + # fi + # if [ -d "/usr/local/lib/gdk-pixbuf-2.0" ]; then + # cp -r "/usr/local/lib/gdk-pixbuf-2.0" "$FW_DIR/" || true + # fi + + # Replace the launcher with a wrapper that sets env vars, + # keeping the Mach-O as Rayforge.bin. + if [ -f "$BIN_DIR/Rayforge" ]; then + mv "$BIN_DIR/Rayforge" "$BIN_DIR/Rayforge.bin" + fi + cat > "$BIN_DIR/Rayforge" <<'SH' +#!/bin/bash +APP_DIR="$(cd "$(dirname "$0")/.." && pwd)" +export DYLD_LIBRARY_PATH="$APP_DIR/Frameworks" +export DYLD_FALLBACK_LIBRARY_PATH="$APP_DIR/Frameworks" +export GI_TYPELIB_PATH="$APP_DIR/Resources/gi_typelibs" +export GIO_EXTRA_MODULES="$APP_DIR/Frameworks/gio_modules" +exec "$APP_DIR/MacOS/Rayforge.bin" "$@" +SH + chmod +x "$BIN_DIR/Rayforge" + + # Ensure rpath points to the bundled Frameworks. + install_name_tool -add_rpath @executable_path/../Frameworks \ + "$BIN_DIR/Rayforge.bin" 2>/dev/null || true + + # Make sure the plist still points to the wrapper. + /usr/libexec/PlistBuddy -c "Set :CFBundleExecutable Rayforge" \ + "$APP_ROOT/Info.plist" 2>/dev/null || true fi echo "Build artifacts created in dist/ and dist/*.whl" diff --git a/scripts/macos_create_icon.sh b/scripts/macos_create_icon.sh new file mode 100755 index 00000000..28fa071e --- /dev/null +++ b/scripts/macos_create_icon.sh @@ -0,0 +1,117 @@ +#!/bin/bash +# Script to generate macOS ICNS icon from SVG source +# Uses only native macOS tools: rsvg-convert and iconutil +# +# Requirements: +# - rsvg-convert: brew install librsvg +# - iconutil: built-in on macOS + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Get script directory and project root +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + +# Paths +SVG_PATH="$PROJECT_ROOT/website/content/assets/icon_app.svg" +ICONSET_PATH="$PROJECT_ROOT/build/icon.iconset" +OUTPUT_PATH="$PROJECT_ROOT/rayforge/resources/icons/icon.icns" + +# Check if SVG exists +if [ ! -f "$SVG_PATH" ]; then + echo -e "${RED}Error: SVG file not found at $SVG_PATH${NC}" + exit 1 +fi + +# Check if rsvg-convert is installed +if ! command -v rsvg-convert &> /dev/null; then + echo -e "${RED}Error: rsvg-convert not found${NC}" + echo "Install with: brew install librsvg" + exit 1 +fi + +# Check if iconutil is available (should be on all macOS systems) +if ! command -v iconutil &> /dev/null; then + echo -e "${RED}Error: iconutil not found. This script requires macOS.${NC}" + exit 1 +fi + +echo -e "${GREEN}Source SVG:${NC} $SVG_PATH" +echo -e "${GREEN}Output ICNS:${NC} $OUTPUT_PATH" +echo "" + +# Create build directory +mkdir -p "$(dirname "$OUTPUT_PATH")" + +# Remove existing iconset if it exists +if [ -d "$ICONSET_PATH" ]; then + echo -e "${YELLOW}Removing existing iconset...${NC}" + rm -rf "$ICONSET_PATH" +fi + +# Create iconset directory +echo -e "${GREEN}Creating iconset directory...${NC}" +mkdir -p "$ICONSET_PATH" + +# Function to generate PNG at specific size +generate_png() { + local size=$1 + local scale=$2 + local pixel_size=$((size * scale)) + + if [ $scale -eq 1 ]; then + local filename="icon_${size}x${size}.png" + else + local filename="icon_${size}x${size}@${scale}x.png" + fi + + local output_file="$ICONSET_PATH/$filename" + + echo " Generating ${pixel_size}x${pixel_size} → $filename" + rsvg-convert -w $pixel_size -h $pixel_size "$SVG_PATH" -o "$output_file" +} + +# Generate all required sizes for macOS ICNS +# Format: size scale +echo -e "\n${GREEN}Generating PNG files...${NC}" + +# 16x16 +generate_png 16 1 +generate_png 16 2 + +# 32x32 +generate_png 32 1 +generate_png 32 2 + +# 128x128 +generate_png 128 1 +generate_png 128 2 + +# 256x256 +generate_png 256 1 +generate_png 256 2 + +# 512x512 +generate_png 512 1 +generate_png 512 2 + +# 1024x1024 (only @2x for 512pt displays) +echo " Generating 1024x1024 → icon_512x512@2x.png" +rsvg-convert -w 1024 -h 1024 "$SVG_PATH" -o "$ICONSET_PATH/icon_512x512@2x.png" + +# Generate ICNS file using iconutil +echo -e "\n${GREEN}Generating ICNS file...${NC}" +iconutil -c icns -o "$OUTPUT_PATH" "$ICONSET_PATH" + +# Clean up iconset directory +echo -e "\n${GREEN}Cleaning up temporary files...${NC}" +rm -rf "$ICONSET_PATH" + +echo -e "\n${GREEN}✓ Done!${NC} ICNS file created at: ${YELLOW}$OUTPUT_PATH${NC}" +echo -e "File size: $(du -h "$OUTPUT_PATH" | cut -f1)" From 2b30075ef2efa1cfd9ce6efc75b911f9205933c4 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Wed, 3 Dec 2025 16:43:45 +0100 Subject: [PATCH 04/34] update macos script --- scripts/mac_build.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/mac_build.sh b/scripts/mac_build.sh index 69ab3492..4a0a9d14 100755 --- a/scripts/mac_build.sh +++ b/scripts/mac_build.sh @@ -61,7 +61,7 @@ if (( BUNDLE == 1 )); then echo "Icon is up to date, skipping generation." fi - pyinstaller --clean Rayforge.spec + pyinstaller --clean --noconfirm Rayforge.spec APP_ROOT="dist/Rayforge.app/Contents" FW_DIR="$APP_ROOT/Frameworks" @@ -149,3 +149,5 @@ SH fi echo "Build artifacts created in dist/ and dist/*.whl" + +deactivate From 3349212078d23efd8ac594811db178f41d0c4603 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Wed, 3 Dec 2025 16:44:04 +0100 Subject: [PATCH 05/34] Use CairoSVG fallback for SVG rendering on macOS --- .mac_env | 3 +- Rayforge.spec | 2 +- pixi.toml | 1 + rayforge/core/workpiece.py | 39 +++++++++++- rayforge/image/svg/renderer.py | 45 ++++++++++--- rayforge/pipeline/encoder/vertexencoder.py | 7 ++ rayforge/ui_gtk/canvas3d/canvas3d.py | 74 ++++++++++++++++++++++ rayforge/version.txt | 2 +- requirements.txt | 1 + scripts/mac_build.sh | 16 ++++- 10 files changed, 175 insertions(+), 15 deletions(-) diff --git a/.mac_env b/.mac_env index 3c2ea1f6..49535de5 100644 --- a/.mac_env +++ b/.mac_env @@ -1,6 +1,7 @@ export BREW_PREFIX="/usr/local" export LIBFFI_PREFIX="/usr/local/opt/libffi" -export PATH="/usr/local/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/Cellar/ffmpeg/4.3.1_2/bin:/usr/local/bin/python3:/usr/local/Cellar/python@3.11/3.11.2_1/bin/python3:/opt/X11/bin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/var/folders/qy/j2t2sz113nl3p_l7kc22ybb80000gn/T/.tmpr0xjAy:/usr/local/opt/node@20/bin:/opt/local/ffmpeg42/lib/pkgconfig:/Applications/Inkscape.app/Contents/MacOS:/opt/local/bin:/opt/local/sbin:/usr/local/opt/coreutils/libexec/gnubin:/usr/local/Cellar/python@3.11/3.11.2_1/Frameworks/Python.framework/Versions/3.11/Python:/usr/local/bin/python:/usr/local/opt/openexr@2/bin:/usr/local/sbin:/Users/pablo/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/Users/pablo/.vscode/extensions/openai.chatgpt-0.4.46-darwin-x64/bin/macos-x86_64" +export VENV_PATH="$PWD/.venv-mac" +export PATH="$VENV_PATH/bin:/usr/local/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/Cellar/ffmpeg/4.3.1_2/bin:/usr/local/bin/python3:/usr/local/Cellar/python@3.11/3.11.2_1/bin/python3:/opt/X11/bin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/var/folders/qy/j2t2sz113nl3p_l7kc22ybb80000gn/T/.tmpr0xjAy:/usr/local/opt/node@20/bin:/opt/local/ffmpeg42/lib/pkgconfig:/Applications/Inkscape.app/Contents/MacOS:/opt/local/bin:/opt/local/sbin:/usr/local/opt/coreutils/libexec/gnubin:/usr/local/Cellar/python@3.11/3.11.2_1/Frameworks/Python.framework/Versions/3.11/Python:/usr/local/bin/python:/usr/local/opt/openexr@2/bin:/usr/local/sbin:/Users/pablo/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/Users/pablo/.vscode/extensions/openai.chatgpt-0.4.46-darwin-x64/bin/macos-x86_64" export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/local/opt/libffi/lib/pkgconfig:/opt/local/lib/pkgconfig:/opt/local/ffmpeg42/lib/pkgconfig:/Applications/Inkscape.app/Contents/MacOS:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/usr/local/opt/coreutils/libexec/gnubin:/usr/local/Cellar/python@3.11/3.11.2_1/Frameworks/Python.framework/Versions/3.11/Python:/usr/local/bin/python3:/usr/local/bin/python:/usr/local/opt/openexr@2/bin:/usr/local/sbin:/usr/local/bin:/Users/pablo/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/Cellar/ffmpeg/4.3.1_2/bin:/usr/local/bin/python3:/usr/local/Cellar/python@3.11/3.11.2_1/bin/python3:/opt/X11/bin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands" export GI_TYPELIB_PATH="/usr/local/lib/girepository-1.0:" export DYLD_FALLBACK_LIBRARY_PATH="/usr/local/lib:" diff --git a/Rayforge.spec b/Rayforge.spec index 7a80a0d0..901f3515 100644 --- a/Rayforge.spec +++ b/Rayforge.spec @@ -6,7 +6,7 @@ a = Analysis( pathex=[], binaries=[], datas=[('rayforge/version.txt', 'rayforge'), ('rayforge/resources', 'rayforge/resources'), ('rayforge/locale', 'rayforge/locale')], - hiddenimports=['gi._gi_cairo'], + hiddenimports=['gi._gi_cairo', 'cairosvg'], hookspath=['hooks'], hooksconfig={ 'gi': { diff --git a/pixi.toml b/pixi.toml index ebc0e67f..34fd32d6 100644 --- a/pixi.toml +++ b/pixi.toml @@ -41,6 +41,7 @@ build = "*" ezdxf = "==1.3.5" GitPython = "==3.1.44" platformdirs = "==4.3.6" +cairosvg = "==2.8.2" pluggy = "==1.6.0" pyclipper = "==1.3.0.post6" pypdf = "==6.6.2" diff --git a/rayforge/core/workpiece.py b/rayforge/core/workpiece.py index 237a1968..cf2df84e 100644 --- a/rayforge/core/workpiece.py +++ b/rayforge/core/workpiece.py @@ -683,7 +683,20 @@ def _process_rendered_image_from_spec( return None # 2. Apply Mask - if spec.apply_mask: + # We skip masking for vector sources because they already render with + # correct transparency, and masking with vector geometry (which can + # be open lines with zero area) would incorrectly hide the content. + is_vector = False + if self.source and self.source.metadata.get("is_vector"): + is_vector = True + + # Special check for Sketch rendering: if we rendered via sketch def, + # it is vector data. + if self.sketch_uid: + is_vector = True + + if spec.apply_mask and not is_vector: + pre_mask_image = processed_image mask_geo = self._boundaries_y_down if mask_geo and not mask_geo.is_empty(): processed_image = image_util.apply_mask_to_vips_image( @@ -692,6 +705,19 @@ def _process_rendered_image_from_spec( if not processed_image: return None + # If masking wiped everything out (e.g., coordinate mismatch), + # fall back to the unmasked image for preview purposes. + try: + alpha = processed_image[3] + if alpha.max() <= 0: + logger.debug( + "Mask produced empty alpha; using unmasked image " + "for preview." + ) + processed_image = pre_mask_image + except Exception: + pass + # 3. Final Resize Check if ( processed_image.width != target_w @@ -704,6 +730,17 @@ def _process_rendered_image_from_spec( h_scale, vscale=v_scale ) + if logger.isEnabledFor(logging.DEBUG): + try: + wp_uid = getattr(self, "uid", "workpiece") + debug_path = ( + f"/tmp/rayforge_render_{wp_uid}_{target_w}x{target_h}.png" + ) + processed_image.write_to_file(debug_path) + logger.debug("Saved debug render to %s", debug_path) + except Exception as exc: + logger.debug("Failed to save debug render: %s", exc) + return processed_image def get_vips_image( diff --git a/rayforge/image/svg/renderer.py b/rayforge/image/svg/renderer.py index fe1fd120..3ca32f87 100644 --- a/rayforge/image/svg/renderer.py +++ b/rayforge/image/svg/renderer.py @@ -135,14 +135,43 @@ def render_base_image( root.set("style", "overflow: visible") svg_bytes = ET.tostring(root) - image = pyvips.Image.svgload_buffer(svg_bytes) - # logger.debug( - # f"SvgRenderer.render_base_image: requested width={width}, " - # f"height={height}, actual image width={image.width}, " - # f"height={image.height}" - # ) - return image - except (pyvips.Error, ET.ParseError, ValueError, TypeError): + # Prefer CairoSVG because bundled libvips may lack SVG support on + # macOS. Fall back to svgload_buffer if available. + try: + import cairosvg + + png_bytes = cairosvg.svg2png( + bytestring=svg_bytes, + output_width=width, + output_height=height, + ) + logger.debug("Rendered SVG via CairoSVG fallback path.") + return pyvips.Image.pngload_buffer( + png_bytes, access=pyvips.Access.RANDOM + ) + except ImportError: + logger.error("CairoSVG is not available for SVG rendering.") + except (pyvips.Error, ValueError, TypeError, Exception) as e: + logger.error( + "CairoSVG fallback failed to render SVG: %s", + e, + exc_info=True, + ) + + try: + svg_loader = getattr(pyvips.Image, "svgload_buffer") + except AttributeError: + svg_loader = None + + if svg_loader: + logger.debug("Rendered SVG via libvips svgload_buffer.") + return svg_loader(svg_bytes) + + logger.error( + "No SVG renderer succeeded (CairoSVG/libvips unavailable)." + ) + except (pyvips.Error, ET.ParseError, ValueError, TypeError) as e: + logger.error(f"Failed to render SVG: {e}", exc_info=True) return None diff --git a/rayforge/pipeline/encoder/vertexencoder.py b/rayforge/pipeline/encoder/vertexencoder.py index e8451a5f..2f7f8d34 100644 --- a/rayforge/pipeline/encoder/vertexencoder.py +++ b/rayforge/pipeline/encoder/vertexencoder.py @@ -52,11 +52,18 @@ def encode(self, ops: Ops) -> VertexData: travel_v: List[float] = [] zero_power_v: List[float] = [] + # Ensure each command carries the intended machine state, so power + # values are available even if SetPower commands were stripped. + ops.preload_state() + # Track current state current_power = 0.0 current_pos = (0.0, 0.0, 0.0) for cmd in ops.commands: + if hasattr(cmd, "state") and cmd.state is not None: + current_power = getattr(cmd.state, "power", current_power) + if isinstance(cmd, SetPowerCommand): current_power = cmd.power continue diff --git a/rayforge/ui_gtk/canvas3d/canvas3d.py b/rayforge/ui_gtk/canvas3d/canvas3d.py index d5c19cae..18c9adcb 100644 --- a/rayforge/ui_gtk/canvas3d/canvas3d.py +++ b/rayforge/ui_gtk/canvas3d/canvas3d.py @@ -842,6 +842,20 @@ def _on_scene_prepared(self, task: Task): "[CANVAS3D] Scene preparation finished. Caching vertex data." ) self._scene_vtx_cache = task.result() + ( + powered_verts, + _powered_colors, + travel_verts, + zero_power_verts, + _zero_power_colors, + ) = self._scene_vtx_cache + logger.info( + "[CANVAS3D] Vertex counts - powered: %d, travel: %d, " + "zero_power: %d", + powered_verts.size // 3, + travel_verts.size // 3, + zero_power_verts.size // 3, + ) self._update_renderer_from_cache() def _update_renderer_from_cache(self): @@ -852,6 +866,17 @@ def _update_renderer_from_cache(self): if self.ops_renderer: self.ops_renderer.clear() logger.debug("[CANVAS3D] No vertex cache to update renderer from.") + if self.ops_renderer: + ( + powered_verts_dbg, + powered_colors_dbg, + travel_verts_dbg, + ) = self._build_debug_placeholder() + self.ops_renderer.update_from_vertex_data( + powered_verts_dbg, + powered_colors_dbg, + travel_verts_dbg, + ) self.queue_render() return @@ -888,6 +913,25 @@ def _update_renderer_from_cache(self): powered_colors_final, travel_verts_final, ) + + if ( + powered_verts_final.size == 0 + and travel_verts_final.size == 0 + ): + logger.warning( + "[CANVAS3D] Scene vertex data is empty. Rendering " + "debug placeholder line." + ) + ( + powered_verts_dbg, + powered_colors_dbg, + travel_verts_dbg, + ) = self._build_debug_placeholder() + self.ops_renderer.update_from_vertex_data( + powered_verts_dbg, + powered_colors_dbg, + travel_verts_dbg, + ) self.queue_render() def update_scene_from_doc(self): @@ -909,6 +953,10 @@ def update_scene_from_doc(self): # 1. Quickly generate the lightweight scene description scene_description = generate_scene_description(self.doc, self.pipeline) + logger.info( + "[CANVAS3D] Scene description created with %d render items.", + len(scene_description.render_items), + ) # 2. Handle texture instances immediately on the main thread (fast) self.texture_renderer.clear() @@ -957,3 +1005,29 @@ def _schedule_scene_preparation( key=task_key, when_done=self._on_scene_prepared, ) + + def _build_debug_placeholder(self): + """ + Builds a small placeholder line so rendering code paths stay visible + even when no vertex data is produced. + """ + powered_verts = np.array( + [0.0, 0.0, 0.0, 5.0, 0.0, 0.0], dtype=np.float32 + ) + powered_colors = np.array( + [ + 1.0, + 0.0, + 0.0, + 1.0, + 1.0, + 0.0, + 0.0, + 1.0, + ], + dtype=np.float32, + ) + travel_verts = np.array( + [0.0, 0.0, 0.02, 5.0, 0.0, 0.02], dtype=np.float32 + ) + return powered_verts, powered_colors, travel_verts diff --git a/rayforge/version.txt b/rayforge/version.txt index 2069bdbe..95a28e23 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -0.24-32-gfbceef7 +0.24-36-g79065e8 diff --git a/requirements.txt b/requirements.txt index 45b2adc5..78c6e25d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,6 +6,7 @@ GitPython==3.1.44 numpy==2.3.4 opencv_python platformdirs==4.3.6 +cairosvg==2.8.2 pluggy==1.6.0 pycairo==1.28.0 pyclipper==1.3.0.post6 diff --git a/scripts/mac_build.sh b/scripts/mac_build.sh index 4a0a9d14..47eff0f4 100755 --- a/scripts/mac_build.sh +++ b/scripts/mac_build.sh @@ -37,7 +37,19 @@ if [ ! -d "$VENV_PATH" ]; then python3 -m venv "$VENV_PATH" fi -source "$VENV_PATH/bin/activate" +ACTIVATED_BY_SCRIPT=0 +if [ -z "${VIRTUAL_ENV:-}" ]; then + source "$VENV_PATH/bin/activate" + ACTIVATED_BY_SCRIPT=1 +fi + +cleanup() { + if (( ACTIVATED_BY_SCRIPT == 1 )); then + deactivate + fi +} + +trap cleanup EXIT python -m pip install --upgrade pip python -m pip install --upgrade build pyinstaller @@ -149,5 +161,3 @@ SH fi echo "Build artifacts created in dist/ and dist/*.whl" - -deactivate From c4e5d4595144b994b098c94709f712371e5e99e5 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 4 Dec 2025 11:26:25 +0100 Subject: [PATCH 06/34] SVG color preview working --- rayforge/image/svg/importer.py | 15 +++++---------- rayforge/version.txt | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/rayforge/image/svg/importer.py b/rayforge/image/svg/importer.py index 59b5f2be..5ed479be 100644 --- a/rayforge/image/svg/importer.py +++ b/rayforge/image/svg/importer.py @@ -409,16 +409,11 @@ def _normalize_geometry( scale_y = height_mm / height_px geo.transform(Matrix.scale(scale_x, scale_y).to_4x4_numpy()) - min_x, min_y, max_x, max_y = geo.rect() - content_w = max_x - min_x - content_h = max_y - min_y - if content_w <= 1e-9 or content_h <= 1e-9: - return - - geo.transform(Matrix.translation(-min_x, -min_y).to_4x4_numpy()) - geo.transform( - Matrix.scale(1.0 / width_mm, 1.0 / height_mm).to_4x4_numpy() - ) + # Normalize to page coordinates (origin at 0,0; scale by page size). + if width_mm > 1e-9 and height_mm > 1e-9: + geo.transform( + Matrix.scale(1.0 / width_mm, 1.0 / height_mm).to_4x4_numpy() + ) def _create_workpiece( self, diff --git a/rayforge/version.txt b/rayforge/version.txt index 95a28e23..ff7ece82 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -0.24-36-g79065e8 +0.24-37-g0fab9ee From 394eea31ee9016fa479ece12c590f08cd37d4079 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 4 Dec 2025 13:37:53 +0100 Subject: [PATCH 07/34] get vector paths for all objects inside SVG file --- rayforge/core/geo/transform.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/rayforge/core/geo/transform.py b/rayforge/core/geo/transform.py index 316af06a..51aee9b9 100644 --- a/rayforge/core/geo/transform.py +++ b/rayforge/core/geo/transform.py @@ -75,8 +75,6 @@ def grow_geometry(geometry: T_Geometry, offset: float) -> T_Geometry: # Pyclipper works with integers, so we need to scale our coordinates. CLIPPER_SCALE = 1e7 - pco = pyclipper.PyclipperOffset() # type: ignore - paths_to_offset = [] for i, data in enumerate(contour_data): logger.debug(f"Processing contour #{i} for pyclipper") @@ -105,16 +103,22 @@ def grow_geometry(geometry: T_Geometry, offset: float) -> T_Geometry: ] paths_to_offset.append(scaled_vertices) - pco.AddPaths( - paths_to_offset, - pyclipper.JT_MITER, # type: ignore - pyclipper.ET_CLOSEDPOLYGON, # type: ignore - ) - solution = pco.Execute(offset * CLIPPER_SCALE) + # Offset each contour independently to avoid unintended unions when + # adjacent shapes touch or overlap. This preserves shared edges as + # distinct toolpaths. + all_solutions = [] + for path in paths_to_offset: + pco = pyclipper.PyclipperOffset() # type: ignore + pco.AddPath( + path, + pyclipper.JT_MITER, # type: ignore + pyclipper.ET_CLOSEDPOLYGON, # type: ignore + ) + all_solutions.extend(pco.Execute(offset * CLIPPER_SCALE)) - logger.debug(f"Pyclipper generated {len(solution)} offset contours.") + logger.debug(f"Pyclipper generated {len(all_solutions)} offset contours.") - for new_contour_scaled in solution: + for new_contour_scaled in all_solutions: if len(new_contour_scaled) < 3: continue From 18a91eeaa82f47d8aef832b8b5dff4698cb54585 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 4 Dec 2025 13:39:00 +0100 Subject: [PATCH 08/34] trace all objects (paths) independently even if they are overlapped --- .../ui_gtk/canvas2d/elements/workpiece.py | 651 ++++++++++++++++++ rayforge/version.txt | 2 +- 2 files changed, 652 insertions(+), 1 deletion(-) diff --git a/rayforge/ui_gtk/canvas2d/elements/workpiece.py b/rayforge/ui_gtk/canvas2d/elements/workpiece.py index fea909e7..9fe45875 100644 --- a/rayforge/ui_gtk/canvas2d/elements/workpiece.py +++ b/rayforge/ui_gtk/canvas2d/elements/workpiece.py @@ -1,4 +1,5 @@ import logging +import math from typing import Optional, TYPE_CHECKING, Dict, Tuple, cast, List, Set, Any import cairo import numpy as np @@ -729,6 +730,7 @@ def _on_ops_generation_finished_main_thread( self._artifact_cache[step.uid] = artifact self._update_model_view_cache() +<<<<<<< HEAD # Trigger a view render for this step if progressive rendering # was not already done. If progressive rendering was used, the view # artifact was already created and chunks were drawn to it during @@ -736,6 +738,124 @@ def _on_ops_generation_finished_main_thread( if step.uid not in self._steps_with_progressive_render: self._request_view_render(step.uid, force=True) self._steps_with_progressive_render.discard(step.uid) +======= + if logger.isEnabledFor(logging.DEBUG) and artifact and artifact.vertex_data: + v_data = artifact.vertex_data + counts = ( + v_data.powered_vertices.size, + v_data.travel_vertices.size, + v_data.zero_power_vertices.size, + ) + bounds = None + try: + stacks = [ + v + for v in ( + v_data.powered_vertices, + v_data.travel_vertices, + v_data.zero_power_vertices, + ) + if v.size > 0 + ] + if stacks: + v_stack = np.vstack(stacks) + v_min = np.min(v_stack, axis=0) + v_max = np.max(v_stack, axis=0) + bounds = (v_min.tolist(), v_max.tolist()) + except Exception as exc: # pragma: no cover - debug only + logger.debug("Failed to compute vertex bounds: %s", exc) + logger.debug( + "Artifact vertices for step '%s': counts powered/travel/zero=%s, bounds=%s, gen_size=%s, source_dims=%s", + step.uid, + counts, + bounds, + artifact.generation_size, + artifact.source_dimensions, + ) + + # Asynchronously prepare texture surface if it exists + if artifact and artifact.texture_data: + if future := self._ops_render_futures.pop(step.uid, None): + future.cancel() + + logger.debug( + f"PRE-submit _prepare_texture_surface_async for '{step.uid}'" + ) + future = self._executor.submit( + self._prepare_texture_surface_async, step.uid, artifact + ) + self._ops_render_futures[step.uid] = future + future.add_done_callback(self._on_texture_surface_prepared) + logger.debug( + f"POST-submit _prepare_texture_surface_async for '{step.uid}'" + ) + + if self.canvas: + self.canvas.queue_draw() + logger.debug( + f"END _on_ops_generation_finished_main_thread for " + f"step '{sender.uid}'" + ) + + def _prepare_texture_surface_async( + self, step_uid: str, artifact: WorkPieceArtifact + ) -> Optional[Tuple[str, cairo.ImageSurface]]: + """ + Performs the CPU-intensive conversion of raw texture data to a themed, + pre-multiplied Cairo ImageSurface. Designed to run in a background + thread. + """ + self._resolve_colors_if_needed() + if not self._color_set or not artifact.texture_data: + return None + + power_data = artifact.texture_data.power_texture_data + if power_data.size == 0: + return None + + engrave_lut = self._color_set.get_lut("engrave") + rgba_texture = engrave_lut[power_data] + + # Manually set alpha to 0 where power is 0 for transparency + zero_power_mask = power_data == 0 + rgba_texture[zero_power_mask, 3] = 0.0 + + h, w = rgba_texture.shape[:2] + # Create pre-multiplied BGRA data for Cairo + alpha_ch = rgba_texture[..., 3, np.newaxis] + rgb_ch = rgba_texture[..., :3] + bgra_texture = np.empty((h, w, 4), dtype=np.uint8) + # Pre-multiply RGB by Alpha, then convert to BGRA byte order + premultiplied_rgb = rgb_ch * alpha_ch * 255 + bgra_texture[..., 0] = premultiplied_rgb[..., 2] # B + bgra_texture[..., 1] = premultiplied_rgb[..., 1] # G + bgra_texture[..., 2] = premultiplied_rgb[..., 0] # R + bgra_texture[..., 3] = alpha_ch.squeeze() * 255 # A + + texture_surface = cairo.ImageSurface.create_for_data( + memoryview(np.ascontiguousarray(bgra_texture)), + cairo.FORMAT_ARGB32, + w, + h, + ) + return step_uid, texture_surface + + def _on_texture_surface_prepared(self, future: Future): + """Callback for when the async texture preparation is complete.""" + GLib.idle_add(self._on_texture_surface_prepared_main_thread, future) + + def _on_texture_surface_prepared_main_thread(self, future: Future): + """Thread-safe handler to cache the prepared texture and redraw.""" + if future.cancelled() or future.exception(): + return + result = future.result() + if not result: + return + + step_uid, texture_surface = result + self._texture_surfaces[step_uid] = texture_surface + self._update_model_view_cache() +>>>>>>> 6f2cbbcf (trace all objects (paths) independently even if they are overlapped) if self.canvas: self.canvas.queue_draw() @@ -819,6 +939,537 @@ def _draw_vertices_to_context( ctx.stroke() ctx.restore() +<<<<<<< HEAD +======= + def _record_ops_drawing_async( + self, step: Step, generation_id: int + ) -> Optional[Tuple[str, cairo.RecordingSurface, int]]: + """ + "Draws" the vector data to a RecordingSurface. This captures all vector + commands and is done only when the data changes. + """ + logger.debug( + f"Recording vector data for workpiece " + f"'{self.data.name}', step '{step.uid}'" + ) + artifact = self._artifact_cache.get(step.uid) + if not artifact or not artifact.vertex_data or not self.canvas: + return None + + self._resolve_colors_if_needed() + world_w, world_h = self.data.size + work_surface = cast("WorkSurface", self.canvas) + show_travel = work_surface.show_travel_moves + + # Calculate the union of the workpiece bounds and the vertex bounds to + # ensure the recording surface is large enough. + all_v = [artifact.vertex_data.powered_vertices] + if show_travel: + all_v.append(artifact.vertex_data.travel_vertices) + all_v.append(artifact.vertex_data.zero_power_vertices) + + all_v_filtered = [v for v in all_v if v.size > 0] + if not all_v_filtered: + return None + + v_stack = np.vstack(all_v_filtered) + v_x1, v_y1, _ = np.min(v_stack, axis=0) + v_x2, v_y2, _ = np.max(v_stack, axis=0) + + union_x1 = min(0.0, v_x1) + union_y1 = min(0.0, v_y1) + union_x2 = max(world_w, v_x2) + union_y2 = max(world_h, v_y2) + + union_w = union_x2 - union_x1 + union_h = union_y2 - union_y1 + + if union_w <= 1e-9 or union_h <= 1e-9: + return None + + # Create the recording surface with a small margin to prevent + # strokes on the boundary from being clipped by the recording's + # extents. The extents define the user-space coordinate system. + extents = ( + union_x1 - REC_MARGIN_MM, + union_y1 - REC_MARGIN_MM, + union_w + 2 * REC_MARGIN_MM, + union_h + 2 * REC_MARGIN_MM, + ) + # The pycairo type stubs are incorrect for RecordingSurface; they don't + # specify that a tuple is a valid type for `extents`. We ignore the + # type checker here as the code is functionally correct. + surface = cairo.RecordingSurface( + cairo.CONTENT_COLOR_ALPHA, + extents, # type: ignore + ) + ctx = cairo.Context(surface) + + # We are drawing 1:1 in mm space, so scale is 1.0. The vertex data + # is Y-up, and so is the recording surface's coordinate system. + # So we just pass a height that allows the y-flip to work correctly + # relative to the content we are drawing. + drawable_height_mm = union_y2 + union_y1 + self._draw_vertices_to_context( + artifact.vertex_data, ctx, (1.0, 1.0), drawable_height_mm + ) + + if logger.isEnabledFor(logging.DEBUG): + try: + img_w_px = max(1, int(math.ceil(union_w))) + img_h_px = max(1, int(math.ceil(union_h))) + debug_img = cairo.ImageSurface( + cairo.FORMAT_ARGB32, img_w_px, img_h_px + ) + debug_ctx = cairo.Context(debug_img) + debug_ctx.translate(-extents[0], -extents[1]) + debug_ctx.set_source_surface(surface, 0, 0) + debug_ctx.paint() + debug_path = ( + f"/tmp/rayforge_ops_{step.uid}_{img_w_px}x{img_h_px}.png" + ) + debug_img.write_to_png(debug_path) + logger.debug( + "Saved ops recording debug PNG to %s", debug_path + ) + except Exception as exc: # pragma: no cover - debug helper + logger.debug("Failed to save ops recording debug PNG: %s", exc) + + return step.uid, surface, generation_id + + def _on_ops_drawing_recorded(self, future: Future): + """ + Callback executed when the async ops recording is done. + Schedules the main logic to run on the GTK thread. + """ + GLib.idle_add(self._on_ops_drawing_recorded_main_thread, future) + + def _on_ops_drawing_recorded_main_thread(self, future: Future): + """The thread-safe part of the drawing recorded callback.""" + if future.cancelled(): + return + if exc := future.exception(): + logger.error(f"Error recording ops drawing: {exc}", exc_info=exc) + return + result = future.result() + if not result: + return + + step_uid, recording, received_gen_id = result + + if received_gen_id != self._ops_generation_ids.get(step_uid): + logger.debug( + f"Ignoring stale ops recording for step '{step_uid}'." + ) + return + + logger.debug(f"Applying new ops recording for step '{step_uid}'.") + self._ops_recordings[step_uid] = recording + self._update_model_view_cache() + + # Find the Step object to trigger the initial rasterization. + if self.data.layer and self.data.layer.workflow: + for step_obj in self.data.layer.workflow.steps: + if step_obj.uid == step_uid: + # This call is now safe because we are on the main thread. + self._trigger_ops_rasterization(step_obj, received_gen_id) + return + logger.warning( + "Could not find step '%s' to rasterize after recording.", + step_uid, + ) + + def _trigger_ops_rasterization(self, step: Step, generation_id: int): + """ + Schedules the fast async rasterization of ops using the cached + recording. + """ + step_uid = step.uid + if future := self._ops_render_futures.get(step_uid): + if not future.done(): + future.cancel() # Cancel obsolete render. + + future = self._executor.submit( + self._rasterize_ops_surface_async, step, generation_id + ) + self._ops_render_futures[step_uid] = future + future.add_done_callback(self._on_ops_surface_rendered) + + def _rasterize_ops_surface_async( + self, step: Step, generation_id: int + ) -> Optional[ + Tuple[str, cairo.ImageSurface, int, Tuple[float, float, float, float]] + ]: + """ + Renders ops to an ImageSurface, using the cached RecordingSurface + for a huge speedup if it is available. Also returns the mm bounding + box of the rendered content. + """ + step_uid = step.uid + logger.debug( + f"Rasterizing ops surface for step '{step_uid}', " + f"gen_id {generation_id}" + ) + if not self.canvas: + return None + + self._resolve_colors_if_needed() + recording = self._ops_recordings.get(step_uid) + world_w, world_h = self.data.size + work_surface = cast("WorkSurface", self.canvas) + show_travel = work_surface.show_travel_moves + + # Determine the millimeter dimensions and offset of the content. + if recording: + # FAST PATH: use extents from the recording surface. + extents = recording.get_extents() + if extents: + rec_x, rec_y, rec_w, rec_h = extents + content_x_mm = rec_x + REC_MARGIN_MM + content_y_mm = rec_y + REC_MARGIN_MM + content_w_mm = rec_w - 2 * REC_MARGIN_MM + content_h_mm = rec_h - 2 * REC_MARGIN_MM + else: + logger.warning(f"Could not get extents for '{step_uid}'") + return None + else: + # Slow fallback: calculate bounds from vertex data. + artifact = self._artifact_cache.get(step.uid) + if not artifact or not artifact.vertex_data: + return None + + all_v = [artifact.vertex_data.powered_vertices] + if show_travel: + all_v.append(artifact.vertex_data.travel_vertices) + all_v.append(artifact.vertex_data.zero_power_vertices) + + all_v_filtered = [v for v in all_v if v.size > 0] + if not all_v_filtered: + return None + + v_stack = np.vstack(all_v_filtered) + v_x1, v_y1, _ = np.min(v_stack, axis=0) + v_x2, v_y2, _ = np.max(v_stack, axis=0) + + union_x1 = min(0.0, v_x1) + union_y1 = min(0.0, v_y1) + union_x2 = max(world_w, v_x2) + union_y2 = max(world_h, v_y2) + + content_x_mm = union_x1 + content_y_mm = union_y1 + content_w_mm = union_x2 - union_x1 + content_h_mm = union_y2 - union_y1 + + bbox_mm = (content_x_mm, content_y_mm, content_w_mm, content_h_mm) + view_ppm_x, view_ppm_y = work_surface.get_view_scale() + content_width_px = round(content_w_mm * view_ppm_x) + content_height_px = round(content_h_mm * view_ppm_y) + + surface_width = min( + content_width_px + 2 * OPS_MARGIN_PX, CAIRO_MAX_DIMENSION + ) + surface_height = min( + content_height_px + 2 * OPS_MARGIN_PX, CAIRO_MAX_DIMENSION + ) + + if ( + surface_width <= 2 * OPS_MARGIN_PX + or surface_height <= 2 * OPS_MARGIN_PX + ): + return None + + surface = cairo.ImageSurface( + cairo.FORMAT_ARGB32, surface_width, surface_height + ) + ctx = cairo.Context(surface) + ctx.translate(OPS_MARGIN_PX, OPS_MARGIN_PX) + + if recording: + # FAST PATH: Replay the cached vector drawing commands. + ctx.save() + # 1. Scale context to match mm units. + ctx.scale(view_ppm_x, view_ppm_y) + # 2. The content area's top-left is at (content_x_mm, content_y_mm) + # in world space. Translate the context so that its origin (0,0) + # corresponds to the world's origin (0,0). + ctx.translate(-content_x_mm, -content_y_mm) + # 3. Set the recording as the source. Its internal coordinates + # are already in world mm, so we can now paint it directly. + ctx.set_source_surface(recording, 0, 0) + ctx.paint() + ctx.restore() + else: + # SLOW FALLBACK: No recording yet, render from vertex data. + artifact = self._artifact_cache.get(step.uid) + if not artifact or not artifact.vertex_data: + return None # Should not happen as we checked above + + encoder_ppm_x = ( + content_width_px / content_w_mm if content_w_mm > 1e-9 else 1 + ) + encoder_ppm_y = ( + content_height_px / content_h_mm if content_h_mm > 1e-9 else 1 + ) + ppms = (encoder_ppm_x, encoder_ppm_y) + + # Translate context to draw the union box content correctly. + ctx.translate( + -content_x_mm * encoder_ppm_x, -content_y_mm * encoder_ppm_y + ) + + # Y-flip height must be workpiece height in pixels. + drawable_h_px = world_h * encoder_ppm_y + self._draw_vertices_to_context( + artifact.vertex_data, ctx, ppms, drawable_h_px + ) + + return step_uid, surface, generation_id, bbox_mm + + def _on_ops_chunk_available( + self, + sender: Step, + workpiece: WorkPiece, + chunk_handle: "BaseArtifactHandle", + generation_id: int, + **kwargs, + ): + """ + Handler for when a chunk of ops is ready for progressive rendering. + This is called from a background thread. It schedules the expensive + encoding work to happen in another background task. + """ + if workpiece is not self.data: + return + + # STALE CHECK: Ignore chunks from a previous generation request. + step_uid = sender.uid + if generation_id != self._ops_generation_ids.get(step_uid): + get_context().artifact_store.release(chunk_handle) + return + + # Offload the CPU-intensive encoding to the thread pool + future = self._executor.submit( + self._encode_chunk_async, sender, chunk_handle + ) + future.add_done_callback(self._on_chunk_encoded) + + def _encode_chunk_async( + self, step: Step, chunk_handle: BaseArtifactHandle + ): + """ + Does the heavy lifting of preparing a surface and encoding an ops + chunk onto it. This is designed to be run in a thread pool. + """ + # This function runs entirely in a background thread. + chunk_artifact = None + try: + prepared = self._prepare_ops_surface_and_context(step) + if prepared: + chunk_artifact = cast( + WorkPieceArtifact, + get_context().artifact_store.get(chunk_handle), + ) + if not chunk_artifact: + return step.uid + + _surface, ctx, ppms, content_h_px = prepared + + # --- Draw texture data from the chunk if it exists --- + if self._color_set and chunk_artifact.texture_data: + power_data = chunk_artifact.texture_data.power_texture_data + if power_data.size > 0: + engrave_lut = self._color_set.get_lut("engrave") + rgba_texture = engrave_lut[power_data] + + # Manually set alpha for transparency + zero_power_mask = power_data == 0 + rgba_texture[zero_power_mask, 3] = 0.0 + + h, w = rgba_texture.shape[:2] + # Create pre-multiplied BGRA data for Cairo + alpha_ch = rgba_texture[..., 3, np.newaxis] + rgb_ch = rgba_texture[..., :3] + bgra_texture = np.empty((h, w, 4), dtype=np.uint8) + premultiplied_rgb = rgb_ch * alpha_ch * 255 + bgra_texture[..., 0] = premultiplied_rgb[..., 2] # B + bgra_texture[..., 1] = premultiplied_rgb[..., 1] # G + bgra_texture[..., 2] = premultiplied_rgb[..., 0] # R + bgra_texture[..., 3] = alpha_ch.squeeze() * 255 # A + + texture_surface = cairo.ImageSurface.create_for_data( + memoryview(np.ascontiguousarray(bgra_texture)), + cairo.FORMAT_ARGB32, + w, + h, + ) + + # Draw the themed texture to the pixel context + _world_w, world_h = self.data.size + pos_mm = chunk_artifact.texture_data.position_mm + dim_mm = chunk_artifact.texture_data.dimensions_mm + encoder_ppm_x, encoder_ppm_y = ppms + + dest_x_px = pos_mm[0] * encoder_ppm_x + dest_w_px = dim_mm[0] * encoder_ppm_x + dest_h_px = dim_mm[1] * encoder_ppm_y + dest_y_px = pos_mm[1] * encoder_ppm_y + + tex_w_px = texture_surface.get_width() + tex_h_px = texture_surface.get_height() + + if tex_w_px > 0 and tex_h_px > 0: + ctx.save() + ctx.translate(dest_x_px, dest_y_px) + # Add half-pixel offset for raster grid alignment + ctx.translate(0.5, 0.5) + ctx.scale( + dest_w_px / tex_w_px, dest_h_px / tex_h_px + ) + ctx.set_source_surface(texture_surface, 0, 0) + ctx.get_source().set_filter(cairo.FILTER_GOOD) + ctx.paint() + ctx.restore() + + # --- Draw vertex data from the chunk if it exists --- + if chunk_artifact.vertex_data: + self._draw_vertices_to_context( + chunk_artifact.vertex_data, + ctx, + ppms, + content_h_px, + ) + finally: + # IMPORTANT: Release the handle in the subprocess to free memory + get_context().artifact_store.release(chunk_handle) + return step.uid + + def _on_chunk_encoded(self, future: Future): + """ + Callback for when a chunk has been encoded. Schedules the final + UI update on the main thread. + """ + GLib.idle_add(self._on_chunk_encoded_main_thread, future) + + def _on_chunk_encoded_main_thread(self, future: Future): + """ + Thread-safe callback that triggers a redraw after a chunk is ready. + """ + if future.cancelled() or future.exception(): + return + # The result is just the step_uid, we don't need it, but we know + # the surface has been updated. + if self.canvas: + self.canvas.queue_draw() + + def _prepare_ops_surface_and_context( + self, step: Step + ) -> Optional[ + Tuple[cairo.ImageSurface, cairo.Context, Tuple[float, float], float] + ]: + """ + Used by chunk rendering. Ensures an ops surface exists for a step, + creating it if necessary. Returns the surface, a transformed context, + scale, and drawable height in pixels. + """ + if not self.canvas: + return None + + self._resolve_colors_if_needed() + step_uid = step.uid + surface_tuple = self._ops_surfaces.get(step_uid) + world_w, world_h = self.data.size + + # If surface doesn't exist (e.g., first chunk), create it. + # Chunk rendering will be clipped to workpiece bounds for now. + if surface_tuple is None: + work_surface = cast("WorkSurface", self.canvas) + view_ppm_x, view_ppm_y = work_surface.get_view_scale() + content_width_px = round(world_w * view_ppm_x) + content_height_px = round(world_h * view_ppm_y) + + surface_width = min( + content_width_px + 2 * OPS_MARGIN_PX, CAIRO_MAX_DIMENSION + ) + surface_height = min( + content_height_px + 2 * OPS_MARGIN_PX, CAIRO_MAX_DIMENSION + ) + + if ( + surface_width <= 2 * OPS_MARGIN_PX + or surface_height <= 2 * OPS_MARGIN_PX + ): + return None + + surface = cairo.ImageSurface( + cairo.FORMAT_ARGB32, surface_width, surface_height + ) + # Store with workpiece bounds. This will be replaced by the + # final render with the correct, larger bounds. + workpiece_bbox = (0.0, 0.0, world_w, world_h) + self._ops_surfaces[step_uid] = (surface, workpiece_bbox) + else: + surface, _ = surface_tuple + + ctx = cairo.Context(surface) + # Set the origin to the top-left of the content area. + ctx.translate(OPS_MARGIN_PX, OPS_MARGIN_PX) + + # Calculate the pixels-per-millimeter and content height for encoder. + content_width_px = surface.get_width() - 2 * OPS_MARGIN_PX + content_height_px = surface.get_height() - 2 * OPS_MARGIN_PX + encoder_ppm_x = content_width_px / world_w if world_w > 1e-9 else 1.0 + encoder_ppm_y = content_height_px / world_h if world_h > 1e-9 else 1.0 + ppms = (encoder_ppm_x, encoder_ppm_y) + + return surface, ctx, ppms, content_height_px + + def _on_ops_surface_rendered(self, future: Future): + """ + Callback executed when the async ops rendering is done. + Schedules the main logic to run on the GTK thread. + """ + # Schedule the actual handler on the main thread + GLib.idle_add(self._on_ops_surface_rendered_main_thread, future) + + def _on_ops_surface_rendered_main_thread(self, future: Future): + """The thread-safe part of the surface rendered callback.""" + if future.cancelled(): + logger.debug("Ops surface render future was cancelled.") + return + if exc := future.exception(): + logger.error( + f"Error rendering ops surface for '{self.data.name}': {exc}", + exc_info=exc, + ) + return + result = future.result() + if not result: + logger.debug("Ops surface render future returned no result.") + return + + step_uid, new_surface, received_generation_id, bbox_mm = result + + # Ignore results from a previous generation request. + if received_generation_id != self._ops_generation_ids.get(step_uid): + logger.debug( + f"Ignoring stale final render for step '{step_uid}'. " + f"Have ID {self._ops_generation_ids.get(step_uid)}, " + f"received {received_generation_id}." + ) + return + + logger.debug( + f"Applying newly rendered ops surface for step '{step_uid}'." + ) + self._ops_surfaces[step_uid] = (new_surface, bbox_mm) + self._update_model_view_cache() # Save to model cache + self._ops_render_futures.pop(step_uid, None) + if self.canvas: + # This call is now safe because we are on the main thread. + self.canvas.queue_draw() + +>>>>>>> 6f2cbbcf (trace all objects (paths) independently even if they are overlapped) def render_to_surface( self, width: int, height: int ) -> Optional[cairo.ImageSurface]: diff --git a/rayforge/version.txt b/rayforge/version.txt index ff7ece82..311106ea 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -0.24-37-g0fab9ee +0.24-38-gaa04c37 From 7f909a808382c17d23478292561f092e7659f3ff Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Mon, 8 Dec 2025 10:10:44 +0100 Subject: [PATCH 09/34] Fix 3D preview orientation --- rayforge/ui_gtk/canvas3d/camera.py | 3 ++- rayforge/version.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/rayforge/ui_gtk/canvas3d/camera.py b/rayforge/ui_gtk/canvas3d/camera.py index e018837f..56d7ee53 100644 --- a/rayforge/ui_gtk/canvas3d/camera.py +++ b/rayforge/ui_gtk/canvas3d/camera.py @@ -207,7 +207,8 @@ def set_top_view(self, world_width: float, world_depth: float): ) self.target = np.array([center_x, center_y, 0.0], dtype=np.float64) - # Standard orientation: Up vector points along positive Y. + # Keep the camera's up aligned to +Y; scene transforms handle axis + # orientation differences. self.up = np.array([0.0, 1.0, 0.0], dtype=np.float64) # A top-down view should be orthographic, not perspective. diff --git a/rayforge/version.txt b/rayforge/version.txt index 311106ea..32ef98e4 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -0.24-38-gaa04c37 +0.24-40-g8c45ccc From f969a5b179c99444f53a7e1a96886e9fc6d43c18 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 4 Dec 2025 16:49:05 +0100 Subject: [PATCH 10/34] remove SVG rendered pictures for debugging, they are not needed anymore --- rayforge/core/workpiece.py | 11 ---------- .../ui_gtk/canvas2d/elements/workpiece.py | 21 ------------------- 2 files changed, 32 deletions(-) diff --git a/rayforge/core/workpiece.py b/rayforge/core/workpiece.py index cf2df84e..f372c302 100644 --- a/rayforge/core/workpiece.py +++ b/rayforge/core/workpiece.py @@ -730,17 +730,6 @@ def _process_rendered_image_from_spec( h_scale, vscale=v_scale ) - if logger.isEnabledFor(logging.DEBUG): - try: - wp_uid = getattr(self, "uid", "workpiece") - debug_path = ( - f"/tmp/rayforge_render_{wp_uid}_{target_w}x{target_h}.png" - ) - processed_image.write_to_file(debug_path) - logger.debug("Saved debug render to %s", debug_path) - except Exception as exc: - logger.debug("Failed to save debug render: %s", exc) - return processed_image def get_vips_image( diff --git a/rayforge/ui_gtk/canvas2d/elements/workpiece.py b/rayforge/ui_gtk/canvas2d/elements/workpiece.py index 9fe45875..9d88232f 100644 --- a/rayforge/ui_gtk/canvas2d/elements/workpiece.py +++ b/rayforge/ui_gtk/canvas2d/elements/workpiece.py @@ -1014,27 +1014,6 @@ def _record_ops_drawing_async( artifact.vertex_data, ctx, (1.0, 1.0), drawable_height_mm ) - if logger.isEnabledFor(logging.DEBUG): - try: - img_w_px = max(1, int(math.ceil(union_w))) - img_h_px = max(1, int(math.ceil(union_h))) - debug_img = cairo.ImageSurface( - cairo.FORMAT_ARGB32, img_w_px, img_h_px - ) - debug_ctx = cairo.Context(debug_img) - debug_ctx.translate(-extents[0], -extents[1]) - debug_ctx.set_source_surface(surface, 0, 0) - debug_ctx.paint() - debug_path = ( - f"/tmp/rayforge_ops_{step.uid}_{img_w_px}x{img_h_px}.png" - ) - debug_img.write_to_png(debug_path) - logger.debug( - "Saved ops recording debug PNG to %s", debug_path - ) - except Exception as exc: # pragma: no cover - debug helper - logger.debug("Failed to save ops recording debug PNG: %s", exc) - return step.uid, surface, generation_id def _on_ops_drawing_recorded(self, future: Future): From 89049c4b8c75fb1c3ecad78e59c01aaee5e487c8 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 4 Dec 2025 17:32:56 +0100 Subject: [PATCH 11/34] update version --- rayforge/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rayforge/version.txt b/rayforge/version.txt index 32ef98e4..7606c4c0 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -0.24-40-g8c45ccc +0.26-62-gd417e76d From e1a9c706d5b72f092e19eb9f3c139429a1ef2664 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Mon, 8 Dec 2025 10:56:03 +0100 Subject: [PATCH 12/34] update version --- rayforge/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rayforge/version.txt b/rayforge/version.txt index 7606c4c0..8faf1c27 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -0.26-62-gd417e76d +0.26-68-g8e16bd0b From f0121ef0e9f7a808977509498d8a34b8b963f55c Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Mon, 8 Dec 2025 10:56:17 +0100 Subject: [PATCH 13/34] add GitHub macOS workflows --- .github/workflows/build-macos-arm.yml | 126 ++++++++++++++++++++++++ .github/workflows/build-macos-intel.yml | 126 ++++++++++++++++++++++++ 2 files changed, 252 insertions(+) create mode 100644 .github/workflows/build-macos-arm.yml create mode 100644 .github/workflows/build-macos-intel.yml diff --git a/.github/workflows/build-macos-arm.yml b/.github/workflows/build-macos-arm.yml new file mode 100644 index 00000000..39f0cfa2 --- /dev/null +++ b/.github/workflows/build-macos-arm.yml @@ -0,0 +1,126 @@ +name: Build macOS App (Apple Silicon) + +on: + push: + branches: + - "**" + tags: + - "*" + pull_request: + branches: + - "**" + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + name: Build macOS Bundle (Apple Silicon) + runs-on: macos-14 + outputs: + version: ${{ steps.set-version.outputs.version }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true + + - name: Set Version + id: set-version + shell: bash + run: | + if [[ "${{ github.ref_type }}" == "tag" ]]; then + VERSION=${{ github.ref_name }} + elif git describe --tags >/dev/null 2>&1; then + VERSION=$(git describe --tags) + else + VERSION="v0.0.0-$(git rev-parse --short HEAD)" + fi + if [ -z "$VERSION" ]; then + echo "Error: No git version number found!" + exit 1 + fi + echo "VERSION=$VERSION" >> $GITHUB_ENV + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "Version: $VERSION" + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + cache: 'pip' + cache-dependency-path: requirements.txt + + - name: Install macOS dependencies + run: bash scripts/mac_setup.sh --install + + - name: Lint + run: pixi run lint + + - name: Test + run: pixi run test + + - name: Build macOS bundle + run: bash scripts/mac_build.sh --bundle --version "${{ env.VERSION }}" + + - name: Package .app bundle + run: | + APP_PATH="dist/Rayforge.app" + if [ ! -d "$APP_PATH" ]; then + echo "App bundle not found at $APP_PATH" + exit 1 + fi + ZIP_NAME="rayforge-${{ steps.set-version.outputs.version }}-macos-arm-app.zip" + ditto -c -k --keepParent "$APP_PATH" "$ZIP_NAME" + + - name: Upload macOS bundle artifact + uses: actions/upload-artifact@v4 + with: + name: rayforge-${{ steps.set-version.outputs.version }}-macos-arm-app.zip + path: rayforge-${{ steps.set-version.outputs.version }}-macos-arm-app.zip + compression-level: 9 + + - name: Upload Python distributions + uses: actions/upload-artifact@v4 + with: + name: rayforge-${{ steps.set-version.outputs.version }}-macos-arm-dists + path: | + dist/*.whl + dist/*.tar.gz + if-no-files-found: error + + release: + name: Create GitHub Release (Apple Silicon) + needs: build + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/') && github.repository == 'barebaric/rayforge' + permissions: + contents: write + steps: + - name: Download macOS app artifact + uses: actions/download-artifact@v4 + with: + name: rayforge-${{ needs.build.outputs.version }}-macos-arm-app.zip + + - name: Download Python distributions + uses: actions/download-artifact@v4 + with: + name: rayforge-${{ needs.build.outputs.version }}-macos-arm-dists + path: ./dist + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + files: | + rayforge-${{ needs.build.outputs.version }}-macos-arm.zip + dist/*.whl + dist/*.tar.gz + draft: false + prerelease: false + name: Release ${{ needs.build.outputs.version }} + tag_name: ${{ github.ref_name }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/build-macos-intel.yml b/.github/workflows/build-macos-intel.yml new file mode 100644 index 00000000..094cabfb --- /dev/null +++ b/.github/workflows/build-macos-intel.yml @@ -0,0 +1,126 @@ +name: Build macOS App (Intel) + +on: + push: + branches: + - "**" + tags: + - "*" + pull_request: + branches: + - "**" + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + name: Build macOS Bundle (Intel) + runs-on: macos-13 + outputs: + version: ${{ steps.set-version.outputs.version }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true + + - name: Set Version + id: set-version + shell: bash + run: | + if [[ "${{ github.ref_type }}" == "tag" ]]; then + VERSION=${{ github.ref_name }} + elif git describe --tags >/dev/null 2>&1; then + VERSION=$(git describe --tags) + else + VERSION="v0.0.0-$(git rev-parse --short HEAD)" + fi + if [ -z "$VERSION" ]; then + echo "Error: No git version number found!" + exit 1 + fi + echo "VERSION=$VERSION" >> $GITHUB_ENV + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "Version: $VERSION" + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + cache: 'pip' + cache-dependency-path: requirements.txt + + - name: Install macOS dependencies + run: bash scripts/mac_setup.sh --install + + - name: Lint + run: pixi run lint + + - name: Test + run: pixi run test + + - name: Build macOS bundle + run: bash scripts/mac_build.sh --bundle --version "${{ env.VERSION }}" + + - name: Package .app bundle + run: | + APP_PATH="dist/Rayforge.app" + if [ ! -d "$APP_PATH" ]; then + echo "App bundle not found at $APP_PATH" + exit 1 + fi + ZIP_NAME="rayforge-${{ steps.set-version.outputs.version }}-macos-intel-app.zip" + ditto -c -k --keepParent "$APP_PATH" "$ZIP_NAME" + + - name: Upload macOS bundle artifact + uses: actions/upload-artifact@v4 + with: + name: rayforge-${{ steps.set-version.outputs.version }}-macos-intel-app.zip + path: rayforge-${{ steps.set-version.outputs.version }}-macos-intel-app.zip + compression-level: 9 + + - name: Upload Python distributions + uses: actions/upload-artifact@v4 + with: + name: rayforge-${{ steps.set-version.outputs.version }}-macos-intel-dists + path: | + dist/*.whl + dist/*.tar.gz + if-no-files-found: error + + release: + name: Create GitHub Release (Intel) + needs: build + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/') && github.repository == 'barebaric/rayforge' + permissions: + contents: write + steps: + - name: Download macOS app artifact + uses: actions/download-artifact@v4 + with: + name: rayforge-${{ needs.build.outputs.version }}-macos-intel-app.zip + + - name: Download Python distributions + uses: actions/download-artifact@v4 + with: + name: rayforge-${{ needs.build.outputs.version }}-macos-intel-dists + path: ./dist + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + files: | + rayforge-${{ needs.build.outputs.version }}-macos-intel.zip + dist/*.whl + dist/*.tar.gz + draft: false + prerelease: false + name: Release ${{ needs.build.outputs.version }} + tag_name: ${{ github.ref_name }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From b14ea138d51748d2bd240706d150b6bab5e1172c Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Tue, 9 Dec 2025 10:49:59 +0100 Subject: [PATCH 14/34] update macos workflows --- .github/workflows/build-macos-arm.yml | 7 +++++++ .github/workflows/build-macos-intel.yml | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/.github/workflows/build-macos-arm.yml b/.github/workflows/build-macos-arm.yml index 39f0cfa2..93e338cb 100644 --- a/.github/workflows/build-macos-arm.yml +++ b/.github/workflows/build-macos-arm.yml @@ -54,6 +54,13 @@ jobs: cache: 'pip' cache-dependency-path: requirements.txt + - name: Install Pixi + uses: prefix-dev/setup-pixi@v0.8.1 + with: + pixi-version: v0.48.2 + cache: true + cache-key: ${{ github.sha }}-macos-arm + - name: Install macOS dependencies run: bash scripts/mac_setup.sh --install diff --git a/.github/workflows/build-macos-intel.yml b/.github/workflows/build-macos-intel.yml index 094cabfb..beed6234 100644 --- a/.github/workflows/build-macos-intel.yml +++ b/.github/workflows/build-macos-intel.yml @@ -54,6 +54,13 @@ jobs: cache: 'pip' cache-dependency-path: requirements.txt + - name: Install Pixi + uses: prefix-dev/setup-pixi@v0.8.1 + with: + pixi-version: v0.48.2 + cache: true + cache-key: ${{ github.sha }}-macos-intel + - name: Install macOS dependencies run: bash scripts/mac_setup.sh --install From 86816ed1f87e2aa86fc08c907f630914d4a1a7eb Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Tue, 20 Jan 2026 10:52:45 +0100 Subject: [PATCH 15/34] update macOS workflow --- .github/workflows/build-macos-intel.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-macos-intel.yml b/.github/workflows/build-macos-intel.yml index beed6234..0fa381fc 100644 --- a/.github/workflows/build-macos-intel.yml +++ b/.github/workflows/build-macos-intel.yml @@ -18,7 +18,7 @@ concurrency: jobs: build: name: Build macOS Bundle (Intel) - runs-on: macos-13 + runs-on: macos-14 outputs: version: ${{ steps.set-version.outputs.version }} steps: From 6320acc5dba30f22d4977bb0a8be8aa234dba10e Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Mon, 2 Feb 2026 16:25:13 +0100 Subject: [PATCH 16/34] update macOS branch to 0.28.4 --- Rayforge.spec | 2 +- rayforge/image/svg/importer.py | 480 +++++---------------------------- rayforge/image/svg/svgutil.py | 76 +++++- rayforge/version.txt | 2 +- scripts/mac_build.sh | 30 ++- 5 files changed, 170 insertions(+), 420 deletions(-) diff --git a/Rayforge.spec b/Rayforge.spec index 901f3515..d189f086 100644 --- a/Rayforge.spec +++ b/Rayforge.spec @@ -3,7 +3,7 @@ a = Analysis( ['rayforge/app.py'], - pathex=[], + pathex=['.'], binaries=[], datas=[('rayforge/version.txt', 'rayforge'), ('rayforge/resources', 'rayforge/resources'), ('rayforge/locale', 'rayforge/locale')], hiddenimports=['gi._gi_cairo', 'cairosvg'], diff --git a/rayforge/image/svg/importer.py b/rayforge/image/svg/importer.py index 5ed479be..f812c670 100644 --- a/rayforge/image/svg/importer.py +++ b/rayforge/image/svg/importer.py @@ -1,440 +1,88 @@ -import io -import math import logging -from typing import List, Optional, Tuple, Union -from xml.etree import ElementTree as ET +from typing import Optional -from svgelements import ( - SVG, - Arc, - Close, - CubicBezier, - Line, - Move, - Path, - QuadraticBezier, -) - -from ...core.geo import Geometry -from ...core.source_asset_segment import SourceAssetSegment -from ...core.item import DocItem -from ...core.matrix import Matrix -from ...core.source_asset import SourceAsset from ...core.vectorization_spec import ( PassthroughSpec, TraceSpec, VectorizationSpec, ) -from ...core.workpiece import WorkPiece -from ..base_importer import Importer, ImportPayload -from .. import image_util -from ..tracing import trace_surface, VTRACER_PIXEL_LIMIT -from .renderer import SVG_RENDERER -from .svgutil import PPI, get_natural_size, trim_svg +from ..base_importer import Importer, ImporterFeature +from ..structures import ImportResult, ParsingResult, VectorizationResult +from .svg_trace import SvgTraceImporter +from .svg_vector import SvgVectorImporter logger = logging.getLogger(__name__) class SvgImporter(Importer): + """ + Facade importer for SVG files. + """ + label = "SVG files" mime_types = ("image/svg+xml",) extensions = (".svg",) - - def get_doc_items( - self, vectorization_spec: Optional["VectorizationSpec"] = None - ) -> Optional[ImportPayload]: - """ - Generates DocItems from SVG data. - - If a TraceSpec is provided, it renders the SVG to a bitmap and - traces it. This is robust but may lose fidelity. - - Otherwise, it attempts to parse the SVG path and shape data - directly for a high-fidelity vector import. - """ - source = SourceAsset( - source_file=self.source_file, - original_data=self.raw_data, - renderer=SVG_RENDERER, - ) - - if isinstance(vectorization_spec, TraceSpec): - # Path 1: Render to bitmap and trace - items = self._get_doc_items_from_trace(source, vectorization_spec) - else: - # Path 2: Direct vector parsing with pre-trimming - trimmed_data = trim_svg(self.raw_data) - source.base_render_data = trimmed_data - self._populate_metadata(source) - items = self._get_doc_items_direct(source) - - # If direct import failed, fall back to tracing to ensure - # the user at least sees something. - if not items: - logger.warning( - "Direct SVG import produced no items; falling back to " - "traced import." - ) - items = self._get_doc_items_from_trace(source, TraceSpec()) - - if not items: - return None - - return ImportPayload(source=source, items=items) - - def _populate_metadata(self, source: SourceAsset): - """Calculates and stores metadata for direct SVG import.""" - metadata = {} - try: - # Get size of original, untrimmed SVG - untrimmed_size = get_natural_size(source.original_data) - if untrimmed_size: - source.width_mm = untrimmed_size[0] - source.height_mm = untrimmed_size[1] - metadata["untrimmed_width_mm"] = untrimmed_size[0] - metadata["untrimmed_height_mm"] = untrimmed_size[1] - - # Get size of the new, trimmed SVG - if source.base_render_data: - trimmed_size = get_natural_size(source.base_render_data) - if trimmed_size: - metadata["trimmed_width_mm"] = trimmed_size[0] - metadata["trimmed_height_mm"] = trimmed_size[1] - - # Get viewBox from trimmed SVG for direct import - root = ET.fromstring(source.base_render_data) - vb_str = root.get("viewBox") - if vb_str: - metadata["viewbox"] = tuple(map(float, vb_str.split())) - - source.metadata.update(metadata) - except Exception as e: - logger.warning(f"Could not calculate SVG metadata: {e}") - - def _get_doc_items_from_trace( - self, source: SourceAsset, vectorization_spec: TraceSpec - ) -> Optional[List[DocItem]]: - """ - Renders the original SVG data to a bitmap, traces it, and creates a - single masked WorkPiece. - """ - size_mm = get_natural_size(source.original_data) - if not size_mm or not size_mm[0] or not size_mm[1]: - logger.warning("Cannot trace SVG: failed to determine size.") - return None - - # Populate intrinsic dimensions - source.width_mm, source.height_mm = size_mm - - # Calculate render dimensions that preserve the original aspect ratio, - # maximizing the render resolution for better tracing quality. - w_mm, h_mm = size_mm - aspect = w_mm / h_mm if h_mm > 0 else 1.0 - TARGET_DIM = math.sqrt(VTRACER_PIXEL_LIMIT) - - if aspect >= 1.0: # Landscape or square - w_px = int(TARGET_DIM) - h_px = int(TARGET_DIM / aspect) - else: # Portrait - h_px = int(TARGET_DIM) - w_px = int(TARGET_DIM * aspect) - w_px, h_px = max(1, w_px), max(1, h_px) - - vips_image = SVG_RENDERER.render_base_image( - source.original_data, width=w_px, height=h_px - ) - if not vips_image: - logger.error("Failed to render SVG to vips image for tracing.") - return None - - # Manually set the resolution metadata on the rendered image. This is - # crucial for create_single_workpiece_from_trace to calculate the - # correct physical size of the cropped area. - if w_mm > 0 and h_mm > 0: - xres = w_px / w_mm # pixels per mm - yres = h_px / h_mm # pixels per mm - vips_image = vips_image.copy(xres=xres, yres=yres) - - normalized_vips = image_util.normalize_to_rgba(vips_image) - if not normalized_vips: - return None - surface = image_util.vips_rgba_to_cairo_surface(normalized_vips) - - geometries = trace_surface(surface, vectorization_spec) - - # Use the standard helper for creating a single, masked workpiece - return image_util.create_single_workpiece_from_trace( - geometries, - source, - vips_image, - vectorization_spec, - self.source_file.stem, - ) - - def _get_doc_items_direct(self, source: SourceAsset) -> Optional[List[DocItem]]: - """ - Orchestrates the direct parsing of SVG data into DocItems. - """ - if not source.base_render_data: - logger.error("source has no data to process for direct import") - return None - - # 1. Establish authoritative dimensions in millimeters. - final_dims_mm = self._get_final_dimensions(source) - if not final_dims_mm: - msg = ( - "SVG is missing width or height attributes; " - "falling back to trace method for direct import." - ) - logger.warning(msg) - return self._get_doc_items_from_trace(source, TraceSpec()) - final_width_mm, final_height_mm = final_dims_mm - - # 2. Parse SVG data into an object model. - svg = self._parse_svg_data(source) - if svg is None: - return None - - # 3. Convert SVG shapes to internal geometry (in pixel coordinates). - geo = self._convert_svg_to_geometry(svg, final_dims_mm) - - # 4. Get pixel dimensions for normalization. - pixel_dims = self._get_pixel_dimensions(svg) - if not pixel_dims: - msg = ( - "Could not determine valid pixel dimensions from SVG; " - "falling back to trace method." - ) - logger.warning(msg) - return self._get_doc_items_from_trace(source, TraceSpec()) - width_px, height_px = pixel_dims - - # 5. Normalize geometry into physical millimeter space so it renders - # with the expected size in the canvas. - self._normalize_geometry( - geo, - width_px, - height_px, - final_width_mm, - final_height_mm, + features = { + ImporterFeature.DIRECT_VECTOR, + ImporterFeature.BITMAP_TRACING, + ImporterFeature.LAYER_SELECTION, + } + + def scan(self): + return SvgVectorImporter(self.raw_data, self.source_file).scan() + + def parse(self) -> Optional[ParsingResult]: + raise NotImplementedError( + "SvgImporter is a facade; parse is delegated via get_doc_items" ) - # 6. Create the final workpiece. - wp = self._create_workpiece( - geo, source, final_width_mm, final_height_mm + def vectorize( + self, parse_result: ParsingResult, spec: VectorizationSpec + ) -> VectorizationResult: + raise NotImplementedError( + "SvgImporter is a facade; vectorize is delegated via get_doc_items" ) - return [wp] - - def _get_final_dimensions( - self, source: SourceAsset - ) -> Optional[Tuple[float, float]]: - """ - Extracts the final width and height in millimeters from source - metadata. - """ - width = source.metadata.get("trimmed_width_mm") - height = source.metadata.get("trimmed_height_mm") - if width and height: - return width, height - return None - - def _parse_svg_data(self, source: SourceAsset) -> Optional[SVG]: - """Parses SVG byte data into an svgelements.SVG object.""" - if not source.base_render_data: - logger.error("Source has no working_data to parse.") - return None - try: - svg_stream = io.BytesIO(source.base_render_data) - return SVG.parse(svg_stream, ppi=PPI) - except Exception as e: - logger.error(f"Failed to parse SVG for direct import: {e}") - return None - - def _get_pixel_dimensions(self, svg: SVG) -> Optional[Tuple[float, float]]: - """ - Extracts the pixel width and height from a parsed SVG object. - """ - if svg.width is None or svg.height is None: - return None - - width_px = svg.width.px if hasattr(svg.width, "px") else float(svg.width) - height_px = svg.height.px if hasattr(svg.height, "px") else float(svg.height) - - if width_px <= 1e-9 or height_px <= 1e-9: - return None - - msg = ( - "Normalizing vectors using final pixel dimensions from " - "svgelements: {width_px:.3f}px x {height_px:.3f}px" - ) - logger.debug(msg) - return width_px, height_px - - def _convert_svg_to_geometry( - self, svg: SVG, final_dims_mm: Tuple[float, float] - ) -> Geometry: - """ - Converts an SVG object into a Geometry object in pixel coordinates. - """ - geo = Geometry() - final_width_mm, final_height_mm = final_dims_mm - - # Calculate tolerance for curve flattening. - avg_dim = max(final_width_mm, final_height_mm, 1.0) - avg_scale = avg_dim / 960 # Assuming typical viewBox size - tolerance = 0.1 / avg_scale if avg_scale > 1e-9 else 0.1 - - for shape in svg.elements(): - try: - path = Path(shape) - path.reify() # Apply transforms - self._add_path_to_geometry(path, geo, tolerance) - except (AttributeError, TypeError): - continue # Skip non-shape elements like - return geo - def _add_path_to_geometry( - self, path: Path, geo: Geometry, tolerance: float - ) -> None: - """Converts a single Path object's segments to Geometry commands.""" - for seg in path: - # Use a local variable to help strict type checkers. - end = seg.end - if end is None or end.x is None or end.y is None: - continue - - if isinstance(seg, Move): - geo.move_to(float(end.x), float(end.y)) - elif isinstance(seg, Line): - geo.line_to(float(end.x), float(end.y)) - elif isinstance(seg, Close): - geo.close_path() - elif isinstance(seg, Arc): - self._add_arc_to_geometry(seg, geo) - elif isinstance(seg, (CubicBezier, QuadraticBezier)): - self._flatten_bezier_to_geometry(seg, geo, tolerance) - - def _add_arc_to_geometry(self, seg: Arc, geo: Geometry) -> None: - """Adds an Arc segment to the Geometry.""" - # Local variables help type checkers confirm non-None status. - start = seg.start - center = seg.center - end = seg.end - - if ( - start is None - or start.x is None - or start.y is None - or center is None - or center.x is None - or center.y is None - or end is None - or end.x is None - or end.y is None - ): - return - - start_x, start_y = float(start.x), float(start.y) - center_x, center_y = float(center.x), float(center.y) - - center_offset_x = center_x - start_x - center_offset_y = center_y - start_y - # Per SVG spec, sweep-flag=1 is positive-angle (clockwise). - # svgelements preserves this as sweep=1 and correctly flips it on - # transforms with negative determinants. - is_clockwise = bool(seg.sweep) - geo.arc_to( - float(end.x), - float(end.y), - center_offset_x, - center_offset_y, - clockwise=is_clockwise, + def create_source_asset(self, parse_result: ParsingResult): + raise NotImplementedError( + "SvgImporter is a facade; create_source_asset is delegated" ) - def _flatten_bezier_to_geometry( - self, - seg: Union[CubicBezier, QuadraticBezier], - geo: Geometry, - tolerance: float, - ) -> None: - """Flattens a Bezier curve into a series of lines in the Geometry.""" - # Use a local variable to help Pylance avoid 'Unbound' issues. - end = seg.end - - if end is None: - return - if end.x is None or end.y is None: - return - - length = seg.length() - end_x, end_y = float(end.x), float(end.y) - - # If the curve is very short, treat it as a straight line. - if length is None or length <= 1e-9: - geo.line_to(end_x, end_y) - return - - num_steps = max(2, int(length / tolerance)) - - for i in range(1, num_steps + 1): - t = i / num_steps - p = seg.point(t) - if p is not None and p.x is not None and p.y is not None: - geo.line_to(float(p.x), float(p.y)) - - def _normalize_geometry( - self, - geo: Geometry, - width_px: float, - height_px: float, - width_mm: float, - height_mm: float, - ) -> None: + def get_doc_items( + self, vectorization_spec: Optional[VectorizationSpec] = None + ) -> Optional[ImportResult]: """ - Scales geometry into a normalized, Y-down coordinate system. - - The geometry is first converted from pixel to millimeter space and - then normalized into a 0-1 box so that downstream consumers can apply - physical sizing via the workpiece transform without double-scaling. + Delegates the full import process to the appropriate strategy. """ - if ( - width_px <= 0 - or height_px <= 0 - or width_mm <= 0 - or height_mm <= 0 - ): - return - - scale_x = width_mm / width_px - scale_y = height_mm / height_px - geo.transform(Matrix.scale(scale_x, scale_y).to_4x4_numpy()) - - # Normalize to page coordinates (origin at 0,0; scale by page size). - if width_mm > 1e-9 and height_mm > 1e-9: - geo.transform( - Matrix.scale(1.0 / width_mm, 1.0 / height_mm).to_4x4_numpy() - ) + spec_to_use = vectorization_spec + if spec_to_use is None: + spec_to_use = PassthroughSpec() - def _create_workpiece( - self, - geo: Geometry, - source: SourceAsset, - width_mm: float, - height_mm: float, - ) -> WorkPiece: - """Creates and configures the final WorkPiece.""" - gen_config = SourceAssetSegment( - source_asset_uid=source.uid, - segment_mask_geometry=geo, - vectorization_spec=PassthroughSpec(), - ) - wp = WorkPiece( - name=self.source_file.stem, - source_segment=gen_config, - ) - wp.natural_width_mm = width_mm - wp.natural_height_mm = height_mm - wp.set_size(width_mm, height_mm) - wp.pos = (0, 0) - logger.info(f"Workpiece set size: {width_mm:.3f}mm x {height_mm:.3f}mm") - return wp + if isinstance(spec_to_use, TraceSpec): + logger.debug("SvgImporter: Delegating to SvgTraceImporter.") + delegate = SvgTraceImporter(self.raw_data, self.source_file) + else: + if ( + isinstance(spec_to_use, PassthroughSpec) + and not spec_to_use.active_layer_ids + ): + logger.debug( + "Empty PassthroughSpec detected in facade. " + "Scanning for all available layers." + ) + manifest = self.scan() + all_layer_ids = [layer.id for layer in manifest.layers] + if all_layer_ids: + logger.debug( + "Populating spec with all layers: %s", + all_layer_ids, + ) + spec_to_use = PassthroughSpec( + active_layer_ids=all_layer_ids, + create_new_layers=False, + ) + + logger.debug("SvgImporter: Delegating to SvgVectorImporter.") + delegate = SvgVectorImporter(self.raw_data, self.source_file) + + return delegate.get_doc_items(spec_to_use) diff --git a/rayforge/image/svg/svgutil.py b/rayforge/image/svg/svgutil.py index 9c7b8396..531902e9 100644 --- a/rayforge/image/svg/svgutil.py +++ b/rayforge/image/svg/svgutil.py @@ -1,5 +1,5 @@ import warnings -from typing import Tuple, Optional +from typing import Tuple, Optional, List, Dict, Any from xml.etree import ElementTree as ET with warnings.catch_warnings(): @@ -15,6 +15,80 @@ MM_PER_PX: float = 25.4 / PPI """Conversion factor for pixels to millimeters, based on 96 PPI.""" +INKSCAPE_NS = "http://www.inkscape.org/namespaces/inkscape" + + +def extract_layer_manifest(data: bytes) -> List[Dict[str, Any]]: + """ + Extracts layer metadata from an SVG. + + Returns a list of dicts containing: + - id: The layer group id + - name: The layer label + - count: Number of direct child elements in the layer + """ + if not data: + return [] + + try: + root = ET.fromstring(data) + except ET.ParseError: + return [] + + layers: List[Dict[str, Any]] = [] + layer_attr = f"{{{INKSCAPE_NS}}}groupmode" + label_attr = f"{{{INKSCAPE_NS}}}label" + + for elem in root.iter(): + if elem.get(layer_attr) != "layer": + continue + layer_id = elem.get("id") + if not layer_id: + continue + label = elem.get(label_attr) or layer_id + layers.append( + { + "id": layer_id, + "name": label, + "count": len(list(elem)), + } + ) + + return layers + + +def filter_svg_layers(data: bytes, visible_layer_ids: List[str]) -> bytes: + """ + Filters an SVG to only include the specified layer ids. + """ + if not data or not visible_layer_ids: + return data + + try: + root = ET.fromstring(data) + except ET.ParseError: + return data + + layer_attr = f"{{{INKSCAPE_NS}}}groupmode" + layer_groups = [ + elem for elem in root.iter() if elem.get(layer_attr) == "layer" + ] + if not layer_groups: + return data + + visible = set(visible_layer_ids) + for group in layer_groups: + layer_id = group.get("id") + if layer_id and layer_id not in visible: + parent = root + for parent in root.iter(): + if group in list(parent): + parent.remove(group) + break + + filtered = ET.tostring(root) + return filtered + def _get_margins_from_data( data: bytes, diff --git a/rayforge/version.txt b/rayforge/version.txt index 8faf1c27..40ecb480 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -0.26-68-g8e16bd0b +0.28.4-41-g3aad5579 diff --git a/scripts/mac_build.sh b/scripts/mac_build.sh index 47eff0f4..3fef62ed 100755 --- a/scripts/mac_build.sh +++ b/scripts/mac_build.sh @@ -53,7 +53,12 @@ trap cleanup EXIT python -m pip install --upgrade pip python -m pip install --upgrade build pyinstaller -python -m pip install -r requirements.txt +TMP_REQUIREMENTS=$(mktemp) +grep -v -i '^PyOpenGL_accelerate' requirements.txt > "$TMP_REQUIREMENTS" +python -m pip install -r "$TMP_REQUIREMENTS" +rm -f "$TMP_REQUIREMENTS" +python -m pip install PyOpenGL_accelerate==3.1.9 || \ + echo "PyOpenGL_accelerate install failed; continuing." bash scripts/update_translations.sh --compile-only @@ -63,7 +68,30 @@ echo "$VERSION" > rayforge/version.txt python -m build +if (( BUNDLE == 0 )) && [ -d "dist/Rayforge.app" ]; then + echo "Note: dist/Rayforge.app exists but was not rebuilt." >&2 + echo "Run ./scripts/mac_build.sh --bundle to refresh the app bundle." >&2 +fi + if (( BUNDLE == 1 )); then + python - <<'PY' +import os +import shutil +import stat +from pathlib import Path + +def _onerror(func, path, exc_info): + try: + os.chmod(path, stat.S_IWRITE | stat.S_IREAD | stat.S_IEXEC) + func(path) + except Exception: + pass + +for target in ("dist/Rayforge", "dist/Rayforge.app"): + path = Path(target) + if path.exists(): + shutil.rmtree(path, onerror=_onerror) +PY # Generate macOS icon if it doesn't exist or if SVG is newer if [ ! -f "rayforge/resources/icons/icon.icns" ] || \ [ "website/content/assets/icon.svg" -nt "rayforge/resources/icons/icon.icns" ]; then From 595ee7d2b73a5070214d911b8e59688fb56b1e8e Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Mon, 2 Feb 2026 18:31:40 +0100 Subject: [PATCH 17/34] update and fixes for version 1.0.1 --- Rayforge.spec | 15 ++++++- .../ui_gtk/canvas2d/elements/workpiece.py | 41 ++++++++++++------- rayforge/version.txt | 2 +- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/Rayforge.spec b/Rayforge.spec index d189f086..3a2998a6 100644 --- a/Rayforge.spec +++ b/Rayforge.spec @@ -1,12 +1,23 @@ # -*- mode: python ; coding: utf-8 -*- +from PyInstaller.utils.hooks import collect_submodules + +hiddenimports = ['gi._gi_cairo', 'cairosvg'] +hiddenimports += collect_submodules('rayforge.ui_gtk.canvas2d') +hiddenimports += collect_submodules('rayforge.ui_gtk.canvas2d.elements') +hiddenimports.append('rayforge.ui_gtk.canvas2d.elements.workpiece') + a = Analysis( ['rayforge/app.py'], pathex=['.'], binaries=[], - datas=[('rayforge/version.txt', 'rayforge'), ('rayforge/resources', 'rayforge/resources'), ('rayforge/locale', 'rayforge/locale')], - hiddenimports=['gi._gi_cairo', 'cairosvg'], + datas=[ + ('rayforge/version.txt', 'rayforge'), + ('rayforge/resources', 'rayforge/resources'), + ('rayforge/locale', 'rayforge/locale'), + ], + hiddenimports=hiddenimports, hookspath=['hooks'], hooksconfig={ 'gi': { diff --git a/rayforge/ui_gtk/canvas2d/elements/workpiece.py b/rayforge/ui_gtk/canvas2d/elements/workpiece.py index 9d88232f..5e50a3ea 100644 --- a/rayforge/ui_gtk/canvas2d/elements/workpiece.py +++ b/rayforge/ui_gtk/canvas2d/elements/workpiece.py @@ -1,5 +1,6 @@ import logging import math +from concurrent.futures import Future from typing import Optional, TYPE_CHECKING, Dict, Tuple, cast, List, Set, Any import cairo import numpy as np @@ -64,10 +65,16 @@ def __init__( self._base_image_visible = True self._surface: Optional[cairo.ImageSurface] = None + self._ops_surfaces: Dict[ + str, Optional[Tuple[cairo.ImageSurface, Tuple[float, ...]]] + ] = {} + self._ops_recordings: Dict[str, Optional[cairo.RecordingSurface]] = {} self._ops_visibility: Dict[str, bool] = {} + self._ops_render_futures: Dict[str, Future] = {} self._ops_generation_ids: Dict[ str, int ] = {} # Tracks the *expected* generation ID of the *next* render. + self._texture_surfaces: Dict[str, cairo.ImageSurface] = {} # Cached artifacts to avoid re-fetching from pipeline on every draw. self._artifact_cache: Dict[str, Optional[WorkPieceArtifact]] = {} @@ -182,6 +189,9 @@ def _hydrate_from_cache(self) -> bool: # Restore caches. We copy the dictionaries to avoid modification # issues, but the heavy objects (Surfaces) are shared references. self._surface = cache.get("surface") + self._ops_surfaces = cache.get("ops_surfaces", {}).copy() + self._ops_recordings = cache.get("ops_recordings", {}).copy() + self._texture_surfaces = cache.get("texture_surfaces", {}).copy() self._artifact_cache = cache.get("artifact_cache", {}).copy() self._ops_generation_ids = cache.get("ops_generation_ids", {}).copy() @@ -190,7 +200,11 @@ def _hydrate_from_cache(self) -> bool: # to manage across view lifecycles. # Consider hydrated if we have a base surface or artifacts - return self._surface is not None or len(self._artifact_cache) > 0 + return ( + self._surface is not None + or len(self._artifact_cache) > 0 + or len(self._ops_surfaces) > 0 + ) def _update_model_view_cache(self): """ @@ -198,6 +212,9 @@ def _update_model_view_cache(self): """ cache = self.data._view_cache cache["surface"] = self._surface + cache["ops_surfaces"] = self._ops_surfaces + cache["ops_recordings"] = self._ops_recordings + cache["texture_surfaces"] = self._texture_surfaces cache["artifact_cache"] = self._artifact_cache cache["ops_generation_ids"] = self._ops_generation_ids @@ -730,15 +747,6 @@ def _on_ops_generation_finished_main_thread( self._artifact_cache[step.uid] = artifact self._update_model_view_cache() -<<<<<<< HEAD - # Trigger a view render for this step if progressive rendering - # was not already done. If progressive rendering was used, the view - # artifact was already created and chunks were drawn to it during - # generation, so we don't need to re-render. - if step.uid not in self._steps_with_progressive_render: - self._request_view_render(step.uid, force=True) - self._steps_with_progressive_render.discard(step.uid) -======= if logger.isEnabledFor(logging.DEBUG) and artifact and artifact.vertex_data: v_data = artifact.vertex_data counts = ( @@ -790,13 +798,20 @@ def _on_ops_generation_finished_main_thread( f"POST-submit _prepare_texture_surface_async for '{step.uid}'" ) + # Trigger a view render for this step if progressive rendering + # was not already done. If progressive rendering was used, the view + # artifact was already created and chunks were drawn to it during + # generation, so we don't need to re-render. + if step.uid not in self._steps_with_progressive_render: + self._request_view_render(step.uid, force=True) + self._steps_with_progressive_render.discard(step.uid) + if self.canvas: self.canvas.queue_draw() logger.debug( f"END _on_ops_generation_finished_main_thread for " f"step '{sender.uid}'" ) - def _prepare_texture_surface_async( self, step_uid: str, artifact: WorkPieceArtifact ) -> Optional[Tuple[str, cairo.ImageSurface]]: @@ -855,7 +870,6 @@ def _on_texture_surface_prepared_main_thread(self, future: Future): step_uid, texture_surface = result self._texture_surfaces[step_uid] = texture_surface self._update_model_view_cache() ->>>>>>> 6f2cbbcf (trace all objects (paths) independently even if they are overlapped) if self.canvas: self.canvas.queue_draw() @@ -939,8 +953,6 @@ def _draw_vertices_to_context( ctx.stroke() ctx.restore() -<<<<<<< HEAD -======= def _record_ops_drawing_async( self, step: Step, generation_id: int ) -> Optional[Tuple[str, cairo.RecordingSurface, int]]: @@ -1448,7 +1460,6 @@ def _on_ops_surface_rendered_main_thread(self, future: Future): # This call is now safe because we are on the main thread. self.canvas.queue_draw() ->>>>>>> 6f2cbbcf (trace all objects (paths) independently even if they are overlapped) def render_to_surface( self, width: int, height: int ) -> Optional[cairo.ImageSurface]: diff --git a/rayforge/version.txt b/rayforge/version.txt index 40ecb480..f559f44c 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -0.28.4-41-g3aad5579 +1.0.1-28-gd9c403f6 From cec457c996966d096386f8b6031bb6bb00428e7f Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Tue, 3 Feb 2026 17:15:58 +0100 Subject: [PATCH 18/34] add missing dependencies in the bundle --- scripts/mac_build.sh | 129 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 125 insertions(+), 4 deletions(-) diff --git a/scripts/mac_build.sh b/scripts/mac_build.sh index 3fef62ed..14b8c1b3 100755 --- a/scripts/mac_build.sh +++ b/scripts/mac_build.sh @@ -112,6 +112,18 @@ PY # Remove conflicting libiconv bundled by cv2. rm -f "$FW_DIR/libiconv.2.dylib" + BREW_PREFIX="" + if command -v brew >/dev/null 2>&1; then + BREW_PREFIX=$(brew --prefix) + fi + if [ -z "$BREW_PREFIX" ]; then + if [ -d "/opt/homebrew" ]; then + BREW_PREFIX="/opt/homebrew" + else + BREW_PREFIX="/usr/local" + fi + fi + # Ship critical libs from Homebrew and fix their IDs. for lib in \ libpng16.16.dylib \ @@ -119,21 +131,111 @@ PY libfreetype.6.dylib \ libintl.8.dylib \ libvips.42.dylib \ - libvips-cpp.42.dylib + libvips-cpp.42.dylib \ + libOpenEXR-3_4.33.dylib \ + libImath-3_2.30.dylib \ + libarchive.13.dylib \ + libcfitsio.10.dylib \ + libexif.12.dylib \ + libfftw3.3.dylib \ + libhwy.1.dylib \ + libopenjp2.7.dylib do - if [ -f "/usr/local/lib/$lib" ]; then + if [ -f "$BREW_PREFIX/lib/$lib" ]; then rm -f "$FW_DIR/$lib" - cp "/usr/local/lib/$lib" "$FW_DIR/" + cp "$BREW_PREFIX/lib/$lib" "$FW_DIR/" install_name_tool -id "@rpath/$lib" "$FW_DIR/$lib" fi done + if [ ! -f "$FW_DIR/libpng16.16.dylib" ]; then + for lib_dir in \ + "$BREW_PREFIX/opt/libpng/lib" \ + "/usr/local/opt/libpng/lib" \ + "/opt/homebrew/opt/libpng/lib" + do + if [ -f "$lib_dir/libpng16.16.dylib" ]; then + rm -f "$FW_DIR/libpng16.16.dylib" + cp "$lib_dir/libpng16.16.dylib" "$FW_DIR/" + install_name_tool -id "@rpath/libpng16.16.dylib" \ + "$FW_DIR/libpng16.16.dylib" + break + fi + done + fi + if [ ! -f "$FW_DIR/libarchive.13.dylib" ]; then + for lib_dir in \ + "$BREW_PREFIX/opt/libarchive/lib" \ + "/usr/local/opt/libarchive/lib" \ + "/opt/homebrew/opt/libarchive/lib" + do + if [ -f "$lib_dir/libarchive.13.dylib" ]; then + rm -f "$FW_DIR/libarchive.13.dylib" + cp "$lib_dir/libarchive.13.dylib" "$FW_DIR/" + install_name_tool -id "@rpath/libarchive.13.dylib" \ + "$FW_DIR/libarchive.13.dylib" + break + fi + done + fi + + copy_missing_deps() { + local changed=0 + local dep + local libname + local candidate + local search_dirs=("$BREW_PREFIX/lib" "/usr/local/lib" "/opt/homebrew/lib") + + while read -r dep; do + libname=$(basename "$dep") + if [ -f "$FW_DIR/$libname" ]; then + continue + fi + candidate="" + for base in "${search_dirs[@]}"; do + if [ -f "$base/$libname" ]; then + candidate="$base/$libname" + break + fi + done + if [ -z "$candidate" ]; then + for base in "$BREW_PREFIX/opt" "/usr/local/opt" "/opt/homebrew/opt"; do + if [ -d "$base" ]; then + for opt_lib in "$base"/*/lib; do + if [ -f "$opt_lib/$libname" ]; then + candidate="$opt_lib/$libname" + break + fi + done + fi + if [ -n "$candidate" ]; then + break + fi + done + fi + if [ -n "$candidate" ]; then + rm -f "$FW_DIR/$libname" + cp "$candidate" "$FW_DIR/" + install_name_tool -id "@rpath/$libname" \ + "$FW_DIR/$libname" + changed=1 + fi + done < <(otool -L "$BIN_DIR/Rayforge" "$FW_DIR"/*.dylib 2>/dev/null | \ + awk '{print $1}' | grep -E '^/usr/local/|^/opt/homebrew/' | sort -u) + + return $changed + } + + # Iteratively pull in any Homebrew deps referenced by bundled binaries. + for _ in 1 2 3; do + copy_missing_deps || break + done # Fix all library references to use @rpath instead of absolute paths echo "Fixing library references..." for dylib in "$FW_DIR"/*.dylib; do [ -f "$dylib" ] || continue # Get all dependencies - otool -L "$dylib" | grep '/usr/local/' | awk '{print $1}' | while read dep; do + otool -L "$dylib" | grep -E '/usr/local/|/opt/homebrew/' | awk '{print $1}' | while read dep; do libname=$(basename "$dep") # Only rewrite if we've bundled this library if [ -f "$FW_DIR/$libname" ]; then @@ -142,6 +244,25 @@ PY done done + # Force libpng references to @rpath to avoid runtime lookups in Homebrew. + for target in "$FW_DIR"/*.dylib "$BIN_DIR/Rayforge.bin"; do + [ -f "$target" ] || continue + otool -L "$target" | awk '{print $1}' | \ + grep -E '/opt/homebrew/opt/libpng/|/usr/local/opt/libpng/' | \ + while read dep; do + install_name_tool -change "$dep" "@rpath/libpng16.16.dylib" \ + "$target" 2>/dev/null || true + done + done + if [ -f "$FW_DIR/libfreetype.6.dylib" ]; then + otool -L "$FW_DIR/libfreetype.6.dylib" | awk '{print $1}' | \ + grep -E '/opt/homebrew/opt/libpng/|/usr/local/opt/libpng/' | \ + while read dep; do + install_name_tool -change "$dep" "@rpath/libpng16.16.dylib" \ + "$FW_DIR/libfreetype.6.dylib" 2>/dev/null || true + done + fi + # Refresh cv2 dylib symlinks to the parent copies. if [ -d "$FW_DIR/cv2/__dot__dylibs" ]; then pushd "$FW_DIR/cv2/__dot__dylibs" >/dev/null From 623ccb3c84c6a19ecdbed53c6303ba574cfe3210 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Tue, 3 Feb 2026 17:16:26 +0100 Subject: [PATCH 19/34] fix calculating cutting paths --- rayforge/image/sketch/renderer.py | 35 ++++++++++++++++++++++++++++--- rayforge/worker_init.py | 20 ++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/rayforge/image/sketch/renderer.py b/rayforge/image/sketch/renderer.py index 7ecc340c..f5cd8687 100644 --- a/rayforge/image/sketch/renderer.py +++ b/rayforge/image/sketch/renderer.py @@ -222,9 +222,38 @@ def render_base_image( svg_string = "".join(svg_parts) try: - # Use svgload_buffer which is highly optimized - image = pyvips.Image.svgload_buffer(svg_string.encode("utf-8")) - return image + try: + import cairosvg + + png_bytes = cairosvg.svg2png( + bytestring=svg_string.encode("utf-8"), + output_width=width, + output_height=height, + ) + return pyvips.Image.pngload_buffer( + png_bytes, access=pyvips.Access.RANDOM + ) + except ImportError: + logger.error("CairoSVG is not available for sketch rendering.") + except (pyvips.Error, ValueError, TypeError, Exception) as e: + logger.error( + "CairoSVG fallback failed to render sketch SVG: %s", + e, + exc_info=True, + ) + + try: + svg_loader = getattr(pyvips.Image, "svgload_buffer") + except AttributeError: + svg_loader = None + + if svg_loader: + return svg_loader(svg_string.encode("utf-8")) + + logger.error( + "No SVG renderer succeeded for sketch " + "(CairoSVG/libvips unavailable)." + ) except pyvips.Error as e: logger.error(f"Failed to render sketch SVG with Vips: {e}") logger.debug(f"Failed SVG content:\n{svg_string}") diff --git a/rayforge/worker_init.py b/rayforge/worker_init.py index 79d67bf5..efca70fc 100644 --- a/rayforge/worker_init.py +++ b/rayforge/worker_init.py @@ -1,5 +1,8 @@ import builtins import logging +import os +import sys +from pathlib import Path def initialize_worker(): @@ -14,6 +17,23 @@ def initialize_worker(): if not hasattr(builtins, "_"): setattr(builtins, "_", lambda s: s) + if hasattr(sys, "_MEIPASS"): + frameworks_dir = Path(sys._MEIPASS).parent / "Frameworks" + lib_path = str(frameworks_dir) + existing_dyld = os.environ.get("DYLD_LIBRARY_PATH") + os.environ["DYLD_LIBRARY_PATH"] = ( + lib_path if not existing_dyld else f"{lib_path}:{existing_dyld}" + ) + os.environ.setdefault("DYLD_FALLBACK_LIBRARY_PATH", lib_path) + bundled_typelibs = frameworks_dir / "gi_typelibs" + if bundled_typelibs.exists(): + os.environ["GI_TYPELIB_PATH"] = str(bundled_typelibs.resolve()) + bundled_gio_modules = frameworks_dir / "gio_modules" + if bundled_gio_modules.exists(): + os.environ.setdefault( + "GIO_EXTRA_MODULES", str(bundled_gio_modules) + ) + logging.getLogger(__name__).debug( "Worker process initialized successfully." ) From ea6e1afe80abfff151311ffc717661962e8b8f0e Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Tue, 3 Feb 2026 17:33:34 +0100 Subject: [PATCH 20/34] fix preview paths --- .../ui_gtk/canvas2d/elements/workpiece.py | 26 ++++++++++++++++--- rayforge/version.txt | 2 +- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/rayforge/ui_gtk/canvas2d/elements/workpiece.py b/rayforge/ui_gtk/canvas2d/elements/workpiece.py index 5e50a3ea..2188b9f3 100644 --- a/rayforge/ui_gtk/canvas2d/elements/workpiece.py +++ b/rayforge/ui_gtk/canvas2d/elements/workpiece.py @@ -246,7 +246,7 @@ def trigger_view_update(self): # 1. Invalidate the base image buffer. self._surface = None - # 2. Invalidate only the rasterized ops surfaces, not the recordings. + self._ops_recordings.clear() # Note: We do NOT clear the model cache here, as view updates # (like zooming) shouldn't erase the persistent data needed by @@ -880,6 +880,7 @@ def _draw_vertices_to_context( ctx: cairo.Context, scale: Tuple[float, float], drawable_height: float, + line_width: Optional[float] = None, ): """ Draws vertex data to a Cairo context, handling scaling, theming, @@ -890,10 +891,18 @@ def _draw_vertices_to_context( work_surface = cast("WorkSurface", self.canvas) show_travel = work_surface.show_travel_moves + view_ppm_x, view_ppm_y = work_surface.get_view_scale() + line_width_mm = None + if view_ppm_x > 1e-9 and view_ppm_y > 1e-9: + line_width_mm = 1.0 / max(view_ppm_x, view_ppm_y) scale_x, scale_y = scale ctx.save() - ctx.set_hairline(True) + if line_width is None: + ctx.set_hairline(True) + else: + ctx.set_hairline(False) + ctx.set_line_width(line_width) ctx.set_line_cap(cairo.LINE_CAP_SQUARE) # --- Draw Travel & Zero-Power Moves --- @@ -1023,7 +1032,11 @@ def _record_ops_drawing_async( # relative to the content we are drawing. drawable_height_mm = union_y2 + union_y1 self._draw_vertices_to_context( - artifact.vertex_data, ctx, (1.0, 1.0), drawable_height_mm + artifact.vertex_data, + ctx, + (1.0, 1.0), + drawable_height_mm, + line_width=line_width_mm, ) return step.uid, surface, generation_id @@ -1212,7 +1225,11 @@ def _rasterize_ops_surface_async( # Y-flip height must be workpiece height in pixels. drawable_h_px = world_h * encoder_ppm_y self._draw_vertices_to_context( - artifact.vertex_data, ctx, ppms, drawable_h_px + artifact.vertex_data, + ctx, + ppms, + drawable_h_px, + line_width=1.0, ) return step_uid, surface, generation_id, bbox_mm @@ -1329,6 +1346,7 @@ def _encode_chunk_async( ctx, ppms, content_h_px, + line_width=1.0, ) finally: # IMPORTANT: Release the handle in the subprocess to free memory diff --git a/rayforge/version.txt b/rayforge/version.txt index f559f44c..596547b4 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -1.0.1-28-gd9c403f6 +1.0.1-31-gad92cc03 From 9f9dd12fbaefd10203d029bdc491282455f1ef32 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Wed, 4 Feb 2026 09:55:48 +0100 Subject: [PATCH 21/34] improve layer preview --- .../ui_gtk/canvas2d/elements/workpiece.py | 51 +++++++++++++++++-- rayforge/version.txt | 2 +- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/rayforge/ui_gtk/canvas2d/elements/workpiece.py b/rayforge/ui_gtk/canvas2d/elements/workpiece.py index 2188b9f3..aa451968 100644 --- a/rayforge/ui_gtk/canvas2d/elements/workpiece.py +++ b/rayforge/ui_gtk/canvas2d/elements/workpiece.py @@ -246,8 +246,6 @@ def trigger_view_update(self): # 1. Invalidate the base image buffer. self._surface = None - self._ops_recordings.clear() - # Note: We do NOT clear the model cache here, as view updates # (like zooming) shouldn't erase the persistent data needed by # other views or future rebuilds. @@ -1504,8 +1502,8 @@ def draw(self, ctx: cairo.Context): return if self.data.layer and self.data.layer.workflow: - # Draw the new progressive bitmaps if available (Phase 4) - self._draw_progressive_views(ctx) + # Draw vector overlay lines with device-stable thickness + self._draw_vector_overlay(ctx) def _draw_progressive_views(self, ctx: cairo.Context): """ @@ -1593,6 +1591,51 @@ def _draw_progressive_views(self, ctx: cairo.Context): ctx.restore() + def _draw_vector_overlay(self, ctx: cairo.Context): + """ + Draws vector ops directly at the current zoom with constant pixel + thickness. This avoids re-recording on zoom changes. + """ + if ( + not self.canvas + or not self.data.layer + or not self.data.layer.workflow + ): + return + + self._resolve_colors_if_needed() + if not self._color_set: + return + + world_w, world_h = self.data.size + if world_w <= 1e-9 or world_h <= 1e-9: + return + + work_surface = cast("WorkSurface", self.canvas) + view_ppm_x, view_ppm_y = work_surface.get_view_scale() + if view_ppm_x <= 1e-9 or view_ppm_y <= 1e-9: + return + + line_width_norm = 1.0 / max( + view_ppm_x * world_w, view_ppm_y * world_h + ) + + ctx.save() + for step in self.data.layer.workflow.steps: + if not self._ops_visibility.get(step.uid, True): + continue + artifact = self._artifact_cache.get(step.uid) + if not artifact or not artifact.vertex_data: + continue + self._draw_vertices_to_context( + artifact.vertex_data, + ctx, + (1.0 / world_w, -1.0 / world_h), + 0.0, + line_width=line_width_norm, + ) + ctx.restore() + def push_transform_to_model(self): """Updates the data model's matrix with the view's transform.""" if self.data.matrix != self.transform: diff --git a/rayforge/version.txt b/rayforge/version.txt index 596547b4..a421b7a5 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -1.0.1-31-gad92cc03 +1.0.1-32-g9bda3cb8 From 33a155ecb4e838ce8d55521611cb8bea1efd43fa Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Wed, 4 Feb 2026 12:51:18 +0100 Subject: [PATCH 22/34] tweak "preview gcode" --- .../canvas2d/elements/simulation_overlay.py | 53 ++++++++++++++----- rayforge/version.txt | 2 +- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/rayforge/ui_gtk/canvas2d/elements/simulation_overlay.py b/rayforge/ui_gtk/canvas2d/elements/simulation_overlay.py index 1191a297..eff33d2b 100644 --- a/rayforge/ui_gtk/canvas2d/elements/simulation_overlay.py +++ b/rayforge/ui_gtk/canvas2d/elements/simulation_overlay.py @@ -201,10 +201,11 @@ def draw(self, ctx: cairo.Context): return min_speed, max_speed = self.timeline.speed_range + line_width = self._get_line_width_mm() # Draw each operation with heatmap color and power transparency for cmd, state, start_pos in steps: - ctx.set_line_width(0.2) + ctx.set_line_width(line_width) ctx.set_dash([]) if cmd.is_travel_command(): @@ -233,7 +234,7 @@ def draw(self, ctx: cairo.Context): ctx.line_to(seg_end[0], seg_end[1]) ctx.stroke() elif isinstance(cmd, ScanLinePowerCommand): - self._draw_scanline(ctx, cmd, start_pos, state) + self._draw_scanline(ctx, cmd, start_pos, state, line_width) elif cmd.end: # This handles LineToCommand ctx.move_to(start_pos[0], start_pos[1]) ctx.line_to(cmd.end[0], cmd.end[1]) @@ -242,7 +243,7 @@ def draw(self, ctx: cairo.Context): # Draw laser head position indicator current_pos = self.get_current_position() if current_pos: - self._draw_laser_head(ctx, current_pos) + self._draw_laser_head(ctx, current_pos, line_width) def _draw_scanline( self, @@ -250,6 +251,7 @@ def _draw_scanline( cmd: ScanLinePowerCommand, start_pos: tuple, state: State, + line_width: float, ): """Draws a ScanLinePowerCommand as a series of colored segments.""" if cmd.end is None: @@ -278,35 +280,60 @@ def _draw_scanline( seg_end_pt = p_start + t_end * line_vec ctx.set_source_rgba(r, g, b, alpha) + ctx.set_line_width(line_width) ctx.move_to(seg_start_pt[0], seg_start_pt[1]) ctx.line_to(seg_end_pt[0], seg_end_pt[1]) ctx.stroke() - def _draw_laser_head(self, ctx: cairo.Context, pos: Tuple[float, float]): + def _draw_laser_head( + self, + ctx: cairo.Context, + pos: Tuple[float, float], + line_width: float, + ): """Draws the laser head indicator at the given position in mm.""" x, y = pos # Draw a crosshair with circle ctx.set_source_rgba(1.0, 0.0, 0.0, 0.8) # Red with transparency - ctx.set_line_width(0.2) + ctx.set_line_width(line_width) + + radius = self._get_px_to_mm(9.0) + arm = self._get_px_to_mm(18.0) + dot = self._get_px_to_mm(1.5) - # Circle (3mm radius) - ctx.arc(x, y, 3.0, 0, 2 * 3.14159) + ctx.arc(x, y, radius, 0, 2 * 3.14159) ctx.stroke() - # Crosshair lines (6mm each direction) - ctx.move_to(x - 6.0, y) - ctx.line_to(x + 6.0, y) + ctx.move_to(x - arm, y) + ctx.line_to(x + arm, y) ctx.stroke() - ctx.move_to(x, y - 6.0) - ctx.line_to(x, y + 6.0) + ctx.move_to(x, y - arm) + ctx.line_to(x, y + arm) ctx.stroke() # Center dot - ctx.arc(x, y, 0.5, 0, 2 * 3.14159) + ctx.arc(x, y, dot, 0, 2 * 3.14159) ctx.fill() + def _get_line_width_mm(self) -> float: + if not self.canvas: + return 0.2 + view_ppm_x, view_ppm_y = self.canvas.get_view_scale() + if view_ppm_x <= 1e-9 or view_ppm_y <= 1e-9: + return 0.2 + return 2.0 / max(view_ppm_x, view_ppm_y) + + def _get_px_to_mm(self, px: float) -> float: + if not self.canvas: + return px + view_ppm_x, view_ppm_y = self.canvas.get_view_scale() + ppm = max(view_ppm_x, view_ppm_y) + if ppm <= 1e-9: + return px + return px / ppm + def draw_overlay(self, ctx: cairo.Context): """ Draws overlay elements in pixel space (after view transform). diff --git a/rayforge/version.txt b/rayforge/version.txt index a421b7a5..a51e5da1 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -1.0.1-32-g9bda3cb8 +1.0.1-33-ge585dfbf From ab24aa4e5fe859f00407199d5649f793ff96e9ce Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Wed, 4 Feb 2026 14:24:12 +0100 Subject: [PATCH 23/34] use thread-based workpiece generation in bundle --- rayforge/pipeline/stage/job_stage.py | 43 +++++++---- rayforge/pipeline/stage/step_stage.py | 64 +++++++++++------ rayforge/pipeline/stage/workpiece_stage.py | 64 +++++++++++------ rayforge/shared/tasker/manager.py | 83 ++++++++++++++++++++++ rayforge/version.txt | 2 +- 5 files changed, 200 insertions(+), 56 deletions(-) diff --git a/rayforge/pipeline/stage/job_stage.py b/rayforge/pipeline/stage/job_stage.py index 7fbadfcf..ab6ebec1 100644 --- a/rayforge/pipeline/stage/job_stage.py +++ b/rayforge/pipeline/stage/job_stage.py @@ -1,5 +1,7 @@ from __future__ import annotations import logging +import sys +import threading from typing import TYPE_CHECKING, Optional, Callable from blinker import Signal import multiprocessing as mp @@ -113,9 +115,12 @@ def generate_job(self, doc: "Doc", on_done: Optional[Callable] = None): self._artifact_manager.invalidate_for_job() - # Create an adoption event for the handshake protocol - manager = mp.Manager() - self._adoption_event = manager.Event() + use_thread = sys.platform == "darwin" and hasattr(sys, "_MEIPASS") + if use_thread: + self._adoption_event = threading.Event() + else: + manager = mp.Manager() + self._adoption_event = manager.Event() job_desc = JobDescription( step_artifact_handles_by_uid=step_handles, @@ -176,16 +181,28 @@ def when_done_callback(task: "Task"): ) # We no longer need _on_job_assembly_complete - task = self._task_manager.run_process( - make_job_artifact_in_subprocess, - self._artifact_manager._store, - job_description_dict=job_desc.__dict__, - creator_tag="job", - key=JobKey, - when_done=when_done_callback, - when_event=self._on_job_task_event, - adoption_event=self._adoption_event, - ) + if use_thread: + task = self._task_manager.run_thread_with_proxy( + make_job_artifact_in_subprocess, + self._artifact_manager._store, + job_description_dict=job_desc.__dict__, + creator_tag="job", + key=JobKey, + when_done=when_done_callback, + when_event=self._on_job_task_event, + adoption_event=self._adoption_event, + ) + else: + task = self._task_manager.run_process( + make_job_artifact_in_subprocess, + self._artifact_manager._store, + job_description_dict=job_desc.__dict__, + creator_tag="job", + key=JobKey, + when_done=when_done_callback, + when_event=self._on_job_task_event, + adoption_event=self._adoption_event, + ) self._active_task = task def _on_job_task_event(self, task: "Task", event_name: str, data: dict): diff --git a/rayforge/pipeline/stage/step_stage.py b/rayforge/pipeline/stage/step_stage.py index 2159584b..d85535f9 100644 --- a/rayforge/pipeline/stage/step_stage.py +++ b/rayforge/pipeline/stage/step_stage.py @@ -1,6 +1,8 @@ from __future__ import annotations import logging import math +import sys +import threading from typing import TYPE_CHECKING, Dict, Optional import multiprocessing as mp from contextlib import ExitStack @@ -12,7 +14,6 @@ from .base import PipelineStage if TYPE_CHECKING: - import threading from ...core.doc import Doc from ...core.step import Step from ...machine.models.machine import Machine @@ -205,29 +206,48 @@ def when_done_callback(task: "Task"): def when_event_callback(task: "Task", event_name: str, data: dict): self._on_task_event(task, event_name, data, step) - # Create an adoption event for the handshake protocol - # Use Manager to create a picklable Event that can be passed - # through queues - manager = mp.Manager() - adoption_event = manager.Event() + use_thread = sys.platform == "darwin" and hasattr(sys, "_MEIPASS") + if use_thread: + adoption_event = threading.Event() + else: + manager = mp.Manager() + adoption_event = manager.Event() self._adoption_events[step.uid] = adoption_event - task = self._task_manager.run_process( - make_step_artifact_in_subprocess, - self._artifact_manager._store, - assembly_info, - step.uid, - generation_id, - step.per_step_transformers_dicts, - machine.max_cut_speed, - machine.max_travel_speed, - machine.acceleration, - "step", - adoption_event=adoption_event, - key=step.uid, - when_done=when_done_callback, - when_event=when_event_callback, # Connect event listener - ) + if use_thread: + task = self._task_manager.run_thread_with_proxy( + make_step_artifact_in_subprocess, + self._artifact_manager._store, + assembly_info, + step.uid, + generation_id, + step.per_step_transformers_dicts, + machine.max_cut_speed, + machine.max_travel_speed, + machine.acceleration, + "step", + adoption_event=adoption_event, + key=step.uid, + when_done=when_done_callback, + when_event=when_event_callback, + ) + else: + task = self._task_manager.run_process( + make_step_artifact_in_subprocess, + self._artifact_manager._store, + assembly_info, + step.uid, + generation_id, + step.per_step_transformers_dicts, + machine.max_cut_speed, + machine.max_travel_speed, + machine.acceleration, + "step", + adoption_event=adoption_event, + key=step.uid, + when_done=when_done_callback, + when_event=when_event_callback, # Connect event listener + ) self._active_tasks[step.uid] = task def _on_task_event( diff --git a/rayforge/pipeline/stage/workpiece_stage.py b/rayforge/pipeline/stage/workpiece_stage.py index e4da9f56..fdf54459 100644 --- a/rayforge/pipeline/stage/workpiece_stage.py +++ b/rayforge/pipeline/stage/workpiece_stage.py @@ -2,6 +2,8 @@ import logging import math import multiprocessing as mp +import sys +import threading from typing import TYPE_CHECKING, Dict, Tuple, Optional from blinker import Signal from copy import deepcopy @@ -229,28 +231,50 @@ def when_done_callback(task: "Task"): world_workpiece = workpiece.in_world() workpiece_dict = world_workpiece.to_dict() - # Create an adoption event for the handshake protocol - manager = mp.Manager() - adoption_event = manager.Event() + use_thread = sys.platform == "darwin" and hasattr(sys, "_MEIPASS") + if use_thread: + adoption_event = threading.Event() + else: + manager = mp.Manager() + adoption_event = manager.Event() self._adoption_events[key] = adoption_event - task = self._task_manager.run_process( - make_workpiece_artifact_in_subprocess, - self._artifact_manager._store, - workpiece_dict, - step.opsproducer_dict, - step.modifiers_dicts, - step.per_workpiece_transformers_dicts, - selected_laser.to_dict(), - settings, - generation_id, - workpiece.size, - "workpiece", - adoption_event=adoption_event, - key=key, - when_done=when_done_callback, - when_event=self._on_task_event_received, - ) + if use_thread: + task = self._task_manager.run_thread_with_proxy( + make_workpiece_artifact_in_subprocess, + self._artifact_manager._store, + workpiece_dict, + step.opsproducer_dict, + step.modifiers_dicts, + step.per_workpiece_transformers_dicts, + selected_laser.to_dict(), + settings, + generation_id, + workpiece.size, + "workpiece", + adoption_event=adoption_event, + key=key, + when_done=when_done_callback, + when_event=self._on_task_event_received, + ) + else: + task = self._task_manager.run_process( + make_workpiece_artifact_in_subprocess, + self._artifact_manager._store, + workpiece_dict, + step.opsproducer_dict, + step.modifiers_dicts, + step.per_workpiece_transformers_dicts, + selected_laser.to_dict(), + settings, + generation_id, + workpiece.size, + "workpiece", + adoption_event=adoption_event, + key=key, + when_done=when_done_callback, + when_event=self._on_task_event_received, + ) self._active_tasks[key] = task def _on_task_event_received( diff --git a/rayforge/shared/tasker/manager.py b/rayforge/shared/tasker/manager.py index 383876ef..ea711aae 100644 --- a/rayforge/shared/tasker/manager.py +++ b/rayforge/shared/tasker/manager.py @@ -17,6 +17,7 @@ from blinker import Signal from ..util.glib import idle_add from .context import ExecutionContext +from .proxy import BaseExecutionContext from .task import Task from .pool import WorkerPoolManager @@ -24,6 +25,57 @@ logger = logging.getLogger(__name__) +class ThreadExecutionProxy(BaseExecutionContext): + def __init__( + self, + context: ExecutionContext, + event_callback: Optional[Callable[[str, dict], None]] = None, + base_progress: float = 0.0, + progress_range: float = 1.0, + total: float = 1.0, + ): + super().__init__( + base_progress=base_progress, + progress_range=progress_range, + total=total, + ) + self._context = context + self._event_callback = event_callback + + def _report_normalized_progress(self, progress: float): + progress = max(0.0, min(1.0, progress)) + scaled_progress = self._base + (progress * self._range) + self._context.set_progress(scaled_progress) + + def set_message(self, message: str): + self._context.set_message(message) + + def send_event(self, name: str, data: Optional[dict] = None): + if self._event_callback is not None: + self._event_callback(name, data if data is not None else {}) + + def _create_sub_context( + self, + base_progress: float, + progress_range: float, + total: float, + **kwargs, + ) -> "ThreadExecutionProxy": + return ThreadExecutionProxy( + self._context, + event_callback=self._event_callback, + base_progress=base_progress, + progress_range=progress_range, + total=total, + ) + + def is_cancelled(self) -> bool: + return self._context.is_cancelled() + + def flush(self): + self._context.flush() + + class TaskManager: def __init__( self, @@ -201,6 +253,37 @@ async def thread_wrapper( self.add_task(task) return task + def run_thread_with_proxy( + self, + func: Callable[..., Any], + *args: Any, + key: Optional[Any] = None, + when_done: Optional[Callable[[Task], None]] = None, + when_event: Optional[Callable[[Task, str, dict], None]] = None, + **kwargs: Any, + ) -> Task: + async def thread_wrapper( + context: ExecutionContext, *args: Any, **kwargs: Any + ) -> Any: + task = context.task + + def send_event(name: str, data: dict): + if when_event and task is not None: + self.schedule_on_main_thread( + when_event, task, name, data + ) + + proxy = ThreadExecutionProxy(context, event_callback=send_event) + bound_func = lambda: func(proxy, *args, **kwargs) + result = await self.run_in_executor(bound_func) + return result + + task = Task( + thread_wrapper, *args, key=key, when_done=when_done, **kwargs + ) + self.add_task(task) + return task + def run_process( self, func: Callable[..., Any], diff --git a/rayforge/version.txt b/rayforge/version.txt index a51e5da1..59c7ef3d 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -1.0.1-33-ge585dfbf +1.0.1-34-g1b061989 From b4221e1e6d71471cd1b4d0379c6043dcb72462e4 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Wed, 4 Feb 2026 17:49:07 +0100 Subject: [PATCH 24/34] various macos bundle fixes --- rayforge/pipeline/artifact/manager.py | 3 +- rayforge/pipeline/artifact/store.py | 38 +++++++++++++---- rayforge/pipeline/stage/job_stage.py | 9 ++-- rayforge/pipeline/stage/step_stage.py | 17 ++++++-- rayforge/pipeline/stage/workpiece_stage.py | 17 ++++++-- .../pipeline/stage/workpiece_view_stage.py | 42 ++++++++++++++----- rayforge/version.txt | 2 +- 7 files changed, 96 insertions(+), 32 deletions(-) diff --git a/rayforge/pipeline/artifact/manager.py b/rayforge/pipeline/artifact/manager.py index 0c776bf7..fc66266f 100644 --- a/rayforge/pipeline/artifact/manager.py +++ b/rayforge/pipeline/artifact/manager.py @@ -110,6 +110,7 @@ def adopt_artifact( self, key: Union[WorkPieceKey, StepKey, JobKey], handle_dict: Dict[str, Any], + in_process: bool = False, ) -> BaseArtifactHandle: """ Adopts an artifact from a subprocess and deserializes the handle. @@ -127,7 +128,7 @@ def adopt_artifact( The adopted, deserialized handle. """ handle = create_handle_from_dict(handle_dict) - self._store.adopt(handle) + self._store.adopt(handle, increment_refcount=not in_process) return handle def retain_handle(self, handle: BaseArtifactHandle): diff --git a/rayforge/pipeline/artifact/store.py b/rayforge/pipeline/artifact/store.py index d85e403e..472df760 100644 --- a/rayforge/pipeline/artifact/store.py +++ b/rayforge/pipeline/artifact/store.py @@ -33,9 +33,11 @@ def __init__(self): def shutdown(self): for shm_name in list(self._managed_shms.keys()): - self._release_by_name(shm_name) + self._force_release_by_name(shm_name) - def adopt(self, handle: BaseArtifactHandle) -> None: + def adopt( + self, handle: BaseArtifactHandle, increment_refcount: bool = True + ) -> None: """ Takes ownership of a shared memory block created by another process. @@ -51,12 +53,15 @@ def adopt(self, handle: BaseArtifactHandle) -> None: """ shm_name = handle.shm_name if shm_name in self._managed_shms: - # Increment refcount for already-managed block - self._refcounts[shm_name] = self._refcounts.get(shm_name, 1) + 1 - logger.debug( - f"Shared memory block {shm_name} refcount incremented to " - f"{self._refcounts[shm_name]}" - ) + if increment_refcount: + # Increment refcount for already-managed block + self._refcounts[shm_name] = ( + self._refcounts.get(shm_name, 1) + 1 + ) + logger.debug( + f"Shared memory block {shm_name} refcount incremented to " + f"{self._refcounts[shm_name]}" + ) return try: @@ -217,6 +222,23 @@ def _release_by_name(self, shm_name: str) -> None: f"Error releasing shared memory block {shm_name}: {e}" ) + def _force_release_by_name(self, shm_name: str) -> None: + shm_obj = self._managed_shms.pop(shm_name, None) + if not shm_obj: + return + self._refcounts.pop(shm_name, None) + + try: + shm_obj.close() + shm_obj.unlink() + logger.debug(f"Released shared memory block: {shm_name}") + except FileNotFoundError: + logger.debug(f"SHM block {shm_name} was already unlinked.") + except Exception as e: + logger.warning( + f"Error releasing shared memory block {shm_name}: {e}" + ) + def release(self, handle: BaseArtifactHandle) -> None: """ Closes and unlinks the shared memory block associated with a handle. diff --git a/rayforge/pipeline/stage/job_stage.py b/rayforge/pipeline/stage/job_stage.py index ab6ebec1..5b79f4b1 100644 --- a/rayforge/pipeline/stage/job_stage.py +++ b/rayforge/pipeline/stage/job_stage.py @@ -12,7 +12,6 @@ from contextlib import ExitStack if TYPE_CHECKING: - import threading from ...core.doc import Doc from ...machine.models.machine import Machine from ...shared.tasker.manager import TaskManager @@ -39,6 +38,7 @@ def __init__( self._machine = machine self._active_task: Optional["Task"] = None self._adoption_event: Optional["threading.Event"] = None + self._use_thread = False self.generation_finished = Signal() self.generation_failed = Signal() @@ -116,8 +116,9 @@ def generate_job(self, doc: "Doc", on_done: Optional[Callable] = None): self._artifact_manager.invalidate_for_job() use_thread = sys.platform == "darwin" and hasattr(sys, "_MEIPASS") + self._use_thread = use_thread if use_thread: - self._adoption_event = threading.Event() + self._adoption_event = None else: manager = mp.Manager() self._adoption_event = manager.Event() @@ -223,7 +224,9 @@ def _on_job_task_event(self, task: "Task", event_name: str, data: dict): try: handle_dict = data["handle_dict"] handle = self._artifact_manager.adopt_artifact( - JobKey, handle_dict + JobKey, + handle_dict, + in_process=self._use_thread, ) if not isinstance(handle, JobArtifactHandle): raise TypeError("Expected a JobArtifactHandle") diff --git a/rayforge/pipeline/stage/step_stage.py b/rayforge/pipeline/stage/step_stage.py index d85535f9..77f68286 100644 --- a/rayforge/pipeline/stage/step_stage.py +++ b/rayforge/pipeline/stage/step_stage.py @@ -44,6 +44,7 @@ def __init__( self._generation_id_map: Dict[StepKey, int] = {} self._active_tasks: Dict[StepKey, "Task"] = {} self._adoption_events: Dict[StepKey, "threading.Event"] = {} + self._thread_tasks: Dict[StepKey, bool] = {} # Local cache for accurate, post-transformer time estimates self._time_cache: Dict[StepKey, Optional[float]] = {} @@ -116,6 +117,7 @@ def _cleanup_task(self, key: StepKey): logger.debug(f"Cancelling active step task for {key}") self._task_manager.cancel_task(task.key) self._adoption_events.pop(key, None) + self._thread_tasks.pop(key, None) def _cleanup_entry(self, key: StepKey, full_invalidation: bool): """Removes a step artifact, clears time cache, and cancels its task.""" @@ -208,11 +210,13 @@ def when_event_callback(task: "Task", event_name: str, data: dict): use_thread = sys.platform == "darwin" and hasattr(sys, "_MEIPASS") if use_thread: - adoption_event = threading.Event() + adoption_event = None else: manager = mp.Manager() adoption_event = manager.Event() - self._adoption_events[step.uid] = adoption_event + if adoption_event is not None: + self._adoption_events[step.uid] = adoption_event + self._thread_tasks[step.uid] = use_thread if use_thread: task = self._task_manager.run_thread_with_proxy( @@ -265,7 +269,9 @@ def _on_task_event( if event_name == "render_artifact_ready": handle_dict = data["handle_dict"] handle = self._artifact_manager.adopt_artifact( - step_uid, handle_dict + step_uid, + handle_dict, + in_process=self._thread_tasks.get(step_uid, False), ) if not isinstance(handle, StepRenderArtifactHandle): raise TypeError("Expected a StepRenderArtifactHandle") @@ -276,7 +282,9 @@ def _on_task_event( elif event_name == "ops_artifact_ready": handle_dict = data["handle_dict"] handle = self._artifact_manager.adopt_artifact( - step_uid, handle_dict + step_uid, + handle_dict, + in_process=self._thread_tasks.get(step_uid, False), ) if not isinstance(handle, StepOpsArtifactHandle): raise TypeError("Expected a StepOpsArtifactHandle") @@ -308,6 +316,7 @@ def _on_assembly_complete( step_uid = step.uid self._active_tasks.pop(step_uid, None) self._adoption_events.pop(step_uid, None) + self._thread_tasks.pop(step_uid, None) if self._generation_id_map.get(step_uid) != task_generation_id: return diff --git a/rayforge/pipeline/stage/workpiece_stage.py b/rayforge/pipeline/stage/workpiece_stage.py index fdf54459..e29d4904 100644 --- a/rayforge/pipeline/stage/workpiece_stage.py +++ b/rayforge/pipeline/stage/workpiece_stage.py @@ -48,6 +48,7 @@ def __init__( self._generation_id_map: Dict[WorkpieceKey, int] = {} self._active_tasks: Dict[WorkpieceKey, "Task"] = {} self._adoption_events: Dict[WorkpieceKey, "threading.Event"] = {} + self._thread_tasks: Dict[WorkpieceKey, bool] = {} # Signals for notifying the pipeline of generation progress self.generation_starting = Signal() @@ -170,6 +171,7 @@ def _cleanup_task(self, key: WorkpieceKey): logger.debug(f"Requesting cancellation for active task {key}") self._task_manager.cancel_task(task.key) self._adoption_events.pop(key, None) + self._thread_tasks.pop(key, None) def _cleanup_entry(self, key: WorkpieceKey): """ @@ -233,11 +235,13 @@ def when_done_callback(task: "Task"): use_thread = sys.platform == "darwin" and hasattr(sys, "_MEIPASS") if use_thread: - adoption_event = threading.Event() + adoption_event = None else: manager = mp.Manager() adoption_event = manager.Event() - self._adoption_events[key] = adoption_event + if adoption_event is not None: + self._adoption_events[key] = adoption_event + self._thread_tasks[key] = use_thread if use_thread: task = self._task_manager.run_thread_with_proxy( @@ -296,7 +300,9 @@ def _on_task_event_received( ) try: stale_handle = self._artifact_manager.adopt_artifact( - (s_uid, w_uid), handle_dict + (s_uid, w_uid), + handle_dict, + in_process=self._thread_tasks.get(key, False), ) self._artifact_manager.release_handle(stale_handle) except Exception as e: @@ -305,7 +311,9 @@ def _on_task_event_received( try: handle = self._artifact_manager.adopt_artifact( - (s_uid, w_uid), handle_dict + (s_uid, w_uid), + handle_dict, + in_process=self._thread_tasks.get(key, False), ) if event_name == "artifact_created": @@ -368,6 +376,7 @@ def _on_task_complete( if self._active_tasks.get(key) is task: self._active_tasks.pop(key, None) self._adoption_events.pop(key, None) + self._thread_tasks.pop(key, None) logger.debug( f"[{key}] Popped active task {id(task)} from tracking." ) diff --git a/rayforge/pipeline/stage/workpiece_view_stage.py b/rayforge/pipeline/stage/workpiece_view_stage.py index 7d4ccfbf..be677ffc 100644 --- a/rayforge/pipeline/stage/workpiece_view_stage.py +++ b/rayforge/pipeline/stage/workpiece_view_stage.py @@ -4,6 +4,7 @@ import numpy as np import threading import time +import sys from multiprocessing import shared_memory from typing import TYPE_CHECKING, Any, Dict, Tuple, cast from blinker import Signal @@ -58,6 +59,7 @@ def __init__( self._machine = machine self._active_tasks: Dict[ViewKey, "Task"] = {} self._last_context_cache: Dict[ViewKey, RenderContext] = {} + self._thread_tasks: Dict[ViewKey, bool] = {} # Track the currently active handle for each view so we can release # it when it is replaced or when the stage shuts down. @@ -103,6 +105,7 @@ def shutdown(self): task = self._active_tasks.pop(key, None) if task: self._task_manager.cancel_task(task.key) + self._thread_tasks.pop(key, None) # Release all currently held view handles for handle in self._current_view_handles.values(): @@ -199,16 +202,30 @@ def request_view_render( def when_done_callback(task: "Task"): self._on_render_complete(task, key) - task = self._task_manager.run_process( - make_workpiece_view_artifact_in_subprocess, - self._artifact_manager._store, - workpiece_artifact_handle_dict=source_handle.to_dict(), - render_context_dict=context.to_dict(), - creator_tag="workpiece_view", - key=key, - when_done=when_done_callback, - when_event=self._on_render_event_received, - ) + use_thread = sys.platform == "darwin" and hasattr(sys, "_MEIPASS") + self._thread_tasks[key] = use_thread + if use_thread: + task = self._task_manager.run_thread_with_proxy( + make_workpiece_view_artifact_in_subprocess, + self._artifact_manager._store, + workpiece_artifact_handle_dict=source_handle.to_dict(), + render_context_dict=context.to_dict(), + creator_tag="workpiece_view", + key=key, + when_done=when_done_callback, + when_event=self._on_render_event_received, + ) + else: + task = self._task_manager.run_process( + make_workpiece_view_artifact_in_subprocess, + self._artifact_manager._store, + workpiece_artifact_handle_dict=source_handle.to_dict(), + render_context_dict=context.to_dict(), + creator_tag="workpiece_view", + key=key, + when_done=when_done_callback, + when_event=self._on_render_event_received, + ) self._active_tasks[key] = task def _on_render_event_received( @@ -222,7 +239,9 @@ def _on_render_event_received( try: handle_dict = data["handle_dict"] handle = self._artifact_manager.adopt_artifact( - key, handle_dict + key, + handle_dict, + in_process=self._thread_tasks.get(key, False), ) if not isinstance(handle, WorkPieceViewArtifactHandle): raise TypeError("Expected WorkPieceViewArtifactHandle") @@ -577,6 +596,7 @@ def _on_render_complete(self, task: "Task", key: ViewKey): cleanup and state management. """ self._active_tasks.pop(key, None) + self._thread_tasks.pop(key, None) if task.get_status() != "completed": logger.error( diff --git a/rayforge/version.txt b/rayforge/version.txt index 59c7ef3d..42088adb 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -1.0.1-34-g1b061989 +1.0.1-35-gca360352 From 2dd0f87c140336bd449c00be1eda5114f2c92449 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Wed, 4 Feb 2026 17:57:42 +0100 Subject: [PATCH 25/34] fix 3D view --- rayforge/ui_gtk/canvas3d/axis_renderer_3d.py | 19 +++++++++++++++++-- rayforge/version.txt | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/rayforge/ui_gtk/canvas3d/axis_renderer_3d.py b/rayforge/ui_gtk/canvas3d/axis_renderer_3d.py index 50234cd0..b066595b 100644 --- a/rayforge/ui_gtk/canvas3d/axis_renderer_3d.py +++ b/rayforge/ui_gtk/canvas3d/axis_renderer_3d.py @@ -257,12 +257,12 @@ def render( # Draw grid and axes line_shader.set_mat4("uMVP", grid_mvp) line_shader.set_vec4("uColor", self.grid_color) - GL.glLineWidth(1.0) + self._set_line_width(1.0) GL.glBindVertexArray(self.grid_vao) GL.glDrawArrays(GL.GL_LINES, 0, self.grid_vertex_count) line_shader.set_vec4("uColor", self.axis_color) - GL.glLineWidth(2.0) + self._set_line_width(2.0) GL.glBindVertexArray(self.axes_vao) GL.glDrawArrays(GL.GL_LINES, 0, self.axes_vertex_count) @@ -292,6 +292,21 @@ def render( ) GL.glDisable(GL.GL_BLEND) + def _set_line_width(self, requested: float) -> None: + try: + width_range = GL.glGetFloatv(GL.GL_ALIASED_LINE_WIDTH_RANGE) + except Exception: + width_range = None + + if width_range is None or len(width_range) < 2: + GL.glLineWidth(requested) + return + + min_width = float(width_range[0]) + max_width = float(width_range[1]) + clamped = max(min_width, min(requested, max_width)) + GL.glLineWidth(clamped) + def _render_axis_labels( self, text_shader: Shader, diff --git a/rayforge/version.txt b/rayforge/version.txt index 42088adb..4bdb1dd5 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -1.0.1-35-gca360352 +1.0.1-36-gfbd03434 From ebe5b80380085f9262c25c6675592bc90182c769 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Wed, 4 Feb 2026 18:48:17 +0100 Subject: [PATCH 26/34] enable OpenGL on macOS --- rayforge/version.txt | 2 +- requirements.txt | 2 +- scripts/mac_build.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rayforge/version.txt b/rayforge/version.txt index 4bdb1dd5..97cd7206 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -1.0.1-36-gfbd03434 +1.0.1-37-gdbfa430c diff --git a/requirements.txt b/requirements.txt index 78c6e25d..40adf4a0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ pycairo==1.28.0 pyclipper==1.3.0.post6 PyGObject==3.50.0 PyOpenGL==3.1.9 -PyOpenGL_accelerate==3.1.9 +PyOpenGL_accelerate==3.1.10 pypdf==6.6.2 pyserial_asyncio==0.6 pyvips==3.0.0 diff --git a/scripts/mac_build.sh b/scripts/mac_build.sh index 14b8c1b3..73dab612 100755 --- a/scripts/mac_build.sh +++ b/scripts/mac_build.sh @@ -57,7 +57,7 @@ TMP_REQUIREMENTS=$(mktemp) grep -v -i '^PyOpenGL_accelerate' requirements.txt > "$TMP_REQUIREMENTS" python -m pip install -r "$TMP_REQUIREMENTS" rm -f "$TMP_REQUIREMENTS" -python -m pip install PyOpenGL_accelerate==3.1.9 || \ +python -m pip install PyOpenGL_accelerate==3.1.10 || \ echo "PyOpenGL_accelerate install failed; continuing." bash scripts/update_translations.sh --compile-only From 066b550952168512d8ef95c5f6e2785ccfd726ff Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 5 Feb 2026 09:54:36 +0100 Subject: [PATCH 27/34] fix bundle dependencies packaging --- rayforge/version.txt | 2 +- scripts/mac_build.sh | 118 +++++++++++++++++++++++++++++++++---------- 2 files changed, 91 insertions(+), 29 deletions(-) diff --git a/rayforge/version.txt b/rayforge/version.txt index 97cd7206..c178cbdd 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -1.0.1-37-gdbfa430c +1.0.1-38-g93642d94 diff --git a/scripts/mac_build.sh b/scripts/mac_build.sh index 73dab612..48201971 100755 --- a/scripts/mac_build.sh +++ b/scripts/mac_build.sh @@ -112,6 +112,30 @@ PY # Remove conflicting libiconv bundled by cv2. rm -f "$FW_DIR/libiconv.2.dylib" + # Replace the launcher with a wrapper that sets env vars, + # keeping the Mach-O as Rayforge.bin. + if [ -f "$BIN_DIR/Rayforge" ] && [ ! -f "$BIN_DIR/Rayforge.bin" ]; then + if file "$BIN_DIR/Rayforge" | grep -q "Mach-O"; then + mv "$BIN_DIR/Rayforge" "$BIN_DIR/Rayforge.bin" + else + cp "$BIN_DIR/Rayforge" "$BIN_DIR/Rayforge.bin" + fi + fi + if [ -f "$BIN_DIR/Rayforge.bin" ]; then + cat > "$BIN_DIR/Rayforge" <<'SH' +#!/bin/bash +APP_DIR="$(cd "$(dirname "$0")/.." && pwd)" +export DYLD_LIBRARY_PATH="$APP_DIR/Frameworks" +export DYLD_FALLBACK_LIBRARY_PATH="$APP_DIR/Frameworks" +export GI_TYPELIB_PATH="$APP_DIR/Resources/gi_typelibs" +export GIO_EXTRA_MODULES="$APP_DIR/Frameworks/gio_modules" +exec "$APP_DIR/MacOS/Rayforge.bin" "$@" +SH + chmod +x "$BIN_DIR/Rayforge" + install_name_tool -add_rpath @executable_path/../Frameworks \ + "$BIN_DIR/Rayforge.bin" 2>/dev/null || true + fi + BREW_PREFIX="" if command -v brew >/dev/null 2>&1; then BREW_PREFIX=$(brew --prefix) @@ -147,6 +171,33 @@ PY install_name_tool -id "@rpath/$lib" "$FW_DIR/$lib" fi done + copy_keg_lib() { + local libname=$1 + shift + if [ -f "$FW_DIR/$libname" ]; then + return + fi + for lib_dir in "$@"; do + if [ -f "$lib_dir/$libname" ]; then + rm -f "$FW_DIR/$libname" + cp "$lib_dir/$libname" "$FW_DIR/" + install_name_tool -id "@rpath/$libname" "$FW_DIR/$libname" + break + fi + done + } + copy_keg_lib libfontconfig.1.dylib \ + "$BREW_PREFIX/opt/fontconfig/lib" \ + "/usr/local/opt/fontconfig/lib" \ + "/opt/homebrew/opt/fontconfig/lib" + copy_keg_lib libfreetype.6.dylib \ + "$BREW_PREFIX/opt/freetype/lib" \ + "/usr/local/opt/freetype/lib" \ + "/opt/homebrew/opt/freetype/lib" + copy_keg_lib libintl.8.dylib \ + "$BREW_PREFIX/opt/gettext/lib" \ + "/usr/local/opt/gettext/lib" \ + "/opt/homebrew/opt/gettext/lib" if [ ! -f "$FW_DIR/libpng16.16.dylib" ]; then for lib_dir in \ "$BREW_PREFIX/opt/libpng/lib" \ @@ -220,7 +271,8 @@ PY changed=1 fi done < <(otool -L "$BIN_DIR/Rayforge" "$FW_DIR"/*.dylib 2>/dev/null | \ - awk '{print $1}' | grep -E '^/usr/local/|^/opt/homebrew/' | sort -u) + awk '{print $1}' | grep -E '^/usr/local/|^/opt/homebrew/' | \ + sort -u || true) return $changed } @@ -232,16 +284,28 @@ PY # Fix all library references to use @rpath instead of absolute paths echo "Fixing library references..." - for dylib in "$FW_DIR"/*.dylib; do - [ -f "$dylib" ] || continue - # Get all dependencies - otool -L "$dylib" | grep -E '/usr/local/|/opt/homebrew/' | awk '{print $1}' | while read dep; do + chmod -R u+w "$FW_DIR" "$BIN_DIR" 2>/dev/null || true + find "$FW_DIR" -name "*.dylib" -print0 | while IFS= read -r -d '' dylib; do + otool -L "$dylib" | grep -E '/usr/local/|/opt/homebrew/' | \ + awk '{print $1}' | while read dep; do libname=$(basename "$dep") - # Only rewrite if we've bundled this library if [ -f "$FW_DIR/$libname" ]; then install_name_tool -change "$dep" "@rpath/$libname" "$dylib" 2>/dev/null || true fi - done + done || true + done + for bin in "$BIN_DIR/Rayforge" "$BIN_DIR/Rayforge.bin"; do + [ -f "$bin" ] || continue + if ! file "$bin" | grep -q "Mach-O"; then + continue + fi + otool -L "$bin" | grep -E '/usr/local/|/opt/homebrew/' | \ + awk '{print $1}' | while read dep; do + libname=$(basename "$dep") + if [ -f "$FW_DIR/$libname" ]; then + install_name_tool -change "$dep" "@rpath/$libname" "$bin" 2>/dev/null || true + fi + done || true done # Force libpng references to @rpath to avoid runtime lookups in Homebrew. @@ -260,7 +324,25 @@ PY while read dep; do install_name_tool -change "$dep" "@rpath/libpng16.16.dylib" \ "$FW_DIR/libfreetype.6.dylib" 2>/dev/null || true - done + done || true + fi + if [ -f "$FW_DIR/libfontconfig.1.dylib" ]; then + if [ -f "$FW_DIR/libfreetype.6.dylib" ]; then + otool -L "$FW_DIR/libfontconfig.1.dylib" | awk '{print $1}' | \ + grep -E '/opt/homebrew/opt/freetype/|/usr/local/opt/freetype/' | \ + while read dep; do + install_name_tool -change "$dep" "@rpath/libfreetype.6.dylib" \ + "$FW_DIR/libfontconfig.1.dylib" 2>/dev/null || true + done || true + fi + if [ -f "$FW_DIR/libintl.8.dylib" ]; then + otool -L "$FW_DIR/libfontconfig.1.dylib" | awk '{print $1}' | \ + grep -E '/opt/homebrew/opt/gettext/|/usr/local/opt/gettext/' | \ + while read dep; do + install_name_tool -change "$dep" "@rpath/libintl.8.dylib" \ + "$FW_DIR/libfontconfig.1.dylib" 2>/dev/null || true + done || true + fi fi # Refresh cv2 dylib symlinks to the parent copies. @@ -284,26 +366,6 @@ PY # cp -r "/usr/local/lib/gdk-pixbuf-2.0" "$FW_DIR/" || true # fi - # Replace the launcher with a wrapper that sets env vars, - # keeping the Mach-O as Rayforge.bin. - if [ -f "$BIN_DIR/Rayforge" ]; then - mv "$BIN_DIR/Rayforge" "$BIN_DIR/Rayforge.bin" - fi - cat > "$BIN_DIR/Rayforge" <<'SH' -#!/bin/bash -APP_DIR="$(cd "$(dirname "$0")/.." && pwd)" -export DYLD_LIBRARY_PATH="$APP_DIR/Frameworks" -export DYLD_FALLBACK_LIBRARY_PATH="$APP_DIR/Frameworks" -export GI_TYPELIB_PATH="$APP_DIR/Resources/gi_typelibs" -export GIO_EXTRA_MODULES="$APP_DIR/Frameworks/gio_modules" -exec "$APP_DIR/MacOS/Rayforge.bin" "$@" -SH - chmod +x "$BIN_DIR/Rayforge" - - # Ensure rpath points to the bundled Frameworks. - install_name_tool -add_rpath @executable_path/../Frameworks \ - "$BIN_DIR/Rayforge.bin" 2>/dev/null || true - # Make sure the plist still points to the wrapper. /usr/libexec/PlistBuddy -c "Set :CFBundleExecutable Rayforge" \ "$APP_ROOT/Info.plist" 2>/dev/null || true From 4ec26f5916298e1a2747a419ea76d2750e8b64be Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 5 Feb 2026 10:23:37 +0100 Subject: [PATCH 28/34] add new dependencies to macos script --- scripts/mac_build.sh | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/scripts/mac_build.sh b/scripts/mac_build.sh index 48201971..9f7ba9d2 100755 --- a/scripts/mac_build.sh +++ b/scripts/mac_build.sh @@ -157,6 +157,9 @@ SH libvips.42.dylib \ libvips-cpp.42.dylib \ libOpenEXR-3_4.33.dylib \ + libOpenEXRCore-3_4.33.dylib \ + libIex-3_4.33.dylib \ + libIlmThread-3_4.33.dylib \ libImath-3_2.30.dylib \ libarchive.13.dylib \ libcfitsio.10.dylib \ @@ -198,6 +201,26 @@ SH "$BREW_PREFIX/opt/gettext/lib" \ "/usr/local/opt/gettext/lib" \ "/opt/homebrew/opt/gettext/lib" + copy_keg_lib libOpenEXR-3_4.33.dylib \ + "$BREW_PREFIX/opt/openexr/lib" \ + "/usr/local/opt/openexr/lib" \ + "/opt/homebrew/opt/openexr/lib" + copy_keg_lib libOpenEXRCore-3_4.33.dylib \ + "$BREW_PREFIX/opt/openexr/lib" \ + "/usr/local/opt/openexr/lib" \ + "/opt/homebrew/opt/openexr/lib" + copy_keg_lib libIex-3_4.33.dylib \ + "$BREW_PREFIX/opt/openexr/lib" \ + "/usr/local/opt/openexr/lib" \ + "/opt/homebrew/opt/openexr/lib" + copy_keg_lib libIlmThread-3_4.33.dylib \ + "$BREW_PREFIX/opt/openexr/lib" \ + "/usr/local/opt/openexr/lib" \ + "/opt/homebrew/opt/openexr/lib" + copy_keg_lib libImath-3_2.30.dylib \ + "$BREW_PREFIX/opt/imath/lib" \ + "/usr/local/opt/imath/lib" \ + "/opt/homebrew/opt/imath/lib" if [ ! -f "$FW_DIR/libpng16.16.dylib" ]; then for lib_dir in \ "$BREW_PREFIX/opt/libpng/lib" \ From 5aec2a3a8bb5adac1703db626259415386cd32d7 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 5 Feb 2026 16:51:06 +0100 Subject: [PATCH 29/34] use CMD as primary modifier on macOS --- rayforge/app.py | 6 +- rayforge/ui_gtk/actions.py | 73 ++++++++++--------- rayforge/ui_gtk/canvas/canvas.py | 5 +- rayforge/ui_gtk/canvas2d/surface.py | 7 +- .../ui_gtk/doceditor/step_settings_dialog.py | 7 +- rayforge/ui_gtk/machine/settings_dialog.py | 7 +- rayforge/ui_gtk/shared/keyboard.py | 37 ++++++++++ rayforge/ui_gtk/sketcher/editor.py | 13 ++-- rayforge/version.txt | 2 +- 9 files changed, 103 insertions(+), 54 deletions(-) create mode 100644 rayforge/ui_gtk/shared/keyboard.py diff --git a/rayforge/app.py b/rayforge/app.py index e158a8ce..9db94849 100644 --- a/rayforge/app.py +++ b/rayforge/app.py @@ -113,7 +113,11 @@ def main(): class App(Adw.Application): def __init__(self, args): super().__init__(application_id="org.rayforge.rayforge") - self.set_accels_for_action("win.quit", ["Q"]) + from rayforge.ui_gtk.shared.keyboard import primary_accel + + self.set_accels_for_action( + "win.quit", [f"{primary_accel()}q"] + ) self.args = args self.win = None diff --git a/rayforge/ui_gtk/actions.py b/rayforge/ui_gtk/actions.py index d97b09a3..0c08c67a 100644 --- a/rayforge/ui_gtk/actions.py +++ b/rayforge/ui_gtk/actions.py @@ -6,6 +6,7 @@ from ..core.layer import Layer from ..core.workpiece import WorkPiece from .doceditor.add_tabs_popover import AddTabsPopover +from .shared.keyboard import primary_accel if TYPE_CHECKING: @@ -348,34 +349,38 @@ def register_shortcuts(self, controller: Gtk.ShortcutController): """ Populates the given ShortcutController with all application shortcuts. """ + primary = primary_accel() + def with_primary(shortcut: str) -> str: + return shortcut.replace("", primary) + shortcuts = { # File - "win.new": "n", - "win.open": "o", - "win.save": "s", - "win.save-as": "s", - "win.import": "i", - "win.export": "e", - "win.quit": "q", + "win.new": with_primary("n"), + "win.open": with_primary("o"), + "win.save": with_primary("s"), + "win.save-as": with_primary("s"), + "win.import": with_primary("i"), + "win.export": with_primary("e"), + "win.quit": with_primary("q"), # Edit - "win.undo": "z", - "win.redo": "y", - "win.redo_alt": "z", - "win.cut": "x", - "win.copy": "c", - "win.paste": "v", - "win.select_all": "a", - "win.duplicate": "d", + "win.undo": with_primary("z"), + "win.redo": with_primary("y"), + "win.redo_alt": with_primary("z"), + "win.cut": with_primary("x"), + "win.copy": with_primary("c"), + "win.paste": with_primary("v"), + "win.select_all": with_primary("a"), + "win.duplicate": with_primary("d"), "win.remove": "Delete", - "win.clear": "Delete", - "win.settings": "comma", + "win.clear": with_primary("Delete"), + "win.settings": with_primary("comma"), # View "win.show_workpieces": "h", "win.show_tabs": "t", "win.toggle_camera_view": "c", - "win.toggle_control_panel": "l", - "win.toggle_gcode_preview": "g", - "win.toggle_travel_view": "t", + "win.toggle_control_panel": with_primary("l"), + "win.toggle_gcode_preview": with_primary("g"), + "win.toggle_travel_view": with_primary("t"), "win.show_3d_view": "F12", "win.simulate_mode": "F11", "win.view_top": "1", @@ -384,27 +389,27 @@ def register_shortcuts(self, controller: Gtk.ShortcutController): "win.view_toggle_perspective": "p", # Object "win.add_stock": "s", - "win.new_sketch": "n", + "win.new_sketch": with_primary("n"), "win.add-tabs-equidistant": "t", # Arrange - "win.group": "g", - "win.ungroup": "u", + "win.group": with_primary("g"), + "win.ungroup": with_primary("u"), "win.split": "w", - "win.layer-move-up": "Page_Up", - "win.layer-move-down": "Page_Down", - "win.align-left": "Left", - "win.align-right": "Right", - "win.align-top": "Up", - "win.align-bottom": "Down", - "win.align-h-center": "Home", - "win.align-v-center": "End", - "win.spread-h": "h", - "win.spread-v": "v", + "win.layer-move-up": with_primary("Page_Up"), + "win.layer-move-down": with_primary("Page_Down"), + "win.align-left": with_primary("Left"), + "win.align-right": with_primary("Right"), + "win.align-top": with_primary("Up"), + "win.align-bottom": with_primary("Down"), + "win.align-h-center": with_primary("Home"), + "win.align-v-center": with_primary("End"), + "win.spread-h": with_primary("h"), + "win.spread-v": with_primary("v"), "win.layout-pixel-perfect": "a", "win.flip-horizontal": "h", "win.flip-vertical": "v", # Machine & Help - "win.machine-settings": "less", + "win.machine-settings": with_primary("less"), "win.about": "F1", } diff --git a/rayforge/ui_gtk/canvas/canvas.py b/rayforge/ui_gtk/canvas/canvas.py index 271b2ec1..0ce42ce0 100644 --- a/rayforge/ui_gtk/canvas/canvas.py +++ b/rayforge/ui_gtk/canvas/canvas.py @@ -21,6 +21,7 @@ from .multiselect import MultiSelectionGroup from .overlays import render_selection_handles, render_selection_frame from .intersect import obb_intersects_aabb +from ..shared.keyboard import is_primary_keyval logger = logging.getLogger(__name__) @@ -1271,7 +1272,7 @@ def on_key_pressed( if keyval in (Gdk.KEY_Shift_L, Gdk.KEY_Shift_R): self._shift_pressed = True # Allow propagation for accelerators - elif keyval in (Gdk.KEY_Control_L, Gdk.KEY_Control_R): + elif is_primary_keyval(keyval): self._ctrl_pressed = True # Allow propagation for accelerators elif keyval == Gdk.KEY_Delete: @@ -1289,7 +1290,7 @@ def on_key_released( """Handles key release events for modifiers.""" if keyval in (Gdk.KEY_Shift_L, Gdk.KEY_Shift_R): self._shift_pressed = False - elif keyval in (Gdk.KEY_Control_L, Gdk.KEY_Control_R): + elif is_primary_keyval(keyval): self._ctrl_pressed = False def get_active_element(self) -> Optional[CanvasElement]: diff --git a/rayforge/ui_gtk/canvas2d/surface.py b/rayforge/ui_gtk/canvas2d/surface.py index 8dfe9635..3c92cc1d 100644 --- a/rayforge/ui_gtk/canvas2d/surface.py +++ b/rayforge/ui_gtk/canvas2d/surface.py @@ -22,6 +22,7 @@ from . import context_menu from ..sketcher.editor import SketchEditor from ..sketcher.sketchelement import SketchElement +from ..shared.keyboard import is_primary_modifier if TYPE_CHECKING: from ...doceditor.editor import DocEditor @@ -907,11 +908,11 @@ def on_key_pressed( if super().on_key_pressed(controller, keyval, keycode, state): return True - is_ctrl = bool(state & Gdk.ModifierType.CONTROL_MASK) + is_primary = is_primary_modifier(state) is_shift = bool(state & Gdk.ModifierType.SHIFT_MASK) # Handle moving workpiece to another layer - if is_ctrl and ( + if is_primary and ( keyval == Gdk.KEY_Page_Up or keyval == Gdk.KEY_Page_Down ): direction = -1 if keyval == Gdk.KEY_Page_Up else 1 @@ -919,7 +920,7 @@ def on_key_pressed( return True # Handle clipboard and duplication - if is_ctrl: + if is_primary: selected_items = [e.data for e in self.get_selected_elements()] if keyval == Gdk.KEY_x: if selected_items: diff --git a/rayforge/ui_gtk/doceditor/step_settings_dialog.py b/rayforge/ui_gtk/doceditor/step_settings_dialog.py index db32c9b4..ef318c18 100644 --- a/rayforge/ui_gtk/doceditor/step_settings_dialog.py +++ b/rayforge/ui_gtk/doceditor/step_settings_dialog.py @@ -10,6 +10,7 @@ from ...pipeline.transformer import OpsTransformer from ..icons import get_icon from ..shared.adwfix import get_spinrow_float +from ..shared.keyboard import is_primary_modifier from ..shared.patched_dialog_window import PatchedDialogWindow from ..shared.unit_spin_row import UnitSpinRowHelper from .recipe_control_widget import RecipeControlWidget @@ -526,10 +527,10 @@ def _create_tab_title(self, title_str: str, icon_name: str) -> Gtk.Widget: return box def _on_key_pressed(self, controller, keyval, keycode, state): - """Handle key press events, closing the dialog on Escape or Ctrl+W.""" - has_ctrl = state & Gdk.ModifierType.CONTROL_MASK + """Handle key press events, closing the dialog on Escape or Cmd/Ctrl+W.""" + has_primary = is_primary_modifier(state) - if keyval == Gdk.KEY_Escape or (has_ctrl and keyval == Gdk.KEY_w): + if keyval == Gdk.KEY_Escape or (has_primary and keyval == Gdk.KEY_w): self.close() return True return False diff --git a/rayforge/ui_gtk/machine/settings_dialog.py b/rayforge/ui_gtk/machine/settings_dialog.py index 91237539..236de5f5 100644 --- a/rayforge/ui_gtk/machine/settings_dialog.py +++ b/rayforge/ui_gtk/machine/settings_dialog.py @@ -7,6 +7,7 @@ from ...machine.models.machine import Machine from ..camera.camera_preferences_page import CameraPreferencesPage from ..icons import get_icon +from ..shared.keyboard import is_primary_modifier from ..shared.patched_dialog_window import PatchedDialogWindow from .advanced_preferences_page import AdvancedPreferencesPage from .device_settings_page import DeviceSettingsPage @@ -221,10 +222,10 @@ def _sync_camera_page(self, sender=None, **kwargs): self.camera_page.set_controllers(relevant_controllers) def _on_key_pressed(self, controller, keyval, keycode, state): - """Handle key press events, closing the dialog on Escape or Ctrl+W.""" - has_ctrl = state & Gdk.ModifierType.CONTROL_MASK + """Handle key press events, closing the dialog on Escape or Cmd/Ctrl+W.""" + has_primary = is_primary_modifier(state) - if keyval == Gdk.KEY_Escape or (has_ctrl and keyval == Gdk.KEY_w): + if keyval == Gdk.KEY_Escape or (has_primary and keyval == Gdk.KEY_w): self.close() return True return False diff --git a/rayforge/ui_gtk/shared/keyboard.py b/rayforge/ui_gtk/shared/keyboard.py new file mode 100644 index 00000000..b81cd9b1 --- /dev/null +++ b/rayforge/ui_gtk/shared/keyboard.py @@ -0,0 +1,37 @@ +import sys +from gi.repository import Gdk + + +def primary_modifier_mask() -> Gdk.ModifierType: + if sys.platform == "darwin": + return ( + Gdk.ModifierType.META_MASK + | Gdk.ModifierType.SUPER_MASK + | Gdk.ModifierType.MOD2_MASK + ) + return Gdk.ModifierType.CONTROL_MASK + + +def is_primary_modifier(state: Gdk.ModifierType) -> bool: + return bool(state & primary_modifier_mask()) + + +def is_primary_keyval(keyval: int) -> bool: + if sys.platform == "darwin": + command_key = getattr(Gdk, "KEY_Command", None) + primary_keys = [ + Gdk.KEY_Meta_L, + Gdk.KEY_Meta_R, + Gdk.KEY_Super_L, + Gdk.KEY_Super_R, + ] + if command_key is not None: + primary_keys.append(command_key) + return keyval in primary_keys + return keyval in (Gdk.KEY_Control_L, Gdk.KEY_Control_R) + + +def primary_accel() -> str: + if sys.platform == "darwin": + return "" + return "" diff --git a/rayforge/ui_gtk/sketcher/editor.py b/rayforge/ui_gtk/sketcher/editor.py index 0c0241fe..c631db74 100644 --- a/rayforge/ui_gtk/sketcher/editor.py +++ b/rayforge/ui_gtk/sketcher/editor.py @@ -8,6 +8,7 @@ from ...core.sketcher.tools.text_box_tool import TextBoxState from ...core.undo import HistoryManager from ..canvas.cursor import get_tool_cursor +from ..shared.keyboard import is_primary_modifier from .piemenu import SketchPieMenu if TYPE_CHECKING: @@ -418,7 +419,7 @@ def handle_key_press( if not self.sketch_element: return False - is_ctrl = bool(state & Gdk.ModifierType.CONTROL_MASK) + is_primary = is_primary_modifier(state) is_shift = bool(state & Gdk.ModifierType.SHIFT_MASK) # Priority 0: Active text editing @@ -439,7 +440,7 @@ def handle_key_press( Gdk.KEY_KP_Home: SketcherKey.HOME, Gdk.KEY_KP_End: SketcherKey.END, } - if is_ctrl: + if is_primary: key_map[Gdk.KEY_z] = SketcherKey.UNDO key_map[Gdk.KEY_y] = SketcherKey.REDO key_map[Gdk.KEY_c] = SketcherKey.COPY @@ -448,10 +449,10 @@ def handle_key_press( key_map[Gdk.KEY_a] = SketcherKey.SELECT_ALL if keyval in key_map: return tool.handle_key_event( - key_map[keyval], shift=is_shift, ctrl=is_ctrl + key_map[keyval], shift=is_shift, ctrl=is_primary ) - if is_ctrl: + if is_primary: return False key_unicode = Gdk.keyval_to_unicode(keyval) @@ -459,10 +460,8 @@ def handle_key_press( return tool.handle_text_input(chr(key_unicode)) return False # Unhandled key during text edit - is_ctrl = bool(state & Gdk.ModifierType.CONTROL_MASK) - # Priority 1: Immediate actions (Undo/Redo, Delete) - if is_ctrl: + if is_primary: if keyval == Gdk.KEY_z: self.history_manager.undo() self._reset_key_sequence() diff --git a/rayforge/version.txt b/rayforge/version.txt index c178cbdd..f9a68380 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -1.0.1-38-g93642d94 +1.0.1-43-g4ec26f59 From b8b56d58cc8a4c4983eec971aba31e2f8b3e15b3 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 5 Feb 2026 17:24:30 +0100 Subject: [PATCH 30/34] tweak mac_build.sh script --- rayforge/version.txt | 2 +- scripts/mac_build.sh | 81 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 72 insertions(+), 11 deletions(-) diff --git a/rayforge/version.txt b/rayforge/version.txt index f9a68380..20ef4102 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -1.0.1-43-g4ec26f59 +1.0.1-44-g5aec2a3a diff --git a/scripts/mac_build.sh b/scripts/mac_build.sh index 9f7ba9d2..9ca2e84c 100755 --- a/scripts/mac_build.sh +++ b/scripts/mac_build.sh @@ -1,13 +1,18 @@ #!/usr/bin/env bash set -euo pipefail -BUNDLE=0 +DO_BUILD=0 +DO_BUNDLE=0 VERSION_OVERRIDE="" +GREEN="\033[0;32m" +NC="\033[0m" + +print_info() { + local title=$1 + printf "${GREEN}%s${NC}\n" "$title" +} while (($#)); do case "$1" in - --bundle) - BUNDLE=1 - ;; --version) VERSION_OVERRIDE="$2" shift @@ -20,6 +25,37 @@ while (($#)); do shift done +echo "" +print_info "======================================" +print_info " Rayforge macOS Build Script" +print_info "======================================" +echo "" +echo "Select build option:" +echo " 1) build" +echo " 2) app bundle" +echo " 3) build + app bundle" +echo " 4) exit" +echo "" +read -r -p "Choice (1-3): " BUILD_CHOICE +case "$BUILD_CHOICE" in + 1) + DO_BUILD=1 + ;; + 2) + DO_BUNDLE=1 + ;; + 3) + DO_BUILD=1 + DO_BUNDLE=1 + ;; + 4) + exit 0 + ;; + *) + exit 0 + ;; +esac + if [ ! -f .mac_env ]; then echo ".mac_env not found. Run scripts/mac_setup.sh first." >&2 exit 1 @@ -32,6 +68,12 @@ if ! command -v python3 >/dev/null 2>&1; then exit 1 fi +echo "" +echo "" +print_info "Setup" +print_info "--------------------------------------" +echo "" + VENV_PATH=${VENV_PATH:-.venv-mac} if [ ! -d "$VENV_PATH" ]; then python3 -m venv "$VENV_PATH" @@ -66,14 +108,23 @@ VERSION=${VERSION_OVERRIDE:-$(git describe --tags --always 2>/dev/null || \ echo "v0.0.0-local")} echo "$VERSION" > rayforge/version.txt -python -m build - -if (( BUNDLE == 0 )) && [ -d "dist/Rayforge.app" ]; then +if (( DO_BUILD == 1 )); then + echo "" + echo "" + print_info "Build" + print_info "--------------------------------------" + echo "" + python -m build +elif [ -d "dist/Rayforge.app" ] && (( DO_BUNDLE == 0 )); then echo "Note: dist/Rayforge.app exists but was not rebuilt." >&2 - echo "Run ./scripts/mac_build.sh --bundle to refresh the app bundle." >&2 fi -if (( BUNDLE == 1 )); then +if (( DO_BUNDLE == 1 )); then + echo "" + echo "" + print_info ".app Bundle" + print_info "--------------------------------------" + echo "" python - <<'PY' import os import shutil @@ -394,4 +445,14 @@ SH "$APP_ROOT/Info.plist" 2>/dev/null || true fi -echo "Build artifacts created in dist/ and dist/*.whl" +if (( DO_BUILD == 1 )) && (( DO_BUNDLE == 1 )); then + echo "Build artifacts created in dist/, dist/*.whl, and dist/Rayforge.app" +elif (( DO_BUILD == 1 )); then + echo "Build artifacts created in dist/ and dist/*.whl" +elif (( DO_BUNDLE == 1 )); then + echo "App bundle created in dist/Rayforge.app" +fi + +echo "" +print_info " Finished!" +echo "" From f5ed4c0676a9f5ba4a1120675878b0319800863d Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 5 Feb 2026 17:40:36 +0100 Subject: [PATCH 31/34] add DMG packaging --- rayforge/version.txt | 2 +- scripts/mac_build.sh | 50 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/rayforge/version.txt b/rayforge/version.txt index 20ef4102..3337fb49 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -1.0.1-44-g5aec2a3a +1.0.1-45-gb8b56d58 diff --git a/scripts/mac_build.sh b/scripts/mac_build.sh index 9ca2e84c..731cc59c 100755 --- a/scripts/mac_build.sh +++ b/scripts/mac_build.sh @@ -3,6 +3,7 @@ set -euo pipefail DO_BUILD=0 DO_BUNDLE=0 +DO_DMG=0 VERSION_OVERRIDE="" GREEN="\033[0;32m" NC="\033[0m" @@ -31,12 +32,13 @@ print_info " Rayforge macOS Build Script" print_info "======================================" echo "" echo "Select build option:" -echo " 1) build" -echo " 2) app bundle" -echo " 3) build + app bundle" -echo " 4) exit" +echo " 1) Build" +echo " 2) Bundle (.app)" +echo " 3) Distribution package (.dmg)" +echo " 4) All of the above" +echo " 5) exit" echo "" -read -r -p "Choice (1-3): " BUILD_CHOICE +read -r -p "Choice (1-5): " BUILD_CHOICE case "$BUILD_CHOICE" in 1) DO_BUILD=1 @@ -45,10 +47,14 @@ case "$BUILD_CHOICE" in DO_BUNDLE=1 ;; 3) + DO_DMG=1 + ;; + 4) DO_BUILD=1 DO_BUNDLE=1 + DO_DMG=1 ;; - 4) + 5) exit 0 ;; *) @@ -70,7 +76,7 @@ fi echo "" echo "" -print_info "Setup" +print_info " Environment Setup" print_info "--------------------------------------" echo "" @@ -111,7 +117,7 @@ echo "$VERSION" > rayforge/version.txt if (( DO_BUILD == 1 )); then echo "" echo "" - print_info "Build" + print_info " Build" print_info "--------------------------------------" echo "" python -m build @@ -122,7 +128,7 @@ fi if (( DO_BUNDLE == 1 )); then echo "" echo "" - print_info ".app Bundle" + print_info " .app Bundle" print_info "--------------------------------------" echo "" python - <<'PY' @@ -445,14 +451,36 @@ SH "$APP_ROOT/Info.plist" 2>/dev/null || true fi -if (( DO_BUILD == 1 )) && (( DO_BUNDLE == 1 )); then +if (( DO_DMG == 1 )); then + echo "" + echo "" + print_info " .dmg Distribution package" + echo "--------------------------------------" + echo "" + echo "Creating DMG..." + if [ ! -d "dist/Rayforge.app" ]; then + echo "dist/Rayforge.app not found.\nBuild the app bundle first." >&2 + exit 1 + fi + DMG_PATH="dist/Rayforge_${VERSION}.dmg" + rm -f "$DMG_PATH" + hdiutil create -volname "Rayforge" -srcfolder "dist/Rayforge.app" \ + -ov -format UDZO "$DMG_PATH" +fi + +if (( DO_BUILD == 1 )) && (( DO_BUNDLE == 1 )) && (( DO_DMG == 1 )); then + echo "Build artifacts created in dist/, dist/*.whl, dist/Rayforge.app, and dist/Rayforge.dmg" +elif (( DO_BUILD == 1 )) && (( DO_BUNDLE == 1 )); then echo "Build artifacts created in dist/, dist/*.whl, and dist/Rayforge.app" elif (( DO_BUILD == 1 )); then echo "Build artifacts created in dist/ and dist/*.whl" elif (( DO_BUNDLE == 1 )); then echo "App bundle created in dist/Rayforge.app" +elif (( DO_DMG == 1 )); then + echo "DMG created in dist/Rayforge.dmg" fi echo "" -print_info " Finished!" +echo "" +print_info " Finished!" echo "" From f04c5f96d8dcd8c6621fc843d3f3a46bb9f85f6e Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 5 Feb 2026 17:42:53 +0100 Subject: [PATCH 32/34] fix DMG packaging title --- rayforge/version.txt | 2 +- scripts/mac_build.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rayforge/version.txt b/rayforge/version.txt index 3337fb49..2afd3986 100644 --- a/rayforge/version.txt +++ b/rayforge/version.txt @@ -1 +1 @@ -1.0.1-45-gb8b56d58 +1.0.1-46-gf5ed4c06 diff --git a/scripts/mac_build.sh b/scripts/mac_build.sh index 731cc59c..9abb685d 100755 --- a/scripts/mac_build.sh +++ b/scripts/mac_build.sh @@ -455,7 +455,7 @@ if (( DO_DMG == 1 )); then echo "" echo "" print_info " .dmg Distribution package" - echo "--------------------------------------" + print_info "--------------------------------------" echo "" echo "Creating DMG..." if [ ! -d "dist/Rayforge.app" ]; then From f48f5e21a2e59bd25a6987884423aa01f9eedc73 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 5 Feb 2026 17:49:26 +0100 Subject: [PATCH 33/34] clean .whl and .tar.gz after .app creation --- scripts/mac_build.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/mac_build.sh b/scripts/mac_build.sh index 9abb685d..28aa6b8c 100755 --- a/scripts/mac_build.sh +++ b/scripts/mac_build.sh @@ -449,6 +449,9 @@ SH # Make sure the plist still points to the wrapper. /usr/libexec/PlistBuddy -c "Set :CFBundleExecutable Rayforge" \ "$APP_ROOT/Info.plist" 2>/dev/null || true + + echo "Cleaning dist/*.whl and dist/*.tar.gz after app bundle..." + rm -f dist/*.whl dist/*.tar.gz fi if (( DO_DMG == 1 )); then From 0adb9fc6e1b08e9a3205887cfdc2af2a3b6e93ea Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 5 Feb 2026 17:59:05 +0100 Subject: [PATCH 34/34] update GitHub macOS workflows --- .github/workflows/build-macos-arm.yml | 34 +++++++++++++---------- .github/workflows/build-macos-intel.yml | 36 ++++++++++++++----------- 2 files changed, 41 insertions(+), 29 deletions(-) diff --git a/.github/workflows/build-macos-arm.yml b/.github/workflows/build-macos-arm.yml index 93e338cb..7baf5ef4 100644 --- a/.github/workflows/build-macos-arm.yml +++ b/.github/workflows/build-macos-arm.yml @@ -70,8 +70,9 @@ jobs: - name: Test run: pixi run test - - name: Build macOS bundle - run: bash scripts/mac_build.sh --bundle --version "${{ env.VERSION }}" + - name: Build macOS artifacts + run: | + printf "4\n" | bash scripts/mac_build.sh --version "${{ env.VERSION }}" - name: Package .app bundle run: | @@ -83,6 +84,16 @@ jobs: ZIP_NAME="rayforge-${{ steps.set-version.outputs.version }}-macos-arm-app.zip" ditto -c -k --keepParent "$APP_PATH" "$ZIP_NAME" + - name: Rename DMG + run: | + DMG_PATH="dist/Rayforge_${{ env.VERSION }}.dmg" + if [ ! -f "$DMG_PATH" ]; then + echo "DMG not found at $DMG_PATH" + exit 1 + fi + OUT_DMG="rayforge-${{ steps.set-version.outputs.version }}-macos-arm.dmg" + mv "$DMG_PATH" "$OUT_DMG" + - name: Upload macOS bundle artifact uses: actions/upload-artifact@v4 with: @@ -90,14 +101,11 @@ jobs: path: rayforge-${{ steps.set-version.outputs.version }}-macos-arm-app.zip compression-level: 9 - - name: Upload Python distributions + - name: Upload DMG artifact uses: actions/upload-artifact@v4 with: - name: rayforge-${{ steps.set-version.outputs.version }}-macos-arm-dists - path: | - dist/*.whl - dist/*.tar.gz - if-no-files-found: error + name: rayforge-${{ steps.set-version.outputs.version }}-macos-arm-dmg + path: rayforge-${{ steps.set-version.outputs.version }}-macos-arm.dmg release: name: Create GitHub Release (Apple Silicon) @@ -112,19 +120,17 @@ jobs: with: name: rayforge-${{ needs.build.outputs.version }}-macos-arm-app.zip - - name: Download Python distributions + - name: Download DMG artifact uses: actions/download-artifact@v4 with: - name: rayforge-${{ needs.build.outputs.version }}-macos-arm-dists - path: ./dist + name: rayforge-${{ needs.build.outputs.version }}-macos-arm-dmg - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: files: | - rayforge-${{ needs.build.outputs.version }}-macos-arm.zip - dist/*.whl - dist/*.tar.gz + rayforge-${{ needs.build.outputs.version }}-macos-arm-app.zip + rayforge-${{ needs.build.outputs.version }}-macos-arm.dmg draft: false prerelease: false name: Release ${{ needs.build.outputs.version }} diff --git a/.github/workflows/build-macos-intel.yml b/.github/workflows/build-macos-intel.yml index 0fa381fc..5de554ae 100644 --- a/.github/workflows/build-macos-intel.yml +++ b/.github/workflows/build-macos-intel.yml @@ -18,7 +18,7 @@ concurrency: jobs: build: name: Build macOS Bundle (Intel) - runs-on: macos-14 + runs-on: macos-13 outputs: version: ${{ steps.set-version.outputs.version }} steps: @@ -70,8 +70,9 @@ jobs: - name: Test run: pixi run test - - name: Build macOS bundle - run: bash scripts/mac_build.sh --bundle --version "${{ env.VERSION }}" + - name: Build macOS artifacts + run: | + printf "4\n" | bash scripts/mac_build.sh --version "${{ env.VERSION }}" - name: Package .app bundle run: | @@ -83,6 +84,16 @@ jobs: ZIP_NAME="rayforge-${{ steps.set-version.outputs.version }}-macos-intel-app.zip" ditto -c -k --keepParent "$APP_PATH" "$ZIP_NAME" + - name: Rename DMG + run: | + DMG_PATH="dist/Rayforge_${{ env.VERSION }}.dmg" + if [ ! -f "$DMG_PATH" ]; then + echo "DMG not found at $DMG_PATH" + exit 1 + fi + OUT_DMG="rayforge-${{ steps.set-version.outputs.version }}-macos-intel.dmg" + mv "$DMG_PATH" "$OUT_DMG" + - name: Upload macOS bundle artifact uses: actions/upload-artifact@v4 with: @@ -90,14 +101,11 @@ jobs: path: rayforge-${{ steps.set-version.outputs.version }}-macos-intel-app.zip compression-level: 9 - - name: Upload Python distributions + - name: Upload DMG artifact uses: actions/upload-artifact@v4 with: - name: rayforge-${{ steps.set-version.outputs.version }}-macos-intel-dists - path: | - dist/*.whl - dist/*.tar.gz - if-no-files-found: error + name: rayforge-${{ steps.set-version.outputs.version }}-macos-intel-dmg + path: rayforge-${{ steps.set-version.outputs.version }}-macos-intel.dmg release: name: Create GitHub Release (Intel) @@ -112,19 +120,17 @@ jobs: with: name: rayforge-${{ needs.build.outputs.version }}-macos-intel-app.zip - - name: Download Python distributions + - name: Download DMG artifact uses: actions/download-artifact@v4 with: - name: rayforge-${{ needs.build.outputs.version }}-macos-intel-dists - path: ./dist + name: rayforge-${{ needs.build.outputs.version }}-macos-intel-dmg - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: files: | - rayforge-${{ needs.build.outputs.version }}-macos-intel.zip - dist/*.whl - dist/*.tar.gz + rayforge-${{ needs.build.outputs.version }}-macos-intel-app.zip + rayforge-${{ needs.build.outputs.version }}-macos-intel.dmg draft: false prerelease: false name: Release ${{ needs.build.outputs.version }}