Nested gimbal rings are a nice print-in-place test: every ring has to turn freely, and nothing may fuse. This post builds four rings and a globe in Python with manifold3d, and shows the three mistakes that fused my first attempts.
1. A ring is a revolved rectangle
from manifold3d import Manifold as Mf, CrossSection as CS
w, t = 4.4, 4.0 # radial width, thickness
def ring(R):
return Mf.revolve(CS.square([w, t], True).translate([R, 0]), 96)
revolve spins the profile around Z, so the ring lies in the XY plane. Rotate it with .rotate([90,0,0]) and so on to get the other planes. Each pair of neighbours shares one axis: Z, then Y, then X, then Z for the globe.
2. Cone pin and cone socket
The child ring grows a cone pin on its outer surface. The parent gets a matching cone socket, offset by the clearance CL = 0.45. A cone self-centres, and it prints without supports when the tip points sideways or up.
def cone(r1, r2, h, pos, d): # d = unit direction
return Mf.cylinder(h, r1, r2, 32).transform(rotm(d)).translate(list(pos))
g = inner_parent - outer_child # gap between the rings
L = g + 1.5 # pin reaches 1.5 mm into the parent wall
pin = cone(2.7, 1.1, L, d * outer_child, d)
slope = (1.1 - 2.7) / L
sock = cone(2.7 + slope*(g-1.2) + CL, 2.7 + slope*(L+0.7) + CL, L+0.7-(g-1.2), d * (outer_child + g - 1.2), d)
parent = parent - sock
3. The three mistakes
- The socket must start before the wall. A ring wall is curved. A socket that starts exactly at the nominal inner radius leaves a thin skin at the edges of the cone, and the pin fuses to it. Start the socket 1.2 mm earlier.
-
Check every pair with
a ^ b. After the final union,decompose()tells you the count of parts. When it is too low, intersect each pair and print the volume. A volume above 0.01 names the fused pair. - Keep the stand away from sockets. My pedestal column reached into the lowest socket and filled it. Stop the column at the outer surface of the ring.
I have not test printed this yet. The meshes are separate manifold solids with 0.45 mm radial clearance.
Top comments (5)
Relying purely on mathematical checks and decompose() before hitting print is hardcore CAD engineering. The 1.2mm socket offset to avoid the "thin skin" fusing issue is a classic FDM gotcha that bites everyone eventually.
Would love to see an update once you actually test print it. Does the 0.45mm radial clearance hold up well on the first layer, or do you usually have to dial it in based on the specific printer?
Thanks! Not test printed yet, so 0.45 mm is just a starting value. A tight first layer or elephant's foot is what usually fuses these, so I'd add a small chamfer or tune the first-layer squish before changing the clearance. I'll post an update after the test print.
Elephant's foot is always the final boss of print-in-place parts. A bottom chamfer will definitely save it. Looking forward to the test results!
yep, the chamfer goes on the first pass. I'll post how it turns out once it's printed, curious if 0.45 holds up on a cold first layer
Cold first layers are actually your best friend for tight tolerances—you get way less "squish" and dimensional creep. If 0.45 fuses, bumping the chamfer and clearance to 0.50mm is usually the magic number for print-in-place.
Definitely keep us posted with the results!