@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/authorFns.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { cylinder, translate } from './geometryOps.js';
|
|
2
|
+
import { ok, err, kernelError, validationError, box, fuse, cut, intersect, rotate, vecAdd, vecSub, vecScale, vecDot, vecCross, vecNormalize } from '@faicad/faijs/api';
|
|
2
3
|
import { normalizeSolid } from './internal.js';
|
|
3
4
|
import { ROOT_FLAT_ID, featureTree } from './featureTreeFns.js';
|
|
4
5
|
/**
|
|
@@ -29,7 +30,7 @@ export function baseEdgeRef(faceIndex) {
|
|
|
29
30
|
* `err` with a `validationError` for an invalid thickness / base / flange /
|
|
30
31
|
* seam specification.
|
|
31
32
|
*/
|
|
32
|
-
export function authorPart(spec) {
|
|
33
|
+
export async function authorPart(spec) {
|
|
33
34
|
const { thickness } = spec;
|
|
34
35
|
if (!Number.isFinite(thickness) || thickness <= 0) {
|
|
35
36
|
return err(validationError('INVALID_THICKNESS', `thickness must be positive, got ${thickness}`));
|
|
@@ -73,7 +74,7 @@ export function authorPart(spec) {
|
|
|
73
74
|
uLen: baseLen,
|
|
74
75
|
vLen: width,
|
|
75
76
|
});
|
|
76
|
-
let solid = box(baseLen, width, thickness);
|
|
77
|
+
let solid = (await box({ width: baseLen, depth: width, height: thickness }));
|
|
77
78
|
const flanges = [];
|
|
78
79
|
const bends = [];
|
|
79
80
|
// Author in spec order; a chained flange must follow its parent. Resolve the
|
|
@@ -84,7 +85,7 @@ export function authorPart(spec) {
|
|
|
84
85
|
if (parentFrame === undefined) {
|
|
85
86
|
return err(validationError('UNKNOWN_PARENT', `flange '${flange.id}' parent '${flange.parent}' not authored yet`));
|
|
86
87
|
}
|
|
87
|
-
const built = buildFlange(solid, parentFrame, thickness, flange);
|
|
88
|
+
const built = await buildFlange(solid, parentFrame, thickness, flange);
|
|
88
89
|
if (!built.ok)
|
|
89
90
|
return built;
|
|
90
91
|
solid = built.value.solid;
|
|
@@ -224,7 +225,7 @@ function checkEdgeOverlaps(specs, baseLen, width) {
|
|
|
224
225
|
* (bend axis +Y at the origin, outward run +X, top surface +Z) honouring the
|
|
225
226
|
* up/down fold, then rigidly mapped onto the parent edge's world frame.
|
|
226
227
|
*/
|
|
227
|
-
function buildFlange(base, parent, thickness, flange) {
|
|
228
|
+
async function buildFlange(base, parent, thickness, flange) {
|
|
228
229
|
if (!Number.isFinite(flange.length) || flange.length <= 0) {
|
|
229
230
|
return err(validationError('INVALID_FLANGE_LENGTH', `flange '${flange.id}' length must be positive`));
|
|
230
231
|
}
|
|
@@ -253,23 +254,25 @@ function buildFlange(base, parent, thickness, flange) {
|
|
|
253
254
|
// +Y over [0, span]. Up folds toward +Z, down folds below the base plane.
|
|
254
255
|
const canonAxisZ = direction === 'up' ? thickness + r : -r;
|
|
255
256
|
const canonOrigin = [0, 0, canonAxisZ];
|
|
256
|
-
const patch = buildBendPatch(canonOrigin, flange.angleDeg, r, span, thickness, direction);
|
|
257
|
+
const patch = await buildBendPatch(canonOrigin, flange.angleDeg, r, span, thickness, direction);
|
|
257
258
|
if (!patch.ok)
|
|
258
259
|
return patch;
|
|
259
|
-
const flat = buildFlangeFlat(canonOrigin, flange.angleDeg, span, thickness, flange.length, direction);
|
|
260
|
+
const flat = await buildFlangeFlat(canonOrigin, flange.angleDeg, span, thickness, flange.length, direction);
|
|
260
261
|
// World frame the canonical assembly maps onto: bend axis = edge.dir, outward
|
|
261
262
|
// run = edge.out, top normal = parent.n. The bend axis sits at offset along the
|
|
262
263
|
// edge; the canonical contact (axis straight above the base seam) maps onto the
|
|
263
264
|
// parent edge line.
|
|
264
265
|
const place = frameTransform(edge.dir, edge.out, parent.n, edge.start, offset);
|
|
265
|
-
const patchPlaced = place.solid(patch.value);
|
|
266
|
-
const flatPlaced = place.solid(flat);
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
266
|
+
const patchPlaced = await place.solid(patch.value);
|
|
267
|
+
const flatPlaced = await place.solid(flat);
|
|
268
|
+
let fused;
|
|
269
|
+
try {
|
|
270
|
+
const fusedPatch = await fuse(base, patchPlaced);
|
|
271
|
+
fused = (await fuse(fusedPatch, flatPlaced));
|
|
272
|
+
}
|
|
273
|
+
catch (e) {
|
|
274
|
+
return err(kernelError('FUSE_FAILED', `fuse flange: ${e instanceof Error ? e.message : String(e)}`));
|
|
275
|
+
}
|
|
273
276
|
const sign = direction === 'up' ? 1 : -1;
|
|
274
277
|
// Recorded bend axis = the cylinder centre line: parent edge + n·(T+r up | r down).
|
|
275
278
|
const axisOrigin = vecAdd(vecAdd(edge.start, vecScale(edge.dir, offset)), vecScale(parent.n, canonAxisZ));
|
|
@@ -307,7 +310,7 @@ function buildFlange(base, parent, thickness, flange) {
|
|
|
307
310
|
foldedBounds,
|
|
308
311
|
...(flange.miter !== undefined ? { miter: flange.miter } : {}),
|
|
309
312
|
};
|
|
310
|
-
return ok({ solid: fused
|
|
313
|
+
return ok({ solid: fused, flange: flangeFeature, bend, childFrame });
|
|
311
314
|
}
|
|
312
315
|
/**
|
|
313
316
|
* Resolve one of the four edges of a flat frame. The bend axis `dir` is chosen so
|
|
@@ -452,9 +455,9 @@ function frameTransform(axisT, runT, nT, edgeStart, offset) {
|
|
|
452
455
|
const target = vecAdd(edgeStart, vecScale(axisT, offset));
|
|
453
456
|
const applyR = (v) => vecAdd(vecAdd(vecScale(runT, v[0]), vecScale(axisT, v[1])), vecScale(nT, v[2]));
|
|
454
457
|
return {
|
|
455
|
-
solid: (s) => {
|
|
456
|
-
const rotated = aa.angleDeg === 0 ? s : rotate(s, aa.angleDeg, { at: [0, 0, 0], axis: aa.axis });
|
|
457
|
-
return translate(rotated, target);
|
|
458
|
+
solid: async (s) => {
|
|
459
|
+
const rotated = aa.angleDeg === 0 ? s : await rotate(s, aa.angleDeg, { at: [0, 0, 0], axis: aa.axis });
|
|
460
|
+
return (await translate(rotated, target));
|
|
458
461
|
},
|
|
459
462
|
point: (p) => vecAdd(applyR(p), target),
|
|
460
463
|
vector: applyR,
|
|
@@ -507,21 +510,23 @@ function matrixToAxisAngle(m) {
|
|
|
507
510
|
* bend the axis sits above the base (sweep from −Z toward the flange); for a down
|
|
508
511
|
* bend it sits below (sweep from +Z toward the flange).
|
|
509
512
|
*/
|
|
510
|
-
function buildBendPatch(axisOrigin, thetaDeg, r, width, thickness, direction) {
|
|
513
|
+
async function buildBendPatch(axisOrigin, thetaDeg, r, width, thickness, direction) {
|
|
511
514
|
const outerR = r + thickness;
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
515
|
+
try {
|
|
516
|
+
const outer = await cylinder(outerR, width, { at: axisOrigin, axis: [0, 1, 0] });
|
|
517
|
+
let tube = outer;
|
|
518
|
+
if (r > 1e-9) {
|
|
519
|
+
const inner = await cylinder(r, width, { at: axisOrigin, axis: [0, 1, 0] });
|
|
520
|
+
tube = (await cut(outer, inner));
|
|
521
|
+
}
|
|
522
|
+
const wedge = await buildWedge(axisOrigin, thetaDeg, outerR, width, direction);
|
|
523
|
+
if (!wedge.ok)
|
|
524
|
+
return wedge;
|
|
525
|
+
return ok((await intersect(tube, wedge.value)));
|
|
526
|
+
}
|
|
527
|
+
catch (e) {
|
|
528
|
+
return err(kernelError('BEND_PATCH_FAILED', `build bend patch: ${e instanceof Error ? e.message : String(e)}`));
|
|
520
529
|
}
|
|
521
|
-
const wedge = buildWedge(axisOrigin, thetaDeg, outerR, width, direction);
|
|
522
|
-
if (!wedge.ok)
|
|
523
|
-
return wedge;
|
|
524
|
-
return intersect(tube, wedge.value);
|
|
525
530
|
}
|
|
526
531
|
/**
|
|
527
532
|
* Convex angular wedge (≤180°) isolating the fold sweep. The inner arc starts at
|
|
@@ -530,33 +535,38 @@ function buildBendPatch(axisOrigin, thetaDeg, r, width, thickness, direction) {
|
|
|
530
535
|
* through the bend axis with that half-space rotated by the fold; the tube
|
|
531
536
|
* intersection trims it to the true annular sector.
|
|
532
537
|
*/
|
|
533
|
-
function buildWedge(axisOrigin, thetaDeg, outerR, width, direction) {
|
|
538
|
+
async function buildWedge(axisOrigin, thetaDeg, outerR, width, direction) {
|
|
534
539
|
const span = outerR * 2 + 2;
|
|
535
540
|
const margin = 1;
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
541
|
+
try {
|
|
542
|
+
const blockA = (await box({ width: span, depth: width + 2 * margin, height: 2 * span }));
|
|
543
|
+
const halfA = (await translate(blockA, [
|
|
544
|
+
axisOrigin[0],
|
|
545
|
+
axisOrigin[1] - margin,
|
|
546
|
+
axisOrigin[2] - span,
|
|
547
|
+
]));
|
|
548
|
+
// Up bends sweep from −Z (rotate +X start plane by +(180−θ)); down bends mirror
|
|
549
|
+
// about the axis, sweeping from +Z (rotate by −(180−θ)).
|
|
550
|
+
const sign = direction === 'up' ? 1 : -1;
|
|
551
|
+
const halfB = await rotate(halfA, sign * (180 - thetaDeg), { at: axisOrigin, axis: [0, 1, 0] });
|
|
552
|
+
return ok((await intersect(halfA, halfB)));
|
|
553
|
+
}
|
|
554
|
+
catch (e) {
|
|
555
|
+
return err(kernelError('WEDGE_FAILED', `build wedge: ${e instanceof Error ? e.message : String(e)}`));
|
|
556
|
+
}
|
|
547
557
|
}
|
|
548
558
|
/** The flange flat, built lying along +X past the bend, then folded to angle θ. */
|
|
549
|
-
function buildFlangeFlat(axisOrigin, thetaDeg, width, thickness, length, direction) {
|
|
559
|
+
async function buildFlangeFlat(axisOrigin, thetaDeg, width, thickness, length, direction) {
|
|
550
560
|
// Unfolded the flat is coplanar with the base sheet; for an up bend it lies in
|
|
551
561
|
// Z∈[0,T] folding up (rotate −θ about +Y sends +X toward +Z); for a down bend it
|
|
552
562
|
// lies in Z∈[−T,0] folding down (rotate +θ sends +X toward −Z).
|
|
553
563
|
if (direction === 'up') {
|
|
554
|
-
const flat = box(length, width, thickness);
|
|
555
|
-
const positioned = translate(flat, [axisOrigin[0], axisOrigin[1], 0]);
|
|
556
|
-
return rotate(positioned, -thetaDeg, { at: axisOrigin, axis: [0, 1, 0] });
|
|
564
|
+
const flat = (await box({ width: length, depth: width, height: thickness }));
|
|
565
|
+
const positioned = (await translate(flat, [axisOrigin[0], axisOrigin[1], 0]));
|
|
566
|
+
return (await rotate(positioned, -thetaDeg, { at: axisOrigin, axis: [0, 1, 0] }));
|
|
557
567
|
}
|
|
558
|
-
const flat = box(length, width, thickness);
|
|
559
|
-
const positioned = translate(flat, [axisOrigin[0], axisOrigin[1], -thickness]);
|
|
560
|
-
return rotate(positioned, thetaDeg, { at: axisOrigin, axis: [0, 1, 0] });
|
|
568
|
+
const flat = (await box({ width: length, depth: width, height: thickness }));
|
|
569
|
+
const positioned = (await translate(flat, [axisOrigin[0], axisOrigin[1], -thickness]));
|
|
570
|
+
return (await rotate(positioned, thetaDeg, { at: axisOrigin, axis: [0, 1, 0] }));
|
|
561
571
|
}
|
|
562
572
|
//# sourceMappingURL=authorFns.js.map
|
package/dist/authorFns.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorFns.js","sourceRoot":"","sources":["../src/authorFns.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type Result,\n type Vec3,\n type Bounds3D,\n type Solid,\n type ValidSolid,\n ok,\n err,\n validationError,\n box,\n cylinder,\n fuse,\n cut,\n intersect,\n rotate,\n translate,\n vecAdd,\n vecSub,\n vecScale,\n vecDot,\n vecCross,\n vecNormalize,\n} from '@faicad/faijs/brepjs-compat';\nimport type {\n BendFeature,\n BendRule,\n FlangeFeature,\n EdgeRef,\n FlatSide,\n MaterialSpec,\n MiterSpec,\n SheetMetalPart,\n} from './types.js';\nimport { normalizeSolid } from './internal.js';\nimport { ROOT_FLAT_ID, featureTree, type FeatureTree } from './featureTreeFns.js';\n\n/** Authoring options for the base flat the flanges attach to. */\nexport interface BaseFlatSpec {\n /** Extent along the run (+X) axis. */\n length: number;\n /** Extent along the width (+Y) axis. */\n width: number;\n}\n\n/** Which edge a flange folds off (of the base, or of its parent flange). */\nexport type FlangeSide = FlatSide;\n\n/** A single flange to author off an edge of its parent flat. */\nexport interface FlangeSpec {\n id: string;\n /** Flat length measured from the end of the bend along the flange plane. */\n length: number;\n /** Signed fold angle in degrees. */\n angleDeg: number;\n rule: BendRule;\n /** Parent edge to attach to. Default `'xmax'` (the leading +X edge). */\n side?: FlangeSide | undefined;\n /** Fold direction relative to the parent face normal. Default `'up'`. */\n direction?: 'up' | 'down' | undefined;\n /** Id of another flange this flange folds off (its distal edge). Default = base flat. */\n parent?: string | undefined;\n /** Start position along the parent edge. Default `0`. */\n offset?: number | undefined;\n /** Extent along the parent edge. Default = full parent-edge length. */\n width?: number | undefined;\n miter?: MiterSpec | undefined;\n}\n\n/**\n * A seam: a bend connecting two already-authored flats that is intentionally left\n * unfolded (a free edge). Closing the last wall of a box/tube back onto an earlier\n * flat produces a cyclic feature graph; the feature tree turns this edge into a\n * SEAM_CUT, and the unfold leaves the flats connected through the spanning tree.\n */\nexport interface SeamSpec {\n /** Flat id the seam folds from (an authored flange, or `'root'`/`'face-0'` for the base). */\n parent: string;\n /** Flat id the seam meets (must already be authored; `'root'`/`'face-0'` = base). */\n child: string;\n angleDeg: number;\n rule: BendRule;\n}\n\n/** Inputs for {@link authorPart}. */\nexport interface AuthorSpec {\n thickness: number;\n base: BaseFlatSpec;\n flanges: FlangeSpec[];\n material?: MaterialSpec | undefined;\n /** Optional seams that close a profile into a tube/box (left unfolded). */\n seams?: SeamSpec[] | undefined;\n}\n\n/**\n * Stable edge reference for flange attachment. The base flat is `face-0`; every\n * flange face is `face-<n+1>` in authoring order. The leading edge of a flat is\n * `edgeIndex 0`. The reference also carries `parentId`/`side`/`offset`/`extent`\n * so the feature tree and recursive unfold can resolve the exact parent edge a\n * flange folds from without reading topology back out of the B-rep.\n *\n * @param faceIndex - the face index of the flat: `0` for the base, `n+1` for the\n * flange authored in the `n`-th position.\n * @returns an {@link EdgeRef} pointing at the flat's leading edge (`edgeIndex 0`).\n */\nexport function baseEdgeRef(faceIndex: number): EdgeRef {\n return { kind: 'index', faceIndex, edgeIndex: 0 };\n}\n\n/**\n * A flat in the part: the base, or a placed flange face. Each carries the world\n * frame (origin + orthonormal axes) of its top surface so a child flange can be\n * built directly off any of its four edges, at any fold direction.\n */\nexport interface FlatFrame {\n id: string;\n /** Near corner of the flat on its −normal (bottom) surface; the flat spans\n * `thickness` along +n. Local `(x, y)` maps to `origin + x·u + y·v`. */\n origin: Vec3;\n /** In-plane direction; the flat spans `[0, uLen]` along it. */\n u: Vec3;\n /** In-plane direction; the flat spans `[0, vLen]` along it. */\n v: Vec3;\n /** Outward face normal of the top surface (n = u × v). */\n n: Vec3;\n uLen: number;\n vLen: number;\n}\n\n/**\n * Author a sheet-metal part: a base flat plus an arbitrary tree of flanges. Each\n * flange folds off one of the four edges of its parent flat (the base by default,\n * or another flange via `parent`), in the requested direction (up/down), over an\n * optional sub-span of that edge (`offset`/`width`). Returns a {@link SheetMetalPart}\n * carrying the folded 3D solid and the recorded bend feature tree the unfold\n * consumes. All construction stays on the public, OCCT-WASM-safe API.\n *\n * @param spec - the authoring spec: sheet thickness, base flat dimensions, the\n * flange list, optional material, and optional closing seams.\n * @returns a `Result<SheetMetalPart>` — `ok` with the folded part on success, or\n * `err` with a `validationError` for an invalid thickness / base / flange /\n * seam specification.\n */\nexport function authorPart(spec: AuthorSpec): Result<SheetMetalPart> {\n const { thickness } = spec;\n if (!Number.isFinite(thickness) || thickness <= 0) {\n return err(validationError('INVALID_THICKNESS', `thickness must be positive, got ${thickness}`));\n }\n const { length: baseLen, width } = spec.base;\n if (!Number.isFinite(baseLen) || baseLen <= 0) {\n return err(validationError('INVALID_BASE_LENGTH', `base.length must be positive, got ${baseLen}`));\n }\n if (!Number.isFinite(width) || width <= 0) {\n return err(validationError('INVALID_BASE_WIDTH', `base.width must be positive, got ${width}`));\n }\n\n const seen = new Set<string>();\n for (const flange of spec.flanges) {\n // `::` is reserved as the seam-bend id delimiter (`seam::<parent>::<child>`);\n // allowing it in a flange id would make the seam parent/child ambiguous to parse.\n // `root`/`face-0` are reserved sentinels for the base flat — a flange reusing\n // either would silently overwrite the base frame and fold off wrong geometry.\n if (flange.id === '' || flange.id.includes('::') || flange.id === ROOT_FLAT_ID || flange.id === 'face-0') {\n return err(\n validationError('INVALID_FLANGE_ID', `flange id must be non-empty, must not contain '::', and must not reuse the reserved ids 'root'/'face-0', got '${flange.id}'`)\n );\n }\n if (seen.has(flange.id)) {\n return err(validationError('DUPLICATE_FLANGE', `duplicate flange id '${flange.id}'`));\n }\n seen.add(flange.id);\n }\n\n // Two flanges on the same parent edge must not overlap along that edge.\n const overlap = checkEdgeOverlaps(spec.flanges, baseLen, width);\n if (!overlap.ok) return overlap;\n\n const ROOT = ROOT_FLAT_ID;\n const frames = new Map<string, FlatFrame>();\n // Frame origin sits on the sheet's −normal (bottom) surface; the flat spans\n // `thickness` along +n. This matches the canonical assembly, whose z=0 plane is\n // the sheet bottom and whose bend cylinder sits at z = T+r (up) / −r (down).\n frames.set(ROOT, {\n id: ROOT,\n origin: [0, 0, 0],\n u: [1, 0, 0],\n v: [0, 1, 0],\n n: [0, 0, 1],\n uLen: baseLen,\n vLen: width,\n });\n\n let solid: Solid = box(baseLen, width, thickness);\n const flanges: FlangeFeature[] = [];\n const bends: BendFeature[] = [];\n\n // Author in spec order; a chained flange must follow its parent. Resolve the\n // parent frame by flange id (or the base for a root flange).\n for (const flange of spec.flanges) {\n const parentId = flange.parent ?? ROOT;\n const parentFrame = frames.get(parentId);\n if (parentFrame === undefined) {\n return err(\n validationError('UNKNOWN_PARENT', `flange '${flange.id}' parent '${flange.parent}' not authored yet`)\n );\n }\n const built = buildFlange(solid, parentFrame, thickness, flange);\n if (!built.ok) return built;\n solid = built.value.solid;\n flanges.push(built.value.flange);\n bends.push(built.value.bend);\n frames.set(flange.id, built.value.childFrame);\n }\n\n for (const seam of spec.seams ?? []) {\n const seamParent = seam.parent === 'face-0' ? ROOT : seam.parent;\n const seamChild = seam.child === 'face-0' ? ROOT : seam.child;\n if (!frames.has(seamParent) || !frames.has(seamChild)) {\n return err(\n validationError('UNKNOWN_SEAM_FLAT', `seam ${seam.parent}↔${seam.child} references an unauthored flat`)\n );\n }\n if (!Number.isFinite(seam.angleDeg) || seam.angleDeg <= 0 || seam.angleDeg > 180) {\n return err(\n validationError('INVALID_SEAM_ANGLE', `seam ${seam.parent}↔${seam.child} angleDeg must be in (0, 180], got ${seam.angleDeg}`)\n );\n }\n if (!Number.isFinite(seam.rule.innerRadius) || seam.rule.innerRadius < 0) {\n return err(\n validationError('INVALID_SEAM_RADIUS', `seam ${seam.parent}↔${seam.child} innerRadius must be non-negative`)\n );\n }\n const parentFrame = frames.get(seamParent) as FlatFrame;\n bends.push({\n id: `seam::${seamParent}::${seamChild}`,\n axisOrigin: [parentFrame.origin[0], parentFrame.origin[1], parentFrame.origin[2]],\n axisDir: [parentFrame.u[0], parentFrame.u[1], parentFrame.u[2]],\n angleDeg: seam.angleDeg,\n direction: 'up',\n rule: seam.rule,\n });\n }\n\n return ok({\n thickness,\n baseLength: baseLen,\n width,\n ...(spec.material !== undefined ? { material: spec.material } : {}),\n flanges,\n bends,\n solid: normalizeSolid(solid),\n });\n}\n\n/**\n * World {@link FlatFrame} of every flat region of an authored part, keyed by region\n * id (`'root'` for the base). Reconstructed from the recorded bend/flange feature\n * tree using the exact same edge/transform/child-frame math {@link authorPart} uses\n * to place the geometry, so a cutout authored in a region's local `(x, y)` lands on\n * the matching folded face. Walks the feature tree in BFS order so a chained\n * flange's parent frame is always known first.\n *\n * @param part - the authored sheet-metal part whose flat regions to resolve.\n * @param tree - optional pre-built {@link FeatureTree}; when omitted the tree is\n * reconstructed from `part` via {@link featureTree}.\n * @returns a `Result<Map<string, FlatFrame>>` — `ok` with a map of region id\n * (`'root'` for the base, otherwise the flange id) to its world {@link FlatFrame},\n * or `err` when a flange's parent frame is missing from the tree.\n */\nexport function worldFrames(\n part: SheetMetalPart,\n tree?: FeatureTree\n): Result<Map<string, FlatFrame>> {\n const frames = new Map<string, FlatFrame>();\n frames.set(ROOT_FLAT_ID, {\n id: ROOT_FLAT_ID,\n origin: [0, 0, 0],\n u: [1, 0, 0],\n v: [0, 1, 0],\n n: [0, 0, 1],\n uLen: part.baseLength,\n vLen: part.width,\n });\n\n const treeResult = tree !== undefined ? ok(tree) : featureTree(part);\n if (!treeResult.ok) return treeResult;\n\n const flangeById = new Map<string, FlangeFeature>();\n for (const f of part.flanges) flangeById.set(f.id, f);\n\n for (const tb of treeResult.value.bends) {\n const flange = flangeById.get(tb.child);\n if (flange === undefined) continue;\n const parent = frames.get(tb.parent);\n if (parent === undefined) {\n return err(validationError('UNKNOWN_PARENT', `worldFrames: parent '${tb.parent}' missing for '${tb.child}'`));\n }\n const side: FlatSide = flange.baseEdge.side ?? 'xmax';\n const direction: 'up' | 'down' = flange.direction ?? 'up';\n const offset = flange.offset ?? flange.baseEdge.offset ?? 0;\n const r = flange.rule.innerRadius;\n const edge = parentEdge(parent, side);\n const sign = direction === 'up' ? 1 : -1;\n const place = frameTransform(edge.dir, edge.out, parent.n, edge.start, offset);\n frames.set(\n flange.id,\n computeChildFrame(flange.id, place, flange.span, flange.angleDeg, part.thickness, r, sign, flange.length)\n );\n }\n\n return ok(frames);\n}\n\n/**\n * Reject two flanges on the same parent edge whose [offset, offset+width] ranges\n * overlap. The edge length a flange's default span fills must be the *resolved*\n * parent-edge length, not the base's: a chained flange folds off another flange\n * whose edges have that flange's own span/length, so keying the default off the\n * base dimensions would compute a bogus span and spuriously reject valid pairs.\n */\nfunction checkEdgeOverlaps(specs: FlangeSpec[], baseLen: number, width: number): Result<void> {\n interface Range {\n id: string;\n lo: number;\n hi: number;\n }\n // Resolved child-frame dims per flange: spanLen along the bend axis, flatLen out.\n // Walked in spec order (a chained flange always follows its parent), mirroring\n // the authoring loop so parent frames are known before their children.\n const dims = new Map<string, { spanLen: number; flatLen: number }>();\n const edgeLenFor = (parentId: string, side: FlatSide): number => {\n const onWidthEdge = side === 'xmax' || side === 'xmin';\n if (parentId === ROOT_FLAT_ID) return onWidthEdge ? width : baseLen;\n const p = dims.get(parentId);\n if (p === undefined) return onWidthEdge ? width : baseLen;\n // Parent flange frame: uLen = its span (xmax/xmin edges), vLen = its length.\n return onWidthEdge ? p.flatLen : p.spanLen;\n };\n\n const byEdge = new Map<string, Range[]>();\n for (const f of specs) {\n const side: FlatSide = f.side ?? 'xmax';\n const parentId = f.parent ?? ROOT_FLAT_ID;\n const key = `${parentId}::${side}`;\n const edgeLen = edgeLenFor(parentId, side);\n const lo = f.offset ?? 0;\n const span = f.width ?? edgeLen;\n const hi = lo + span;\n const list = byEdge.get(key) ?? [];\n for (const r of list) {\n if (lo < r.hi - 1e-9 && r.lo < hi - 1e-9) {\n return err(\n validationError(\n 'OVERLAPPING_FLANGES',\n `flange '${f.id}' overlaps '${r.id}' on edge '${key}' ([${lo}, ${hi}] ∩ [${r.lo}, ${r.hi}])`\n )\n );\n }\n }\n list.push({ id: f.id, lo, hi });\n byEdge.set(key, list);\n dims.set(f.id, { spanLen: span, flatLen: f.length });\n }\n return ok(undefined);\n}\n\ninterface BuiltFlange {\n solid: Solid;\n flange: FlangeFeature;\n bend: BendFeature;\n childFrame: FlatFrame;\n}\n\n/**\n * Build one flange off `parent`'s chosen edge and fuse it to `base`. The flange\n * assembly (cylindrical bend patch + flat) is constructed in a canonical frame\n * (bend axis +Y at the origin, outward run +X, top surface +Z) honouring the\n * up/down fold, then rigidly mapped onto the parent edge's world frame.\n */\nfunction buildFlange(\n base: Solid,\n parent: FlatFrame,\n thickness: number,\n flange: FlangeSpec\n): Result<BuiltFlange> {\n if (!Number.isFinite(flange.length) || flange.length <= 0) {\n return err(validationError('INVALID_FLANGE_LENGTH', `flange '${flange.id}' length must be positive`));\n }\n if (!Number.isFinite(flange.angleDeg) || flange.angleDeg <= 0 || flange.angleDeg > 180) {\n return err(\n validationError('INVALID_FLANGE_ANGLE', `flange '${flange.id}' angleDeg must be in (0, 180], got ${flange.angleDeg}`)\n );\n }\n const r = flange.rule.innerRadius;\n if (!Number.isFinite(r) || r < 0) {\n return err(validationError('INVALID_RADIUS', `flange '${flange.id}' innerRadius must be non-negative`));\n }\n\n const side: FlatSide = flange.side ?? 'xmax';\n const direction: 'up' | 'down' = flange.direction ?? 'up';\n const edge = parentEdge(parent, side);\n const offset = flange.offset ?? 0;\n const span = flange.width ?? edge.length;\n if (!Number.isFinite(offset) || offset < -1e-9) {\n return err(validationError('INVALID_OFFSET', `flange '${flange.id}' offset must be non-negative`));\n }\n if (!Number.isFinite(span) || span <= 0) {\n return err(validationError('INVALID_FLANGE_WIDTH', `flange '${flange.id}' width must be positive`));\n }\n if (offset + span > edge.length + 1e-6) {\n return err(\n validationError('FLANGE_OUT_OF_BOUNDS', `flange '${flange.id}' [${offset}, ${offset + span}] exceeds parent edge length ${edge.length}`)\n );\n }\n\n // Canonical assembly: bend axis +Y, outward run +X, top surface +Z, spanning\n // +Y over [0, span]. Up folds toward +Z, down folds below the base plane.\n const canonAxisZ = direction === 'up' ? thickness + r : -r;\n const canonOrigin: Vec3 = [0, 0, canonAxisZ];\n const patch = buildBendPatch(canonOrigin, flange.angleDeg, r, span, thickness, direction);\n if (!patch.ok) return patch;\n const flat = buildFlangeFlat(canonOrigin, flange.angleDeg, span, thickness, flange.length, direction);\n\n // World frame the canonical assembly maps onto: bend axis = edge.dir, outward\n // run = edge.out, top normal = parent.n. The bend axis sits at offset along the\n // edge; the canonical contact (axis straight above the base seam) maps onto the\n // parent edge line.\n const place = frameTransform(edge.dir, edge.out, parent.n, edge.start, offset);\n const patchPlaced = place.solid(patch.value);\n const flatPlaced = place.solid(flat);\n\n const fusedPatch = fuse(base, patchPlaced);\n if (!fusedPatch.ok) return fusedPatch;\n const fused = fuse(fusedPatch.value, flatPlaced);\n if (!fused.ok) return fused;\n\n const sign = direction === 'up' ? 1 : -1;\n // Recorded bend axis = the cylinder centre line: parent edge + n·(T+r up | r down).\n const axisOrigin = vecAdd(\n vecAdd(edge.start, vecScale(edge.dir, offset)),\n vecScale(parent.n, canonAxisZ)\n );\n const bend: BendFeature = {\n id: flange.id,\n axisOrigin: [axisOrigin[0], axisOrigin[1], axisOrigin[2]],\n axisDir: [edge.dir[0], edge.dir[1], edge.dir[2]],\n angleDeg: flange.angleDeg,\n direction,\n rule: flange.rule,\n };\n\n const childFrame = computeChildFrame(flange.id, place, span, flange.angleDeg, thickness, r, sign, flange.length);\n\n // True folded AABB of the whole flange (bend patch + flat) in world space.\n // Computed from the real placed geometry so chained flanges — whose bend axis\n // sits off the z=0 base plane — get a correct box, not the z=0-flattened one a\n // purely analytic re-fold would produce. The collision check reuses this.\n const foldedBounds = flangeFoldedBounds(childFrame, edge, offset, span, parent.n, canonAxisZ, thickness);\n\n const flangeFeature: FlangeFeature = {\n id: flange.id,\n baseEdge: {\n kind: 'index',\n faceIndex: parent.id === ROOT_FLAT_ID ? 0 : -1,\n edgeIndex: 0,\n parentId: parent.id,\n side,\n offset,\n extent: span,\n },\n length: flange.length,\n span,\n offset,\n angleDeg: flange.angleDeg,\n direction,\n rule: flange.rule,\n foldedBounds,\n ...(flange.miter !== undefined ? { miter: flange.miter } : {}),\n };\n\n return ok({ solid: fused.value, flange: flangeFeature, bend, childFrame });\n}\n\ninterface ParentEdge {\n /** Direction along the edge (the bend axis). */\n dir: Vec3;\n /** Outward in-plane direction the flange runs (perpendicular to dir). */\n out: Vec3;\n /** Start corner of the edge (offset 0). */\n start: Vec3;\n /** Edge length. */\n length: number;\n}\n\n/**\n * Resolve one of the four edges of a flat frame. The bend axis `dir` is chosen so\n * the canonical assembly maps onto it by a proper rotation: `out × dir = n`, i.e.\n * `dir = n × out`. `start` is the edge endpoint from which `dir` runs along the\n * edge, so the flange spans `start + offset·dir` to `start + (offset+span)·dir`.\n */\nfunction parentEdge(f: FlatFrame, side: FlatSide): ParentEdge {\n const o = f.origin;\n const uTop = vecAdd(o, vecScale(f.u, f.uLen));\n const vTop = vecAdd(o, vecScale(f.v, f.vLen));\n const uvTop = vecAdd(uTop, vecScale(f.v, f.vLen));\n\n let out: Vec3;\n let length: number;\n let a: Vec3;\n let b: Vec3;\n switch (side) {\n case 'xmax':\n out = f.u;\n length = f.vLen;\n a = uTop;\n b = uvTop;\n break;\n case 'xmin':\n out = vecScale(f.u, -1);\n length = f.vLen;\n a = o;\n b = vTop;\n break;\n case 'ymax':\n out = f.v;\n length = f.uLen;\n a = vTop;\n b = uvTop;\n break;\n case 'ymin':\n out = vecScale(f.v, -1);\n length = f.uLen;\n a = o;\n b = uTop;\n break;\n }\n const dir = vecNormalize(vecCross(f.n, out));\n // Pick the endpoint from which `dir` points toward the other endpoint.\n const toB = vecSub(b, a);\n const start = vecDot(toB, dir) >= 0 ? a : b;\n return { dir, out, start, length };\n}\n\n/**\n * Frame of the child flange's flat (bottom/−normal surface, near corner), for\n * chaining grandchildren. Derived by folding the canonical flat by ∓θ about the\n * bend axis, then mapping through the same rigid transform that placed the flange.\n */\nfunction computeChildFrame(\n id: string,\n place: PlacedTransform,\n span: number,\n angleDeg: number,\n thickness: number,\n r: number,\n sign: number,\n length: number\n): FlatFrame {\n const theta = (angleDeg * Math.PI) / 180;\n const axisZ = sign > 0 ? thickness + r : -r;\n\n // Canonical fold = rotate by −sign·θ about +Y at pivot [0,0,axisZ]. Run +X and\n // normal +Z fold accordingly; the flat's near-bottom corner ([0,0,0]) rotates\n // about the pivot. (rotate by a about +Y: [x,z]→[x cos a + z sin a, −x sin a + z cos a].)\n const a = -sign * theta;\n const ca = Math.cos(a);\n const sa = Math.sin(a);\n const runC: Vec3 = [ca, 0, -sa];\n const nC: Vec3 = [sa, 0, ca];\n const dz = -axisZ;\n const cornerC: Vec3 = [dz * sa, 0, axisZ + dz * ca];\n\n return {\n id,\n origin: place.point(cornerC),\n u: place.vector([0, 1, 0]),\n v: place.vector(runC),\n n: place.vector(nC),\n uLen: span,\n vLen: length,\n };\n}\n\n/**\n * World-space AABB of a folded flange: the union of the flat box (from its child\n * frame) and the bend region between the parent edge and the bend-axis cylinder.\n * Built from the real placed corners, so a chained flange folded off a vertical\n * wall is bounded correctly rather than collapsed into the z=0 base plane.\n */\nfunction flangeFoldedBounds(\n child: FlatFrame,\n edge: ParentEdge,\n offset: number,\n span: number,\n parentN: Vec3,\n canonAxisZ: number,\n thickness: number\n): Bounds3D {\n const corners: Vec3[] = [];\n // Flat box: child.origin + [0,uLen]·u + [0,vLen]·v + [0,thickness]·n.\n for (const s of [0, child.uLen]) {\n for (const l of [0, child.vLen]) {\n for (const t of [0, thickness]) {\n corners.push(\n vecAdd(\n vecAdd(vecAdd(child.origin, vecScale(child.u, s)), vecScale(child.v, l)),\n vecScale(child.n, t)\n )\n );\n }\n }\n }\n // Bend region: from the parent edge contact (sheet at the seam) out to the bend\n // axis line, over the flange span. Captures the cylindrical patch's footprint.\n const edgeBase = vecAdd(edge.start, vecScale(edge.dir, offset));\n const axisLine = vecAdd(edgeBase, vecScale(parentN, canonAxisZ));\n for (const s of [0, span]) {\n const along = vecScale(edge.dir, s);\n corners.push(vecAdd(edgeBase, along));\n corners.push(vecAdd(vecAdd(edgeBase, along), vecScale(parentN, thickness)));\n corners.push(vecAdd(axisLine, along));\n }\n return aabbOf(corners);\n}\n\nfunction aabbOf(corners: Vec3[]): Bounds3D {\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\ninterface PlacedTransform {\n solid: (s: Solid) => Solid;\n point: (p: Vec3) => Vec3;\n vector: (v: Vec3) => Vec3;\n}\n\n/**\n * Rigid transform mapping the canonical flange assembly (bend axis +Y, run +X,\n * normal +Z, contact at the origin) onto a world edge frame: align +X→`runT`,\n * +Y→`axisT`, +Z→`nT`, then slide the axis to `edgeStart + offset·axisT`.\n */\nfunction frameTransform(\n axisT: Vec3,\n runT: Vec3,\n nT: Vec3,\n edgeStart: Vec3,\n offset: number\n): PlacedTransform {\n // Rotation matrix R with columns [runT | axisT | nT] sends canonical X,Y,Z to\n // the target basis. Convert to axis-angle and rotate about the origin.\n const m: number[] = [\n runT[0], axisT[0], nT[0],\n runT[1], axisT[1], nT[1],\n runT[2], axisT[2], nT[2],\n ];\n const aa = matrixToAxisAngle(m);\n const target = vecAdd(edgeStart, vecScale(axisT, offset));\n const applyR = (v: Vec3): Vec3 =>\n vecAdd(vecAdd(vecScale(runT, v[0]), vecScale(axisT, v[1])), vecScale(nT, v[2]));\n return {\n solid: (s: Solid) => {\n const rotated = aa.angleDeg === 0 ? s : rotate(s, aa.angleDeg, { at: [0, 0, 0], axis: aa.axis });\n return translate(rotated, target);\n },\n point: (p: Vec3) => vecAdd(applyR(p), target),\n vector: applyR,\n };\n}\n\n/** Axis-angle of a 3×3 rotation matrix (row-major). */\nfunction matrixToAxisAngle(m: number[]): { axis: Vec3; angleDeg: number } {\n const m00 = m[0] ?? 0;\n const m01 = m[1] ?? 0;\n const m02 = m[2] ?? 0;\n const m10 = m[3] ?? 0;\n const m11 = m[4] ?? 0;\n const m12 = m[5] ?? 0;\n const m20 = m[6] ?? 0;\n const m21 = m[7] ?? 0;\n const m22 = m[8] ?? 0;\n\n const trace = m00 + m11 + m22;\n const cos = Math.max(-1, Math.min(1, (trace - 1) / 2));\n const angle = Math.acos(cos);\n const angleDeg = (angle * 180) / Math.PI;\n if (angle < 1e-9) return { axis: [0, 0, 1], angleDeg: 0 };\n\n if (Math.PI - angle < 1e-6) {\n // 180°: axis is the column of (R + I) with the largest diagonal.\n const xx = (m00 + 1) / 2;\n const yy = (m11 + 1) / 2;\n const zz = (m22 + 1) / 2;\n let axis: Vec3;\n if (xx >= yy && xx >= zz) {\n const x = Math.sqrt(Math.max(xx, 0));\n axis = [x, (m01 + m10) / (4 * x), (m02 + m20) / (4 * x)];\n } else if (yy >= zz) {\n const y = Math.sqrt(Math.max(yy, 0));\n axis = [(m01 + m10) / (4 * y), y, (m12 + m21) / (4 * y)];\n } else {\n const z = Math.sqrt(Math.max(zz, 0));\n axis = [(m02 + m20) / (4 * z), (m12 + m21) / (4 * z), z];\n }\n return { axis: vecNormalize(axis), angleDeg: 180 };\n }\n\n const denom = 2 * Math.sin(angle);\n const axis: Vec3 = [(m21 - m12) / denom, (m02 - m20) / denom, (m10 - m01) / denom];\n return { axis: vecNormalize(axis), angleDeg };\n}\n\n/**\n * Cylindrical bend patch swept by the fold. Built as a hollow tube (outer R+T,\n * inner R) along +Y, intersected with the angular wedge for the fold. For an up\n * bend the axis sits above the base (sweep from −Z toward the flange); for a down\n * bend it sits below (sweep from +Z toward the flange).\n */\nfunction buildBendPatch(\n axisOrigin: Vec3,\n thetaDeg: number,\n r: number,\n width: number,\n thickness: number,\n direction: 'up' | 'down'\n): Result<ValidSolid> {\n const outerR = r + thickness;\n\n const outer = cylinder(outerR, width, { at: axisOrigin, axis: [0, 1, 0] });\n let tube: Solid = outer;\n if (r > 1e-9) {\n const inner = cylinder(r, width, { at: axisOrigin, axis: [0, 1, 0] });\n const carved = cut(outer, inner);\n if (!carved.ok) return carved;\n tube = carved.value;\n }\n\n const wedge = buildWedge(axisOrigin, thetaDeg, outerR, width, direction);\n if (!wedge.ok) return wedge;\n return intersect(tube, wedge.value) as Result<ValidSolid>;\n}\n\n/**\n * Convex angular wedge (≤180°) isolating the fold sweep. The inner arc starts at\n * the base contact (straight down −Z for an up bend, straight up +Z for a down\n * bend) and sweeps to the flange. Built as the intersection of the +X half-space\n * through the bend axis with that half-space rotated by the fold; the tube\n * intersection trims it to the true annular sector.\n */\nfunction buildWedge(\n axisOrigin: Vec3,\n thetaDeg: number,\n outerR: number,\n width: number,\n direction: 'up' | 'down'\n): Result<Solid> {\n const span = outerR * 2 + 2;\n const margin = 1;\n\n const blockA = box(span, width + 2 * margin, 2 * span);\n const halfA: Solid = translate(blockA, [\n axisOrigin[0],\n axisOrigin[1] - margin,\n axisOrigin[2] - span,\n ]);\n\n // Up bends sweep from −Z (rotate +X start plane by +(180−θ)); down bends mirror\n // about the axis, sweeping from +Z (rotate by −(180−θ)).\n const sign = direction === 'up' ? 1 : -1;\n const halfB = rotate(halfA, sign * (180 - thetaDeg), { at: axisOrigin, axis: [0, 1, 0] });\n\n return intersect(halfA, halfB);\n}\n\n/** The flange flat, built lying along +X past the bend, then folded to angle θ. */\nfunction buildFlangeFlat(\n axisOrigin: Vec3,\n thetaDeg: number,\n width: number,\n thickness: number,\n length: number,\n direction: 'up' | 'down'\n): Solid {\n // Unfolded the flat is coplanar with the base sheet; for an up bend it lies in\n // Z∈[0,T] folding up (rotate −θ about +Y sends +X toward +Z); for a down bend it\n // lies in Z∈[−T,0] folding down (rotate +θ sends +X toward −Z).\n if (direction === 'up') {\n const flat = box(length, width, thickness);\n const positioned: Solid = translate(flat, [axisOrigin[0], axisOrigin[1], 0]);\n return rotate(positioned, -thetaDeg, { at: axisOrigin, axis: [0, 1, 0] });\n }\n const flat = box(length, width, thickness);\n const positioned: Solid = translate(flat, [axisOrigin[0], axisOrigin[1], -thickness]);\n return rotate(positioned, thetaDeg, { at: axisOrigin, axis: [0, 1, 0] });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"authorFns.js","sourceRoot":"","sources":["../src/authorFns.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Bounds3D, Solid, ValidSolid } from './types.js';\nimport { cylinder, translate } from './geometryOps.js';\nimport {type Result, type Vec3, ok, err, kernelError, validationError, box, fuse, cut, intersect, rotate, vecAdd, vecSub, vecScale, vecDot, vecCross, vecNormalize} from '@faicad/faijs/api';\nimport type {\n BendFeature,\n BendRule,\n FlangeFeature,\n EdgeRef,\n FlatSide,\n MaterialSpec,\n MiterSpec,\n SheetMetalPart,\n} from './types.js';\nimport { normalizeSolid } from './internal.js';\nimport { ROOT_FLAT_ID, featureTree, type FeatureTree } from './featureTreeFns.js';\n\n/** Authoring options for the base flat the flanges attach to. */\nexport interface BaseFlatSpec {\n /** Extent along the run (+X) axis. */\n length: number;\n /** Extent along the width (+Y) axis. */\n width: number;\n}\n\n/** Which edge a flange folds off (of the base, or of its parent flange). */\nexport type FlangeSide = FlatSide;\n\n/** A single flange to author off an edge of its parent flat. */\nexport interface FlangeSpec {\n id: string;\n /** Flat length measured from the end of the bend along the flange plane. */\n length: number;\n /** Signed fold angle in degrees. */\n angleDeg: number;\n rule: BendRule;\n /** Parent edge to attach to. Default `'xmax'` (the leading +X edge). */\n side?: FlangeSide | undefined;\n /** Fold direction relative to the parent face normal. Default `'up'`. */\n direction?: 'up' | 'down' | undefined;\n /** Id of another flange this flange folds off (its distal edge). Default = base flat. */\n parent?: string | undefined;\n /** Start position along the parent edge. Default `0`. */\n offset?: number | undefined;\n /** Extent along the parent edge. Default = full parent-edge length. */\n width?: number | undefined;\n miter?: MiterSpec | undefined;\n}\n\n/**\n * A seam: a bend connecting two already-authored flats that is intentionally left\n * unfolded (a free edge). Closing the last wall of a box/tube back onto an earlier\n * flat produces a cyclic feature graph; the feature tree turns this edge into a\n * SEAM_CUT, and the unfold leaves the flats connected through the spanning tree.\n */\nexport interface SeamSpec {\n /** Flat id the seam folds from (an authored flange, or `'root'`/`'face-0'` for the base). */\n parent: string;\n /** Flat id the seam meets (must already be authored; `'root'`/`'face-0'` = base). */\n child: string;\n angleDeg: number;\n rule: BendRule;\n}\n\n/** Inputs for {@link authorPart}. */\nexport interface AuthorSpec {\n thickness: number;\n base: BaseFlatSpec;\n flanges: FlangeSpec[];\n material?: MaterialSpec | undefined;\n /** Optional seams that close a profile into a tube/box (left unfolded). */\n seams?: SeamSpec[] | undefined;\n}\n\n/**\n * Stable edge reference for flange attachment. The base flat is `face-0`; every\n * flange face is `face-<n+1>` in authoring order. The leading edge of a flat is\n * `edgeIndex 0`. The reference also carries `parentId`/`side`/`offset`/`extent`\n * so the feature tree and recursive unfold can resolve the exact parent edge a\n * flange folds from without reading topology back out of the B-rep.\n *\n * @param faceIndex - the face index of the flat: `0` for the base, `n+1` for the\n * flange authored in the `n`-th position.\n * @returns an {@link EdgeRef} pointing at the flat's leading edge (`edgeIndex 0`).\n */\nexport function baseEdgeRef(faceIndex: number): EdgeRef {\n return { kind: 'index', faceIndex, edgeIndex: 0 };\n}\n\n/**\n * A flat in the part: the base, or a placed flange face. Each carries the world\n * frame (origin + orthonormal axes) of its top surface so a child flange can be\n * built directly off any of its four edges, at any fold direction.\n */\nexport interface FlatFrame {\n id: string;\n /** Near corner of the flat on its −normal (bottom) surface; the flat spans\n * `thickness` along +n. Local `(x, y)` maps to `origin + x·u + y·v`. */\n origin: Vec3;\n /** In-plane direction; the flat spans `[0, uLen]` along it. */\n u: Vec3;\n /** In-plane direction; the flat spans `[0, vLen]` along it. */\n v: Vec3;\n /** Outward face normal of the top surface (n = u × v). */\n n: Vec3;\n uLen: number;\n vLen: number;\n}\n\n/**\n * Author a sheet-metal part: a base flat plus an arbitrary tree of flanges. Each\n * flange folds off one of the four edges of its parent flat (the base by default,\n * or another flange via `parent`), in the requested direction (up/down), over an\n * optional sub-span of that edge (`offset`/`width`). Returns a {@link SheetMetalPart}\n * carrying the folded 3D solid and the recorded bend feature tree the unfold\n * consumes. All construction stays on the public, OCCT-WASM-safe API.\n *\n * @param spec - the authoring spec: sheet thickness, base flat dimensions, the\n * flange list, optional material, and optional closing seams.\n * @returns a `Result<SheetMetalPart>` — `ok` with the folded part on success, or\n * `err` with a `validationError` for an invalid thickness / base / flange /\n * seam specification.\n */\nexport async function authorPart(spec: AuthorSpec): Promise<Result<SheetMetalPart>> {\n const { thickness } = spec;\n if (!Number.isFinite(thickness) || thickness <= 0) {\n return err(validationError('INVALID_THICKNESS', `thickness must be positive, got ${thickness}`));\n }\n const { length: baseLen, width } = spec.base;\n if (!Number.isFinite(baseLen) || baseLen <= 0) {\n return err(validationError('INVALID_BASE_LENGTH', `base.length must be positive, got ${baseLen}`));\n }\n if (!Number.isFinite(width) || width <= 0) {\n return err(validationError('INVALID_BASE_WIDTH', `base.width must be positive, got ${width}`));\n }\n\n const seen = new Set<string>();\n for (const flange of spec.flanges) {\n // `::` is reserved as the seam-bend id delimiter (`seam::<parent>::<child>`);\n // allowing it in a flange id would make the seam parent/child ambiguous to parse.\n // `root`/`face-0` are reserved sentinels for the base flat — a flange reusing\n // either would silently overwrite the base frame and fold off wrong geometry.\n if (flange.id === '' || flange.id.includes('::') || flange.id === ROOT_FLAT_ID || flange.id === 'face-0') {\n return err(\n validationError('INVALID_FLANGE_ID', `flange id must be non-empty, must not contain '::', and must not reuse the reserved ids 'root'/'face-0', got '${flange.id}'`)\n );\n }\n if (seen.has(flange.id)) {\n return err(validationError('DUPLICATE_FLANGE', `duplicate flange id '${flange.id}'`));\n }\n seen.add(flange.id);\n }\n\n // Two flanges on the same parent edge must not overlap along that edge.\n const overlap = checkEdgeOverlaps(spec.flanges, baseLen, width);\n if (!overlap.ok) return overlap;\n\n const ROOT = ROOT_FLAT_ID;\n const frames = new Map<string, FlatFrame>();\n // Frame origin sits on the sheet's −normal (bottom) surface; the flat spans\n // `thickness` along +n. This matches the canonical assembly, whose z=0 plane is\n // the sheet bottom and whose bend cylinder sits at z = T+r (up) / −r (down).\n frames.set(ROOT, {\n id: ROOT,\n origin: [0, 0, 0],\n u: [1, 0, 0],\n v: [0, 1, 0],\n n: [0, 0, 1],\n uLen: baseLen,\n vLen: width,\n });\n\n let solid: Solid = (await box({ width: baseLen, depth: width, height: thickness })) as Solid;\n const flanges: FlangeFeature[] = [];\n const bends: BendFeature[] = [];\n\n // Author in spec order; a chained flange must follow its parent. Resolve the\n // parent frame by flange id (or the base for a root flange).\n for (const flange of spec.flanges) {\n const parentId = flange.parent ?? ROOT;\n const parentFrame = frames.get(parentId);\n if (parentFrame === undefined) {\n return err(\n validationError('UNKNOWN_PARENT', `flange '${flange.id}' parent '${flange.parent}' not authored yet`)\n );\n }\n const built = await buildFlange(solid, parentFrame, thickness, flange);\n if (!built.ok) return built;\n solid = built.value.solid;\n flanges.push(built.value.flange);\n bends.push(built.value.bend);\n frames.set(flange.id, built.value.childFrame);\n }\n\n for (const seam of spec.seams ?? []) {\n const seamParent = seam.parent === 'face-0' ? ROOT : seam.parent;\n const seamChild = seam.child === 'face-0' ? ROOT : seam.child;\n if (!frames.has(seamParent) || !frames.has(seamChild)) {\n return err(\n validationError('UNKNOWN_SEAM_FLAT', `seam ${seam.parent}↔${seam.child} references an unauthored flat`)\n );\n }\n if (!Number.isFinite(seam.angleDeg) || seam.angleDeg <= 0 || seam.angleDeg > 180) {\n return err(\n validationError('INVALID_SEAM_ANGLE', `seam ${seam.parent}↔${seam.child} angleDeg must be in (0, 180], got ${seam.angleDeg}`)\n );\n }\n if (!Number.isFinite(seam.rule.innerRadius) || seam.rule.innerRadius < 0) {\n return err(\n validationError('INVALID_SEAM_RADIUS', `seam ${seam.parent}↔${seam.child} innerRadius must be non-negative`)\n );\n }\n const parentFrame = frames.get(seamParent) as FlatFrame;\n bends.push({\n id: `seam::${seamParent}::${seamChild}`,\n axisOrigin: [parentFrame.origin[0], parentFrame.origin[1], parentFrame.origin[2]],\n axisDir: [parentFrame.u[0], parentFrame.u[1], parentFrame.u[2]],\n angleDeg: seam.angleDeg,\n direction: 'up',\n rule: seam.rule,\n });\n }\n\n return ok({\n thickness,\n baseLength: baseLen,\n width,\n ...(spec.material !== undefined ? { material: spec.material } : {}),\n flanges,\n bends,\n solid: normalizeSolid(solid),\n });\n}\n\n/**\n * World {@link FlatFrame} of every flat region of an authored part, keyed by region\n * id (`'root'` for the base). Reconstructed from the recorded bend/flange feature\n * tree using the exact same edge/transform/child-frame math {@link authorPart} uses\n * to place the geometry, so a cutout authored in a region's local `(x, y)` lands on\n * the matching folded face. Walks the feature tree in BFS order so a chained\n * flange's parent frame is always known first.\n *\n * @param part - the authored sheet-metal part whose flat regions to resolve.\n * @param tree - optional pre-built {@link FeatureTree}; when omitted the tree is\n * reconstructed from `part` via {@link featureTree}.\n * @returns a `Result<Map<string, FlatFrame>>` — `ok` with a map of region id\n * (`'root'` for the base, otherwise the flange id) to its world {@link FlatFrame},\n * or `err` when a flange's parent frame is missing from the tree.\n */\nexport function worldFrames(\n part: SheetMetalPart,\n tree?: FeatureTree\n): Result<Map<string, FlatFrame>> {\n const frames = new Map<string, FlatFrame>();\n frames.set(ROOT_FLAT_ID, {\n id: ROOT_FLAT_ID,\n origin: [0, 0, 0],\n u: [1, 0, 0],\n v: [0, 1, 0],\n n: [0, 0, 1],\n uLen: part.baseLength,\n vLen: part.width,\n });\n\n const treeResult = tree !== undefined ? ok(tree) : featureTree(part);\n if (!treeResult.ok) return treeResult;\n\n const flangeById = new Map<string, FlangeFeature>();\n for (const f of part.flanges) flangeById.set(f.id, f);\n\n for (const tb of treeResult.value.bends) {\n const flange = flangeById.get(tb.child);\n if (flange === undefined) continue;\n const parent = frames.get(tb.parent);\n if (parent === undefined) {\n return err(validationError('UNKNOWN_PARENT', `worldFrames: parent '${tb.parent}' missing for '${tb.child}'`));\n }\n const side: FlatSide = flange.baseEdge.side ?? 'xmax';\n const direction: 'up' | 'down' = flange.direction ?? 'up';\n const offset = flange.offset ?? flange.baseEdge.offset ?? 0;\n const r = flange.rule.innerRadius;\n const edge = parentEdge(parent, side);\n const sign = direction === 'up' ? 1 : -1;\n const place = frameTransform(edge.dir, edge.out, parent.n, edge.start, offset);\n frames.set(\n flange.id,\n computeChildFrame(flange.id, place, flange.span, flange.angleDeg, part.thickness, r, sign, flange.length)\n );\n }\n\n return ok(frames);\n}\n\n/**\n * Reject two flanges on the same parent edge whose [offset, offset+width] ranges\n * overlap. The edge length a flange's default span fills must be the *resolved*\n * parent-edge length, not the base's: a chained flange folds off another flange\n * whose edges have that flange's own span/length, so keying the default off the\n * base dimensions would compute a bogus span and spuriously reject valid pairs.\n */\nfunction checkEdgeOverlaps(specs: FlangeSpec[], baseLen: number, width: number): Result<void> {\n interface Range {\n id: string;\n lo: number;\n hi: number;\n }\n // Resolved child-frame dims per flange: spanLen along the bend axis, flatLen out.\n // Walked in spec order (a chained flange always follows its parent), mirroring\n // the authoring loop so parent frames are known before their children.\n const dims = new Map<string, { spanLen: number; flatLen: number }>();\n const edgeLenFor = (parentId: string, side: FlatSide): number => {\n const onWidthEdge = side === 'xmax' || side === 'xmin';\n if (parentId === ROOT_FLAT_ID) return onWidthEdge ? width : baseLen;\n const p = dims.get(parentId);\n if (p === undefined) return onWidthEdge ? width : baseLen;\n // Parent flange frame: uLen = its span (xmax/xmin edges), vLen = its length.\n return onWidthEdge ? p.flatLen : p.spanLen;\n };\n\n const byEdge = new Map<string, Range[]>();\n for (const f of specs) {\n const side: FlatSide = f.side ?? 'xmax';\n const parentId = f.parent ?? ROOT_FLAT_ID;\n const key = `${parentId}::${side}`;\n const edgeLen = edgeLenFor(parentId, side);\n const lo = f.offset ?? 0;\n const span = f.width ?? edgeLen;\n const hi = lo + span;\n const list = byEdge.get(key) ?? [];\n for (const r of list) {\n if (lo < r.hi - 1e-9 && r.lo < hi - 1e-9) {\n return err(\n validationError(\n 'OVERLAPPING_FLANGES',\n `flange '${f.id}' overlaps '${r.id}' on edge '${key}' ([${lo}, ${hi}] ∩ [${r.lo}, ${r.hi}])`\n )\n );\n }\n }\n list.push({ id: f.id, lo, hi });\n byEdge.set(key, list);\n dims.set(f.id, { spanLen: span, flatLen: f.length });\n }\n return ok(undefined);\n}\n\ninterface BuiltFlange {\n solid: Solid;\n flange: FlangeFeature;\n bend: BendFeature;\n childFrame: FlatFrame;\n}\n\n/**\n * Build one flange off `parent`'s chosen edge and fuse it to `base`. The flange\n * assembly (cylindrical bend patch + flat) is constructed in a canonical frame\n * (bend axis +Y at the origin, outward run +X, top surface +Z) honouring the\n * up/down fold, then rigidly mapped onto the parent edge's world frame.\n */\nasync function buildFlange(\n base: Solid,\n parent: FlatFrame,\n thickness: number,\n flange: FlangeSpec\n): Promise<Result<BuiltFlange>> {\n if (!Number.isFinite(flange.length) || flange.length <= 0) {\n return err(validationError('INVALID_FLANGE_LENGTH', `flange '${flange.id}' length must be positive`));\n }\n if (!Number.isFinite(flange.angleDeg) || flange.angleDeg <= 0 || flange.angleDeg > 180) {\n return err(\n validationError('INVALID_FLANGE_ANGLE', `flange '${flange.id}' angleDeg must be in (0, 180], got ${flange.angleDeg}`)\n );\n }\n const r = flange.rule.innerRadius;\n if (!Number.isFinite(r) || r < 0) {\n return err(validationError('INVALID_RADIUS', `flange '${flange.id}' innerRadius must be non-negative`));\n }\n\n const side: FlatSide = flange.side ?? 'xmax';\n const direction: 'up' | 'down' = flange.direction ?? 'up';\n const edge = parentEdge(parent, side);\n const offset = flange.offset ?? 0;\n const span = flange.width ?? edge.length;\n if (!Number.isFinite(offset) || offset < -1e-9) {\n return err(validationError('INVALID_OFFSET', `flange '${flange.id}' offset must be non-negative`));\n }\n if (!Number.isFinite(span) || span <= 0) {\n return err(validationError('INVALID_FLANGE_WIDTH', `flange '${flange.id}' width must be positive`));\n }\n if (offset + span > edge.length + 1e-6) {\n return err(\n validationError('FLANGE_OUT_OF_BOUNDS', `flange '${flange.id}' [${offset}, ${offset + span}] exceeds parent edge length ${edge.length}`)\n );\n }\n\n // Canonical assembly: bend axis +Y, outward run +X, top surface +Z, spanning\n // +Y over [0, span]. Up folds toward +Z, down folds below the base plane.\n const canonAxisZ = direction === 'up' ? thickness + r : -r;\n const canonOrigin: Vec3 = [0, 0, canonAxisZ];\n const patch = await buildBendPatch(canonOrigin, flange.angleDeg, r, span, thickness, direction);\n if (!patch.ok) return patch;\n const flat = await buildFlangeFlat(canonOrigin, flange.angleDeg, span, thickness, flange.length, direction);\n\n // World frame the canonical assembly maps onto: bend axis = edge.dir, outward\n // run = edge.out, top normal = parent.n. The bend axis sits at offset along the\n // edge; the canonical contact (axis straight above the base seam) maps onto the\n // parent edge line.\n const place = frameTransform(edge.dir, edge.out, parent.n, edge.start, offset);\n const patchPlaced = await place.solid(patch.value);\n const flatPlaced = await place.solid(flat);\n\n let fused: Solid;\n try {\n const fusedPatch = await fuse(base, patchPlaced);\n fused = (await fuse(fusedPatch, flatPlaced)) as Solid;\n } catch (e) {\n return err(kernelError('FUSE_FAILED', `fuse flange: ${e instanceof Error ? e.message : String(e)}`));\n }\n\n const sign = direction === 'up' ? 1 : -1;\n // Recorded bend axis = the cylinder centre line: parent edge + n·(T+r up | r down).\n const axisOrigin = vecAdd(\n vecAdd(edge.start, vecScale(edge.dir, offset)),\n vecScale(parent.n, canonAxisZ)\n );\n const bend: BendFeature = {\n id: flange.id,\n axisOrigin: [axisOrigin[0], axisOrigin[1], axisOrigin[2]],\n axisDir: [edge.dir[0], edge.dir[1], edge.dir[2]],\n angleDeg: flange.angleDeg,\n direction,\n rule: flange.rule,\n };\n\n const childFrame = computeChildFrame(flange.id, place, span, flange.angleDeg, thickness, r, sign, flange.length);\n\n // True folded AABB of the whole flange (bend patch + flat) in world space.\n // Computed from the real placed geometry so chained flanges — whose bend axis\n // sits off the z=0 base plane — get a correct box, not the z=0-flattened one a\n // purely analytic re-fold would produce. The collision check reuses this.\n const foldedBounds = flangeFoldedBounds(childFrame, edge, offset, span, parent.n, canonAxisZ, thickness);\n\n const flangeFeature: FlangeFeature = {\n id: flange.id,\n baseEdge: {\n kind: 'index',\n faceIndex: parent.id === ROOT_FLAT_ID ? 0 : -1,\n edgeIndex: 0,\n parentId: parent.id,\n side,\n offset,\n extent: span,\n },\n length: flange.length,\n span,\n offset,\n angleDeg: flange.angleDeg,\n direction,\n rule: flange.rule,\n foldedBounds,\n ...(flange.miter !== undefined ? { miter: flange.miter } : {}),\n };\n\n return ok({ solid: fused, flange: flangeFeature, bend, childFrame });\n}\n\ninterface ParentEdge {\n /** Direction along the edge (the bend axis). */\n dir: Vec3;\n /** Outward in-plane direction the flange runs (perpendicular to dir). */\n out: Vec3;\n /** Start corner of the edge (offset 0). */\n start: Vec3;\n /** Edge length. */\n length: number;\n}\n\n/**\n * Resolve one of the four edges of a flat frame. The bend axis `dir` is chosen so\n * the canonical assembly maps onto it by a proper rotation: `out × dir = n`, i.e.\n * `dir = n × out`. `start` is the edge endpoint from which `dir` runs along the\n * edge, so the flange spans `start + offset·dir` to `start + (offset+span)·dir`.\n */\nfunction parentEdge(f: FlatFrame, side: FlatSide): ParentEdge {\n const o = f.origin;\n const uTop = vecAdd(o, vecScale(f.u, f.uLen));\n const vTop = vecAdd(o, vecScale(f.v, f.vLen));\n const uvTop = vecAdd(uTop, vecScale(f.v, f.vLen));\n\n let out: Vec3;\n let length: number;\n let a: Vec3;\n let b: Vec3;\n switch (side) {\n case 'xmax':\n out = f.u;\n length = f.vLen;\n a = uTop;\n b = uvTop;\n break;\n case 'xmin':\n out = vecScale(f.u, -1);\n length = f.vLen;\n a = o;\n b = vTop;\n break;\n case 'ymax':\n out = f.v;\n length = f.uLen;\n a = vTop;\n b = uvTop;\n break;\n case 'ymin':\n out = vecScale(f.v, -1);\n length = f.uLen;\n a = o;\n b = uTop;\n break;\n }\n const dir = vecNormalize(vecCross(f.n, out));\n // Pick the endpoint from which `dir` points toward the other endpoint.\n const toB = vecSub(b, a);\n const start = vecDot(toB, dir) >= 0 ? a : b;\n return { dir, out, start, length };\n}\n\n/**\n * Frame of the child flange's flat (bottom/−normal surface, near corner), for\n * chaining grandchildren. Derived by folding the canonical flat by ∓θ about the\n * bend axis, then mapping through the same rigid transform that placed the flange.\n */\nfunction computeChildFrame(\n id: string,\n place: PlacedTransform,\n span: number,\n angleDeg: number,\n thickness: number,\n r: number,\n sign: number,\n length: number\n): FlatFrame {\n const theta = (angleDeg * Math.PI) / 180;\n const axisZ = sign > 0 ? thickness + r : -r;\n\n // Canonical fold = rotate by −sign·θ about +Y at pivot [0,0,axisZ]. Run +X and\n // normal +Z fold accordingly; the flat's near-bottom corner ([0,0,0]) rotates\n // about the pivot. (rotate by a about +Y: [x,z]→[x cos a + z sin a, −x sin a + z cos a].)\n const a = -sign * theta;\n const ca = Math.cos(a);\n const sa = Math.sin(a);\n const runC: Vec3 = [ca, 0, -sa];\n const nC: Vec3 = [sa, 0, ca];\n const dz = -axisZ;\n const cornerC: Vec3 = [dz * sa, 0, axisZ + dz * ca];\n\n return {\n id,\n origin: place.point(cornerC),\n u: place.vector([0, 1, 0]),\n v: place.vector(runC),\n n: place.vector(nC),\n uLen: span,\n vLen: length,\n };\n}\n\n/**\n * World-space AABB of a folded flange: the union of the flat box (from its child\n * frame) and the bend region between the parent edge and the bend-axis cylinder.\n * Built from the real placed corners, so a chained flange folded off a vertical\n * wall is bounded correctly rather than collapsed into the z=0 base plane.\n */\nfunction flangeFoldedBounds(\n child: FlatFrame,\n edge: ParentEdge,\n offset: number,\n span: number,\n parentN: Vec3,\n canonAxisZ: number,\n thickness: number\n): Bounds3D {\n const corners: Vec3[] = [];\n // Flat box: child.origin + [0,uLen]·u + [0,vLen]·v + [0,thickness]·n.\n for (const s of [0, child.uLen]) {\n for (const l of [0, child.vLen]) {\n for (const t of [0, thickness]) {\n corners.push(\n vecAdd(\n vecAdd(vecAdd(child.origin, vecScale(child.u, s)), vecScale(child.v, l)),\n vecScale(child.n, t)\n )\n );\n }\n }\n }\n // Bend region: from the parent edge contact (sheet at the seam) out to the bend\n // axis line, over the flange span. Captures the cylindrical patch's footprint.\n const edgeBase = vecAdd(edge.start, vecScale(edge.dir, offset));\n const axisLine = vecAdd(edgeBase, vecScale(parentN, canonAxisZ));\n for (const s of [0, span]) {\n const along = vecScale(edge.dir, s);\n corners.push(vecAdd(edgeBase, along));\n corners.push(vecAdd(vecAdd(edgeBase, along), vecScale(parentN, thickness)));\n corners.push(vecAdd(axisLine, along));\n }\n return aabbOf(corners);\n}\n\nfunction aabbOf(corners: Vec3[]): Bounds3D {\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\ninterface PlacedTransform {\n solid: (s: Solid) => Promise<Solid>;\n point: (p: Vec3) => Vec3;\n vector: (v: Vec3) => Vec3;\n}\n\n/**\n * Rigid transform mapping the canonical flange assembly (bend axis +Y, run +X,\n * normal +Z, contact at the origin) onto a world edge frame: align +X→`runT`,\n * +Y→`axisT`, +Z→`nT`, then slide the axis to `edgeStart + offset·axisT`.\n */\nfunction frameTransform(\n axisT: Vec3,\n runT: Vec3,\n nT: Vec3,\n edgeStart: Vec3,\n offset: number\n): PlacedTransform {\n // Rotation matrix R with columns [runT | axisT | nT] sends canonical X,Y,Z to\n // the target basis. Convert to axis-angle and rotate about the origin.\n const m: number[] = [\n runT[0], axisT[0], nT[0],\n runT[1], axisT[1], nT[1],\n runT[2], axisT[2], nT[2],\n ];\n const aa = matrixToAxisAngle(m);\n const target = vecAdd(edgeStart, vecScale(axisT, offset));\n const applyR = (v: Vec3): Vec3 =>\n vecAdd(vecAdd(vecScale(runT, v[0]), vecScale(axisT, v[1])), vecScale(nT, v[2]));\n return {\n solid: async (s: Solid): Promise<Solid> => {\n const rotated = aa.angleDeg === 0 ? s : await rotate(s, aa.angleDeg, { at: [0, 0, 0], axis: aa.axis });\n return (await translate(rotated, target)) as Solid;\n },\n point: (p: Vec3) => vecAdd(applyR(p), target),\n vector: applyR,\n };\n}\n\n/** Axis-angle of a 3×3 rotation matrix (row-major). */\nfunction matrixToAxisAngle(m: number[]): { axis: Vec3; angleDeg: number } {\n const m00 = m[0] ?? 0;\n const m01 = m[1] ?? 0;\n const m02 = m[2] ?? 0;\n const m10 = m[3] ?? 0;\n const m11 = m[4] ?? 0;\n const m12 = m[5] ?? 0;\n const m20 = m[6] ?? 0;\n const m21 = m[7] ?? 0;\n const m22 = m[8] ?? 0;\n\n const trace = m00 + m11 + m22;\n const cos = Math.max(-1, Math.min(1, (trace - 1) / 2));\n const angle = Math.acos(cos);\n const angleDeg = (angle * 180) / Math.PI;\n if (angle < 1e-9) return { axis: [0, 0, 1], angleDeg: 0 };\n\n if (Math.PI - angle < 1e-6) {\n // 180°: axis is the column of (R + I) with the largest diagonal.\n const xx = (m00 + 1) / 2;\n const yy = (m11 + 1) / 2;\n const zz = (m22 + 1) / 2;\n let axis: Vec3;\n if (xx >= yy && xx >= zz) {\n const x = Math.sqrt(Math.max(xx, 0));\n axis = [x, (m01 + m10) / (4 * x), (m02 + m20) / (4 * x)];\n } else if (yy >= zz) {\n const y = Math.sqrt(Math.max(yy, 0));\n axis = [(m01 + m10) / (4 * y), y, (m12 + m21) / (4 * y)];\n } else {\n const z = Math.sqrt(Math.max(zz, 0));\n axis = [(m02 + m20) / (4 * z), (m12 + m21) / (4 * z), z];\n }\n return { axis: vecNormalize(axis), angleDeg: 180 };\n }\n\n const denom = 2 * Math.sin(angle);\n const axis: Vec3 = [(m21 - m12) / denom, (m02 - m20) / denom, (m10 - m01) / denom];\n return { axis: vecNormalize(axis), angleDeg };\n}\n\n/**\n * Cylindrical bend patch swept by the fold. Built as a hollow tube (outer R+T,\n * inner R) along +Y, intersected with the angular wedge for the fold. For an up\n * bend the axis sits above the base (sweep from −Z toward the flange); for a down\n * bend it sits below (sweep from +Z toward the flange).\n */\nasync function buildBendPatch(\n axisOrigin: Vec3,\n thetaDeg: number,\n r: number,\n width: number,\n thickness: number,\n direction: 'up' | 'down'\n): Promise<Result<ValidSolid>> {\n const outerR = r + thickness;\n try {\n const outer = await cylinder(outerR, width, { at: axisOrigin, axis: [0, 1, 0] });\n let tube: Solid = outer as Solid;\n if (r > 1e-9) {\n const inner = await cylinder(r, width, { at: axisOrigin, axis: [0, 1, 0] });\n tube = (await cut(outer, inner)) as Solid;\n }\n\n const wedge = await buildWedge(axisOrigin, thetaDeg, outerR, width, direction);\n if (!wedge.ok) return wedge;\n return ok((await intersect(tube, wedge.value)) as ValidSolid);\n } catch (e) {\n return err(kernelError('BEND_PATCH_FAILED', `build bend patch: ${e instanceof Error ? e.message : String(e)}`));\n }\n}\n\n/**\n * Convex angular wedge (≤180°) isolating the fold sweep. The inner arc starts at\n * the base contact (straight down −Z for an up bend, straight up +Z for a down\n * bend) and sweeps to the flange. Built as the intersection of the +X half-space\n * through the bend axis with that half-space rotated by the fold; the tube\n * intersection trims it to the true annular sector.\n */\nasync function buildWedge(\n axisOrigin: Vec3,\n thetaDeg: number,\n outerR: number,\n width: number,\n direction: 'up' | 'down'\n): Promise<Result<Solid>> {\n const span = outerR * 2 + 2;\n const margin = 1;\n try {\n const blockA = (await box({ width: span, depth: width + 2 * margin, height: 2 * span })) as Solid;\n const halfA: Solid = (await translate(blockA, [\n axisOrigin[0],\n axisOrigin[1] - margin,\n axisOrigin[2] - span,\n ])) as Solid;\n\n // Up bends sweep from −Z (rotate +X start plane by +(180−θ)); down bends mirror\n // about the axis, sweeping from +Z (rotate by −(180−θ)).\n const sign = direction === 'up' ? 1 : -1;\n const halfB = await rotate(halfA, sign * (180 - thetaDeg), { at: axisOrigin, axis: [0, 1, 0] });\n\n return ok((await intersect(halfA, halfB)) as Solid);\n } catch (e) {\n return err(kernelError('WEDGE_FAILED', `build wedge: ${e instanceof Error ? e.message : String(e)}`));\n }\n}\n\n/** The flange flat, built lying along +X past the bend, then folded to angle θ. */\nasync function buildFlangeFlat(\n axisOrigin: Vec3,\n thetaDeg: number,\n width: number,\n thickness: number,\n length: number,\n direction: 'up' | 'down'\n): Promise<Solid> {\n // Unfolded the flat is coplanar with the base sheet; for an up bend it lies in\n // Z∈[0,T] folding up (rotate −θ about +Y sends +X toward +Z); for a down bend it\n // lies in Z∈[−T,0] folding down (rotate +θ sends +X toward −Z).\n if (direction === 'up') {\n const flat = (await box({ width: length, depth: width, height: thickness })) as Solid;\n const positioned: Solid = (await translate(flat, [axisOrigin[0], axisOrigin[1], 0])) as Solid;\n return (await rotate(positioned, -thetaDeg, { at: axisOrigin, axis: [0, 1, 0] })) as Solid;\n }\n const flat = (await box({ width: length, depth: width, height: thickness })) as Solid;\n const positioned: Solid = (await translate(flat, [axisOrigin[0], axisOrigin[1], -thickness])) as Solid;\n return (await rotate(positioned, thetaDeg, { at: axisOrigin, axis: [0, 1, 0] })) as Solid;\n}\n"]}
|
package/dist/bendTableFns.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bendTableFns.d.ts","sourceRoot":"","sources":["../src/bendTableFns.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"bendTableFns.d.ts","sourceRoot":"","sources":["../src/bendTableFns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,MAAM,EAA2B,MAAM,mBAAmB,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAI9D;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,GAAG,WAAW,CAAC;IAChC,IAAI,EAAE,YAAY,EAAE,CAAC;CACtB;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAE/D,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CA+BrE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAG9D;AAsJD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAC/C,MAAM,CAAC,MAAM,CAAC,CAwChB"}
|
package/dist/bendTableFns.js
CHANGED