Sheet Forge Hub -- Unified Sheets Workspace
Single window that consolidates every Sheets-panel action. Seven sidebar views cover duplicate, create, reorder, title blocks, rename, presets, and history from one entry point.
Sheet Forge Hub
Unified Sheets Workspace. Sheet Forge Hub is the consolidated entry point for every sheet-management action Pyvoid ships. One ribbon button opens a window with seven sidebar views: Duplicate, Create, Reorder, Title Blocks, Rename, Presets, History. It replaces what used to be eleven scattered pushbuttons.
The deprecated pushbuttons (Sheet Forge, Batch Sheet Maker, ReOrder Sheets, Rename Sheets, Increment / Decrement Sheet Numbers, Rename PDF Sheets, List Title Blocks, Select Sheets, plus Load / Save / Manage Presets and Undo Last) still work during this release - they redirect here. They will be removed in the next release.
flowchart LR
RB["Sheet Forge Hub.pushbutton"] --> HUB["SheetForgeHubWindow"]
HUB --> DUP["Duplicate\n(launches wizard)"]
HUB --> CRE["Create\n(inline form)"]
HUB --> REO["Reorder\n(launches window)"]
HUB --> TB["Title Blocks\n(DataGrid)"]
HUB --> REN["Rename\n(4 sections)"]
HUB --> PRE["Presets\n(CRUD)"]
HUB --> HIS["History\n(undo last)"]When to use it
- You need to duplicate, create, reorder, or rename sheets and do not want to hunt through pulldowns.
- A teammate is onboarding and has never seen the Increment / Decrement numbering tools buried in the old Rename pulldown.
- You want to browse every title block instance in the model and jump to one in the canvas.
- You want to roll back the last sheet operation without guessing whether Ctrl+Z is on the right step.
The seven views
Duplicate
Launches the full Sheet Forge wizard (the six-step duplication tool documented in sheet-forge.md) as a child window owned by the hub. The wizard's behaviour, presets, and transaction handling are unchanged from the standalone pushbutton. When the wizard closes the hub stays open on the Duplicate view.
Create
A structured form for batch sheet creation.
- Prefix (string), Start number (integer), Count (integer), Title block (dropdown of loaded title-block types), optional Name template (string).
- Preview button renders a read-only list of every
{number, name}pair that will be created so you can review before committing. - Create button runs the creation loop inside a single Revit transaction.
This replaces the tab-separated text-area in the old Batch Sheet Maker for routine "give me ten A-series sheets" batches. If you rely on CSV-driven creation, keep using the standalone Batch Sheet Maker pushbutton during the shim window.
Reorder
Launches the ReOrder Sheets window as a child modal. Reorder depends on an Integer Order project parameter bound to Sheets as an instance binding. The hub auto-detects the binding state at open time:
| State | Sidebar behaviour |
|---|---|
| Parameter present, Integer, instance binding, writable | Enabled. Click opens the Reorder window. |
| Parameter exists but wrong type / binding / read-only | Disabled. Tooltip: "An 'Order' parameter exists but is not a writable Integer instance parameter on Sheets. Correct its type in Parameter Jammer." |
No Order parameter | Disabled. Tooltip: "Requires an Integer project parameter named 'Order' bound to Sheets as an instance binding. Use Parameter Jammer to create it." |
Clicking a disabled item routes to a degraded content pane that repeats the message plus a Parameter Jammer deep link. The hub never auto-creates project parameters.
Title Blocks
Sortable WPF DataGrid with one row per sheet's title block. Columns: Sheet Number, Sheet Name, Title Block Family, Title Block Type, Element Id.
Click a row and the hub calls uidoc.Selection.SetElementIds() with that title block's ElementId. Revit's Properties panel updates immediately so you can jump to a title block without leaving the hub.
Trade-off vs. the old List Title Blocks pushbutton: the WPF modal has no access to the Pyvoid output panel, so the
linkify()hyperlinks from the old tool are gone. If you specifically need clickable row links in an output log, keep using the standalone List Title Blocks pushbutton during the shim window. Row-click selection covers most of the original workflow.
Rename
Four sections in one scrolling view, each wrapped in a PyvoidSectionBorder:
- Rename Sheets - delegates to the existing rename wizard (
preview_and_execute+pick_optionflow from the Rename Sheets pushbutton). - Increment Numbers - numeric spinner (default 1, range 1-999), Preview button, then Apply (disabled until Preview runs). Preview calls
shift_sheet_numbers(dry_run=True)and renders before / after pairs. Apply commits under one transaction and shows a final confirmation modal ifconfirm_destructive_renameis enabled in Settings. - Decrement Numbers - same Preview / Apply gating as Increment but shifts negative.
- Rename PDF Files - folder picker plus regex-driven rename. All filesystem, no Revit API. Regex patterns are compiled with a 2-second timeout to reject catastrophic-backtracking patterns. Every rename pair is logged to
%TEMP%/pyvoid_rename_pdf_<timestamp>.jsonlso a mid-batch failure can be rolled back.
Presets
DataGrid of preset files from the unified preset directory (sheet_forge.constants.get_preset_dir()) plus five actions:
- Load - set the selected preset as the active config.
- Save - prompt for a name, write to disk. Preset names are validated (alphanumeric plus
-_);../evil.jsonor absolute paths are rejected. - Delete - prompt for confirmation, remove file.
- Import - OpenFileDialog, copy into preset dir.
- Export - SaveFileDialog, copy to user path.
Presets written in this release carry schema_version: 1 at the top level. Loading a v0 preset (no schema_version) migrates to v1 in memory without rewriting the file on disk.
History
Summary card for the most recent successful hub operation (timestamp, action, count) plus an Undo Last button.
Undo Last posts Revit's native PostableCommand.Undo via uiapp.PostCommand. Before posting, it compares the name of Revit's topmost undo entry against the displayed hub operation. If they differ (for example you duplicated sheets, then moved a door in Revit before clicking Undo Last), a confirmation modal appears:
"The most recent Revit action is "<top name>", not "<expected>". Continuing will undo "<top name>". Continue?"
Cancel does nothing. Continue posts the undo. When there is no hub operation in the current session the view shows "No operations yet".
Workflow: full sheet setup in the hub
- Click Sheet Forge Hub.
- Duplicate view is selected by default - click Open Duplicate Wizard to copy a source sheet set.
- Close the wizard when finished. Switch to Rename and Increment / Decrement to clean up numbering.
- Switch to Title Blocks to verify every new sheet has the right title block; click any row that is wrong and reassign in the canvas.
- Switch to History to confirm the last operation and undo if anything slipped.
Everything happens in one window. No ribbon trips.
Settings
Hub-wide settings live at Settings Hub -> Sheets -> Sheet Forge Hub. Current options:
default_landing_view- which sidebar view opens on first click (default:duplicate).confirm_destructive_rename- whether Increment / Decrement Apply shows the extra confirmation modal (default:true).migrate_keyboard_shortcuts_on_hotload- one-shot migration helper; when toggled on, next hotload rewrites user shortcuts that point at deprecated pushbuttons to point atSheet Forge Hub.pushbuttonand resets the flag.
The gear icon in the hub title bar deep-links into this Settings Hub section.
Keyboard shortcuts
The Sheet Forge Hub pushbutton inherits any shortcut you had on the old Sheet Forge.pushbutton. If you customised a shortcut to one of the ten deprecated pushbuttons, flip migrate_keyboard_shortcuts_on_hotload to true in Settings and hotload once to rewrite it.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Reorder sidebar item is disabled | No Integer Order parameter bound to Sheets as instance | Use Parameter Jammer to create it. |
| Reorder disabled even after creating the parameter | Parameter is a Type binding or wrong data type | Rebind as Instance, Integer, in Parameter Jammer. |
| Title Blocks view is empty | No title block families are loaded or no sheets have title blocks placed | Load a title block family and assign it to at least one sheet. |
| Undo Last warns about a mismatched action | Something else happened in Revit between the hub operation and the click | Review the named action in the modal. Cancel if it is not what you expected. |
| Deprecated pushbutton opens a "This tool has moved" alert | You clicked a shim | The hub opens to the right view right after. Update macros / training material to use Sheet Forge Hub.pushbutton. |
Related
- Sheet Forge - the underlying six-step duplication wizard opened from the Duplicate view.
- Grid Renamer - the only other button left on the Sheets panel after the consolidation.
- docs/guides/migration/sheet-forge-hub-v1.md - rollout guide for BIM managers.
- PRD:
docs/prd/PRD_SheetForgeHub.md- full requirement and phase history.
Last updated: 2026-04-18