@faicad/faijs 0.17.0 → 0.18.2
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/api/api-namespace.js +2 -2
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +64 -26
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/brep-mirror/booleanFns.d.ts.map +1 -1
- package/dist/api/brep-mirror/booleanFns.js +11 -6
- package/dist/api/brep-mirror/booleanFns.js.map +1 -1
- package/dist/api/brep-mirror/topologyFns.d.ts.map +1 -1
- package/dist/api/brep-mirror/topologyFns.js +4 -1
- package/dist/api/brep-mirror/topologyFns.js.map +1 -1
- package/dist/api/chamfer.d.ts +12 -8
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +52 -23
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +69 -15
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/generated/operations.js +5 -5
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/script-face-manifest.js +12 -12
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/sketching.js +1 -1
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/topology.js +7 -7
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/index.d.ts +2 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +1 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/profile-wire.d.ts +3 -3
- package/dist/api/internal/profile-wire.js +3 -3
- package/dist/api/internal/profile-wire.js.map +1 -1
- package/dist/api/loft.d.ts +3 -3
- package/dist/api/loft.js +3 -3
- package/dist/api/loft.js.map +1 -1
- package/dist/api/profile.d.ts +93 -0
- package/dist/api/profile.d.ts.map +1 -0
- package/dist/api/profile.js +276 -0
- package/dist/api/profile.js.map +1 -0
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +15 -14
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +20 -15
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/sweep.d.ts +2 -2
- package/dist/api/sweep.js +2 -2
- package/dist/api/sweep.js.map +1 -1
- package/dist/api/thicken.d.ts +3 -3
- package/dist/api/thicken.js +3 -3
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/transform.d.ts +12 -8
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +62 -32
- package/dist/api/transform.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +28 -1
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +12 -0
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/types.d.ts +1 -1
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +463 -91
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.d.ts +2 -1
- package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.js +48 -12
- package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
- package/dist/brepkit-kernel/multi-version-test.d.ts +40 -0
- package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -0
- package/dist/brepkit-kernel/multi-version-test.js +89 -0
- package/dist/brepkit-kernel/multi-version-test.js.map +1 -0
- package/dist/lang/symbol-table.generated.d.ts +1 -1
- package/dist/lang/symbol-table.generated.js +1 -1
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts +3 -1
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +73 -29
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/package.json +2 -3
package/dist/api/sweep.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* occt-only)⇒ 平台 op:defineOp 声明 `engines: ['occt']`(D11)。
|
|
7
7
|
*
|
|
8
8
|
* 为什么手写而不走生成投影:与 `api/loft.ts` 同因——截面最常见来源是
|
|
9
|
-
* `cad.
|
|
9
|
+
* `cad.profile(...)`(产出 **face**),需「面 → 外环」输入适配
|
|
10
10
|
* (`internal/profile-wire.ts` 的唯一步径)。脊柱容忍 face(FCStd 翻译把
|
|
11
11
|
* 脊柱基对象 sketch 整圈外廓当路径)。
|
|
12
12
|
*
|
|
@@ -41,7 +41,7 @@ export interface SweepOptions {
|
|
|
41
41
|
* @param opts - 扫掠配置(frenet / mode / tolerance 等)。type:SweepOptions required:false
|
|
42
42
|
* @example
|
|
43
43
|
* const path = cad.wire([[0, 0, 0], [0, 0, 50]])
|
|
44
|
-
* const section = cad.
|
|
44
|
+
* const section = cad.profile({ contours: [{ segments: [
|
|
45
45
|
* { kind: 'line', x1: -4, y1: -4, x2: 4, y2: -4 },
|
|
46
46
|
* { kind: 'line', x1: 4, y1: -4, x2: 4, y2: 4 },
|
|
47
47
|
* { kind: 'line', x1: 4, y1: 4, x2: -4, y2: 4 },
|
package/dist/api/sweep.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* occt-only)⇒ 平台 op:defineOp 声明 `engines: ['occt']`(D11)。
|
|
7
7
|
*
|
|
8
8
|
* 为什么手写而不走生成投影:与 `api/loft.ts` 同因——截面最常见来源是
|
|
9
|
-
* `cad.
|
|
9
|
+
* `cad.profile(...)`(产出 **face**),需「面 → 外环」输入适配
|
|
10
10
|
* (`internal/profile-wire.ts` 的唯一步径)。脊柱容忍 face(FCStd 翻译把
|
|
11
11
|
* 脊柱基对象 sketch 整圈外廓当路径)。
|
|
12
12
|
*
|
|
@@ -67,7 +67,7 @@ function sweepBrep(profile, spine, opts) {
|
|
|
67
67
|
* @param opts - 扫掠配置(frenet / mode / tolerance 等)。type:SweepOptions required:false
|
|
68
68
|
* @example
|
|
69
69
|
* const path = cad.wire([[0, 0, 0], [0, 0, 50]])
|
|
70
|
-
* const section = cad.
|
|
70
|
+
* const section = cad.profile({ contours: [{ segments: [
|
|
71
71
|
* { kind: 'line', x1: -4, y1: -4, x2: 4, y2: -4 },
|
|
72
72
|
* { kind: 'line', x1: 4, y1: -4, x2: 4, y2: 4 },
|
|
73
73
|
* { kind: 'line', x1: 4, y1: 4, x2: -4, y2: 4 },
|
package/dist/api/sweep.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/api/sweep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAevD,+DAA+D;AAC/D,SAAS,SAAS,CAAC,OAAc,EAAE,KAAY,EAAE,IAAmB;IAClE,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IAC7F,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;IACpF,iCAAiC;IACjC,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC1C,MAAM,CAAC,GAAG,eAAe,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO,CAAe,CAAA;IAChD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;IACxD,CAAC;YAAS,CAAC;QACT,0CAA0C;QAC1C,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC;gBAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC;gBAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,OAAO;IACb,IAAI,CAAC,OAAc,EAAE,KAAY,EAAE,IAAmB;QACpD,OAAO,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,wCAAwC,EAAgB;CAC9F,CAAC,CAAA","sourcesContent":["/**\n * stdlib sweep — 扫掠:截面沿脊柱路径生成扫掠体(手写平台 op,Phase 4 → G5 core 直连)\n *\n * @platform occt — 实现走 core 自有 `brep-mirror/sweepFns.ts#sweepBrep`\n * (occt-wasm simplePipe / sweepPipeShell;engine-method-map 里 `sweep` 为\n * occt-only)⇒ 平台 op:defineOp 声明 `engines: ['occt']`(D11)。\n *\n * 为什么手写而不走生成投影:与 `api/loft.ts` 同因——截面最常见来源是\n * `cad.
|
|
1
|
+
{"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/api/sweep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAevD,+DAA+D;AAC/D,SAAS,SAAS,CAAC,OAAc,EAAE,KAAY,EAAE,IAAmB;IAClE,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IAC7F,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;IACpF,iCAAiC;IACjC,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC1C,MAAM,CAAC,GAAG,eAAe,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO,CAAe,CAAA;IAChD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;IACxD,CAAC;YAAS,CAAC;QACT,0CAA0C;QAC1C,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC;gBAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC;gBAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,OAAO;IACb,IAAI,CAAC,OAAc,EAAE,KAAY,EAAE,IAAmB;QACpD,OAAO,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,wCAAwC,EAAgB;CAC9F,CAAC,CAAA","sourcesContent":["/**\n * stdlib sweep — 扫掠:截面沿脊柱路径生成扫掠体(手写平台 op,Phase 4 → G5 core 直连)\n *\n * @platform occt — 实现走 core 自有 `brep-mirror/sweepFns.ts#sweepBrep`\n * (occt-wasm simplePipe / sweepPipeShell;engine-method-map 里 `sweep` 为\n * occt-only)⇒ 平台 op:defineOp 声明 `engines: ['occt']`(D11)。\n *\n * 为什么手写而不走生成投影:与 `api/loft.ts` 同因——截面最常见来源是\n * `cad.profile(...)`(产出 **face**),需「面 → 外环」输入适配\n * (`internal/profile-wire.ts` 的唯一步径)。脊柱容忍 face(FCStd 翻译把\n * 脊柱基对象 sketch 整圈外廓当路径)。\n *\n * core-decouple G5:vendored `sweep`(brepjs)替换为 brep-mirror 自有实现直连,\n * 产物经 `fromBrep` 收养(替代 l3-bridge adoptEntity)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { fromBrep } from '../shape'\nimport { solidToShape } from '../brep/brep-ops'\nimport { sweepBrep as selfhostedSweep } from './brep-mirror/sweepFns'\nimport { toProfileWireView } from './internal/profile-wire'\nimport { unwrapResult } from './internal/result-unwrap'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/** 扫掠配置(与 vendored SweepOptions 同形;本文件自持,去 brepjs 依赖)。 */\nexport interface SweepOptions {\n /** Frenet 参考系(默认 false)。 */\n frenet?: boolean\n /** 扫掠模式:'simple'(MakePipe)或 undefined(PipeShell)。 */\n mode?: 'simple'\n /** 过渡模式:仅支持默认 'right'(selfhost 后限制,见 sweepFns)。 */\n transitionMode?: string\n /** 公差等其余 vendored 字段(保留以兼容调用方)。 */\n tolerance?: number\n}\n\n/** BREP 路径:截面沿脊柱扫掠(wire 视图 → brep-mirror 直连 → fromBrep 收养)。 */\nfunction sweepBrep(profile: Shape, spine: Shape, opts?: SweepOptions): Shape {\n if (!profile) throw new Error('E_SWEEP_NO_PROFILE: sweep requires a profile (section) shape')\n if (!spine) throw new Error('E_SWEEP_NO_SPINE: sweep requires a spine (path) shape')\n // 截面 / 脊柱:wire 直用;面取外环(孔环不参与扫掠)。\n const profileWire = toProfileWireView(profile)\n const spineWire = toProfileWireView(spine)\n const r = selfhostedSweep(profileWire, spineWire, opts ?? {}, false)\n const h = unwrapResult(r, 'sweep') as BrepHandle\n const kernel = getBrepApi()\n try {\n return fromBrep(solidToShape(kernel, h), { solid: h })\n } finally {\n // 面→外环产出的 wire 是 arena 新句柄(曲线借用不 release)\n if (!profileWire.borrowed) {\n try { kernel.release(profileWire.wrapped) } catch { /* 已释放 */ }\n }\n if (!spineWire.borrowed) {\n try { kernel.release(spineWire.wrapped) } catch { /* 已释放 */ }\n }\n }\n}\n\n/**\n * 扫掠:截面沿脊柱路径生成扫掠体。\n * @group 特征\n * @inputs 2\n * @async true\n * @qual ok\n * @name sweep\n * @note 平台 op:仅 occt 引擎(BRepOffsetAPI_MakePipeShell / MakePipe)。截面接受\n * wire 或面(面取其外环);脊柱必须为 wire。非 occt 引擎执行前报错;\n * brep_mock 不拦截。`shellMode` 不暴露(元组产物跨不过单产物边界)。\n * @returns Shape 扫掠体。\n * @param profile - 截面几何(wire 或面;面取其外环)。type:Shape required:true\n * @param spine - 脊柱路径(wire)。type:Shape required:true\n * @param opts - 扫掠配置(frenet / mode / tolerance 等)。type:SweepOptions required:false\n * @example\n * const path = cad.wire([[0, 0, 0], [0, 0, 50]])\n * const section = cad.profile({ contours: [{ segments: [\n * { kind: 'line', x1: -4, y1: -4, x2: 4, y2: -4 },\n * { kind: 'line', x1: 4, y1: -4, x2: 4, y2: 4 },\n * { kind: 'line', x1: 4, y1: 4, x2: -4, y2: 4 },\n * { kind: 'line', x1: -4, y1: 4, x2: -4, y2: -4 },\n * ] }] })\n * const body = await cad.sweep(section, path)\n */\nexport const sweep = defineOp({\n name: 'sweep',\n brep(profile: Shape, spine: Shape, opts?: SweepOptions) {\n return sweepBrep(profile, spine, opts)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: 'swept-body face vocabulary not defined' } as Provenance,\n})\n"]}
|
package/dist/api/thicken.d.ts
CHANGED
|
@@ -16,13 +16,13 @@ import type { Shape } from '../mesh/types.js';
|
|
|
16
16
|
* @async true
|
|
17
17
|
* @qual ok
|
|
18
18
|
* @name thicken
|
|
19
|
-
* @note 平台 op:仅 occt 引擎(BRepOffset)。输入为面/壳 Shape(如 cad.
|
|
19
|
+
* @note 平台 op:仅 occt 引擎(BRepOffset)。输入为面/壳 Shape(如 cad.profile 产物);
|
|
20
20
|
* 正厚度沿法向、负厚度反向。非 occt 引擎执行前报错;brep_mock 不拦截。
|
|
21
21
|
* @returns Shape 加厚后的实体。
|
|
22
|
-
* @param input - 面/壳几何(cad.
|
|
22
|
+
* @param input - 面/壳几何(cad.profile 产物等)。type:Shape required:true
|
|
23
23
|
* @param thickness - 厚度(mm,≠0;正沿法向,负反向)。type:number required:true
|
|
24
24
|
* @example
|
|
25
|
-
* const face = cad.
|
|
25
|
+
* const face = cad.profile({ contours: [{ segments: [
|
|
26
26
|
* { kind: 'line', x1: -10, y1: -10, x2: 10, y2: -10 },
|
|
27
27
|
* { kind: 'line', x1: 10, y1: -10, x2: 10, y2: 10 },
|
|
28
28
|
* { kind: 'line', x1: 10, y1: 10, x2: -10, y2: 10 },
|
package/dist/api/thicken.js
CHANGED
|
@@ -20,13 +20,13 @@ import { getOcctKernel } from '../occt-kernel/occtKernel.js';
|
|
|
20
20
|
* @async true
|
|
21
21
|
* @qual ok
|
|
22
22
|
* @name thicken
|
|
23
|
-
* @note 平台 op:仅 occt 引擎(BRepOffset)。输入为面/壳 Shape(如 cad.
|
|
23
|
+
* @note 平台 op:仅 occt 引擎(BRepOffset)。输入为面/壳 Shape(如 cad.profile 产物);
|
|
24
24
|
* 正厚度沿法向、负厚度反向。非 occt 引擎执行前报错;brep_mock 不拦截。
|
|
25
25
|
* @returns Shape 加厚后的实体。
|
|
26
|
-
* @param input - 面/壳几何(cad.
|
|
26
|
+
* @param input - 面/壳几何(cad.profile 产物等)。type:Shape required:true
|
|
27
27
|
* @param thickness - 厚度(mm,≠0;正沿法向,负反向)。type:number required:true
|
|
28
28
|
* @example
|
|
29
|
-
* const face = cad.
|
|
29
|
+
* const face = cad.profile({ contours: [{ segments: [
|
|
30
30
|
* { kind: 'line', x1: -10, y1: -10, x2: 10, y2: -10 },
|
|
31
31
|
* { kind: 'line', x1: 10, y1: -10, x2: 10, y2: 10 },
|
|
32
32
|
* { kind: 'line', x1: 10, y1: 10, x2: -10, y2: 10 },
|
package/dist/api/thicken.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thicken.js","sourceRoot":"","sources":["../../src/api/thicken.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAGzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;IAC9B,IAAI,EAAE,SAAS;IACf,IAAI,CAAC,KAAY,EAAE,SAAiB;QAClC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;QACtF,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAA;QACzF,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAA2B,CAAA;QACtD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;QAC3D,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC,OAAO,CAAC,MAAe,EAAE,SAAS,EAAE,IAAI,CAA0B,CAAA;QAC5F,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAU,CAAA;IACjE,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,4CAA4C,EAAgB;CAClG,CAAC,CAAA","sourcesContent":["/**\n * stdlib thicken — 加厚:把面(或壳)沿法向偏置成等厚实体(手写平台 op,Phase 4 → G5 core 直连)\n *\n * @platform occt — 实现走 occt-wasm 原生 `thicken`(BRepOffsetAPI_MakeThickSolid;\n * engine-method-map 里 `thicken` 为 occt-only)⇒ 平台 op:defineOp 声明\n * `engines: ['occt']`(D11)。\n *\n * core-decouple G5:vendored `thicken`(brepjs modifierFns,thickenWithHistory)\n * 替换为 occt-wasm 原生直连,产物经 `fromBrep` 收养(替代 l3-bridge adoptEntity)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { brepOf, fromBrep } from '../shape'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getOcctKernel } from '../occt-kernel/occtKernel'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/**\n * 加厚:把面(或壳)沿法向偏置成等厚实体。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name thicken\n * @note 平台 op:仅 occt 引擎(BRepOffset)。输入为面/壳 Shape(如 cad.
|
|
1
|
+
{"version":3,"file":"thicken.js","sourceRoot":"","sources":["../../src/api/thicken.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAGzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;IAC9B,IAAI,EAAE,SAAS;IACf,IAAI,CAAC,KAAY,EAAE,SAAiB;QAClC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;QACtF,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAA;QACzF,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAA2B,CAAA;QACtD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;QAC3D,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC,OAAO,CAAC,MAAe,EAAE,SAAS,EAAE,IAAI,CAA0B,CAAA;QAC5F,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAU,CAAA;IACjE,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,4CAA4C,EAAgB;CAClG,CAAC,CAAA","sourcesContent":["/**\n * stdlib thicken — 加厚:把面(或壳)沿法向偏置成等厚实体(手写平台 op,Phase 4 → G5 core 直连)\n *\n * @platform occt — 实现走 occt-wasm 原生 `thicken`(BRepOffsetAPI_MakeThickSolid;\n * engine-method-map 里 `thicken` 为 occt-only)⇒ 平台 op:defineOp 声明\n * `engines: ['occt']`(D11)。\n *\n * core-decouple G5:vendored `thicken`(brepjs modifierFns,thickenWithHistory)\n * 替换为 occt-wasm 原生直连,产物经 `fromBrep` 收养(替代 l3-bridge adoptEntity)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { brepOf, fromBrep } from '../shape'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getOcctKernel } from '../occt-kernel/occtKernel'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/**\n * 加厚:把面(或壳)沿法向偏置成等厚实体。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name thicken\n * @note 平台 op:仅 occt 引擎(BRepOffset)。输入为面/壳 Shape(如 cad.profile 产物);\n * 正厚度沿法向、负厚度反向。非 occt 引擎执行前报错;brep_mock 不拦截。\n * @returns Shape 加厚后的实体。\n * @param input - 面/壳几何(cad.profile 产物等)。type:Shape required:true\n * @param thickness - 厚度(mm,≠0;正沿法向,负反向)。type:number required:true\n * @example\n * const face = cad.profile({ contours: [{ segments: [\n * { kind: 'line', x1: -10, y1: -10, x2: 10, y2: -10 },\n * { kind: 'line', x1: 10, y1: -10, x2: 10, y2: 10 },\n * { kind: 'line', x1: 10, y1: 10, x2: -10, y2: 10 },\n * { kind: 'line', x1: -10, y1: 10, x2: -10, y2: -10 },\n * ] }] })\n * const solid = await cad.thicken(face, 2)\n */\nexport const thicken = defineOp({\n name: 'thicken',\n brep(input: Shape, thickness: number) {\n if (!input) throw new Error('E_THICKEN_NO_SHAPE: thicken requires a face/shell shape')\n if (typeof thickness !== 'number' || !Number.isFinite(thickness) || thickness === 0) {\n throw new Error('E_THICKEN_BAD_THICKNESS: thicken.thickness must be a non-zero number')\n }\n const kernel = getBrepApi()\n const handle = brepOf(input) as BrepHandle | undefined\n if (!handle) throw new Error('[thicken] input is not BREP')\n const h = getOcctKernel().thicken(handle as never, thickness, 1e-6) as unknown as BrepHandle\n return fromBrep(solidToShape(kernel, h), { solid: h }) as Shape\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: 'thickened-body face vocabulary not defined' } as Provenance,\n})\n"]}
|
package/dist/api/transform.d.ts
CHANGED
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* stdlib transform — 变换对象库函数(translate/rotate_euler/scale/scale3d)
|
|
3
3
|
*
|
|
4
|
-
* 平台分层(narrowing plan Phase 5,D11
|
|
5
|
-
* - `translate` / `scale
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* 平台分层(narrowing plan Phase 5,D11 + 2026-09-28 D 批降级):
|
|
5
|
+
* - `translate` / `scale`:**中立 op**(不再声明 `engines:['occt']`)。BREP 路径按引擎
|
|
6
|
+
* 能力**静态定轨**(读与 dispatchPath 同源的能力集,非运行时探测):
|
|
7
|
+
* - occt(声明 `translateWithHistory` / `scaleWithHistory`)→ 走 face-evolution.ts 的
|
|
8
|
+
* `translateWithHashEvolution` / `scaleWithHashEvolution` 权威面演化(历史路径),
|
|
9
|
+
* 产 hash 面映射并传播 roleTable;
|
|
10
|
+
* - brepkit(未声明该二核函数,但裸 `kernel.translate` / `kernel.scale` 是真实现)→
|
|
11
|
+
* L1 `translateBrep` / `scaleBrep`:几何精确,**另加 identityHashEvolution**。
|
|
12
|
+
* 变换不改变面数/顺序,恒等映射真实成立(非伪造)——挂恒等面演化并传播 roleTable,
|
|
13
|
+
* 选面/命名在降级路径不丢(区别于 boolean/chamfer 这种毁面重造、严禁伪造的情形)。
|
|
9
14
|
* - `rotate_euler` / `scale3d`:**中立 op**——内核无单次 WithHistory 可表达
|
|
10
|
-
* (任意欧拉+pivot /
|
|
11
|
-
*
|
|
15
|
+
* (任意欧拉+pivot / 非等比),走 `rotateBrep` / `scaleBrep` + identity 面演化
|
|
16
|
+
* (只用 L1,跨引擎一致,不声明 engines)。
|
|
12
17
|
*
|
|
13
18
|
* dispatchPath 静态判定 brep/mesh,
|
|
14
19
|
* BREP 路径用 brepOf(input) 取输入实体、fromBrep 登记输出实体。
|
|
15
20
|
*/
|
|
16
21
|
import type { Shape } from '../mesh/types.js';
|
|
17
|
-
/** BREP 路径:变换 solid + 恒等面演化 + 三角化 + fromBrep 登记。 */
|
|
18
22
|
/**
|
|
19
23
|
* Validate translate parameters: `offset` must be a vec3.
|
|
20
24
|
* @param params - the raw translate operation parameters.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/api/transform.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/api/transform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAQ,MAAM,eAAe,CAAA;AAqBhD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAKxE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQvE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQzE;AA0FD;;;;;;;;;;;;;IAaI;AACJ,eAAO,MAAM,SAAS;;CAgBpB,CAAA;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,YAAY;;CAevB,CAAA;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,KAAK;;CAkBhB,CAAA;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO;;CAkBlB,CAAA"}
|
package/dist/api/transform.js
CHANGED
|
@@ -1,27 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* stdlib transform — 变换对象库函数(translate/rotate_euler/scale/scale3d)
|
|
3
3
|
*
|
|
4
|
-
* 平台分层(narrowing plan Phase 5,D11
|
|
5
|
-
* - `translate` / `scale
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* 平台分层(narrowing plan Phase 5,D11 + 2026-09-28 D 批降级):
|
|
5
|
+
* - `translate` / `scale`:**中立 op**(不再声明 `engines:['occt']`)。BREP 路径按引擎
|
|
6
|
+
* 能力**静态定轨**(读与 dispatchPath 同源的能力集,非运行时探测):
|
|
7
|
+
* - occt(声明 `translateWithHistory` / `scaleWithHistory`)→ 走 face-evolution.ts 的
|
|
8
|
+
* `translateWithHashEvolution` / `scaleWithHashEvolution` 权威面演化(历史路径),
|
|
9
|
+
* 产 hash 面映射并传播 roleTable;
|
|
10
|
+
* - brepkit(未声明该二核函数,但裸 `kernel.translate` / `kernel.scale` 是真实现)→
|
|
11
|
+
* L1 `translateBrep` / `scaleBrep`:几何精确,**另加 identityHashEvolution**。
|
|
12
|
+
* 变换不改变面数/顺序,恒等映射真实成立(非伪造)——挂恒等面演化并传播 roleTable,
|
|
13
|
+
* 选面/命名在降级路径不丢(区别于 boolean/chamfer 这种毁面重造、严禁伪造的情形)。
|
|
9
14
|
* - `rotate_euler` / `scale3d`:**中立 op**——内核无单次 WithHistory 可表达
|
|
10
|
-
* (任意欧拉+pivot /
|
|
11
|
-
*
|
|
15
|
+
* (任意欧拉+pivot / 非等比),走 `rotateBrep` / `scaleBrep` + identity 面演化
|
|
16
|
+
* (只用 L1,跨引擎一致,不声明 engines)。
|
|
12
17
|
*
|
|
13
18
|
* dispatchPath 静态判定 brep/mesh,
|
|
14
19
|
* BREP 路径用 brepOf(input) 取输入实体、fromBrep 登记输出实体。
|
|
15
20
|
*/
|
|
16
21
|
import { cad } from '../mesh/index.js';
|
|
17
|
-
import { rotateBrep, scaleBrep, solidToShape } from '../brep/brep-ops.js';
|
|
22
|
+
import { translateBrep, rotateBrep, scaleBrep, solidToShape } from '../brep/brep-ops.js';
|
|
18
23
|
import { identityEvolution, identityHashEvolution, scaleWithHashEvolution, translateWithHashEvolution, } from '../brep/face-evolution.js';
|
|
19
24
|
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
25
|
+
import { getBackends } from '../runtime-state.js';
|
|
26
|
+
import { engineCapabilitySet } from '../cad-runtime/backend-dispatch.js';
|
|
20
27
|
import { fromBrep, brepOf, inputRoleTable } from '../shape.js';
|
|
21
28
|
import { propagateAllOrigins } from '../topology/naming/roles.js';
|
|
22
29
|
import { defineOp } from '../sdk.js';
|
|
23
30
|
import { assertVec3, assertPositiveNumber } from './assert.js';
|
|
24
|
-
/** BREP 路径:变换 solid + 恒等面演化 + 三角化 + fromBrep 登记。 */
|
|
25
31
|
/**
|
|
26
32
|
* Validate translate parameters: `offset` must be a vec3.
|
|
27
33
|
* @param params - the raw translate operation parameters.
|
|
@@ -70,54 +76,82 @@ export function assertScale3dParams(params) {
|
|
|
70
76
|
/**
|
|
71
77
|
* BREP 路径:变换 solid + 面演化 + roleTable 传播 + 三角化 + fromBrep 登记。
|
|
72
78
|
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* `
|
|
76
|
-
*
|
|
79
|
+
* 静态双轨:
|
|
80
|
+
* - 引擎声明 `translateWithHistory` / `scaleWithHistory`(occt)→ 权威历史路径
|
|
81
|
+
* (`translateWithHashEvolution` / `scaleWithHashEvolution`),产内核给出的面映射 + roleTable。
|
|
82
|
+
* - 引擎只声明裸方法(brepkit:裸 `translate`/`scale` 是真实现,但无 `*WithHistory`)→
|
|
83
|
+
* L1 裸调用 + identityHashEvolution。变换是刚体变换、面数/顺序保持不变,恒等映射
|
|
84
|
+
* **真实成立**(非伪造;由 brep/face-evolution.ordering.test.ts 钉住)——因此 brepkit
|
|
85
|
+
* 降级路径保留恒等面演化与 roleTable 传播,选面/命名不因降级而丢失。
|
|
86
|
+
* `rotate_euler` / `scale3d` 走 `rotateBrep` / `scaleBrep` + identity 面演化(既有语义,跨引擎中性)。
|
|
77
87
|
* @param op - the transform operation name.
|
|
78
88
|
* @param input - the input geometry.
|
|
79
89
|
* @param params - the operation parameters.
|
|
80
90
|
* @returns the transformed Shape.
|
|
81
91
|
*/
|
|
82
92
|
function transformBrep(op, input, params) {
|
|
83
|
-
// L1 面:rotateBrep/scaleBrep/identityHashEvolution 只用 L1(D12)。
|
|
93
|
+
// L1 面:translateBrep/rotateBrep/scaleBrep/identityHashEvolution 只用 L1(D12)。
|
|
84
94
|
const kernel = getBrepApi();
|
|
85
95
|
const inputSolid = brepOf(input);
|
|
86
96
|
if (!inputSolid)
|
|
87
97
|
throw new Error('[stdlib/transform] input is not BREP');
|
|
98
|
+
// 静态双轨(无运行时 try-catch 回退——按引擎**声明**的能力集在执行前定轨):
|
|
99
|
+
// - occt(声明 *WithHistory)→ 权威历史路径(产内核面映射 + roleTable)。
|
|
100
|
+
// - brepkit(裸 translate/scale 是真实现,无 *WithHistory)→ L1 裸调用 + identityHashEvolution。
|
|
101
|
+
// 变换不改变面数/顺序,恒等映射真实成立(非伪造),故仍挂恒等面演化与 roleTable 传播。
|
|
102
|
+
const caps = engineCapabilitySet(getBackends().config.brepCapabilities);
|
|
103
|
+
const hasTranslateHistory = caps.has('translateWithHistory');
|
|
104
|
+
const hasScaleHistory = caps.has('scaleWithHistory');
|
|
88
105
|
let resultSolid;
|
|
89
|
-
|
|
106
|
+
// 面演化(hash 键):权威路径用内核映射,降级/中立路径用 identity 恒等映射。
|
|
107
|
+
let historyEvolution;
|
|
90
108
|
if (op === 'translate') {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
109
|
+
if (hasTranslateHistory) {
|
|
110
|
+
// 权威映射:内核 translateWithHistory(1:1 全覆盖,实测见 evolution-bindings.test.ts)
|
|
111
|
+
const r = translateWithHashEvolution(kernel, inputSolid, params.offset);
|
|
112
|
+
resultSolid = r.result;
|
|
113
|
+
historyEvolution = r.evolution;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// brepkit 降级:L1 裸 translate(几何精确)+ identity(变换保面序,真实正确)。
|
|
117
|
+
resultSolid = translateBrep(kernel, inputSolid, params.offset);
|
|
118
|
+
historyEvolution = identityHashEvolution(kernel, inputSolid, resultSolid);
|
|
119
|
+
}
|
|
95
120
|
}
|
|
96
121
|
else if (op === 'scale') {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
122
|
+
if (hasScaleHistory) {
|
|
123
|
+
// 权威映射:内核 scaleWithHistory(仅均匀 —— assertScaleParams 已保证 factor 是 number)
|
|
124
|
+
const r = scaleWithHashEvolution(kernel, inputSolid, params.center ?? [0, 0, 0], params.factor);
|
|
125
|
+
resultSolid = r.result;
|
|
126
|
+
historyEvolution = r.evolution;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// brepkit 降级:L1 裸 scale(几何精确)+ identity(变换保面序,真实正确)。
|
|
130
|
+
const center = params.center ?? [0, 0, 0];
|
|
131
|
+
resultSolid = scaleBrep(kernel, inputSolid, params.factor, center);
|
|
132
|
+
historyEvolution = identityHashEvolution(kernel, inputSolid, resultSolid);
|
|
133
|
+
}
|
|
101
134
|
}
|
|
102
135
|
else {
|
|
103
|
-
// rotate_euler(任意欧拉角+pivot)/ scale3d(非等比):内核无单次 WithHistory 可表达
|
|
136
|
+
// rotate_euler(任意欧拉角+pivot)/ scale3d(非等比):内核无单次 WithHistory 可表达 →
|
|
137
|
+
// L1 rotate/scale + identity 面演化(既有语义,face-evolution.ordering.test.ts 钉住)。
|
|
104
138
|
if (op === 'rotate_euler') {
|
|
105
139
|
resultSolid = rotateBrep(kernel, inputSolid, params.anglesDeg, params.pivot);
|
|
106
140
|
}
|
|
107
141
|
else {
|
|
108
142
|
resultSolid = scaleBrep(kernel, inputSolid, params.factor, params.center);
|
|
109
143
|
}
|
|
110
|
-
|
|
144
|
+
historyEvolution = identityHashEvolution(kernel, inputSolid, resultSolid);
|
|
111
145
|
}
|
|
112
|
-
//
|
|
146
|
+
// 变换面 1:1 保留——沿演化传播 roleTable(所有 origin),跨引擎一致(含 brepkit 降级路径)。
|
|
113
147
|
const inputTable = inputRoleTable(input);
|
|
114
148
|
let roleTable;
|
|
115
149
|
if (inputTable && inputTable.size > 0) {
|
|
116
|
-
roleTable = propagateAllOrigins(inputTable,
|
|
150
|
+
roleTable = propagateAllOrigins(inputTable, historyEvolution);
|
|
117
151
|
}
|
|
118
152
|
return fromBrep(solidToShape(kernel, resultSolid), {
|
|
119
153
|
solid: resultSolid,
|
|
120
|
-
//
|
|
154
|
+
// 变换维护拓扑,面 ordinal 不变 → 挂 identity 面演化(供显示/选面,跨引擎一致)。
|
|
121
155
|
faceEvolution: identityEvolution(kernel, resultSolid),
|
|
122
156
|
roleTable,
|
|
123
157
|
});
|
|
@@ -153,8 +187,6 @@ export const translate = defineOp({
|
|
|
153
187
|
// D11: `translate(p, 10, 0, 0)` == `translate(p, { offset: [10, 0, 0] })`;
|
|
154
188
|
// `offset` is a vec3 slot sitting after the single leading Shape argument.
|
|
155
189
|
slotMap: { keys: ['offset'], vec3Keys: ['offset'], shapeArity: 1 },
|
|
156
|
-
// 平台 op:权威面演化依赖 occt-only translateWithHistory(face-evolution.ts,D3)。
|
|
157
|
-
engines: ['occt'],
|
|
158
190
|
naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
|
|
159
191
|
});
|
|
160
192
|
/**
|
|
@@ -227,8 +259,6 @@ export const scale = defineOp({
|
|
|
227
259
|
// D11(§4.6):`scale(p, 2)` == `scale(p, { factor: 2 })`(标量槽);尾参 options
|
|
228
260
|
// ({center})经 dual-form-args 尾参合并并入。
|
|
229
261
|
slotMap: { keys: ['factor'], shapeArity: 1 },
|
|
230
|
-
// 平台 op:权威面演化依赖 occt-only scaleWithHistory(face-evolution.ts,D3)。
|
|
231
|
-
engines: ['occt'],
|
|
232
262
|
naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
|
|
233
263
|
});
|
|
234
264
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/api/transform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib transform — 变换对象库函数(translate/rotate_euler/scale/scale3d)\n *\n * 平台分层(narrowing plan Phase 5,D11):\n * - `translate` / `scale`:**平台 op(occt)**——权威面演化走\n * `translateWithHistory` / `scaleWithHistory`(occt-only,face-evolution.ts 的\n * translateWithHashEvolution/scaleWithHashEvolution 经 getOcctKernel() 调用)→\n * `engines: ['occt']`。\n * - `rotate_euler` / `scale3d`:**中立 op**——内核无单次 WithHistory 可表达\n * (任意欧拉+pivot / 非等比),退回 `identityHashEvolution` + `rotateBrep`/\n * `scaleBrep`(只用 L1:transform/generalTransform/subShapeHashes),不声明 engines。\n *\n * dispatchPath 静态判定 brep/mesh,\n * BREP 路径用 brepOf(input) 取输入实体、fromBrep 登记输出实体。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { rotateBrep, scaleBrep, solidToShape } from '../brep/brep-ops'\nimport {\n identityEvolution,\n identityHashEvolution,\n scaleWithHashEvolution,\n translateWithHashEvolution,\n} from '../brep/face-evolution'\nimport type { HashEvolution } from '../brep/face-evolution'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\nimport { propagateAllOrigins } from '../topology/naming/roles'\nimport type { RoleTable } from '../topology/naming/types'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { defineOp } from '../sdk'\nimport { assertVec3, assertPositiveNumber } from './assert'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/** BREP 路径:变换 solid + 恒等面演化 + 三角化 + fromBrep 登记。 */\n\n/**\n * Validate translate parameters: `offset` must be a vec3.\n * @param params - the raw translate operation parameters.\n */\nexport function assertTranslateParams(params: Record<string, unknown>): void {\n assertVec3(params.offset, 'translate.offset')\n}\n\n/**\n * Validate rotate_euler parameters: `anglesDeg` must be a vec3, and `pivot`\n * (if provided) must also be a vec3.\n * @param params - the raw rotate_euler operation parameters.\n */\nexport function assertRotateParams(params: Record<string, unknown>): void {\n assertVec3(params.anglesDeg, 'rotate_euler.anglesDeg')\n if (params.pivot !== undefined && params.pivot !== null) {\n assertVec3(params.pivot, 'rotate_euler.pivot')\n }\n}\n\n/**\n * Validate scale parameters (brepjs contract, §4.6 裁决 2): `factor` must be a\n * positive number (uniform). The non-uniform array form belongs to `scale3d` —\n * any `scale(p, { factor: [x,y,z] })` call throws an explicit `E_ARGS_FORM`\n * error pointing at `scale3d` (error hint ≠ compatibility).\n * @param params - the raw scale operation parameters.\n */\nexport function assertScaleParams(params: Record<string, unknown>): void {\n if (Array.isArray(params.factor)) {\n throw new Error(\n '[faijs/args] scale: E_ARGS_FORM: uniform scaling takes a single number ' +\n '(scale(p, s, { center? })). Non-uniform scaling uses scale3d(p, [x,y,z]).',\n )\n }\n assertPositiveNumber(params.factor, 'scale.factor')\n}\n\n/**\n * Validate scale3d parameters (P6: factor locked to Vec3): `factor` must be a\n * vec3. The uniform scalar form belongs to `scale` — any `scale3d(p, 2)` call\n * throws an explicit `E_ARGS_FORM` error pointing at `scale` (§4.6 裁决 2).\n * @param params - the raw scale3d operation parameters.\n */\nexport function assertScale3dParams(params: Record<string, unknown>): void {\n if (typeof params.factor === 'number') {\n throw new Error(\n '[faijs/args] scale3d: E_ARGS_FORM: factor must be a vec3 [x, y, z]. ' +\n 'Uniform scaling now uses scale(p, 2) (§4.6 裁决 2).',\n )\n }\n assertVec3(params.factor, 'scale3d.factor')\n}\n\n/**\n * BREP 路径:变换 solid + 面演化 + roleTable 传播 + 三角化 + fromBrep 登记。\n *\n * Phase 0.3:优先走内核**权威**面演化(`translateWithHistory` / `scaleWithHistory`);\n * 内核无法单次表达的(`rotate_euler` 任意欧拉+pivot、`scale3d` 非等比)退回\n * `identityHashEvolution`,其\"面枚举序号在变换后保持\"的假设由\n * `brep/face-evolution.ordering.test.ts` 实测钉住。\n * @param op - the transform operation name.\n * @param input - the input geometry.\n * @param params - the operation parameters.\n * @returns the transformed Shape.\n */\nfunction transformBrep(op: string, input: Shape, params: Record<string, unknown>): Shape {\n // L1 面:rotateBrep/scaleBrep/identityHashEvolution 只用 L1(D12)。\n const kernel = getBrepApi()\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[stdlib/transform] input is not BREP')\n\n let resultSolid: BrepHandle\n let hashEvolution: HashEvolution\n\n if (op === 'translate') {\n // 权威映射:内核 translateWithHistory(1:1 全覆盖,实测见 evolution-bindings.test.ts)\n const r = translateWithHashEvolution(kernel, inputSolid, params.offset as Vec3)\n resultSolid = r.result\n hashEvolution = r.evolution\n } else if (op === 'scale') {\n // 权威映射:内核 scaleWithHistory(仅均匀 —— assertScaleParams 已保证 factor 是 number)\n const r = scaleWithHashEvolution(\n kernel,\n inputSolid,\n (params.center as Vec3 | undefined) ?? [0, 0, 0],\n params.factor as number,\n )\n resultSolid = r.result\n hashEvolution = r.evolution\n } else {\n // rotate_euler(任意欧拉角+pivot)/ scale3d(非等比):内核无单次 WithHistory 可表达\n if (op === 'rotate_euler') {\n resultSolid = rotateBrep(kernel, inputSolid, params.anglesDeg as Vec3, params.pivot as Vec3 | undefined)\n } else {\n resultSolid = scaleBrep(kernel, inputSolid, params.factor as number | Vec3, params.center as Vec3 | undefined)\n }\n hashEvolution = identityHashEvolution(kernel, inputSolid, resultSolid)\n }\n\n // §2.4/§3.3:刚体变换面 1:1 保留 —— 沿演化传播 roleTable(所有 origin)\n const inputTable = inputRoleTable(input) as RoleTable | undefined\n let roleTable: RoleTable | undefined\n if (inputTable && inputTable.size > 0) {\n roleTable = propagateAllOrigins(inputTable, hashEvolution)\n }\n\n return fromBrep(solidToShape(kernel, resultSolid), {\n solid: resultSolid,\n // 变换不改变拓扑,面 ordinal 不变(与旧路径一致)\n faceEvolution: identityEvolution(kernel, resultSolid),\n roleTable,\n })\n}\n\n/**\n * 平移几何体。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name translate\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 平移后的几何,装配的相对位置靠成员的变换语句表达。\n * @param input - 目标几何。type:Shape required:true\n * @param params.offset - 平移向量(mm)。type:[x,y,z] required:true\n * @example\n * const p1 = cad.translate(part0, { offset: [10, 0, 0] })\n */\nexport const translate = defineOp({\n name: 'translate',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/translate] no input geometry')\n assertTranslateParams(params)\n return cad.translate(input, params.offset as Vec3)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/translate] no input geometry')\n assertTranslateParams(params)\n return transformBrep('translate', input, params)\n },\n // D11: `translate(p, 10, 0, 0)` == `translate(p, { offset: [10, 0, 0] })`;\n // `offset` is a vec3 slot sitting after the single leading Shape argument.\n slotMap: { keys: ['offset'], vec3Keys: ['offset'], shapeArity: 1 },\n // 平台 op:权威面演化依赖 occt-only translateWithHistory(face-evolution.ts,D3)。\n engines: ['occt'],\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 绕轴旋转几何体。anglesDeg 为欧拉角(度,XYZ 顺序)。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name rotate_euler\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 旋转后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.anglesDeg - 欧拉角(度,XYZ 顺序)。type:[x,y,z] required:true\n * @param params.pivot - 旋转中心。type:[x,y,z] 默认 原点\n * @example\n * const p2 = cad.rotate_euler(part0, { anglesDeg: [0, 0, 45] })\n * const p3 = cad.rotate_euler(part0, { anglesDeg: [0, 0, 45], pivot: [0,0,0] })\n */\nexport const rotate_euler = defineOp({\n name: 'rotate_euler',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/rotate_euler] no input geometry')\n assertRotateParams(params)\n return cad.rotate_euler(input, params.anglesDeg as Vec3, params.pivot as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/rotate_euler] no input geometry')\n assertRotateParams(params)\n return transformBrep('rotate_euler', input, params)\n },\n // D11: `rotate_euler(p, 0, 0, 45)` == `rotate_euler(p, { anglesDeg: [0, 0, 45] })`.\n slotMap: { keys: ['anglesDeg'], vec3Keys: ['anglesDeg'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 等比缩放几何体(brepjs 契约,§4.6 裁决 2)。factor 只收 number;不动点默认\n * 原点(与 vendored `scale(shape, factor, { center? })` 一致),`center` 可选。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name scale\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 缩放后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.factor - 等比缩放系数(> 0)。type:number required:true\n * @param params.center - 缩放不动点(p 保持不动)。type:[x,y,z] 默认 [0,0,0](原点)\n * @example\n * const p4 = cad.scale(part0, 2)\n * const p5 = cad.scale(part0, { factor: 2, center: [10, 0, 0] })\n */\nexport const scale = defineOp({\n name: 'scale',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale] no input geometry')\n assertScaleParams(params)\n return cad.scale(input, params.factor as number, params.center as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale] no input geometry')\n assertScaleParams(params)\n return transformBrep('scale', input, params)\n },\n // L3 schema: factor/center for codegen/UI panels.\n schema: { factor: 'number', center: 'vec3?' },\n // D11(§4.6):`scale(p, 2)` == `scale(p, { factor: 2 })`(标量槽);尾参 options\n // ({center})经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['factor'], shapeArity: 1 },\n // 平台 op:权威面演化依赖 occt-only scaleWithHistory(face-evolution.ts,D3)。\n engines: ['occt'],\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 非等比缩放几何体(faijs 语义,§1.4.4 裁决 2)。factor 定死 vec3 — 等比缩放请用\n * `scale(p, s)`,`scale3d(p, [x,y,z])` 才可非等比。`center` 为不动点(默认原点)。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name scale3d\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 缩放后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.factor - 三轴缩放系数(均 > 0)。type:[x,y,z] required:true\n * @param params.center - 缩放不动点。type:[x,y,z] 默认 [0,0,0](原点)\n * @example\n * const p4 = cad.scale3d(part0, { factor: [2, 1, 1] })\n * const p5 = cad.scale3d(part0, [2, 1, 1], { center: [10, 0, 0] })\n */\nexport const scale3d = defineOp({\n name: 'scale3d',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale3d] no input geometry')\n assertScale3dParams(params)\n return cad.scale3d(input, params.factor as Vec3, params.center as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale3d] no input geometry')\n assertScale3dParams(params)\n return transformBrep('scale3d', input, params)\n },\n // L3 schema: factor/center for codegen/UI panels.\n schema: { factor: 'vec3', center: 'vec3?' },\n // D11(裁决 2):`scale3d(p, [1,2,3])` == `scale3d(p, { factor: [1,2,3] })`;\n // 标量 factor(如 `scale(p, 2)`)由 assertScale3dParams 拒绝并提示 `scale`。\n slotMap: { keys: ['factor'], vec3Keys: ['factor'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/api/transform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib transform — 变换对象库函数(translate/rotate_euler/scale/scale3d)\n *\n * 平台分层(narrowing plan Phase 5,D11 + 2026-09-28 D 批降级):\n * - `translate` / `scale`:**中立 op**(不再声明 `engines:['occt']`)。BREP 路径按引擎\n * 能力**静态定轨**(读与 dispatchPath 同源的能力集,非运行时探测):\n * - occt(声明 `translateWithHistory` / `scaleWithHistory`)→ 走 face-evolution.ts 的\n * `translateWithHashEvolution` / `scaleWithHashEvolution` 权威面演化(历史路径),\n * 产 hash 面映射并传播 roleTable;\n * - brepkit(未声明该二核函数,但裸 `kernel.translate` / `kernel.scale` 是真实现)→\n * L1 `translateBrep` / `scaleBrep`:几何精确,**另加 identityHashEvolution**。\n * 变换不改变面数/顺序,恒等映射真实成立(非伪造)——挂恒等面演化并传播 roleTable,\n * 选面/命名在降级路径不丢(区别于 boolean/chamfer 这种毁面重造、严禁伪造的情形)。\n * - `rotate_euler` / `scale3d`:**中立 op**——内核无单次 WithHistory 可表达\n * (任意欧拉+pivot / 非等比),走 `rotateBrep` / `scaleBrep` + identity 面演化\n * (只用 L1,跨引擎一致,不声明 engines)。\n *\n * dispatchPath 静态判定 brep/mesh,\n * BREP 路径用 brepOf(input) 取输入实体、fromBrep 登记输出实体。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { translateBrep, rotateBrep, scaleBrep, solidToShape } from '../brep/brep-ops'\nimport {\n identityEvolution,\n identityHashEvolution,\n scaleWithHashEvolution,\n translateWithHashEvolution,\n} from '../brep/face-evolution'\nimport type { HashEvolution } from '../brep/face-evolution'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { getBackends } from '../runtime-state'\nimport { engineCapabilitySet } from '../cad-runtime/backend-dispatch'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\nimport { propagateAllOrigins } from '../topology/naming/roles'\nimport type { RoleTable } from '../topology/naming/types'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { defineOp } from '../sdk'\nimport { assertVec3, assertPositiveNumber } from './assert'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/**\n * Validate translate parameters: `offset` must be a vec3.\n * @param params - the raw translate operation parameters.\n */\nexport function assertTranslateParams(params: Record<string, unknown>): void {\n assertVec3(params.offset, 'translate.offset')\n}\n\n/**\n * Validate rotate_euler parameters: `anglesDeg` must be a vec3, and `pivot`\n * (if provided) must also be a vec3.\n * @param params - the raw rotate_euler operation parameters.\n */\nexport function assertRotateParams(params: Record<string, unknown>): void {\n assertVec3(params.anglesDeg, 'rotate_euler.anglesDeg')\n if (params.pivot !== undefined && params.pivot !== null) {\n assertVec3(params.pivot, 'rotate_euler.pivot')\n }\n}\n\n/**\n * Validate scale parameters (brepjs contract, §4.6 裁决 2): `factor` must be a\n * positive number (uniform). The non-uniform array form belongs to `scale3d` —\n * any `scale(p, { factor: [x,y,z] })` call throws an explicit `E_ARGS_FORM`\n * error pointing at `scale3d` (error hint ≠ compatibility).\n * @param params - the raw scale operation parameters.\n */\nexport function assertScaleParams(params: Record<string, unknown>): void {\n if (Array.isArray(params.factor)) {\n throw new Error(\n '[faijs/args] scale: E_ARGS_FORM: uniform scaling takes a single number ' +\n '(scale(p, s, { center? })). Non-uniform scaling uses scale3d(p, [x,y,z]).',\n )\n }\n assertPositiveNumber(params.factor, 'scale.factor')\n}\n\n/**\n * Validate scale3d parameters (P6: factor locked to Vec3): `factor` must be a\n * vec3. The uniform scalar form belongs to `scale` — any `scale3d(p, 2)` call\n * throws an explicit `E_ARGS_FORM` error pointing at `scale` (§4.6 裁决 2).\n * @param params - the raw scale3d operation parameters.\n */\nexport function assertScale3dParams(params: Record<string, unknown>): void {\n if (typeof params.factor === 'number') {\n throw new Error(\n '[faijs/args] scale3d: E_ARGS_FORM: factor must be a vec3 [x, y, z]. ' +\n 'Uniform scaling now uses scale(p, 2) (§4.6 裁决 2).',\n )\n }\n assertVec3(params.factor, 'scale3d.factor')\n}\n\n/**\n * BREP 路径:变换 solid + 面演化 + roleTable 传播 + 三角化 + fromBrep 登记。\n *\n * 静态双轨:\n * - 引擎声明 `translateWithHistory` / `scaleWithHistory`(occt)→ 权威历史路径\n * (`translateWithHashEvolution` / `scaleWithHashEvolution`),产内核给出的面映射 + roleTable。\n * - 引擎只声明裸方法(brepkit:裸 `translate`/`scale` 是真实现,但无 `*WithHistory`)→\n * L1 裸调用 + identityHashEvolution。变换是刚体变换、面数/顺序保持不变,恒等映射\n * **真实成立**(非伪造;由 brep/face-evolution.ordering.test.ts 钉住)——因此 brepkit\n * 降级路径保留恒等面演化与 roleTable 传播,选面/命名不因降级而丢失。\n * `rotate_euler` / `scale3d` 走 `rotateBrep` / `scaleBrep` + identity 面演化(既有语义,跨引擎中性)。\n * @param op - the transform operation name.\n * @param input - the input geometry.\n * @param params - the operation parameters.\n * @returns the transformed Shape.\n */\nfunction transformBrep(op: string, input: Shape, params: Record<string, unknown>): Shape {\n // L1 面:translateBrep/rotateBrep/scaleBrep/identityHashEvolution 只用 L1(D12)。\n const kernel = getBrepApi()\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[stdlib/transform] input is not BREP')\n\n // 静态双轨(无运行时 try-catch 回退——按引擎**声明**的能力集在执行前定轨):\n // - occt(声明 *WithHistory)→ 权威历史路径(产内核面映射 + roleTable)。\n // - brepkit(裸 translate/scale 是真实现,无 *WithHistory)→ L1 裸调用 + identityHashEvolution。\n // 变换不改变面数/顺序,恒等映射真实成立(非伪造),故仍挂恒等面演化与 roleTable 传播。\n const caps = engineCapabilitySet(getBackends().config.brepCapabilities)\n const hasTranslateHistory = caps.has('translateWithHistory')\n const hasScaleHistory = caps.has('scaleWithHistory')\n\n let resultSolid: BrepHandle\n // 面演化(hash 键):权威路径用内核映射,降级/中立路径用 identity 恒等映射。\n let historyEvolution: HashEvolution\n\n if (op === 'translate') {\n if (hasTranslateHistory) {\n // 权威映射:内核 translateWithHistory(1:1 全覆盖,实测见 evolution-bindings.test.ts)\n const r = translateWithHashEvolution(kernel, inputSolid, params.offset as Vec3)\n resultSolid = r.result\n historyEvolution = r.evolution\n } else {\n // brepkit 降级:L1 裸 translate(几何精确)+ identity(变换保面序,真实正确)。\n resultSolid = translateBrep(kernel, inputSolid, params.offset as Vec3)\n historyEvolution = identityHashEvolution(kernel, inputSolid, resultSolid)\n }\n } else if (op === 'scale') {\n if (hasScaleHistory) {\n // 权威映射:内核 scaleWithHistory(仅均匀 —— assertScaleParams 已保证 factor 是 number)\n const r = scaleWithHashEvolution(\n kernel,\n inputSolid,\n (params.center as Vec3 | undefined) ?? [0, 0, 0],\n params.factor as number,\n )\n resultSolid = r.result\n historyEvolution = r.evolution\n } else {\n // brepkit 降级:L1 裸 scale(几何精确)+ identity(变换保面序,真实正确)。\n const center = (params.center as Vec3 | undefined) ?? [0, 0, 0]\n resultSolid = scaleBrep(kernel, inputSolid, params.factor as number, center)\n historyEvolution = identityHashEvolution(kernel, inputSolid, resultSolid)\n }\n } else {\n // rotate_euler(任意欧拉角+pivot)/ scale3d(非等比):内核无单次 WithHistory 可表达 →\n // L1 rotate/scale + identity 面演化(既有语义,face-evolution.ordering.test.ts 钉住)。\n if (op === 'rotate_euler') {\n resultSolid = rotateBrep(kernel, inputSolid, params.anglesDeg as Vec3, params.pivot as Vec3 | undefined)\n } else {\n resultSolid = scaleBrep(kernel, inputSolid, params.factor as number | Vec3, params.center as Vec3 | undefined)\n }\n historyEvolution = identityHashEvolution(kernel, inputSolid, resultSolid)\n }\n\n // 变换面 1:1 保留——沿演化传播 roleTable(所有 origin),跨引擎一致(含 brepkit 降级路径)。\n const inputTable = inputRoleTable(input) as RoleTable | undefined\n let roleTable: RoleTable | undefined\n if (inputTable && inputTable.size > 0) {\n roleTable = propagateAllOrigins(inputTable, historyEvolution)\n }\n\n return fromBrep(solidToShape(kernel, resultSolid), {\n solid: resultSolid,\n // 变换维护拓扑,面 ordinal 不变 → 挂 identity 面演化(供显示/选面,跨引擎一致)。\n faceEvolution: identityEvolution(kernel, resultSolid),\n roleTable,\n })\n}\n\n/**\n * 平移几何体。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name translate\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 平移后的几何,装配的相对位置靠成员的变换语句表达。\n * @param input - 目标几何。type:Shape required:true\n * @param params.offset - 平移向量(mm)。type:[x,y,z] required:true\n * @example\n * const p1 = cad.translate(part0, { offset: [10, 0, 0] })\n */\nexport const translate = defineOp({\n name: 'translate',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/translate] no input geometry')\n assertTranslateParams(params)\n return cad.translate(input, params.offset as Vec3)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/translate] no input geometry')\n assertTranslateParams(params)\n return transformBrep('translate', input, params)\n },\n // D11: `translate(p, 10, 0, 0)` == `translate(p, { offset: [10, 0, 0] })`;\n // `offset` is a vec3 slot sitting after the single leading Shape argument.\n slotMap: { keys: ['offset'], vec3Keys: ['offset'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 绕轴旋转几何体。anglesDeg 为欧拉角(度,XYZ 顺序)。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name rotate_euler\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 旋转后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.anglesDeg - 欧拉角(度,XYZ 顺序)。type:[x,y,z] required:true\n * @param params.pivot - 旋转中心。type:[x,y,z] 默认 原点\n * @example\n * const p2 = cad.rotate_euler(part0, { anglesDeg: [0, 0, 45] })\n * const p3 = cad.rotate_euler(part0, { anglesDeg: [0, 0, 45], pivot: [0,0,0] })\n */\nexport const rotate_euler = defineOp({\n name: 'rotate_euler',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/rotate_euler] no input geometry')\n assertRotateParams(params)\n return cad.rotate_euler(input, params.anglesDeg as Vec3, params.pivot as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/rotate_euler] no input geometry')\n assertRotateParams(params)\n return transformBrep('rotate_euler', input, params)\n },\n // D11: `rotate_euler(p, 0, 0, 45)` == `rotate_euler(p, { anglesDeg: [0, 0, 45] })`.\n slotMap: { keys: ['anglesDeg'], vec3Keys: ['anglesDeg'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 等比缩放几何体(brepjs 契约,§4.6 裁决 2)。factor 只收 number;不动点默认\n * 原点(与 vendored `scale(shape, factor, { center? })` 一致),`center` 可选。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name scale\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 缩放后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.factor - 等比缩放系数(> 0)。type:number required:true\n * @param params.center - 缩放不动点(p 保持不动)。type:[x,y,z] 默认 [0,0,0](原点)\n * @example\n * const p4 = cad.scale(part0, 2)\n * const p5 = cad.scale(part0, { factor: 2, center: [10, 0, 0] })\n */\nexport const scale = defineOp({\n name: 'scale',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale] no input geometry')\n assertScaleParams(params)\n return cad.scale(input, params.factor as number, params.center as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale] no input geometry')\n assertScaleParams(params)\n return transformBrep('scale', input, params)\n },\n // L3 schema: factor/center for codegen/UI panels.\n schema: { factor: 'number', center: 'vec3?' },\n // D11(§4.6):`scale(p, 2)` == `scale(p, { factor: 2 })`(标量槽);尾参 options\n // ({center})经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['factor'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 非等比缩放几何体(faijs 语义,§1.4.4 裁决 2)。factor 定死 vec3 — 等比缩放请用\n * `scale(p, s)`,`scale3d(p, [x,y,z])` 才可非等比。`center` 为不动点(默认原点)。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name scale3d\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 缩放后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.factor - 三轴缩放系数(均 > 0)。type:[x,y,z] required:true\n * @param params.center - 缩放不动点。type:[x,y,z] 默认 [0,0,0](原点)\n * @example\n * const p4 = cad.scale3d(part0, { factor: [2, 1, 1] })\n * const p5 = cad.scale3d(part0, [2, 1, 1], { center: [10, 0, 0] })\n */\nexport const scale3d = defineOp({\n name: 'scale3d',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale3d] no input geometry')\n assertScale3dParams(params)\n return cad.scale3d(input, params.factor as Vec3, params.center as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale3d] no input geometry')\n assertScale3dParams(params)\n return transformBrep('scale3d', input, params)\n },\n // L3 schema: factor/center for codegen/UI panels.\n schema: { factor: 'vec3', center: 'vec3?' },\n // D11(裁决 2):`scale3d(p, [1,2,3])` == `scale3d(p, { factor: [1,2,3] })`;\n // 标量 factor(如 `scale(p, 2)`)由 assertScale3dParams 拒绝并提示 `scale`。\n slotMap: { keys: ['factor'], vec3Keys: ['factor'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brepkit.d.ts","sourceRoot":"","sources":["../../../../src/brep/engine/adapters/brepkit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,uBAAuB;AACvB,eAAO,MAAM,sBAAsB,YAAY,CAAA;AAE/C;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"brepkit.d.ts","sourceRoot":"","sources":["../../../../src/brep/engine/adapters/brepkit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,uBAAuB;AACvB,eAAO,MAAM,sBAAsB,YAAY,CAAA;AAE/C;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CA+F/D;AAED,wDAAwD;AACxD,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC,CAGhE"}
|
|
@@ -60,13 +60,18 @@ export async function registerBrepkitBrepEngine() {
|
|
|
60
60
|
'intersect',
|
|
61
61
|
'makeCylinder',
|
|
62
62
|
// Phase 3:brepkitKernel 真实现接线 5 个(wasm 导出同/可映射语义)——
|
|
63
|
-
// makeEllipsoid/makeTorus/makeVertex/mirror/shell;
|
|
63
|
+
// makeEllipsoid/makeTorus/makeVertex/mirror/shell;section/split 语义
|
|
64
64
|
// 不匹配(wasm 平面式)→ 保持 unsupported 不声明(engine-switch-p3 断言)。
|
|
65
|
+
// extrude 已于 B 批接线(makeRectangle 产出 knownFace → extrude 沿向量挤出,:446)。
|
|
65
66
|
'makeEllipsoid',
|
|
66
67
|
'makeTorus',
|
|
67
68
|
'makeVertex',
|
|
68
69
|
'mirror',
|
|
69
70
|
'shell',
|
|
71
|
+
// 2026-09-26 B 批:brepkitKernel.hullFromPoints 真实现接线
|
|
72
|
+
// (→ kernel.convexHull,brepkitKernel.ts:477)——convexHull op 由
|
|
73
|
+
// engines:['occt'] 降级为 capabilities:['hullFromPoints'],故如实声明。
|
|
74
|
+
'hullFromPoints',
|
|
70
75
|
'makeFace',
|
|
71
76
|
'makeLineEdge',
|
|
72
77
|
// Phase 2:brepkit wasm 已导出 pattern 三方法并已接线(brepkitKernel.ts 阵列族)。
|
|
@@ -79,6 +84,28 @@ export async function registerBrepkitBrepEngine() {
|
|
|
79
84
|
'surfaceType',
|
|
80
85
|
'translate',
|
|
81
86
|
'uvBounds',
|
|
87
|
+
// 2026-09-26 A 批:brepkitKernel 已实现 dispose(GC 型 no-op,:226)与
|
|
88
|
+
// copyShape(调 kernel.copySolid,:397)——此前未声明导致 torus/pattern 族/
|
|
89
|
+
// clone 在静态判定被拒。声明 ⊆ 实例(engine-switch-p3 守卫)。
|
|
90
|
+
'dispose',
|
|
91
|
+
'copyShape',
|
|
92
|
+
// 2026-09-26 B 批:brepkitKernel 真实现 makeRectangle(:436)/extrude(:446,要求
|
|
93
|
+
// knownFace 输入——makeRectangle 产出的面已登记进 knownFaces,makeBaseBox 链可用)/
|
|
94
|
+
// transform(:563)/generalTransform(:572,二者均经 cloneAndTransform 深拷贝+原地仿射,
|
|
95
|
+
// 与 occt STEP-safe BRepBuilderAPI_Transform 同语义)。声明 ⊆ 实例(engine-switch-p3 守卫)。
|
|
96
|
+
'makeRectangle',
|
|
97
|
+
'extrude',
|
|
98
|
+
'transform',
|
|
99
|
+
'generalTransform',
|
|
100
|
+
// 2026-09-26 C batch (section/drill/pocket/boss/mirrorJoin downgrade):
|
|
101
|
+
// brepkitKernel real wiring - sectionByPlane(:492 returns face group, occt returns
|
|
102
|
+
// edge/wire group; semantic diff noted), makeCompound(:668 virtual compound for non-solid
|
|
103
|
+
// children), located(:566 drill cylinder placement), getSubShapes(:775 face selection).
|
|
104
|
+
// declared <= instance (engine-switch-p3 guard).
|
|
105
|
+
'sectionByPlane',
|
|
106
|
+
'makeCompound',
|
|
107
|
+
'located',
|
|
108
|
+
'getSubShapes',
|
|
82
109
|
],
|
|
83
110
|
heal: true,
|
|
84
111
|
directEdit: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brepkit.js","sourceRoot":"","sources":["../../../../src/brep/engine/adapters/brepkit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAA;AAExG,OAAO,EAAE,uBAAuB,EAA0B,MAAM,uCAAuC,CAAA;AAEvG,uBAAuB;AACvB,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAA;AAE/C;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,MAAM,UAAU,GAAG,MAAM,uBAAuB,EAAE,CAAA;IAClD,IAAI,sBAAsB,CAAC,sBAAsB,CAAC;QAAE,OAAM;IAC1D,kBAAkB,CAAC,sBAAsB,EAAE,KAAK,IAAyB,EAAE,CAAC,CAAC;QAC3E,EAAE,EAAE,sBAAsB;QAC1B,UAAU;QACV,YAAY,EAAE;YACZ,KAAK,EAAE,IAAI;YACX,kCAAkC;YAClC,oEAAoE;YACpE,uDAAuD;YACvD,+DAA+D;YAC/D,wCAAwC;YACxC,SAAS,EAAE,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,CAAC;YACrE,OAAO,EAAE;gBACP,gBAAgB;gBAChB,+EAA+E;gBAC/E,uEAAuE;gBACvE,gBAAgB;gBAChB,4DAA4D;gBAC5D,oEAAoE;gBACpE,WAAW;gBACX,gBAAgB;gBAChB,WAAW;gBACX,iBAAiB;gBACjB,qBAAqB;gBACrB,iBAAiB;gBACjB,mBAAmB;gBACnB,cAAc;gBACd,KAAK;gBACL,UAAU;gBACV,MAAM;gBACN,SAAS;gBACT,UAAU;gBACV,WAAW;gBACX,WAAW;gBACX,cAAc;gBACd,oDAAoD;gBACpD,
|
|
1
|
+
{"version":3,"file":"brepkit.js","sourceRoot":"","sources":["../../../../src/brep/engine/adapters/brepkit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAA;AAExG,OAAO,EAAE,uBAAuB,EAA0B,MAAM,uCAAuC,CAAA;AAEvG,uBAAuB;AACvB,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAA;AAE/C;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,MAAM,UAAU,GAAG,MAAM,uBAAuB,EAAE,CAAA;IAClD,IAAI,sBAAsB,CAAC,sBAAsB,CAAC;QAAE,OAAM;IAC1D,kBAAkB,CAAC,sBAAsB,EAAE,KAAK,IAAyB,EAAE,CAAC,CAAC;QAC3E,EAAE,EAAE,sBAAsB;QAC1B,UAAU;QACV,YAAY,EAAE;YACZ,KAAK,EAAE,IAAI;YACX,kCAAkC;YAClC,oEAAoE;YACpE,uDAAuD;YACvD,+DAA+D;YAC/D,wCAAwC;YACxC,SAAS,EAAE,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,CAAC;YACrE,OAAO,EAAE;gBACP,gBAAgB;gBAChB,+EAA+E;gBAC/E,uEAAuE;gBACvE,gBAAgB;gBAChB,4DAA4D;gBAC5D,oEAAoE;gBACpE,WAAW;gBACX,gBAAgB;gBAChB,WAAW;gBACX,iBAAiB;gBACjB,qBAAqB;gBACrB,iBAAiB;gBACjB,mBAAmB;gBACnB,cAAc;gBACd,KAAK;gBACL,UAAU;gBACV,MAAM;gBACN,SAAS;gBACT,UAAU;gBACV,WAAW;gBACX,WAAW;gBACX,cAAc;gBACd,oDAAoD;gBACpD,mEAAmE;gBACnE,0DAA0D;gBAC1D,qEAAqE;gBACrE,eAAe;gBACf,WAAW;gBACX,YAAY;gBACZ,QAAQ;gBACR,OAAO;gBACP,oDAAoD;gBACpD,8DAA8D;gBAC9D,8DAA8D;gBAC9D,gBAAgB;gBAChB,UAAU;gBACV,cAAc;gBACd,kEAAkE;gBAClE,eAAe;gBACf,iBAAiB;gBACjB,aAAa;gBACb,OAAO;gBACP,gBAAgB;gBAChB,eAAe;gBACf,aAAa;gBACb,WAAW;gBACX,UAAU;gBACV,6DAA6D;gBAC7D,+DAA+D;gBAC/D,8CAA8C;gBAC9C,SAAS;gBACT,WAAW;gBACX,uEAAuE;gBACvE,oEAAoE;gBACpE,yEAAyE;gBACzE,+EAA+E;gBAC/E,eAAe;gBACf,SAAS;gBACT,WAAW;gBACX,kBAAkB;gBAClB,uEAAuE;gBACvE,mFAAmF;gBACnF,0FAA0F;gBAC1F,wFAAwF;gBACxF,iDAAiD;gBACjD,gBAAgB;gBAChB,cAAc;gBACd,SAAS;gBACT,cAAc;aACf;YACD,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,IAAI;YACtB,UAAU,EAAE,IAAI;YAChB,iBAAiB,EAAE,cAAc;SAClC;KACF,CAAC,CAAC,CAAA;AACL,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC9C,IAAI,aAAa,EAAE;QAAE,OAAM;IAC3B,MAAM,yBAAyB,EAAE,CAAA;AACnC,CAAC","sourcesContent":["/**\n * engine/adapters/brepkit — brepkit BREP 引擎适配器(对照 adapters/occt.ts 形态)\n *\n * 把 createBrepkitPrimitives 包装为 BrepEngine 注册进注册表。业务层只经注册表取\n * 引擎,不直接 import brepkit 初始化函数——引擎本体可整体替换(换适配器即换引擎)。\n *\n * 小程序装配顺序(§6.1):Worker 启动时先 setBrepkitWasmInitFn + 本函数注册,\n * ensureOcctDefaultEngine 的动态 import('occt-wasm') 永不触发。\n */\n\nimport { registerBrepEngine, isBrepEngineRegistered, hasBrepEngine, type BrepEngine } from '../registry'\nimport type { AssertSatisfiesBrepEngineApi } from '../primitives'\nimport { createBrepkitPrimitives, type BrepkitPrimitives } from '../../../brepkit-kernel/brepkitKernel'\n\n/** brepkit 引擎注册 id。 */\nexport const BREPKIT_BREP_ENGINE_ID = 'brepkit'\n\n/**\n * 装配 brepkit BREP 引擎(宿主启动时调用一次,幂等)。\n *\n * 预初始化 createBrepkitPrimitives():wasm 装载完成后立即注册——注册返回后\n * provider 直接返回就绪实例。幂等:已注册则跳过。\n *\n * 能力表(设计文档 §5.2 v1 建议值,随单测逐项校正):\n * evolution 仅覆盖 fuse/cut/fillet(chamferWithHistory 未提供,诚实报错);\n * meshLift/assembly/advSurface 均为 false,命中即静态报错,禁止伪造。\n */\nexport async function registerBrepkitBrepEngine(): Promise<void> {\n const primitives = await createBrepkitPrimitives()\n if (isBrepEngineRegistered(BREPKIT_BREP_ENGINE_ID)) return\n registerBrepEngine(BREPKIT_BREP_ENGINE_ID, async (): Promise<BrepEngine> => ({\n id: BREPKIT_BREP_ENGINE_ID,\n primitives,\n capabilities: {\n exact: true,\n // 面演化:逐核函数如实声明(Phase 0.2,不是族级布尔)。\n // brepkit 只实现 fillet/cut/fuse 三个 *WithHistory,其余(chamfer/intersect/\n // translate/rotate/mirror/scale/shell/offset/thicken)在\n // brepkit-kernel/brepkitKernel.ts:224-537 一律 unsupported(...)。\n // 声明里少写一项 = 让该 op 静默通过静态判定后死在运行时(红线违规)。\n evolution: ['fuseWithHistory', 'cutWithHistory', 'filletWithHistory'],\n methods: [\n 'addHolesInFace',\n // Phase 3:brepkitKernel 真实现映射(wasm getBoundingBox/getSurfaceCenterOfMass 导出)——\n // 能力表可声明;其余 31 个 Phase 3 方法为 unsupported 桩 → 不声明(engine-switch-p3 断言)。\n 'getBoundingBox',\n // Phase 4(narrowing D9):测量族全部接线(surfaceArea→getSurfaceArea、\n // length/wireLength→getLength、volume、centerOfMass)——L1 中立名(D5)如实声明。\n 'getVolume',\n 'getSurfaceArea',\n 'getLength',\n 'getCenterOfMass',\n 'surfaceCenterOfMass',\n 'curveParameters',\n 'curvePointAtParam',\n 'curveTangent',\n 'cut',\n 'fixShape',\n 'fuse',\n 'fuseAll',\n 'hashCode',\n 'healSolid',\n 'intersect',\n 'makeCylinder',\n // Phase 3:brepkitKernel 真实现接线 5 个(wasm 导出同/可映射语义)——\n // makeEllipsoid/makeTorus/makeVertex/mirror/shell;section/split 语义\n // 不匹配(wasm 平面式)→ 保持 unsupported 不声明(engine-switch-p3 断言)。\n // extrude 已于 B 批接线(makeRectangle 产出 knownFace → extrude 沿向量挤出,:446)。\n 'makeEllipsoid',\n 'makeTorus',\n 'makeVertex',\n 'mirror',\n 'shell',\n // 2026-09-26 B 批:brepkitKernel.hullFromPoints 真实现接线\n // (→ kernel.convexHull,brepkitKernel.ts:477)——convexHull op 由\n // engines:['occt'] 降级为 capabilities:['hullFromPoints'],故如实声明。\n 'hullFromPoints',\n 'makeFace',\n 'makeLineEdge',\n // Phase 2:brepkit wasm 已导出 pattern 三方法并已接线(brepkitKernel.ts 阵列族)。\n 'linearPattern',\n 'circularPattern',\n 'gridPattern',\n 'scale',\n 'sewAndSolidify',\n 'surfaceNormal',\n 'surfaceType',\n 'translate',\n 'uvBounds',\n // 2026-09-26 A 批:brepkitKernel 已实现 dispose(GC 型 no-op,:226)与\n // copyShape(调 kernel.copySolid,:397)——此前未声明导致 torus/pattern 族/\n // clone 在静态判定被拒。声明 ⊆ 实例(engine-switch-p3 守卫)。\n 'dispose',\n 'copyShape',\n // 2026-09-26 B 批:brepkitKernel 真实现 makeRectangle(:436)/extrude(:446,要求\n // knownFace 输入——makeRectangle 产出的面已登记进 knownFaces,makeBaseBox 链可用)/\n // transform(:563)/generalTransform(:572,二者均经 cloneAndTransform 深拷贝+原地仿射,\n // 与 occt STEP-safe BRepBuilderAPI_Transform 同语义)。声明 ⊆ 实例(engine-switch-p3 守卫)。\n 'makeRectangle',\n 'extrude',\n 'transform',\n 'generalTransform',\n // 2026-09-26 C batch (section/drill/pocket/boss/mirrorJoin downgrade):\n // brepkitKernel real wiring - sectionByPlane(:492 returns face group, occt returns\n // edge/wire group; semantic diff noted), makeCompound(:668 virtual compound for non-solid\n // children), located(:566 drill cylinder placement), getSubShapes(:775 face selection).\n // declared <= instance (engine-switch-p3 guard).\n 'sectionByPlane',\n 'makeCompound',\n 'located',\n 'getSubShapes',\n ],\n heal: true,\n directEdit: true,\n advSurface: false,\n assembly: false,\n meshLift: false,\n exactMeasurement: true,\n brepExport: true,\n tessellationModel: 'extract-time',\n },\n }))\n}\n\n/** 已注册任何 BREP 引擎则 no-op;否则注册 brepkit(可作为宿主的显式缺省装配点)。 */\nexport async function ensureBrepkitDefaultEngine(): Promise<void> {\n if (hasBrepEngine()) return\n await registerBrepkitBrepEngine()\n}\n\n// §7.8 编译期完整性守卫:brepkit 原语集合必须满足 BrepEngineApi。\n// 实现缺方法或签名不兼容 → tsc 在此报错列出缺失(与 occt 适配器同守卫)。\ntype _AssertBrepkitApi = AssertSatisfiesBrepEngineApi<BrepkitPrimitives>\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"occt.d.ts","sourceRoot":"","sources":["../../../../src/brep/engine/adapters/occt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,2CAA2C;AAC3C,eAAO,MAAM,mBAAmB,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"occt.d.ts","sourceRoot":"","sources":["../../../../src/brep/engine/adapters/occt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,2CAA2C;AAC3C,eAAO,MAAM,mBAAmB,SAAS,CAAA;AAmIzC;;;;;;GAMG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CA0B5D;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAG7D"}
|
|
@@ -132,6 +132,18 @@ const OCCT_METHOD_KINDS = [
|
|
|
132
132
|
'chamferDistAngle',
|
|
133
133
|
'fillet',
|
|
134
134
|
'filletVariable',
|
|
135
|
+
// 2026-09-26 B 批:rotate/applyMatrix 从 engines:[occt] 降级为能力路由后,occt 侧须
|
|
136
|
+
// 如实声明 transform(:228,BRepBuilderAPI_Transform 深拷贝,STEP-safe)/
|
|
137
|
+
// generalTransform(:231,gp_GTrsf)——此前两方法在 primitives 上实现但未登记进能力表。
|
|
138
|
+
'transform',
|
|
139
|
+
'generalTransform',
|
|
140
|
+
// 2026-09-26 C batch: section/drill/pocket/boss/mirrorJoin downgrade - OCCT already implements
|
|
141
|
+
// sectionByPlane(:162)/makeCompound(:285)/located(:229)/getSubShapes(:314) but previously undeclared
|
|
142
|
+
// (engines:[occt] bypassed the gate). Now declared honestly for capability routing.
|
|
143
|
+
'sectionByPlane',
|
|
144
|
+
'makeCompound',
|
|
145
|
+
'located',
|
|
146
|
+
'getSubShapes',
|
|
135
147
|
];
|
|
136
148
|
/**
|
|
137
149
|
* 装配 OCCT BREP 引擎(宿主启动时调用一次,幂等)。
|