Saturday 18 July 2020


Back in 2011 I came up with polyholes to get around the problem of 3D printed vertical holes coming out too small. Horizontally printed holes also come out too small but for a different reason: the slicer creates a staircase approximation of the hole, but because it samples the model at the middle of the layer, the top or bottom corners intrude into the circle.

 This shows a 6mm truncated teardrop sliced with 0.25mm layers, with red highlighting the overlap.

A long time ago I mitigated this by adding 1/4 of the layer height to the radius, for reasons I can't remember now, but it isn't very accurate. There is some slight interference vertically and gaps at the sides.

I am currently designing a gearbox with ball bearings in 3D printed pockets, which I want positioned accurately, so I decided to revisit the problem.

The correct solution is simple: the compensated shape for the teardrop is simply the hull of itself shifted up half a layer and shifted down half a layer. That compensates the top half so that the bottom of the layer ends up on the circle and the bottom half so that the top of the layer ends up on the circle.

So now all the tips of the stairs sit exactly on the circle, except near the top where the 45 degree overhang would be exceeded.

This is what the hole looks like before it is sliced.

It does of course make the model specific to being sliced at a certain layer height, but my models tend to be designed that way anyway,

I printed this test piece with 6mm holes at different offsets from the layer boundary as well as holes from 1mm to 5mm and I tested it with plug gauges.

The gauges fit all the holes easily. Some are snug and some have a little play vertically depending on how the top edge aligns with the layer boundaries.

The bridge layers over the top come out a bit low because the filament forms a cylinder from a volume that would normally almost fill a rectangle, making it a slight interference fit when the top  lines up exactly with the layers. In other cases there is a bit of vertical play due to the 45 degree limit at the top of the teardrop. This won't be an issue with my gearbox because it will be split into top and bottom halves and the top half will be printed upside down.

I have updated teardrop_plus() in NopSCADlib to use this method and also added a plus option to all the other variants like tearslot(). See and where you can find the code to make the test STL. 

It should work universally as long as all slicers slice in the centre of the layer. Obviously it makes less difference with smaller layer heights.


  1. The extrusion profiles are not rectangular though. If your extrusion width is at least nozzle_width + layer_height, you'll get a rectangular cross-section with semicircular ends, and these semicircles will cut off most of the material that nominally overlaps your circle. If your extrusion width is much smaller than that (closer to your nozzle diameter), the fluid behavior of the extruded plastic tends to give you a cross-section that looks more like a rounded trapezoid (small end down), and those rounded corners will intrude on the lower portion of the circle more than the upper portion.

    You'll also have some small amount of droop in the bridge at the top. Assuming you're not printing with an increased extrusion width, I think what you're really accomplishing here is compensating for that droop, and probably creating a rough 3-point contact between the bridge at the top and the slightly over-intruding sloped edges below. There are plenty of shapes that would do this in a more controlled fashion, such as an equilateral triangle with an apothem equal to the radius of the shaft to be inserted. To remove less material, the points of that triangle can be truncated by intersecting it with a slightly larger triangle facing the other way (making a slightly irregular hexagon), or with a slightly larger circle (approximated by some higher-order regular polygon with the slightly larger apothem). To spread the contact a bit in the case of slight interference fits, you can replace the equilateral triangle with a reuleaux or reuleaux-like triangle produced by intersecting three offset circles.

    Using the top of the hole as one of the flats is the obvious choice, but again, there will be some small (and difficult to quantify) droop in that surface, so putting it between flats might be better. The best solution might actually be to extrude the hole with a twist of 30-60 degrees along its length. Of course, the difference in practice between this and typical "circular" or hexagonal holes will likely be swamped by plastic behavior effects, and that's assuming that the machine is completely free of print artifacts like Z wobble and X/Y backlash.

    Also, if you need a bunch of holes of some standard diameter, there's still the old trick of printing them as "circles" with the nominal diameter so that they come out slightly undersized, then reaming them out with a drill bit spinning in reverse, which will give you much more circular, more precise holes than any post-processing-free technique.

    1. There's also the issue that while your extrusion profile isn't rectangular... Most slicers assume they are. Compounding any errors.

  2. Yes good point about the rounded ends. Since I know the extrusion width and layer height I might be able to compensate the shape for those.

    For short bridges like these I estimate the droop is sqrt(4 * layer_height * extrusion_width / PI) - layer_height ~ 0.15mm. It isn't enough to stop the plug gauge going in easily but is a slight interference fit. I don't compensate for it because making the peak a layer higher gives a loose fit.

    Yes for precision holes I would normally ream but these will be semi-circular pockets open on one side, so I can't ream those or easily machine them. The easiest way would be to insert a hot semicircular form to a controlled depth.

  3. Yes a model based on rounded filament yields a much better result, see

  4. Make as a bigger item, ream and then machine the top half off?
    More hassle but gearbox loading and alignment would benefit, but then i've no experience of 3D printing! (yet)

    1. The bearing socket I am trying to make can't be reamed because it is an internal pocket. The is no way to access it axially from the outside, so it would need a very odd custom tool. A disk shaped cutter with a right angle drive or something.

      The main advantage of 3D printing is all the effort is in the design and then the machine just makes it. There is no setup or tooling required no matter how complex tha part is.

      In this case I put the effort into my library and now all my horizontal printed holes are more accurate and more round. In most cases they are clearance holes for fasteners where it doesn't make much difference, and in other cases I could get a reamer in to ream them, assuming I have the right size of course. I even have a set of adjustable ones but I don't think I have 9mm, which is the size of the bearings.

  5. Finally! You are back! Just curious, is there a way to 3d print m3 nunts and bolts with a 0.25 mm nozzle?

  6. Somebody reported being able to print M4 nuts and bolts in the OpenSCAD forum. They used 0.05mm layers through a 0.4mm nozzle, so I guess M3 would be possible with a 0.25mm nozzle. I have never tried printing such fine threads myself.

  7. The quality isn't ideal, but I've seen workable M3 screws/nuts printed using a .4mm nozzle. MAKEiT used to do this as one of their standard demos every time they did a show. I'm sure the tolerances had to be tweaked to make them come out properly.

    When printing threads, my personal rule of thumb is that you need at least 10 layers per thread to get decent quality. Of course, you could modify the thread profile a bit and make it work with as few as two layers per thread, but I obviously wouldn't recommend it.

    1. Personally, I think E3D's 0.15mm nozzle would be a perfect candidate. Just need to make sure that the filament is clean and dry.