mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-18 22:42:37 +00:00
Adds CadFeatureType::Helix — the missing input for Sweep. Sweep already existed but could only follow a sketch, so springs, coils, augers and non-standard-pitch threads were unreachable. Helix + the existing Sweep now gives all of them with no further work. Built the OCCT way: a 2D line on a Geom_CylindricalSurface (Geom_ConicalSurface when helix_taper_deg != 0) turned into an edge and lifted to 3D with BRepLib::BuildCurves3d — a true analytic helix, not a sampled polyline, so a swept spring is smooth rather than faceted. The axis is the plane normal through the plane origin, matching how Revolve and Plane already work. Sweep's path resolution is widened to accept either a Sketch (unchanged behaviour) or a Helix, and rejects anything else with a clear error. Helix itself is skipped in route_feature and recompute — like the datum features, it produces no body and exists to be consumed. Invalid input is refused rather than approximated: non-positive radius or pitch, negative height, a turn count above 10000 (which would hang OCCT), and a taper that would drive the radius negative before reaching the top all fail with a specific error. Serialization: helix_radius/pitch/height/left_handed/taper_deg appended at the very end of both save and load, identical order, after the coordsys block. SNAPORCA_CAD_RECIPE_VERSION stays 2; Helix is appended to the end of CadFeatureType. Golden fixture regenerated with distinctive literals and field-value assertions; all pre-existing assertions pass unchanged. Tests assert analytic values. The one that actually proves it is a helix and not a circle or a spiral: arc length of r=5 pitch=2 height=10 measured with BRepGProp::LinearProperties against 5*sqrt((2*pi*5)^2 + 2^2), WithinRel 1e-3. Plus bounding box (2r in X and Y, height in Z), the conical top radius, the left-handed winding compared at equal parameter, and the integration test: a circle r=1.5 swept along a 5-turn helix gives one valid solid of ~1115 mm^3 (WithinRel 0.1 — pipe sweeping is not exact). MCP: `helix` method registered in describe_tools(). Ported from snaporca 6cdc6b5459. Two fork-specific adjustments: the two new error-message assertions use Catch2 v3's ContainsSubstring (v2's Contains does not exist here), and the golden fixture is copied rather than regenerated because this fork cannot be compiled locally — make_golden_doc_v1() is byte-identical across both forks, so the blob is provably the same. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BVzKmX6Y1aEteit1HTXG4Q