/** Educational 1-D dimension example. Coordinates are inches, increasing from * a reviewed starting edge. Not a DXF parser or machine backgauge program. * Each incoming tangent belongs to that bend, on the approach side. */ export function dimensionChain({ edge = 0, centers, tangents, mode = 'tangent' }) { if (!Number.isFinite(edge) || !Array.isArray(centers) || !centers.length) throw new RangeError('Provide a finite edge and at least one bend center.'); if (!['center', 'tangent'].includes(mode)) throw new RangeError('Unknown mode.'); if (mode === 'tangent' && (!Array.isArray(tangents) || tangents.length !== centers.length)) throw new RangeError('Provide one incoming tangent per bend.'); centers.forEach((center, i) => { const previous = i ? centers[i - 1] : edge; if (!Number.isFinite(center) || center <= previous) throw new RangeError('Centers must increase from the starting edge.'); if (mode === 'tangent' && (!Number.isFinite(tangents[i]) || tangents[i] < previous || tangents[i] >= center)) throw new RangeError('Each tangent must precede its center without crossing the previous center.'); }); return centers.map((center, i) => ({ label: i === 0 ? 'EDGE → CENTER' : mode === 'center' ? 'CENTER → CENTER' : 'TANGENT → CENTER', from: i === 0 ? edge : mode === 'center' ? centers[i - 1] : tangents[i - 1], to: center, inches: center - (i === 0 ? edge : mode === 'center' ? centers[i - 1] : tangents[i - 1]) })); }