Monday 20 July 2020

Horiholes 2

As whosawhatsis pointed out in a comment on my last post, the edges of the filament staircase are actually semicircular and that makes a big difference as to where they should be to meet the circle tangentially. Not sure why I missed that as I have done several posts about extruded filament shape, I must be losing it!

This is what my previous shape actually produces.

The circle only touches at four points. The correct shape is obtained by calculating where the semicircles meet the circle.

The centres of the ends of the filament lie on a circle with a radius of the hole plus half the filament height. The end of the filament is then offset inwards horizontally by half the filament height. I.e. the slicer samples the layer at the central tip but the filament touches the circle on a tangent.

To make the shape geometrically I make a teardrop with a radius of the hole plus half the filament width, split it in half and shift the two halves together by half the filament width. As can be seen here that goes through all the filament tips, i.e., where the slicer samples.

This is what it looks like relative to the target hole.

Interestingly it is the same as my previous attempt at the top, bottom and sides, i.e. the only four points it touched before.

I made a test with the new formula.

The plug gauges all fit, but more snugly than before, so this is definitely a better solution for supporting a bearing in a pocket. At every layer it should have a tangential support from the rounded edge of an extrusion.

Here is a close up of the 6mm hole that is aligned on a layer boundary and the 1mm hole above it.

I have updated NopSCADlib on Github to use this method.


  1. Very interesting, I will experiment with this. Have been using the truncated teardrop for years so it took me a couple of readings of this blog to fully appreciate the change here.
    One thing I'd mention is that making the flat top nominally the same width as the radius is pretty conservative - on most printers I can safely get accurate overhangs up to 65 degrees. So I tend to make the width of the top flat section 2/3 of the radius, in my local library. If the goal is to maximise points of contact this could be worthwhile.
    A yet further (overkill?) suggestion is that we can get away with a much greater overhang on a convex curved outcropping. This could be used to good effect - along the length of a circular horizontal hole, the shape could undulate between a true cylinder and the truncated teardrop shape. The result should be a printable hole that would more perfectly constrain the rod while remaining printable...?
    Cheers, Alex

  2. I should probably make the overhang angle a parameter. I haven't had much success with steeper overhangs myself because I normally print ABS with no fan and I tend to stick with 2:1 extrusion width / layer height but I do appreciate other people get steeper angles.

    I find convex outcrops tend to curl upwards and rub on the nozzle and get ugly, probably another property of ABS with no fan. Interesting idea though, and of course soluble support material would make a complete circle printable without any droop.

    1. Belated feedback:
      Yes - ABS is significantly less predictable beyond 45 degrees - I normally print with PLA and PETG but having some ABS prints to do I re-ran this and found 55 degrees was my cutoff for acceptable quality.
      I also tried the undulation method (With PLA & PETG) and it was spectacularly successful! Have lost the code snippet but it was simply a stack of hulls of short sections of a perfect circle and longer sections of truncated teardrop, repeated end on end, as the subtracted shape. So the overall shape was the normal truncated teardrop - but every 10mm it would dip inwards for 2.5mm and outwards for 2.5mm, spending only 0.5mm at the perfect circle. I found this worked very nicely with good cooling on PLA/PETG and made for an extremely snug fit.

  3. So one should use teardrop_plus() with $layer_height to carve the holes in order to leave it to the slicer to manage the layer calculations? Do you use horihole() or horicylinder() to make actual parts, or are they just for rendering? It seems like if you positioned horicylinder up a half-layer relative to where the slicer samples, so it's in between the planned filaments, it would make undersized, out of round parts.

  4. Oh, it's interesting to render a 5mm horihole and matching horicylinder with a large layer height (0.999mm, 1, 2mm)) and slice/print it at finer resolutions as a hands-on model. But at 1mm or above layer_height, the 5mm horicylinder previews with a couple out of bounds topknots, and fails to compile.

  5. Yes I use the new version of teardrop_plus() to make holes horizontal holes. I use horicylinder when I want to make a peg to fit in a round hole. It has a z parameter, so it should be aligned with the slicer layers as long as they are uniform. I used it for my my cable chains and they print correctly even when tiny.

  6. I have never tested it with large layer heights but I can't spot anything that would go wrong. Can you post an example, perhaps as a github issue.

  7. Here: