@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.
Files changed (284) hide show
  1. package/dist/api/align/index.d.ts +64 -0
  2. package/dist/api/align/index.d.ts.map +1 -0
  3. package/dist/api/align/index.js +101 -0
  4. package/dist/api/align/index.js.map +1 -0
  5. package/dist/api/api-namespace.d.ts +5 -4
  6. package/dist/api/api-namespace.d.ts.map +1 -1
  7. package/dist/api/api-namespace.js +36 -4
  8. package/dist/api/api-namespace.js.map +1 -1
  9. package/dist/api/boolean-op/index.d.ts +65 -0
  10. package/dist/api/boolean-op/index.d.ts.map +1 -0
  11. package/dist/api/boolean-op/index.js +113 -0
  12. package/dist/api/boolean-op/index.js.map +1 -0
  13. package/dist/api/boolean.d.ts.map +1 -1
  14. package/dist/api/boolean.js +15 -27
  15. package/dist/api/boolean.js.map +1 -1
  16. package/dist/api/brep-operations/healingFns.d.ts +13 -0
  17. package/dist/api/brep-operations/healingFns.d.ts.map +1 -1
  18. package/dist/api/brep-operations/healingFns.js +28 -1
  19. package/dist/api/brep-operations/healingFns.js.map +1 -1
  20. package/dist/api/brep-operations/topologyFns.d.ts +27 -6
  21. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -1
  22. package/dist/api/brep-operations/topologyFns.js +46 -22
  23. package/dist/api/brep-operations/topologyFns.js.map +1 -1
  24. package/dist/api/chamfer.d.ts +5 -4
  25. package/dist/api/chamfer.d.ts.map +1 -1
  26. package/dist/api/chamfer.js +12 -11
  27. package/dist/api/chamfer.js.map +1 -1
  28. package/dist/api/curve-sketch/index.d.ts.map +1 -1
  29. package/dist/api/curve-sketch/index.js +9 -3
  30. package/dist/api/curve-sketch/index.js.map +1 -1
  31. package/dist/api/draft.d.ts.map +1 -1
  32. package/dist/api/draft.js +1 -3
  33. package/dist/api/draft.js.map +1 -1
  34. package/dist/api/engrave.d.ts.map +1 -1
  35. package/dist/api/engrave.js +3 -13
  36. package/dist/api/engrave.js.map +1 -1
  37. package/dist/api/export-3mf.d.ts +73 -0
  38. package/dist/api/export-3mf.d.ts.map +1 -0
  39. package/dist/api/export-3mf.js +121 -0
  40. package/dist/api/export-3mf.js.map +1 -0
  41. package/dist/api/export-brep.d.ts +6 -0
  42. package/dist/api/export-brep.d.ts.map +1 -1
  43. package/dist/api/export-brep.js +11 -2
  44. package/dist/api/export-brep.js.map +1 -1
  45. package/dist/api/export-step.d.ts +67 -0
  46. package/dist/api/export-step.d.ts.map +1 -0
  47. package/dist/api/export-step.js +98 -0
  48. package/dist/api/export-step.js.map +1 -0
  49. package/dist/api/export-stl.d.ts +8 -0
  50. package/dist/api/export-stl.d.ts.map +1 -1
  51. package/dist/api/export-stl.js +23 -8
  52. package/dist/api/export-stl.js.map +1 -1
  53. package/dist/api/feature-repair.d.ts +1 -1
  54. package/dist/api/feature-repair.d.ts.map +1 -1
  55. package/dist/api/feature-repair.js +1 -7
  56. package/dist/api/feature-repair.js.map +1 -1
  57. package/dist/api/fillet-variable.d.ts.map +1 -1
  58. package/dist/api/fillet-variable.js +0 -1
  59. package/dist/api/fillet-variable.js.map +1 -1
  60. package/dist/api/fillet.d.ts +3 -3
  61. package/dist/api/fillet.d.ts.map +1 -1
  62. package/dist/api/fillet.js +3 -4
  63. package/dist/api/fillet.js.map +1 -1
  64. package/dist/api/generated/operations.js +6 -6
  65. package/dist/api/generated/operations.js.map +1 -1
  66. package/dist/api/generated/script-face-manifest.d.ts +1 -1
  67. package/dist/api/generated/script-face-manifest.js +3 -3
  68. package/dist/api/generated/script-face-manifest.js.map +1 -1
  69. package/dist/api/generated/script-face.d.ts +1 -1
  70. package/dist/api/generated/script-face.js +1 -1
  71. package/dist/api/generated/script-face.js.map +1 -1
  72. package/dist/api/generated/sketching.js +1 -1
  73. package/dist/api/generated/sketching.js.map +1 -1
  74. package/dist/api/generated/topology.js +10 -10
  75. package/dist/api/generated/topology.js.map +1 -1
  76. package/dist/api/helix.d.ts +1 -1
  77. package/dist/api/helix.js +1 -1
  78. package/dist/api/helix.js.map +1 -1
  79. package/dist/api/index.d.ts +4 -1
  80. package/dist/api/index.d.ts.map +1 -1
  81. package/dist/api/index.js +16 -4
  82. package/dist/api/index.js.map +1 -1
  83. package/dist/api/internal/compat-op.d.ts +6 -6
  84. package/dist/api/internal/compat-op.d.ts.map +1 -1
  85. package/dist/api/internal/compat-op.js +7 -9
  86. package/dist/api/internal/compat-op.js.map +1 -1
  87. package/dist/api/internal/export-members.d.ts +80 -0
  88. package/dist/api/internal/export-members.d.ts.map +1 -0
  89. package/dist/api/internal/export-members.js +104 -0
  90. package/dist/api/internal/export-members.js.map +1 -0
  91. package/dist/api/internal/l3-bridge.d.ts +17 -0
  92. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  93. package/dist/api/internal/l3-bridge.js +23 -1
  94. package/dist/api/internal/l3-bridge.js.map +1 -1
  95. package/dist/api/measure-query/index.d.ts +262 -0
  96. package/dist/api/measure-query/index.d.ts.map +1 -0
  97. package/dist/api/measure-query/index.js +390 -0
  98. package/dist/api/measure-query/index.js.map +1 -0
  99. package/dist/api/pattern.d.ts.map +1 -1
  100. package/dist/api/pattern.js +0 -3
  101. package/dist/api/pattern.js.map +1 -1
  102. package/dist/api/primitives.d.ts +6 -6
  103. package/dist/api/primitives.d.ts.map +1 -1
  104. package/dist/api/primitives.js +12 -11
  105. package/dist/api/primitives.js.map +1 -1
  106. package/dist/api/profile.d.ts.map +1 -1
  107. package/dist/api/profile.js +0 -1
  108. package/dist/api/profile.js.map +1 -1
  109. package/dist/api/punch-hole.d.ts.map +1 -1
  110. package/dist/api/punch-hole.js +0 -1
  111. package/dist/api/punch-hole.js.map +1 -1
  112. package/dist/api/replicate.d.ts +5 -7
  113. package/dist/api/replicate.d.ts.map +1 -1
  114. package/dist/api/replicate.js +18 -56
  115. package/dist/api/replicate.js.map +1 -1
  116. package/dist/api/section-by-plane.d.ts.map +1 -1
  117. package/dist/api/section-by-plane.js +0 -1
  118. package/dist/api/section-by-plane.js.map +1 -1
  119. package/dist/api/shell.d.ts +1 -1
  120. package/dist/api/shell.d.ts.map +1 -1
  121. package/dist/api/shell.js +11 -2
  122. package/dist/api/shell.js.map +1 -1
  123. package/dist/api/sketch-on-face.d.ts +3 -3
  124. package/dist/api/sketch-on-face.d.ts.map +1 -1
  125. package/dist/api/sketch-on-face.js +6 -4
  126. package/dist/api/sketch-on-face.js.map +1 -1
  127. package/dist/api/sketch-on-plane.d.ts.map +1 -1
  128. package/dist/api/sketch-on-plane.js +0 -1
  129. package/dist/api/sketch-on-plane.js.map +1 -1
  130. package/dist/api/split-by-plane.d.ts.map +1 -1
  131. package/dist/api/split-by-plane.js +0 -1
  132. package/dist/api/split-by-plane.js.map +1 -1
  133. package/dist/api/split.d.ts +1 -1
  134. package/dist/api/split.js +1 -1
  135. package/dist/api/split.js.map +1 -1
  136. package/dist/api/surface/arg-spec.d.ts +3 -12
  137. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  138. package/dist/api/surface/arg-spec.js +19 -26
  139. package/dist/api/surface/arg-spec.js.map +1 -1
  140. package/dist/api/sweep.d.ts +15 -3
  141. package/dist/api/sweep.d.ts.map +1 -1
  142. package/dist/api/sweep.js +5 -3
  143. package/dist/api/sweep.js.map +1 -1
  144. package/dist/api/thicken.d.ts.map +1 -1
  145. package/dist/api/thicken.js +11 -2
  146. package/dist/api/thicken.js.map +1 -1
  147. package/dist/api/transform.d.ts +3 -3
  148. package/dist/api/transform.d.ts.map +1 -1
  149. package/dist/api/transform.js +47 -17
  150. package/dist/api/transform.js.map +1 -1
  151. package/dist/boolean/index.d.ts +23 -0
  152. package/dist/boolean/index.d.ts.map +1 -0
  153. package/dist/boolean/index.js +27 -0
  154. package/dist/boolean/index.js.map +1 -0
  155. package/dist/brep/brep-chain.d.ts +1 -19
  156. package/dist/brep/brep-chain.d.ts.map +1 -1
  157. package/dist/brep/brep-chain.js +0 -1
  158. package/dist/brep/brep-chain.js.map +1 -1
  159. package/dist/brep/brep-ops.d.ts +4 -1
  160. package/dist/brep/brep-ops.d.ts.map +1 -1
  161. package/dist/brep/brep-ops.js +9 -5
  162. package/dist/brep/brep-ops.js.map +1 -1
  163. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  164. package/dist/brep/engine/adapters/brep-mock.js +0 -3
  165. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  166. package/dist/brep/engine/adapters/brepkit.d.ts +4 -3
  167. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  168. package/dist/brep/engine/adapters/brepkit.js +4 -98
  169. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  170. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  171. package/dist/brep/engine/adapters/occt.js +0 -144
  172. package/dist/brep/engine/adapters/occt.js.map +1 -1
  173. package/dist/brep/engine/native-history.d.ts +27 -0
  174. package/dist/brep/engine/native-history.d.ts.map +1 -0
  175. package/dist/brep/engine/native-history.js +54 -0
  176. package/dist/brep/engine/native-history.js.map +1 -0
  177. package/dist/brep/engine/registry.d.ts +2 -4
  178. package/dist/brep/engine/registry.d.ts.map +1 -1
  179. package/dist/brep/engine/registry.js +1 -1
  180. package/dist/brep/engine/registry.js.map +1 -1
  181. package/dist/brep/engine/types.d.ts +35 -77
  182. package/dist/brep/engine/types.d.ts.map +1 -1
  183. package/dist/brep/engine/types.js.map +1 -1
  184. package/dist/brep/export/export-model.d.ts +21 -0
  185. package/dist/brep/export/export-model.d.ts.map +1 -1
  186. package/dist/brep/export/export-model.js +171 -73
  187. package/dist/brep/export/export-model.js.map +1 -1
  188. package/dist/brep/export/step.d.ts +17 -1
  189. package/dist/brep/export/step.d.ts.map +1 -1
  190. package/dist/brep/export/step.js +133 -0
  191. package/dist/brep/export/step.js.map +1 -1
  192. package/dist/brep/export/stl.d.ts +22 -1
  193. package/dist/brep/export/stl.d.ts.map +1 -1
  194. package/dist/brep/export/stl.js +58 -10
  195. package/dist/brep/export/stl.js.map +1 -1
  196. package/dist/brep/export/transform12.d.ts +47 -0
  197. package/dist/brep/export/transform12.d.ts.map +1 -0
  198. package/dist/brep/export/transform12.js +87 -0
  199. package/dist/brep/export/transform12.js.map +1 -0
  200. package/dist/brep/face-evolution.d.ts +53 -0
  201. package/dist/brep/face-evolution.d.ts.map +1 -1
  202. package/dist/brep/face-evolution.js +65 -0
  203. package/dist/brep/face-evolution.js.map +1 -1
  204. package/dist/browser-host/index.d.ts +4 -1
  205. package/dist/browser-host/index.d.ts.map +1 -1
  206. package/dist/browser-host/index.js +7 -1
  207. package/dist/browser-host/index.js.map +1 -1
  208. package/dist/browser.d.ts +4 -8
  209. package/dist/browser.d.ts.map +1 -1
  210. package/dist/browser.js +4 -26
  211. package/dist/browser.js.map +1 -1
  212. package/dist/cad-runtime/backend-dispatch.d.ts +13 -58
  213. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  214. package/dist/cad-runtime/backend-dispatch.js +22 -80
  215. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  216. package/dist/cad-runtime/content-key.d.ts +3 -3
  217. package/dist/cad-runtime/content-key.js +3 -3
  218. package/dist/cad-runtime/content-key.js.map +1 -1
  219. package/dist/cad-runtime/ports.d.ts +28 -0
  220. package/dist/cad-runtime/ports.d.ts.map +1 -1
  221. package/dist/cad-runtime/ports.js.map +1 -1
  222. package/dist/cad-runtime/runtime.d.ts +33 -12
  223. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  224. package/dist/cad-runtime/runtime.js +44 -48
  225. package/dist/cad-runtime/runtime.js.map +1 -1
  226. package/dist/define-op.d.ts +6 -11
  227. package/dist/define-op.d.ts.map +1 -1
  228. package/dist/define-op.js +3 -20
  229. package/dist/define-op.js.map +1 -1
  230. package/dist/env-agnostic.d.ts +2 -2
  231. package/dist/env-agnostic.d.ts.map +1 -1
  232. package/dist/env-agnostic.js +1 -1
  233. package/dist/env-agnostic.js.map +1 -1
  234. package/dist/index.d.ts +13 -64
  235. package/dist/index.d.ts.map +1 -1
  236. package/dist/index.js +17 -75
  237. package/dist/index.js.map +1 -1
  238. package/dist/lang/symbol-table.generated.d.ts +17 -0
  239. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  240. package/dist/lang/symbol-table.generated.js +17 -0
  241. package/dist/lang/symbol-table.generated.js.map +1 -1
  242. package/dist/mesh/index.d.ts +18 -23
  243. package/dist/mesh/index.d.ts.map +1 -1
  244. package/dist/mesh/index.js +18 -20
  245. package/dist/mesh/index.js.map +1 -1
  246. package/dist/mesh/io.d.ts +42 -14
  247. package/dist/mesh/io.d.ts.map +1 -1
  248. package/dist/mesh/io.js +77 -13
  249. package/dist/mesh/io.js.map +1 -1
  250. package/dist/mesh/threemf-loader.d.ts +38 -4
  251. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  252. package/dist/mesh/threemf-loader.js +115 -34
  253. package/dist/mesh/threemf-loader.js.map +1 -1
  254. package/dist/mesh/types.d.ts +30 -0
  255. package/dist/mesh/types.d.ts.map +1 -1
  256. package/dist/mesh/types.js.map +1 -1
  257. package/dist/node-host/execute-script.d.ts +2 -1
  258. package/dist/node-host/execute-script.d.ts.map +1 -1
  259. package/dist/node-host/execute-script.js +5 -4
  260. package/dist/node-host/execute-script.js.map +1 -1
  261. package/dist/node-host/index.d.ts +1 -0
  262. package/dist/node-host/index.d.ts.map +1 -1
  263. package/dist/node-host/index.js +4 -0
  264. package/dist/node-host/index.js.map +1 -1
  265. package/dist/primitives/index.d.ts +19 -0
  266. package/dist/primitives/index.d.ts.map +1 -0
  267. package/dist/primitives/index.js +21 -0
  268. package/dist/primitives/index.js.map +1 -0
  269. package/dist/runtime-state.d.ts +63 -29
  270. package/dist/runtime-state.d.ts.map +1 -1
  271. package/dist/runtime-state.js +57 -0
  272. package/dist/runtime-state.js.map +1 -1
  273. package/dist/sdf/index.d.ts +12 -0
  274. package/dist/sdf/index.d.ts.map +1 -0
  275. package/dist/sdf/index.js +13 -0
  276. package/dist/sdf/index.js.map +1 -0
  277. package/dist/sdk.d.ts +0 -1
  278. package/dist/sdk.d.ts.map +1 -1
  279. package/dist/sdk.js.map +1 -1
  280. package/dist/weapp.d.ts +2 -2
  281. package/dist/weapp.d.ts.map +1 -1
  282. package/dist/weapp.js +1 -1
  283. package/dist/weapp.js.map +1 -1
  284. package/package.json +276 -35
