From 55781f7dbd0c6a517cf3167ee1812dba5b8aa86e Mon Sep 17 00:00:00 2001
From: Claude
Date: Fri, 3 Jul 2026 02:19:53 +0000
Subject: [PATCH] docs: add task-oriented How-To Guides (in-app + GitHub); bump
to 1.8.34
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The in-app User Guide gains a 'How-To Guides' tab: a clickable A–I index of
step-by-step recipes for the things users actually do — map & render, set up a
watch folder, auto-assemble previz from a filename convention, route setups to
scenes, batch-render, auto-deliver, submit to Deadline, save presets, and a
'clips aren't picked up' troubleshooter — each with numbered steps and the
relevant screenshots. In-page anchor links scroll within the tab.
docs/user-guide.md mirrors the same recipes for GitHub. README already links it.
Co-Authored-By: Claude Fable 5
Claude-Session: https://claude.ai/code/session_01F3rfxvrhYUyjTsifsuJw9s
---
app_qt.py | 180 ++++++++++++++++++++++++++++++++++++++++++++-
app_version.py | 2 +-
docs/user-guide.md | 91 +++++++++++++++++++++--
3 files changed, 265 insertions(+), 8 deletions(-)
diff --git a/app_qt.py b/app_qt.py
index d982661..57134d6 100644
--- a/app_qt.py
+++ b/app_qt.py
@@ -642,8 +642,13 @@ def _show_help_dialog(self, title: str, html: str) -> None:
lay.addWidget(btns)
dlg.exec()
- def _on_help_anchor(self, url: QUrl, _dlg: QDialog) -> None:
+ def _on_help_anchor(self, url: QUrl, _dlg: QDialog, browser: QTextBrowser | None = None) -> None:
spec = url.toString()
+ # In-page jump (the How-To index links): scroll this tab, don't leave it.
+ if spec.startswith("#"):
+ if browser is not None:
+ browser.scrollToAnchor(spec[1:])
+ return
if not spec.startswith("action:"):
QDesktopServices.openUrl(url) # external link → system browser
return
@@ -705,7 +710,8 @@ def _show_user_guide(self) -> None:
browser.setStyleSheet(
f"QTextBrowser {{ border: none; background: {pal.surface}; padding: 20px 26px; }}")
browser.setHtml(css + body)
- browser.anchorClicked.connect(lambda url, d=dlg: self._on_help_anchor(url, d))
+ browser.anchorClicked.connect(
+ lambda url, d=dlg, b=browser: self._on_help_anchor(url, d, b))
tabs.addTab(browser, title.replace("&", "&&")) # && → literal & (not a mnemonic)
lay.addWidget(tabs)
btns = QDialogButtonBox(QDialogButtonBox.StandardButton.Close)
@@ -746,6 +752,176 @@ def _guide_sections() -> list[tuple[str, str]]:
show/hide panels from View. Press ⌘K for the command
palette, and switch light/dark in View. First, point the app at
Blender (or let it fetch one) in Properties.
+ """),
+ ("How-To Guides", """
+ How-To Guides
+ Step-by-step recipes for the things you'll actually do.
+ Each is self-contained — jump to the one you need.
+
+
+ A · Map clips onto a scene and render
+
+ | 1 | Drag your 3D file (.blend,
+ .c4d, .glb) onto the Scene box and click
+ Scan Scene. Its materials appear in the list. |
+ | 2 | Drag your videos into the Videos list and
+ choose a Camera. |
+ | 3 | Click Auto-match to pair clips to materials
+ by name — or drag a clip onto a material to link them by hand. |
+ | 4 | Check resolution, frame range, format and quality
+ in the Render panel (see the Render Settings tab). |
+ | 5 | Press Render (⌘R). Watch progress
+ and the Live Preview; the finished file can open, reveal, or copy
+ itself somewhere when done. |
+
+
+ B · Set up a watch folder (auto-render drops)
+ Hands-off: point the app at a folder and every clip dropped
+ there imports, maps onto your scene, and renders — great for “drop a new cut,
+ get a new preview” loops.
+ 
+
+ | 1 | Load the scene and clips once, and
+ mark which screens matter: right-click a material → Mark as Render
+ Target (or click the coloured stripe on its left edge). |
+ | 2 | Open View → Watch & Auto-render. In
+ ① Source, click Choose… and pick the folder to watch. |
+ | 3 | In ② Mode, leave it on Auto-map onto the
+ current scene. |
+ | 4 | In ④ Output, turn on Start renders
+ automatically (off = jobs just queue for you to start). Set the output
+ folder, or leave it blank for a PREVIZ subfolder. |
+ | 5 | Press Start. Drop a clip named like a
+ material and it maps + renders on its own. A newer _v2 next to
+ _v1 takes over automatically — latest wins. |
+
+ Tips: raise Wait if very large files are still
+ copying when grabbed; tick Include subfolders to watch per-day/per-setup
+ folders too; the ⑤ Activity feed logs every ingest (and survives a
+ restart).
+
+ C · Auto-assemble previz from a filename convention
+ If your footage is named by a convention, the watch folder can
+ build one multi-screen render per asset instead of mapping onto one
+ scene — drop 10 clips, get 5 assembled previz renders.
+ 
+
+ | 1 | Open View → Watch &
+ Auto-render and in ② Mode choose Previz assembly — one render
+ per asset. The ③ Naming card appears. |
+ | 2 | Build the filename pattern from chips — no
+ regex. {Field} = text, {Field#} = number,
+ add ? for optional. Hyphens are fine
+ (TC-MASTER). |
+ | 3 | Paste a real filename into the sample box.
+ The live preview shows exactly what parses — or where it stopped and
+ what it expected. |
+ | 4 | Fill Screen → Material (which material each
+ screen code drives) and, if you have multiple scenes,
+ Setup # → Scene (see guide D). |
+ | 5 | Click Preview (dry run) to see exactly what
+ WOULD assemble — per asset: screen → material → clip → version — plus every
+ skipped clip and why. Then press Start. |
+
+ 
+ Example pattern for a touring show:
+ {ID#}_D{Day#}_{Section}_{Cue}_{Screen}_v{Version#} parses
+ 80230_D2_War-Treaty_MusicH_TC-MASTER_v001.mp4 into its fields
+ automatically.
+
+ D · Route setups to different scene files
+ A show with several stage layouts (D1, D2, …) can send each
+ setup’s clips to its own scene.
+
+ | 1 | Add a Setup field to your naming
+ pattern, e.g. …_S{Setup#}_… (or use the Day field if
+ that’s what distinguishes them). |
+ | 2 | In the ③ Naming card’s Setup # → Scene
+ table, click + Add and map each setup number to its scene file —
+ 1 → /…/D1.c4d, 2 → /…/D2.c4d. |
+ | 3 | Unmapped setups fall back to the currently loaded
+ scene. Use Preview (dry run) to confirm each asset shows the right
+ scene before rendering. |
+
+
+ E · Batch-render one mapping across many clips
+
+ | 1 | Set up the scene + mapping once
+ (guide A). |
+ | 2 | Add all the clips you want rendered with that
+ mapping to the Videos list. |
+ | 3 | Use Queue current mapping — one job per clip
+ is added, each with its own resolved output name. Reorder, rename, set
+ priority, or remove any of them in the Queue. |
+ | 4 | Press Render All. Jobs run in order; each
+ reports duration and per-frame metrics when done. |
+
+
+ F · Deliver finished renders automatically
+
+ | 1 | Open View → Watch &
+ Auto-render (or the render settings) and find ④ Output → Delivery. |
+ | 2 | Set a Copy to folder — a synced review
+ folder, a hand-off share, anything. |
+ | 3 | Every finished render is now also copied there
+ automatically. Combine with a watch folder + auto-start for a fully
+ hands-off “clip lands → assembled preview appears in the review folder”
+ pipeline. |
+
+
+ G · Render on a Deadline farm
+
+ | 1 | Open
+ Properties → Deadline and point the
+ app at your Deadline repository (and deadlinecommand if
+ it isn’t auto-found). Click Test. |
+ | 2 | Build your jobs in the Queue as usual (Blender
+ and C4D both submit). |
+ | 3 | Choose Submit to Deadline instead of a local
+ render. Frames spread across your nodes; the app hands off and the farm
+ takes it from there. |
+
+
+ H · Save a look as a preset
+
+ | 1 | Dial in resolution, format, quality,
+ tone-mapping and the other render settings you like. |
+ | 2 | Save Preset… and name it (e.g. “Client
+ Review 1080p”). |
+ | 3 | Later, Load Preset… — or apply it to queued
+ jobs — to reproduce that look in one click. Presets live in the
+ Presets browser. |
+
+
+ I · Fix “my clips aren’t being picked up”
+ 
+
+ | Skipped badge | If ⑤ Activity shows
+ “N clip(s) skipped — why?”, click it — the dry run names every
+ skipped file and the reason (name doesn’t match, screen not mapped, older
+ version). |
+ | In a subfolder? | Turn on Include subfolders
+ in ① Source if clips land in nested folders. |
+ | Cloud placeholder | Dropbox/OneDrive “online-only”
+ files are skipped until their contents actually download — right-click →
+ Always keep on this device. |
+ | Still copying | A file must hold its size for the
+ Wait window before import; raise it for slow copies of huge
+ files. |
+ | Pattern mismatch | Use the live preview in ③ Naming
+ with a real filename — it pinpoints the first character where it
+ diverged. |
+
"""),
("Scene & Clips", """
Scene & Clips
diff --git a/app_version.py b/app_version.py
index 5485b34..899eaa9 100644
--- a/app_version.py
+++ b/app_version.py
@@ -4,5 +4,5 @@
CI, so the version lives in exactly one place. CI fails a ``v`` release
tag whose value doesn't match this string.
"""
-__version__ = "1.8.33"
+__version__ = "1.8.34"
APP_NAME = "Render Mapper Pro" # display name; single source shared by the app + mixins
diff --git a/docs/user-guide.md b/docs/user-guide.md
index 8405111..70d1962 100644
--- a/docs/user-guide.md
+++ b/docs/user-guide.md
@@ -20,11 +20,16 @@ screenshots and clickable links into the relevant settings).
- [③ Naming](#-naming--teach-it-your-convention)
- [④ Output & delivery](#-output--delivery)
- [⑤ Activity](#-activity--trust-but-verify)
-3. [Filename pattern reference](#filename-pattern-reference)
-4. [The queue](#the-queue)
-5. [Render engines](#render-engines)
-6. [Crash reports](#crash-reports)
-7. [Troubleshooting & FAQ](#troubleshooting--faq)
+3. [How-to recipes](#how-to-recipes)
+4. [Filename pattern reference](#filename-pattern-reference)
+5. [The queue](#the-queue)
+6. [Render engines](#render-engines)
+7. [Crash reports](#crash-reports)
+8. [Troubleshooting & FAQ](#troubleshooting--faq)
+
+> The same guidance is built into the app under **Help → User Guide** — the
+> **How-To Guides** tab has these recipes with screenshots and clickable links
+> into the relevant settings.
---
@@ -44,6 +49,82 @@ screenshots and clickable links into the relevant settings).
---
+## How-to recipes
+
+Task-oriented walkthroughs for the things you'll actually do. The [Watch &
+Auto-render](#watch--auto-render) deep dive below covers the panel field by
+field; these are the "just tell me the steps" versions.
+
+### A · Map clips onto a scene and render
+
+1. Drag your 3D file (`.blend`, `.c4d`, `.glb`) onto the **Scene** box → **Scan Scene**.
+2. Drag your videos into the **Videos** list, choose a **Camera**.
+3. **Auto-match** to pair clips to materials by name, or drag a clip onto a material.
+4. Set resolution / range / format / quality in the **Render** panel.
+5. **Render** (`⌘R`). Watch the Live Preview; the output can open/reveal/copy itself when done.
+
+### B · Set up a watch folder (auto-render drops)
+
+1. Load the scene + clips once, then **right-click a material → Mark as Render Target** for each screen that matters.
+2. **View → Watch & Auto-render → ① Source → Choose…** the folder.
+3. **② Mode** = *Auto-map onto the current scene*.
+4. **④ Output** → turn on **Start renders automatically** (off = jobs just queue). Set an output folder or leave blank for a `PREVIZ` subfolder.
+5. Press **Start**. Drops import, map and render; a newer `_v2` supersedes `_v1` automatically.
+
+### C · Auto-assemble previz from a filename convention
+
+1. **② Mode** = *Previz assembly — one render per asset*. The **③ Naming** card appears.
+2. Build the **pattern** from chips (no regex): `{Field}` text, `{Field#}` number, add `?` for optional. Hyphens are fine.
+3. Paste a real filename into the **sample** box — the live preview shows what parses (or where it stopped).
+4. Fill **Screen → Material** and, for multiple scenes, **Setup # → Scene** (recipe D).
+5. **Preview (dry run)** to confirm what would assemble + what's skipped, then **Start**.
+
+Example: `{ID#}_D{Day#}_{Section}_{Cue}_{Screen}_v{Version#}` parses
+`80230_D2_War-Treaty_MusicH_TC-MASTER_v001.mp4` into its fields automatically.
+
+### D · Route setups to different scene files
+
+1. Include a `{Setup#}` (or `{Day#}`) field in the pattern.
+2. In **Setup # → Scene**, **+ Add** each setup number → its scene (`1 → D1.c4d`, `2 → D2.c4d`).
+3. Unmapped setups use the loaded scene. **Preview (dry run)** confirms each asset's scene.
+
+### E · Batch-render one mapping across many clips
+
+1. Set up the scene + mapping once (recipe A).
+2. Add every clip you want rendered with it to the **Videos** list.
+3. **Queue current mapping** → one job per clip, each with its own output name.
+4. **Render All**. Jobs run in order and report metrics when done.
+
+### F · Deliver finished renders automatically
+
+1. Find **④ Output → Delivery** (or the render settings).
+2. Set a **Copy to** folder (a synced review/hand-off folder).
+3. Every finished render is also copied there. Combine with B for a fully hands-off pipeline.
+
+### G · Render on a Deadline farm
+
+1. **Properties → Deadline** → point at your repository (and `deadlinecommand` if not auto-found) → **Test**.
+2. Build jobs in the Queue as usual (Blender *and* C4D both submit).
+3. Choose **Submit to Deadline** instead of a local render — frames spread across your nodes.
+
+### H · Save a look as a preset
+
+1. Dial in resolution, format, quality, tone-mapping, etc.
+2. **Save Preset…** and name it.
+3. **Load Preset…** later (or apply to queued jobs) to reproduce it in one click.
+
+### I · Fix "my clips aren't being picked up"
+
+| Check | Fix |
+|---|---|
+| **Skipped badge** in ⑤ Activity | Click **"N clip(s) skipped — why?"** — the dry run names every file and reason. |
+| Clip in a subfolder | Turn on **Include subfolders** in ① Source. |
+| Cloud placeholder | Right-click → *Always keep on this device* (online-only files are skipped until downloaded). |
+| Still copying | Raise the **Wait** window for slow copies of huge files. |
+| Pattern mismatch | Use the live preview in ③ Naming — it pinpoints the first divergence. |
+
+---
+
## Watch & Auto-render
The Watch panel is a single automation rule that reads top to bottom: