How FitCheck's Numbers Get Validated

I printed the same bearing pocket twice on the same printer, same spool. One of them rattles around while the other is just short of a press fit. The only difference between them was taking into account a second number I'd measured off a small calibration part.

The A/B part with a 608 bearing in each of its two pockets

Because every number FitCheck shows is really a prediction: model a hole this size, and a real printer or machine should print or mill that size to-spec. I wanted to know how well that prediction actually holds, so before the v1.3 calibration feature shipped, and in the weeks since, I've run quite a few experiments.

TL;DR

  • I A/B printed the same bearing pocket from two calibration profiles on two printers. On both, the two-measurement profile's pocket seated the bearing and the single-number profile's pocket rattled, and the correction predicted the difference between the pockets to within 0.01 mm.
  • Hole error changed with bore size on every machine I measured. Correcting a 22 mm bearing seat with a small-hole number alone over-corrected it by 0.06 to 0.15 mm across my fleet.
  • The error follows the machine, not the filament. Shrink is a percentage, so if it drove hole error then a 22 mm bore would miss by ~4x more than a 5 mm bore - every machine I measured goes the other way, the small bore has the largest error.
  • The error between the two measured sizes isn't a perfect line: on the Doomcube, my "loosest" machine, mid-range bores print about 0.05 mm wider than the line predicts. The app doesn't put a number on that; the crush-rib pockets absorb it.
  • Hex pockets measured across the flats come out about 0.2 mm larger than the round-hole error predicts, which is why calibration prompts for a separate flats measurement.
  • Every crush-rib number in the app was tested against real hardware on five printer-and-material setups, and the calibration model the correction anchors were measured on is a free download.

A hole never comes out the size you modeled

The gap is small, but it is big enough to decide whether a bearing presses firmly into its pocket, or rattles, and it isn't a static number:

  • It changes from machine to machine
  • It changes with the size of the hole
  • It changes again with the shape of the feature.

That is one of the problems that FitCheck exists to solve, and it is only solved if the correction holds up on a real printed part.

All of this was measured on three printers: a Snapmaker U1, a Bambu Lab X1-C, and a Doomcube 300 mm (a Voron 2.4 mod). Between the three printers, I printed with five printer-and-material configurations. All filaments were previously calibrated for PA and flow. They were not re-calibrated right before, or during, these tests.

  • Snapmaker U1
    • Hotend: Luke's Lab Pika
    • Nozzle: 0.5 mm
    • Materials: PLA, PETG
  • Bambu X1-C
    • Hotend: Luke's Lab Pika
    • Nozzle: 0.4 mm
    • Materials: PLA, ABS
  • Doomcube
    • Hotend: Luke's Lab Chube Compact
    • Nozzle: 0.4 mm
    • Materials: ABS

Every number in this post came off a digital caliper reading to 0.01 mm, cross-checked with a telescoping bore gauge in the section where the calipers themselves became the potential weak link.

Three printers is not a huge sample size, so I spent some time pressure-testing it:

  1. An A/B test of the correction itself

    • Two machine profiles differing in one variable, with both pockets printed in the same part.

  2. Testing the assumption of linearity

    • A plate of bores from 5 mm to 28 mm, to test whether the error really runs in a straight line between the two measured points.

  3. Some bending found in #2

    • So I printed eight more plates and utilized a second measuring instrument to see if a bit of a ell curve existed or if that was just noise.

Separately, while doing these tests and expanding the catalog, I realized that my original design for machine-calibrated error numbers did not hold up as well past one printer, or when that design was shared. So, I brainstormed and tested some methods for allowing a single pocket to accommodate the largest range of machine error possible. I ended up deciding that crush ribs were the most promising.

I tested different sizes and variations of crush rib pockets for bearing pockets and nut pockets across all five configurations. My goal was to find the ideal combo of variables that cleared all five setups - most of them did, but three nut sizes still haven't.

If you only want the info that applies to your own printer, skip to the "If you take nothing else from this" section near the bottom. None of that needs the app.

Where one number per machine stopped cutting it

FitCheck's core loop is simple in theory: print a small calibration part, measure how far off your printer is, and let the app correct the holes and pockets it shows you, per machine. For screw-size holes, one measured number per machine has worked well. (If you tune your slicer's hole or XY compensation, that's the same idea - one flat offset per machine - and it hits the same wall this section is about.)

