Table values in millimeters
64-bitConverts each published row to millimeters, mm² and kg/m.
mm = in × 25.4; mm² = in² × 25.4 × 25.4; kg/m = lb/ft × 1.48816394; r = (k_des − t_f) × 25.4
Lengths use the exact 25.4. The mass factor 1.48816394 is 0.45359237 ÷ 0.3048 rounded to nine significant digits (the full value is 1.4881639435695…). The root radius of W shapes is a difference of two published values. EN areas are cm² × 100.
function build() {
const out = [];
const add = (p) => { if (p.pub) freeze(p.pub); out.push(freeze(p)); };
const rev = (t) => t.slice().reverse(); // the database lists the largest first; pickers read better smallest first
// the order DetailCraft has always listed (W, C, L, HSS, IPE/HEA/HEB), then the families added with this table
for (const [n, d, bf, tw, tf, k, A, W] of rev(AISC_W)) {
add({ name: displayName(n), family: 'W', kind: 'I', source: 'aisc', d: d * IN, bf: bf * IN, tw: tw * IN, tf: tf * IN, r: (k - tf) * IN,
areaPub: A * IN * IN, massPub: W * LBFT, pub: { units: 'in', d, bf, tw, tf, kdes: k, A, W } });
}
for (const [n, d, bf, tw, tf, A, W] of rev(AISC_C)) {
add({ name: displayName(n), family: 'C', kind: 'C', source: 'aisc', d: d * IN, bf: bf * IN, tw: tw * IN, tf: tf * IN, r: 0,
areaPub: A * IN * IN, massPub: W * LBFT, pub: { units: 'in', d, bf, tw, tf, A, W } });
}
for (const [n, b, t, A, W] of rev(AISC_L)) {
add({ name: displayName(n), family: 'L', kind: 'L', source: 'aisc', b: b * IN, t: t * IN,
areaPub: A * IN * IN, massPub: W * LBFT, pub: { units: 'in', b, t, A, W } });
}
for (const [n, H, B, tn, t, A, W] of rev(AISC_RHS)) {
add({ name: displayName(n), family: 'HSS', kind: 'RHS', source: 'aisc', h: H * IN, b: B * IN, t: t * IN, tNom: tn * IN, ro: 2 * t * IN, ri: t * IN,
areaPub: A * IN * IN, massPub: W * LBFT, pub: { units: 'in', H, B, tNom: tn, t, A, W } });
}
for (const [n, D, tn, t, A, W] of rev(AISC_CHS)) {
add({ name: displayName(n), family: 'HSS', kind: 'CHS', source: 'aisc', D: D * IN, t: t * IN, tNom: tn * IN,
areaPub: A * IN * IN, massPub: W * LBFT, pub: { units: 'in', D, tNom: tn, t, A, W } });
}
for (const [n, h, b, tw, tf, r, A, G] of EN_I) {
add({ name: n, family: n.slice(0, 3), kind: 'I', source: 'en', d: h, bf: b, tw, tf, r,
areaPub: A * 100, massPub: G, pub: { units: 'mm', h, b, tw, tf, r, A, G } });
}
for (const [n, d, bf, tw, tf, k, A, W] of rev(AISC_S)) {
add({ name: displayName(n), family: 'S', kind: 'I', source: 'aisc', d: d * IN, bf: bf * IN, tw: tw * IN, tf: tf * IN, r: 0,
areaPub: A * IN * IN, massPub: W * LBFT, pub: { units: 'in', d, bf, tw, tf, kdes: k, A, W } });
}
for (const [n, long, short, t, A, W] of rev(AISC_L2)) {
add({ name: displayName(n), family: 'L', kind: 'L', source: 'aisc', b: short * IN, h: long * IN, t: t * IN,
areaPub: A * IN * IN, massPub: W * LBFT, pub: { units: 'in', long, short, t, A, W } });
}
for (const [n, D, tn, t, A, W] of AISC_PIPE.slice().sort((x, y) => x[1] - y[1] || x[2] - y[2])) { // by OD, then wall
add({ name: n, family: 'Pipe', kind: 'CHS', source: 'aisc', D: D * IN, t: t * IN, tNom: tn * IN,
areaPub: A * IN * IN, massPub: W * LBFT, pub: { units: 'in', D, tNom: tn, t, A, W } });
}
for (const [n, h, b, tw, tf, r1, r2, A, G] of EN_UPN) {
add({ name: n, family: 'UPN', kind: 'C', source: 'en', d: h, bf: b, tw, tf, r: 0,
areaPub: A * 100, massPub: G, pub: { units: 'mm', h, b, tw, tf, r1, r2, A, G } });
}
return out;
}