Skip to content
CADCAMFUN
Docs

Documentation

Feature generators

Involute gears, ISO metric threads, helices and sheet-metal strips with flat patterns: exact profiles and meshes from a few numbers.

Feature generators

Feature generators turn a few engineering numbers into exact profiles or meshes: an involute gear from module and tooth count, an ISO thread from diameter and pitch, a helix from radius and pitch, a bent strip from a centre line and a thickness. Each is a pure function in packages/core/src/cad; the editor, the assistant and the CAM model call the same function, so all three see the same part.

GeneratorFileMain exports
Involute spur geargear.tsgearDimensions, gearOutline, MIN_GEAR_TEETH = 6
ISO metric threadthread.ts (124 lines)threadSizes, threadProblem, threadTool, threadGroove
Helix / coilhelix.ts (41 lines)coilGeometry, stepsPerTurn, COIL_STEPS_PER_TURN = 32, COIL_MAX_TURNS = 60
Sheet metalsheet-metal.ts (235 lines)sheetOutline, developedLength, withHems, flatPatternDrawing, flatPatternDxf

Involute gears

Pitch radius m·z/2, tip radius pitch + m, root radius pitch − 1.25·m, flanks the involute of the base circle r_p·cos α (ISO 53 / DIN 867). The outline is one counter-clockwise ring about the origin with tooth 0 centred on +X. When the teeth would come to a point before the tip circle (few teeth, a large pressure angle), the tip is pulled in by bisection to where the tooth is still 2 % of a pitch wide.

Specpitchbasetiproot
m 2, z 18, 20°1816.9142015.5
m 2, z 12, 20°1211.276149.5
m 2, z 18, 25°1816.3142015.5
Meshing pair m 2: z 18 and z 12 Drag to orbit · scroll to zoom · right-drag to pan
Both outlines are gearOutline(…, 4) output, extruded 8 mm with Ø8 and Ø6 bores. Centre distance m(z₁ + z₂)/2 = 30 mm; the 12-tooth gear is turned half a pitch (π/12) so its tooth sits in a gap of the 18-tooth gear.
Errors — real messages
gearOutline({ moduleValue: 2, teeth: 5 })
// RangeError: A gear needs a module > 0 and at least 6 whole teeth
gearOutline({ moduleValue: 2, teeth: 18, pressureAngle: 50 })
// RangeError: The pressure angle must be between 0 and 45 degrees

ISO metric threads

A modelled thread is real helical geometry: a core cylinder at the root united with a ridge swept along a helix with the profile kept radial, clipped to the thread length. External threads have their core at d₃ = d − 1.22687·P and a ridge up to d; internal ones are the tool that cuts a tapped hole, core at D₁ = D − 1.08253·P (the tap drill) and a groove out to D. The flank is cut square to the helix and the axial widths are corrected by the cosine of the helix angle so pitch and crest widths are exact.

Threadext. minor d₃ext. height h₃int. minor D₁root widthcrest width
M6 × 14.77310.61344.91750.83330.125
M8 × 1.256.46640.76686.64681.04170.1563
M10 × 1.58.15970.92018.37621.250.1875
M12 × 1.759.8531.073510.10561.45830.2188

Values are threadSizes(d, P, internal) output. Heights are 0.61343·P (external) and 0.54127·P (internal); the crest is P/8.

M8 × 1.25 external thread, 5 mm Drag to orbit · scroll to zoom · right-drag to pan
threadTool({ diameter: 8, pitch: 1.25, length: 5, internal: false }): 3 698 triangles. The full 10 mm version is 7 020 triangles, a closed solid of genus 0, V 408.0 mm³, built in 460 ms.
threadProblem — real messages
threadProblem({ diameter: 6, pitch: 4, length: 10, internal: false })
// "A pitch of 4 mm is too coarse for a 6 mm thread"       (pitch > d/2)
threadProblem({ diameter: 6, pitch: 0.1, length: 10, internal: false })
// "A thread has at most 58 turns (this one is 100.0 long: 10 mm at a pitch of 0.1 mm)"
threadProblem({ diameter: 6, pitch: 1, length: 10, internal: false })   // undefined: buildable

The 58-turn limit is COIL_MAX_TURNS − 2: the ridge starts one pitch before the thread and ends one after, so the flat end cuts meet the full profile.

Helices

coilGeometry returns the centre line and the first profile ring of a wire wound about Z, for sweepSolid. Points per turn follow from the radius so chords stay within 0.01 mm of the true helix: stepsPerTurn(r) = clamp(⌈π / acos(1 − 0.01/r)⌉, 32, 128).
radiusstepsPerTurn
132
550
50128
Coil r 10, pitch 4, 5 turns Drag to orbit · scroll to zoom · right-drag to pan
coilGeometry({ cx: 0, cy: 0, z0: 0, radius: 10, pitch: 4, turns: 5, wire: 1.5, square: false, left: false }).path: 356 points (5 × 71 + 1), drawn as a toolpath-style polyline.

Sheet metal

A sheet-metal profile is a centre line thickened to a strip of constant thickness, with the material on the left, right or both sides, and inside bend radius r on every corner. developedLength unbends it with a K-factor (default 0.44): each bend contributes (r + K·t)·θ and each straight run loses the setback of its neighbouring bends.

U channel: t 2, inside R3, 30 mm flange Drag to orbit · scroll to zoom · right-drag to pan
sheetOutline([(0,30),(0,0),(40,0),(40,20)], 2, ”left”, 3): an 80-point closed outline, extruded 30 mm along the sketch normal as the history does.
developedLength(path, 2, 3, "left") — real output
{"straight":70,
 "bends":[{"angle":1.5707963267948966,"allowance":6.094689747964199},
          {"angle":1.5707963267948966,"allowance":6.094689747964199}],
 "length":82.18937949592839}
SegmentFlat-pattern span, mm
flat0 → 25
bend 90°25 → 31.095 (allowance 6.0947)
flat31.095 → 61.095
bend 90°61.095 → 67.189
flat67.189 → 82.189

Check: (3 + 0.44 × 2) × π/2 = 6.0947 per bend, and 70 + 2 × 6.0947 = 82.189 mm.

Troubleshooting

MessageFix
A gear needs a module > 0 and at least 6 whole teethuse z ≥ 6 and an integer tooth count
The pressure angle must be between 0 and 45 degrees20° is standard; 14.5° and 25° are common alternatives
A pitch of P mm is too coarse for a D mm threadpitch must be at most half the diameter
A thread has at most 58 turnssplit the thread into shorter features, or use a coarser pitch
The sheet thickness must be positive (it is 0)pass a thickness > 0
The path is too tight for this thickness: its offset curve breaks upincrease the bend radius or reduce the thickness