But I ran into an issue when I was working to expand the catalog with bearings. As I printed test parts to validate the calibrated-vs-uncalibrated fits and confirm calibration accuracy, I got some surprising results - each of them on the same machine, same spool.

  • The U1 in PLA ran 0.25 mm undersized on a 5 mm hole, and still 0.10 mm undersized at 16 mm.
  • The X1-C in PLA ran 0.22 mm undersized at 5 mm, and 0.075 mm undersized at 22 mm.
  • The Doomcube in ABS ran 0.12 mm undersized at 5 mm, but printed a 16 mm bore within 0.005 mm of nominal.

(Two of these compare at 16 mm and one at 22: the Doomcube's near-zero point is at 16 mm, the U1 is quoted at the same size so the two read side by side, and the X1-C's pair is the two anchors its profile stores - 5 and 22 mm.)

I didn't expect the Doomcube results. Its error didn't just shrink across the range, it nearly disappeared - so correcting a bearing pocket on that machine with its small-hole number over-corrected by more than a tenth of a millimeter: the difference between a bearing that seats firmly and one that rattles.

So for v1.3 I added a 2nd measurement to the calibration model - a 22 mm bore alongside the 5 mm one - and changed the app to use both. It draws a straight line between your two measurements and reads the correction off that line at whatever size hole you're actually making, instead of applying the small-hole number to everything. Whether that actually helped on a printed part was the thing to test.

Two profiles, one part

A feature like this is easy to demo and easy to fool yourself with, especially when you are constantly printing tests, comparing, measuring, etc. So I set it up as an A/B test with one variable. I created two machine profiles in the app, per printer. They were identical profiles except that one had the 22 mm measurement filled in. I read the recommended bearing-seat diameter off each profile, modeled both pockets into one part, and printed it - two pockets, same printer, same plastic, differing only by which correction produced them.

One thing to be upfront about: these A/B tests ran on two of the three printers. I tried running this test on the X1-C too, but its ABS profile pair predicted pockets only 0.03 mm apart - inside measurement noise, so there would have been nothing to judge either way - and I didn't end up printing the PLA one. The fleet numbers elsewhere in this post cover all three machines; this particular test covers two.

Doomcube in ABS

  • The single-number profile gave a 22.14 mm diameter pocket (attempting to correct to 22.05 mm). Once printed, it measured 22.13 mm, and the bearing rattled.
  • The two-measurement profile suggested a 22.03 mm diameter pocket (again attempting to correct to a 22.05 mm pocket), and that measured 22.01 once printed: just short of a press fit, and the bearing sits secure.

U1 in PLA

  • The single-number profile gave a 22.26 mm diameter pocket. Once printed, it measured 22.13 mm - bearing rattle.
  • The two-measurement profile gave a 22.20 mm diameter pocket. That measured 22.08 mm: snug. So the two-measurement profile was correct here as well.

Where the four numbers came from

The app's uncorrected starting point for a printed slip fit on this bearing is 22.05 mm: the 608's 22 mm outside diameter plus the 0.05 mm of clearance it recommends. Each profile adds its machine correction to that baseline, computed from the errors stored in it. Both profiles on a printer carried the same 5 mm measurement; the two-measurement profile also carried the 22 mm one.

Here is the whole chain, per profile. The stored errors are the raw measurements - how far off each calibration print came out at that size, no processing on top. They're signed: negative means holes print undersize, positive means they print large. A negative error means the commanded hole gets bigger; a positive one means it gets smaller.

Profile Stored error at 5 mm Stored error at 22 mm Commanded seat (mm) Printed (mm) Fit
Doomcube, single-number −0.09 mm not filled in 22.05 + 0.09 = 22.14 22.13 rattles
Doomcube, two-measurement −0.09 mm +0.02 mm 22.05 − 0.02 = 22.03 22.01 just short of press fit
U1, single-number −0.21 mm not filled in 22.05 + 0.21 = 22.26 22.13 rattles
U1, two-measurement −0.21 mm −0.15 mm 22.05 + 0.15 = 22.20 22.08 snug