@@ -0,0 +1,64 @@
1
+ /**
2
+ * api align — 包围盒锚点对齐族(S4 剩余,平台 op engines:['occt'])
3
+ *
4
+ * @platform occt — 三个原生方法 `alignX` / `alignY` / `alignZ`(occt-wasm 5.6.0 有)
5
+ * 直调 occt:**不在** L1 契约 `BrepEngineApi` 里(L1 只有 `translate` 这类按向量平移,
6
+ * 没有「把包围盒某个锚点挪到目标坐标」的成员)⇒ 平台 op。
7
+ *
8
+ * 方案落点:docs/plans/2026-10-07-occt-wasm-op-enablement-plan.md §3.4.9。落地为一个
9
+ * **脚本符号** `alignTo(shape, axis, options?)`:三轴的动作是同一能力的三参数形态,
10
+ * 分成三个符号会平白制造三个名字(同一治理理由见 `liftCurve2d` 与 `view-export`)。
11
+ *
12
+ * 语义:按 `anchor`(min / center / max)取形状包围盒在该轴的极值,平移使该值落到
13
+ * `target`。**输入形状不动**(原生返回新句柄)。
14
+ *
15
+ * GOTCHA(实测钉住,test/api/occt-s4-boolean-align.test.ts A4b):`target` 与 `anchor`
16
+ * 在 d.ts 里都写作可选,但原生的**默认值**是 `target = 0` 且 **`anchor = 'center'`**
17
+ * (dist/index.js:549-553 的默认参数)——不是直觉上的 min。缺省调用
18
+ * `alignTo(shape, 'z')` 会把包围盒的 **中点** 挪到 z=0,而不是把最低点抬到 z=0。
19
+ * 本 op 不替上游编默认值(缺省一律透传 undefined 让原生默认生效),因此这条语义
20
+ * 变化会直接透到脚本面。
21
+ *
22
+ * naming:本族是刚体平移 ⇒ `kernel` + `newFaces: { via: 'byAdjacency' }`,与
23
+ * api/transform.ts 的 `translate` 同口径(刚体变换不改面集,演化由邻接关系推导)。
24
+ *
25
+ * §9.5 降级路径:一旦 L1 契约补上进 bezeichnet 的对齐成员且两侧适配器同时落地,删掉
26
+ * `engines` 声明改走 getBrepApi(),三个原生方法即从 C2 转入 C1。
27
+ */
28
+ import type { Shape } from '../../mesh/types.js';
29
+ /** 对齐的目标轴。 */
30
+ export type AlignAxis = 'x' | 'y' | 'z';
31
+ /** 包围盒上被对齐的那个锚点(与 occt-wasm 的 `AlignAnchor` 字面量一致)。 */
32
+ export type AlignAnchor = 'min' | 'center' | 'max';
33
+ /** `alignTo` 的选项(两个字段都缺省时取原生默认:target 0 / anchor 'min')。 */
34
+ export interface AlignOptions {
35
+ /** 目标坐标;缺省交由原生默认(0)。type:number required:false */
36
+ target?: number;
37
+ /** 包围盒锚点;缺省交由原生默认(min)。type:string required:false */
38
+ anchor?: AlignAnchor;
39
+ }
40
+ /**
41
+ * 把形状沿某一轴平移,使其包围盒的指定锚点落到目标坐标。
42
+ * @group 变换
43
+ * @inputs 1
44
+ * @async false
45
+ * @qual ok
46
+ * @name alignTo
47
+ * @note 平台 op:仅 occt 引擎(原生 alignX/alignY/alignZ,L1 契约无对应成员)。
48
+ * 非 occt 引擎执行前报错;brep_mock 不拦截。
49
+ * 输入的原形状**不会被改动**——原生返回新句柄。
50
+ * @returns Shape 对齐后的形状。
51
+ * @param shape - 被对齐的形状。type:Shape required:true
52
+ * @param axis - 对齐的目标轴(x/y/z)。type:string required:true
53
+ * @param options.target - 目标坐标(缺省交由原生默认)。type:number required:false
54
+ * @param options.anchor - 包围盒锚点 min|center|max(缺省交由原生默认)。type:string required:false
55
+ * @example
56
+ * // 把零件放到 XY 平面上(最低点抬到 z=0)
57
+ * const flat = cad.alignTo(part0, 'z')
58
+ * // 居中:把 x 方向的包围盒中点移到 0
59
+ * const centered = cad.alignTo(part0, 'x', { target: 0, anchor: 'center' })
60
+ */
61
+ export declare const alignTo: ((shape: Shape, axis: AlignAxis, options?: AlignOptions | undefined) => Promise<Shape>) & {
62
+ __faijs__dualOp?: import("../../define-op.js").DualOpMeta;
63
+ };
64
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/align/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAS7C,cAAc;AACd,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAEvC,uDAAuD;AACvD,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAA;AAElD,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qDAAqD;IACrD,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AA6CD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,OAAO;;CAQlB,CAAA"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * api align — 包围盒锚点对齐族(S4 剩余,平台 op engines:['occt'])
3
+ *
4
+ * @platform occt — 三个原生方法 `alignX` / `alignY` / `alignZ`(occt-wasm 5.6.0 有)
5
+ * 直调 occt:**不在** L1 契约 `BrepEngineApi` 里(L1 只有 `translate` 这类按向量平移,
6
+ * 没有「把包围盒某个锚点挪到目标坐标」的成员)⇒ 平台 op。
7
+ *
8
+ * 方案落点:docs/plans/2026-10-07-occt-wasm-op-enablement-plan.md §3.4.9。落地为一个
9
+ * **脚本符号** `alignTo(shape, axis, options?)`:三轴的动作是同一能力的三参数形态,
10
+ * 分成三个符号会平白制造三个名字(同一治理理由见 `liftCurve2d` 与 `view-export`)。
11
+ *
12
+ * 语义:按 `anchor`(min / center / max)取形状包围盒在该轴的极值,平移使该值落到
13
+ * `target`。**输入形状不动**(原生返回新句柄)。
14
+ *
15
+ * GOTCHA(实测钉住,test/api/occt-s4-boolean-align.test.ts A4b):`target` 与 `anchor`
16
+ * 在 d.ts 里都写作可选,但原生的**默认值**是 `target = 0` 且 **`anchor = 'center'`**
17
+ * (dist/index.js:549-553 的默认参数)——不是直觉上的 min。缺省调用
18
+ * `alignTo(shape, 'z')` 会把包围盒的 **中点** 挪到 z=0,而不是把最低点抬到 z=0。
19
+ * 本 op 不替上游编默认值(缺省一律透传 undefined 让原生默认生效),因此这条语义
20
+ * 变化会直接透到脚本面。
21
+ *
22
+ * naming:本族是刚体平移 ⇒ `kernel` + `newFaces: { via: 'byAdjacency' }`,与
23
+ * api/transform.ts 的 `translate` 同口径(刚体变换不改面集,演化由邻接关系推导)。
24
+ *
25
+ * §9.5 降级路径:一旦 L1 契约补上进 bezeichnet 的对齐成员且两侧适配器同时落地,删掉
26
+ * `engines` 声明改走 getBrepApi(),三个原生方法即从 C2 转入 C1。
27
+ */
28
+ import { solidToShape } from '../../brep/brep-ops.js';
29
+ import { getBrepApi } from '../../brep/handle-bridge.js';
30
+ import { brepOf, fromBrep } from '../../shape.js';
31
+ import { defineOp } from '../../sdk.js';
32
+ import { getOcctKernel } from '../../occt-kernel/occtKernel.js';
33
+ const AXES = ['x', 'y', 'z'];
34
+ const ANCHORS = ['min', 'center', 'max'];
35
+ /** 输入 Shape → 内核句柄(无 BREP 槽报错)。 */
36
+ function handleOf(shape) {
37
+ const h = brepOf(shape);
38
+ if (!h) {
39
+ throw new Error('E_ALIGNTO_NO_BREP: alignTo requires a BREP handle (mesh-only shape has none)');
40
+ }
41
+ return h;
42
+ }
43
+ /** BREP 路径:按轴分派到 occt 原生 alignX / alignY / alignZ。 */
44
+ function alignToBrep(shape, axis, options) {
45
+ if (!shape) {
46
+ throw new Error('E_ALIGNTO_NO_INPUT: alignTo requires an input shape');
47
+ }
48
+ if (!AXES.includes(axis)) {
49
+ throw new Error(`E_ALIGNTO_BAD_AXIS: axis must be one of x/y/z (got ${String(axis)})`);
50
+ }
51
+ const opts = options ?? {};
52
+ if (opts.target !== undefined && (typeof opts.target !== 'number' || !Number.isFinite(opts.target))) {
53
+ throw new Error('E_ALIGNTO_BAD_TARGET: target must be a finite number');
54
+ }
55
+ if (opts.anchor !== undefined && !ANCHORS.includes(opts.anchor)) {
56
+ throw new Error(`E_ALIGNTO_BAD_ANCHOR: anchor must be one of min/center/max (got ${String(opts.anchor)})`);
57
+ }
58
+ const h = handleOf(shape);
59
+ const k = getOcctKernel();
60
+ const { target, anchor } = opts;
61
+ // 三分支**显式直调**(不用 `const native = axis === 'x' ? k.alignX : …` 再
62
+ // `.call()`):动态取属性会让覆盖率扫描器(scan-occt-op-coverage.ts)看不见
63
+ // alignX/alignY/alignZ,它们会掉回 C4 而被误判成「未接入」。
64
+ const handle = (axis === 'x'
65
+ ? k.alignX(h, target, anchor)
66
+ : axis === 'y'
67
+ ? k.alignY(h, target, anchor)
68
+ : k.alignZ(h, target, anchor));
69
+ return fromBrep(solidToShape(getBrepApi(), handle), { solid: handle });
70
+ }
71
+ /**
72
+ * 把形状沿某一轴平移,使其包围盒的指定锚点落到目标坐标。
73
+ * @group 变换
74
+ * @inputs 1
75
+ * @async false
76
+ * @qual ok
77
+ * @name alignTo
78
+ * @note 平台 op:仅 occt 引擎(原生 alignX/alignY/alignZ,L1 契约无对应成员)。
79
+ * 非 occt 引擎执行前报错;brep_mock 不拦截。
80
+ * 输入的原形状**不会被改动**——原生返回新句柄。
81
+ * @returns Shape 对齐后的形状。
82
+ * @param shape - 被对齐的形状。type:Shape required:true
83
+ * @param axis - 对齐的目标轴(x/y/z)。type:string required:true
84
+ * @param options.target - 目标坐标(缺省交由原生默认)。type:number required:false
85
+ * @param options.anchor - 包围盒锚点 min|center|max(缺省交由原生默认)。type:string required:false
86
+ * @example
87
+ * // 把零件放到 XY 平面上(最低点抬到 z=0)
88
+ * const flat = cad.alignTo(part0, 'z')
89
+ * // 居中:把 x 方向的包围盒中点移到 0
90
+ * const centered = cad.alignTo(part0, 'x', { target: 0, anchor: 'center' })
91
+ */
92
+ export const alignTo = defineOp({
93
+ name: 'alignTo',
94
+ paramDims: { options: 'length' },
95
+ brep(shape, axis, options) {
96
+ return alignToBrep(shape, axis, options);
97
+ },
98
+ engines: ['occt'],
99
+ naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
100
+ });
101
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/align/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api align — 包围盒锚点对齐族(S4 剩余,平台 op engines:['occt'])\n *\n * @platform occt — 三个原生方法 `alignX` / `alignY` / `alignZ`(occt-wasm 5.6.0 有)\n * 直调 occt:**不在** L1 契约 `BrepEngineApi` 里(L1 只有 `translate` 这类按向量平移,\n * 没有「把包围盒某个锚点挪到目标坐标」的成员)⇒ 平台 op。\n *\n * 方案落点:docs/plans/2026-10-07-occt-wasm-op-enablement-plan.md §3.4.9。落地为一个\n * **脚本符号** `alignTo(shape, axis, options?)`:三轴的动作是同一能力的三参数形态,\n * 分成三个符号会平白制造三个名字(同一治理理由见 `liftCurve2d` 与 `view-export`)。\n *\n * 语义:按 `anchor`(min / center / max)取形状包围盒在该轴的极值,平移使该值落到\n * `target`。**输入形状不动**(原生返回新句柄)。\n *\n * GOTCHA(实测钉住,test/api/occt-s4-boolean-align.test.ts A4b):`target` 与 `anchor`\n * 在 d.ts 里都写作可选,但原生的**默认值**是 `target = 0` 且 **`anchor = 'center'`**\n * (dist/index.js:549-553 的默认参数)——不是直觉上的 min。缺省调用\n * `alignTo(shape, 'z')` 会把包围盒的 **中点** 挪到 z=0,而不是把最低点抬到 z=0。\n * 本 op 不替上游编默认值(缺省一律透传 undefined 让原生默认生效),因此这条语义\n * 变化会直接透到脚本面。\n *\n * naming:本族是刚体平移 ⇒ `kernel` + `newFaces: { via: 'byAdjacency' }`,与\n * api/transform.ts 的 `translate` 同口径(刚体变换不改面集,演化由邻接关系推导)。\n *\n * §9.5 降级路径:一旦 L1 契约补上进 bezeichnet 的对齐成员且两侧适配器同时落地,删掉\n * `engines` 声明改走 getBrepApi(),三个原生方法即从 C2 转入 C1。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { solidToShape } from '../../brep/brep-ops'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { brepOf, fromBrep } from '../../shape'\nimport { defineOp } from '../../sdk'\nimport type { Provenance } from '../../topology/naming/lineage'\nimport { getOcctKernel } from '../../occt-kernel/occtKernel'\n\n/** 对齐的目标轴。 */\nexport type AlignAxis = 'x' | 'y' | 'z'\n\n/** 包围盒上被对齐的那个锚点(与 occt-wasm 的 `AlignAnchor` 字面量一致)。 */\nexport type AlignAnchor = 'min' | 'center' | 'max'\n\n/** `alignTo` 的选项(两个字段都缺省时取原生默认:target 0 / anchor 'min')。 */\nexport interface AlignOptions {\n /** 目标坐标;缺省交由原生默认(0)。type:number required:false */\n target?: number\n /** 包围盒锚点;缺省交由原生默认(min)。type:string required:false */\n anchor?: AlignAnchor\n}\n\nconst AXES: readonly AlignAxis[] = ['x', 'y', 'z']\nconst ANCHORS: readonly AlignAnchor[] = ['min', 'center', 'max']\n\n/** 输入 Shape → 内核句柄(无 BREP 槽报错)。 */\nfunction handleOf(shape: Shape): BrepHandle {\n const h = brepOf(shape) as BrepHandle | undefined\n if (!h) {\n throw new Error('E_ALIGNTO_NO_BREP: alignTo requires a BREP handle (mesh-only shape has none)')\n }\n return h\n}\n\n/** BREP 路径:按轴分派到 occt 原生 alignX / alignY / alignZ。 */\nfunction alignToBrep(shape: Shape, axis: AlignAxis, options?: AlignOptions): Shape {\n if (!shape) {\n throw new Error('E_ALIGNTO_NO_INPUT: alignTo requires an input shape')\n }\n if (!AXES.includes(axis)) {\n throw new Error(`E_ALIGNTO_BAD_AXIS: axis must be one of x/y/z (got ${String(axis)})`)\n }\n const opts = options ?? {}\n if (opts.target !== undefined && (typeof opts.target !== 'number' || !Number.isFinite(opts.target))) {\n throw new Error('E_ALIGNTO_BAD_TARGET: target must be a finite number')\n }\n if (opts.anchor !== undefined && !ANCHORS.includes(opts.anchor)) {\n throw new Error(`E_ALIGNTO_BAD_ANCHOR: anchor must be one of min/center/max (got ${String(opts.anchor)})`)\n }\n const h = handleOf(shape)\n const k = getOcctKernel()\n const { target, anchor } = opts\n // 三分支**显式直调**(不用 `const native = axis === 'x' ? k.alignX : …` 再\n // `.call()`):动态取属性会让覆盖率扫描器(scan-occt-op-coverage.ts)看不见\n // alignX/alignY/alignZ,它们会掉回 C4 而被误判成「未接入」。\n const handle = (\n axis === 'x'\n ? k.alignX(h as never, target, anchor as never)\n : axis === 'y'\n ? k.alignY(h as never, target, anchor as never)\n : k.alignZ(h as never, target, anchor as never)\n ) as unknown as BrepHandle\n return fromBrep(solidToShape(getBrepApi(), handle), { solid: handle })\n}\n\n/**\n * 把形状沿某一轴平移,使其包围盒的指定锚点落到目标坐标。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name alignTo\n * @note 平台 op:仅 occt 引擎(原生 alignX/alignY/alignZ,L1 契约无对应成员)。\n * 非 occt 引擎执行前报错;brep_mock 不拦截。\n * 输入的原形状**不会被改动**——原生返回新句柄。\n * @returns Shape 对齐后的形状。\n * @param shape - 被对齐的形状。type:Shape required:true\n * @param axis - 对齐的目标轴(x/y/z)。type:string required:true\n * @param options.target - 目标坐标(缺省交由原生默认)。type:number required:false\n * @param options.anchor - 包围盒锚点 min|center|max(缺省交由原生默认)。type:string required:false\n * @example\n * // 把零件放到 XY 平面上(最低点抬到 z=0)\n * const flat = cad.alignTo(part0, 'z')\n * // 居中:把 x 方向的包围盒中点移到 0\n * const centered = cad.alignTo(part0, 'x', { target: 0, anchor: 'center' })\n */\nexport const alignTo = defineOp({\n name: 'alignTo',\n paramDims: { options: 'length' },\n brep(shape: Shape, axis: AlignAxis, options?: AlignOptions) {\n return alignToBrep(shape, axis, options)\n },\n engines: ['occt'],\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
@@ -9,7 +9,7 @@
9
9
  * runtime 不按函数名分支、不区分函数类别,函数信息统一以 defineOp 元数据(均匀数据)
10
10
  * 承载。把 cad 这套库数据内置进引擎,与第三方库走完全相同的 registerLib 路径,
11
11
  * 引擎并未对 cad 特判,因此不构成 K5 违反。cad 在 core 的 createRuntime 包装中
12
- * 被注册为 default 命名空间(见 cad-runtime/createRuntimeWithCad.ts)。
12
+ * 被注册为 default 命名空间(见 cad-runtime/runtime.ts 的 createRuntime)。
13
13
  *
14
14
  * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op
15
15
  * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op
@@ -22,11 +22,12 @@ import type { LibNamespace } from '../runtime-state.js';
22
22
  /**
23
23
  * Assemble api functions into the cad namespace.
24
24
  *
25
- * P23(§4.2 ②,B1 三源一致):cad 面 = faijs 特有 dual op(下方字面量)+
25
+ * P23(§4.2 ②,B1):cad 面 = faijs 特有 dual op(下方字面量)+
26
26
  * 生成脚本面 op(`scriptFaceOps`——`api/generated/script-face.ts` 按 arg-spec
27
27
  * 的 `scriptFace: true` 条目生成,`defineOp({ brep: __own_* })` 直连的
28
- * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)与
29
- * `api/index.ts` 导出面同源于同一份清单。
28
+ * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)取自同一份清单。
29
+ * 2026-10-08(§2.7 / DEC-6、DEC-7):本命名空间**不再**要求被 `api/index.ts`
30
+ * 平铺——库面只保留有库作者消费者的名字,其余脚本 op 只走 `cad.*` 与子路径。
30
31
  *
31
32
  * @returns the assembled LibNamespace ready for runtime injection.
32
33
  */
@@ -1 +1 @@
1
- {"version":3,"file":"api-namespace.d.ts","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA6EH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CA4EjD"}
1
+ {"version":3,"file":"api-namespace.d.ts","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAqGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAwFjD"}
@@ -9,7 +9,7 @@
9
9
  * runtime 不按函数名分支、不区分函数类别,函数信息统一以 defineOp 元数据(均匀数据)
10
10
  * 承载。把 cad 这套库数据内置进引擎,与第三方库走完全相同的 registerLib 路径,
11
11
  * 引擎并未对 cad 特判,因此不构成 K5 违反。cad 在 core 的 createRuntime 包装中
12
- * 被注册为 default 命名空间(见 cad-runtime/createRuntimeWithCad.ts)。
12
+ * 被注册为 default 命名空间(见 cad-runtime/runtime.ts 的 createRuntime)。
13
13
  *
14
14
  * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op
15
15
  * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op
@@ -38,6 +38,12 @@ import { solidFromFaces } from './solid-from-faces.js';
38
38
  import { halfSpace } from './half-space.js';
39
39
  import { exportStl } from './export-stl.js';
40
40
  import { exportBrep } from './export-brep.js';
41
+ // 2026-10-08(方案 §2.6 / DEC-3):脚本面 step / 3mf 出口。两者都是薄壳:宿主门
42
+ // (+ exportStep 的 occt 引擎门)之后把入参转成 ExportEntry[],序列化一律交库面
43
+ // exportModelSync(单一真源),故与库面逐字节同源。只进脚本面(本字面量 + check()
44
+ // 符号表),**不平铺 api/index.ts**(§2.7 / DEC-6)。
45
+ import { exportStep } from './export-step.js';
46
+ import { export3mf } from './export-3mf.js';
41
47
  // S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],普通函数形态)。
42
48
  // 直调 occt 原生 isEdge/isFace/isShell/isVertex/isWire/isCompound/isCompSolid/isEqual
43
49
  // (不在 L1 契约,方案 §3.4.6 校正注);布尔返回,走 export-brep 同口径。
@@ -59,6 +65,19 @@ import { faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire } f
59
65
  // 直调 occt 原生 draftPrism/pipe(不在 L1 契约;offsetWire2D/buildSolidFromFaces/
60
66
  // halfSpace 已由 S3 落地)。
61
67
  import { draftPrism, pipe } from './solid-offset/index.js';
68
+ // S4(occt-wasm op 接入):测量与查询族(平台 op engines:['occt'],方案 §3.4.6)。
69
+ // 13 个原生方法不在 L1 契约:containsPoint/distanceBetween/getInertia/
70
+ // getLinearCenterOfMass/projectPointOnEdge/projectPointOnFace/classifyPointOnFace/
71
+ // uvFromPoint/vertexPosition/subShapeCount/iterShapes 返回非 Shape,
72
+ // 走 export-brep / shape-type 同口径的普通函数;liftCurve2d / commonCells
73
+ // 返回 Shape,走 defineOp。
74
+ import { containsPoint, distanceBetween, inertia, linearCenterOfMass, projectPointOnEdge, projectPointOnFace, classifyPointOnFace, uvFromPoint, vertexPosition, subShapeCount, iterShapes, liftCurve2d, commonCells, } from './measure-query/index.js';
75
+ // S4(occt-wasm op 接入):通用布尔族(平台 op engines:['occt'],方案 §3.4.5)——
76
+ // 原生 booleanOp:带 glue/fuzzy/simplify 选项的通用形态,不在 L1 契约。
77
+ import { boolean as booleanWithOptions } from './boolean-op/index.js';
78
+ // S4(occt-wasm op 接入):包围盒对齐族(平台 op engines:['occt'],方案 §3.4.9)——
79
+ // 原生 alignX/alignY/alignZ 三轴并为一个脚本符号 alignTo。
80
+ import { alignTo } from './align/index.js';
62
81
  import { union, subtract, intersect, cut } from './boolean.js';
63
82
  import { split } from './split.js';
64
83
  import { sweep } from './sweep.js';
@@ -90,11 +109,12 @@ import { CONTRACT_VERSION } from '../runtime-state.js';
90
109
  /**
91
110
  * Assemble api functions into the cad namespace.
92
111
  *
93
- * P23(§4.2 ②,B1 三源一致):cad 面 = faijs 特有 dual op(下方字面量)+
112
+ * P23(§4.2 ②,B1):cad 面 = faijs 特有 dual op(下方字面量)+
94
113
  * 生成脚本面 op(`scriptFaceOps`——`api/generated/script-face.ts` 按 arg-spec
95
114
  * 的 `scriptFace: true` 条目生成,`defineOp({ brep: __own_* })` 直连的
96
- * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)与
97
- * `api/index.ts` 导出面同源于同一份清单。
115
+ * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)取自同一份清单。
116
+ * 2026-10-08(§2.7 / DEC-6、DEC-7):本命名空间**不再**要求被 `api/index.ts`
117
+ * 平铺——库面只保留有库作者消费者的名字,其余脚本 op 只走 `cad.*` 与子路径。
98
118
  *
99
119
  * @returns the assembled LibNamespace ready for runtime injection.
100
120
  */
@@ -131,6 +151,9 @@ export function createApiNamespace() {
131
151
  // 无内核调用);exportBrep 平台(原生 toBREP,L1 只有 fromBREP 导入侧)。
132
152
  exportStl,
133
153
  exportBrep,
154
+ // 方案 §2.6:step(occt 必需——装配层级走 XCAF)/ 3mf(引擎中立,纯 XML + ZIP)。
155
+ exportStep,
156
+ export3mf,
134
157
  // S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],布尔返回)。
135
158
  isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual,
136
159
  // S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],字符串/Uint8Array 返回)。
@@ -143,6 +166,15 @@ export function createApiNamespace() {
143
166
  faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire,
144
167
  // S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。
145
168
  draftPrism, pipe,
169
+ // S4(occt-wasm op 接入):测量与查询族(平台 op engines:['occt'],方案 §3.4.6)。
170
+ containsPoint, distanceBetween, inertia, linearCenterOfMass,
171
+ projectPointOnEdge, projectPointOnFace, classifyPointOnFace,
172
+ uvFromPoint, vertexPosition, subShapeCount, iterShapes,
173
+ liftCurve2d, commonCells,
174
+ // S4(occt-wasm op 接入):通用布尔族 booleanOp(方案 §3.4.5)+ 包围盒对齐族
175
+ // alignX/Y/Z → alignTo(方案 §3.4.9),平台 op engines:['occt']。
176
+ boolean: booleanWithOptions,
177
+ alignTo,
146
178
  faceNormal, bboxCenter, bboxMin, bboxMax,
147
179
  edgeRef,
148
180
  faceRef,
@@ -1 +1 @@
1
- {"version":3,"file":"api-namespace.js","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrE,iEAAiE;AACjE,4DAA4D;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,8DAA8D;AAC9D,kFAAkF;AAClF,mDAAmD;AACnD,OAAO,EACL,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,GAC5E,MAAM,cAAc,CAAA;AACrB,6DAA6D;AAC7D,gFAAgF;AAChF,oDAAoD;AACpD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC5E,kEAAkE;AAClE,mFAAmF;AACnF,sFAAsF;AACtF,uEAAuE;AACvE,OAAO,EACL,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EACpD,iBAAiB,EAAE,uBAAuB,EAC1C,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,GACtE,MAAM,gBAAgB,CAAA;AACvB,iEAAiE;AACjE,qFAAqF;AACrF,mDAAmD;AACnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AACpG,kEAAkE;AAClE,wEAAwE;AACxE,uBAAuB;AACvB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACrH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAGnD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB;IAChC,6EAA6E;IAC7E,0EAA0E;IAC1E,0DAA0D;IAC1D,OAAO;QACL,eAAe,EAAE,gBAAgB;QACjC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK;QAClC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG;QACxE,wDAAwD;QACxD,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO;QACvC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK;QAC/B,6DAA6D;QAC7D,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc;QACnE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,mBAAmB;QAClF,KAAK,EAAE,QAAQ,EAAE,SAAS;QAC1B,OAAO,EAAE,OAAO;QAChB,6DAA6D;QAC7D,2DAA2D;QAC3D,kDAAkD;QAClD,KAAK,EAAE,IAAI;QACX,4DAA4D;QAC5D,OAAO;QACP,uEAAuE;QACvE,QAAQ;QACR,gFAAgF;QAChF,cAAc;QACd,mEAAmE;QACnE,2DAA2D;QAC3D,SAAS;QACT,0DAA0D;QAC1D,sDAAsD;QACtD,SAAS;QACT,UAAU;QACV,4DAA4D;QAC5D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO;QAC3E,wEAAwE;QACxE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc;QAC5C,kEAAkE;QAClE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU;QACpD,iBAAiB,EAAE,uBAAuB;QAC1C,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe;QACrE,iEAAiE;QACjE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS;QACnE,kEAAkE;QAClE,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;QACxC,OAAO;QACP,OAAO;QACP,eAAe,EAAE,iBAAiB,EAAE,YAAY;QAChD,KAAK;QACL,0CAA0C;QAC1C,wDAAwD;QACxD,WAAW;QACX,WAAW;QACX,QAAQ,EAAE,iBAAiB;QAC3B,KAAK;QACL,GAAG,aAAa;QAChB,4EAA4E;QAC5E,gFAAgF;QAChF,GAAG;QACH,4EAA4E;QAC5E,8EAA8E;QAC9E,uEAAuE;QACvE,KAAK;QACL,aAAa;QACb,oDAAoD;QACpD,6DAA6D;QAC7D,iEAAiE;QACjE,0CAA0C;QAC1C,eAAe;QACf,WAAW;QACX,kBAAkB;QAClB,UAAU;QACV,MAAM;QACN,KAAK;KACqB,CAAA;AAC9B,CAAC","sourcesContent":["/**\n * api-namespace — 把 L3 API 面(api/ 层的 fp操作)装配为 cad 命名空间(统一 ABI,B2 消灭)\n *\n *\n * 库函数签名 = .fai.js 源码形态(无隐式参数);本文件无任何 per-函数逻辑。\n *\n * 归属(monorepo P5/E-a-1):本文件随 core 出包,是 faijs 默认库函数\n * (cad 命名空间)的装配点。K5(引擎零函数知识)的准确含义是:parser / compile /\n * runtime 不按函数名分支、不区分函数类别,函数信息统一以 defineOp 元数据(均匀数据)\n * 承载。把 cad 这套库数据内置进引擎,与第三方库走完全相同的 registerLib 路径,\n * 引擎并未对 cad 特判,因此不构成 K5 违反。cad 在 core 的 createRuntime 包装中\n * 被注册为 default 命名空间(见 cad-runtime/createRuntimeWithCad.ts)。\n *\n * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op\n * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op\n * (`text` / `svgExtrude`)已迁到 `@faicad/faijs-extra`,由宿主经\n * `mergeEditorNamespace()` 合并后注册——键名与拆分前完全一致,存量 `.fai.js` 零迁移。\n * 四个 transform op(translate/rotate_euler/scale/scale3d)按 D1 选项 C 留在此处:\n * `translate` 是通用几何变换,且是小程序端唯一在用的 transform op。\n */\n\nimport { box, sphere, cylinder, cone, wedge } from './primitives'\nimport { translate, rotate_euler, scale, scale3d } from './transform'\n// cad.extrude 是平台手写 op(承载 upTo;长度形态委托 generated/operations 的投影),\n// 见 api/extrude.ts 的分层说明——up-to 不落在 fai_extrude(后者已随扩展库迁出)。\nimport { extrude } from './extrude'\nimport { knurl } from './knurl'\nimport { sdf } from './sdf'\nimport { screw } from './screw'\nimport { profile } from './profile'\nimport { sketchOnPlane } from './sketch-on-plane'\nimport { sketchOnFace } from './sketch-on-face'\nimport { punchHole } from './punch-hole'\nimport { wire } from './wire'\nimport { helix } from './helix'\nimport { surface } from './surface'\nimport { offset2d } from './offset2d'\nimport { solidFromFaces } from './solid-from-faces'\nimport { halfSpace } from './half-space'\nimport { exportStl } from './export-stl'\nimport { exportBrep } from './export-brep'\n// S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],普通函数形态)。\n// 直调 occt 原生 isEdge/isFace/isShell/isVertex/isWire/isCompound/isCompSolid/isEqual\n// (不在 L1 契约,方案 §3.4.6 校正注);布尔返回,走 export-brep 同口径。\nimport {\n isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual,\n} from './shape-type'\n// S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],普通函数形态)。\n// 直调 occt 原生 toSVG/toMultiviewSVG/toPNG/toMultiviewPNG(不在 L1 契约,方案 §3.4.7 校正注);\n// 字符串/Uint8Array 返回,走 export-brep / shape-type 同口径。\nimport { toSVG, toMultiviewSVG, toPNG, toMultiviewPNG } from './view-export'\n// S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。\n// 直调 occt 原生 makeEdge/makeCircleArc/makeEllipseEdge/makeEllipseArc/makeTangentArc/\n// approximatePoints/interpolatePointsWithTangents/curveDegreeElevate/curveKnotInsert/\n// curveKnotRemove/curveIsPeriodic(不在 L1 契约);curveIsPeriodic 布尔返回,普通函数。\nimport {\n edge, circleArc, ellipseEdge, ellipseArc, tangentArc,\n approximatePoints, interpolateWithTangents,\n curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic,\n} from './curve-sketch'\n// S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。\n// 直调 occt 原生 makeFaceOnSurface/makeNonPlanarFace/makeSolid/reverseSurfaceU/outerWire\n// (不在 L1 契约;bsplineSurface 已由 S3 的 surface op 覆盖)。\nimport { faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire } from './surface-face'\n// S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。\n// 直调 occt 原生 draftPrism/pipe(不在 L1 契约;offsetWire2D/buildSolidFromFaces/\n// halfSpace 已由 S3 落地)。\nimport { draftPrism, pipe } from './solid-offset'\nimport { union, subtract, intersect, cut } from './boolean'\nimport { split } from './split'\nimport { sweep } from './sweep'\nimport { loft } from './loft'\nimport { linearPattern } from './pattern'\nimport { circularPattern, gridPattern, rectangularPattern, mirrorJoin, mirror, clone } from './replicate'\nimport { engrave } from './engrave'\nimport { chamfer } from './chamfer'\nimport { fillet } from './fillet'\nimport { shell } from './shell'\nimport { draft } from './draft'\nimport { thicken } from './thicken'\nimport { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace } from './feature-repair'\nimport { filletVariable } from './fillet-variable'\nimport { splitByPlane } from './split-by-plane'\nimport { sectionByPlane } from './section-by-plane'\nimport { faceNormal, bboxCenter, bboxMin, bboxMax } from './geom'\nimport { edgeRef } from './edge-ref'\nimport { faceRef } from './face-ref'\nimport { jointTrajectory, inverseKinematics, mechanismDOF } from './assembly'\nimport { asset } from './asset'\nimport { import_brep } from './import-brep'\nimport { import_step } from './import-step'\nimport { compound as geometricCompound } from './compound-geom'\nimport { place } from './place'\nimport { scriptFaceOps } from './generated/script-face'\nimport { revolve } from './revolve'\nimport { CONTRACT_VERSION } from '../runtime-state'\nimport type { LibNamespace } from '../runtime-state'\n\n/**\n * Assemble api functions into the cad namespace.\n *\n * P23(§4.2 ②,B1 三源一致):cad 面 = faijs 特有 dual op(下方字面量)+\n * 生成脚本面 op(`scriptFaceOps`——`api/generated/script-face.ts` 按 arg-spec\n * 的 `scriptFace: true` 条目生成,`defineOp({ brep: __own_* })` 直连的\n * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)与\n * `api/index.ts` 导出面同源于同一份清单。\n *\n * @returns the assembled LibNamespace ready for runtime injection.\n */\nexport function createApiNamespace(): LibNamespace {\n // D-4 strict assembly check: the cad namespace now exports dual-op functions\n // (defineOp), so registerLib requires a matching contractVersion. Cast is\n // needed because LibNamespace is an index-signature type.\n return {\n contractVersion: CONTRACT_VERSION,\n box, sphere, cylinder, cone, wedge,\n screw, profile, sketchOnPlane, sketchOnFace, punchHole, wire, helix, sdf,\n // D1 选项 C:四个 transform op 全留核心(translate 小程序端在用,同族不拆散)。\n translate, rotate_euler, scale, scale3d,\n engrave, chamfer, fillet, knurl,\n // Phase 5:按面/边选的特征族 + 修复薄包装(shell/draft 中立;thicken 平台 occt)。\n shell, draft, thicken, filletVariable, splitByPlane, sectionByPlane,\n defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace,\n union, subtract, intersect,\n extrude, revolve,\n // Phase 4:手写扫掠 / 放样(平台 op engines:['occt'];截面接受 face → 取外环)。\n // arg-spec 里 sweep 保留 brep-op(引擎记录)/ loft 为 skip,两者均不投脚本面,\n // 所以这里不是 override 而是唯一实现(同 extrude / revolve 口径)。\n sweep, loft,\n // S3(occt-wasm op 接入):控制点阵 → B 样条面(平台 op engines:['occt'])。\n surface,\n // S3(occt-wasm op 接入):2D 轮廓偏置(平台 op engines:['occt'],原生 offsetWire2D)。\n offset2d,\n // S3(occt-wasm op 接入):面集一次成型为实体(平台 op engines:['occt'],原生 buildSolidFromFaces)。\n solidFromFaces,\n // S3(occt-wasm op 接入):无限半空间实体(平台 op engines:['occt'],原生 halfSpace;\n // 无界布尔工具的来源,产物 mesh 为空——单独渲染无意义,只作 cut/common/split 的工具位)。\n halfSpace,\n // S3(occt-wasm op 接入):导出族。exportStl 中立(只序列化 Shape 自带三角载荷,\n // 无内核调用);exportBrep 平台(原生 toBREP,L1 只有 fromBREP 导入侧)。\n exportStl,\n exportBrep,\n // S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],布尔返回)。\n isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual,\n // S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],字符串/Uint8Array 返回)。\n toSVG, toMultiviewSVG, toPNG, toMultiviewPNG,\n // S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。\n edge, circleArc, ellipseEdge, ellipseArc, tangentArc,\n approximatePoints, interpolateWithTangents,\n curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic,\n // S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。\n faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire,\n // S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。\n draftPrism, pipe,\n faceNormal, bboxCenter, bboxMin, bboxMax,\n edgeRef,\n faceRef,\n jointTrajectory, inverseKinematics, mechanismDOF,\n asset,\n // 平台几何 op(H11,方案 §4):FCStd 迁移自此不再借用编辑器 op\n // (group/translate/rotate_euler);这几个与 ../3d_editor 无关系。\n import_brep,\n import_step,\n compound: geometricCompound,\n place,\n ...scriptFaceOps,\n // Phase 3: override generated cut (compatOp, no roleTable propagation) with\n // handwritten cut from boolean.ts (does roleTable propagation via booleanBrep).\n cut,\n // Phase 3: override generated split / linearPattern (compatOp, no roleTable\n // propagation) with handwritten versions that build replica[k] / splinter(#j)\n // role tables (L3 / L4 抗重放词汇). Spread after scriptFaceOps so they win.\n split,\n linearPattern,\n // 覆盖生成版:4 个多副本 pattern 提拔手写(keep + replica[*] 角色表);\n // 2 个单副本(mirror/clone)加 keep 薄 override。transformCopy 不再是脚本面\n // op(arg-spec skip:ComposedTransform 在 .fai.js 不可构造),仅保留 TS 库导出。\n // Spread after scriptFaceOps so they win.\n circularPattern,\n gridPattern,\n rectangularPattern,\n mirrorJoin,\n mirror,\n clone,\n } as unknown as LibNamespace\n}\n"]}
1
+ {"version":3,"file":"api-namespace.js","sourceRoot":"","sources":["../../src/api/api-namespace.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api-namespace — 把 L3 API 面(api/ 层的 fp操作)装配为 cad 命名空间(统一 ABI,B2 消灭)\n *\n *\n * 库函数签名 = .fai.js 源码形态(无隐式参数);本文件无任何 per-函数逻辑。\n *\n * 归属(monorepo P5/E-a-1):本文件随 core 出包,是 faijs 默认库函数\n * (cad 命名空间)的装配点。K5(引擎零函数知识)的准确含义是:parser / compile /\n * runtime 不按函数名分支、不区分函数类别,函数信息统一以 defineOp 元数据(均匀数据)\n * 承载。把 cad 这套库数据内置进引擎,与第三方库走完全相同的 registerLib 路径,\n * 引擎并未对 cad 特判,因此不构成 K5 违反。cad 在 core 的 createRuntime 包装中\n * 被注册为 default 命名空间(见 cad-runtime/runtime.ts 的 createRuntime)。\n *\n * D1(2026-09-23 扩展库拆分):本命名空间只装配**平台面**。编辑器专属 op\n * (`fai_*` / `group` / `assembly` / `copy` / `load`)与两个非基础 three 链的创建 op\n * (`text` / `svgExtrude`)已迁到 `@faicad/faijs-extra`,由宿主经\n * `mergeEditorNamespace()` 合并后注册——键名与拆分前完全一致,存量 `.fai.js` 零迁移。\n * 四个 transform op(translate/rotate_euler/scale/scale3d)按 D1 选项 C 留在此处:\n * `translate` 是通用几何变换,且是小程序端唯一在用的 transform op。\n */\n\nimport { box, sphere, cylinder, cone, wedge } from './primitives'\nimport { translate, rotate_euler, scale, scale3d } from './transform'\n// cad.extrude 是平台手写 op(承载 upTo;长度形态委托 generated/operations 的投影),\n// 见 api/extrude.ts 的分层说明——up-to 不落在 fai_extrude(后者已随扩展库迁出)。\nimport { extrude } from './extrude'\nimport { knurl } from './knurl'\nimport { sdf } from './sdf'\nimport { screw } from './screw'\nimport { profile } from './profile'\nimport { sketchOnPlane } from './sketch-on-plane'\nimport { sketchOnFace } from './sketch-on-face'\nimport { punchHole } from './punch-hole'\nimport { wire } from './wire'\nimport { helix } from './helix'\nimport { surface } from './surface'\nimport { offset2d } from './offset2d'\nimport { solidFromFaces } from './solid-from-faces'\nimport { halfSpace } from './half-space'\nimport { exportStl } from './export-stl'\nimport { exportBrep } from './export-brep'\n// 2026-10-08(方案 §2.6 / DEC-3):脚本面 step / 3mf 出口。两者都是薄壳:宿主门\n// (+ exportStep 的 occt 引擎门)之后把入参转成 ExportEntry[],序列化一律交库面\n// exportModelSync(单一真源),故与库面逐字节同源。只进脚本面(本字面量 + check()\n// 符号表),**不平铺 api/index.ts**(§2.7 / DEC-6)。\nimport { exportStep } from './export-step'\nimport { export3mf } from './export-3mf'\n// S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],普通函数形态)。\n// 直调 occt 原生 isEdge/isFace/isShell/isVertex/isWire/isCompound/isCompSolid/isEqual\n// (不在 L1 契约,方案 §3.4.6 校正注);布尔返回,走 export-brep 同口径。\nimport {\n isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual,\n} from './shape-type'\n// S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],普通函数形态)。\n// 直调 occt 原生 toSVG/toMultiviewSVG/toPNG/toMultiviewPNG(不在 L1 契约,方案 §3.4.7 校正注);\n// 字符串/Uint8Array 返回,走 export-brep / shape-type 同口径。\nimport { toSVG, toMultiviewSVG, toPNG, toMultiviewPNG } from './view-export'\n// S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。\n// 直调 occt 原生 makeEdge/makeCircleArc/makeEllipseEdge/makeEllipseArc/makeTangentArc/\n// approximatePoints/interpolatePointsWithTangents/curveDegreeElevate/curveKnotInsert/\n// curveKnotRemove/curveIsPeriodic(不在 L1 契约);curveIsPeriodic 布尔返回,普通函数。\nimport {\n edge, circleArc, ellipseEdge, ellipseArc, tangentArc,\n approximatePoints, interpolateWithTangents,\n curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic,\n} from './curve-sketch'\n// S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。\n// 直调 occt 原生 makeFaceOnSurface/makeNonPlanarFace/makeSolid/reverseSurfaceU/outerWire\n// (不在 L1 契约;bsplineSurface 已由 S3 的 surface op 覆盖)。\nimport { faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire } from './surface-face'\n// S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。\n// 直调 occt 原生 draftPrism/pipe(不在 L1 契约;offsetWire2D/buildSolidFromFaces/\n// halfSpace 已由 S3 落地)。\nimport { draftPrism, pipe } from './solid-offset'\n// S4(occt-wasm op 接入):测量与查询族(平台 op engines:['occt'],方案 §3.4.6)。\n// 13 个原生方法不在 L1 契约:containsPoint/distanceBetween/getInertia/\n// getLinearCenterOfMass/projectPointOnEdge/projectPointOnFace/classifyPointOnFace/\n// uvFromPoint/vertexPosition/subShapeCount/iterShapes 返回非 Shape,\n// 走 export-brep / shape-type 同口径的普通函数;liftCurve2d / commonCells\n// 返回 Shape,走 defineOp。\nimport {\n containsPoint, distanceBetween, inertia, linearCenterOfMass,\n projectPointOnEdge, projectPointOnFace, classifyPointOnFace,\n uvFromPoint, vertexPosition, subShapeCount, iterShapes,\n liftCurve2d, commonCells,\n} from './measure-query'\n// S4(occt-wasm op 接入):通用布尔族(平台 op engines:['occt'],方案 §3.4.5)——\n// 原生 booleanOp:带 glue/fuzzy/simplify 选项的通用形态,不在 L1 契约。\nimport { boolean as booleanWithOptions } from './boolean-op'\n// S4(occt-wasm op 接入):包围盒对齐族(平台 op engines:['occt'],方案 §3.4.9)——\n// 原生 alignX/alignY/alignZ 三轴并为一个脚本符号 alignTo。\nimport { alignTo } from './align'\nimport { union, subtract, intersect, cut } from './boolean'\nimport { split } from './split'\nimport { sweep } from './sweep'\nimport { loft } from './loft'\nimport { linearPattern } from './pattern'\nimport { circularPattern, gridPattern, rectangularPattern, mirrorJoin, mirror, clone } from './replicate'\nimport { engrave } from './engrave'\nimport { chamfer } from './chamfer'\nimport { fillet } from './fillet'\nimport { shell } from './shell'\nimport { draft } from './draft'\nimport { thicken } from './thicken'\nimport { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace } from './feature-repair'\nimport { filletVariable } from './fillet-variable'\nimport { splitByPlane } from './split-by-plane'\nimport { sectionByPlane } from './section-by-plane'\nimport { faceNormal, bboxCenter, bboxMin, bboxMax } from './geom'\nimport { edgeRef } from './edge-ref'\nimport { faceRef } from './face-ref'\nimport { jointTrajectory, inverseKinematics, mechanismDOF } from './assembly'\nimport { asset } from './asset'\nimport { import_brep } from './import-brep'\nimport { import_step } from './import-step'\nimport { compound as geometricCompound } from './compound-geom'\nimport { place } from './place'\nimport { scriptFaceOps } from './generated/script-face'\nimport { revolve } from './revolve'\nimport { CONTRACT_VERSION } from '../runtime-state'\nimport type { LibNamespace } from '../runtime-state'\n\n/**\n * Assemble api functions into the cad namespace.\n *\n * P23(§4.2 ②,B1):cad 面 = faijs 特有 dual op(下方字面量)+\n * 生成脚本面 op(`scriptFaceOps`——`api/generated/script-face.ts` 按 arg-spec\n * 的 `scriptFace: true` 条目生成,`defineOp({ brep: __own_* })` 直连的\n * brep-only 语句级 op)。`check()` 符号表(`gen-symbol-table.ts`)取自同一份清单。\n * 2026-10-08(§2.7 / DEC-6、DEC-7):本命名空间**不再**要求被 `api/index.ts`\n * 平铺——库面只保留有库作者消费者的名字,其余脚本 op 只走 `cad.*` 与子路径。\n *\n * @returns the assembled LibNamespace ready for runtime injection.\n */\nexport function createApiNamespace(): LibNamespace {\n // D-4 strict assembly check: the cad namespace now exports dual-op functions\n // (defineOp), so registerLib requires a matching contractVersion. Cast is\n // needed because LibNamespace is an index-signature type.\n return {\n contractVersion: CONTRACT_VERSION,\n box, sphere, cylinder, cone, wedge,\n screw, profile, sketchOnPlane, sketchOnFace, punchHole, wire, helix, sdf,\n // D1 选项 C:四个 transform op 全留核心(translate 小程序端在用,同族不拆散)。\n translate, rotate_euler, scale, scale3d,\n engrave, chamfer, fillet, knurl,\n // Phase 5:按面/边选的特征族 + 修复薄包装(shell/draft 中立;thicken 平台 occt)。\n shell, draft, thicken, filletVariable, splitByPlane, sectionByPlane,\n defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace,\n union, subtract, intersect,\n extrude, revolve,\n // Phase 4:手写扫掠 / 放样(平台 op engines:['occt'];截面接受 face → 取外环)。\n // arg-spec 里 sweep 保留 brep-op(引擎记录)/ loft 为 skip,两者均不投脚本面,\n // 所以这里不是 override 而是唯一实现(同 extrude / revolve 口径)。\n sweep, loft,\n // S3(occt-wasm op 接入):控制点阵 → B 样条面(平台 op engines:['occt'])。\n surface,\n // S3(occt-wasm op 接入):2D 轮廓偏置(平台 op engines:['occt'],原生 offsetWire2D)。\n offset2d,\n // S3(occt-wasm op 接入):面集一次成型为实体(平台 op engines:['occt'],原生 buildSolidFromFaces)。\n solidFromFaces,\n // S3(occt-wasm op 接入):无限半空间实体(平台 op engines:['occt'],原生 halfSpace;\n // 无界布尔工具的来源,产物 mesh 为空——单独渲染无意义,只作 cut/common/split 的工具位)。\n halfSpace,\n // S3(occt-wasm op 接入):导出族。exportStl 中立(只序列化 Shape 自带三角载荷,\n // 无内核调用);exportBrep 平台(原生 toBREP,L1 只有 fromBREP 导入侧)。\n exportStl,\n exportBrep,\n // 方案 §2.6:step(occt 必需——装配层级走 XCAF)/ 3mf(引擎中立,纯 XML + ZIP)。\n exportStep,\n export3mf,\n // S4(occt-wasm op 接入):类型判定谓词族(平台 op engines:['occt'],布尔返回)。\n isEdge, isFace, isShell, isVertex, isWire, isCompound, isCompSolid, isEqual,\n // S4(occt-wasm op 接入):视图与导出族(平台 op engines:['occt'],字符串/Uint8Array 返回)。\n toSVG, toMultiviewSVG, toPNG, toMultiviewPNG,\n // S4(occt-wasm op 接入):曲线与草图构造族(平台 op engines:['occt'],方案 §3.4.1)。\n edge, circleArc, ellipseEdge, ellipseArc, tangentArc,\n approximatePoints, interpolateWithTangents,\n curveDegreeElevate, curveKnotInsert, curveKnotRemove, curveIsPeriodic,\n // S4(occt-wasm op 接入):曲面与面构造族(平台 op engines:['occt'],方案 §3.4.2)。\n faceOnSurface, nonPlanarFace, makeSolid, reverseSurfaceU, outerWire,\n // S4(occt-wasm op 接入):实体与偏置族剩余(平台 op engines:['occt'],方案 §3.4.4)。\n draftPrism, pipe,\n // S4(occt-wasm op 接入):测量与查询族(平台 op engines:['occt'],方案 §3.4.6)。\n containsPoint, distanceBetween, inertia, linearCenterOfMass,\n projectPointOnEdge, projectPointOnFace, classifyPointOnFace,\n uvFromPoint, vertexPosition, subShapeCount, iterShapes,\n liftCurve2d, commonCells,\n // S4(occt-wasm op 接入):通用布尔族 booleanOp(方案 §3.4.5)+ 包围盒对齐族\n // alignX/Y/Z → alignTo(方案 §3.4.9),平台 op engines:['occt']。\n boolean: booleanWithOptions,\n alignTo,\n faceNormal, bboxCenter, bboxMin, bboxMax,\n edgeRef,\n faceRef,\n jointTrajectory, inverseKinematics, mechanismDOF,\n asset,\n // 平台几何 op(H11,方案 §4):FCStd 迁移自此不再借用编辑器 op\n // (group/translate/rotate_euler);这几个与 ../3d_editor 无关系。\n import_brep,\n import_step,\n compound: geometricCompound,\n place,\n ...scriptFaceOps,\n // Phase 3: override generated cut (compatOp, no roleTable propagation) with\n // handwritten cut from boolean.ts (does roleTable propagation via booleanBrep).\n cut,\n // Phase 3: override generated split / linearPattern (compatOp, no roleTable\n // propagation) with handwritten versions that build replica[k] / splinter(#j)\n // role tables (L3 / L4 抗重放词汇). Spread after scriptFaceOps so they win.\n split,\n linearPattern,\n // 覆盖生成版:4 个多副本 pattern 提拔手写(keep + replica[*] 角色表);\n // 2 个单副本(mirror/clone)加 keep 薄 override。transformCopy 不再是脚本面\n // op(arg-spec skip:ComposedTransform 在 .fai.js 不可构造),仅保留 TS 库导出。\n // Spread after scriptFaceOps so they win.\n circularPattern,\n gridPattern,\n rectangularPattern,\n mirrorJoin,\n mirror,\n clone,\n } as unknown as LibNamespace\n}\n"]}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * api boolean-op — 通用布尔族(S4 剩余,平台 op engines:['occt'])
3
+ *
4
+ * @platform occt — 原生 `booleanOp(op, args, tools, options)`(occt-wasm 5.6.0 有)
5
+ * 直调 occt:**不在** L1 契约 `BrepEngineApi` 里(L1 只有 fuse / cut / intersect 三个
6
+ * 逐对的成员,见 brep/engine/primitives.ts)⇒ 平台 op。
7
+ *
8
+ * 方案落点:docs/plans/2026-10-07-occt-wasm-op-enablement-plan.md §3.4.5。与既有 op
9
+ * 的边界(§4.5 去重表):脚本面 `union` / `subtract` / `intersect` / `fuse` / `cut`
10
+ * 是**无选项**的形态,且两两 chirality 链式合流;本 op 是带 glue / fuzzy /
11
+ * simplify 选项的**通用形态**,args 与 tools 分组、一次内核调用内完成。
12
+ *
13
+ * 与 `commonCells` 的边界:后者求 ≥2 输入的**重叠区域**(干涉检查语义,返回的是
14
+ * 胞元复合体);本 op 的 `common` 是布尔交集,返回的是实体。
15
+ *
16
+ * **naming 为什么是 unmodeled**:原生 `booleanOp` 返回 `EvolutionData`,其中
17
+ * modified / generated / deleted 是**扁平的面 hash 数组**,而不是本仓
18
+ * `faceEvolution` 需要的 `Map<输入面 hash, 结果面 hash[]>` 映射。缺这层对应关系就
19
+ * 合成不出 roleTable,强行按 byAdjacency 声称「内核给了历史」是**伪造身份**
20
+ * (方案 §4.2:词汇未定义就用 unmodeled + reason)。
21
+ *
22
+ * §9.5 降级路径:一旦 L1 契约补上带选项的通用布尔成员且两侧适配器同时落地,删掉
23
+ * `engines` 声明改走 getBrepApi(),`booleanOp` 即从 C2 转入 C1。
24
+ */
25
+ import type { Shape } from '../../mesh/types.js';
26
+ /** 布尔算子(脚本面收字符串,映射到 occt-wasm 的 `BooleanOp` 枚举值)。 */
27
+ export type BooleanKind = 'fuse' | 'cut' | 'common';
28
+ /** `boolean` 的选项(与 occt-wasm 的 `BooleanOpOptions` 子集一致)。 */
29
+ export interface BooleanOptions {
30
+ /** 粘连 coplanar 处理:0=off(默认,完全求交)/ 1=shift(部分共面)/ 2=full(整面共享)。 */
31
+ glue?: 0 | 1 | 2;
32
+ /** 模糊容差(模型单位):在此范围内的近乎重合几何会被合并。 */
33
+ fuzzyValue?: number;
34
+ /** 结果内同域面/边的合并角阈值(**弧度**)。 */
35
+ simplifyAngularTolerance?: number;
36
+ }
37
+ /**
38
+ * 通用布尔运算:一次调用对 args / tools 两组形状做布尔,并支持粘连、模糊容差与
39
+ * 结果简化选项(脚本面的 union/subtract/intersect 是无选项形态)。
40
+ * @group 特征
41
+ * @inputs 2
42
+ * @async false
43
+ * @qual ok
44
+ * @name boolean
45
+ * @note 平台 op:仅 occt 引擎(原生 booleanOp,L1 契约无对应成员)。
46
+ * 非 occt 引擎执行前报错;brep_mock 不拦截。
47
+ * 血缘:原生只回扁平的面 hash 列表(modified/generated/deleted),不是
48
+ * 输入面→结果面的映射,无法构造 faceEvolution,故 naming 为 unmodeled。
49
+ * @returns Shape 布尔结果。
50
+ * @param args - 参与运算的形状(≥1)。type:Shape[] required:true
51
+ * @param tools - 工具形状(≥1)。type:Shape[] required:true
52
+ * @param kind - 算子 fuse|cut|common。type:string required:true
53
+ * @param options.glue - 共面粘连模式 0|1|2。type:number required:false
54
+ * @param options.fuzzyValue - 模糊容差(模型单位)。type:number required:false
55
+ * @param options.simplifyAngularTolerance - 同域合并角阈值(弧度)。type:number required:false
56
+ * @example
57
+ * // 两盒相减(第二个盒作为工具)
58
+ * const hollow = cad.boolean([boxA], [boxB], 'cut')
59
+ * // 带容差的 union(近乎重合的面会被合并)
60
+ * const joined = cad.boolean([p1, p2], [p3], 'fuse', { fuzzyValue: 1e-4 })
61
+ */
62
+ export declare const boolean: ((args: Shape[], tools: Shape[], kind: BooleanKind, options?: BooleanOptions | undefined) => Promise<Shape>) & {
63
+ __faijs__dualOp?: import("../../define-op.js").DualOpMeta;
64
+ };
65
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/boolean-op/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAS7C,qDAAqD;AACrD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;AAEnD,4DAA4D;AAC5D,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAChB,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,8BAA8B;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAA;CAClC;AA8DD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,OAAO;;CAUlB,CAAA"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * api boolean-op — 通用布尔族(S4 剩余,平台 op engines:['occt'])
3
+ *
4
+ * @platform occt — 原生 `booleanOp(op, args, tools, options)`(occt-wasm 5.6.0 有)
5
+ * 直调 occt:**不在** L1 契约 `BrepEngineApi` 里(L1 只有 fuse / cut / intersect 三个
6
+ * 逐对的成员,见 brep/engine/primitives.ts)⇒ 平台 op。
7
+ *
8
+ * 方案落点:docs/plans/2026-10-07-occt-wasm-op-enablement-plan.md §3.4.5。与既有 op
9
+ * 的边界(§4.5 去重表):脚本面 `union` / `subtract` / `intersect` / `fuse` / `cut`
10
+ * 是**无选项**的形态,且两两 chirality 链式合流;本 op 是带 glue / fuzzy /
11
+ * simplify 选项的**通用形态**,args 与 tools 分组、一次内核调用内完成。
12
+ *
13
+ * 与 `commonCells` 的边界:后者求 ≥2 输入的**重叠区域**(干涉检查语义,返回的是
14
+ * 胞元复合体);本 op 的 `common` 是布尔交集,返回的是实体。
15
+ *
16
+ * **naming 为什么是 unmodeled**:原生 `booleanOp` 返回 `EvolutionData`,其中
17
+ * modified / generated / deleted 是**扁平的面 hash 数组**,而不是本仓
18
+ * `faceEvolution` 需要的 `Map<输入面 hash, 结果面 hash[]>` 映射。缺这层对应关系就
19
+ * 合成不出 roleTable,强行按 byAdjacency 声称「内核给了历史」是**伪造身份**
20
+ * (方案 §4.2:词汇未定义就用 unmodeled + reason)。
21
+ *
22
+ * §9.5 降级路径:一旦 L1 契约补上带选项的通用布尔成员且两侧适配器同时落地,删掉
23
+ * `engines` 声明改走 getBrepApi(),`booleanOp` 即从 C2 转入 C1。
24
+ */
25
+ import { solidToShape } from '../../brep/brep-ops.js';
26
+ import { getBrepApi } from '../../brep/handle-bridge.js';
27
+ import { brepOf, fromBrep } from '../../shape.js';
28
+ import { defineOp } from '../../sdk.js';
29
+ import { getOcctKernel } from '../../occt-kernel/occtKernel.js';
30
+ const KINDS = ['fuse', 'cut', 'common'];
31
+ const KIND_CODE = { fuse: 0, cut: 1, common: 2 };
32
+ /** 输入 Shape → 内核句柄(无 BREP 槽报错)。 */
33
+ function handleOf(shape, op, which) {
34
+ const h = brepOf(shape);
35
+ if (!h) {
36
+ throw new Error(`E_${op}_NO_BREP: ${which} requires a BREP handle (mesh-only shape has none)`);
37
+ }
38
+ return h;
39
+ }
40
+ /** BREP 路径:occt 原生 booleanOp(EvolutionData.result 即结果句柄)。 */
41
+ function booleanBrep(args, tools, kind, options) {
42
+ if (!Array.isArray(args) || args.length === 0) {
43
+ throw new Error('E_BOOLEAN_NO_ARGS: boolean requires at least one argument shape');
44
+ }
45
+ if (!Array.isArray(tools) || tools.length === 0) {
46
+ throw new Error('E_BOOLEAN_NO_TOOLS: boolean requires at least one tool shape');
47
+ }
48
+ if (!KINDS.includes(kind)) {
49
+ throw new Error(`E_BOOLEAN_BAD_KIND: kind must be one of fuse/cut/common (got ${String(kind)})`);
50
+ }
51
+ if (options !== undefined) {
52
+ if (options.glue !== undefined && ![0, 1, 2].includes(options.glue)) {
53
+ throw new Error(`E_BOOLEAN_BAD_GLUE: glue must be 0|1|2 (got ${String(options.glue)})`);
54
+ }
55
+ if (options.fuzzyValue !== undefined && (typeof options.fuzzyValue !== 'number' || options.fuzzyValue < 0)) {
56
+ throw new Error('E_BOOLEAN_BAD_FUZZY: fuzzyValue must be a non-negative number');
57
+ }
58
+ if (options.simplifyAngularTolerance !== undefined &&
59
+ (typeof options.simplifyAngularTolerance !== 'number' || options.simplifyAngularTolerance < 0)) {
60
+ throw new Error('E_BOOLEAN_BAD_SIMPLIFY: simplifyAngularTolerance must be a non-negative number');
61
+ }
62
+ }
63
+ const argHandles = args.map((s, i) => {
64
+ if (!s)
65
+ throw new Error(`E_BOOLEAN_MISSING_ARG: args[${i}] is empty`);
66
+ return handleOf(s, 'BOOLEAN', `args[${i}]`);
67
+ });
68
+ const toolHandles = tools.map((s, i) => {
69
+ if (!s)
70
+ throw new Error(`E_BOOLEAN_MISSING_ARG: tools[${i}] is empty`);
71
+ return handleOf(s, 'BOOLEAN', `tools[${i}]`);
72
+ });
73
+ const data = getOcctKernel().booleanOp(KIND_CODE[kind], argHandles, toolHandles, options);
74
+ const handle = data.result;
75
+ return fromBrep(solidToShape(getBrepApi(), handle), { solid: handle });
76
+ }
77
+ /**
78
+ * 通用布尔运算:一次调用对 args / tools 两组形状做布尔,并支持粘连、模糊容差与
79
+ * 结果简化选项(脚本面的 union/subtract/intersect 是无选项形态)。
80
+ * @group 特征
81
+ * @inputs 2
82
+ * @async false
83
+ * @qual ok
84
+ * @name boolean
85
+ * @note 平台 op:仅 occt 引擎(原生 booleanOp,L1 契约无对应成员)。
86
+ * 非 occt 引擎执行前报错;brep_mock 不拦截。
87
+ * 血缘:原生只回扁平的面 hash 列表(modified/generated/deleted),不是
88
+ * 输入面→结果面的映射,无法构造 faceEvolution,故 naming 为 unmodeled。
89
+ * @returns Shape 布尔结果。
90
+ * @param args - 参与运算的形状(≥1)。type:Shape[] required:true
91
+ * @param tools - 工具形状(≥1)。type:Shape[] required:true
92
+ * @param kind - 算子 fuse|cut|common。type:string required:true
93
+ * @param options.glue - 共面粘连模式 0|1|2。type:number required:false
94
+ * @param options.fuzzyValue - 模糊容差(模型单位)。type:number required:false
95
+ * @param options.simplifyAngularTolerance - 同域合并角阈值(弧度)。type:number required:false
96
+ * @example
97
+ * // 两盒相减(第二个盒作为工具)
98
+ * const hollow = cad.boolean([boxA], [boxB], 'cut')
99
+ * // 带容差的 union(近乎重合的面会被合并)
100
+ * const joined = cad.boolean([p1, p2], [p3], 'fuse', { fuzzyValue: 1e-4 })
101
+ */
102
+ export const boolean = defineOp({
103
+ name: 'boolean',
104
+ brep(args, tools, kind, options) {
105
+ return booleanBrep(args, tools, kind, options);
106
+ },
107
+ engines: ['occt'],
108
+ naming: {
109
+ kind: 'unmodeled',
110
+ reason: 'booleanOp returns flat face-hash lists, not an input-face to result-face map',
111
+ },
112
+ });
113
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/boolean-op/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api boolean-op — 通用布尔族(S4 剩余,平台 op engines:['occt'])\n *\n * @platform occt — 原生 `booleanOp(op, args, tools, options)`(occt-wasm 5.6.0 有)\n * 直调 occt:**不在** L1 契约 `BrepEngineApi` 里(L1 只有 fuse / cut / intersect 三个\n * 逐对的成员,见 brep/engine/primitives.ts)⇒ 平台 op。\n *\n * 方案落点:docs/plans/2026-10-07-occt-wasm-op-enablement-plan.md §3.4.5。与既有 op\n * 的边界(§4.5 去重表):脚本面 `union` / `subtract` / `intersect` / `fuse` / `cut`\n * 是**无选项**的形态,且两两 chirality 链式合流;本 op 是带 glue / fuzzy /\n * simplify 选项的**通用形态**,args 与 tools 分组、一次内核调用内完成。\n *\n * 与 `commonCells` 的边界:后者求 ≥2 输入的**重叠区域**(干涉检查语义,返回的是\n * 胞元复合体);本 op 的 `common` 是布尔交集,返回的是实体。\n *\n * **naming 为什么是 unmodeled**:原生 `booleanOp` 返回 `EvolutionData`,其中\n * modified / generated / deleted 是**扁平的面 hash 数组**,而不是本仓\n * `faceEvolution` 需要的 `Map<输入面 hash, 结果面 hash[]>` 映射。缺这层对应关系就\n * 合成不出 roleTable,强行按 byAdjacency 声称「内核给了历史」是**伪造身份**\n * (方案 §4.2:词汇未定义就用 unmodeled + reason)。\n *\n * §9.5 降级路径:一旦 L1 契约补上带选项的通用布尔成员且两侧适配器同时落地,删掉\n * `engines` 声明改走 getBrepApi(),`booleanOp` 即从 C2 转入 C1。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { solidToShape } from '../../brep/brep-ops'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { brepOf, fromBrep } from '../../shape'\nimport { defineOp } from '../../sdk'\nimport type { Provenance } from '../../topology/naming/lineage'\nimport { getOcctKernel } from '../../occt-kernel/occtKernel'\n\n/** 布尔算子(脚本面收字符串,映射到 occt-wasm 的 `BooleanOp` 枚举值)。 */\nexport type BooleanKind = 'fuse' | 'cut' | 'common'\n\n/** `boolean` 的选项(与 occt-wasm 的 `BooleanOpOptions` 子集一致)。 */\nexport interface BooleanOptions {\n /** 粘连 coplanar 处理:0=off(默认,完全求交)/ 1=shift(部分共面)/ 2=full(整面共享)。 */\n glue?: 0 | 1 | 2\n /** 模糊容差(模型单位):在此范围内的近乎重合几何会被合并。 */\n fuzzyValue?: number\n /** 结果内同域面/边的合并角阈值(**弧度**)。 */\n simplifyAngularTolerance?: number\n}\n\nconst KINDS: readonly BooleanKind[] = ['fuse', 'cut', 'common']\nconst KIND_CODE: Record<BooleanKind, number> = { fuse: 0, cut: 1, common: 2 }\n\n/** 输入 Shape → 内核句柄(无 BREP 槽报错)。 */\nfunction handleOf(shape: Shape, op: string, which: string): BrepHandle {\n const h = brepOf(shape) as BrepHandle | undefined\n if (!h) {\n throw new Error(`E_${op}_NO_BREP: ${which} requires a BREP handle (mesh-only shape has none)`)\n }\n return h\n}\n\n/** BREP 路径:occt 原生 booleanOp(EvolutionData.result 即结果句柄)。 */\nfunction booleanBrep(\n args: Shape[],\n tools: Shape[],\n kind: BooleanKind,\n options?: BooleanOptions,\n): Shape {\n if (!Array.isArray(args) || args.length === 0) {\n throw new Error('E_BOOLEAN_NO_ARGS: boolean requires at least one argument shape')\n }\n if (!Array.isArray(tools) || tools.length === 0) {\n throw new Error('E_BOOLEAN_NO_TOOLS: boolean requires at least one tool shape')\n }\n if (!KINDS.includes(kind)) {\n throw new Error(`E_BOOLEAN_BAD_KIND: kind must be one of fuse/cut/common (got ${String(kind)})`)\n }\n if (options !== undefined) {\n if (options.glue !== undefined && ![0, 1, 2].includes(options.glue)) {\n throw new Error(`E_BOOLEAN_BAD_GLUE: glue must be 0|1|2 (got ${String(options.glue)})`)\n }\n if (options.fuzzyValue !== undefined && (typeof options.fuzzyValue !== 'number' || options.fuzzyValue < 0)) {\n throw new Error('E_BOOLEAN_BAD_FUZZY: fuzzyValue must be a non-negative number')\n }\n if (\n options.simplifyAngularTolerance !== undefined &&\n (typeof options.simplifyAngularTolerance !== 'number' || options.simplifyAngularTolerance < 0)\n ) {\n throw new Error('E_BOOLEAN_BAD_SIMPLIFY: simplifyAngularTolerance must be a non-negative number')\n }\n }\n const argHandles = args.map((s, i) => {\n if (!s) throw new Error(`E_BOOLEAN_MISSING_ARG: args[${i}] is empty`)\n return handleOf(s, 'BOOLEAN', `args[${i}]`)\n })\n const toolHandles = tools.map((s, i) => {\n if (!s) throw new Error(`E_BOOLEAN_MISSING_ARG: tools[${i}] is empty`)\n return handleOf(s, 'BOOLEAN', `tools[${i}]`)\n })\n const data = getOcctKernel().booleanOp(\n KIND_CODE[kind] as never,\n argHandles as never[],\n toolHandles as never[],\n options as never,\n )\n const handle = data.result as unknown as BrepHandle\n return fromBrep(solidToShape(getBrepApi(), handle), { solid: handle })\n}\n\n/**\n * 通用布尔运算:一次调用对 args / tools 两组形状做布尔,并支持粘连、模糊容差与\n * 结果简化选项(脚本面的 union/subtract/intersect 是无选项形态)。\n * @group 特征\n * @inputs 2\n * @async false\n * @qual ok\n * @name boolean\n * @note 平台 op:仅 occt 引擎(原生 booleanOp,L1 契约无对应成员)。\n * 非 occt 引擎执行前报错;brep_mock 不拦截。\n * 血缘:原生只回扁平的面 hash 列表(modified/generated/deleted),不是\n * 输入面→结果面的映射,无法构造 faceEvolution,故 naming 为 unmodeled。\n * @returns Shape 布尔结果。\n * @param args - 参与运算的形状(≥1)。type:Shape[] required:true\n * @param tools - 工具形状(≥1)。type:Shape[] required:true\n * @param kind - 算子 fuse|cut|common。type:string required:true\n * @param options.glue - 共面粘连模式 0|1|2。type:number required:false\n * @param options.fuzzyValue - 模糊容差(模型单位)。type:number required:false\n * @param options.simplifyAngularTolerance - 同域合并角阈值(弧度)。type:number required:false\n * @example\n * // 两盒相减(第二个盒作为工具)\n * const hollow = cad.boolean([boxA], [boxB], 'cut')\n * // 带容差的 union(近乎重合的面会被合并)\n * const joined = cad.boolean([p1, p2], [p3], 'fuse', { fuzzyValue: 1e-4 })\n */\nexport const boolean = defineOp({\n name: 'boolean',\n brep(args: Shape[], tools: Shape[], kind: BooleanKind, options?: BooleanOptions) {\n return booleanBrep(args, tools, kind, options)\n },\n engines: ['occt'],\n naming: {\n kind: 'unmodeled',\n reason: 'booleanOp returns flat face-hash lists, not an input-face to result-face map',\n } as Provenance,\n})\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"boolean.d.ts","sourceRoot":"","sources":["../../src/api/boolean.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AA8Q1C;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,KAAK;;CAgBhB,CAAA;AAEF;;;;;;;;;;;;;;;IAeI;AACJ,eAAO,MAAM,GAAG;;CAYd,CAAA;AAEF;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,QAAQ;;CAanB,CAAA;AAEF;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,SAAS;;CAiBpB,CAAA"}
1
+ {"version":3,"file":"boolean.d.ts","sourceRoot":"","sources":["../../src/api/boolean.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AA4Q1C;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,KAAK;;CAYhB,CAAA;AAEF;;;;;;;;;;;;;;;IAeI;AACJ,eAAO,MAAM,GAAG;;CAWd,CAAA;AAEF;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,QAAQ;;CAWnB,CAAA;AAEF;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,SAAS;;CAcpB,CAAA"}