How to calibrate dimensional accuracy per material

Dimensional accuracy comes from three separate corrections: the machine, the material's shrinkage and the holes. Calibrate them in that order and each one stays small and easy to measure.

Published

To calibrate dimensional accuracy per material, first calibrate the machine (extruder e-steps or rotation distance, then flow). Next, print one measurable test part in each filament, measure it at room temperature, and turn the result into XY and Z shrinkage values for that filament’s profile. Holes get their own offset, because a percentage scale barely moves them.

The order matters. Each step removes one kind of error so the next can be measured cleanly. Skip the extruder and flow checks and their error lands in your shrinkage number.

Step 1: calibrate the extruder (e-steps or rotation distance)

Extruder calibration makes sure that when the printer asks for 50 mm of filament, 50 mm goes in. It does not depend on the material, so it is a once-per-printer job.

Klipper’s procedure:

  1. Mark the filament about 70 mm above the extruder inlet and measure that distance with calipers.
  2. Heat the nozzle and extrude 50 mm slowly: G91 then G1 E50 F60. That takes about 50 seconds, slow enough that nozzle back-pressure does not skew the result.
  3. Measure from the extruder to the mark again. The difference is the actual extruded length.
Klipper: rotation_distance_new = rotation_distance_old × actual / requested
Marlin:  esteps_new            = esteps_old × requested / actual

The two formulas are inverses because rotation distance is millimeters per motor turn and e-steps are steps per millimeter. Klipper says to round to three decimals and repeat if the result was more than 2 mm off the 50 mm target. On Marlin, M92 E<value> sets the new steps per mm and M500 saves it to EEPROM.

Example. The mark started 70 mm above the inlet and sits 21.5 mm above it afterwards, so 48.5 mm went in instead of 50 mm. A Klipper rotation distance of 33.500 becomes 33.500 × 48.5 / 50 = 32.495. A Marlin value of 93 steps/mm becomes 93 × 50 / 48.5 = 95.88.

Step 2: calibrate flow (extrusion multiplier)

Flow calibration sets how much plastic goes into each line, and it depends on the filament. Slicers name it differently: extrusion multiplier in PrusaSlicer, flow ratio in OrcaSlicer, Flow in Cura. OrcaSlicer’s tooltip suggests keeping it between 0.95 and 1.05.

Prusa’s precise method prints a single-wall cube in vase mode and measures the wall:

extrusion multiplier = extrusion width / average measured wall thickness

With the 0.45 mm extrusion width that Prusa’s guide assumes for a 0.4 mm nozzle, three wall readings averaging 0.47 mm give 0.45 / 0.47 = 0.957. Take at least three readings in the middle of each wall. Prusa warns that cheap digital calipers may not be accurate enough for this, since the whole correction rides on a few hundredths of a millimeter.

Weighing gives a rough cross-check without calipers. Convert the filament length your slicer reports for a solid test part to grams with the filament length to weight converter, then weigh the print. A print well under the expected weight points to under-extrusion. Use the density from the spool’s data sheet: a wrong density moves the expected weight as much as bad flow does.

Too much flow pushes every outer wall out and every hole wall in by a similar distance, whatever the part’s size. That is a fixed error, not a percentage, and left in place it passes for shrinkage on small parts.

Step 3: print a measurable test part for each filament

The test part should let you measure four things separately: X length, Y length, Z height and a hole diameter. A usable design:

  • A bar 100 mm long in X with a 20 mm step, so X has two measurable lengths.
  • The same in Y (an L-shape does both).
  • About 20 mm tall.
  • Three vertical through-holes, for example 3, 5 and 10 mm.

Two lengths per axis are the key. One length can’t separate a fixed offset from a proportional one; two let you solve for both (step 5).

Before printing, zero every compensation: shrinkage at 100% (OrcaSlicer, Bambu Studio, Cura) or 0% (PrusaSlicer), hole and contour offsets at 0, model scale at 100%. Print with the same temperatures, cooling, enclosure and speed you use for real parts in that filament. Bambu Lab’s wiki suggests whole-number dimensions, which keeps the arithmetic simple.