The correction is the stored error with the sign flipped - a hole that prints 0.09 mm undersize needs a commanded diameter 0.09 mm bigger. The single-number profiles apply their 5 mm correction to every hole regardless of size; the two-measurement profiles draw a straight line through the two measured errors and correct each hole by whatever value that line has at the hole's own size. Here the hole is 22 mm - the second measured size itself - so the correction is simply the stored 22 mm error with the sign flipped. That is why 22.03 sits below the uncorrected 22.05, which looks wrong for a snug bearing seat, but actually isn't: the Doomcube's stored data said it printed 22 mm bores slightly large, so the correction subtracted. The U1's errors run undersize at both sizes, so both of its seats sit above the baseline.

These stored values came from the calibration prints I measured while setting up their profiles. They aren't quite the numbers earlier in this post - the 0.12 and 0.25 figures under "Where one number per machine stopped cutting it" came from a later campaign, measured on two axes - which is why the 5 mm errors here differ from those by a few hundredths.

The Doomcube's 22 mm reading did not survive later testing, and that is worth documenting. (It moves the absolute seat numbers, not the comparison this test exists to make - the gap analysis further down stands either way.) It was a real measurement, but of a stand-in: the calibration part at the time had no 22 mm bore, so I measured a 22.35 mm control bore on a different test print and stored its error as the 22 mm anchor. When the current calibration part added a true 22 mm bore and I re-measured the Doomcube, the error came out 0.065 mm undersize on that part and 0.025 mm undersize on a second one - not over nominal - and no re-measure at either anchor size, on any of my machines, has come out over nominal since. So that reading is retired: with today's numbers, the same profile would command a seat above 22.05, not below it. The results above are recorded for transparency - the pockets were modeled from what the profiles commanded at the time, printed, and measured.

One more comparison, and it is the cleanest number in this test: on each printer, how far apart the two pockets in the table above sat - as commanded, and then as printed. The profiles shared everything else (same printer, same plastic, same part), so that gap isolates what the second measurement did:

Printer Gap as commanded (mm) Gap as printed (mm) Difference (mm)
Doomcube0.110.120.01
U10.060.050.01

On these two prints, the correction predicted the change to within 0.01 mm. That comparison does not depend on the retired reading: the commanded gap between the seats is whatever the profiles produced, and the printed gap matched it.

Trying to break the straight line

The two-measurement correction assumes the error between a 5 mm hole and a 22 mm hole follows a straight line, and reads the sizes in between off it. That was an assumption I had never tested on a part. So I printed a plate of bores stepping from 5 mm up to 28 mm on all three printers - the X1-C in PLA, the U1 in PETG, and the Doomcube in ABS - measured every bore, and compared each one to the line the app would draw for that machine.

Five plates of stepped bores, one per printer-and-material configuration, each labeled by hand

Here is the raw data - measured error per bore in mm, negative meaning the bore printed undersize. The U1 PLA and X1-C ABS columns come from the material-swap plates covered further down (same geometry, printed later).

Bore (mm) U1 · PETG U1 · PLA X1-C · PLA X1-C · ABS Doomcube · ABS
5−0.190−0.245−0.250−0.090−0.130
10−0.110−0.150−0.160−0.075−0.065
13−0.115−0.125−0.165−0.050−0.015
14−0.110−0.115−0.145−0.055−0.030
16−0.105−0.105−0.120−0.040−0.005
22−0.100−0.070−0.090−0.045−0.025
26−0.090−0.065−0.075−0.070−0.040
28−0.065−0.035−0.030−0.035−0.038

