← Back to Calculator

Column Cap & Base Calculation Guide

How cap/base profiles map to calculator fields, how mesh and basecoat usage are computed from the DXF, and how to price custom caps.

1. Cap/Base Anatomy

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.

axis of revolution aSize = D (column dia.) W (outer dia.) = D + 2 × profileWidth profileWidth H profileDev = developed length of the green path
Coated (mesh + basecoat)
Uncoated (top face)

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.

Why we don’t use the “Perimeter” field for caps: Perimeter is meaningful for trim/corbel/cornice profiles where the cross-section outline gets coated linearly along a straight piece. Caps are surfaces of revolution — what matters is the developed length of the profile (profileDev) times the circumference of revolution. The Perimeter field is hidden when a cap is loaded.

2. The 10 parametric models

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.

CodeShapeH (in)profileDev (in)profileWidth (in)W at D=10 (in)
CB-101round8.1411.343.4516.90
CB-102square8.238.542.0814.16
CB-103square6.617.482.2214.44
CB-104square7.9410.033.9417.88
CB-105round6.247.742.0314.06
CB-106round7.048.532.0614.12
CB-107square7.728.532.0614.12
CB-108square7.8010.233.9217.84
CB-109square8.3911.594.1318.26
CB-110round6.338.522.6515.30

Diameter dropdown options: 8”, 10”, 12”, 14”. Reference values come from the source DXF + xlsx; updates land in migrate_columncap_parametric.php.

3. Parametric scaling

When a diameter D is chosen, every dimension scales by scale = D / baseDiameter (where baseDiameter = 10):

H′ = H × scale
profileDev′ = profileDev × scale
profileWidth′ = profileWidth × scale
W′ = L′ = D + 2 × profileWidth′
aSize′ = D

This happens in applyParametricDims() when the diameter dropdown changes.

4. Surface area formula

Round caps (CB-101, 105, 106, 110)

Computed via Pappus-style surface of revolution: the developed profile length times the circumference traced by the profile.

capSurfArea = profileDev × π × (W + profileWidth) / 144   (sq ft)

Square caps (CB-102, 103, 104, 107, 108, 109)

Same idea but the profile is swept around a 4-sided box instead of revolved.

capSurfArea = profileDev × 4 × W / 144   (sq ft)

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.

5. Worked example: CB-101 at D = 12”

Step 1 — Scale reference dims

Reference (D=10): H=8.14, profileDev=11.34, profileWidth=3.45
Scale = 12/10 = 1.2

H′ = 8.14 × 1.2 = 9.77
profileDev′ = 11.34 × 1.2 = 13.61
profileWidth′ = 3.45 × 1.2 = 4.14
W′ = 12 + 2 × 4.14 = 20.28

Step 2 — Cap surface area (round)

capSurfArea = 13.61 × π × (20.28 + 4.14) / 144 = 13.61 × π × 24.42 / 144 = 7.25 sq ft

Step 3 — Material costs (per piece, current settings)

foam = (9.97 × 20.48 × 20.28) × 0.001428 = $5.91   (bounding-block volume × costPerCuIn)
mesh = (30.64 / 475) × 7.25 = $0.47
glue = (106.25 / 475) × 7.25 = $1.62
basecoat = (13 / 30) × 7.25 = $3.14
materialTotal = $11.14

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.

Step 4 — Manual coating labor

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:

  1. Per-row stopwatch override. If 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.
  2. Power-law curve on capSurfArea. If the override is blank, anchor points fit a curve min = K × sqft^P:
CurveAnchor 1Anchor 2At 7.25 sqft (curve)
Coating (basecoat)3.67 sqft → 10 min29.19 sqft → 60 min~19 min
Meshing (glue + wrap)1.30 sqft → 5 min6.31 sqft → 20 min~22.6 min

Each minute is multiplied by laborHourly × manualCrew / 60 (current settings: $20/hr × 1).

laborCutting = 0   (gated for caps — perimeter doesn’t apply)
laborMeshCut = laborHourly / 120 = $0.17
laborCoat = (10 / 60) × 20 × 1 = $3.33   (per-row override active)
laborGlue = curve(7.25) × 20 = 0.376 hrs × 20 = $7.53
laborTotal = ($0 + $0.17 + $7.53 + $3.33) × 1.15 tax = $12.69

Step 5 — Final price

total = $11.14 + $12.69 = $23.83
totalWaste = $23.83 × 1.05 = $25.02   (waste multiplier)
list (3x) = $75.06
custom (1.8x) = $45.04

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.

6. Calculator field map

aSize
Column shaft diameter (=D). Auto-set when diameter dropdown changes.
H, W, L
Scaled dimensions at the selected diameter. W = L = D + 2×profileWidth.
Profile Dev
Developed length of the visible profile cross-section (from DXF), scaled to the selected D.
Profile Width
Overhang per side, scaled to the selected D.
Shape
round = surface of revolution; square = 4-sided sweep.
Cap Surface (sqft)
Read-only display of capSurfArea at current dims.
Perimeter
Hidden for caps — not used in pricing. Caps don’t have a meaningful linear perimeter.
Coating Mode
Forced to Manual (manualOnly=1). Machine radio is disabled.
Coating time / Meshing time override
Optional per-row stopwatch overrides (in minutes) that bypass the global curve.

7. Pricing a custom cap or base

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:

Option A — Quick quote (don’t save)

For a one-time quote where you don’t need to re-use the cap:

  1. Load the closest matching CB-XXX model and pick a diameter.
  2. In the Cap/Base Geometry panel, type the actual profileDev and profileWidth from the customer’s DXF (or measure manually).
  3. Set Shape to round or square. Update H if it differs from the scaled value.
  4. The price recomputes immediately. Read it off and quote.

Form values override the scaled catalog values for that session.

Option B — Save as new catalog row

For a cap you’ll quote repeatedly:

  1. Add a new row in the Catalog tab, category Column Cap & Base, code CB-CUSTOM-XXX.
  2. Set is_parametric = 1, base_diameter = 10 (or whichever reference diameter you measured at).
  3. Fill in h, profile_dev, profile_width, cap_shape. Set w = l = base_diameter + 2 × profile_width.
  4. Set manual_only = 1, coating_mode = 'manual'.
  5. Add diameter options if the cap is meant to scale, otherwise leave a single option.

Option C — Add to the migration

For a cap that’s becoming a standard model:

  1. Add a row to $caps in migrate_columncap_parametric.php: ['CB-XXX', 'round'|'square', H, profileDev, profileWidth].
  2. Run the migration: php migrate_columncap_parametric.php. The upsert path will insert the new row and leave others untouched.
  3. Deploy data.db.
Measuring profileDev from a DXF: open the cross-section in your CAD tool and measure the polyline length of the visible (coated) profile only — from the inner-top corner where the cap meets the column to the outer-bottom corner. Don’t include the top face (against ceiling) or any inner cylinder face that’s tight against the column.

8. Why caps are computed differently from corbels/cornices

AspectCorbel / CorniceColumn Cap / Base
GeometryLinear extrusion of a 2D profileSurface of revolution (round) or 4-sided sweep (square)
Coating area(coatingLength / 12) × lengthFactor + 2 × sideAreaprofileDev × circumference / 144
Driving inputsperimeter, coatingLength, L, sideAreaprofileDev, profileWidth, W, capShape
Perimeter fieldUsed (cross-section perimeter)Unused (hidden)
Cutting laborperimeter × cuttingPerIn0 (folded into manual coating curve)