Helical Annulus Gear

Helical Annulus Gear render

gears/ring/helical_annulus_gear.pyOBJECT_OT_helical_annulus_gear (object.helical_annulus_gear, "Helical Annulus Gear")

Helical internal gear — twisted involute teeth cut into the bore of a solid ring. See README.md for family-wide conventions and annulus_gear.md for the swapped addendum/dedendum geometry shared by all three annulus generators.

This is where the hand convention flips

Read this even if you've already read the helical/herringbone external gear docs. External-external helical pairs need opposite hands; a helical annulus and its mating helical pinion need the SAME hand. Right annulus meshes with a right pinion, not a left one. This is the single most common mistake this library's Match Target system exists to prevent — which is why picking a target here runs sync_helical_same, not sync_helical_opposite.

Properties

Property Type Default Range Notes
targetObject pointergears with bmech_moduleMatch Target; runs sync_helical_same — copies module/PA/helix angle and matches hand exactly
tooth_countInt408–200 (soft)Must exceed the mating pinion's tooth count
moduleFloat (mm)2.00.1–20.0 (soft)Transverse module — must match the mating pinion
pressure_angle_degFloat (°)20.010–45
helix_angle_degFloat (°)20.01–4515–30° typical for FDM
handEnumRIGHTRIGHT / LEFTMust match the pinion's hand — see above
width_mmFloat (mm)10.01–80 (soft)
ring_wall_mmFloat (mm)5.00.5–30 (soft)Radial wall thickness beyond the tooth root
n_slicesInt162–64 (soft)Z divisions for the twisted inner (toothed) wall
outer_segsInt6416–256 (soft)Facets on the outer cylindrical surface

Build method

No boolean, no Solidify modifier — same direct-bmesh rewrite as the straight annulus gear (annulus_gear.md), extended across twisted Z-slices. This used to be a solid outer cylinder minus a boolean-DIFFERENCE helical cutter (EXACT solver); measured ~10-40x slower in testing (330ms-5.0s for tooth counts 8-100 vs 9-133ms direct).

_build_helical_annulus_solid builds:

Pressure angle clamp has extra margin here too: _derived() clamps to gear_matching.max_pressure_angle_deg(...) - PA_TRIANGLE_FILL_MARGIN_DEG (0.2°), not the theoretical limit itself — triangle_fill is more fragile right at that boundary than the old EXACT-solver boolean was. Swept tooth counts 8-100 × pressure angles 10-45° × both hands: 96/96 clean.

Total twist (width_mm * tan(helix_angle) / pitch_radius) and normal module (module * cos(helix_angle)) are shown as read-only info lines.

Panel warnings

Only tip_r <= 0"Module too large — tip radius ≤ 0" (ERROR, blocks). No rim-thickness warning, matching the straight annulus gear.

No print-in-place clearance logic in this generator — it produces a rigid single-part ring meant to be printed separately from its mating pinion.

Output

One object, stamped:

gear_matching.stamp_gear(body, "helical_annulus", module, pressure_angle_deg,
                          tooth_count=tooth_count,
                          helix_angle_deg=helix_angle_deg, hand=hand)

Meshes with a helical pinion (helical_gear.md) of the same module, pressure angle, and helix angle, and the same hand.