Step 4: measure with calipers the right way

Measure only after the part has cooled to room temperature, as Bambu Lab’s shrinkage procedure specifies. A warm part is still shrinking. Then:

  1. Zero the calipers with the jaws closed and clean.
  2. Measure outer lengths at mid-height and mid-face, away from corners and the seam.
  3. Skip the first layers. Elephant’s foot flares them outward, so measure above that zone or remove the brim.
  4. Take at least three readings per dimension and average them.
  5. Measure holes with the inside jaws, at several angles. A faceted or oval hole reads differently depending on where the jaws land.
  6. Close the jaws with light, repeatable pressure. Plastic compresses under force.

For nylon (polyamide, PA), timing matters more. PA absorbs water and grows: BASF’s data sheet for Ultramid B3S lists water absorption of 9.5% (a test similar to ISO 62), and Polymaker’s moisture conditioning tests found most nylon prints grew past their original size. The plastics testing standard ISO 291 uses 23 °C and 50% relative humidity (climate “23/50”), with a default conditioning time of at least 88 hours. Measure nylon parts dry and again after they have sat in room air, then calibrate to the state the part will be used in. The guide to dimensionally accurate nylon parts covers that in more detail.

Step 5: compute the XY and Z scale factors

Treat each axis as a straight line: measured = k × designed + c. Here k is the proportional part (shrinkage) and c is the fixed part (flow or contour offset). Two lengths on one axis give you both:

k = (measured_long - measured_short) / (designed_long - designed_short)
c = measured_short - k × designed_short
shrinkage s   = 1 - k
scale factor  = 1 / (1 - s) = 1 / k

Worked example (ABS, X axis)

Suppose the 100 mm length measures 99.30 mm and the 20 mm step measures 19.78 mm.

  1. k = (99.30 - 19.78) / (100 - 20) = 79.52 / 80 = 0.99400
  2. c = 19.78 - 0.994 × 20 = 19.78 - 19.88 = -0.10 mm
  3. Shrinkage s = 1 - 0.994 = 0.60%
  4. Scale factor = 1 / 0.994 = 1.00604, or 100.60%
  5. Check: 0.994 × 100 - 0.10 = 99.30 mm, matching the measurement.

The -0.10 mm is spread over two walls, so each outer wall sits about 0.05 mm inside its target. That is a contour offset, not shrinkage. Correct it with an outline offset such as OrcaSlicer’s X-Y contour compensation at about +0.05 mm, or return to step 2 if the flow check was off.

Repeat for Y. X and Y can differ, and most slicers take one XY value, so average them only if they are close.

Z works differently, because layer height and first-layer squish set part of it. Use one height measured above the first layers and apply s = 1 - measured / designed. If Z grew, s comes out negative and the scale drops below 100%.

The shrinkage calculator takes the designed and measured sizes and returns the scale factor plus the value each slicer’s field expects.

Separate outer-dimension error from hole error

A percentage scale grows everything around the part’s origin. It moves a 100 mm outer length by 0.6 mm but a 5 mm hole by only 0.03 mm. So check holes after the scale factor is set, not before:

Symptom Likely cause Correction
Error grows with size, same sign on outer lengths Material shrinkage Per-filament shrinkage % (step 5)
Same error on long and short lengths Flow or outline offset Flow (step 2) or contour compensation
Outer lengths correct, holes small Faceting, corner cutting, line squash Hole compensation or model allowance
Whole axis wrong on every material Axis steps or belt tension Machine calibration, not a filament setting

How temperature affects printed part dimensions

Temperature changes printed dimensions through thermal contraction. A solid part shrinks in proportion to how far it cools, at a rate set by the coefficient of linear thermal expansion (CTE). ABS, ASA and polycarbonate (PC) go rigid at higher temperatures than PLA, so they have further to cool. Nylon also shrinks as it crystallizes.

ΔL = α × L × ΔT

