Add structural calculation worksheets

Collection of engineering calculation projects (Python + Typst), each with
input, calc script, tests, results, and generated PDF where available.
This commit is contained in:
smillmorel 2026-09-21 12:19:20 -04:00
commit d5ac3fca7e
81 changed files with 18668 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

View file

@ -0,0 +1,82 @@
#let navy = rgb("#1a3a5f")
#let muted = rgb("#626b73")
#let pass = rgb("#1f6b45")
#let fail = rgb("#9b2c2c")
#let calcsheet(
title: "Structural Calculation",
project: "",
prepared-by: "",
body,
) = {
set document(title: title, author: prepared-by)
set page(
paper: "us-letter",
margin: (x: 1in, top: 1.25in, bottom: 1in),
header: context {
grid(
columns: (1fr, 1fr),
align: (left, right),
image("../assets/logo.png", height: 30pt),
[#text(size: 9pt)[Project:] \
#text(size: 10pt, weight: "bold")[#project]],
)
},
footer: context {
set text(size: 8.5pt, fill: muted)
stack(
spacing: 4pt,
line(length: 100%, stroke: 0.5pt + muted),
[#prepared-by],
)
},
)
set text(font: "Libertinus Serif", size: 10pt, lang: "en")
set par(justify: true)
set heading(numbering: none)
show heading.where(level: 1): set text(size: 14pt, weight: "bold", fill: black)
show heading.where(level: 2): set text(size: 11pt, weight: "bold", fill: black)
show heading.where(level: 2): set block(above: 2em, below: 1em)
body
}
#let calcline(formula, note) = grid(
columns: (1.7fr, 1fr),
gutter: 4pt,
align: (left, left),
formula, text(size: 9pt, fill: muted, note),
)
#let check(label, demand, capacity, unit: "", ok: auto, demand-label: "Demand", capacity-label: "Capacity") = {
let utilization = demand / capacity
let passes = if ok == auto { utilization <= 1 } else { ok }
let color = if passes { pass } else { fail }
block(
breakable: false,
width: 100%,
stroke: 0.8pt + black,
inset: 8pt,
radius: 2pt,
)[
#grid(
columns: (1fr, auto),
[#text(weight: "bold")[#label]],
box(stroke: 0.8pt + color, inset: (x: 6pt, y: 2pt))[
#text(weight: "bold", fill: color)[#if passes { "OK" } else { "NOT OK" }]
],
)
#v(4pt)
#grid(
columns: (1fr, auto),
[
#demand-label: #calc.round(demand, digits: 2) #unit #h(14pt)
#capacity-label: #calc.round(capacity, digits: 2) #unit
],
[
D/C: #calc.round(utilization, digits: 2)
],
)
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,141 @@
#import "assets/sheet.typ": calcline, calcsheet, check
#show: calcsheet.with(
title: "Mudsill Analysis and Design",
project: "BNC Typical Shoring",
prepared-by: "Conemco Engineering",
)
#let round(value, digits: 2) = calc.round(value, digits: digits)
= Mudsill Analysis and Design
Analysis to determine the adequacy of a plywood mudsill supporting a shore post
base over compacted soil. The mudsill consists of stacked plywood panels
distributing the post load to the ground.
== Geometry and Loads
#let P = 3000.0
#let Bp = 6.0
#let Hp = 6.0
#let B = 18.0
#let H = 18.0
#let t = 0.75
#let N = 3
#calcline([$P = #P " lbf"$], [Post axial load on mudsill])
#calcline([$B_p = #Bp " in"$], [Post base width])
#calcline([$H_p = #Hp " in"$], [Post base length])
#calcline([$B = #B " in"$], [Mudsill panel width])
#calcline([$H = #H " in"$], [Mudsill panel length])
#calcline([$t = #t " in"$], [Plywood thickness])
#calcline([$N = #N$], [Number of plywood panels])
== Plywood Bearing Under Post Base
#let Ap = Bp * Hp
#let fbrg_ply = P / Ap
#let Fabrg = 360.0
#calcline([$A_p = B_p H_p = #round(Ap) " in"^2$], [Post base contact area])
#calcline(
[$f_"brg" = P / A_p = #round(fbrg_ply, digits: 3) " psi"$],
[Bearing stress in plywood],
)
#calcline([$F_"abrg" = #Fabrg " psi"$], [Allowable plywood bearing (D510 ch 4.4.7)])
#v(8pt)
#check(
"Plywood bearing under post base",
fbrg_ply,
Fabrg,
unit: "psi",
demand-label: [$f_"brg"$],
capacity-label: [$F_"abrg"$],
)
== Soil Bearing
#let Abrg = (B * H) / 144.0
#let fbrg_soil = P / Abrg
#let Fbrg = 2000.0
#calcline([$A_"brg" = (B H) / 144 = #round(Abrg, digits: 3) " ft"^2$], [Mudsill bearing area on soil])
#calcline(
[$f_"brg" = P / A_"brg" = #round(fbrg_soil, digits: 3) " psf"$],
[Soil bearing pressure],
)
#calcline([$F_"brg" = #Fbrg " psf"$], [Allowable soil bearing pressure])
#v(8pt)
#check(
"Soil bearing pressure",
fbrg_soil,
Fbrg,
unit: "psf",
demand-label: [$f_"brg"$],
capacity-label: [$F_"brg"$],
)
== Plywood Bending
The soil pressure acting on the panel produces a lineal load on the plywood
spanning between the post base edge and the panel edge. A 0.6 reduction factor
is applied to the soil pressure to account for partial loading at the cantilever.
#let B_ft = B / 12.0
#let w = 0.6 * fbrg_soil * B_ft
#let a = (H - Hp) / 2.0
#let a_ft = a / 12.0
#let M = w * a_ft * a_ft / 2.0
#let Sp = N * B * t * t / 6.0
#let fb = (M * 12.0) / Sp
#let FbS = 405.0
#let S = 1.125
#let Fb = FbS / S
#calcline([$w = 0.6 f_"brg" B = #round(w) " plf"$], [Lineal load on plywood])
#calcline([$a = (H - H_p) / 2 = #round(a) " in"$], [Cantilever length])
#calcline([$M = w a^2 / 2 = #round(M) " lbf" dot "ft"$], [Maximum bending moment])
#calcline([$S_p = N B t^2 / 6 = #round(Sp, digits: 3) " in"^3$], [Section modulus of plywood])
#calcline(
[$f_b = M / S_p = #round(fb, digits: 3) " psi"$],
[Bending stress in plywood],
)
#calcline([$F_b = F_"bS" / S = #round(Fb) " psi"$], [Allowable bending stress])
#v(8pt)
#check(
"Plywood bending stress",
fb,
Fb,
unit: "psi",
demand-label: [$f_b$],
capacity-label: [$F_b$],
)
== Plywood Shear
#let V = w * a_ft
#let Av = N * B * t
#let fv = 1.5 * V / Av
#let Fv = 90.0
#calcline([$V = w a = #round(V) " lbf"$], [Maximum shear force])
#calcline([$A_v = N B t = #round(Av, digits: 3) " in"^2$], [Shear area of plywood])
#calcline(
[$f_v = 1.5 V / A_v = #round(fv, digits: 3) " psi"$],
[Shear stress in plywood],
)
#calcline([$F_v = #Fv " psi"$], [Allowable shear stress])
#v(8pt)
#check(
"Plywood shear stress",
fv,
Fv,
unit: "psi",
demand-label: [$f_v$],
capacity-label: [$F_v$],
)