← back to pin list

Brick 34: import rotation -- MetaCam's 'Rotate Drawing' setting + open-part doors

kerfmaster pin list · UI / workflow decisions

recordStates what the code does today. Auditable against the code — this is the only type that can go stale.

Content last changed 2026-09-02 — computed from the item itself, not typed.

Built 2026-09-02 (Jordan's ask via the MetaCam Drawing Import Settings screenshot -- 'Rotate Drawing: if taller than wider ... solves the X-length-bias issue'; Aristide 'go'). The decision: shop.json rotate_drawing (none / taller_than_wider / wider_than_taller) answered in Shop setup (? menu) seeds every import; a per-job operator force (Intake tab: follow shop rule / as drawn / stood 90) always wins -- seed, never bind. Sketches are typed as drawn and refuse; part lists have no geometry of their own. The mechanics: decision + record in run_pipeline (job.json intake_rotate: deg, dx/dy anchoring the true-bbox min corner at the 4-decimal standard, ran+source+note); the healed prims rotate inside _apply_healedits BEFORE the edit replay -- the brick-22 single seam, so all nine prim consumers read the same frame and heal edits (addressed by point in the frame the operator SAW) replay correctly. The rotation is an exact no-trig quarter turn ((x,y)->(dx-y, dy+x)) -- cos(pi/2) is 6.1e-17, not 0, and the same point through two code paths must land on the same float (jog keys, the pl_post 4-decimal stale gate). The SOURCE side (gray base layer, source turns, fidelity samples) rotates as a parsed drawing (bulges are rotation-invariant), so every comparison lives in one frame and the base layer moves WITH the part on screen. Stale rule: POST /api/jobs/<id>/intakerotate re-runs the pipeline -- downstream judgments drop, O-numbers kept, deliveries marked; a frame change never sits silently under a stage record. Open-part doors (Jordan 'I do not see a button'): every part-list row with an assigned part gets an open button, and a plain click on a nest placement (outside sequence mode) opens that part's own job. Proven: test_introt.py 20 controls (both rule directions, force-wins, min-corner anchor, base-layer rotation, off-centre hole lands rotated, heal PASS in the rotated frame, stale rule review-drop, refusals verbatim, junk pref 400) + live smoke on the public URL (upload tall part -> force 90 -> bbox swaps, source:operator; smoke job removed). Suites green: sheet_intake 36, healedit 23, sketch 21, dragcheck 15, tooling_doc, rules 11, part_list 24, pl_post 26. Honest limits: the rule re-evaluates on every pipeline re-run (a changed shop answer applies at the next re-heal, visibly via the stale rule); a part already reviewed keeps its frame until something re-runs the pipeline; who forced awaits operator accounts.