Here α is the CTE (per kelvin), L the length and ΔT the drop in temperature. A thermoplastic above its glass transition temperature (Tg) is soft and can relax, so most locked-in contraction happens as the part cools from roughly Tg down to room temperature. The data-sheet values:

Material (grade) Tg or softening point CTE (10⁻⁶/K) Molding shrinkage
PLA (NatureWorks Ingeo 3052D) Tg 55 to 60 °C not listed 0.4%
ABS (INEOS Terluran GP-35) Vicat B50 95 °C 80 to 110 0.4 to 0.7%
ASA (INEOS Luran S 777K) Vicat B50 97 °C 80 to 110 0.4 to 0.7%
PC (Covestro Makrolon 2405) Tg 144 °C 65 0.7%
PA6, dry (BASF Ultramid B3S) Tg 60 °C, melts 220 °C 102 0.9%

A rough estimate from the data sheet

For PC, cooling from 144 °C to 23 °C is ΔT = 121 K, and 65 × 10⁻⁶ × 121 = 0.79%. For ABS, using the 95 °C Vicat point as the rigid-from temperature, ΔT = 72 K gives 80 to 110 × 10⁻⁶ × 72 = 0.58 to 0.79%. PLA’s Tg of 55 to 60 °C leaves only about 35 K of cooling after it goes rigid, which fits its place at the low end of the molding shrinkage figures.

These are rough estimates. Data-sheet CTE is measured on a solid sample over a limited range (ISO 11359), and molding shrinkage comes from melt packed into a steel mold under pressure. A printed part cools layer by layer on a heated bed, so your measured value is the one to use.

Nylon breaks the simple picture. As a semi-crystalline polymer it contracts as crystals form on cooling from the melt, on top of ordinary thermal contraction. So the Tg estimate does not apply, and PA6 has the highest molding shrinkage in the table despite a Tg close to PLA’s.

Room temperature matters too

The same formula tells you when to measure. A 100 mm ABS part at 95 × 10⁻⁶/K (mid-range) changes by 100 × 95 × 10⁻⁶ × 10 = 0.095 mm for every 10 °C difference in temperature. That is about the size of the corrections you are measuring, so measure every calibration part at the same room temperature, never straight off a hot bed or out of a heated chamber.

Why do holes print undersized in 3D prints?

Holes print undersized for three reasons that have nothing to do with shrinkage. The STL stores a circle as a polygon whose flat sides sit inside the true circle. The nozzle cuts corners on tight curves. And the extruded line squashes wider on the inside of an arc. All three pull the hole wall toward the center, so the fix is a hole offset, not a scale.

Polygon faceting

nophead’s polyholes article gives the geometry. A polygon with n vertices on the circle has flats at cos(π / n) of the radius:

flat-to-flat diameter = d × cos(π / n)

A 5 mm hole exported with 32 segments measures 5 × cos(π / 32) = 4.976 mm across the flats. With 16 segments it measures 4.904 mm. nophead notes you need 10 vertices to get the error down to 5% and 22 to get it to 1%. His fix is to draw the hole as a polygon with about twice as many sides as its diameter in millimeters, with the radius divided by cos(π / n) so the flats land on the true circle.

Corner cutting and line squash

nophead considered corner cutting the dominant effect on his machines: the filament takes a shorter path than the curve it is told to follow. A flat extruded line bent around a small arc also crowds plastic on the inside of the curve. Excess flow adds to both, which is why flow comes first.

Fixes

  • Slicer hole offset. OrcaSlicer and Bambu Studio have X-Y hole compensation, and Cura has Hole Horizontal Expansion (with a max diameter above which holes are left alone). In both, positive values make holes bigger. These are outline offsets, so the diameter changes by about twice the value; confirm with a test print.
  • Polyholes. OrcaSlicer can convert holes to polyholes. In CAD, the polyhole formula above does the same.
  • Model allowance. Draw the hole larger in CAD, for example by the measured shortfall. This is the only method that is independent of the slicer.
  • Bambu Studio’s auto circle contour-hole compensation applies a material-based offset to round holes and shafts. Bambu Lab’s wiki says it is mainly optimized for the H2D and certain filaments.

