Ignotix

Pavilion / Umbrella Roof Studio

Orthographic · Top · Left · Right · 3D
PRODUCTION REFERENCE

Set the roof from three elevations — Top sets X/Y, Left sets Y/Z, Right sets X/Z — each corner draggable only within that view's plane. The 3D is built from all three, so each eave corner can sit at its own height.

CNC Post & eave snap free
POST HEIGHT
RUN (to eave)
SIDES—
COMMON PITCH—
HIP LEN (max)—
Inches. In Left/Right elevations, drag the peak handle to set post height; drag corners to set their height (Z).

01 Eave polygon

Regularize rebuilds an even polygon at the current run. Flatten Z sets all corner heights to 0.

01b Roof pitch

—
Sets post height so the common-rafter pitch equals the chosen X∶12. Steps 1–12.

02 Framing stock

Editable direct-saw envelope. Geometry remains exact even when a cut is flagged outside the selected machine travel.
Dressed depths: 2×4 3½″ · 2×6 5½″ · 2×8 7¼″ · 2×10 9¼″ · 2×12 11¼″.

03 Snap

04 Take-off settings

$/LF are placeholders — enter your supplier cost. Outside = inside × (1 + markup). LF includes waste.

AI Secured assistant

Requests are authenticated and processed by the server. Provider credentials and model selection are never exposed to this browser.
gate 75%
Top
·—

06 Solved member

Governing common rafter (longest run) — the member detailed in the Rafter view.

07 Roof & cut list

Hips / Valleys
#TypeRunLineTailTotalPlumbSeatHeelHAPFasciaSoffitJack ΔBacking L/RPost saw M/BZ
Commons (per face)
FacePitchPlumbSeatRunLineTailTotalHeelHAPFasciaSoffitSaw ∠ (from 90)Saw bevel (lean)
Jacks (each)
#FaceOffset from commonLineTailTotalPlumbSeatFasciaSoffitPlan jack↔hipSaw miterSaw bevelDirect?
Compound‑saw setup — stock laid flat (wide face on table), designated/top edge against the fence:  Saw miter = member slope θ;  Saw bevel = 90° minus the actual plan angle between the jack centerline and the hip cut plane.  Regular polygons reduce to familiar symmetric values; dragged/irregular vertices are solved from the actual lines, not half-corner shortcuts. Mirror the bevel for the opposite hip side. Hip backing is a longitudinal top-edge bevel, not this end-cut bevel. Direct? compares the exact setting to the editable saw envelope above; HOLD means alternate verified setup/jig/tool required.
Estimate / Export
.getElementById('dxfPrev');if(pb)pb.addEventListener('click',_openReferenceView);} const ba=document.getElementById('dxfAll'); if(ba)ba.addEventListener('click',async()=>{ const m=el('dxfMsg'); try{ const zip=new JSZip(); zip.file('rafter-ridge-1to1.dxf',_dxfRidge()); zip.file('rafter-birdsmouth-1to1.dxf',_dxfBird()); zip.file('rafter-tail-1to1.dxf',_dxfTail()); const blob=await zip.generateAsync({type:'blob'}); const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='rafter-cut-templates-1to1.zip';a.click(); if(m)m.textContent='Exported 3 templates (ZIP)'; }catch(e){if(m)m.textContent='Error: '+e.message;} }); })(); /* draggable input panels (01-05) with reset-to-home */ (function(){ document.querySelectorAll('.panel:not(.metrics-block)').forEach(function(p){ var h=p.querySelector('h3'); if(!h)return; var btn=document.createElement('button'); btn.type='button'; btn.title='Return to position'; btn.textContent='\u21bb'; btn.style.cssText='margin-left:auto;width:22px;height:22px;border-radius:50%;border:1px solid var(--gold-deep);background:var(--paper);color:var(--gold-deep);cursor:pointer;font-size:13px;line-height:1;display:none;align-items:center;justify-content:center;flex:0 0 auto'; h.appendChild(btn); h.style.cursor='move'; h.style.touchAction='none'; var dx=0,dy=0,drag=null; function apply(){var on=dx||dy;p.style.transform=on?('translate('+dx+'px,'+dy+'px)'):'';p.style.zIndex=on?'50':'';p.style.position=on?'relative':'';btn.style.display=on?'inline-flex':'none';} h.addEventListener('pointerdown',function(e){if(e.target===btn)return;drag={x:e.clientX,y:e.clientY,dx:dx,dy:dy};try{h.setPointerCapture(e.pointerId);}catch(_){}e.preventDefault();}); h.addEventListener('pointermove',function(e){if(!drag)return;dx=drag.dx+(e.clientX-drag.x);dy=drag.dy+(e.clientY-drag.y);apply();}); var up=function(){drag=null;}; h.addEventListener('pointerup',up); h.addEventListener('pointercancel',up); btn.addEventListener('pointerdown',function(e){e.stopPropagation();}); btn.addEventListener('click',function(e){e.stopPropagation();dx=0;dy=0;apply();}); }); })();