History-free snapshot of the private development repository at 77a82eb. Code, docs and the public catalogue only: no plant or job knowledge layers, no client, job or producer names (tools/scrub.py clean against the widened term list; a second word-level grep clean). The intro deck is left out because its slide images cannot be checked for job drawings.
WillTools
Precast engineering tooling for Revit: shop-ticket QC against the design summary, and PCI Chapter 8 handling calculations. Built for one precast plant's workflow and shared here so a colleague can try it against their own.
Two halves, deliberately kept apart. WillTools.extension runs inside
Revit, on the model. panellift is plain CPython outside Revit — the same
handling arithmetic, testable in seconds with no Revit licence at all.
Quick start
git clone https://github.com/will123song/pyrevit-dev.git
cd pyrevit-dev
python tools/setup_machine.py
That installs the host-side Python dependencies and proves the install with
real answers — not just exit codes: it runs panellift against a published
worked example and checks the arithmetic against the number the article
prints. Read INSTALL.md for what to do with the output, and
for pointing pyRevit at the extension so the ribbon shows up in Revit.
Try the handling calculator immediately, no Revit needed:
python -m panellift examples/example-panel.job.json -o report.html
What works without knowledge layers, and what stands down
This distribution ships no knowledge — not a plant's parameter names,
not its casting-bed conventions, not even the published hardware catalogue.
See knowledge/README.md for why and what the shape
of a real layer looks like.
Runs fully, with no knowledge at all:
panellift's handling checks against a job file — the example above, or one you build by hand.- The ribbon itself, and Self Check, which tells you exactly what is and is not configured on this machine.
python tools/setup_machine.py --check— reports the no-knowledge state as a pass, not a failure. A knowledge-less trial install is an expected, first-class state here, not a broken one.
Stands down cleanly, with a stated reason rather than a wrong or silent answer: anything that needs a plant's parameter mapping, the published hardware catalogue, or the master shop-ticket checklist — most visibly, Ticket QC, which refuses to open with a one-line reason rather than rendering a report that looks like every ticket passed. Ask the owner for real knowledge layers once you are ready to point this at an actual job.
WillTools.extension — inside Revit
A pyRevit extension. Runs on IronPython 2.7 on Revit's UI thread, so it does the things that need the model and nothing that needs testing.
One tab, WillTools, four panels. Reorganised 2026-09-05: the modelling
and ticketing tools now sit behind Tools' Modeling pulldown, and the
analysis tools — finished and unfinished alike — sit behind Design's
DesignHub pulldown.
| Panel | Button | |
|---|---|---|
| Tools | Modeling ▾ | A pulldown. The order is the order of the work: suggest the reinforcing, check it once it is modelled, check it once it is ticketed. |
| ↳ Reinforce Suggestion | Suggests reinforcing for a design from what comparable designs already carry. | |
| ↳ Reinforcing QC | A cut-down Ticket QC for a panel whose reinforcing is finished but whose ticketing has not started — only the checks whose evidence is the panel's modelled content run. | |
| ↳ Ticket QC | Checks every shop ticket of a design against its spec — f'c, f'ci, I.T., strand count/grade/diameter, W.W.F., unit weight, pattern legend, size envelope. Needs a knowledge layer; see above. | |
| Snapshot | Takes a timestamped detached copy of the model at close-out. | |
| Setup | Config ▾ | A pulldown. The commands you run to get a job ready or to look at it sideways, rather than the ones you press all day. |
| ↳ Project Config | Writes the project config layer: every setting that is the engineer's to make, in one file, wherever they want it. | |
| ↳ Design Extract | Scrapes a design packet — every sheet whose number reduces to the design, and every view placed on them — reads it with the regex/geometry parser in-process, writes a reviewable spec.json. No AI call, no subprocess, nothing that leaves Revit. Run once per design. |
|
| ↳ Self Check | Probes everything the tools assume about this machine, this Revit and this model. Run it first on a new computer. | |
| ↳ Job Recon | Reconciles the issued ticket set against the whole job — the question no per-ticket check can answer, because a ticket that is not there cannot be checked. | |
| ↳ Takeoff | What the job contains, per piece and in total: hardware by part number, reinforcing by bar mark. | |
| Design | DesignHub ▾ | A pulldown. PanelLiftCheck and PanelAnalysis are finished and grouped here with the other analysis tools; the four rows after them are buttons-and-docs only and carry (WIP). |
| ↳ Panel Lift Check | PCI Chapter 8 handling check on the piece, from the insert positions the model already holds. | |
| ↳ Panel Analysis (WIP) | Opens an input-confirmation form, pre-filled from the model, feeding a Stage-0 self-weight solve; the full in-place/wind/service engine is not built yet. | |
| ↳ Beam Analysis (WIP) | Placeholder; nothing is implemented. | |
| ↳ Connection Analysis (WIP) | Placeholder; nothing is implemented. | |
| ↳ Gravity (WIP) | Gravity load chasing. Unfinished; today the button writes nothing at all. | |
| ↳ Lateral (WIP) | Lateral extraction. Unfinished; today it writes a JSON model, two CSVs, and a RISA draft that is deliberately not a real RISA input yet. | |
| Lab | GOD_MOD | Opens Claude Code in a terminal on this repository, wired to the running Revit through a local bridge. Optional — every engineering button runs without it. |
Anything half-built lives behind the Design panel's pulldown and carries
(WIP) in its name, so nothing unfinished ever sits beside a tool that
works on Tools or Setup — DesignHub itself is the one pulldown
that mixes finished and unfinished rows, because the owner wants the
analysis tools grouped together rather than split across panels.
The design intent lands on disk as JSON that a human reads and corrects before anything trusts it. Repeated checking is then pure arithmetic — no model, no judgement, same answer every time.
See INSTALL.md to deploy it, including on a different Revit version.
panellift — outside Revit
PCI Design Handbook Chapter 8 handling checks: stripping and yard handling of flat panels, from the insert positions the model already holds.
Plain CPython, no dependencies, and no Revit import anywhere. That is the point — a calculation whose output reaches a plant has to be verifiable, and verifiable means a test suite that runs in seconds without a licence.
It reproduces every published number in the ASPIRE Winter 2019 worked examples (which reprint PCI Table 8.3.1 and Figure 8.3.2), and it derives PCI's 0.0214 moment coefficient from the beam solution rather than quoting it:
cd panellift && python -m pytest
Run it rather than trusting a number printed here — a suite grows every day and a README does not.
See panellift/PLAN.md for what is built, what is next, and the idealisations that are known to be idealisations.
Filing feedback
Please do — that is what this trial is for. Two templates when you open an issue: Bug report for something that crashed or gave a wrong answer, Question for something that was unclear.
One thing worth knowing before you file: this tool refuses rather than guesses, by design. A row that reads "NOT JUDGED" with a stated reason — an unmapped parameter, a missing knowledge layer, a check that legitimately has nothing to say about this piece — is very often the tool working correctly, not a bug. The bug report template asks you to tell these two apart:
- Wrong answer — it computed something, and the something is wrong, or
it crashed. That is a code bug; file the Bug report template, and paste
python tools/setup_machine.py --check's full output — it is the single most diagnostic thing you can attach. - Refused, and I think it shouldn't have — it declined to answer and you believe it had enough information to. That is usually knowledge-layer work (a parameter role that needs mapping, a rating that needs publishing) rather than a code fix — file it as a Question, and say what you expected it to know.
No client or job data in an issue, a PR, or a screenshot — ever. See CONTRIBUTING.md for the placeholder convention this project uses everywhere instead.
What to ask the owner for
This distribution ships no knowledge on purpose. To point it at a real job you will want, from the owner directly (not filed as an issue — these are not code, and they identify a real plant):
- a plant knowledge layer — your office's parameter names, casting-bed conventions, and rigging defaults;
- the published hardware catalogue — manufacturer ratings for lifting inserts and connectors, plus the master shop-ticket checklist Ticket QC reads;
- sample decks or a walkthrough, if you want a guided first run rather than
starting from the example in
examples/.
Working on this
- Never use pyRevit → Reload. Restart Revit. A reload leaves the routes handler pointing at a dead engine and the next bridge request kills Revit.
- IronPython 2.7 syntax under
WillTools.extension/; modern Python is fine intools/andpanellift/. - Any change to a model needs a Transaction. Internal units are decimal feet.
- Scope every
FilteredElementCollector. An unfiltered one crashed Revit.
See CONTRIBUTING.md before opening a PR.