#import "assets/sheet.typ": calcline, calcsheet, check #let data = json("results.json") #let n = data.values #let checks = data.checks #let round(value, digits: 2) = calc.round(value, digits: digits) #show: calcsheet.with( title: "Wood Joist Analysis", project: data.project, prepared-by: data.prepared_by, ) = Wood Joist Analysis Simple-span wood joist under uniform gravity load, analyzed per NDS 2018 ASD. Pint parses `input.yaml`, `calc.py` computes the member capacities and checks. Typst determines the gravity-load demands below; the checked Python inputs are reconciled to those values by the test suite. == Loads Determination #let DL = 25 #let LL = 50 #let L = 9 #let B = 13 #let w = (DL + LL) * B #let wL = LL * B #let M = w * L * L / 8 #let V = w * L / 2 #let R = V #metadata((w_plf: w, wL_plf: wL, M_ftlbf: M, V_lbf: V, R_lbf: R)) #calcline([$L = #L " ft"$], [Simple span]) #calcline([$B = #B " ft"$], [Tributary spacing, on-center]) #calcline([$D = #DL " psf"$], [Dead load]) #calcline([$L_L = #LL " psf"$], [Live load]) #calcline([$w = (D + L_L) B = #w " plf"$], [Total uniform line load, Typst-derived]) #calcline([$w_("checked") = #round(n.w_plf, digits: 1) " plf"$], [Total uniform line load, checked input]) #calcline([$w_L = L_L B = #wL " plf"$], [Live uniform line load, Typst-derived]) #calcline([$w_("L,checked") = #round(n.wL_plf, digits: 1) " plf"$], [Live uniform line load, checked input]) #calcline([$M = w L^2 / 8 = #round(M, digits: 2) " ft·lbf"$], [Maximum moment, Typst-derived]) #calcline([$M_("checked") = #round(n.M_ftlbf, digits: 2) " ft·lbf"$], [Maximum moment, checked input]) #calcline([$V = w L / 2 = #V " lbf"$], [Support shear, Typst-derived]) #calcline([$V_("checked") = #round(n.V_lbf, digits: 1) " lbf"$], [Support shear, checked input]) #calcline([$R = V = #R " lbf"$], [Support reaction, Typst-derived]) #calcline([$R_("checked") = #round(n.R_lbf, digits: 1) " lbf"$], [Support reaction, checked input]) == Section Properties #calcline([$b = #n.b_in " in"$, $d = #n.d_in " in"$], [Joist width and depth]) #calcline([$A = b d = #round(n.A_in2, digits: 2) " in"^2$], [Section area]) #calcline([$I_x = b d^3 / 12 = #round(n.Ix_in4, digits: 1) " in"^4$], [Moment of inertia]) #calcline([$S_x = b d^2 / 6 = #round(n.Sx_in3, digits: 1) " in"^3$], [Elastic section modulus]) == Material And Adjustment Factors #calcline([$"Species/grade" = #n.species_grade$], [NDS Supplement reference values]) #calcline([$F_b = #n.Fb_psi " psi"$, $F_v = #n.Fv_psi " psi"$], [Reference bending and shear]) #calcline([$F_(c"⊥") = #n.Fcp_psi " psi"$], [Reference compression perpendicular to grain]) #calcline([$E = #n.E_psi " psi"$, $E'_"min" = #n.Emin_psi " psi"$], [Moduli of elasticity]) #calcline([$C_D = #n.CD$, $C_M = #n.CM$, $C_t = #n.Ct$, $C_F = #n.CF$], [Load duration, wet service, temperature, size]) #calcline([$C_r = #n.Cr$, $C_"fu" = #n.Cfu$, $C_i = #n.Ci$], [Repetitive member, flat use, incising]) == Flexure #calcline([$l_e = #n.le_in " in"$], [Unbraced length of compression edge]) #calcline([$R_B = sqrt(l_e d / b^2) = #round(n.RB, digits: 3)$], [Slenderness ratio, NDS 3.3.3]) #calcline([$F^*_b = F_b C_D C_M C_t C_F C_i C_r = #round(n.Fb_star_psi, digits: 1) " psi"$], [Adjusted reference bending]) #calcline([$F_("bE") = 1.20 E'_"min" / R_B^2 = #round(n.FbE_psi, digits: 1) " psi"$], [Critical buckling stress]) #calcline([$C_L = (1 + F_("bE")/F^*_b)/1.9 - sqrt(...) = #round(n.CL, digits: 4)$], [Beam stability factor, NDS 3.3.3]) #calcline([$F'_b = F^*_b C_L C_"fu" = #round(n.Fb_prime_psi, digits: 1) " psi"$], [Adjusted bending]) #calcline([$f_b = M / S_x = #round(n.fb_psi, digits: 1) " psi"$], [Acting bending stress]) #calcline([$M_a = S_x F'_b = #round(n.Ma_ftlbf, digits: 1) " ft·lbf"$], [Allowable moment]) #v(7pt) #check("Flexure", checks.flexure.demand, checks.flexure.capacity, unit: "psi", ok: checks.flexure.ok, demand-label: [$f_b$], capacity-label: [$F'_b$]) == Shear #calcline([$F'_v = F_v C_D C_M C_t C_"vr" = #round(n.Fv_prime_psi, digits: 1) " psi"$], [Adjusted shear]) #calcline([$f_v = 3 V / (2 A) = #round(n.fv_psi, digits: 3) " psi"$], [Acting shear stress]) #v(7pt) #check("Shear", checks.shear.demand, checks.shear.capacity, unit: "psi", ok: checks.shear.ok, demand-label: [$f_v$], capacity-label: [$F'_v$]) == Bearing #calcline([$l_b = #n.lb_in " in"$], [Bearing length]) #calcline([$l_("end") = #n.bed_in " in"$], [Distance from member end to near edge of bearing, >= 3 in]) #calcline([$C_b = (l_b + 0.375) / l_b = #round(n.Cb, digits: 3)$], [Bearing area factor, NDS 3.10.4]) #calcline([$F'_("c⊥") = F_("c⊥") C_M C_t C_i C_b = #round(n.Fcp_prime_psi, digits: 2) " psi"$], [Adjusted bearing]) #calcline([$A_b = l_b b = #round(n.Ab_in2, digits: 2) " in"^2$], [Bearing area]) #calcline([$f_("c⊥") = R / A_b = #round(n.fcp_psi, digits: 2) " psi"$], [Acting bearing stress]) #v(7pt) #check("Bearing", checks.bearing.demand, checks.bearing.capacity, unit: "psi", ok: checks.bearing.ok, demand-label: [$f_("c⊥")$], capacity-label: [$F'_("c⊥")$]) == Deflection #calcline([$Delta_"total" = 5 w L^4 / (384 E I_x) = #round(n.delta_total_in, digits: 3) " in"$], [Total-load deflection]) #calcline([$Delta_"live" = 5 w_L L^4 / (384 E I_x) = #round(n.delta_live_in, digits: 3) " in"$], [Live-load deflection]) #calcline([$L/240 = #n.delta_allow_total_in " in"$], [Total-load limit]) #calcline([$L/360 = #n.delta_allow_live_in " in"$], [Live-load limit]) #v(7pt) #check("Deflection (total)", checks.deflection_total.demand, checks.deflection_total.capacity, unit: "in", ok: checks.deflection_total.ok, demand-label: [$Delta_"total"$], capacity-label: [$L/240$]) #check("Deflection (live)", checks.deflection_live.demand, checks.deflection_live.capacity, unit: "in", ok: checks.deflection_live.ok, demand-label: [$Delta_"live"$], capacity-label: [$L/360$])