Skip to the content
Contents HexCalibr3D print calibration suite

Test 1

First layer and Z offset

A single layer: a chain of eight hexagons in the middle of the bed. While it prints, you lower the nozzle a little at each hexagon with your printer's own Z buttons, so every hexagon is printed at a different height. Then you compare them side by side and keep the best one. A second file checks that value over the whole bed.

A few minutes and about 1 g of filament, with no changes to your profiles. The file never moves the nozzle by itself: every change is yours.

More

The first layer carries everything printed on top of it. Too high, and the lines stay round and separate: the part lets go, and every test that follows is read on a weak base. Too low, and the plastic has nowhere to go: ridges, waves, a scraped bed. Judging one patch on its own is hard; judging eight neighbours that differ by 0.025 mm each is easy.

You make every change. The file contains no G-code at all. Never start much lower than your current value, and stop going down as soon as the surface turns wavy or ridged.

What you need

To print

  • The ladder file, and the map for your bed
  • PrusaSlicer 2.9 (2.7 is the minimum that opens the project)
  • Your own printer, print and filament profiles, already working; a clean bed
  • A way to change Z while printing: the Z offset buttons in Mainsail or Fluidd, *Live Adjust Z* on a Prusa, babystepping on Marlin
  • About 1 g of filament (the map 1 to 2.5 g)

To read it

  • The table on this page, on screen or on paper
  • A lamp you can move, or a phone torch
  • A fingernail

Before printing

Step 1 What it is for, and when to run it

The author's printed ladder of eight hexagons on the bed, seen from above: hexagons 1 to 3 with grooves between round lines, 5 flat and joined, 7 and 8 wavy and lumpy
The author's ladder in PETG, stepped from +0.075 to -0.100: grooves between the lines in 1 to 3, flat and joined in 5, wavy in 7 and 8. Hexagon 5 is the value kept.
  • It finds the Z offset: how far the nozzle sits from the bed on the first layer, so that the lines are pressed flat and joined, without being scraped.
  • Run it first, before any other test, and again after changing the nozzle, the bed sheet or the probe.
More
  • The Z offset belongs to the printer (probe, nozzle, bed sheet), not to the filament. PETG usually likes a little less squish than PLA: if you print both, check it with PETG too.
  • A bed mesh corrects a bed that is not flat; it does not set the height. If the first layer is good in the middle and bad in a corner, the problem is the mesh, not the Z offset: that is what the map file shows.
  • BeginnerThe paper test under the nozzle gets you close, within about 0.1 mm. This test finishes the job.

Step 2 Which file

FileWhat it isBed
first-layer_ladder.3mfThe ladder: 8 hexagons, 152 mm long, one layerAny bed from 180 mm
first-layer_ladder_T1.3mfThe same, printed by the second tool (IDEX, toolchangers)Any bed from 180 mm
first-layer_map_<bed>.3mfThe map: 5 or 9 numbered cells and a thin web across the bedPick your bed size: 180, 250, 300, 350, 400, 500, xl, mk4, coreone, j1
  • Print the ladder first. Print the map afterwards, at the value you chose.

Step 3 Before you start

  • Write down the Z offset your printer shows now. It is the starting point. Type it into the table below.
  • Find the Z buttons you will use while printing. Mainsail has a ±0.025 button: one click per hexagon. A Prusa's *Live Adjust Z* moves in small steps: turn it until the value has changed by 0.025.
  • Clean the bed. A greasy spot looks like a wrong Z offset.
More
  • The model is 0.2 mm high on a 0.4 nozzle: it slices to one layer for any first-layer height from 0.1 to 0.39 mm. Keep your usual first-layer height and speed.
  • Elephant foot compensation is forced to 0 on the object: the whole test is the first layer, and the compensation would shrink it.
  • ExpertOn Klipper the Z buttons send SET_GCODE_OFFSET Z_ADJUST=… MOVE=1. The adjustment lasts until a restart: save it afterwards (see Save the value).

Print and step down

