@faicad/sheetmetal 0.17.0 → 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.
@@ -15,18 +15,39 @@
15
15
  */
16
16
  import type { Shape, Vec3 } from '@faicad/faijs/api';
17
17
  import type { Bounds3D } from './types.js';
18
- /** faijs 风格 rotate:绕过 `at` 的 `axis` 旋转 `angleDeg`°(faijs rotate op 原生签名,直透)。 */
18
+ /**
19
+ * faijs 风格 rotate:绕过 `at` 的 `axis` 旋转 `angleDeg`°(faijs rotate op 原生签名,直透)。
20
+ * @param shape 输入实体
21
+ * @param angleDeg 旋转角度(度)
22
+ * @param opts 旋转中心 `at` 与旋转轴 `axis`
23
+ * @returns 旋转后的实体
24
+ */
19
25
  export declare function rotate(shape: Shape, angleDeg: number, opts: {
20
26
  at: Vec3;
21
27
  axis: Vec3;
22
28
  }): Promise<Shape>;
23
- /** faijs 风格 translate:平移 `offset`(faijs TS 面收 `{ offset }`,此处平铺 Vec3)。 */
29
+ /**
30
+ * faijs 风格 translate:平移 `offset`(faijs TS 面收 `{ offset }`,此处平铺 Vec3)。
31
+ * @param shape 输入实体
32
+ * @param offset 平移向量
33
+ * @returns 平移后的实体
34
+ */
24
35
  export declare function translate(shape: Shape, offset: Vec3): Promise<Shape>;
25
- /** faijs 风格 cylinder:底面圆心 `at`、轴向 `axis` 的圆柱(组合:Z 轴圆柱 → 取向 → 定位)。 */
36
+ /**
37
+ * faijs 风格 cylinder:底面圆心 `at`、轴向 `axis` 的圆柱(组合:Z 轴圆柱 → 取向 → 定位)。
38
+ * @param radius 半径
39
+ * @param height 高度
40
+ * @param opts 底面圆心 `at` 与轴向 `axis`
41
+ * @returns 圆柱实体
42
+ */
26
43
  export declare function cylinder(radius: number, height: number, opts: {
27
44
  at: Vec3;
28
45
  axis: Vec3;
29
46
  }): Promise<Shape>;
30
- /** faijs 风格 getBounds:brep 引擎包围盒组合成 `Bounds3D`(大写字段形态)。 */
47
+ /**
48
+ * faijs 风格 getBounds:brep 引擎包围盒组合成 `Bounds3D`(大写字段形态)。
49
+ * @param shape 输入实体
50
+ * @returns 包围盒(大写字段形态)
51
+ */
31
52
  export declare function getBounds(shape: Shape): Bounds3D;
32
53
  //# sourceMappingURL=geometryOps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"geometryOps.d.ts","sourceRoot":"","sources":["../src/geometryOps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAC,KAAK,EAAE,IAAI,EAAC,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAsC3C,gFAAgF;AAChF,wBAAgB,MAAM,CACpB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC7B,OAAO,CAAC,KAAK,CAAC,CAEhB;AAED,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAEpE;AAED,qEAAqE;AACrE,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC7B,OAAO,CAAC,KAAK,CAAC,CAOhB;AAED,2DAA2D;AAC3D,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAUhD"}
1
+ {"version":3,"file":"geometryOps.d.ts","sourceRoot":"","sources":["../src/geometryOps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAC,KAAK,EAAE,IAAI,EAAC,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAsC3C;;;;;;GAMG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC7B,OAAO,CAAC,KAAK,CAAC,CAEhB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAEpE;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC7B,OAAO,CAAC,KAAK,CAAC,CAOhB;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAUhD"}
@@ -51,15 +51,32 @@ function rotationZTo(axis) {
51
51
  translation: ZERO,
52
52
  };
53
53
  }
54
- /** faijs 风格 rotate:绕过 `at` 的 `axis` 旋转 `angleDeg`°(faijs rotate op 原生签名,直透)。 */
54
+ /**
55
+ * faijs 风格 rotate:绕过 `at` 的 `axis` 旋转 `angleDeg`°(faijs rotate op 原生签名,直透)。
56
+ * @param shape 输入实体
57
+ * @param angleDeg 旋转角度(度)
58
+ * @param opts 旋转中心 `at` 与旋转轴 `axis`
59
+ * @returns 旋转后的实体
60
+ */
55
61
  export function rotate(shape, angleDeg, opts) {
56
62
  return rotateOp(shape, angleDeg, opts);
57
63
  }
58
- /** faijs 风格 translate:平移 `offset`(faijs TS 面收 `{ offset }`,此处平铺 Vec3)。 */
64
+ /**
65
+ * faijs 风格 translate:平移 `offset`(faijs TS 面收 `{ offset }`,此处平铺 Vec3)。
66
+ * @param shape 输入实体
67
+ * @param offset 平移向量
68
+ * @returns 平移后的实体
69
+ */
59
70
  export function translate(shape, offset) {
60
71
  return translateOp(shape, { offset: [offset[0], offset[1], offset[2]] });
61
72
  }
62
- /** faijs 风格 cylinder:底面圆心 `at`、轴向 `axis` 的圆柱(组合:Z 轴圆柱 → 取向 → 定位)。 */
73
+ /**
74
+ * faijs 风格 cylinder:底面圆心 `at`、轴向 `axis` 的圆柱(组合:Z 轴圆柱 → 取向 → 定位)。
75
+ * @param radius 半径
76
+ * @param height 高度
77
+ * @param opts 底面圆心 `at` 与轴向 `axis`
78
+ * @returns 圆柱实体
79
+ */
63
80
  export async function cylinder(radius, height, opts) {
64
81
  // faijs cylinder TS 面为单参对象形态(defineOp 单参装箱:radius/height/at)。
65
82
  const c = await cylinderOp({ radius, height, at: [0, 0, 0] });
@@ -68,7 +85,11 @@ export async function cylinder(radius, height, opts) {
68
85
  const oriented = axisIsZ ? c : await applyMatrix(c, rotationZTo(opts.axis));
69
86
  return translateOp(oriented, { offset: [opts.at[0], opts.at[1], opts.at[2]] });
70
87
  }
71
- /** faijs 风格 getBounds:brep 引擎包围盒组合成 `Bounds3D`(大写字段形态)。 */
88
+ /**
89
+ * faijs 风格 getBounds:brep 引擎包围盒组合成 `Bounds3D`(大写字段形态)。
90
+ * @param shape 输入实体
91
+ * @returns 包围盒(大写字段形态)
92
+ */
72
93
  export function getBounds(shape) {
73
94
  const b = bounds3D(shape);
74
95
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"geometryOps.js","sourceRoot":"","sources":["../src/geometryOps.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * faijs 建模 op 适配层(core-decouple wrapup §2.2)\n *\n * sheetmetal 原 brepjs 调用形态 → faijs op 组合。faijs 建模 op 均为\n * 异步 op(`Promise<Shape>`);本层只做形态适配,不复制任何 brepjs\n * 兼容层(裁决 9)。说明:\n *\n * - `rotate` — faijs 原生 op(绕任意轴 + `at`,签名兼容原调用),直透。\n * - `translate` — faijs TS 面收 `{ offset }`(transform.ts defineOp),\n * 原调用传 Vec3 数组,在此平铺包装。\n * - `cylinder` — faijs `cylinder(radius, height, { at })` 默认 +Z 轴,\n * 原调用带任意 `axis`:组合 = 生成 → `applyMatrix`(Z→axis) → 平移 `at`。\n * - `getBounds` — 由 faijs `bounds3D`(brep 引擎包围盒,`cad.boundingBox`\n * 只读 mesh 载荷、brep 产物空载荷无效)组合成大写字段 `Bounds3D`。\n */\n\nimport {rotate as rotateOp, translate as translateOp, cylinder as cylinderOp, applyMatrix, bounds3D} from '@faicad/faijs/api';\nimport type {Shape, Vec3} from '@faicad/faijs/api';\nimport type { Bounds3D } from './types.js';\n\n/** 把 +Z 轴旋到 `axis`(单位化)的 3×3 线性矩阵 + 零平移(Rodrigues;数学同\n * core brepHelpers.rotationZTo)。返回 `{ linear, translation }` 形态——faijs\n * `applyMatrix` 的 brep 实现(api/brep-mirror/topologyFns.parseMatrixInput)\n * 接受该对象形态;扁平的 3×4 数组会落入数组解构分支导致线性矩阵全为\n * undefined(2026-09-25 实测:applyMatrix 后体积为 0 的根因)。 */\nfunction rotationZTo(axis: readonly [number, number, number]): { linear: number[]; translation: readonly [number, number, number] } {\n const [x, y, z] = axis;\n const len = Math.hypot(x, y, z);\n if (len < 1e-12) throw new Error('[sheetmetal/geometryOps] rotationZTo: zero-length axis');\n const nx = x / len;\n const ny = y / len;\n const nz = z / len;\n const ZERO: readonly [number, number, number] = [0, 0, 0];\n if (Math.abs(nz - 1) < 1e-9) return { linear: [1, 0, 0, 0, 1, 0, 0, 0, 1], translation: ZERO };\n if (Math.abs(nz + 1) < 1e-9) {\n // Z → −Z:绕 X 转 180°。\n return { linear: [1, 0, 0, 0, -1, 0, 0, 0, -1], translation: ZERO };\n }\n const cross = [-ny, nx, 0]; // [0,0,1] × axis\n const crossLen = Math.hypot(...cross);\n const kx = cross[0] / crossLen;\n const ky = cross[1] / crossLen;\n const kz = cross[2] / crossLen;\n const cosA = nz;\n const sinA = Math.hypot(nx, ny);\n const t = 1 - cosA;\n return {\n linear: [\n t * kx * kx + cosA, t * kx * ky - kz * sinA, t * kx * kz + ky * sinA,\n t * kx * ky + kz * sinA, t * ky * ky + cosA, t * ky * kz - kx * sinA,\n t * kx * kz - ky * sinA, t * ky * kz + kx * sinA, t * kz * kz + cosA,\n ],\n translation: ZERO,\n };\n}\n\n/** faijs 风格 rotate:绕过 `at` 的 `axis` 旋转 `angleDeg`°(faijs rotate op 原生签名,直透)。 */\nexport function rotate(\n shape: Shape,\n angleDeg: number,\n opts: { at: Vec3; axis: Vec3 },\n): Promise<Shape> {\n return rotateOp(shape as never, angleDeg, opts as never);\n}\n\n/** faijs 风格 translate:平移 `offset`(faijs TS 面收 `{ offset }`,此处平铺 Vec3)。 */\nexport function translate(shape: Shape, offset: Vec3): Promise<Shape> {\n return translateOp(shape, { offset: [offset[0], offset[1], offset[2]] });\n}\n\n/** faijs 风格 cylinder:底面圆心 `at`、轴向 `axis` 的圆柱(组合:Z 轴圆柱 → 取向 → 定位)。 */\nexport async function cylinder(\n radius: number,\n height: number,\n opts: { at: Vec3; axis: Vec3 },\n): Promise<Shape> {\n // faijs cylinder TS 面为单参对象形态(defineOp 单参装箱:radius/height/at)。\n const c = await cylinderOp({ radius, height, at: [0, 0, 0] });\n const [ax, ay, az] = opts.axis;\n const axisIsZ = ax === 0 && ay === 0 && az > 0;\n const oriented = axisIsZ ? c : await applyMatrix(c as never, rotationZTo(opts.axis) as never);\n return translateOp(oriented, { offset: [opts.at[0], opts.at[1], opts.at[2]] });\n}\n\n/** faijs 风格 getBounds:brep 引擎包围盒组合成 `Bounds3D`(大写字段形态)。 */\nexport function getBounds(shape: Shape): Bounds3D {\n const b = bounds3D(shape);\n return {\n xMin: b.min[0],\n xMax: b.max[0],\n yMin: b.min[1],\n yMax: b.max[1],\n zMin: b.min[2],\n zMax: b.max[2],\n };\n}\n"]}
1
+ {"version":3,"file":"geometryOps.js","sourceRoot":"","sources":["../src/geometryOps.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * faijs 建模 op 适配层(core-decouple wrapup §2.2)\n *\n * sheetmetal 原 brepjs 调用形态 → faijs op 组合。faijs 建模 op 均为\n * 异步 op(`Promise<Shape>`);本层只做形态适配,不复制任何 brepjs\n * 兼容层(裁决 9)。说明:\n *\n * - `rotate` — faijs 原生 op(绕任意轴 + `at`,签名兼容原调用),直透。\n * - `translate` — faijs TS 面收 `{ offset }`(transform.ts defineOp),\n * 原调用传 Vec3 数组,在此平铺包装。\n * - `cylinder` — faijs `cylinder(radius, height, { at })` 默认 +Z 轴,\n * 原调用带任意 `axis`:组合 = 生成 → `applyMatrix`(Z→axis) → 平移 `at`。\n * - `getBounds` — 由 faijs `bounds3D`(brep 引擎包围盒,`cad.boundingBox`\n * 只读 mesh 载荷、brep 产物空载荷无效)组合成大写字段 `Bounds3D`。\n */\n\nimport {rotate as rotateOp, translate as translateOp, cylinder as cylinderOp, applyMatrix, bounds3D} from '@faicad/faijs/api';\nimport type {Shape, Vec3} from '@faicad/faijs/api';\nimport type { Bounds3D } from './types.js';\n\n/** 把 +Z 轴旋到 `axis`(单位化)的 3×3 线性矩阵 + 零平移(Rodrigues;数学同\n * core brepHelpers.rotationZTo)。返回 `{ linear, translation }` 形态——faijs\n * `applyMatrix` 的 brep 实现(api/brep-mirror/topologyFns.parseMatrixInput)\n * 接受该对象形态;扁平的 3×4 数组会落入数组解构分支导致线性矩阵全为\n * undefined(2026-09-25 实测:applyMatrix 后体积为 0 的根因)。 */\nfunction rotationZTo(axis: readonly [number, number, number]): { linear: number[]; translation: readonly [number, number, number] } {\n const [x, y, z] = axis;\n const len = Math.hypot(x, y, z);\n if (len < 1e-12) throw new Error('[sheetmetal/geometryOps] rotationZTo: zero-length axis');\n const nx = x / len;\n const ny = y / len;\n const nz = z / len;\n const ZERO: readonly [number, number, number] = [0, 0, 0];\n if (Math.abs(nz - 1) < 1e-9) return { linear: [1, 0, 0, 0, 1, 0, 0, 0, 1], translation: ZERO };\n if (Math.abs(nz + 1) < 1e-9) {\n // Z → −Z:绕 X 转 180°。\n return { linear: [1, 0, 0, 0, -1, 0, 0, 0, -1], translation: ZERO };\n }\n const cross = [-ny, nx, 0]; // [0,0,1] × axis\n const crossLen = Math.hypot(...cross);\n const kx = cross[0] / crossLen;\n const ky = cross[1] / crossLen;\n const kz = cross[2] / crossLen;\n const cosA = nz;\n const sinA = Math.hypot(nx, ny);\n const t = 1 - cosA;\n return {\n linear: [\n t * kx * kx + cosA, t * kx * ky - kz * sinA, t * kx * kz + ky * sinA,\n t * kx * ky + kz * sinA, t * ky * ky + cosA, t * ky * kz - kx * sinA,\n t * kx * kz - ky * sinA, t * ky * kz + kx * sinA, t * kz * kz + cosA,\n ],\n translation: ZERO,\n };\n}\n\n/**\n * faijs 风格 rotate:绕过 `at` 的 `axis` 旋转 `angleDeg`°(faijs rotate op 原生签名,直透)。\n * @param shape 输入实体\n * @param angleDeg 旋转角度(度)\n * @param opts 旋转中心 `at` 与旋转轴 `axis`\n * @returns 旋转后的实体\n */\nexport function rotate(\n shape: Shape,\n angleDeg: number,\n opts: { at: Vec3; axis: Vec3 },\n): Promise<Shape> {\n return rotateOp(shape as never, angleDeg, opts as never);\n}\n\n/**\n * faijs 风格 translate:平移 `offset`(faijs TS 面收 `{ offset }`,此处平铺 Vec3)。\n * @param shape 输入实体\n * @param offset 平移向量\n * @returns 平移后的实体\n */\nexport function translate(shape: Shape, offset: Vec3): Promise<Shape> {\n return translateOp(shape, { offset: [offset[0], offset[1], offset[2]] });\n}\n\n/**\n * faijs 风格 cylinder:底面圆心 `at`、轴向 `axis` 的圆柱(组合:Z 轴圆柱 → 取向 → 定位)。\n * @param radius 半径\n * @param height 高度\n * @param opts 底面圆心 `at` 与轴向 `axis`\n * @returns 圆柱实体\n */\nexport async function cylinder(\n radius: number,\n height: number,\n opts: { at: Vec3; axis: Vec3 },\n): Promise<Shape> {\n // faijs cylinder TS 面为单参对象形态(defineOp 单参装箱:radius/height/at)。\n const c = await cylinderOp({ radius, height, at: [0, 0, 0] });\n const [ax, ay, az] = opts.axis;\n const axisIsZ = ax === 0 && ay === 0 && az > 0;\n const oriented = axisIsZ ? c : await applyMatrix(c as never, rotationZTo(opts.axis) as never);\n return translateOp(oriented, { offset: [opts.at[0], opts.at[1], opts.at[2]] });\n}\n\n/**\n * faijs 风格 getBounds:brep 引擎包围盒组合成 `Bounds3D`(大写字段形态)。\n * @param shape 输入实体\n * @returns 包围盒(大写字段形态)\n */\nexport function getBounds(shape: Shape): Bounds3D {\n const b = bounds3D(shape);\n return {\n xMin: b.min[0],\n xMax: b.max[0],\n yMin: b.min[1],\n yMax: b.max[1],\n zMin: b.min[2],\n zMax: b.max[2],\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faicad/sheetmetal",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "Sheet-metal CAD domain for faijs — flange authoring, fold/unfold flat patterns (ported from brepjs-sheetmetal)",
5
5
  "keywords": [
6
6
  "sheet-metal",
@@ -30,7 +30,7 @@
30
30
  ],
31
31
  "dependencies": {},
32
32
  "peerDependencies": {
33
- "@faicad/faijs": "^0.17.0"
33
+ "@faicad/faijs": "^0.18.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "typescript": "*",