v1.7.5 — threadedRod from a custom profile (#225)
Additive, source-compatible. Builds a smooth worm/screw from a custom radial tooth profile directly — no boolean — closing the actionable part of #225.
Why
helicalSweep a profile then union/subtract it with a coaxial cylinder is invalid (union) or collapses to zero (subtract), and no fuzzyValue / heal pass recovers it — OCCT's BOP can't resolve the coincident/tangent helicoid faces (consistent with #213, #181). The boolean compose path was never the way; the direct build is.
New API
Shape.threadedRod(customProfile:nominalDiameter:pitch:cutDepth:length:axisOrigin:axisDirection:leftHanded:)— composes a custom tooth profile with the core by sewing (no boolean) → BRepCheck-valid, analytic (handful of B-spline faces → sub-MB STEP). Returnsnilrather than silently producing an invalid boolean.ThreadProfile.supportsSmoothRodBuild— public predicate (real crest flat, ≤ 2 flanks).Shape.helicalSweep(…)doc now warns against the boolean-compose anti-pattern and points tothreadedRod.
The issue's worm (root r3, crest r6) via threadedRod: valid, 9 faces, ~0.74 MB STEP (vs the ~6.8 MB faceted fallback).
Docs
New Helical Sweeps cookbook page (helicalSweep helicoids vs. threadedRod worms, and why the boolean compose fails), with rendered figures.
No xcframework change — same binary as v1.7.1. Thread Features 22→23, total 4,288 operations.
📖 Docs & cookbook: https://gsdali.github.io/OCCTSwift/