Step 4 Open, slice and check the order

PrusaSlicer 2.9 preview of the ladder, first layer, horizontal slider part way: hexagons 1 to 7 already filled, the nozzle in hexagon 8
The preview half way through the layer: the outline first, then the hexagons fill one after another, from 1 to 8.

Open it with File › Open project, never with Import: an import drops the settings that make the nozzle sweep the chain in order.

  • File › Open project, then Slice now.
  • In the preview, play the first layer with the horizontal slider: after the outline, the nozzle fills hexagon 1 first, then 2, and so on up to 8. That is what makes the steps work.

Step 5 Step down at every number

  • While the skirt prints, raise Z by +0.075 from your starting value (on Mainsail: +0.05, then +0.025). The outline and hexagon 1 are printed at that height.
  • Every time the nozzle reaches a number, lower Z by 0.025, one click on Mainsail. Nothing to write while it prints.
  • Stop going down early if the surface already turns wavy, ridged or scraped: you have found the bottom.

first hexagon (+0.075): –

HexagonSet it toBest
1–
2–
3–
4–
5–
6–
7–
8–

More
  • Each hexagon takes about 10 to 35 seconds, depending on your first-layer speed: enough to press a button and look.
  • At the end, check the value the printer shows against the one under the table. If they differ, a click was missed or doubled: look at the hexagons to see where the step is missing, and shift the values after it.
  • ExpertThe numbers sit in small flags in the notches below the chain, so the whole hexagon is free for reading. The flag of each hexagon is on its left, where the nozzle arrives.

Read the result

Step 6 Compare the hexagons

Hexagons 2, 5 and 8 of the same ladder side by side, close up: round lines with dark gaps, flat joined lines, a wavy lumpy surface
Hexagon 2 (too high: gaps between round lines), 5 (right: flat, joined, the lines still visible) and 8 (too low: wavy and lumpy), from the same ladder.
  • Look at the hexagons side by side, with the light low and raking along the lines.
  • Too high: round, separate lines, gaps you can see the bed through, edges that lift.
  • Right: flat lines, joined with no gaps, still visible; smooth under a fingernail.
  • Too low: lines that vanish into a shiny, wavy or ridged surface, plastic pushed up at the edges, marks on the bed.
  • Tick the best hexagon in the table. If two look equally good, take the higher one.
More
  • Peel and fold the hexagon you chose (and its neighbours if in doubt): a good one comes off as one sheet and folds without splitting; one that splits into lines was too high; a sheet with waves or drag marks was too low.
  • Common misreadingA glassy, perfectly smooth surface is often too low, not perfect: the lines should still be visible.
  • Common misreadingGaps only at the edges: a flow (extrusion multiplier) or speed effect, not Z. Judge the middle of each hexagon.

Step 7 Save the value

PrinterHow to keep the value
Klipper (Mainsail, Fluidd)After the print, Z_OFFSET_APPLY_PROBE (probe) or Z_OFFSET_APPLY_ENDSTOP (Z endstop), then SAVE_CONFIG
RatOSAs on Klipper: the save icon next to the Z offset in Mainsail (checked on a RatRig V-Core 4 IDEX)
Prusa (Buddy: MK4, Core One, XL, MINI)*Live Adjust Z* keeps the value for the sheet in use; on load-cell printers set *Printer Settings › General › Z offset* in PrusaSlicer instead
MarlinM851 Z… (probe) or babystep, then M500
  • Set the Z offset to the value the table gives, then save it the way your printer does.

Check the whole bed

Step 8 Print the map

The map printed in PETG on a 400 mm bed, seen from above: nine numbered hexagonal cells at the corners, edges and centre, joined by a thin web of lines
The author's map on a 400 mm bed, printed at the value kept from the ladder (-0.025) without touching Z.
  • Print the map for your bed without touching Z.
  • Every cell should look like the hexagon you chose. The web between them shows the zones in between.
  • One corner different from the rest points to the bed mesh, not to the Z offset: re-run the mesh and check that it is applied.