@faicad/sheetmetal 0.16.1 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/allowanceFns.d.ts +1 -1
- package/dist/allowanceFns.d.ts.map +1 -1
- package/dist/allowanceFns.js +1 -1
- package/dist/allowanceFns.js.map +1 -1
- package/dist/api.d.ts +21 -20
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +20 -20
- package/dist/api.js.map +1 -1
- package/dist/authorFns.d.ts +2 -2
- package/dist/authorFns.d.ts.map +1 -1
- package/dist/authorFns.js +61 -51
- package/dist/authorFns.js.map +1 -1
- package/dist/bendTableFns.d.ts +1 -1
- package/dist/bendTableFns.d.ts.map +1 -1
- package/dist/bendTableFns.js +1 -1
- package/dist/bendTableFns.js.map +1 -1
- package/dist/contourFlangeFns.d.ts +5 -4
- package/dist/contourFlangeFns.d.ts.map +1 -1
- package/dist/contourFlangeFns.js +59 -44
- package/dist/contourFlangeFns.js.map +1 -1
- package/dist/cutoutFns.d.ts +5 -5
- package/dist/cutoutFns.d.ts.map +1 -1
- package/dist/cutoutFns.js +22 -14
- package/dist/cutoutFns.js.map +1 -1
- package/dist/dxfFns.d.ts +1 -1
- package/dist/dxfFns.d.ts.map +1 -1
- package/dist/dxfFns.js +1 -1
- package/dist/dxfFns.js.map +1 -1
- package/dist/facade.d.ts +43 -42
- package/dist/facade.d.ts.map +1 -1
- package/dist/facade.js +83 -83
- package/dist/facade.js.map +1 -1
- package/dist/featureTreeFns.d.ts +1 -1
- package/dist/featureTreeFns.d.ts.map +1 -1
- package/dist/featureTreeFns.js +1 -1
- package/dist/featureTreeFns.js.map +1 -1
- package/dist/foldFns.d.ts +3 -3
- package/dist/foldFns.d.ts.map +1 -1
- package/dist/foldFns.js +12 -12
- package/dist/foldFns.js.map +1 -1
- package/dist/foreignUnfoldFns.d.ts +2 -1
- package/dist/foreignUnfoldFns.d.ts.map +1 -1
- package/dist/foreignUnfoldFns.js +21 -10
- package/dist/foreignUnfoldFns.js.map +1 -1
- package/dist/formFns.d.ts +4 -4
- package/dist/formFns.d.ts.map +1 -1
- package/dist/formFns.js +91 -76
- package/dist/formFns.js.map +1 -1
- package/dist/geometryOps.d.ts +53 -0
- package/dist/geometryOps.d.ts.map +1 -0
- package/dist/geometryOps.js +104 -0
- package/dist/geometryOps.js.map +1 -0
- package/dist/hemFns.d.ts +2 -2
- package/dist/hemFns.d.ts.map +1 -1
- package/dist/hemFns.js +4 -4
- package/dist/hemFns.js.map +1 -1
- package/dist/internal.d.ts +2 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -1
- package/dist/internal.js.map +1 -1
- package/dist/jogFns.d.ts +2 -2
- package/dist/jogFns.d.ts.map +1 -1
- package/dist/jogFns.js +6 -6
- package/dist/jogFns.js.map +1 -1
- package/dist/loftedFlangeFns.d.ts +2 -2
- package/dist/loftedFlangeFns.d.ts.map +1 -1
- package/dist/loftedFlangeFns.js +35 -25
- package/dist/loftedFlangeFns.js.map +1 -1
- package/dist/miterFns.d.ts +3 -3
- package/dist/miterFns.d.ts.map +1 -1
- package/dist/miterFns.js +30 -19
- package/dist/miterFns.js.map +1 -1
- package/dist/nestFns.d.ts +1 -1
- package/dist/nestFns.d.ts.map +1 -1
- package/dist/nestFns.js +1 -1
- package/dist/nestFns.js.map +1 -1
- package/dist/polygonFns.d.ts +2 -2
- package/dist/polygonFns.d.ts.map +1 -1
- package/dist/polygonFns.js +1 -1
- package/dist/polygonFns.js.map +1 -1
- package/dist/reliefFns.d.ts +4 -4
- package/dist/reliefFns.d.ts.map +1 -1
- package/dist/reliefFns.js +39 -31
- package/dist/reliefFns.js.map +1 -1
- package/dist/reportFns.d.ts +1 -1
- package/dist/reportFns.d.ts.map +1 -1
- package/dist/reportFns.js +1 -1
- package/dist/reportFns.js.map +1 -1
- package/dist/tabFns.d.ts +3 -3
- package/dist/tabFns.d.ts.map +1 -1
- package/dist/tabFns.js +21 -13
- package/dist/tabFns.js.map +1 -1
- package/dist/types.d.ts +21 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/unfoldFns.d.ts +1 -1
- package/dist/unfoldFns.d.ts.map +1 -1
- package/dist/unfoldFns.js +2 -2
- package/dist/unfoldFns.js.map +1 -1
- package/dist/validateFns.d.ts.map +1 -1
- package/dist/validateFns.js +4 -6
- package/dist/validateFns.js.map +1 -1
- package/package.json +2 -2
package/dist/unfoldFns.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unfoldFns.js","sourceRoot":"","sources":["../src/unfoldFns.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type Result,\n type Wire,\n type Edge,\n ok,\n err,\n validationError,\n line,\n wire,\n wireLoop,\n} from '@faicad/faijs/brepjs-compat';\nimport type {\n SheetMetalPart,\n UnfoldResult,\n FlatPattern,\n BendReport,\n SheetMetalWarning,\n CornerMiter,\n FlatSide,\n} from './types.js';\nimport { featureTree, type FeatureTree, ROOT_FLAT_ID } from './featureTreeFns.js';\nimport { developedLength } from './allowanceFns.js';\nimport { sideFromAxisDir } from './internal.js';\n\ntype Pt2 = [number, number];\n\n/**\n * Tree-driven analytic unfold of an arbitrary straight-bend part into its flat\n * pattern. Walks the feature tree in BFS order placing every flat in the flat\n * plane: the base occupies `[0,baseLength]×[0,width]`; each child flange lays a\n * developed-bend strip (width = neutral-axis arc length) along the parent edge it\n * folds from — respecting its offset/span along that edge — then its own flat past\n * the strip, perpendicular to the edge and pointing outward. The developed outline\n * is the rectilinear union of the base and every placed flat/strip rectangle,\n * emitted as a single closed morph wire. A recorded corner miter replaces the\n * shared reflex corner of two perpendicular base flanges with a 45° chamfer.\n * Closed profiles produce a SEAM_CUT warning (the cycle-closing bend is left\n * unfolded). Warnings ride inside the Ok payload.\n *\n * @param part - the sheet-metal part to develop into its flat pattern\n * @returns the flat pattern (outline, bend lines, holes, form cuts/markers/hinges,\n * lofted developments, developed area), the bend report, and any warnings — or\n * an error if the part cannot be unfolded\n */\nexport function unfold(part: SheetMetalPart): Result<UnfoldResult> {\n const treeResult = featureTree(part);\n if (!treeResult.ok) return treeResult;\n const tree = treeResult.value;\n\n const baseLength = part.baseLength;\n if (!Number.isFinite(baseLength) || baseLength <= 0) {\n return err(validationError('INVALID_BASE_LENGTH', `part baseLength must be positive, got ${baseLength}`));\n }\n const width = part.width;\n if (!Number.isFinite(width) || width <= 0) {\n return err(validationError('INVALID_WIDTH', `part width must be positive, got ${width}`));\n }\n\n const warnings: SheetMetalWarning[] = [...tree.warnings];\n\n const layoutResult = layoutTree(part, tree, baseLength, width, (warning) => warnings.push(warning));\n if (!layoutResult.ok) return layoutResult;\n const layout = layoutResult.value;\n\n for (const placed of layout.flats) {\n if (placed.kind !== 'flange') continue;\n if (part.thickness > 0 && placed.rule.innerRadius < part.thickness) {\n warnings.push({\n code: 'MIN_RADIUS',\n message: `bend '${placed.id}' inner radius ${placed.rule.innerRadius} < thickness ${part.thickness}`,\n featureId: placed.id,\n });\n }\n }\n\n // Contour-flange developed strips lay out straight along their base edge; compute\n // them first so their rectangles join the outline union below.\n const contourResult = buildContourDevelopments(part);\n if (!contourResult.ok) return contourResult;\n\n // Hems and jogs lay their multi-bend developed strips out straight along their\n // region edge (the base or a flange), exactly like a contour flange.\n const hemJogResult = buildHemJogDevelopments(part, layout);\n if (!hemJogResult.ok) return hemJogResult;\n\n const rects: Rect[] = [];\n for (const placed of layout.flats) rects.push(placed.rect);\n for (const strip of layout.strips) rects.push(strip);\n for (const strip of contourResult.value.strips) rects.push(strip);\n for (const strip of hemJogResult.value.strips) rects.push(strip);\n\n // Tabs are additive protrusions: their developed rectangles join the outer-outline\n // union and add to the developed area.\n const tabRects: Rect[] = (part.tabs ?? []).map((t) => ({ x0: t.rect[0], y0: t.rect[1], x1: t.rect[2], y1: t.rect[3] }));\n for (const r of tabRects) rects.push(r);\n\n const notches: Rect[] = (part.reliefs ?? []).flatMap((relief) =>\n relief.notches.map(([x0, y0, x1, y1]) => ({ x0, y0, x1, y1 }))\n );\n // The L-miter chamfer special-case can't express tabs either; once any tab is\n // recorded, fall through to the rectilinear-union path (which absorbs tab rects).\n // The 3D corner-miter cut still stands; only the developed chamfer is omitted.\n const miters = tabRects.length > 0 ? [] : part.miters ?? [];\n if (tabRects.length > 0 && (part.miters ?? []).length > 0) {\n warnings.push({\n code: 'MITER_NOT_DEVELOPED',\n message: 'developed outline omits the corner-miter chamfer because a tab is present; the 3D miter cut is unaffected',\n });\n }\n const outlineResult = buildOutline(rects, layout, miters, notches);\n if (!outlineResult.ok) return outlineResult;\n layout.developedArea -= removedNotchArea(rects, notches);\n for (const t of part.tabs ?? []) layout.developedArea += t.area;\n\n const holesResult = buildHoles(part);\n if (!holesResult.ok) return holesResult;\n for (const c of part.cutouts ?? []) layout.developedArea -= c.area;\n\n const formsResult = buildForms(part);\n if (!formsResult.ok) return formsResult;\n\n const loftedResult = buildLoftedDevelopments(part);\n if (!loftedResult.ok) return loftedResult;\n for (const lf of part.loftedFlanges ?? []) {\n layout.developedArea += lf.developedArea;\n if (lf.approximate) {\n warnings.push({\n code: 'DEVELOPMENT_APPROXIMATE',\n message: `lofted flange '${lf.id}' transition is not developable; its triangulated flat development is an approximation`,\n featureId: lf.id,\n });\n }\n }\n\n for (const cf of part.contourFlanges ?? []) {\n layout.developedArea += cf.developedLength * cf.span;\n }\n\n for (const h of part.hems ?? []) {\n layout.developedArea += h.developedLength * h.span;\n }\n for (const j of part.jogs ?? []) {\n layout.developedArea += j.developedLength * j.span;\n }\n\n const bendLines = layout.flats\n .filter((p): p is PlacedFlange => p.kind === 'flange')\n .map((p) => ({\n id: p.id,\n line: bendLineEdge(p),\n angleDeg: p.angleDeg,\n direction: p.direction,\n // The child frame's v axis is the develop-out direction; into-parent is its\n // negation. Correct for chained flanges too (it is local to the placement).\n inward: [-p.frame.v[0], -p.frame.v[1]] as [number, number],\n }))\n .concat(contourResult.value.bendLines)\n .concat(hemJogResult.value.bendLines);\n\n const pattern: FlatPattern = {\n outline: outlineResult.value,\n bendLines,\n holes: holesResult.value,\n formCuts: formsResult.value.cuts,\n formMarkers: formsResult.value.markers,\n formHinges: formsResult.value.hinges,\n loftedDevelopments: loftedResult.value,\n developedArea: layout.developedArea,\n };\n\n const report = reportFromLayout(layout);\n\n return ok({ pattern, report, warnings });\n}\n\n/** A placed flat rectangle in the developed (flat-pattern) plane. */\nexport interface Rect {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n}\n\n/** 2D frame of a placed flat: occupies [0,uLen]×[0,vLen] in (u,v) from `origin`. */\nexport interface Frame2 {\n origin: Pt2;\n u: Pt2;\n v: Pt2;\n uLen: number;\n vLen: number;\n}\n\n/** A placed base flat: the root rectangle `[0,baseLength]×[0,width]`. */\nexport interface PlacedBase {\n kind: 'base';\n id: string;\n rect: Rect;\n frame: Frame2;\n}\n\n/** A placed flange flat: a developed strip laid along a parent edge plus its own flat. */\nexport interface PlacedFlange {\n kind: 'flange';\n id: string;\n rect: Rect;\n frame: Frame2;\n /** Strip rectangle laid along the parent edge (developed bend). */\n strip: Rect;\n /** Bend line endpoints (along the parent edge, over the flange span). */\n bendA: Pt2;\n bendB: Pt2;\n dev: number;\n length: number;\n span: number;\n angleDeg: number;\n direction: 'up' | 'down';\n rule: { innerRadius: number; kFactor: number; allowance?: number | undefined };\n /** True when this flange folds directly off the base and spans its full edge. */\n baseFull: boolean;\n side: FlatSide;\n}\n\n/** A placed flat in the developed plane: either the base or a flange. */\nexport type Placed = PlacedBase | PlacedFlange;\n\n/** The result of {@link layoutTree}: developed dimensions, placed flats, and strips. */\nexport interface TreeLayout {\n baseLength: number;\n width: number;\n developedArea: number;\n flats: Placed[];\n strips: Rect[];\n}\n\n/**\n * Lay out the feature tree's flats in the flat plane, starting from the base and\n * placing each bend's child flange along its parent edge: a developed strip laid\n * outward from the edge, then the child's own flat. Produces the placed flats,\n * their strips, and the total developed area.\n *\n * @param part - the sheet-metal part whose features are laid out\n * @param tree - the feature tree built from the part\n * @param baseLength - length of the base flat (u extent)\n * @param width - width of the base flat (v extent)\n * @param onWarning - optional callback invoked for warnings raised while unfolding\n * @returns the laid-out flats, strips, and developed area, or an error if a\n * referenced flat has no flange feature or is missing from the layout\n */\nexport function layoutTree(\n part: SheetMetalPart,\n tree: FeatureTree,\n baseLength: number,\n width: number,\n onWarning?: (warning: SheetMetalWarning) => void\n): Result<TreeLayout> {\n const frames = new Map<string, Frame2>();\n frames.set(ROOT_FLAT_ID, {\n origin: [0, 0],\n u: [1, 0],\n v: [0, 1],\n uLen: baseLength,\n vLen: width,\n });\n\n const flats: Placed[] = [\n {\n kind: 'base',\n id: ROOT_FLAT_ID,\n frame: frames.get(ROOT_FLAT_ID) as Frame2,\n rect: rectOf(frames.get(ROOT_FLAT_ID) as Frame2),\n },\n ];\n const strips: Rect[] = [];\n let developedArea = baseLength * width;\n\n for (const treeBend of tree.bends) {\n const childNode = tree.nodes.get(treeBend.child);\n if (childNode === undefined || childNode.flange === undefined) {\n return err(\n validationError('UNKNOWN_FLAT', `child flat '${treeBend.child}' has no flange feature`)\n );\n }\n const flange = childNode.flange;\n const parentFrame = frames.get(treeBend.parent);\n if (parentFrame === undefined) {\n return err(\n validationError('UNKNOWN_FLAT', `parent flat '${treeBend.parent}' missing from layout`)\n );\n }\n\n const devResult = developedLength(treeBend.bend.angleDeg, part.thickness, treeBend.bend.rule, onWarning);\n if (!devResult.ok) return devResult;\n const dev = devResult.value;\n\n // Authored parts always record `baseEdge.side`; hand-built fixtures may encode\n // the develop direction only via the bend axis, so fall back to that.\n const side: FlatSide = flange.baseEdge.side ?? sideFromAxisDir(treeBend.bend.axisDir) ?? 'xmax';\n const offset = flange.offset ?? flange.baseEdge.offset ?? 0;\n const span = flange.span;\n const length = flange.length;\n\n const placed = placeChild(flange.id, parentFrame, side, offset, span, dev, length, {\n angleDeg: treeBend.bend.angleDeg,\n direction: treeBend.bend.direction,\n rule: treeBend.bend.rule,\n baseFull: treeBend.parent === ROOT_FLAT_ID && offset <= 1e-6 && span >= edgeLength(parentFrame, side) - 1e-6,\n side,\n });\n frames.set(flange.id, placed.frame);\n flats.push(placed);\n strips.push(placed.strip);\n developedArea += (dev + length) * span;\n }\n\n return ok({ baseLength, width, developedArea, flats, strips });\n}\n\nfunction edgeLength(f: Frame2, side: FlatSide): number {\n return side === 'xmax' || side === 'xmin' ? f.vLen : f.uLen;\n}\n\n/**\n * Place a child flange off `parent`'s edge `side`. The strip (developed bend) is\n * laid from the edge outward by `dev`; the child flat follows for `length`. The\n * child's own 2D frame starts past the strip so grandchildren chain correctly.\n */\nfunction placeChild(\n id: string,\n parent: Frame2,\n side: FlatSide,\n offset: number,\n span: number,\n dev: number,\n length: number,\n meta: {\n angleDeg: number;\n direction: 'up' | 'down';\n rule: { innerRadius: number; kFactor: number; allowance?: number | undefined };\n baseFull: boolean;\n side: FlatSide;\n }\n): PlacedFlange {\n // Edge basis in 2D: `along` runs the edge (bend axis), `out` points outward.\n const { along, out, edgeOrigin } = edgeBasis2(parent, side);\n\n const base = add2(edgeOrigin, scale2(along, offset));\n const bendA = base;\n const bendB = add2(base, scale2(along, span));\n\n const stripFar = add2(base, scale2(out, dev));\n\n const strip = rectFromCorners(base, add2(bendB, scale2(out, dev)));\n const flatRect = rectFromCorners(stripFar, add2(add2(stripFar, scale2(along, span)), scale2(out, length)));\n\n const childFrame: Frame2 = {\n origin: stripFar,\n u: along,\n v: out,\n uLen: span,\n vLen: length,\n };\n\n return {\n kind: 'flange',\n id,\n frame: childFrame,\n rect: flatRect,\n strip,\n bendA,\n bendB,\n dev,\n length,\n span,\n angleDeg: meta.angleDeg,\n direction: meta.direction,\n rule: meta.rule,\n baseFull: meta.baseFull,\n side: meta.side,\n };\n}\n\n/**\n * Edge origin and along/out unit directions for one side of a 2D frame. `along`\n * runs along the edge (the bend axis), `out` points outward from the frame, and\n * `edgeOrigin` is the starting corner of that edge.\n *\n * @param f - the 2D frame whose edge basis is computed\n * @param side - which side of the frame ('xmax' | 'xmin' | 'ymax' | 'ymin')\n * @returns the along/out unit directions and the edge's origin corner\n */\nexport function edgeBasis2(f: Frame2, side: FlatSide): { along: Pt2; out: Pt2; edgeOrigin: Pt2 } {\n const uTop = add2(f.origin, scale2(f.u, f.uLen));\n const vTop = add2(f.origin, scale2(f.v, f.vLen));\n switch (side) {\n case 'xmax':\n return { along: f.v, out: f.u, edgeOrigin: uTop };\n case 'xmin':\n return { along: f.v, out: neg2(f.u), edgeOrigin: f.origin };\n case 'ymax':\n return { along: f.u, out: f.v, edgeOrigin: vTop };\n case 'ymin':\n return { along: f.u, out: neg2(f.v), edgeOrigin: f.origin };\n default:\n return side satisfies never;\n }\n}\n\nfunction bendLineEdge(p: PlacedFlange): Edge {\n return line([p.bendA[0], p.bendA[1], 0], [p.bendB[0], p.bendB[1], 0]);\n}\n\n/**\n * One closed developed-plane {@link Wire} per recorded cutout, traced from the\n * feature's already-mapped `loop` (which {@link addCutout} positioned via the\n * region's developed frame, so the loop sits at the cutout's matching flat-pattern\n * spot). Emitted as interior holes of the pattern; the outer outline is unchanged.\n */\nfunction buildHoles(part: SheetMetalPart): Result<Wire[]> {\n const wires: Wire[] = [];\n for (const c of part.cutouts ?? []) {\n const loop = c.loop;\n if (loop.length < 3) {\n return err(validationError('CUTOUT_LOOP_TOO_SMALL', `cutout loop has ${loop.length} points, need ≥ 3`));\n }\n const edges: Edge[] = [];\n for (let i = 0; i < loop.length; i += 1) {\n const a = loop[i];\n const b = loop[(i + 1) % loop.length];\n if (a === undefined || b === undefined) {\n return err(validationError('CUTOUT_LOOP_FAILED', 'failed to index cutout loop'));\n }\n edges.push(line([a[0], a[1], 0], [b[0], b[1], 0]));\n }\n const wire = wireLoop(edges);\n if (!wire.ok) return wire;\n wires.push(wire.value);\n }\n return ok(wires);\n}\n\ninterface FormWires {\n cuts: Wire[];\n markers: Wire[];\n hinges: Edge[];\n}\n\n/**\n * Developed-plane wires for recorded form features: each louver U-cut and emboss\n * footprint as a closed {@link Wire}, plus each louver hinge as an {@link Edge}. The\n * loops were already mapped into developed coordinates when the form was recorded\n * (via the region's developed frame), so this just traces them. Forms are net-\n * material-neutral, so the outer outline and developed area are untouched.\n */\nfunction buildForms(part: SheetMetalPart): Result<FormWires> {\n const cuts: Wire[] = [];\n const markers: Wire[] = [];\n const hinges: Edge[] = [];\n for (const form of part.forms ?? []) {\n for (const path of form.cuts) {\n const cutWire = openPathWire(path);\n if (!cutWire.ok) return cutWire;\n cuts.push(cutWire.value);\n }\n for (const loop of form.markers) {\n const markerWire = closedLoopWire(loop);\n if (!markerWire.ok) return markerWire;\n markers.push(markerWire.value);\n }\n if (form.hinge !== undefined) {\n const [a, b] = form.hinge;\n hinges.push(line([a[0], a[1], 0], [b[0], b[1], 0]));\n }\n }\n return ok({ cuts, markers, hinges });\n}\n\n/**\n * Closed developed-plane {@link Wire}s for recorded lofted/ruled transition flanges.\n * Each feature's triangulated `developedLoop` was already laid out flat when the\n * flange was authored, so this just traces it into a wire; the boundary is non-\n * rectilinear so it rides separately from the rectilinear-union outline.\n */\nfunction buildLoftedDevelopments(part: SheetMetalPart): Result<Wire[]> {\n const wires: Wire[] = [];\n for (const lf of part.loftedFlanges ?? []) {\n const w = closedLoopWire(lf.developedLoop);\n if (!w.ok) return w;\n wires.push(w.value);\n }\n return ok(wires);\n}\n\ninterface ContourDevelopments {\n /** Developed strip rectangles (one per contour flange) for the outline union. */\n strips: Rect[];\n /** Developed bend lines (one per arc segment) in the flat pattern. */\n bendLines: FlatPattern['bendLines'];\n}\n\n/**\n * Lay each recorded contour flange's developed strip out STRAIGHT along its base\n * edge: a rectangle `span` wide along the edge by `developedLength` out from it,\n * returned for the outer-outline union. One bend line per arc segment is placed at\n * that segment's cumulative developed offset out from the base edge — the EXACT\n * arc-length sum, so the strip length equals Σ segment developed lengths with no\n * error.\n */\nfunction buildContourDevelopments(part: SheetMetalPart): Result<ContourDevelopments> {\n const strips: Rect[] = [];\n const bendLines: FlatPattern['bendLines'] = [];\n const baseFrame: Frame2 = {\n origin: [0, 0],\n u: [1, 0],\n v: [0, 1],\n uLen: part.baseLength,\n vLen: part.width,\n };\n\n for (const cf of part.contourFlanges ?? []) {\n const { along, out, edgeOrigin } = edgeBasis2(baseFrame, cf.side);\n const base = add2(edgeOrigin, scale2(along, cf.offset));\n strips.push(\n rectFromCorners(base, add2(add2(base, scale2(along, cf.span)), scale2(out, cf.developedLength)))\n );\n\n let cumulative = 0;\n for (const seg of cf.segments) {\n if (seg.kind === 'arc') {\n const a = add2(base, scale2(out, cumulative));\n const b = add2(a, scale2(along, cf.span));\n bendLines.push({\n id: seg.bendId ?? cf.id,\n line: line([a[0], a[1], 0], [b[0], b[1], 0]),\n angleDeg: seg.angleDeg ?? 0,\n direction: seg.direction ?? 'up',\n inward: [-out[0], -out[1]] as [number, number],\n });\n }\n cumulative += seg.dev;\n }\n }\n return ok({ strips, bendLines });\n}\n\ninterface HemJogDevelopments {\n /** Developed strip rectangles (one per hem/jog) for the outline union. */\n strips: Rect[];\n /** Developed bend lines (one per curl/step sub-bend) in the flat pattern. */\n bendLines: FlatPattern['bendLines'];\n}\n\n/**\n * Lay each recorded hem and jog developed strip out STRAIGHT along its region edge\n * (the base or a flange), mirroring {@link buildContourDevelopments}. The region's\n * developed-plane {@link Frame2} comes from the tree layout (so a hem on a flange\n * lands on that flange's developed face). Each sub-bend (a hem curl arc or a jog\n * step arc) gets a bend line at its EXACT cumulative developed offset out from the\n * edge — Σ segment developed lengths, so the strip length is exact.\n */\nfunction buildHemJogDevelopments(part: SheetMetalPart, layout: TreeLayout): Result<HemJogDevelopments> {\n const strips: Rect[] = [];\n const bendLines: FlatPattern['bendLines'] = [];\n\n const frameFor = (region: string): Frame2 | undefined => {\n const id = region === 'base' || region === 'face-0' ? ROOT_FLAT_ID : region;\n for (const p of layout.flats) {\n if (p.id === id) return p.frame;\n }\n return undefined;\n };\n\n interface Strip {\n region: string;\n side: FlatSide;\n offset: number;\n span: number;\n developedLength: number;\n segments: {\n kind: 'line' | 'arc';\n dev: number;\n angleDeg?: number | undefined;\n direction?: 'up' | 'down' | undefined;\n bendId?: string | undefined;\n }[];\n }\n const allStrips: Strip[] = [\n ...(part.hems ?? []).map((h) => ({\n region: h.region,\n side: h.side,\n offset: h.offset,\n span: h.span,\n developedLength: h.developedLength,\n segments: h.segments,\n })),\n ...(part.jogs ?? []).map((j) => ({\n region: j.region,\n side: j.side,\n offset: j.offset,\n span: j.span,\n developedLength: j.developedLength,\n segments: j.segments,\n })),\n ];\n\n for (const s of allStrips) {\n const regionFrame = frameFor(s.region);\n if (regionFrame === undefined) {\n return err(validationError('UNKNOWN_HEMJOG_REGION', `hem/jog region '${s.region}' missing from layout`));\n }\n const { along, out, edgeOrigin } = edgeBasis2(regionFrame, s.side);\n const base = add2(edgeOrigin, scale2(along, s.offset));\n strips.push(rectFromCorners(base, add2(add2(base, scale2(along, s.span)), scale2(out, s.developedLength))));\n\n let cumulative = 0;\n for (const seg of s.segments) {\n if (seg.kind === 'arc') {\n const a = add2(base, scale2(out, cumulative));\n const b = add2(a, scale2(along, s.span));\n bendLines.push({\n id: seg.bendId ?? s.region,\n line: line([a[0], a[1], 0], [b[0], b[1], 0]),\n angleDeg: seg.angleDeg ?? 0,\n direction: seg.direction ?? 'up',\n inward: [-out[0], -out[1]] as [number, number],\n });\n }\n cumulative += seg.dev;\n }\n }\n return ok({ strips, bendLines });\n}\n\n/** Trace a closed developed-plane loop (≥ 3 points) into a morph {@link Wire}. */\nfunction closedLoopWire(loop: Pt2[]): Result<Wire> {\n if (loop.length < 3) {\n return err(validationError('FORM_LOOP_TOO_SMALL', `form loop has ${loop.length} points, need ≥ 3`));\n }\n const edges: Edge[] = [];\n for (let i = 0; i < loop.length; i += 1) {\n const a = loop[i];\n const b = loop[(i + 1) % loop.length];\n if (a === undefined || b === undefined) {\n return err(validationError('FORM_LOOP_FAILED', 'failed to index form loop'));\n }\n edges.push(line([a[0], a[1], 0], [b[0], b[1], 0]));\n }\n return wireLoop(edges);\n}\n\n/** Trace an OPEN developed-plane path (≥ 2 points) into a morph {@link Wire}. */\nfunction openPathWire(path: Pt2[]): Result<Wire> {\n if (path.length < 2) {\n return err(validationError('FORM_PATH_TOO_SHORT', `form cut path has ${path.length} points, need ≥ 2`));\n }\n const edges: Edge[] = [];\n for (let i = 0; i + 1 < path.length; i += 1) {\n const a = path[i];\n const b = path[i + 1];\n if (a === undefined || b === undefined) {\n return err(validationError('FORM_LOOP_FAILED', 'failed to index form cut path'));\n }\n edges.push(line([a[0], a[1], 0], [b[0], b[1], 0]));\n }\n return wire(edges);\n}\n\nfunction rectOf(f: Frame2): Rect {\n const c0 = f.origin;\n const c1 = add2(add2(f.origin, scale2(f.u, f.uLen)), scale2(f.v, f.vLen));\n return rectFromCorners(c0, c1);\n}\n\nfunction rectFromCorners(a: Pt2, b: Pt2): Rect {\n return {\n x0: Math.min(a[0], b[0]),\n y0: Math.min(a[1], b[1]),\n x1: Math.max(a[0], b[0]),\n y1: Math.max(a[1], b[1]),\n };\n}\n\nfunction add2(a: Pt2, b: Pt2): Pt2 {\n return [a[0] + b[0], a[1] + b[1]];\n}\nfunction scale2(a: Pt2, s: number): Pt2 {\n return [a[0] * s, a[1] * s];\n}\nfunction neg2(a: Pt2): Pt2 {\n return [-a[0], -a[1]];\n}\n\n/**\n * Outline of the developed pattern. For the simple two-perpendicular-flange L\n * (base + an east + a north flange) a recorded corner miter chamfers the reflex\n * vertex; otherwise the outline is the rectilinear union of all placed rectangles\n * emitted as one closed loop. Holes are not possible for the supported shapes\n * (every arm attaches to the simply-connected base or a chain thereof).\n */\nfunction buildOutline(\n rects: Rect[],\n layout: TreeLayout,\n miters: CornerMiter[],\n notches: Rect[]\n): Result<Wire> {\n // The lShapedMiter chamfer special-case can't express a notch, so once any relief\n // is recorded fall through to the rectilinear-union path (which subtracts notches).\n const miterCorners = notches.length > 0 ? undefined : lShapedMiter(layout, miters);\n const corners = miterCorners ?? rectilinearUnion(rects, notches);\n if (corners.length < 3) {\n return err(validationError('OUTLINE_BUILD_FAILED', 'developed outline has fewer than 3 vertices'));\n }\n const edges: Edge[] = [];\n for (let i = 0; i < corners.length; i += 1) {\n const from = corners[i];\n const to = corners[(i + 1) % corners.length];\n if (from === undefined || to === undefined) {\n return err(validationError('OUTLINE_BUILD_FAILED', 'failed to index outline corners'));\n }\n edges.push(line([from[0], from[1], 0], [to[0], to[1], 0]));\n }\n return wireLoop(edges);\n}\n\n/**\n * Special-case the classic L: a base with exactly one east (+X) and one north\n * (+Y) full-span flange and a recorded miter between them. Returns the chamfered\n * hexagon; `undefined` if this isn't that shape (fall back to the union outline).\n */\nfunction lShapedMiter(layout: TreeLayout, miters: CornerMiter[]): Pt2[] | undefined {\n const flanges = layout.flats.filter((p): p is PlacedFlange => p.kind === 'flange');\n if (flanges.length !== 2) return undefined;\n const east = flanges.find((f) => f.baseFull && f.side === 'xmax');\n const north = flanges.find((f) => f.baseFull && f.side === 'ymax');\n if (east === undefined || north === undefined) return undefined;\n\n const baseLength = layout.baseLength;\n const width = layout.width;\n const maxX = baseLength + east.dev + east.length;\n const maxY = width + north.dev + north.length;\n const gap = miterGapFor(miters, east.id, north.id);\n\n if (gap === undefined || gap <= 0) {\n return [\n [0, 0],\n [maxX, 0],\n [maxX, width],\n [baseLength, width],\n [baseLength, maxY],\n [0, maxY],\n ];\n }\n return [\n [0, 0],\n [maxX, 0],\n [maxX, width],\n [baseLength + gap, width],\n [baseLength, width + gap],\n [baseLength, maxY],\n [0, maxY],\n ];\n}\n\nfunction miterGapFor(miters: CornerMiter[], aId: string, bId: string): number | undefined {\n for (const m of miters) {\n if ((m.flangeA === aId && m.flangeB === bId) || (m.flangeA === bId && m.flangeB === aId)) {\n return m.gap;\n }\n }\n return undefined;\n}\n\n/**\n * Outline loop of the union of axis-aligned rectangles, assuming the union is a\n * single simply-connected rectilinear region (true for every shape this package\n * authors: arms attached to a connected base). Built by a vertical-line sweep\n * tracking the covered y-spans, then tracing the boundary contour. The sweep emits\n * a CCW loop of corner points with no collinear duplicates.\n */\nfunction rectilinearUnion(rects: Rect[], notches: Rect[] = []): Pt2[] {\n const cuts = [...rects.flatMap((r) => [r.x0, r.x1]), ...notches.flatMap((r) => [r.x0, r.x1])];\n const cutsY = [...rects.flatMap((r) => [r.y0, r.y1]), ...notches.flatMap((r) => [r.y0, r.y1])];\n const xs = uniqueSorted(cuts);\n const ys = uniqueSorted(cutsY);\n if (xs.length < 2 || ys.length < 2) return [];\n\n // Cell-occupancy grid: a cell is filled if its centre lies in the rectangle union\n // and in no notch (notches subtract material; they sit on the boundary so the\n // result stays simply-connected).\n const nx = xs.length - 1;\n const ny = ys.length - 1;\n const filled = new Set<number>();\n for (let i = 0; i < nx; i += 1) {\n const cx = ((xs[i] as number) + (xs[i + 1] as number)) / 2;\n for (let j = 0; j < ny; j += 1) {\n const cy = ((ys[j] as number) + (ys[j + 1] as number)) / 2;\n const inRect = rects.some((r) => cx > r.x0 && cx < r.x1 && cy > r.y0 && cy < r.y1);\n const inNotch = notches.some((r) => cx > r.x0 && cx < r.x1 && cy > r.y0 && cy < r.y1);\n if (inRect && !inNotch) filled.add(i * ny + j);\n }\n }\n\n // Collect boundary unit-edges (segments between adjacent grid nodes that border\n // a filled and an unfilled cell), oriented CCW (filled cell on the left).\n const segs: { a: Pt2; b: Pt2 }[] = [];\n const isFilled = (i: number, j: number): boolean =>\n i >= 0 && i < nx && j >= 0 && j < ny && filled.has(i * ny + j);\n\n for (let i = 0; i < nx; i += 1) {\n for (let j = 0; j < ny; j += 1) {\n if (!isFilled(i, j)) continue;\n const x0 = xs[i] as number;\n const x1 = xs[i + 1] as number;\n const y0 = ys[j] as number;\n const y1 = ys[j + 1] as number;\n // Bottom edge: boundary if cell below is empty. CCW → left-to-right.\n if (!isFilled(i, j - 1)) segs.push({ a: [x0, y0], b: [x1, y0] });\n // Top edge: boundary if cell above empty. CCW → right-to-left.\n if (!isFilled(i, j + 1)) segs.push({ a: [x1, y1], b: [x0, y1] });\n // Left edge: boundary if cell left empty. CCW → top-to-bottom.\n if (!isFilled(i - 1, j)) segs.push({ a: [x0, y1], b: [x0, y0] });\n // Right edge: boundary if cell right empty. CCW → bottom-to-top.\n if (!isFilled(i + 1, j)) segs.push({ a: [x1, y0], b: [x1, y1] });\n }\n }\n\n return traceLoop(segs);\n}\n\n/**\n * Area of material removed by the relief notches: the portion of each notch that\n * overlaps the rectangle union, summed over a shared cell grid so overlapping\n * notches (e.g. two corner reliefs meeting) are not double-counted.\n */\nfunction removedNotchArea(rects: Rect[], notches: Rect[]): number {\n if (notches.length === 0) return 0;\n const xs = uniqueSorted([\n ...rects.flatMap((r) => [r.x0, r.x1]),\n ...notches.flatMap((r) => [r.x0, r.x1]),\n ]);\n const ys = uniqueSorted([\n ...rects.flatMap((r) => [r.y0, r.y1]),\n ...notches.flatMap((r) => [r.y0, r.y1]),\n ]);\n let area = 0;\n for (let i = 0; i + 1 < xs.length; i += 1) {\n const x0 = xs[i] as number;\n const x1 = xs[i + 1] as number;\n const cx = (x0 + x1) / 2;\n for (let j = 0; j + 1 < ys.length; j += 1) {\n const y0 = ys[j] as number;\n const y1 = ys[j + 1] as number;\n const cy = (y0 + y1) / 2;\n const inRect = rects.some((r) => cx > r.x0 && cx < r.x1 && cy > r.y0 && cy < r.y1);\n const inNotch = notches.some((r) => cx > r.x0 && cx < r.x1 && cy > r.y0 && cy < r.y1);\n if (inRect && inNotch) area += (x1 - x0) * (y1 - y0);\n }\n }\n return area;\n}\n\n/** Chain oriented boundary segments into a single loop, dropping collinear points. */\nfunction traceLoop(segs: { a: Pt2; b: Pt2 }[]): Pt2[] {\n if (segs.length === 0) return [];\n const key = (p: Pt2): string => `${p[0]}|${p[1]}`;\n const from = new Map<string, Pt2>();\n for (const s of segs) from.set(key(s.a), s.b);\n\n const startSeg = segs[0] as { a: Pt2; b: Pt2 };\n const start = startSeg.a;\n const raw: Pt2[] = [start];\n let cur = startSeg.b;\n let guard = 0;\n const limit = segs.length + 4;\n while (key(cur) !== key(start) && guard < limit) {\n raw.push(cur);\n const next = from.get(key(cur));\n if (next === undefined) break;\n cur = next;\n guard += 1;\n }\n\n // Drop collinear interior points so consecutive edges aren't degenerate.\n const out: Pt2[] = [];\n for (let i = 0; i < raw.length; i += 1) {\n const prev = raw[(i - 1 + raw.length) % raw.length] as Pt2;\n const here = raw[i] as Pt2;\n const next = raw[(i + 1) % raw.length] as Pt2;\n const d1x = here[0] - prev[0];\n const d1y = here[1] - prev[1];\n const d2x = next[0] - here[0];\n const d2y = next[1] - here[1];\n if (Math.abs(d1x * d2y - d1y * d2x) > 1e-9) out.push(here);\n }\n return out;\n}\n\nfunction uniqueSorted(values: number[]): number[] {\n const sorted = [...values].sort((a, b) => a - b);\n const out: number[] = [];\n for (const v of sorted) {\n const last = out[out.length - 1];\n if (last === undefined || Math.abs(v - last) > 1e-9) out.push(v);\n }\n return out;\n}\n\n/**\n * Build the bend report for a laid-out tree: one entry per placed flange with its\n * angle, radius, allowance, flat length, and direction, plus the overall\n * bounding-box span of the developed pattern.\n *\n * @param layout - the tree layout produced by {@link layoutTree}\n * @returns the bend entries and the total flat pattern size\n */\nexport function reportFromLayout(layout: TreeLayout): BendReport {\n const flanges = layout.flats.filter((p): p is PlacedFlange => p.kind === 'flange');\n const bends = flanges.map((f) => ({\n id: f.id,\n angleDeg: f.angleDeg,\n radius: f.rule.innerRadius,\n allowance: f.dev,\n flatLength: f.length,\n direction: f.direction,\n }));\n\n // totalFlatSize is the overall bounding-box span of the developed pattern, which\n // for parts whose flanges extend into negative coordinates (xmin/ymin sides) is\n // the max−min extent, not just the max.\n let minX = 0;\n let minY = 0;\n let maxX = layout.baseLength;\n let maxY = layout.width;\n for (const r of layout.flats.map((p) => p.rect).concat(layout.strips)) {\n if (r.x0 < minX) minX = r.x0;\n if (r.y0 < minY) minY = r.y0;\n if (r.x1 > maxX) maxX = r.x1;\n if (r.y1 > maxY) maxY = r.y1;\n }\n return { bends, totalFlatSize: [maxX - minX, maxY - minY] };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"unfoldFns.js","sourceRoot":"","sources":["../src/unfoldFns.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Wire, Edge } from './types.js';\nimport {type Result, ok, err, validationError, line, wireLoop, assembleWire} from '@faicad/faijs/api';\nimport type {\n SheetMetalPart,\n UnfoldResult,\n FlatPattern,\n BendReport,\n SheetMetalWarning,\n CornerMiter,\n FlatSide,\n} from './types.js';\nimport { featureTree, type FeatureTree, ROOT_FLAT_ID } from './featureTreeFns.js';\nimport { developedLength } from './allowanceFns.js';\nimport { sideFromAxisDir } from './internal.js';\n\ntype Pt2 = [number, number];\n\n/**\n * Tree-driven analytic unfold of an arbitrary straight-bend part into its flat\n * pattern. Walks the feature tree in BFS order placing every flat in the flat\n * plane: the base occupies `[0,baseLength]×[0,width]`; each child flange lays a\n * developed-bend strip (width = neutral-axis arc length) along the parent edge it\n * folds from — respecting its offset/span along that edge — then its own flat past\n * the strip, perpendicular to the edge and pointing outward. The developed outline\n * is the rectilinear union of the base and every placed flat/strip rectangle,\n * emitted as a single closed morph wire. A recorded corner miter replaces the\n * shared reflex corner of two perpendicular base flanges with a 45° chamfer.\n * Closed profiles produce a SEAM_CUT warning (the cycle-closing bend is left\n * unfolded). Warnings ride inside the Ok payload.\n *\n * @param part - the sheet-metal part to develop into its flat pattern\n * @returns the flat pattern (outline, bend lines, holes, form cuts/markers/hinges,\n * lofted developments, developed area), the bend report, and any warnings — or\n * an error if the part cannot be unfolded\n */\nexport function unfold(part: SheetMetalPart): Result<UnfoldResult> {\n const treeResult = featureTree(part);\n if (!treeResult.ok) return treeResult;\n const tree = treeResult.value;\n\n const baseLength = part.baseLength;\n if (!Number.isFinite(baseLength) || baseLength <= 0) {\n return err(validationError('INVALID_BASE_LENGTH', `part baseLength must be positive, got ${baseLength}`));\n }\n const width = part.width;\n if (!Number.isFinite(width) || width <= 0) {\n return err(validationError('INVALID_WIDTH', `part width must be positive, got ${width}`));\n }\n\n const warnings: SheetMetalWarning[] = [...tree.warnings];\n\n const layoutResult = layoutTree(part, tree, baseLength, width, (warning) => warnings.push(warning));\n if (!layoutResult.ok) return layoutResult;\n const layout = layoutResult.value;\n\n for (const placed of layout.flats) {\n if (placed.kind !== 'flange') continue;\n if (part.thickness > 0 && placed.rule.innerRadius < part.thickness) {\n warnings.push({\n code: 'MIN_RADIUS',\n message: `bend '${placed.id}' inner radius ${placed.rule.innerRadius} < thickness ${part.thickness}`,\n featureId: placed.id,\n });\n }\n }\n\n // Contour-flange developed strips lay out straight along their base edge; compute\n // them first so their rectangles join the outline union below.\n const contourResult = buildContourDevelopments(part);\n if (!contourResult.ok) return contourResult;\n\n // Hems and jogs lay their multi-bend developed strips out straight along their\n // region edge (the base or a flange), exactly like a contour flange.\n const hemJogResult = buildHemJogDevelopments(part, layout);\n if (!hemJogResult.ok) return hemJogResult;\n\n const rects: Rect[] = [];\n for (const placed of layout.flats) rects.push(placed.rect);\n for (const strip of layout.strips) rects.push(strip);\n for (const strip of contourResult.value.strips) rects.push(strip);\n for (const strip of hemJogResult.value.strips) rects.push(strip);\n\n // Tabs are additive protrusions: their developed rectangles join the outer-outline\n // union and add to the developed area.\n const tabRects: Rect[] = (part.tabs ?? []).map((t) => ({ x0: t.rect[0], y0: t.rect[1], x1: t.rect[2], y1: t.rect[3] }));\n for (const r of tabRects) rects.push(r);\n\n const notches: Rect[] = (part.reliefs ?? []).flatMap((relief) =>\n relief.notches.map(([x0, y0, x1, y1]) => ({ x0, y0, x1, y1 }))\n );\n // The L-miter chamfer special-case can't express tabs either; once any tab is\n // recorded, fall through to the rectilinear-union path (which absorbs tab rects).\n // The 3D corner-miter cut still stands; only the developed chamfer is omitted.\n const miters = tabRects.length > 0 ? [] : part.miters ?? [];\n if (tabRects.length > 0 && (part.miters ?? []).length > 0) {\n warnings.push({\n code: 'MITER_NOT_DEVELOPED',\n message: 'developed outline omits the corner-miter chamfer because a tab is present; the 3D miter cut is unaffected',\n });\n }\n const outlineResult = buildOutline(rects, layout, miters, notches);\n if (!outlineResult.ok) return outlineResult;\n layout.developedArea -= removedNotchArea(rects, notches);\n for (const t of part.tabs ?? []) layout.developedArea += t.area;\n\n const holesResult = buildHoles(part);\n if (!holesResult.ok) return holesResult;\n for (const c of part.cutouts ?? []) layout.developedArea -= c.area;\n\n const formsResult = buildForms(part);\n if (!formsResult.ok) return formsResult;\n\n const loftedResult = buildLoftedDevelopments(part);\n if (!loftedResult.ok) return loftedResult;\n for (const lf of part.loftedFlanges ?? []) {\n layout.developedArea += lf.developedArea;\n if (lf.approximate) {\n warnings.push({\n code: 'DEVELOPMENT_APPROXIMATE',\n message: `lofted flange '${lf.id}' transition is not developable; its triangulated flat development is an approximation`,\n featureId: lf.id,\n });\n }\n }\n\n for (const cf of part.contourFlanges ?? []) {\n layout.developedArea += cf.developedLength * cf.span;\n }\n\n for (const h of part.hems ?? []) {\n layout.developedArea += h.developedLength * h.span;\n }\n for (const j of part.jogs ?? []) {\n layout.developedArea += j.developedLength * j.span;\n }\n\n const bendLines = layout.flats\n .filter((p): p is PlacedFlange => p.kind === 'flange')\n .map((p) => ({\n id: p.id,\n line: bendLineEdge(p),\n angleDeg: p.angleDeg,\n direction: p.direction,\n // The child frame's v axis is the develop-out direction; into-parent is its\n // negation. Correct for chained flanges too (it is local to the placement).\n inward: [-p.frame.v[0], -p.frame.v[1]] as [number, number],\n }))\n .concat(contourResult.value.bendLines)\n .concat(hemJogResult.value.bendLines);\n\n const pattern: FlatPattern = {\n outline: outlineResult.value,\n bendLines,\n holes: holesResult.value,\n formCuts: formsResult.value.cuts,\n formMarkers: formsResult.value.markers,\n formHinges: formsResult.value.hinges,\n loftedDevelopments: loftedResult.value,\n developedArea: layout.developedArea,\n };\n\n const report = reportFromLayout(layout);\n\n return ok({ pattern, report, warnings });\n}\n\n/** A placed flat rectangle in the developed (flat-pattern) plane. */\nexport interface Rect {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n}\n\n/** 2D frame of a placed flat: occupies [0,uLen]×[0,vLen] in (u,v) from `origin`. */\nexport interface Frame2 {\n origin: Pt2;\n u: Pt2;\n v: Pt2;\n uLen: number;\n vLen: number;\n}\n\n/** A placed base flat: the root rectangle `[0,baseLength]×[0,width]`. */\nexport interface PlacedBase {\n kind: 'base';\n id: string;\n rect: Rect;\n frame: Frame2;\n}\n\n/** A placed flange flat: a developed strip laid along a parent edge plus its own flat. */\nexport interface PlacedFlange {\n kind: 'flange';\n id: string;\n rect: Rect;\n frame: Frame2;\n /** Strip rectangle laid along the parent edge (developed bend). */\n strip: Rect;\n /** Bend line endpoints (along the parent edge, over the flange span). */\n bendA: Pt2;\n bendB: Pt2;\n dev: number;\n length: number;\n span: number;\n angleDeg: number;\n direction: 'up' | 'down';\n rule: { innerRadius: number; kFactor: number; allowance?: number | undefined };\n /** True when this flange folds directly off the base and spans its full edge. */\n baseFull: boolean;\n side: FlatSide;\n}\n\n/** A placed flat in the developed plane: either the base or a flange. */\nexport type Placed = PlacedBase | PlacedFlange;\n\n/** The result of {@link layoutTree}: developed dimensions, placed flats, and strips. */\nexport interface TreeLayout {\n baseLength: number;\n width: number;\n developedArea: number;\n flats: Placed[];\n strips: Rect[];\n}\n\n/**\n * Lay out the feature tree's flats in the flat plane, starting from the base and\n * placing each bend's child flange along its parent edge: a developed strip laid\n * outward from the edge, then the child's own flat. Produces the placed flats,\n * their strips, and the total developed area.\n *\n * @param part - the sheet-metal part whose features are laid out\n * @param tree - the feature tree built from the part\n * @param baseLength - length of the base flat (u extent)\n * @param width - width of the base flat (v extent)\n * @param onWarning - optional callback invoked for warnings raised while unfolding\n * @returns the laid-out flats, strips, and developed area, or an error if a\n * referenced flat has no flange feature or is missing from the layout\n */\nexport function layoutTree(\n part: SheetMetalPart,\n tree: FeatureTree,\n baseLength: number,\n width: number,\n onWarning?: (warning: SheetMetalWarning) => void\n): Result<TreeLayout> {\n const frames = new Map<string, Frame2>();\n frames.set(ROOT_FLAT_ID, {\n origin: [0, 0],\n u: [1, 0],\n v: [0, 1],\n uLen: baseLength,\n vLen: width,\n });\n\n const flats: Placed[] = [\n {\n kind: 'base',\n id: ROOT_FLAT_ID,\n frame: frames.get(ROOT_FLAT_ID) as Frame2,\n rect: rectOf(frames.get(ROOT_FLAT_ID) as Frame2),\n },\n ];\n const strips: Rect[] = [];\n let developedArea = baseLength * width;\n\n for (const treeBend of tree.bends) {\n const childNode = tree.nodes.get(treeBend.child);\n if (childNode === undefined || childNode.flange === undefined) {\n return err(\n validationError('UNKNOWN_FLAT', `child flat '${treeBend.child}' has no flange feature`)\n );\n }\n const flange = childNode.flange;\n const parentFrame = frames.get(treeBend.parent);\n if (parentFrame === undefined) {\n return err(\n validationError('UNKNOWN_FLAT', `parent flat '${treeBend.parent}' missing from layout`)\n );\n }\n\n const devResult = developedLength(treeBend.bend.angleDeg, part.thickness, treeBend.bend.rule, onWarning);\n if (!devResult.ok) return devResult;\n const dev = devResult.value;\n\n // Authored parts always record `baseEdge.side`; hand-built fixtures may encode\n // the develop direction only via the bend axis, so fall back to that.\n const side: FlatSide = flange.baseEdge.side ?? sideFromAxisDir(treeBend.bend.axisDir) ?? 'xmax';\n const offset = flange.offset ?? flange.baseEdge.offset ?? 0;\n const span = flange.span;\n const length = flange.length;\n\n const placed = placeChild(flange.id, parentFrame, side, offset, span, dev, length, {\n angleDeg: treeBend.bend.angleDeg,\n direction: treeBend.bend.direction,\n rule: treeBend.bend.rule,\n baseFull: treeBend.parent === ROOT_FLAT_ID && offset <= 1e-6 && span >= edgeLength(parentFrame, side) - 1e-6,\n side,\n });\n frames.set(flange.id, placed.frame);\n flats.push(placed);\n strips.push(placed.strip);\n developedArea += (dev + length) * span;\n }\n\n return ok({ baseLength, width, developedArea, flats, strips });\n}\n\nfunction edgeLength(f: Frame2, side: FlatSide): number {\n return side === 'xmax' || side === 'xmin' ? f.vLen : f.uLen;\n}\n\n/**\n * Place a child flange off `parent`'s edge `side`. The strip (developed bend) is\n * laid from the edge outward by `dev`; the child flat follows for `length`. The\n * child's own 2D frame starts past the strip so grandchildren chain correctly.\n */\nfunction placeChild(\n id: string,\n parent: Frame2,\n side: FlatSide,\n offset: number,\n span: number,\n dev: number,\n length: number,\n meta: {\n angleDeg: number;\n direction: 'up' | 'down';\n rule: { innerRadius: number; kFactor: number; allowance?: number | undefined };\n baseFull: boolean;\n side: FlatSide;\n }\n): PlacedFlange {\n // Edge basis in 2D: `along` runs the edge (bend axis), `out` points outward.\n const { along, out, edgeOrigin } = edgeBasis2(parent, side);\n\n const base = add2(edgeOrigin, scale2(along, offset));\n const bendA = base;\n const bendB = add2(base, scale2(along, span));\n\n const stripFar = add2(base, scale2(out, dev));\n\n const strip = rectFromCorners(base, add2(bendB, scale2(out, dev)));\n const flatRect = rectFromCorners(stripFar, add2(add2(stripFar, scale2(along, span)), scale2(out, length)));\n\n const childFrame: Frame2 = {\n origin: stripFar,\n u: along,\n v: out,\n uLen: span,\n vLen: length,\n };\n\n return {\n kind: 'flange',\n id,\n frame: childFrame,\n rect: flatRect,\n strip,\n bendA,\n bendB,\n dev,\n length,\n span,\n angleDeg: meta.angleDeg,\n direction: meta.direction,\n rule: meta.rule,\n baseFull: meta.baseFull,\n side: meta.side,\n };\n}\n\n/**\n * Edge origin and along/out unit directions for one side of a 2D frame. `along`\n * runs along the edge (the bend axis), `out` points outward from the frame, and\n * `edgeOrigin` is the starting corner of that edge.\n *\n * @param f - the 2D frame whose edge basis is computed\n * @param side - which side of the frame ('xmax' | 'xmin' | 'ymax' | 'ymin')\n * @returns the along/out unit directions and the edge's origin corner\n */\nexport function edgeBasis2(f: Frame2, side: FlatSide): { along: Pt2; out: Pt2; edgeOrigin: Pt2 } {\n const uTop = add2(f.origin, scale2(f.u, f.uLen));\n const vTop = add2(f.origin, scale2(f.v, f.vLen));\n switch (side) {\n case 'xmax':\n return { along: f.v, out: f.u, edgeOrigin: uTop };\n case 'xmin':\n return { along: f.v, out: neg2(f.u), edgeOrigin: f.origin };\n case 'ymax':\n return { along: f.u, out: f.v, edgeOrigin: vTop };\n case 'ymin':\n return { along: f.u, out: neg2(f.v), edgeOrigin: f.origin };\n default:\n return side satisfies never;\n }\n}\n\nfunction bendLineEdge(p: PlacedFlange): Edge {\n return line([p.bendA[0], p.bendA[1], 0], [p.bendB[0], p.bendB[1], 0]);\n}\n\n/**\n * One closed developed-plane {@link Wire} per recorded cutout, traced from the\n * feature's already-mapped `loop` (which {@link addCutout} positioned via the\n * region's developed frame, so the loop sits at the cutout's matching flat-pattern\n * spot). Emitted as interior holes of the pattern; the outer outline is unchanged.\n */\nfunction buildHoles(part: SheetMetalPart): Result<Wire[]> {\n const wires: Wire[] = [];\n for (const c of part.cutouts ?? []) {\n const loop = c.loop;\n if (loop.length < 3) {\n return err(validationError('CUTOUT_LOOP_TOO_SMALL', `cutout loop has ${loop.length} points, need ≥ 3`));\n }\n const edges: Edge[] = [];\n for (let i = 0; i < loop.length; i += 1) {\n const a = loop[i];\n const b = loop[(i + 1) % loop.length];\n if (a === undefined || b === undefined) {\n return err(validationError('CUTOUT_LOOP_FAILED', 'failed to index cutout loop'));\n }\n edges.push(line([a[0], a[1], 0], [b[0], b[1], 0]));\n }\n const wire = wireLoop(edges);\n if (!wire.ok) return wire;\n wires.push(wire.value);\n }\n return ok(wires);\n}\n\ninterface FormWires {\n cuts: Wire[];\n markers: Wire[];\n hinges: Edge[];\n}\n\n/**\n * Developed-plane wires for recorded form features: each louver U-cut and emboss\n * footprint as a closed {@link Wire}, plus each louver hinge as an {@link Edge}. The\n * loops were already mapped into developed coordinates when the form was recorded\n * (via the region's developed frame), so this just traces them. Forms are net-\n * material-neutral, so the outer outline and developed area are untouched.\n */\nfunction buildForms(part: SheetMetalPart): Result<FormWires> {\n const cuts: Wire[] = [];\n const markers: Wire[] = [];\n const hinges: Edge[] = [];\n for (const form of part.forms ?? []) {\n for (const path of form.cuts) {\n const cutWire = openPathWire(path);\n if (!cutWire.ok) return cutWire;\n cuts.push(cutWire.value);\n }\n for (const loop of form.markers) {\n const markerWire = closedLoopWire(loop);\n if (!markerWire.ok) return markerWire;\n markers.push(markerWire.value);\n }\n if (form.hinge !== undefined) {\n const [a, b] = form.hinge;\n hinges.push(line([a[0], a[1], 0], [b[0], b[1], 0]));\n }\n }\n return ok({ cuts, markers, hinges });\n}\n\n/**\n * Closed developed-plane {@link Wire}s for recorded lofted/ruled transition flanges.\n * Each feature's triangulated `developedLoop` was already laid out flat when the\n * flange was authored, so this just traces it into a wire; the boundary is non-\n * rectilinear so it rides separately from the rectilinear-union outline.\n */\nfunction buildLoftedDevelopments(part: SheetMetalPart): Result<Wire[]> {\n const wires: Wire[] = [];\n for (const lf of part.loftedFlanges ?? []) {\n const w = closedLoopWire(lf.developedLoop);\n if (!w.ok) return w;\n wires.push(w.value);\n }\n return ok(wires);\n}\n\ninterface ContourDevelopments {\n /** Developed strip rectangles (one per contour flange) for the outline union. */\n strips: Rect[];\n /** Developed bend lines (one per arc segment) in the flat pattern. */\n bendLines: FlatPattern['bendLines'];\n}\n\n/**\n * Lay each recorded contour flange's developed strip out STRAIGHT along its base\n * edge: a rectangle `span` wide along the edge by `developedLength` out from it,\n * returned for the outer-outline union. One bend line per arc segment is placed at\n * that segment's cumulative developed offset out from the base edge — the EXACT\n * arc-length sum, so the strip length equals Σ segment developed lengths with no\n * error.\n */\nfunction buildContourDevelopments(part: SheetMetalPart): Result<ContourDevelopments> {\n const strips: Rect[] = [];\n const bendLines: FlatPattern['bendLines'] = [];\n const baseFrame: Frame2 = {\n origin: [0, 0],\n u: [1, 0],\n v: [0, 1],\n uLen: part.baseLength,\n vLen: part.width,\n };\n\n for (const cf of part.contourFlanges ?? []) {\n const { along, out, edgeOrigin } = edgeBasis2(baseFrame, cf.side);\n const base = add2(edgeOrigin, scale2(along, cf.offset));\n strips.push(\n rectFromCorners(base, add2(add2(base, scale2(along, cf.span)), scale2(out, cf.developedLength)))\n );\n\n let cumulative = 0;\n for (const seg of cf.segments) {\n if (seg.kind === 'arc') {\n const a = add2(base, scale2(out, cumulative));\n const b = add2(a, scale2(along, cf.span));\n bendLines.push({\n id: seg.bendId ?? cf.id,\n line: line([a[0], a[1], 0], [b[0], b[1], 0]),\n angleDeg: seg.angleDeg ?? 0,\n direction: seg.direction ?? 'up',\n inward: [-out[0], -out[1]] as [number, number],\n });\n }\n cumulative += seg.dev;\n }\n }\n return ok({ strips, bendLines });\n}\n\ninterface HemJogDevelopments {\n /** Developed strip rectangles (one per hem/jog) for the outline union. */\n strips: Rect[];\n /** Developed bend lines (one per curl/step sub-bend) in the flat pattern. */\n bendLines: FlatPattern['bendLines'];\n}\n\n/**\n * Lay each recorded hem and jog developed strip out STRAIGHT along its region edge\n * (the base or a flange), mirroring {@link buildContourDevelopments}. The region's\n * developed-plane {@link Frame2} comes from the tree layout (so a hem on a flange\n * lands on that flange's developed face). Each sub-bend (a hem curl arc or a jog\n * step arc) gets a bend line at its EXACT cumulative developed offset out from the\n * edge — Σ segment developed lengths, so the strip length is exact.\n */\nfunction buildHemJogDevelopments(part: SheetMetalPart, layout: TreeLayout): Result<HemJogDevelopments> {\n const strips: Rect[] = [];\n const bendLines: FlatPattern['bendLines'] = [];\n\n const frameFor = (region: string): Frame2 | undefined => {\n const id = region === 'base' || region === 'face-0' ? ROOT_FLAT_ID : region;\n for (const p of layout.flats) {\n if (p.id === id) return p.frame;\n }\n return undefined;\n };\n\n interface Strip {\n region: string;\n side: FlatSide;\n offset: number;\n span: number;\n developedLength: number;\n segments: {\n kind: 'line' | 'arc';\n dev: number;\n angleDeg?: number | undefined;\n direction?: 'up' | 'down' | undefined;\n bendId?: string | undefined;\n }[];\n }\n const allStrips: Strip[] = [\n ...(part.hems ?? []).map((h) => ({\n region: h.region,\n side: h.side,\n offset: h.offset,\n span: h.span,\n developedLength: h.developedLength,\n segments: h.segments,\n })),\n ...(part.jogs ?? []).map((j) => ({\n region: j.region,\n side: j.side,\n offset: j.offset,\n span: j.span,\n developedLength: j.developedLength,\n segments: j.segments,\n })),\n ];\n\n for (const s of allStrips) {\n const regionFrame = frameFor(s.region);\n if (regionFrame === undefined) {\n return err(validationError('UNKNOWN_HEMJOG_REGION', `hem/jog region '${s.region}' missing from layout`));\n }\n const { along, out, edgeOrigin } = edgeBasis2(regionFrame, s.side);\n const base = add2(edgeOrigin, scale2(along, s.offset));\n strips.push(rectFromCorners(base, add2(add2(base, scale2(along, s.span)), scale2(out, s.developedLength))));\n\n let cumulative = 0;\n for (const seg of s.segments) {\n if (seg.kind === 'arc') {\n const a = add2(base, scale2(out, cumulative));\n const b = add2(a, scale2(along, s.span));\n bendLines.push({\n id: seg.bendId ?? s.region,\n line: line([a[0], a[1], 0], [b[0], b[1], 0]),\n angleDeg: seg.angleDeg ?? 0,\n direction: seg.direction ?? 'up',\n inward: [-out[0], -out[1]] as [number, number],\n });\n }\n cumulative += seg.dev;\n }\n }\n return ok({ strips, bendLines });\n}\n\n/** Trace a closed developed-plane loop (≥ 3 points) into a morph {@link Wire}. */\nfunction closedLoopWire(loop: Pt2[]): Result<Wire> {\n if (loop.length < 3) {\n return err(validationError('FORM_LOOP_TOO_SMALL', `form loop has ${loop.length} points, need ≥ 3`));\n }\n const edges: Edge[] = [];\n for (let i = 0; i < loop.length; i += 1) {\n const a = loop[i];\n const b = loop[(i + 1) % loop.length];\n if (a === undefined || b === undefined) {\n return err(validationError('FORM_LOOP_FAILED', 'failed to index form loop'));\n }\n edges.push(line([a[0], a[1], 0], [b[0], b[1], 0]));\n }\n return wireLoop(edges);\n}\n\n/** Trace an OPEN developed-plane path (≥ 2 points) into a morph {@link Wire}. */\nfunction openPathWire(path: Pt2[]): Result<Wire> {\n if (path.length < 2) {\n return err(validationError('FORM_PATH_TOO_SHORT', `form cut path has ${path.length} points, need ≥ 2`));\n }\n const edges: Edge[] = [];\n for (let i = 0; i + 1 < path.length; i += 1) {\n const a = path[i];\n const b = path[i + 1];\n if (a === undefined || b === undefined) {\n return err(validationError('FORM_LOOP_FAILED', 'failed to index form cut path'));\n }\n edges.push(line([a[0], a[1], 0], [b[0], b[1], 0]));\n }\n return assembleWire(edges);\n}\n\nfunction rectOf(f: Frame2): Rect {\n const c0 = f.origin;\n const c1 = add2(add2(f.origin, scale2(f.u, f.uLen)), scale2(f.v, f.vLen));\n return rectFromCorners(c0, c1);\n}\n\nfunction rectFromCorners(a: Pt2, b: Pt2): Rect {\n return {\n x0: Math.min(a[0], b[0]),\n y0: Math.min(a[1], b[1]),\n x1: Math.max(a[0], b[0]),\n y1: Math.max(a[1], b[1]),\n };\n}\n\nfunction add2(a: Pt2, b: Pt2): Pt2 {\n return [a[0] + b[0], a[1] + b[1]];\n}\nfunction scale2(a: Pt2, s: number): Pt2 {\n return [a[0] * s, a[1] * s];\n}\nfunction neg2(a: Pt2): Pt2 {\n return [-a[0], -a[1]];\n}\n\n/**\n * Outline of the developed pattern. For the simple two-perpendicular-flange L\n * (base + an east + a north flange) a recorded corner miter chamfers the reflex\n * vertex; otherwise the outline is the rectilinear union of all placed rectangles\n * emitted as one closed loop. Holes are not possible for the supported shapes\n * (every arm attaches to the simply-connected base or a chain thereof).\n */\nfunction buildOutline(\n rects: Rect[],\n layout: TreeLayout,\n miters: CornerMiter[],\n notches: Rect[]\n): Result<Wire> {\n // The lShapedMiter chamfer special-case can't express a notch, so once any relief\n // is recorded fall through to the rectilinear-union path (which subtracts notches).\n const miterCorners = notches.length > 0 ? undefined : lShapedMiter(layout, miters);\n const corners = miterCorners ?? rectilinearUnion(rects, notches);\n if (corners.length < 3) {\n return err(validationError('OUTLINE_BUILD_FAILED', 'developed outline has fewer than 3 vertices'));\n }\n const edges: Edge[] = [];\n for (let i = 0; i < corners.length; i += 1) {\n const from = corners[i];\n const to = corners[(i + 1) % corners.length];\n if (from === undefined || to === undefined) {\n return err(validationError('OUTLINE_BUILD_FAILED', 'failed to index outline corners'));\n }\n edges.push(line([from[0], from[1], 0], [to[0], to[1], 0]));\n }\n return wireLoop(edges);\n}\n\n/**\n * Special-case the classic L: a base with exactly one east (+X) and one north\n * (+Y) full-span flange and a recorded miter between them. Returns the chamfered\n * hexagon; `undefined` if this isn't that shape (fall back to the union outline).\n */\nfunction lShapedMiter(layout: TreeLayout, miters: CornerMiter[]): Pt2[] | undefined {\n const flanges = layout.flats.filter((p): p is PlacedFlange => p.kind === 'flange');\n if (flanges.length !== 2) return undefined;\n const east = flanges.find((f) => f.baseFull && f.side === 'xmax');\n const north = flanges.find((f) => f.baseFull && f.side === 'ymax');\n if (east === undefined || north === undefined) return undefined;\n\n const baseLength = layout.baseLength;\n const width = layout.width;\n const maxX = baseLength + east.dev + east.length;\n const maxY = width + north.dev + north.length;\n const gap = miterGapFor(miters, east.id, north.id);\n\n if (gap === undefined || gap <= 0) {\n return [\n [0, 0],\n [maxX, 0],\n [maxX, width],\n [baseLength, width],\n [baseLength, maxY],\n [0, maxY],\n ];\n }\n return [\n [0, 0],\n [maxX, 0],\n [maxX, width],\n [baseLength + gap, width],\n [baseLength, width + gap],\n [baseLength, maxY],\n [0, maxY],\n ];\n}\n\nfunction miterGapFor(miters: CornerMiter[], aId: string, bId: string): number | undefined {\n for (const m of miters) {\n if ((m.flangeA === aId && m.flangeB === bId) || (m.flangeA === bId && m.flangeB === aId)) {\n return m.gap;\n }\n }\n return undefined;\n}\n\n/**\n * Outline loop of the union of axis-aligned rectangles, assuming the union is a\n * single simply-connected rectilinear region (true for every shape this package\n * authors: arms attached to a connected base). Built by a vertical-line sweep\n * tracking the covered y-spans, then tracing the boundary contour. The sweep emits\n * a CCW loop of corner points with no collinear duplicates.\n */\nfunction rectilinearUnion(rects: Rect[], notches: Rect[] = []): Pt2[] {\n const cuts = [...rects.flatMap((r) => [r.x0, r.x1]), ...notches.flatMap((r) => [r.x0, r.x1])];\n const cutsY = [...rects.flatMap((r) => [r.y0, r.y1]), ...notches.flatMap((r) => [r.y0, r.y1])];\n const xs = uniqueSorted(cuts);\n const ys = uniqueSorted(cutsY);\n if (xs.length < 2 || ys.length < 2) return [];\n\n // Cell-occupancy grid: a cell is filled if its centre lies in the rectangle union\n // and in no notch (notches subtract material; they sit on the boundary so the\n // result stays simply-connected).\n const nx = xs.length - 1;\n const ny = ys.length - 1;\n const filled = new Set<number>();\n for (let i = 0; i < nx; i += 1) {\n const cx = ((xs[i] as number) + (xs[i + 1] as number)) / 2;\n for (let j = 0; j < ny; j += 1) {\n const cy = ((ys[j] as number) + (ys[j + 1] as number)) / 2;\n const inRect = rects.some((r) => cx > r.x0 && cx < r.x1 && cy > r.y0 && cy < r.y1);\n const inNotch = notches.some((r) => cx > r.x0 && cx < r.x1 && cy > r.y0 && cy < r.y1);\n if (inRect && !inNotch) filled.add(i * ny + j);\n }\n }\n\n // Collect boundary unit-edges (segments between adjacent grid nodes that border\n // a filled and an unfilled cell), oriented CCW (filled cell on the left).\n const segs: { a: Pt2; b: Pt2 }[] = [];\n const isFilled = (i: number, j: number): boolean =>\n i >= 0 && i < nx && j >= 0 && j < ny && filled.has(i * ny + j);\n\n for (let i = 0; i < nx; i += 1) {\n for (let j = 0; j < ny; j += 1) {\n if (!isFilled(i, j)) continue;\n const x0 = xs[i] as number;\n const x1 = xs[i + 1] as number;\n const y0 = ys[j] as number;\n const y1 = ys[j + 1] as number;\n // Bottom edge: boundary if cell below is empty. CCW → left-to-right.\n if (!isFilled(i, j - 1)) segs.push({ a: [x0, y0], b: [x1, y0] });\n // Top edge: boundary if cell above empty. CCW → right-to-left.\n if (!isFilled(i, j + 1)) segs.push({ a: [x1, y1], b: [x0, y1] });\n // Left edge: boundary if cell left empty. CCW → top-to-bottom.\n if (!isFilled(i - 1, j)) segs.push({ a: [x0, y1], b: [x0, y0] });\n // Right edge: boundary if cell right empty. CCW → bottom-to-top.\n if (!isFilled(i + 1, j)) segs.push({ a: [x1, y0], b: [x1, y1] });\n }\n }\n\n return traceLoop(segs);\n}\n\n/**\n * Area of material removed by the relief notches: the portion of each notch that\n * overlaps the rectangle union, summed over a shared cell grid so overlapping\n * notches (e.g. two corner reliefs meeting) are not double-counted.\n */\nfunction removedNotchArea(rects: Rect[], notches: Rect[]): number {\n if (notches.length === 0) return 0;\n const xs = uniqueSorted([\n ...rects.flatMap((r) => [r.x0, r.x1]),\n ...notches.flatMap((r) => [r.x0, r.x1]),\n ]);\n const ys = uniqueSorted([\n ...rects.flatMap((r) => [r.y0, r.y1]),\n ...notches.flatMap((r) => [r.y0, r.y1]),\n ]);\n let area = 0;\n for (let i = 0; i + 1 < xs.length; i += 1) {\n const x0 = xs[i] as number;\n const x1 = xs[i + 1] as number;\n const cx = (x0 + x1) / 2;\n for (let j = 0; j + 1 < ys.length; j += 1) {\n const y0 = ys[j] as number;\n const y1 = ys[j + 1] as number;\n const cy = (y0 + y1) / 2;\n const inRect = rects.some((r) => cx > r.x0 && cx < r.x1 && cy > r.y0 && cy < r.y1);\n const inNotch = notches.some((r) => cx > r.x0 && cx < r.x1 && cy > r.y0 && cy < r.y1);\n if (inRect && inNotch) area += (x1 - x0) * (y1 - y0);\n }\n }\n return area;\n}\n\n/** Chain oriented boundary segments into a single loop, dropping collinear points. */\nfunction traceLoop(segs: { a: Pt2; b: Pt2 }[]): Pt2[] {\n if (segs.length === 0) return [];\n const key = (p: Pt2): string => `${p[0]}|${p[1]}`;\n const from = new Map<string, Pt2>();\n for (const s of segs) from.set(key(s.a), s.b);\n\n const startSeg = segs[0] as { a: Pt2; b: Pt2 };\n const start = startSeg.a;\n const raw: Pt2[] = [start];\n let cur = startSeg.b;\n let guard = 0;\n const limit = segs.length + 4;\n while (key(cur) !== key(start) && guard < limit) {\n raw.push(cur);\n const next = from.get(key(cur));\n if (next === undefined) break;\n cur = next;\n guard += 1;\n }\n\n // Drop collinear interior points so consecutive edges aren't degenerate.\n const out: Pt2[] = [];\n for (let i = 0; i < raw.length; i += 1) {\n const prev = raw[(i - 1 + raw.length) % raw.length] as Pt2;\n const here = raw[i] as Pt2;\n const next = raw[(i + 1) % raw.length] as Pt2;\n const d1x = here[0] - prev[0];\n const d1y = here[1] - prev[1];\n const d2x = next[0] - here[0];\n const d2y = next[1] - here[1];\n if (Math.abs(d1x * d2y - d1y * d2x) > 1e-9) out.push(here);\n }\n return out;\n}\n\nfunction uniqueSorted(values: number[]): number[] {\n const sorted = [...values].sort((a, b) => a - b);\n const out: number[] = [];\n for (const v of sorted) {\n const last = out[out.length - 1];\n if (last === undefined || Math.abs(v - last) > 1e-9) out.push(v);\n }\n return out;\n}\n\n/**\n * Build the bend report for a laid-out tree: one entry per placed flange with its\n * angle, radius, allowance, flat length, and direction, plus the overall\n * bounding-box span of the developed pattern.\n *\n * @param layout - the tree layout produced by {@link layoutTree}\n * @returns the bend entries and the total flat pattern size\n */\nexport function reportFromLayout(layout: TreeLayout): BendReport {\n const flanges = layout.flats.filter((p): p is PlacedFlange => p.kind === 'flange');\n const bends = flanges.map((f) => ({\n id: f.id,\n angleDeg: f.angleDeg,\n radius: f.rule.innerRadius,\n allowance: f.dev,\n flatLength: f.length,\n direction: f.direction,\n }));\n\n // totalFlatSize is the overall bounding-box span of the developed pattern, which\n // for parts whose flanges extend into negative coordinates (xmin/ymin sides) is\n // the max−min extent, not just the max.\n let minX = 0;\n let minY = 0;\n let maxX = layout.baseLength;\n let maxY = layout.width;\n for (const r of layout.flats.map((p) => p.rect).concat(layout.strips)) {\n if (r.x0 < minX) minX = r.x0;\n if (r.y0 < minY) minY = r.y0;\n if (r.x1 > maxX) maxX = r.x1;\n if (r.y1 > maxY) maxY = r.y1;\n }\n return { bends, totalFlatSize: [maxX - minX, maxY - minY] };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateFns.d.ts","sourceRoot":"","sources":["../src/validateFns.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validateFns.d.ts","sourceRoot":"","sources":["../src/validateFns.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKjF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,iBAAiB,EAAE,CAMtE"}
|
package/dist/validateFns.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getBounds } from './geometryOps.js';
|
|
2
|
+
import { isValid, measureVolume, vecNormalize, vecAdd, vecScale, vecCross } from '@faicad/faijs/api';
|
|
2
3
|
import { ROOT_FLAT_ID } from './featureTreeFns.js';
|
|
3
4
|
const OVERLAP_TOL = 1e-6;
|
|
4
5
|
/**
|
|
@@ -32,14 +33,11 @@ function checkSolid(part) {
|
|
|
32
33
|
return [{ code: 'INVALID_SOLID', message: 'folded solid failed kernel validity check' }];
|
|
33
34
|
}
|
|
34
35
|
const vol = measureVolume(solid);
|
|
35
|
-
if (
|
|
36
|
-
return [{ code: 'INVALID_SOLID', message: 'folded solid volume could not be measured' }];
|
|
37
|
-
}
|
|
38
|
-
if (vol.value <= 0) {
|
|
36
|
+
if (vol <= 0) {
|
|
39
37
|
return [
|
|
40
38
|
{
|
|
41
39
|
code: 'INVALID_SOLID',
|
|
42
|
-
message: `folded solid has non-positive volume ${vol
|
|
40
|
+
message: `folded solid has non-positive volume ${vol}`,
|
|
43
41
|
},
|
|
44
42
|
];
|
|
45
43
|
}
|
package/dist/validateFns.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validateFns.js","sourceRoot":"","sources":["../src/validateFns.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type Vec3,\n type Bounds3D,\n isValid,\n measureVolume,\n getBounds,\n vecNormalize,\n vecAdd,\n vecScale,\n vecCross,\n} from '@faicad/faijs/brepjs-compat';\nimport type { BendFeature, SheetMetalPart, SheetMetalWarning } from './types.js';\nimport { ROOT_FLAT_ID } from './featureTreeFns.js';\n\nconst OVERLAP_TOL = 1e-6;\n\n/**\n * Manufacturability checks for an authored sheet-metal part. Returns a list of\n * {@link SheetMetalWarning} — these are advisory, never errors: a part with\n * warnings is still produced and exportable. Three checks per plan §6:\n *\n * - `INVALID_SOLID`: the folded solid is missing, fails kernel validity, or has\n * no positive volume.\n * - `COLLISION`: two flanges' axis-aligned bounding boxes overlap once folded —\n * the cheap interference signal for corners that need a miter or relief cut.\n * - `MIN_RADIUS`: a bend's inner radius is below one material thickness\n * (`R < 1×T`), the standard minimum-bend-radius rule of thumb.\n *\n * @param part - the sheet metal part to validate.\n * @returns the list of warnings (empty if valid).\n */\nexport function validatePart(part: SheetMetalPart): SheetMetalWarning[] {\n const warnings: SheetMetalWarning[] = [];\n warnings.push(...checkSolid(part));\n warnings.push(...checkCollisions(part));\n warnings.push(...checkMinRadius(part));\n return warnings;\n}\n\nfunction checkSolid(part: SheetMetalPart): SheetMetalWarning[] {\n const solid = part.solid;\n if (solid === undefined) {\n return [{ code: 'INVALID_SOLID', message: 'part has no folded solid' }];\n }\n if (!isValid(solid)) {\n return [{ code: 'INVALID_SOLID', message: 'folded solid failed kernel validity check' }];\n }\n const vol = measureVolume(solid);\n if (!vol.ok) {\n return [{ code: 'INVALID_SOLID', message: 'folded solid volume could not be measured' }];\n }\n if (vol.value <= 0) {\n return [\n {\n code: 'INVALID_SOLID',\n message: `folded solid has non-positive volume ${vol.value}`,\n },\n ];\n }\n return [];\n}\n\nfunction checkMinRadius(part: SheetMetalPart): SheetMetalWarning[] {\n const warnings: SheetMetalWarning[] = [];\n if (!(part.thickness > 0)) return warnings;\n for (const bend of part.bends) {\n if (bend.id.startsWith('seam::')) continue;\n if (bend.rule.innerRadius < part.thickness) {\n warnings.push({\n code: 'MIN_RADIUS',\n message: `bend '${bend.id}' inner radius ${bend.rule.innerRadius} < thickness ${part.thickness} (R < 1×T)`,\n featureId: bend.id,\n });\n }\n }\n return warnings;\n}\n\nfunction checkCollisions(part: SheetMetalPart): SheetMetalWarning[] {\n const warnings: SheetMetalWarning[] = [];\n if (part.bends.length < 2 || part.solid === undefined) return warnings;\n\n const b = getBounds(part.solid);\n const center: Vec3 = [(b.xMin + b.xMax) / 2, (b.yMin + b.yMax) / 2, 0];\n\n const boxes: { id: string; bounds: Bounds3D }[] = [];\n for (const bend of part.bends) {\n const flange = part.flanges.find((f) => f.id === bend.id);\n if (flange === undefined) continue;\n // The analytic flangeBounds re-fold assumes the flange folds off the z=0 base\n // plane: correct for root flanges, but wrong for chained flanges whose parent\n // edge sits off that plane (it would report false-positive corner collisions).\n // For chained flanges, use the AABB authorPart recorded from real geometry.\n const parentId = flange.baseEdge.parentId;\n const isChained =\n parentId !== undefined && parentId !== ROOT_FLAT_ID && parentId !== 'face-0';\n const bounds =\n isChained && flange.foldedBounds !== undefined\n ? flange.foldedBounds\n : flangeBounds(bend, flange.length, flange.span, part.thickness, center);\n boxes.push({ id: bend.id, bounds });\n }\n\n // A corner resolved by a miter or a corner relief is no longer an interference:\n // both record a `CornerMiter` for the pair, so skip those pairs.\n const resolved = new Set<string>();\n for (const m of part.miters ?? []) {\n resolved.add(pairKey(m.flangeA, m.flangeB));\n }\n\n for (let i = 0; i < boxes.length; i += 1) {\n for (let j = i + 1; j < boxes.length; j += 1) {\n const a = boxes[i];\n const b = boxes[j];\n if (a === undefined || b === undefined) continue;\n if (resolved.has(pairKey(a.id, b.id))) continue;\n if (boundsOverlap(a.bounds, b.bounds)) {\n warnings.push({\n code: 'COLLISION',\n message: `flanges '${a.id}' and '${b.id}' overlap once folded`,\n featureId: a.id,\n });\n }\n }\n }\n return warnings;\n}\n\n/**\n * Axis-aligned bounding box of a folded flange flat, computed analytically from\n * its recorded bend feature (no kernel call). The flat is a `length × span ×\n * thickness` box that — before folding — lies in the base plane, extending\n * outward from the bend axis along the run direction. Folding up by `angleDeg`\n * rotates that run+thickness plane about the axis. The eight folded corners give\n * the AABB. This mirrors {@link authorPart}'s `rotate(-θ)` up-fold (which maps the\n * run direction toward +Z) without re-running the boolean construction.\n */\nfunction flangeBounds(\n bend: BendFeature,\n length: number,\n span: number,\n thickness: number,\n center: Vec3\n): Bounds3D {\n const axis = vecNormalize(bend.axisDir);\n const run = outwardRun(bend.axisOrigin, axis, center);\n // A down-bend folds the run toward −Z instead of +Z.\n const up: Vec3 = bend.direction === 'down' ? [0, 0, -1] : [0, 0, 1];\n\n const theta = (bend.angleDeg * Math.PI) / 180;\n const cos = Math.cos(theta);\n const sin = Math.sin(theta);\n\n // Folding up by θ rotates the run/thickness plane about the axis: the run\n // direction tips toward +Z, the sheet normal tips back toward −run.\n const runFolded: Vec3 = [\n run[0] * cos + up[0] * sin,\n run[1] * cos + up[1] * sin,\n run[2] * cos + up[2] * sin,\n ];\n const normalFolded: Vec3 = [\n -run[0] * sin + up[0] * cos,\n -run[1] * sin + up[1] * cos,\n -run[2] * sin + up[2] * cos,\n ];\n\n const base: Vec3 = [bend.axisOrigin[0], bend.axisOrigin[1], 0];\n const corners: Vec3[] = [];\n for (const s of [0, span]) {\n for (const l of [0, length]) {\n for (const t of [0, thickness]) {\n const p = vecAdd(\n vecAdd(vecAdd(base, vecScale(axis, s)), vecScale(runFolded, l)),\n vecScale(normalFolded, t)\n );\n corners.push(p);\n }\n }\n }\n\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n let zMin = Infinity;\n let zMax = -Infinity;\n for (const c of corners) {\n if (c[0] < xMin) xMin = c[0];\n if (c[0] > xMax) xMax = c[0];\n if (c[1] < yMin) yMin = c[1];\n if (c[1] > yMax) yMax = c[1];\n if (c[2] < zMin) zMin = c[2];\n if (c[2] > zMax) zMax = c[2];\n }\n return { xMin, xMax, yMin, yMax, zMin, zMax };\n}\n\n/** In-plane perpendicular to the axis pointing away from the part center. */\nfunction outwardRun(axisOrigin: Vec3, axis: Vec3, center: Vec3): Vec3 {\n const perp = vecNormalize(vecCross(axis, [0, 0, 1]));\n const toEdge: Vec3 = [\n axisOrigin[0] - center[0],\n axisOrigin[1] - center[1],\n 0,\n ];\n const dot = perp[0] * toEdge[0] + perp[1] * toEdge[1];\n return dot >= 0 ? perp : [-perp[0], -perp[1], -perp[2]];\n}\n\n/** Order-independent key for a flange pair (corner identity). */\nfunction pairKey(a: string, b: string): string {\n return a < b ? `${a}::${b}` : `${b}::${a}`;\n}\n\nfunction boundsOverlap(a: Bounds3D, b: Bounds3D): boolean {\n return (\n a.xMin < b.xMax - OVERLAP_TOL &&\n b.xMin < a.xMax - OVERLAP_TOL &&\n a.yMin < b.yMax - OVERLAP_TOL &&\n b.yMin < a.yMax - OVERLAP_TOL &&\n a.zMin < b.zMax - OVERLAP_TOL &&\n b.zMin < a.zMax - OVERLAP_TOL\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"validateFns.js","sourceRoot":"","sources":["../src/validateFns.ts"],"names":[],"mappings":"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","sourcesContent":["import { getBounds } from './geometryOps.js';\nimport type { Bounds3D } from './types.js';\nimport {type Vec3, isValid, measureVolume, vecNormalize, vecAdd, vecScale, vecCross} from '@faicad/faijs/api';\nimport type { BendFeature, SheetMetalPart, SheetMetalWarning } from './types.js';\nimport { ROOT_FLAT_ID } from './featureTreeFns.js';\n\nconst OVERLAP_TOL = 1e-6;\n\n/**\n * Manufacturability checks for an authored sheet-metal part. Returns a list of\n * {@link SheetMetalWarning} — these are advisory, never errors: a part with\n * warnings is still produced and exportable. Three checks per plan §6:\n *\n * - `INVALID_SOLID`: the folded solid is missing, fails kernel validity, or has\n * no positive volume.\n * - `COLLISION`: two flanges' axis-aligned bounding boxes overlap once folded —\n * the cheap interference signal for corners that need a miter or relief cut.\n * - `MIN_RADIUS`: a bend's inner radius is below one material thickness\n * (`R < 1×T`), the standard minimum-bend-radius rule of thumb.\n *\n * @param part - the sheet metal part to validate.\n * @returns the list of warnings (empty if valid).\n */\nexport function validatePart(part: SheetMetalPart): SheetMetalWarning[] {\n const warnings: SheetMetalWarning[] = [];\n warnings.push(...checkSolid(part));\n warnings.push(...checkCollisions(part));\n warnings.push(...checkMinRadius(part));\n return warnings;\n}\n\nfunction checkSolid(part: SheetMetalPart): SheetMetalWarning[] {\n const solid = part.solid;\n if (solid === undefined) {\n return [{ code: 'INVALID_SOLID', message: 'part has no folded solid' }];\n }\n if (!isValid(solid)) {\n return [{ code: 'INVALID_SOLID', message: 'folded solid failed kernel validity check' }];\n }\n const vol = measureVolume(solid);\n if (vol <= 0) {\n return [\n {\n code: 'INVALID_SOLID',\n message: `folded solid has non-positive volume ${vol}`,\n },\n ];\n }\n return [];\n}\n\nfunction checkMinRadius(part: SheetMetalPart): SheetMetalWarning[] {\n const warnings: SheetMetalWarning[] = [];\n if (!(part.thickness > 0)) return warnings;\n for (const bend of part.bends) {\n if (bend.id.startsWith('seam::')) continue;\n if (bend.rule.innerRadius < part.thickness) {\n warnings.push({\n code: 'MIN_RADIUS',\n message: `bend '${bend.id}' inner radius ${bend.rule.innerRadius} < thickness ${part.thickness} (R < 1×T)`,\n featureId: bend.id,\n });\n }\n }\n return warnings;\n}\n\nfunction checkCollisions(part: SheetMetalPart): SheetMetalWarning[] {\n const warnings: SheetMetalWarning[] = [];\n if (part.bends.length < 2 || part.solid === undefined) return warnings;\n\n const b = getBounds(part.solid);\n const center: Vec3 = [(b.xMin + b.xMax) / 2, (b.yMin + b.yMax) / 2, 0];\n\n const boxes: { id: string; bounds: Bounds3D }[] = [];\n for (const bend of part.bends) {\n const flange = part.flanges.find((f) => f.id === bend.id);\n if (flange === undefined) continue;\n // The analytic flangeBounds re-fold assumes the flange folds off the z=0 base\n // plane: correct for root flanges, but wrong for chained flanges whose parent\n // edge sits off that plane (it would report false-positive corner collisions).\n // For chained flanges, use the AABB authorPart recorded from real geometry.\n const parentId = flange.baseEdge.parentId;\n const isChained =\n parentId !== undefined && parentId !== ROOT_FLAT_ID && parentId !== 'face-0';\n const bounds =\n isChained && flange.foldedBounds !== undefined\n ? flange.foldedBounds\n : flangeBounds(bend, flange.length, flange.span, part.thickness, center);\n boxes.push({ id: bend.id, bounds });\n }\n\n // A corner resolved by a miter or a corner relief is no longer an interference:\n // both record a `CornerMiter` for the pair, so skip those pairs.\n const resolved = new Set<string>();\n for (const m of part.miters ?? []) {\n resolved.add(pairKey(m.flangeA, m.flangeB));\n }\n\n for (let i = 0; i < boxes.length; i += 1) {\n for (let j = i + 1; j < boxes.length; j += 1) {\n const a = boxes[i];\n const b = boxes[j];\n if (a === undefined || b === undefined) continue;\n if (resolved.has(pairKey(a.id, b.id))) continue;\n if (boundsOverlap(a.bounds, b.bounds)) {\n warnings.push({\n code: 'COLLISION',\n message: `flanges '${a.id}' and '${b.id}' overlap once folded`,\n featureId: a.id,\n });\n }\n }\n }\n return warnings;\n}\n\n/**\n * Axis-aligned bounding box of a folded flange flat, computed analytically from\n * its recorded bend feature (no kernel call). The flat is a `length × span ×\n * thickness` box that — before folding — lies in the base plane, extending\n * outward from the bend axis along the run direction. Folding up by `angleDeg`\n * rotates that run+thickness plane about the axis. The eight folded corners give\n * the AABB. This mirrors {@link authorPart}'s `rotate(-θ)` up-fold (which maps the\n * run direction toward +Z) without re-running the boolean construction.\n */\nfunction flangeBounds(\n bend: BendFeature,\n length: number,\n span: number,\n thickness: number,\n center: Vec3\n): Bounds3D {\n const axis = vecNormalize(bend.axisDir);\n const run = outwardRun(bend.axisOrigin, axis, center);\n // A down-bend folds the run toward −Z instead of +Z.\n const up: Vec3 = bend.direction === 'down' ? [0, 0, -1] : [0, 0, 1];\n\n const theta = (bend.angleDeg * Math.PI) / 180;\n const cos = Math.cos(theta);\n const sin = Math.sin(theta);\n\n // Folding up by θ rotates the run/thickness plane about the axis: the run\n // direction tips toward +Z, the sheet normal tips back toward −run.\n const runFolded: Vec3 = [\n run[0] * cos + up[0] * sin,\n run[1] * cos + up[1] * sin,\n run[2] * cos + up[2] * sin,\n ];\n const normalFolded: Vec3 = [\n -run[0] * sin + up[0] * cos,\n -run[1] * sin + up[1] * cos,\n -run[2] * sin + up[2] * cos,\n ];\n\n const base: Vec3 = [bend.axisOrigin[0], bend.axisOrigin[1], 0];\n const corners: Vec3[] = [];\n for (const s of [0, span]) {\n for (const l of [0, length]) {\n for (const t of [0, thickness]) {\n const p = vecAdd(\n vecAdd(vecAdd(base, vecScale(axis, s)), vecScale(runFolded, l)),\n vecScale(normalFolded, t)\n );\n corners.push(p);\n }\n }\n }\n\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n let zMin = Infinity;\n let zMax = -Infinity;\n for (const c of corners) {\n if (c[0] < xMin) xMin = c[0];\n if (c[0] > xMax) xMax = c[0];\n if (c[1] < yMin) yMin = c[1];\n if (c[1] > yMax) yMax = c[1];\n if (c[2] < zMin) zMin = c[2];\n if (c[2] > zMax) zMax = c[2];\n }\n return { xMin, xMax, yMin, yMax, zMin, zMax };\n}\n\n/** In-plane perpendicular to the axis pointing away from the part center. */\nfunction outwardRun(axisOrigin: Vec3, axis: Vec3, center: Vec3): Vec3 {\n const perp = vecNormalize(vecCross(axis, [0, 0, 1]));\n const toEdge: Vec3 = [\n axisOrigin[0] - center[0],\n axisOrigin[1] - center[1],\n 0,\n ];\n const dot = perp[0] * toEdge[0] + perp[1] * toEdge[1];\n return dot >= 0 ? perp : [-perp[0], -perp[1], -perp[2]];\n}\n\n/** Order-independent key for a flange pair (corner identity). */\nfunction pairKey(a: string, b: string): string {\n return a < b ? `${a}::${b}` : `${b}::${a}`;\n}\n\nfunction boundsOverlap(a: Bounds3D, b: Bounds3D): boolean {\n return (\n a.xMin < b.xMax - OVERLAP_TOL &&\n b.xMin < a.xMax - OVERLAP_TOL &&\n a.yMin < b.yMax - OVERLAP_TOL &&\n b.yMin < a.yMax - OVERLAP_TOL &&\n a.zMin < b.zMax - OVERLAP_TOL &&\n b.zMin < a.zMax - OVERLAP_TOL\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@faicad/sheetmetal",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "Sheet-metal CAD domain for faijs — flange authoring, fold/unfold flat patterns (ported from brepjs-sheetmetal)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sheet-metal",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {},
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"@faicad/faijs": "^0.
|
|
33
|
+
"@faicad/faijs": "^0.18.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"typescript": "*",
|