Three notes on how these were taken:

  1. Every bore is two-axis (each bore read twice, 90 degrees apart) in the X1-C PLA column and the two material-swap columns; the Doomcube column is two-axis from 10 to 26 mm with pre-averaged values at 5 and 28; the U1 PETG column is pre-averaged throughout - one recorded value per bore, so the ovality risk from "What I got wrong" runs through the whole column.
  2. The 26 and 28 mm bores sit past the 22 mm anchor, so I treated them as scatter rather than signal.
  3. And the 5 mm values here differ by a few hundredths from the bullets earlier in the post - those quote the calibration-part averages (six readings across the part's three 5 mm bores), this table is one stepped plate per config. The 22 mm values can differ the same way: the X1-C's 0.075 earlier is the pooled anchor from two parts, while this plate's own read was 0.090.

Here's the same data drawn, for the three original plates (the two material-swap columns stay in the table to keep this readable). Solid is what each machine measured; dashed is the straight line the app would draw between that machine's 5 and 22 mm anchors. The bow is the solid line riding above the dashed one through the middle. The hollow points sit past the 22 mm anchor - scatter, not signal.

Measured hole error versus bore diameter for the three plates, each with its machine's two-anchor straight line dashed

The line was directionally right on every machine, but it wasn't perfectly straight. Correcting a 22 mm bore with the 5 mm number alone over-corrected by 0.06 to 0.15 mm across this fleet, and the two-measurement line removed most of that. What was left is a consistent bow: the mid-range bores (10 to 16 mm) printed a little wider than the line predicted. How much depended on the machine - the X1-C in PLA barely bowed at all, while the Doomcube in ABS ran about 0.05 mm wide through the middle. That's about half the thickness of a sheet of printer paper, but it's enough to push a press fit toward a slip fit.

Re-measuring every bore on two axes ruled ovality out as the cause - the ABS bores really were a little oval, but averaging the two axes only trimmed the bow by about a hundredth of a millimeter.

To be clear about what that means: the two-measurement correction did its job at the sizes it measures - it took out the 0.06 to 0.15 mm the single number would have missed. What it didn't predict is this last 0.05 mm on mid-range bores, and only on the machines that bow. So a corrected mid-range press fit on the Doomcube came out loose by about that much, and the next three checks were about making sure that bow was real before deciding what to do about it. If you'd rather take those checks on faith, skip ahead to "Getting the crush-rib numbers".

The bow follows bore size, not position on the plate

A bow that size is easy to create by accident, so I checked it two ways:

note: These tests were run on my Doomcube, since it showed the clearest signs of having a bow between its 5 mm bore and 22 mm bore.

First was confirming if it was the plate or not. For this test, I designed two models -

  1. One with the bores stepping across the plate in size order (which meant the mid-size bores were also the ones sitting in the middle of the plate)
  2. One with the bores scrambled so the mid-size bores sat somewhere else than the center.

The test here was to see if the bow could have been the plate and not the machine. I printed eight more plates on the Doomcube, half of them the ordered-bore model, half the scrambled-bore model.

The scrambled plates bowed the same as the ordered ones, agreeing to within a thousandth of a millimeter. So, this showed me that the bow follows bore size and not position on the plate. Across all eight prints the bow came out at 0.050 mm, with same-diameter bores varying by less than a hundredth, and it didn't change between the two ABS brands I ran.

The eight repeat plates spread in a fan

The bow isn't a caliper artifact

The second test was the calipers. Measuring with a caliper's inside jaws is a pain to do well, especially on a bore - you have to rock it back-and-forth and jiggle it side-to-side to try to get the most square reading you can. Because of this, measuring inside a mid-size bore is the weakest measurement in all of this, and a caliper reading that is low in that measurement would produce a bow on its own. So I measured the same bores with a telescoping bore gauge as well.

It locks to the bore's actual size, and then you measure the gauge itself with the caliper's outside jaws, which is a much easier measurement to get right. Across two plates and every mid-size bore, the gauge never read smaller than the caliper, and a 22 mm control bore agreed within 0.005 mm. So the bow isn't coming from the calipers either. If anything they understate it, and the real number is somewhere between 0.05 and 0.07 mm. The gauges I bought don't go below 8 mm, so the 5 mm anchor bore is outside its range. That bore's check is in the next section.

Digital caliper measuring across a telescoping bore gauge over the plate it was locked in

The same bores on a different part showed no bow

The new revision of my calibration part is a smaller plate, and it happens to carry the same 5, 13 and 22 mm bores. (It's a slightly different revision than the one in the free download below - it was designed as a research/testing model, not one the app would use.) On the same machine - still the Doomcube - it showed no bow at all. Same plastic, same calipers, same day, and its 13 mm bore landed within 0.01 mm of the straight line between its own anchors, on both ABS brands (two parts, one machine, so I'm treating it as early data).

If the calipers were the problem it would have shown up on that part too, and that covers the small bore the telescoping gauges I have can't read. It also means the bow isn't a fixed property of the machine: it's the machine and the part geometry together.

That settled the app question, and to be clear about what it settled: the two-measurement correction still does its job - the machine's error is most of the gap, and the A/B parts earlier in the post show it transferring to a real part. The bow is the piece that changes with the part geometry itself, so it isn't something the app can store a number for. It's the last 0.05 mm or so on the machine whose error bends the most - the Doomcube, which prints holes closest to size overall but is the least predictable from two measurements - and the crush-rib pockets further down absorb it without any measurement at all.

Swapping materials across machines didn't move the bow

One more thing came out of these plates, and it's something I had wrong in my own notes: the tight-to-loose spread across the fleet isn't material shrink. Shrink is a percentage of the dimension, so if it drove hole size the 22 mm bore would miss by ~4x more than the 5 mm one - and on every machine I measured it does the opposite, the small bore has the larger errors. (I leave ABS out of the shrink argument in both directions: that profile runs filament shrink compensation in OrcaSlicer, so its shrink is already dialed out before anything gets measured.)

So, I decided to print the same stepped-bore plate from the straight-line test in other materials, to see if material played any part in the bow. I printed in PLA and ABS on machines that hadn't run them yet.

Swapping material on the U1 barely moved its bow - 0.038 mm in PLA against 0.037 in PETG.

And ABS on the X1-C, once again the highest-shrink material of the three, produced the flattest curve I've measured on any setup. I only printed one plate per combination, so I treat these as directional results rather than precise numbers - but the direction was the same everywhere.

I don't know what is actually driving it. My guess is flow calibration and how small concave contours print, but I haven't investigated that directly - all I've shown here is that it isn't dependent on material properties.

Either way, the takeaway is specific: hole error belongs to the printer-and-material setup, not to the spool's spec sheet. There's no table you could look it up in - you measure it on your own machine, and that one measurement is exactly what the app's calibration stores.

Why the app doesn't ask for a third measurement

The obvious fix is a third measurement in the middle. I decided against it, at least as an app feature - though not because the bow is too small to see. Repeat readings of the same bore held to about a hundredth of a millimeter, and a careful two-axis measurement would catch a bow the size of the Doomcube's. The problem is that a third anchor is only worth having if the number you feed it is good, and neither the app nor I can tell how carefully any given user measured.

I know how that goes firsthand: Like I said, measuring can be a pain, and the same stepped-bore plate exposed one of my own stored measurements as being wrong (more details under "what I got wrong" below).

The bow matters most on mid-range press fits, and the crush-rib pockets already absorb it without any measurement at all. So I decided to keep the 2-bore measurement in the app, not put a number on the bow, and to instead suggest the crush-rib pocket for a mid-range press fit.

Getting the crush-rib numbers

The bow was one reason to want a pocket that forgives error; the bigger one is that calibration only helps on a machine you can measure, and the moment you share a design, that's gone. This is what originally threw a wrench into the design direction of the app - how is this supposed to be useful to people who share models (i.e. most people), or have multiple printers? I ended up landing on crush-rib pockets as a solution, and in v1.3 I shipped them: small ribs inside the pocket that yield a little to absorb machine error, no calibration needed.

Close-up of a crush-rib pocket, the ribs visible inside the bore A 608 bearing seated in the tapered-rib pocket

There's no way to derive those numbers, so I printed test parts until I had them.

The test:

  • A calibration model with different radii, rib design, and number of ribs per bore
  • Printed across all five printer-and-material configurations.

What I found was that a tapered-rib design roughly doubled the usable window:

  • with straight ribs, about 0.13 mm of interference range worked;
  • with the taper, everything from 0.27 to 0.53 mm of interference seated - a 0.26 mm band. I was happy to find that the band was enough to cover the spread I measured across all five setups, the Doomcube included.

Will the ribs hold up?

  • For good measure, I manually inserted and removed a bearing 50 times to test for durability on the winning ribbed design - specifically its firmest pocket that still measured snug, since that's the hardest fair test of wear. The grip settled a little after break-in and then held - the ribs looked much the same after 50 cycles as they did after 4.

How did I land on ribbed pockets?

  • Two other designs I tried didn't work out. Elastic tabs didn't seat at any variation on the one test model I judged them on. Elastic fins (the one I was hoping would win, because they look pretty cool and are fun to model) had no snug grade at all, so they're logged as a fallback option for the future.

The app only shows crush-rib numbers for hardware that has been tested. When v1.3 first shipped, that meant exactly one bearing and one nut - a 608-size bearing and an M5 nut. I did not want to assume that they'd hold at a size I hadn't printed and tested, so the rest of the catalog had to go through the same printing before it shows anything. That's the next section.

What transferred to the rest of the hardware, and what didn't

The next round of test prints targeted the remaining bearings and nuts through the same test that the 608 passed: all five printer-and-material configurations from the fleet list at the top, which between them cover both extremes of hole error that I can produce - about 0.17 mm apart at these sizes. Three things came out of these tests, and two of them - the rib-count rule and the nut-scaling problem - apply even if you never touch the app.

Rib count is the grade knob, not clearance

The rest of the bearing catalog mapped cleanly onto what worked for the 608 bearing - three ribs for a snug fit, six for a press fit - seated at 10, 13 and 16 mm outside diameters (the sizes the catalog's other ball bearings come in) on all five printer-and-material configurations, with the rib count doing all the work to make the fit snug or press-fit.

If you're designing your own printed bearing pocket, this is the part that carries over: you don't need a different rib clearance for every size, you need a different number of ribs at the same rib size.

On the X1-C in PLA, which prints the tightest holes of any machine I tested on, the snug grade came out a firm hand-press. It still went in without tools and it still came back out, so instead of changing the geometry, I added a line in the app explaining that - on a printer that prints holes tight, the ribs have more to crush, so there's more resistance.

The spherical bearing won't take a press fit

The one bearing that didn't fully transfer is the spherical one, a 14 mm GE5C - a bearing that houses a spherical ring that swivels, so the internal ring can tilt where the housing can't. The GE5C's press grade failed on the X1-C in PLA: the bearing would only go in cocked instead of square. So I made the decision to just ship the GE5C with a snug grade only, the one bearing in the app with no press option.

Testing it turned up something that isn't about ribs at all. On this bearing the inner ring is thicker (or taller) than the outer ring. My test pocket was cut to the wrong depth, so the inner ring bottomed out on the floor before the outer ring ever seated, and as the inner ring swiveled, the outer ring would get pushed out of the pocket - which looks exactly like a fit failure and isn't one.

This also meant my press-grade failure on this bearing was a confounded reading rather than a clean one: the press was landing on the ring that swivels. Snug-only shipped because it was the conservative call and I wanted to get the expansion out, not because the press grade got a fair test. It's logged, and it points at the right guidance for a bearing shaped like this: it needs a mount that captures and retains it, not a pocket you press it into. I will eventually retest the GE5C, but for now it just gets snug.

Nut pockets don't scale with the nut

The nuts were messier, and that turned out to be one of the most useful findings in this round of tests. The confirmed M5 ribbed pocket variables did not simply scale up. Larger nuts needed a tighter pocket relative to their own size rather than a proportionally bigger one, and the press grade wouldn't even seat on the X1-C in PLA at several sizes. If you have a nut pocket that works and you scale it by nut size, expect it to come out loose at the big end and stuck at the small end when printing.

That's also why the app is uneven here. Only M3 ships both grades - everything else that was validated ships one - and three sizes show nothing at all: M1.6, where I haven't confirmed the tiny ribs print reliably, M2, which is one measurement short, and M3.5, which isn't graded yet. Same rule as everywhere else - a size that hasn't been through testing shows nothing rather than a scaled guess.

If you take nothing else from this

Everything in this section applies to your own printer, whether or not you ever touch the app.

Your printer's hole error isn't one number

For me, it changed with hole size on every machine I measured, and on the Doomcube it nearly vanished: 0.12 mm undersize at 5 mm, within 0.005 mm of nominal at 16 mm, and back to only a few hundredths undersize at 22 mm. If you tune your slicer's hole compensation off a single small test hole, remember that the slicer applies that one offset to every interior wall you print - every hole, every pocket, at every size - and hole error changed with size on every machine I measured. The offset that fixed your small test hole will be too much or too little somewhere else in the range.

It isn't material shrink either

Shrink is a percentage of the dimension, so if it drove hole error a 22 mm bore would miss by ~4x more than a 5 mm bore. Every machine I measured goes the opposite way: the small bore misses the target dimension by more. (My ABS profile runs filament shrink compensation in the slicer - its shrink is already compensated before I measure anything so it can't be a true judge of potential shrink contributions.) I can't tell you what the real driver is, but whatever it is, it follows the machine and not the filament: two brands of the same plastic measured the same to within three thousandths of a millimeter (on the one machine and material I ran two brands on), so it isn't a per-spool number there. Swapping to a different plastic entirely does move the numbers, though, which is why I measure each printer-and-material combo as its own setup.

Round holes and hex pockets don't share the same error

On the Doomcube, hex pockets measured across the flats came out about 0.2 mm larger than the machine's round-bore error predicted - and that split repeated across two filament brands to within a thousandth of a millimeter. The Doomcube is where I pinned the number down, but the pattern held across the fleet: on every machine I measured, hex flats printed closer to true than the round bores did - flats errors stayed under a tenth of a millimeter, most within a few hundredths, while the same machines' round bores ran as much as a quarter of a millimeter undersize. If you've tuned hole compensation and your nut pockets still fit differently than your bores, this is likely part of why: the slicer applies that one compensation number to every interior wall, hex flats included, and the flats don't share the round holes' error. It's also why FitCheck's calibration takes a separate across-the-flats measurement instead of reusing the round-hole number.

Caliper measuring across the flats of a printed hex pocket

Don't trust a caliper at the mouth of an unchamfered printed hole

The top layer prints tighter than the hole walls under it, so the reading comes out smaller than the actual bore. I'd suggest adding a small entry chamfer to anything you plan to measure - I learned that one the hard way. That story is under what I got wrong, below.

Run it on your own printer

Everything above rests on three printers, which is not many. The machine numbers behind the correction - the 5 and 22 mm anchors each profile stores - came off my calibration model, and that model is free to download, with a CNC version in the same listing - no account required, no hidden strings, and you don't need the app to read what you measure. (The stepped-bore plates and the A/B part were one-off test prints, and the small research plate from the bow sections isn't published - the download is the part the app's calibration flow is built around, the same one the 22 mm re-measurements earlier in this post came off.) Print it, measure the 5 mm and the 22 mm bore, and you'll have your own machine's two numbers in a few minutes. Take the caliper habits from "What I got wrong", just below, with you when you do.

Caliper reading the calibration model's 22 mm bore

If you do that and your numbers disagree with mine, or if they do agree, please share your results! As I said, my sample size is small, and I would love to get more data on this. More machine results are worth more to this than anything else I could print myself.

What I got wrong

The test part itself shipped with a defect. I left the entry chamfers off the small holes, so their caliper readings came out low and I couldn't trust them - the mouth of an unchamfered printed hole isn't the actual hole diameter. Those readings don't back any claim in this post, and they won't until a clean re-run with chamfered holes.

The straight-line plates surfaced a worse error: me trusting a bad measurement. The stored 22 mm number for the X1-C in PLA said it printed 22 mm bores nearly true, and every other bore on that machine's plate disagreed, sitting on a smooth trend that 22 mm bore should have been on. Re-measuring the original calibration part on two axes settled it. The bore was slightly oval and I'd caught the wide axis, recording −0.005 mm where the real number was about −0.075 - a misreading the same size as the gap between the rattling pocket and the seated one at the top of this post. And that miss happened while I was being careful, with good calipers, on my own part - which is why I'm not building features that depend on measuring mid-size bores to a few hundredths, and why the next revision of the calibration part (the smaller plate from the no-bow check above, not published yet) carries a second 22 mm bore as a cross-check. The Doomcube's stored 22 mm reading, the one its two-measurement A/B profile ran on, didn't survive re-measurement either; that one is documented up in the A/B section.

The eight-plate run added one more. My write-up credited a result to a filament-path swap I'd planned for the ninth plate - except the swap never actually happened at the printer, so I was explaining a control that didn't exist. I caught it and rectified it the same day, and the plate turned out to be an ordinary extra data point.

Same reason the crush-rib pockets don't quote retention forces or temperature ratings: I didn't measure how much force the bearing takes to come out or stress-test them in an oven, so the app doesn't claim it.

Where the checking stops

None of this is definitive proof - it's a handful of experiments on the printers I own. But the correction held up in the A/B test, the straight-line assumption behind it got tested and further fleshed out, and every crush-rib number in the app is there because that exact hardware seated on five different printer-and-material setups.

The standard numbers are free on the web at FitCheck; correcting them to your own machine's measured error is what the app does. The design patterns behind the crush ribs are in Printed holes that fit.


Happy printing!

Like what I do and want to support me? Buy me a coffee!

Next
Next

How to Increase the Temperature in Your Printer Enclosure