Understanding Your Parts
A reference for the geometry values Phasio extracts from every 3D file - volume types, surface area, wall thickness, and watertightness - and how to use them in pricing equations.
Phasio extracts geometry from every uploaded 3D file before your equation runs. This page explains what each value measures and how to use it in pricing.
What Phasio measures
| Property | Variable | Unit | Description |
|---|---|---|---|
| Volume | specification.volume | mm³ | Actual material volume of the part |
| Surface area | specification.area | mm² | Total outer surface area |
| Length / Width / Height | specification.length/width/height | mm | Axis-aligned bounding box dimensions |
| Min bounding box volume | specification.minBoundingBoxVolume | mm³ | Volume of the minimum bounding box |
| Convex hull volume | specification.convexHullVolume | mm³ | Volume of the tightest convex envelope |
| Shrink wrap volume | specification.shrinkWrapVolume | mm³ | Tight wrap that follows overhangs |
| Layer height | specification.precision?.value | mm | Quality setting chosen by customer. Null if not set. Can be custom defined |
| Infill density | specification.infill?.value | 0–1 | FDM infill fraction. Null if not set. Can be custom defined |
| Min wall thickness | revision.minimumWallThickness | mm | Thinnest wall (Pro / Factory Floor only) |
| Watertight | revision.watertight | 0 or 1 | 1 = closed mesh, 0 = open mesh |
The four volume types
Choosing the right volume is the most important modelling decision in a pricing equation.
Actual volume - specification.volume
The real volume of material in the part. A hollow sphere has far lower volume than a solid one of identical dimensions.
Use for: material weight and cost in extrusion and vat processes (FDM, SLA, DLP). This is what you pay for in raw material.
const materialDensity = material.variables['materialDensity'] // g/cm³
const materialCostPerKg = material.variables['materialCostPerKg']
const massGrams = (volume / 1000) * materialDensity // cm³ × g/cm³
const materialCost = (massGrams / 1000) * materialCostPerKg // kg × cost/kgMinimum bounding box volume - specification.minBoundingBoxVolume
The smallest axis-aligned box that contains the part. For a solid cube, this equals volume. For complex parts, it's always larger. The difference is wasted material.
Use for: CNC raw stock calculation - you buy the bounding box, then machine away everything that isn't the part.
const { volume, minBoundingBoxVolume } = specification
const removedMaterial = minBoundingBoxVolume - volume
const removalRatio = removedMaterial / minBoundingBoxVolume
// removalRatio > 0.90 means 90%+ of the raw stock is machined away — flag for review
const reviewRequired = removalRatio > 0.90 || Math.max(length, width, height) > 300Convex hull volume - specification.convexHullVolume
The smallest convex shape that contains the part. Imagine wrapping the part in a plastic bag and you pull tight on all ends, no indentations. The hull fills in all recesses, undercuts, and through-holes.
convexHullVolume - volume = the volume of those recesses. In FDM, this is where support structures live.
Use for: support volume estimation or complexity measures
const hullGap = convexHullVolume - volume
const estimatedSupportVolume = variable('supportVolume', round(hullGap * 0.10, 0))
// 10% of the hull gap is a reasonable default support estimateA low volume / convexHullVolume ratio signals a complex, concave part - lots of overhangs, holes, and internal channels.
Shrink wrap volume - specification.shrinkWrapVolume
Tighter than the convex hull, it wraps around overhangs and follows the part's surface more closely, without filling in recesses. For powder bed processes, this is the best proxy for how much build chamber space the part consumes.
Actual volume ≤ Shrink wrap volume ≤ Convex hull volume ≤ Min bounding box volumeUse for: MJF and SLS process pricing - the industry-standard metric for powder bed cost estimation.
const costPerCm3 = material.variables['costPerCm3']
const partCost = (shrinkWrapVolume / 1000) * costPerCm3Volume ratios and what they reveal
| Ratio | What a low value signals |
|---|---|
volume / convexHullVolume | Many recesses, holes, undercuts → more support needed in FDM |
volume / minBoundingBoxVolume | High CNC waste, or complex shape with poor packing density |
shrinkWrapVolume / convexHullVolume | Significant overhangs that don't fill the hull |
// Example: flag high-waste CNC parts
const wasteRatio = 1 - (volume / minBoundingBoxVolume)
if (wasteRatio > 0.85) {
done(variable('unitPrice', round(baseCost * 1.20, 2)), 0, true) // 20% premium + review
}
// Example: complexity premium for FDM
const convexityRatio = volume / convexHullVolume
const complexityMultiplier = convexityRatio < 0.5 ? 1.15 : 1.0 // +15% for very complex partsSurface area - specification.area
Surface area in mm² is the key input for shell volume in extrusion processes - the shell is printed by tracing the surface:
const NOZZLE_DIAMETER_MM = 0.4
const NUMBER_OF_WALLS = 3
const shellVolume = Math.min(volume, area * NOZZLE_DIAMETER_MM * NUMBER_OF_WALLS)For post-processes that coat or treat the surface (painting, plating, anodising), area often drives cost more directly than volume:
// Level 2 — area-based coating cost
const { area } = specification
const ratePerMm2 = variable('Rate per mm²', 0.002)
const unitPrice = variable('unitPrice', round(Math.max(5.00, area * ratePerMm2), 2))
done(unitPrice)Wall thickness - revision.minimumWallThickness
The thinnest wall in the part, in mm. Available on Pro and Factory Floor plans.
Use it to gate fragile or unprintable parts before they reach production:
const MIN_WALL_MM = 0.8 // parts thinner than this risk failure in most FDM setups
const tooThin = revision.minimumWallThickness < MIN_WALL_MM
done(variable('unitPrice', unitPrice), printTimeHours, tooThin)Watertight flag - revision.watertight
1 = closed (manifold) mesh. 0 = open mesh with holes in the surface.
An open mesh means volume calculations may be unreliable. Almost always flag for review:
const reviewRequired = revision.watertight === 0
done(unitPrice, 0, reviewRequired)Last updated on
Deep Dive - Pricing Mechanics
Understand why, not just how. Standalone deep dives into part geometry, the three-level equation stack, business logic, and per-process implementations.
How Equations Work
How Phasio runs three levels of pricing equations per order and how done() and variable() connect them.