ParaShape

Underpurlin Roof

Underpurlin Roof

A gable roof framed with site-cut rafters in pairs that meet at a ridge board, each pair tied by a ceiling joist and a collar tie, with an underpurlin under the rafters on each side held by struts that stand on a plate laid over the ceiling joists. Plan length and span over the wall plates, Pitch, largest rafter spacing and overhang, Rafter, ceiling joist, ridge board and collar tie sections, Roof weight, underpurlin section and height, strut section

Details

Category: Roof Framing › Timber Roof Framing › Purlin and Strut Roofs

By Huu Khanh Nguyen · Updated November 4, 2026

Parameters

NameDefaultUnit
Length6000mm
Span7000mm
Pitch25°
Maximum Rafter Spacing600mm
Overhang450mm
Rafter Thickness45mm
Rafter Depth190mm
Wall Plate Width88.9mm
Ceiling Joist Thickness45mm
Ceiling Joist Depth140mm
Ridge Board Thickness19mm
Collar Tie Depth140mm
Roof Weight0
Underpurlin Thickness45mm
Underpurlin Depth190mm
Strut Thickness45mm
Underpurlin HeightjoistDepth + plateThickness + strutDepth + underpurlinDepthmm
Widthspan + 2 * overhangmm
Depthlengthmm
HeightMath.max(atticHeight + bandHeight, joistDepth) - (overhang > 0 ? -notch - overhang * slope : 0)mm
SlopeMath.tan(pitch * Math.PI / 180)
Rafter Run(span - ridgeThickness) / 2mm
Notch HeightseatWidth * slopemm
Band HeightrafterDepth * Math.sqrt(1 + slope * slope)mm
Attic Heightslope * run - notchmm
Collar Tie ThicknesscollarDepth == 140 ? 19 : 45mm
Strut Depth90mm
Strut Plate Thickness45mm
IntervalsMath.ceil((length - rafterThickness - joistThickness) / maximumSpacing)
Unit Spacing(length - rafterThickness - joistThickness) / intervalsmm
Collar Tie StrideMath.min(intervals, Math.max(1, Math.min(3, Math.floor(1800 / pitchStep))))
Underpurlin SetbackseatWidth + underpurlinHeight / slopemm
Strut LengthunderpurlinHeight - underpurlinDepth - joistDepth - plateThicknessmm
Strut IntervalsMath.ceil((length - strutDepth) / [[[[1100,1000,900],[1800,1500,1400],[2200,1900,1700],[2400,2100,1900],[2600,2300,2100]],[[1300,1200,1100],[2100,1900,1700],[2900,2600,2400],[4600,4100,3800],[5100,4500,4100]],[[4000,3500,3200],[5000,4500,4100],[6100,5400,5000]]],[[[1000,800,700],[1500,1300,1100],[2100,1700,1500],[2500,2100,1900],[2700,2400,2200]],[[1100,1000,900],[1800,1600,1400],[2400,2200,2000],[3900,3500,3200],[4700,4200,3800]],[[3300,3000,2700],[4200,3800,3500],[5100,4600,4200]]]][roofWeight][underpurlinThickness == 45 ? 0 : underpurlinThickness == 70 ? 1 : 2][[[90,140,190,240,290],[90,140,190,240,290],[190,240,290]][underpurlinThickness == 45 ? 0 : underpurlinThickness == 70 ? 1 : 2].indexOf(underpurlinDepth)][run * Math.sqrt(1 + slope * slope) <= 3000 ? 0 : run * Math.sqrt(1 + slope * slope) <= 4200 ? 1 : 2])
Strut Spacing(length - strutDepth) / strutIntervalsmm