How cap/base profiles map to calculator fields, how mesh and basecoat usage are computed from the DXF, and how to price custom caps.
A cap (or base) is a profiled ring that sits on top of (or under) a column shaft. The visible surface — the part that gets coated — is the side wall plus the bottom annular ring. The top sits against the wall/ceiling and is uncoated.
Cross-section view — the cap is generated by revolving (round) or sweeping (square) this profile around the central axis.
profileDev is the total length of the green (coated) curve, measured along the profile in your DXF.
profileWidth is the radial overhang per side: (W − D) / 2.
Top face is against ceiling/wall and never coated. Bottom is part of the green path because it’s visible.
profileDev) times the circumference of revolution. The Perimeter field is hidden when a cap is loaded.All cap/base SKUs are stored as one row per model, parameterized by diameter. The reference dimensions are captured at D = 10”; everything scales linearly when a different diameter is selected.
| Code | Shape | H (in) | profileDev (in) | profileWidth (in) | W at D=10 (in) |
|---|---|---|---|---|---|
| CB-101 | round | 8.14 | 11.34 | 3.45 | 16.90 |
| CB-102 | square | 8.23 | 8.54 | 2.08 | 14.16 |
| CB-103 | square | 6.61 | 7.48 | 2.22 | 14.44 |
| CB-104 | square | 7.94 | 10.03 | 3.94 | 17.88 |
| CB-105 | round | 6.24 | 7.74 | 2.03 | 14.06 |
| CB-106 | round | 7.04 | 8.53 | 2.06 | 14.12 |
| CB-107 | square | 7.72 | 8.53 | 2.06 | 14.12 |
| CB-108 | square | 7.80 | 10.23 | 3.92 | 17.84 |
| CB-109 | square | 8.39 | 11.59 | 4.13 | 18.26 |
| CB-110 | round | 6.33 | 8.52 | 2.65 | 15.30 |
Diameter dropdown options: 8”, 10”, 12”, 14”. Reference values come from the source DXF + xlsx; updates land in migrate_columncap_parametric.php.
When a diameter D is chosen, every dimension scales by scale = D / baseDiameter (where baseDiameter = 10):
This happens in applyParametricDims() when the diameter dropdown changes.
Computed via Pappus-style surface of revolution: the developed profile length times the circumference traced by the profile.
Same idea but the profile is swept around a 4-sided box instead of revolved.
Both formulas live in FORMULA_DEFS as capSurfArea. The result is then used as coatSurfArea for caps — every downstream cost (mesh, glue, basecoat, manual coating labor, manual mesh labor) multiplies through it.
Reference (D=10): H=8.14, profileDev=11.34, profileWidth=3.45
Scale = 12/10 = 1.2
Note: foam volume uses H×W×L of the bounding block, not the profile, because the cap is cut from a square foam blank. Material costs scale linearly with capSurfArea for everything except foam.
Caps are manual_only=1 — the Coating segment is locked to Manual and the machine path is disabled. Labor comes from one of two sources, in this order:
manual_coat_min or manual_mesh_min is set on the catalog row, that fixed minute count wins. CB-101 has manual_coat_min = 10 — coating labor is locked at 10 minutes regardless of size.capSurfArea. If the override is blank, anchor points fit a curve min = K × sqft^P:| Curve | Anchor 1 | Anchor 2 | At 7.25 sqft (curve) |
|---|---|---|---|
| Coating (basecoat) | 3.67 sqft → 10 min | 29.19 sqft → 60 min | ~19 min |
| Meshing (glue + wrap) | 1.30 sqft → 5 min | 6.31 sqft → 20 min | ~22.6 min |
Each minute is multiplied by laborHourly × manualCrew / 60 (current settings: $20/hr × 1).
If you see drastically different numbers in the calculator UI for CB-101 D=12 (e.g. mesh near $1.83 instead of $0.47, or coating near $21 instead of $3.33), your localStorage formulas are stale. Hard-refresh the calculator to trigger the auto-upgrade.
capSurfArea at current dims.manualOnly=1). Machine radio is disabled.If a customer asks for a one-off cap that doesn’t match any of the 10 standard models, you have three paths depending on whether you need it again:
For a one-time quote where you don’t need to re-use the cap:
Form values override the scaled catalog values for that session.
For a cap you’ll quote repeatedly:
Column Cap & Base, code CB-CUSTOM-XXX.is_parametric = 1, base_diameter = 10 (or whichever reference diameter you measured at).h, profile_dev, profile_width, cap_shape. Set w = l = base_diameter + 2 × profile_width.manual_only = 1, coating_mode = 'manual'.For a cap that’s becoming a standard model:
$caps in migrate_columncap_parametric.php: ['CB-XXX', 'round'|'square', H, profileDev, profileWidth].php migrate_columncap_parametric.php. The upsert path will insert the new row and leave others untouched.data.db.| Aspect | Corbel / Cornice | Column Cap / Base |
|---|---|---|
| Geometry | Linear extrusion of a 2D profile | Surface of revolution (round) or 4-sided sweep (square) |
| Coating area | (coatingLength / 12) × lengthFactor + 2 × sideArea | profileDev × circumference / 144 |
| Driving inputs | perimeter, coatingLength, L, sideArea | profileDev, profileWidth, W, capShape |
| Perimeter field | Used (cross-section perimeter) | Unused (hidden) |
| Cutting labor | perimeter × cuttingPerIn | 0 (folded into manual coating curve) |