Example. After the 0.60% scale, a 5 mm hole measures 4.80 mm, so the diameter is 0.20 mm short. As an outline offset, that is about +0.10 mm of hole compensation. Reprint and check the 3 mm and 10 mm holes too. If small holes stay tighter than large ones, Cura’s max-diameter setting or per-size allowances in CAD handle the difference.

Slicers with per-material shrinkage compensation

OrcaSlicer, Bambu Studio and PrusaSlicer store shrinkage in the filament profile, so it follows the material automatically. UltiMaker Cura keeps it in the Material settings category. The four fields expect different numbers for the same measurement.

Slicer Shrinkage fields What you enter for 0.60% shrinkage Hole and outline settings
PrusaSlicer (2.9.2) Shrinkage compensation XY and Z (filament settings) 0.60%, the shrinkage itself; accepts -10% to 10% XY Size Compensation (whole outline; tooltip suggests it for hole sizes), Elephant foot compensation
OrcaSlicer Shrinkage (XY) and Shrinkage (Z) (filament settings) 99.40%, measured size as a percent of design X-Y hole compensation, X-Y contour compensation, polyholes, elephant foot compensation
Bambu Studio Shrinkage (filament settings, XY only) 99.40%, measured / designed × 100 X-Y hole/contour compensation, auto circle contour-hole compensation
UltiMaker Cura Horizontal and Vertical Scaling Factor Shrinkage Compensation (Material settings) 100.60%, the scale factor applied to the model Hole Horizontal Expansion (+ max diameter), Horizontal Expansion, Initial Layer Horizontal Expansion

From each slicer’s documentation and source code:

  • OrcaSlicer applies XY shrinkage based on the filament printing the perimeters, and its tooltip asks for matching values across all filaments in multi-material prints.
  • Bambu Studio gives a single shrinkage field and scales only the outer X and Y dimensions. Bambu Lab’s wiki says it does not touch internal features such as holes. For Z, use the object scale tool.
  • PrusaSlicer’s fields appear in Advanced mode. Its tooltip’s example: if you measured 99 mm instead of 100 mm, enter 1%.
  • Cura’s shrinkage settings are not settable per extruder, so one value covers the whole print. Its plain Horizontal Expansion offsets every outline; negative values compensate for holes that are too small.

Use one compensation method at a time. A shrinkage value in the profile plus a scaled model corrects the part twice.

Calibration checklist

  1. Extruder: 50 mm extrude test; fix rotation distance or e-steps until within 2 mm. Once per printer.
  2. Flow: single-wall cube, three readings per wall, multiplier = width / measured. Once per filament.
  3. Test part: two lengths per axis, a Z height, 3/5/10 mm holes; all compensation zeroed.
  4. Measure: room temperature, mid-face, above the first layers, three readings averaged. Nylon dry and conditioned.
  5. Solve: k and c per axis from the two lengths; s = 1 - k; scale = 1 / k.
  6. Enter: the value in the form your slicer expects (see table), or use the shrinkage calculator.
  7. Holes: reprint, then set a hole offset of about half the remaining diameter error.
  8. Record: save the values in a profile named for the brand, material and color, then reprint once to confirm.

Published · Figures last checked

More from the blog

  • shrinkage
  • dimensional accuracy

How much does ABS shrink? XY, Z and the compensation value

ABS shrinks about 0.4 to 0.8% in X and Y as it cools, but one printed-part study saw it grow 0.92% in Z. Figures by source, plus the OrcaSlicer values.

  • shrinkage
  • dimensional accuracy

ABS vs ASA shrinkage: which one shrinks more

ABS vs ASA shrinkage: about the same. Resin and filament data sheets put both at roughly 0.4 to 0.7%, so start ASA with ABS compensation and measure.

  • shrinkage
  • dimensional accuracy

Shrinkage compensation in Bambu Studio for ABS, PETG and PLA

Bambu Lab publishes no ABS shrinkage value. Start at 99.36% in Bambu Studio's Shrinkage field, then print a test cube and correct. PLA and PETG values too.