@faicad/faijs 0.30.9 → 0.31.1
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/align/index.d.ts +64 -0
- package/dist/api/align/index.d.ts.map +1 -0
- package/dist/api/align/index.js +101 -0
- package/dist/api/align/index.js.map +1 -0
- package/dist/api/api-namespace.d.ts +5 -4
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +36 -4
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/boolean-op/index.d.ts +65 -0
- package/dist/api/boolean-op/index.d.ts.map +1 -0
- package/dist/api/boolean-op/index.js +113 -0
- package/dist/api/boolean-op/index.js.map +1 -0
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +15 -27
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/brep-operations/healingFns.d.ts +13 -0
- package/dist/api/brep-operations/healingFns.d.ts.map +1 -1
- package/dist/api/brep-operations/healingFns.js +28 -1
- package/dist/api/brep-operations/healingFns.js.map +1 -1
- package/dist/api/brep-operations/topologyFns.d.ts +27 -6
- package/dist/api/brep-operations/topologyFns.d.ts.map +1 -1
- package/dist/api/brep-operations/topologyFns.js +46 -22
- package/dist/api/brep-operations/topologyFns.js.map +1 -1
- package/dist/api/chamfer.d.ts +5 -4
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +12 -11
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/curve-sketch/index.d.ts.map +1 -1
- package/dist/api/curve-sketch/index.js +9 -3
- package/dist/api/curve-sketch/index.js.map +1 -1
- package/dist/api/draft.d.ts.map +1 -1
- package/dist/api/draft.js +1 -3
- package/dist/api/draft.js.map +1 -1
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +3 -13
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/export-3mf.d.ts +73 -0
- package/dist/api/export-3mf.d.ts.map +1 -0
- package/dist/api/export-3mf.js +121 -0
- package/dist/api/export-3mf.js.map +1 -0
- package/dist/api/export-brep.d.ts +6 -0
- package/dist/api/export-brep.d.ts.map +1 -1
- package/dist/api/export-brep.js +11 -2
- package/dist/api/export-brep.js.map +1 -1
- package/dist/api/export-step.d.ts +67 -0
- package/dist/api/export-step.d.ts.map +1 -0
- package/dist/api/export-step.js +98 -0
- package/dist/api/export-step.js.map +1 -0
- package/dist/api/export-stl.d.ts +8 -0
- package/dist/api/export-stl.d.ts.map +1 -1
- package/dist/api/export-stl.js +23 -8
- package/dist/api/export-stl.js.map +1 -1
- package/dist/api/feature-repair.d.ts +1 -1
- package/dist/api/feature-repair.d.ts.map +1 -1
- package/dist/api/feature-repair.js +1 -7
- package/dist/api/feature-repair.js.map +1 -1
- package/dist/api/fillet-variable.d.ts.map +1 -1
- package/dist/api/fillet-variable.js +0 -1
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +3 -3
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +3 -4
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/operations.js +6 -6
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/script-face-manifest.d.ts +1 -1
- package/dist/api/generated/script-face-manifest.js +3 -3
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +1 -1
- package/dist/api/generated/script-face.js +1 -1
- package/dist/api/generated/script-face.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 +10 -10
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/helix.d.ts +1 -1
- package/dist/api/helix.js +1 -1
- package/dist/api/helix.js.map +1 -1
- package/dist/api/index.d.ts +4 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +16 -4
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +6 -6
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +7 -9
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/export-members.d.ts +80 -0
- package/dist/api/internal/export-members.d.ts.map +1 -0
- package/dist/api/internal/export-members.js +104 -0
- package/dist/api/internal/export-members.js.map +1 -0
- package/dist/api/internal/l3-bridge.d.ts +17 -0
- package/dist/api/internal/l3-bridge.d.ts.map +1 -1
- package/dist/api/internal/l3-bridge.js +23 -1
- package/dist/api/internal/l3-bridge.js.map +1 -1
- package/dist/api/measure-query/index.d.ts +262 -0
- package/dist/api/measure-query/index.d.ts.map +1 -0
- package/dist/api/measure-query/index.js +390 -0
- package/dist/api/measure-query/index.js.map +1 -0
- package/dist/api/pattern.d.ts.map +1 -1
- package/dist/api/pattern.js +0 -3
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/primitives.d.ts +6 -6
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +12 -11
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/profile.d.ts.map +1 -1
- package/dist/api/profile.js +0 -1
- package/dist/api/profile.js.map +1 -1
- package/dist/api/punch-hole.d.ts.map +1 -1
- package/dist/api/punch-hole.js +0 -1
- package/dist/api/punch-hole.js.map +1 -1
- package/dist/api/replicate.d.ts +5 -7
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +18 -56
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/section-by-plane.d.ts.map +1 -1
- package/dist/api/section-by-plane.js +0 -1
- package/dist/api/section-by-plane.js.map +1 -1
- package/dist/api/shell.d.ts +1 -1
- package/dist/api/shell.d.ts.map +1 -1
- package/dist/api/shell.js +11 -2
- package/dist/api/shell.js.map +1 -1
- package/dist/api/sketch-on-face.d.ts +3 -3
- package/dist/api/sketch-on-face.d.ts.map +1 -1
- package/dist/api/sketch-on-face.js +6 -4
- package/dist/api/sketch-on-face.js.map +1 -1
- package/dist/api/sketch-on-plane.d.ts.map +1 -1
- package/dist/api/sketch-on-plane.js +0 -1
- package/dist/api/sketch-on-plane.js.map +1 -1
- package/dist/api/split-by-plane.d.ts.map +1 -1
- package/dist/api/split-by-plane.js +0 -1
- package/dist/api/split-by-plane.js.map +1 -1
- package/dist/api/split.d.ts +1 -1
- package/dist/api/split.js +1 -1
- package/dist/api/split.js.map +1 -1
- package/dist/api/surface/arg-spec.d.ts +3 -12
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +19 -26
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/sweep.d.ts +15 -3
- package/dist/api/sweep.d.ts.map +1 -1
- package/dist/api/sweep.js +5 -3
- package/dist/api/sweep.js.map +1 -1
- package/dist/api/thicken.d.ts.map +1 -1
- package/dist/api/thicken.js +11 -2
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/transform.d.ts +3 -3
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +47 -17
- package/dist/api/transform.js.map +1 -1
- package/dist/boolean/index.d.ts +23 -0
- package/dist/boolean/index.d.ts.map +1 -0
- package/dist/boolean/index.js +27 -0
- package/dist/boolean/index.js.map +1 -0
- package/dist/brep/brep-chain.d.ts +1 -19
- package/dist/brep/brep-chain.d.ts.map +1 -1
- package/dist/brep/brep-chain.js +0 -1
- package/dist/brep/brep-chain.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +4 -1
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +9 -5
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +0 -3
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts +4 -3
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +4 -98
- 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 +0 -144
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/native-history.d.ts +27 -0
- package/dist/brep/engine/native-history.d.ts.map +1 -0
- package/dist/brep/engine/native-history.js +54 -0
- package/dist/brep/engine/native-history.js.map +1 -0
- package/dist/brep/engine/registry.d.ts +2 -4
- package/dist/brep/engine/registry.d.ts.map +1 -1
- package/dist/brep/engine/registry.js +1 -1
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/engine/types.d.ts +35 -77
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/export-model.d.ts +21 -0
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +171 -73
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/export/step.d.ts +17 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +133 -0
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/export/stl.d.ts +22 -1
- package/dist/brep/export/stl.d.ts.map +1 -1
- package/dist/brep/export/stl.js +58 -10
- package/dist/brep/export/stl.js.map +1 -1
- package/dist/brep/export/transform12.d.ts +47 -0
- package/dist/brep/export/transform12.d.ts.map +1 -0
- package/dist/brep/export/transform12.js +87 -0
- package/dist/brep/export/transform12.js.map +1 -0
- package/dist/brep/face-evolution.d.ts +53 -0
- package/dist/brep/face-evolution.d.ts.map +1 -1
- package/dist/brep/face-evolution.js +65 -0
- package/dist/brep/face-evolution.js.map +1 -1
- package/dist/browser-host/index.d.ts +4 -1
- package/dist/browser-host/index.d.ts.map +1 -1
- package/dist/browser-host/index.js +7 -1
- package/dist/browser-host/index.js.map +1 -1
- package/dist/browser.d.ts +4 -8
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +4 -26
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +13 -58
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +22 -80
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/content-key.d.ts +3 -3
- package/dist/cad-runtime/content-key.js +3 -3
- package/dist/cad-runtime/content-key.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +28 -0
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +33 -12
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +44 -48
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +6 -11
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +3 -20
- package/dist/define-op.js.map +1 -1
- package/dist/env-agnostic.d.ts +2 -2
- package/dist/env-agnostic.d.ts.map +1 -1
- package/dist/env-agnostic.js +1 -1
- package/dist/env-agnostic.js.map +1 -1
- package/dist/index.d.ts +13 -64
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -75
- package/dist/index.js.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +17 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +17 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/mesh/index.d.ts +18 -23
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +18 -20
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +42 -14
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +77 -13
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/threemf-loader.d.ts +38 -4
- package/dist/mesh/threemf-loader.d.ts.map +1 -1
- package/dist/mesh/threemf-loader.js +115 -34
- package/dist/mesh/threemf-loader.js.map +1 -1
- package/dist/mesh/types.d.ts +30 -0
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- package/dist/node-host/execute-script.d.ts +2 -1
- package/dist/node-host/execute-script.d.ts.map +1 -1
- package/dist/node-host/execute-script.js +5 -4
- package/dist/node-host/execute-script.js.map +1 -1
- package/dist/node-host/index.d.ts +1 -0
- package/dist/node-host/index.d.ts.map +1 -1
- package/dist/node-host/index.js +4 -0
- package/dist/node-host/index.js.map +1 -1
- package/dist/primitives/index.d.ts +19 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +21 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/runtime-state.d.ts +63 -29
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +57 -0
- package/dist/runtime-state.js.map +1 -1
- package/dist/sdf/index.d.ts +12 -0
- package/dist/sdf/index.d.ts.map +1 -0
- package/dist/sdf/index.js +13 -0
- package/dist/sdf/index.js.map +1 -0
- package/dist/sdk.d.ts +0 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js.map +1 -1
- package/dist/weapp.d.ts +2 -2
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +1 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +276 -35
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* export-members — 导出命令的「入参 Shape → 成员表」(方案 §2.6 定式 3 的共用件)
|
|
3
|
+
*
|
|
4
|
+
* `cad.exportStep`(`api/export-step.ts`)与 `cad.export3mf`(`api/export-3mf.ts`)
|
|
5
|
+
* 是同一个库面序列化器(`brep/export/export-model.ts#exportModelSync`)的两个脚本面
|
|
6
|
+
* 薄壳。两者的差别只有「一个成员交给写出器的载荷是 `solid` 还是 `mesh`」;把入参拆
|
|
7
|
+
* 成成员表这一步完全一致,故收在本文件——两份拷贝各自漂移会让脚本面与库面同源
|
|
8
|
+
* (矩阵 B12 / B14)失去保障。
|
|
9
|
+
*
|
|
10
|
+
* 拆解口径对齐现成先例 `node-host/cli.ts#writeAssemblyStep`:
|
|
11
|
+
* - 成员 = `CompoundShape.children`(同序;嵌套 compound 不递归展开,与先例一致);
|
|
12
|
+
* - 成员名 = `behavior.memberNames[i]`(装配 op 写入的短名,`memberColors` 亦以它为
|
|
13
|
+
* 键),无装配 behavior 时回落 `nameOf(child)`;
|
|
14
|
+
* - 成员色 = `behavior.memberColors[成员名]`(sRGB 0–1,STEP 写 XCAF COLOUR_RGB、
|
|
15
|
+
* 3MF 写 basematerials);
|
|
16
|
+
* - 非 compound 入参 = 单成员、不带名与色,与 `cli.ts#writeOutput`(`:744-758`)同
|
|
17
|
+
* 口径——单件导出不写名。
|
|
18
|
+
*
|
|
19
|
+
* 判定用**结构**判定 `isCompoundLike` 而非 SDK 的 `isShape`/`isCompound`:本 op 吃
|
|
20
|
+
* 的是脚本文本传进来的值,可能是跨库产物,不能对它提「必须由本库构造器创建」的要求
|
|
21
|
+
* (同 `keep-syntax §5.3 D5` 的既有取舍)。
|
|
22
|
+
*
|
|
23
|
+
* 成员几何一律由调用方**现场**读(`brepOf(child)`),不取创建期快照:装配变换在语句
|
|
24
|
+
* 之后才烘进 `slot.solid`,快照对已变换成员是陈旧的(`cli.ts#writeAssemblyStep` 的
|
|
25
|
+
* 同款注释)。
|
|
26
|
+
*/
|
|
27
|
+
import { getSlot, isCompoundLike } from '../../shape.js';
|
|
28
|
+
import { nameOf } from '../../runtime-state.js';
|
|
29
|
+
/**
|
|
30
|
+
* 把导出命令的入参拆成成员表。
|
|
31
|
+
*
|
|
32
|
+
* @param input - 单件 Shape 或装配 compound(结构判定)。
|
|
33
|
+
* @returns 成员表;空 compound 返回空数组——调用方必须显式报错,不得落空文件。
|
|
34
|
+
*/
|
|
35
|
+
export function exportMembersOf(input) {
|
|
36
|
+
if (!isCompoundLike(input))
|
|
37
|
+
return [{ shape: input }];
|
|
38
|
+
const behavior = getSlot(input)?.behavior;
|
|
39
|
+
const names = behavior?.memberNames;
|
|
40
|
+
const members = [];
|
|
41
|
+
for (let i = 0; i < input.children.length; i++) {
|
|
42
|
+
const child = input.children[i];
|
|
43
|
+
const raw = names?.[i] ?? nameOf(child);
|
|
44
|
+
const name = raw === undefined || raw === '' ? undefined : String(raw);
|
|
45
|
+
const color = name === undefined ? undefined : behavior?.memberColors?.[name];
|
|
46
|
+
members.push({
|
|
47
|
+
shape: child,
|
|
48
|
+
...(name === undefined ? {} : { name }),
|
|
49
|
+
...(color === undefined ? {} : { color }),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return members;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 导出命令入参 → 成员树(方案 §2.1「装配模型 = 节点属性,单一真源」的脚本面投影)。
|
|
56
|
+
* 与 `exportMembersOf`(平铺)不同,本函数**保留嵌套**:compound 的成员若自身是
|
|
57
|
+
* compound 则递归展开为子树(同序),叶节点携带其 `shape.transform` 作为相对父位姿。
|
|
58
|
+
*
|
|
59
|
+
* 名称 / 颜色取自各层 compound 的 behavior(`memberNames` / `memberColors`,装配 op
|
|
60
|
+
* 写入;core 只读不写,不 import extra)。本层只管结构,几何载荷由调用方(各 op)
|
|
61
|
+
* 现场读取——避免创建期快照陈旧(同 `exportMembersOf` 注释)。
|
|
62
|
+
*
|
|
63
|
+
* @param input - 脚本面导出命令的入参形状(叶或 compound 装配)。
|
|
64
|
+
* @returns 保留嵌套结构的成员树;叶节点携带 `shape.transform` 作为相对父位姿。
|
|
65
|
+
*/
|
|
66
|
+
export function exportTreeOf(input) {
|
|
67
|
+
const leaf = (s, name, color) => {
|
|
68
|
+
const node = { shape: s };
|
|
69
|
+
const t = s.transform;
|
|
70
|
+
if (t)
|
|
71
|
+
node.transform = t;
|
|
72
|
+
if (name !== undefined)
|
|
73
|
+
node.name = name;
|
|
74
|
+
if (color !== undefined)
|
|
75
|
+
node.color = color;
|
|
76
|
+
return node;
|
|
77
|
+
};
|
|
78
|
+
const build = (s) => {
|
|
79
|
+
if (!isCompoundLike(s))
|
|
80
|
+
return leaf(s);
|
|
81
|
+
const behavior = getSlot(s)?.behavior;
|
|
82
|
+
const names = behavior?.memberNames;
|
|
83
|
+
const children = [];
|
|
84
|
+
for (let i = 0; i < s.children.length; i++) {
|
|
85
|
+
const child = s.children[i];
|
|
86
|
+
if (isCompoundLike(child)) {
|
|
87
|
+
children.push(build(child));
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
const raw = names?.[i] ?? nameOf(child);
|
|
91
|
+
const name = raw === undefined || raw === '' ? undefined : String(raw);
|
|
92
|
+
const color = name === undefined ? undefined : behavior?.memberColors?.[name];
|
|
93
|
+
children.push(leaf(child, name, color));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// compound 也是 Shape 的鸭子形态(有 children 槽),但类型面与叶 Shape 不重叠——
|
|
97
|
+
// 结构判定后这里的 cast 只对类型系统成立,运行时直接透传。
|
|
98
|
+
const node = leaf(s);
|
|
99
|
+
node.children = children;
|
|
100
|
+
return node;
|
|
101
|
+
};
|
|
102
|
+
return isCompoundLike(input) ? [build(input)] : [leaf(input)];
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=export-members.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-members.js","sourceRoot":"","sources":["../../../src/api/internal/export-members.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * export-members — 导出命令的「入参 Shape → 成员表」(方案 §2.6 定式 3 的共用件)\n *\n * `cad.exportStep`(`api/export-step.ts`)与 `cad.export3mf`(`api/export-3mf.ts`)\n * 是同一个库面序列化器(`brep/export/export-model.ts#exportModelSync`)的两个脚本面\n * 薄壳。两者的差别只有「一个成员交给写出器的载荷是 `solid` 还是 `mesh`」;把入参拆\n * 成成员表这一步完全一致,故收在本文件——两份拷贝各自漂移会让脚本面与库面同源\n * (矩阵 B12 / B14)失去保障。\n *\n * 拆解口径对齐现成先例 `node-host/cli.ts#writeAssemblyStep`:\n * - 成员 = `CompoundShape.children`(同序;嵌套 compound 不递归展开,与先例一致);\n * - 成员名 = `behavior.memberNames[i]`(装配 op 写入的短名,`memberColors` 亦以它为\n * 键),无装配 behavior 时回落 `nameOf(child)`;\n * - 成员色 = `behavior.memberColors[成员名]`(sRGB 0–1,STEP 写 XCAF COLOUR_RGB、\n * 3MF 写 basematerials);\n * - 非 compound 入参 = 单成员、不带名与色,与 `cli.ts#writeOutput`(`:744-758`)同\n * 口径——单件导出不写名。\n *\n * 判定用**结构**判定 `isCompoundLike` 而非 SDK 的 `isShape`/`isCompound`:本 op 吃\n * 的是脚本文本传进来的值,可能是跨库产物,不能对它提「必须由本库构造器创建」的要求\n * (同 `keep-syntax §5.3 D5` 的既有取舍)。\n *\n * 成员几何一律由调用方**现场**读(`brepOf(child)`),不取创建期快照:装配变换在语句\n * 之后才烘进 `slot.solid`,快照对已变换成员是陈旧的(`cli.ts#writeAssemblyStep` 的\n * 同款注释)。\n */\n\nimport type { Shape, Vec3 } from '../../mesh/types'\nimport type { CompoundShape } from '../../shape'\nimport { getSlot, isCompoundLike } from '../../shape'\nimport { nameOf } from '../../runtime-state'\n\n/** 导出成员:一个待导出的几何 + 其身份(名 / 色)。 */\nexport interface ExportMember {\n /** 成员几何:compound 的成员,或单件入参本身。 */\n shape: Shape\n /** 成员名(写 STEP PRODUCT 名 / 3MF `<object name>`);无名时缺省。 */\n name?: string\n /** sRGB 0–1 成员色(来自装配 behavior 的 `memberColors`)。 */\n color?: readonly [number, number, number]\n}\n\n/**\n * 装配 behavior 里与导出相关的两个字段(`@faicad/faijs-extra` 的 `assembly` op 写入;\n * 本文件只读不写,也不 import 扩展库——core 不得依赖 extra)。\n */\ninterface ExportBehavior {\n memberNames?: string[]\n memberColors?: Record<string, [number, number, number]>\n}\n\n/**\n * 把导出命令的入参拆成成员表。\n *\n * @param input - 单件 Shape 或装配 compound(结构判定)。\n * @returns 成员表;空 compound 返回空数组——调用方必须显式报错,不得落空文件。\n */\nexport function exportMembersOf(input: Shape | CompoundShape): ExportMember[] {\n if (!isCompoundLike(input)) return [{ shape: input }]\n const behavior = getSlot(input)?.behavior as ExportBehavior | undefined\n const names = behavior?.memberNames\n const members: ExportMember[] = []\n for (let i = 0; i < input.children.length; i++) {\n const child = input.children[i]!\n const raw = names?.[i] ?? nameOf(child)\n const name = raw === undefined || raw === '' ? undefined : String(raw)\n const color = name === undefined ? undefined : behavior?.memberColors?.[name]\n members.push({\n shape: child,\n ...(name === undefined ? {} : { name }),\n ...(color === undefined ? {} : { color }),\n })\n }\n return members\n}\n\n/** 装配节点位姿(与 `Shape.transform` 同形态,见 mesh/types.ts)。 */\nexport interface ExportTransform {\n translate?: Vec3\n rotate?: { angle: number; axis?: Vec3 }\n matrix?: number[]\n}\n\n/** 导出成员树节点:结构(名 / 色 / 位姿 / 子节点)与几何(shape)分离。 */\nexport interface ExportMemberNode {\n /** 成员几何:compound 的成员,或单件入参本身。 */\n shape: Shape\n /** 成员名(写 3MF `<object name>` / STEP PRODUCT 名);无名时缺省。 */\n name?: string\n /** sRGB 0–1 成员色(来自装配 behavior 的 `memberColors`)。 */\n color?: readonly [number, number, number]\n /** 本节点相对父的位姿(来自 `shape.transform`)。 */\n transform?: ExportTransform\n /** 子节点(嵌套装配);非 compound 叶节点缺省。 */\n children?: ExportMemberNode[]\n}\n\n/**\n * 导出命令入参 → 成员树(方案 §2.1「装配模型 = 节点属性,单一真源」的脚本面投影)。\n * 与 `exportMembersOf`(平铺)不同,本函数**保留嵌套**:compound 的成员若自身是\n * compound 则递归展开为子树(同序),叶节点携带其 `shape.transform` 作为相对父位姿。\n *\n * 名称 / 颜色取自各层 compound 的 behavior(`memberNames` / `memberColors`,装配 op\n * 写入;core 只读不写,不 import extra)。本层只管结构,几何载荷由调用方(各 op)\n * 现场读取——避免创建期快照陈旧(同 `exportMembersOf` 注释)。\n *\n * @param input - 脚本面导出命令的入参形状(叶或 compound 装配)。\n * @returns 保留嵌套结构的成员树;叶节点携带 `shape.transform` 作为相对父位姿。\n */\nexport function exportTreeOf(input: Shape | CompoundShape): ExportMemberNode[] {\n const leaf = (s: Shape, name?: string, color?: readonly [number, number, number]): ExportMemberNode => {\n const node: ExportMemberNode = { shape: s }\n const t = s.transform as ExportTransform | undefined\n if (t) node.transform = t\n if (name !== undefined) node.name = name\n if (color !== undefined) node.color = color\n return node\n }\n const build = (s: Shape | CompoundShape): ExportMemberNode => {\n if (!isCompoundLike(s)) return leaf(s as Shape)\n const behavior = getSlot(s)?.behavior as ExportBehavior | undefined\n const names = behavior?.memberNames\n const children: ExportMemberNode[] = []\n for (let i = 0; i < s.children.length; i++) {\n const child = s.children[i]!\n if (isCompoundLike(child)) {\n children.push(build(child))\n } else {\n const raw = names?.[i] ?? nameOf(child)\n const name = raw === undefined || raw === '' ? undefined : String(raw)\n const color = name === undefined ? undefined : behavior?.memberColors?.[name]\n children.push(leaf(child, name, color))\n }\n }\n // compound 也是 Shape 的鸭子形态(有 children 槽),但类型面与叶 Shape 不重叠——\n // 结构判定后这里的 cast 只对类型系统成立,运行时直接透传。\n const node = leaf(s as unknown as Shape)\n node.children = children\n return node\n }\n return isCompoundLike(input) ? [build(input)] : [leaf(input as Shape)]\n}\n"]}
|
|
@@ -74,6 +74,23 @@ export declare function callBrepjs<F extends (...a: never[]) => unknown>(fn: F,
|
|
|
74
74
|
* @throws BrepUnsupportedError 当当前引擎不在 `engines` 内。
|
|
75
75
|
*/
|
|
76
76
|
export declare function assertEngineFor(opName: string, engines: readonly string[]): void;
|
|
77
|
+
/**
|
|
78
|
+
* 导出命令的宿主环境断言(与 {@link assertEngineFor} 并列同构,正交轴)。
|
|
79
|
+
*
|
|
80
|
+
* 脚本可由 AI 生成任意代码、属不受信输入,而出把「往哪写、写几份、写什么」的
|
|
81
|
+
* 决定权交给脚本文本;因此脚本面导出命令只在 `'node'` 宿主开放,browser / weapp
|
|
82
|
+
* 一律在执行前拒绝(`HostPorts.hostEnv` 未声明 = 非 node,不兜底放行)。
|
|
83
|
+
*
|
|
84
|
+
* 断言只在 API 函数体第一行执行(普通函数不走 dispatchPath),所以既覆盖脚本面
|
|
85
|
+
* `cad.*`,也覆盖 TS 直连同一函数的旁路——不存在「脚本被拒、库面直连却放行」。
|
|
86
|
+
* 判据只读 `config.hostEnv`,与安全扫描档位(`securityPolicy`)解耦:放宽档位
|
|
87
|
+
* (含 `off`)不解除本门禁。
|
|
88
|
+
*
|
|
89
|
+
* @param opName - op 名(报错文案)。
|
|
90
|
+
* @param hosts - 允许执行的宿主值集合。
|
|
91
|
+
* @throws HostUnsupportedError 当当前宿主不在 `hosts` 内(含未声明)。
|
|
92
|
+
*/
|
|
93
|
+
export declare function assertHostFor(opName: string, hosts: readonly string[]): void;
|
|
77
94
|
/**
|
|
78
95
|
* Adopt a library handle as a faijs Shape (compatOp step 5's only adoption
|
|
79
96
|
* entry point).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l3-bridge.d.ts","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAU7C,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,yCAAyC;IACzC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;IACxB,+BAA+B;IAC/B,MAAM,IAAI,IAAI,CAAA;IACd,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;CACtC;AAOD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAa7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAEtG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAShF;AAQD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAkBxF"}
|
|
1
|
+
{"version":3,"file":"l3-bridge.d.ts","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAU7C,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,yCAAyC;IACzC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;IACxB,+BAA+B;IAC/B,MAAM,IAAI,IAAI,CAAA;IACd,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;CACtC;AAOD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAa7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAEtG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAShF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAO5E;AAQD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAkBxF"}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* (occt-kernel 的 getOcctKernel 为惰性访问,引擎装配前不触碰 wasm)。
|
|
22
22
|
*/
|
|
23
23
|
import { fromHandle } from '../../brep/handle-bridge.js';
|
|
24
|
-
import { getBackends } from '../../runtime-state.js';
|
|
24
|
+
import { getBackends, HostUnsupportedError } from '../../runtime-state.js';
|
|
25
25
|
import { OpError } from './result-unwrap.js';
|
|
26
26
|
/** brepjs 的 finalizer registry 已随子包删除——解除登记为 no-op。 */
|
|
27
27
|
function unregisterFromCleanup(_deletable) {
|
|
@@ -88,6 +88,28 @@ export function assertEngineFor(opName, engines) {
|
|
|
88
88
|
throw e;
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* 导出命令的宿主环境断言(与 {@link assertEngineFor} 并列同构,正交轴)。
|
|
93
|
+
*
|
|
94
|
+
* 脚本可由 AI 生成任意代码、属不受信输入,而出把「往哪写、写几份、写什么」的
|
|
95
|
+
* 决定权交给脚本文本;因此脚本面导出命令只在 `'node'` 宿主开放,browser / weapp
|
|
96
|
+
* 一律在执行前拒绝(`HostPorts.hostEnv` 未声明 = 非 node,不兜底放行)。
|
|
97
|
+
*
|
|
98
|
+
* 断言只在 API 函数体第一行执行(普通函数不走 dispatchPath),所以既覆盖脚本面
|
|
99
|
+
* `cad.*`,也覆盖 TS 直连同一函数的旁路——不存在「脚本被拒、库面直连却放行」。
|
|
100
|
+
* 判据只读 `config.hostEnv`,与安全扫描档位(`securityPolicy`)解耦:放宽档位
|
|
101
|
+
* (含 `off`)不解除本门禁。
|
|
102
|
+
*
|
|
103
|
+
* @param opName - op 名(报错文案)。
|
|
104
|
+
* @param hosts - 允许执行的宿主值集合。
|
|
105
|
+
* @throws HostUnsupportedError 当当前宿主不在 `hosts` 内(含未声明)。
|
|
106
|
+
*/
|
|
107
|
+
export function assertHostFor(opName, hosts) {
|
|
108
|
+
const current = getBackends().config.hostEnv;
|
|
109
|
+
if (current === null || current === undefined || !hosts.some((h) => h === current)) {
|
|
110
|
+
throw new HostUnsupportedError(`E_HOST_UNSUPPORTED: op '${opName}' requires host ${hosts.join(' or ')} (current=${current ?? '<none>'})`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
91
113
|
// ─── adoption (compatOp step 5; R1 fix) ──────────────────────────────────────
|
|
92
114
|
/** Already-adopted handle dedup table: the same library handle adopted twice →
|
|
93
115
|
* the same faijs Shape (prevents double ownership / double dispose, R6). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l3-bridge.js","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * L3 bridge — faijs Shape ⇄ 库侧 brepjs-shaped shape(生成层共用,E5 模板)\n *\n * 桥接事实(2026-09-02 实测,2026-09-25 core-decouple wrapup 自有化):\n * - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的\n * shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);\n * - 库侧(compatOp 投影的 brepjs-shaped 函数)消费的 ShapeHandle 是对象视图\n * (`{ wrapped, disposed, delete, onDispose }`),其 `wrapped` 运行时也是\n * 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例保证两者共享同一 wasm,\n * 句柄空间一致,**零拷贝互操作**。brepjs 子包删除后(裁决 9),本文件\n * 自带最小实现:句柄类型视图 / disposal 解除(no-op)。\n *\n * 因此投影一个库函数只需三件事:\n * 1. faijs Shape → 库输入:原样直传(faijs-native 库消费 core Shape);\n * 2. 调库函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);\n * 3. 库产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`\n * (meshHandle + 身份槽登记,所有权转入 faijs)。\n *\n * 依赖约束(同 `brep/handle-bridge.ts`):只允许 import runtime-state / shape /\n * handle-bridge / occt-kernel 的类型与工具,保持 dist/sdk.js 零 heavy 依赖\n * (occt-kernel 的 getOcctKernel 为惰性访问,引擎装配前不触碰 wasm)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { fromHandle } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBackends } from '../../runtime-state'\nimport { OpError } from './result-unwrap'\n\n// ── brepjs 借用面最小自有化(core-decouple wrapup §4.3)──────────────────────\n// 原实现:@faicad/faijs-brepjs/core/disposal.js(unregisterFromCleanup /\n// ShapeHandle)。brepjs 子包删除后按同语义内联。\n\n/** 库侧消费的 shape 句柄视图(borrowed:不拥有、不释放)。 */\nexport interface BorrowedShapeHandle {\n /** The raw kernel shape handle */\n readonly wrapped: unknown\n /** Manual dispose(borrowed 视图为 no-op) */\n [Symbol.dispose](): void\n /** Alias for Symbol.dispose */\n delete(): void\n /** Always false for a borrowed view */\n readonly disposed: boolean\n /** Borrowed views never dispose, so callbacks never fire(no-op)。 */\n onDispose(callback: () => void): void\n}\n\n/** brepjs 的 finalizer registry 已随子包删除——解除登记为 no-op。 */\nfunction unregisterFromCleanup(_deletable: object): void {\n // no-op(原 brepjs core/disposal.ts#unregisterFromCleanup;registry 已不存在)\n}\n\n/**\n * Adopt a library-side product into a faijs Shape.\n *\n * Unwraps the owned occt handle (`.wrapped`) and registers it into faijs'\n * identity slot via `fromHandle` — ownership transfers to faijs, and the library\n * wrapper must not dispose it afterwards (projected ops return it directly).\n *\n * @param product - a library-side shape (ShapeHandle / AnyShape family).\n * @param segments - optional tessellation segments(投影侧 `segments?`,裁决 1;\n * 透传给 `fromHandle` 的三角化,默认 32 → 64 由 handle-bridge 兜底).\n * @returns the faijs Shape wrapping the same occt solid.\n */\nexport function adoptBrepjsProduct(product: unknown, segments?: number): Shape {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) {\n throw new Error('[faijs/l3-bridge] E_BAD_PRODUCT: expected a shape handle from the library engine')\n }\n // library `wrapped` may be an OcctHandle (`{id}`) or a raw numeric id;\n // faijs' kernel meshShape expects the numeric shape id (fromHandle).\n const wrappedAny = (product as { wrapped: unknown }).wrapped\n const rawId =\n typeof wrappedAny === 'object' && wrappedAny !== null && 'id' in wrappedAny\n ? (wrappedAny as { id: number }).id\n : (wrappedAny as number)\n const wrapped = rawId as BrepHandle\n return fromHandle(wrapped, segments === undefined ? undefined : { segments })\n}\n\n/**\n * Call a library function with a rebuilt positional argument list.\n *\n * Generated wrappers build `__args` positionally (geometry inputs pass through\n * untouched, value params pass through as-is); a plain `fn(...args: unknown[])` spread fails\n * TS2556 against fixed-arity signatures, so the call goes through this\n * rest-typed bridge that preserves the function's own `ReturnType` (so a\n * `Result` return keeps `.ok`/`.value` for the generated unwrap code).\n *\n * @param fn the library function.\n * @param args the rebuilt positional argument list (geometry inputs + value params).\n * @returns whatever the function returns (typed via ReturnType).\n */\nexport function callBrepjs<F extends (...a: never[]) => unknown>(fn: F, args: unknown[]): ReturnType<F> {\n return fn(...(args as never[])) as ReturnType<F>\n}\n\n/**\n * Phase 6(narrowing plan D7):brep 测量 op 的执行前引擎身份断言。\n *\n * 库面 query op 是普通函数(不走 dispatchPath),但部分依赖 occt-only 内核方法\n * (shapeType / linearCenterOfMass / distance / curvature / interference,L2 平台面,\n * D6 表)——在这些 op 的实现上声明 `engines: ['occt']`,函数体第一行即断言当前\n * 引擎身份,在触碰内核之前报出可定位错误(文案与 D11-4 同构),不补桩、不回退。\n *\n * @param opName - op 名(报错文案)。\n * @param engines - 允许执行的引擎 id 集合(arg-spec 条目的 `engines` 字段)。\n * @throws BrepUnsupportedError 当当前引擎不在 `engines` 内。\n */\nexport function assertEngineFor(opName: string, engines: readonly string[]): void {\n const current = getBackends().config.brepEngineId\n if (current === null || current === undefined || !engines.some((e) => e === current)) {\n const e = new Error(\n `E_BREP_UNSUPPORTED: op '${opName}' requires engine ${engines.join(' or ')} (current=${current ?? '<none>'})`,\n )\n e.name = 'BrepUnsupportedError'\n throw e\n }\n}\n\n// ─── adoption (compatOp step 5; R1 fix) ──────────────────────────────────────\n\n/** Already-adopted handle dedup table: the same library handle adopted twice →\n * the same faijs Shape (prevents double ownership / double dispose, R6). */\nconst adoptedMap = new WeakMap<object, Shape>()\n\n/**\n * Adopt a library handle as a faijs Shape (compatOp step 5's only adoption\n * entry point).\n *\n * ① pure data (no `.wrapped`) → pass through unchanged (query/data functions);\n * ② sub-shape kinds (face/edge/wire/vertex/shell) → throw E_SUBSHAPE_BOUNDARY\n * (v1 boundary rejection, R4; the brand is a compile-time phantom type —\n * the runtime kind is read from the occt-wasm handle's own `type` field,\n * same as the kernel getShapeType helpers);\n * ③ entities (solid/compound) → no-op unregisterFromCleanup(★ R1:brepjs\n * finalizer registry 已随子包删除,无孤儿释放风险)→ adoptBrepjsProduct.\n *\n * @param product - the library result (handle or plain data record).\n * @param opName - the op name (error messages).\n * @param segments - optional tessellation segments (compat `segments?`).\n * @returns the adopted faijs Shape, or the plain data untouched.\n */\nexport function adoptEntity(product: unknown, opName: string, segments?: number): unknown {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) return product\n const h = product as BorrowedShapeHandle\n const prev = adoptedMap.get(h as object)\n if (prev) return prev\n const type = (h.wrapped as { type?: string }).type\n if (type !== undefined && type !== 'solid' && type !== 'compound') {\n throw new OpError(\n opName,\n 'E_SUBSHAPE_BOUNDARY',\n `[faijs/op] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +\n 'must not cross the library boundary; return entity solids or plain data',\n )\n }\n unregisterFromCleanup(h as object) // ★ R1: no-op(brepjs registry 已删除)\n const s = adoptBrepjsProduct(h, segments) // fromHandle: tessellation + identity + BREP slots\n adoptedMap.set(h as object, s)\n return s\n}\n"]}
|
|
1
|
+
{"version":3,"file":"l3-bridge.js","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * L3 bridge — faijs Shape ⇄ 库侧 brepjs-shaped shape(生成层共用,E5 模板)\n *\n * 桥接事实(2026-09-02 实测,2026-09-25 core-decouple wrapup 自有化):\n * - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的\n * shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);\n * - 库侧(compatOp 投影的 brepjs-shaped 函数)消费的 ShapeHandle 是对象视图\n * (`{ wrapped, disposed, delete, onDispose }`),其 `wrapped` 运行时也是\n * 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例保证两者共享同一 wasm,\n * 句柄空间一致,**零拷贝互操作**。brepjs 子包删除后(裁决 9),本文件\n * 自带最小实现:句柄类型视图 / disposal 解除(no-op)。\n *\n * 因此投影一个库函数只需三件事:\n * 1. faijs Shape → 库输入:原样直传(faijs-native 库消费 core Shape);\n * 2. 调库函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);\n * 3. 库产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`\n * (meshHandle + 身份槽登记,所有权转入 faijs)。\n *\n * 依赖约束(同 `brep/handle-bridge.ts`):只允许 import runtime-state / shape /\n * handle-bridge / occt-kernel 的类型与工具,保持 dist/sdk.js 零 heavy 依赖\n * (occt-kernel 的 getOcctKernel 为惰性访问,引擎装配前不触碰 wasm)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { fromHandle } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBackends, HostUnsupportedError } from '../../runtime-state'\nimport { OpError } from './result-unwrap'\n\n// ── brepjs 借用面最小自有化(core-decouple wrapup §4.3)──────────────────────\n// 原实现:@faicad/faijs-brepjs/core/disposal.js(unregisterFromCleanup /\n// ShapeHandle)。brepjs 子包删除后按同语义内联。\n\n/** 库侧消费的 shape 句柄视图(borrowed:不拥有、不释放)。 */\nexport interface BorrowedShapeHandle {\n /** The raw kernel shape handle */\n readonly wrapped: unknown\n /** Manual dispose(borrowed 视图为 no-op) */\n [Symbol.dispose](): void\n /** Alias for Symbol.dispose */\n delete(): void\n /** Always false for a borrowed view */\n readonly disposed: boolean\n /** Borrowed views never dispose, so callbacks never fire(no-op)。 */\n onDispose(callback: () => void): void\n}\n\n/** brepjs 的 finalizer registry 已随子包删除——解除登记为 no-op。 */\nfunction unregisterFromCleanup(_deletable: object): void {\n // no-op(原 brepjs core/disposal.ts#unregisterFromCleanup;registry 已不存在)\n}\n\n/**\n * Adopt a library-side product into a faijs Shape.\n *\n * Unwraps the owned occt handle (`.wrapped`) and registers it into faijs'\n * identity slot via `fromHandle` — ownership transfers to faijs, and the library\n * wrapper must not dispose it afterwards (projected ops return it directly).\n *\n * @param product - a library-side shape (ShapeHandle / AnyShape family).\n * @param segments - optional tessellation segments(投影侧 `segments?`,裁决 1;\n * 透传给 `fromHandle` 的三角化,默认 32 → 64 由 handle-bridge 兜底).\n * @returns the faijs Shape wrapping the same occt solid.\n */\nexport function adoptBrepjsProduct(product: unknown, segments?: number): Shape {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) {\n throw new Error('[faijs/l3-bridge] E_BAD_PRODUCT: expected a shape handle from the library engine')\n }\n // library `wrapped` may be an OcctHandle (`{id}`) or a raw numeric id;\n // faijs' kernel meshShape expects the numeric shape id (fromHandle).\n const wrappedAny = (product as { wrapped: unknown }).wrapped\n const rawId =\n typeof wrappedAny === 'object' && wrappedAny !== null && 'id' in wrappedAny\n ? (wrappedAny as { id: number }).id\n : (wrappedAny as number)\n const wrapped = rawId as BrepHandle\n return fromHandle(wrapped, segments === undefined ? undefined : { segments })\n}\n\n/**\n * Call a library function with a rebuilt positional argument list.\n *\n * Generated wrappers build `__args` positionally (geometry inputs pass through\n * untouched, value params pass through as-is); a plain `fn(...args: unknown[])` spread fails\n * TS2556 against fixed-arity signatures, so the call goes through this\n * rest-typed bridge that preserves the function's own `ReturnType` (so a\n * `Result` return keeps `.ok`/`.value` for the generated unwrap code).\n *\n * @param fn the library function.\n * @param args the rebuilt positional argument list (geometry inputs + value params).\n * @returns whatever the function returns (typed via ReturnType).\n */\nexport function callBrepjs<F extends (...a: never[]) => unknown>(fn: F, args: unknown[]): ReturnType<F> {\n return fn(...(args as never[])) as ReturnType<F>\n}\n\n/**\n * Phase 6(narrowing plan D7):brep 测量 op 的执行前引擎身份断言。\n *\n * 库面 query op 是普通函数(不走 dispatchPath),但部分依赖 occt-only 内核方法\n * (shapeType / linearCenterOfMass / distance / curvature / interference,L2 平台面,\n * D6 表)——在这些 op 的实现上声明 `engines: ['occt']`,函数体第一行即断言当前\n * 引擎身份,在触碰内核之前报出可定位错误(文案与 D11-4 同构),不补桩、不回退。\n *\n * @param opName - op 名(报错文案)。\n * @param engines - 允许执行的引擎 id 集合(arg-spec 条目的 `engines` 字段)。\n * @throws BrepUnsupportedError 当当前引擎不在 `engines` 内。\n */\nexport function assertEngineFor(opName: string, engines: readonly string[]): void {\n const current = getBackends().config.brepEngineId\n if (current === null || current === undefined || !engines.some((e) => e === current)) {\n const e = new Error(\n `E_BREP_UNSUPPORTED: op '${opName}' requires engine ${engines.join(' or ')} (current=${current ?? '<none>'})`,\n )\n e.name = 'BrepUnsupportedError'\n throw e\n }\n}\n\n/**\n * 导出命令的宿主环境断言(与 {@link assertEngineFor} 并列同构,正交轴)。\n *\n * 脚本可由 AI 生成任意代码、属不受信输入,而出把「往哪写、写几份、写什么」的\n * 决定权交给脚本文本;因此脚本面导出命令只在 `'node'` 宿主开放,browser / weapp\n * 一律在执行前拒绝(`HostPorts.hostEnv` 未声明 = 非 node,不兜底放行)。\n *\n * 断言只在 API 函数体第一行执行(普通函数不走 dispatchPath),所以既覆盖脚本面\n * `cad.*`,也覆盖 TS 直连同一函数的旁路——不存在「脚本被拒、库面直连却放行」。\n * 判据只读 `config.hostEnv`,与安全扫描档位(`securityPolicy`)解耦:放宽档位\n * (含 `off`)不解除本门禁。\n *\n * @param opName - op 名(报错文案)。\n * @param hosts - 允许执行的宿主值集合。\n * @throws HostUnsupportedError 当当前宿主不在 `hosts` 内(含未声明)。\n */\nexport function assertHostFor(opName: string, hosts: readonly string[]): void {\n const current = getBackends().config.hostEnv\n if (current === null || current === undefined || !hosts.some((h) => h === current)) {\n throw new HostUnsupportedError(\n `E_HOST_UNSUPPORTED: op '${opName}' requires host ${hosts.join(' or ')} (current=${current ?? '<none>'})`,\n )\n }\n}\n\n// ─── adoption (compatOp step 5; R1 fix) ──────────────────────────────────────\n\n/** Already-adopted handle dedup table: the same library handle adopted twice →\n * the same faijs Shape (prevents double ownership / double dispose, R6). */\nconst adoptedMap = new WeakMap<object, Shape>()\n\n/**\n * Adopt a library handle as a faijs Shape (compatOp step 5's only adoption\n * entry point).\n *\n * ① pure data (no `.wrapped`) → pass through unchanged (query/data functions);\n * ② sub-shape kinds (face/edge/wire/vertex/shell) → throw E_SUBSHAPE_BOUNDARY\n * (v1 boundary rejection, R4; the brand is a compile-time phantom type —\n * the runtime kind is read from the occt-wasm handle's own `type` field,\n * same as the kernel getShapeType helpers);\n * ③ entities (solid/compound) → no-op unregisterFromCleanup(★ R1:brepjs\n * finalizer registry 已随子包删除,无孤儿释放风险)→ adoptBrepjsProduct.\n *\n * @param product - the library result (handle or plain data record).\n * @param opName - the op name (error messages).\n * @param segments - optional tessellation segments (compat `segments?`).\n * @returns the adopted faijs Shape, or the plain data untouched.\n */\nexport function adoptEntity(product: unknown, opName: string, segments?: number): unknown {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) return product\n const h = product as BorrowedShapeHandle\n const prev = adoptedMap.get(h as object)\n if (prev) return prev\n const type = (h.wrapped as { type?: string }).type\n if (type !== undefined && type !== 'solid' && type !== 'compound') {\n throw new OpError(\n opName,\n 'E_SUBSHAPE_BOUNDARY',\n `[faijs/op] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +\n 'must not cross the library boundary; return entity solids or plain data',\n )\n }\n unregisterFromCleanup(h as object) // ★ R1: no-op(brepjs registry 已删除)\n const s = adoptBrepjsProduct(h, segments) // fromHandle: tessellation + identity + BREP slots\n adoptedMap.set(h as object, s)\n return s\n}\n"]}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* api measure-query — 测量与查询族(S4 剩余,平台 op engines:['occt'])
|
|
3
|
+
*
|
|
4
|
+
* @platform occt — 13 个原生方法直调 occt-wasm(occt-wasm 5.6.0 有,见
|
|
5
|
+
* `dist/index.d.ts` 的 `OcctKernel`):
|
|
6
|
+
* containsPoint / distanceBetween / getInertia / getLinearCenterOfMass /
|
|
7
|
+
* projectPointOnEdge / projectPointOnFace / classifyPointOnFace / uvFromPoint /
|
|
8
|
+
* vertexPosition / subShapeCount / iterShapes / liftCurve2dToPlane / intersectionCells
|
|
9
|
+
* 它们**不在** L1 契约 `BrepEngineApi` 里(L1 只有 getCenterOfMass / getVolume /
|
|
10
|
+
* getSurfaceArea / getBoundingBox 等子集,见 brep/engine/primitives.ts)⇒ 全族平台 op。
|
|
11
|
+
*
|
|
12
|
+
* 方案落点:docs/plans/2026-10-07-occt-wasm-op-enablement-plan.md §3.4.6。
|
|
13
|
+
*
|
|
14
|
+
* **形态二分**(沿用 shape-type / view-export / curve-sketch 的既定口径):
|
|
15
|
+
* - 返回 Shape 的两项(`liftCurve2d` / `commonCells`)走 `defineOp` + `engines:['occt']`,
|
|
16
|
+
* 由 dispatchPath 门控(D11-4,brep_mock 豁免走 D11-3);
|
|
17
|
+
* - 其余返回标量 / Vec3 / 对象 / Shape[] 的 11 项走**普通函数** +
|
|
18
|
+
* `assertEngineFor('<name>', ['occt'])`:defineOp 的 brep 包装
|
|
19
|
+
* (define-op.ts#wrapBrepOne)把返回值一律收养为 Shape,装不下这些形态。普通函数
|
|
20
|
+
* 形态的 op 由覆盖率扫描器 `scan-occt-op-coverage.ts` 的 PLAN_C2_EXTRA 计入 C2。
|
|
21
|
+
*
|
|
22
|
+
* **GOTCHA(上游载体差异,务必读)**:occt-wasm 的 `Vec3` 是 **`{x, y, z}` 对象接口**
|
|
23
|
+
* (dist/types.d.ts:52-56),而 faijs 脚本面的 `Vec3` 是 **`[x, y, z]` 数组**
|
|
24
|
+
* (mesh/types,见 api/geom.ts 里 `normal = [n.x, n.y, n.z]` 的同款转接)。因此本文件
|
|
25
|
+
* 在**边界处做双向转换**,不外泄载体差异:入参 `[x,y,z]` → `{x,y,z}`,返回值
|
|
26
|
+
* `{x,y,z}` → `[x,y,z]`。漏掉这层转换时症状是原生方法读到 `undefined` 坐标
|
|
27
|
+
* (`{}.x` 静默取不到 → 落在原点)而非显式报错,故每条都配了返回值数组的测试。
|
|
28
|
+
*
|
|
29
|
+
* `iterShapes` 返回的子形状既有实体/面也有边/wire ⇒ 按 `getShapeType` 判定收养形态
|
|
30
|
+
* (vertex/edge/wire → `fromBrepCurve`,其余 → `fromBrep`),避免把 1D 产物谎报成实体。
|
|
31
|
+
*
|
|
32
|
+
* §9.5 降级路径(记录在案):一旦 brepkit 把这些测量/查询接进 L1 契约且两侧适配器
|
|
33
|
+
* 同时落地,普通函数删掉 assertEngineFor 改走 getBrepApi()、defineOp 删掉 engines
|
|
34
|
+
* 声明,对应方法即从 C2 转入 C1。
|
|
35
|
+
*/
|
|
36
|
+
import type { Shape, Vec3 } from '../../mesh/types.js';
|
|
37
|
+
import type { PointClassification } from 'occt-wasm';
|
|
38
|
+
/** 子形状类型(与 occt 原生同名形参的字面量联合一致)。 */
|
|
39
|
+
export type SubShapeType = 'vertex' | 'edge' | 'wire' | 'face' | 'shell' | 'solid';
|
|
40
|
+
/**
|
|
41
|
+
* 点是否在实体内(含边界,带容差)。
|
|
42
|
+
* @group 查询
|
|
43
|
+
* @inputs 1
|
|
44
|
+
* @async false
|
|
45
|
+
* @qual ok
|
|
46
|
+
* @name containsPoint
|
|
47
|
+
* @note 平台 op:仅 occt 引擎(原生 containsPoint,L1 契约无对应成员)。
|
|
48
|
+
* 非 occt 引擎执行前报 E_BREP_UNSUPPORTED。坐标收脚本面的 [x,y,z]。
|
|
49
|
+
* @returns boolean 点是否在形状内。
|
|
50
|
+
* @param shape - 被检测的形状(语义上是实体/壳)。type:Shape required:true
|
|
51
|
+
* @param point - 待判定点 [x,y,z]。type:Vec3 required:true
|
|
52
|
+
* @param tolerance - 判定容差(模型单位)。type:number required:false
|
|
53
|
+
* @example
|
|
54
|
+
* const inside = cad.containsPoint(box, [1, 1, 1])
|
|
55
|
+
*/
|
|
56
|
+
export declare function containsPoint(shape: Shape, point: Vec3, tolerance?: number): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* 两形状之间的最短距离。
|
|
59
|
+
* @group 查询
|
|
60
|
+
* @inputs 2
|
|
61
|
+
* @async false
|
|
62
|
+
* @qual ok
|
|
63
|
+
* @name distanceBetween
|
|
64
|
+
* @note 平台 op:仅 occt 引擎(原生 distanceBetween,BRepExtrema_DistShapeShape)。
|
|
65
|
+
* 非 occt 引擎执行前报 E_BREP_UNSUPPORTED。
|
|
66
|
+
* @returns number 最短距离(模型单位;相交为 0)。
|
|
67
|
+
* @param a - 第一个形状。type:Shape required:true
|
|
68
|
+
* @param b - 第二个形状。type:Shape required:true
|
|
69
|
+
* @example
|
|
70
|
+
* const gap = cad.distanceBetween(box1, box2)
|
|
71
|
+
*/
|
|
72
|
+
export declare function distanceBetween(a: Shape, b: Shape): number;
|
|
73
|
+
/**
|
|
74
|
+
* 绕质心的惯性矩阵(row-major 3×3,长度 9;对称:[1]==[3]、[2]==[6]、[5]==[7])。
|
|
75
|
+
* @group 查询
|
|
76
|
+
* @inputs 1
|
|
77
|
+
* @async false
|
|
78
|
+
* @qual ok
|
|
79
|
+
* @name inertia
|
|
80
|
+
* @note 平台 op:仅 occt 引擎(原生 getInertia)。非 occt 引擎执行前报
|
|
81
|
+
* E_BREP_UNSUPPORTED。
|
|
82
|
+
* @returns number[] row-major 3×3 惯性矩阵。
|
|
83
|
+
* @param shape - 被测量的形状。type:Shape required:true
|
|
84
|
+
* @example
|
|
85
|
+
* const m = cad.inertia(box)
|
|
86
|
+
*/
|
|
87
|
+
export declare function inertia(shape: Shape): number[];
|
|
88
|
+
/**
|
|
89
|
+
* 线性质心(按边长加权的质心;wire/edge 用它与体积质心区分)。
|
|
90
|
+
* @group 查询
|
|
91
|
+
* @inputs 1
|
|
92
|
+
* @async false
|
|
93
|
+
* @qual ok
|
|
94
|
+
* @name linearCenterOfMass
|
|
95
|
+
* @note 平台 op:仅 occt 引擎(原生 getLinearCenterOfMass)。非 occt 引擎执行前报
|
|
96
|
+
* E_BREP_UNSUPPORTED。返回脚本面的 [x,y,z](非 occt 的 {x,y,z} 对象)。
|
|
97
|
+
* @returns Vec3 线性质心坐标 [x,y,z]。
|
|
98
|
+
* @param shape - 被测量的形状。type:Shape required:true
|
|
99
|
+
* @example
|
|
100
|
+
* const c = cad.linearCenterOfMass(wire)
|
|
101
|
+
*/
|
|
102
|
+
export declare function linearCenterOfMass(shape: Shape): Vec3;
|
|
103
|
+
/**
|
|
104
|
+
* 点到边的最近点(含该处切向与参数)。
|
|
105
|
+
* @group 查询
|
|
106
|
+
* @inputs 2
|
|
107
|
+
* @async false
|
|
108
|
+
* @qual ok
|
|
109
|
+
* @name projectPointOnEdge
|
|
110
|
+
* @note 平台 op:仅 occt 引擎(原生 projectPointOnEdge)。非 occt 引擎执行前报
|
|
111
|
+
* E_BREP_UNSUPPORTED。返回体里的 point/tangent 是脚本面的 [x,y,z]。
|
|
112
|
+
* @returns object { point: Vec3; tangent: Vec3; parameter: number }。
|
|
113
|
+
* @param edge - 被投影的边。type:Shape required:true
|
|
114
|
+
* @param point - 待投影点 [x,y,z]。type:Vec3 required:true
|
|
115
|
+
* @example
|
|
116
|
+
* const hit = cad.projectPointOnEdge(e, [3, 4, 0])
|
|
117
|
+
*/
|
|
118
|
+
export declare function projectPointOnEdge(edge: Shape, point: Vec3): {
|
|
119
|
+
point: Vec3;
|
|
120
|
+
tangent: Vec3;
|
|
121
|
+
parameter: number;
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* 点到面的最近点(三维坐标)。
|
|
125
|
+
* @group 查询
|
|
126
|
+
* @inputs 2
|
|
127
|
+
* @async false
|
|
128
|
+
* @qual ok
|
|
129
|
+
* @name projectPointOnFace
|
|
130
|
+
* @note 平台 op:仅 occt 引擎(原生 projectPointOnFace)。非 occt 引擎执行前报
|
|
131
|
+
* E_BREP_UNSUPPORTED。要 UV 参数用 `uvFromPoint`。
|
|
132
|
+
* @returns Vec3 面上的最近点 [x,y,z]。
|
|
133
|
+
* @param face - 被投影的面。type:Shape required:true
|
|
134
|
+
* @param point - 待投影点 [x,y,z]。type:Vec3 required:true
|
|
135
|
+
* @example
|
|
136
|
+
* const p = cad.projectPointOnFace(f, [3, 4, 5])
|
|
137
|
+
*/
|
|
138
|
+
export declare function projectPointOnFace(face: Shape, point: Vec3): Vec3;
|
|
139
|
+
/**
|
|
140
|
+
* UV 点相对面边界的分类(BRepClass_FaceClassifier)。
|
|
141
|
+
* @group 查询
|
|
142
|
+
* @inputs 3
|
|
143
|
+
* @async false
|
|
144
|
+
* @qual ok
|
|
145
|
+
* @name classifyPointOnFace
|
|
146
|
+
* @note 平台 op:仅 occt 引擎(原生 classifyPointOnFace)。非 occt 引擎执行前报
|
|
147
|
+
* E_BREP_UNSUPPORTED。
|
|
148
|
+
* @returns string 'in' | 'on' | 'out'。
|
|
149
|
+
* @param face - 被判定的面。type:Shape required:true
|
|
150
|
+
* @param u - U 参数。type:number required:true
|
|
151
|
+
* @param v - V 参数。type:number required:true
|
|
152
|
+
* @example
|
|
153
|
+
* const cls = cad.classifyPointOnFace(f, 0.5, 0.5)
|
|
154
|
+
*/
|
|
155
|
+
export declare function classifyPointOnFace(face: Shape, u: number, v: number): PointClassification;
|
|
156
|
+
/**
|
|
157
|
+
* 三维点 → 面的 UV 参数。
|
|
158
|
+
* @group 查询
|
|
159
|
+
* @inputs 2
|
|
160
|
+
* @async false
|
|
161
|
+
* @qual ok
|
|
162
|
+
* @name uvFromPoint
|
|
163
|
+
* @note 平台 op:仅 occt 引擎(原生 uvFromPoint)。非 occt 引擎执行前报
|
|
164
|
+
* E_BREP_UNSUPPORTED。
|
|
165
|
+
* @returns object { u: number; v: number }。
|
|
166
|
+
* @param face - 目标面。type:Shape required:true
|
|
167
|
+
* @param point - 三维点 [x,y,z]。type:Vec3 required:true
|
|
168
|
+
* @example
|
|
169
|
+
* const { u, v } = cad.uvFromPoint(f, [1, 2, 0])
|
|
170
|
+
*/
|
|
171
|
+
export declare function uvFromPoint(face: Shape, point: Vec3): {
|
|
172
|
+
u: number;
|
|
173
|
+
v: number;
|
|
174
|
+
};
|
|
175
|
+
/**
|
|
176
|
+
* 顶点坐标。
|
|
177
|
+
* @group 查询
|
|
178
|
+
* @inputs 1
|
|
179
|
+
* @async false
|
|
180
|
+
* @qual ok
|
|
181
|
+
* @name vertexPosition
|
|
182
|
+
* @note 平台 op:仅 occt 引擎(原生 vertexPosition)。非 occt 引擎执行前报
|
|
183
|
+
* E_BREP_UNSUPPORTED。返回脚本面的 [x,y,z]。
|
|
184
|
+
* @returns Vec3 顶点坐标 [x,y,z]。
|
|
185
|
+
* @param vertex - 顶点形状。type:Shape required:true
|
|
186
|
+
* @example
|
|
187
|
+
* const p = cad.vertexPosition(v)
|
|
188
|
+
*/
|
|
189
|
+
export declare function vertexPosition(vertex: Shape): Vec3;
|
|
190
|
+
/**
|
|
191
|
+
* 子形状计数(不物化逐个子形状句柄)。
|
|
192
|
+
* @group 查询
|
|
193
|
+
* @inputs 2
|
|
194
|
+
* @async false
|
|
195
|
+
* @qual ok
|
|
196
|
+
* @name subShapeCount
|
|
197
|
+
* @note 平台 op:仅 occt 引擎(原生 subShapeCount;L1 契约只有 getSubShapes,
|
|
198
|
+
* 计数能力是 occt 独有)。非 occt 引擎执行前报 E_BREP_UNSUPPORTED。
|
|
199
|
+
* @returns number 该类子形状的个数。
|
|
200
|
+
* @param shape - 被统计的形状。type:Shape required:true
|
|
201
|
+
* @param type - 子形状类型(vertex/edge/wire/face/shell/solid)。type:string required:true
|
|
202
|
+
* @example
|
|
203
|
+
* const n = cad.subShapeCount(box, 'face')
|
|
204
|
+
*/
|
|
205
|
+
export declare function subShapeCount(shape: Shape, type: SubShapeType): number;
|
|
206
|
+
/**
|
|
207
|
+
* 遍历全部子形状(递归展平,返回 Shape[])。
|
|
208
|
+
* @group 查询
|
|
209
|
+
* @inputs 1
|
|
210
|
+
* @async false
|
|
211
|
+
* @qual ok
|
|
212
|
+
* @name iterShapes
|
|
213
|
+
* @note 平台 op:仅 occt 引擎(原生 iterShapes;L1 契约的 getSubShapes 只按类型单层取)。
|
|
214
|
+
* 非 occt 引擎执行前报 E_BREP_UNSUPPORTED。
|
|
215
|
+
* 返回 Shape 数组(非单个 Shape)⇒ 普通函数形态,与 shape-type 同口径。
|
|
216
|
+
* @returns Shape[] 子形状列表(vertex/edge/wire 形态为 curve)。
|
|
217
|
+
* @param shape - 被遍历的形状。type:Shape required:true
|
|
218
|
+
* @example
|
|
219
|
+
* const subs = cad.iterShapes(box)
|
|
220
|
+
*/
|
|
221
|
+
export declare function iterShapes(shape: Shape): Shape[];
|
|
222
|
+
/**
|
|
223
|
+
* 把 2D 点集抬升到指定平面上,构造平面 wire。
|
|
224
|
+
* @group 创建
|
|
225
|
+
* @inputs 4
|
|
226
|
+
* @async false
|
|
227
|
+
* @qual ok
|
|
228
|
+
* @name liftCurve2d
|
|
229
|
+
* @note 平台 op:仅 occt 引擎(原生 liftCurve2dToPlane,L1 契约无对应成员)。
|
|
230
|
+
* 非 occt 引擎执行前报错;brep_mock 不拦截。
|
|
231
|
+
* 坐标收 `[x,y]` 数对(脚本面习惯),内部转成上游的 `{x,y}` 对象;
|
|
232
|
+
* planeZ/planeX 须非零且互不平行。
|
|
233
|
+
* @returns Shape 平面上的 wire(登记为 kind:'curve')。
|
|
234
|
+
* @param points2d - 2D 点集 [[x,y], …](≥2 点)。type:Array required:true
|
|
235
|
+
* @param planeOrigin - 平面原点 [x,y,z]。type:Vec3 required:true
|
|
236
|
+
* @param planeZ - 平面法向 [x,y,z](非零)。type:Vec3 required:true
|
|
237
|
+
* @param planeX - 平面内 X 轴方向 [x,y,z](非零)。type:Vec3 required:true
|
|
238
|
+
* @example
|
|
239
|
+
* const w = cad.liftCurve2d([[0,0],[10,0],[10,5]], [0,0,0], [0,0,1], [1,0,0])
|
|
240
|
+
*/
|
|
241
|
+
export declare const liftCurve2d: ((points2d: [number, number][], planeOrigin: Vec3, planeZ: Vec3, planeX: Vec3) => Promise<Shape>) & {
|
|
242
|
+
__faijs__dualOp?: import("../../define-op.js").DualOpMeta;
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* 求多个形状的重叠区域(通用熔合胞元,常用于干涉检查)。
|
|
246
|
+
* @group 布尔
|
|
247
|
+
* @inputs 1
|
|
248
|
+
* @async false
|
|
249
|
+
* @qual ok
|
|
250
|
+
* @name commonCells
|
|
251
|
+
* @note 平台 op:仅 occt 引擎(原生 intersectionCells;与 `intersect` 的区别:
|
|
252
|
+
* 后者是两形状求交,本 op 支持 ≥2 输入并返回全部重叠胞元)。
|
|
253
|
+
* 非 occt 引擎执行前报错;brep_mock 不拦截。
|
|
254
|
+
* @returns Shape 重叠区域(无重叠时为空复合体)。
|
|
255
|
+
* @param shapes - 输入形状数组(≥2)。type:Shape[] required:true
|
|
256
|
+
* @example
|
|
257
|
+
* const overlap = cad.commonCells([boxA, boxB, boxC])
|
|
258
|
+
*/
|
|
259
|
+
export declare const commonCells: ((shapes: Shape[]) => Promise<Shape>) & {
|
|
260
|
+
__faijs__dualOp?: import("../../define-op.js").DualOpMeta;
|
|
261
|
+
};
|
|
262
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/measure-query/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AASpD,oCAAoC;AACpC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAA;AAwClF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAIpF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,CAK1D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAG9C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAGrD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,IAAI,GACV;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAKnD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,CAIjE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAM1F;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAI9E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,CAGlD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAQtE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,CAIhD;AA6BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,WAAW;;CAUtB,CAAA;AAmBF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW;;CAYtB,CAAA"}
|