PricingDeep Dive

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

PropertyVariableUnitDescription
Volumespecification.volumemm³Actual material volume of the part
Surface areaspecification.areamm²Total outer surface area
Length / Width / Heightspecification.length/width/heightmmAxis-aligned bounding box dimensions
Min bounding box volumespecification.minBoundingBoxVolumemm³Volume of the minimum bounding box
Convex hull volumespecification.convexHullVolumemm³Volume of the tightest convex envelope
Shrink wrap volumespecification.shrinkWrapVolumemm³Tight wrap that follows overhangs
Layer heightspecification.precision?.valuemmQuality setting chosen by customer. Null if not set. Can be custom defined
Infill densityspecification.infill?.value0–1FDM infill fraction. Null if not set. Can be custom defined
Min wall thicknessrevision.minimumWallThicknessmmThinnest wall (Pro / Factory Floor only)
Watertightrevision.watertight0 or 11 = 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/kg

Minimum 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) > 300

Convex 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 estimate

A 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 volume

Use for: MJF and SLS process pricing - the industry-standard metric for powder bed cost estimation.

const costPerCm3 = material.variables['costPerCm3']
const partCost   = (shrinkWrapVolume / 1000) * costPerCm3

Volume ratios and what they reveal

RatioWhat a low value signals
volume / convexHullVolumeMany recesses, holes, undercuts → more support needed in FDM
volume / minBoundingBoxVolumeHigh CNC waste, or complex shape with poor packing density
shrinkWrapVolume / convexHullVolumeSignificant 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 parts

Surface 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

On this page