@faicad/sheetmetal 0.16.0 → 0.17.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 +32 -0
- package/dist/geometryOps.d.ts.map +1 -0
- package/dist/geometryOps.js +83 -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/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.17.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.17.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"typescript": "*",
|