@faicad/faijs 0.33.2 → 0.35.8

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 (429) hide show
  1. package/dist/api/api-namespace.d.ts +14 -14
  2. package/dist/api/api-namespace.d.ts.map +1 -1
  3. package/dist/api/api-namespace.js +40 -14
  4. package/dist/api/api-namespace.js.map +1 -1
  5. package/dist/api/appearance.d.ts +47 -6
  6. package/dist/api/appearance.d.ts.map +1 -1
  7. package/dist/api/appearance.js.map +1 -1
  8. package/dist/api/assembly/entities.js +14 -4
  9. package/dist/api/assembly/entities.js.map +1 -1
  10. package/dist/api/assembly/solve-tree.d.ts +1 -0
  11. package/dist/api/assembly/solve-tree.d.ts.map +1 -1
  12. package/dist/api/assembly/solve-tree.js +42 -17
  13. package/dist/api/assembly/solve-tree.js.map +1 -1
  14. package/dist/api/assembly/solve.d.ts +1 -0
  15. package/dist/api/assembly/solve.d.ts.map +1 -1
  16. package/dist/api/assembly/solve.js.map +1 -1
  17. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  18. package/dist/api/assembly/solvers/global-solver.js +130 -23
  19. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  20. package/dist/api/assembly/solvers/pose-from-delta.d.ts +9 -0
  21. package/dist/api/assembly/solvers/pose-from-delta.d.ts.map +1 -1
  22. package/dist/api/assembly/solvers/pose-from-delta.js +23 -0
  23. package/dist/api/assembly/solvers/pose-from-delta.js.map +1 -1
  24. package/dist/api/assembly/solvers/types.d.ts +20 -2
  25. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  26. package/dist/api/assembly/solvers/types.js.map +1 -1
  27. package/dist/api/chamfer.d.ts +7 -4
  28. package/dist/api/chamfer.d.ts.map +1 -1
  29. package/dist/api/chamfer.js +57 -13
  30. package/dist/api/chamfer.js.map +1 -1
  31. package/dist/api/draft.d.ts +7 -4
  32. package/dist/api/draft.d.ts.map +1 -1
  33. package/dist/api/draft.js +11 -6
  34. package/dist/api/draft.js.map +1 -1
  35. package/dist/api/edge-ref.d.ts +4 -4
  36. package/dist/api/edge-ref.js +4 -4
  37. package/dist/api/edge-ref.js.map +1 -1
  38. package/dist/api/extrude.d.ts +10 -6
  39. package/dist/api/extrude.d.ts.map +1 -1
  40. package/dist/api/extrude.js +54 -26
  41. package/dist/api/extrude.js.map +1 -1
  42. package/dist/api/face-ref.d.ts +4 -4
  43. package/dist/api/face-ref.js +4 -4
  44. package/dist/api/face-ref.js.map +1 -1
  45. package/dist/api/feature-repair.d.ts +6 -3
  46. package/dist/api/feature-repair.d.ts.map +1 -1
  47. package/dist/api/feature-repair.js +12 -7
  48. package/dist/api/feature-repair.js.map +1 -1
  49. package/dist/api/fillet-variable.d.ts +6 -2
  50. package/dist/api/fillet-variable.d.ts.map +1 -1
  51. package/dist/api/fillet-variable.js +24 -6
  52. package/dist/api/fillet-variable.js.map +1 -1
  53. package/dist/api/fillet.d.ts +7 -4
  54. package/dist/api/fillet.d.ts.map +1 -1
  55. package/dist/api/fillet.js +92 -12
  56. package/dist/api/fillet.js.map +1 -1
  57. package/dist/api/generated/script-face-manifest.js +1 -1
  58. package/dist/api/generated/script-face-manifest.js.map +1 -1
  59. package/dist/api/generated/topology.js +1 -1
  60. package/dist/api/generated/topology.js.map +1 -1
  61. package/dist/api/helix.d.ts +13 -13
  62. package/dist/api/helix.d.ts.map +1 -1
  63. package/dist/api/helix.js +19 -24
  64. package/dist/api/helix.js.map +1 -1
  65. package/dist/api/import-brep.d.ts +10 -18
  66. package/dist/api/import-brep.d.ts.map +1 -1
  67. package/dist/api/import-brep.js +17 -25
  68. package/dist/api/import-brep.js.map +1 -1
  69. package/dist/api/import-step.d.ts +10 -15
  70. package/dist/api/import-step.d.ts.map +1 -1
  71. package/dist/api/import-step.js +24 -29
  72. package/dist/api/import-step.js.map +1 -1
  73. package/dist/api/index.js +2 -2
  74. package/dist/api/index.js.map +1 -1
  75. package/dist/api/internal/export-members.js.map +1 -1
  76. package/dist/api/loft-advanced.d.ts +4 -0
  77. package/dist/api/loft-advanced.d.ts.map +1 -1
  78. package/dist/api/loft-advanced.js +4 -0
  79. package/dist/api/loft-advanced.js.map +1 -1
  80. package/dist/api/loft.d.ts +5 -3
  81. package/dist/api/loft.d.ts.map +1 -1
  82. package/dist/api/loft.js +5 -3
  83. package/dist/api/loft.js.map +1 -1
  84. package/dist/api/meta.d.ts +42 -6
  85. package/dist/api/meta.d.ts.map +1 -1
  86. package/dist/api/meta.js.map +1 -1
  87. package/dist/api/primitives.d.ts +3 -2
  88. package/dist/api/primitives.d.ts.map +1 -1
  89. package/dist/api/primitives.js +3 -2
  90. package/dist/api/primitives.js.map +1 -1
  91. package/dist/api/punch-hole.d.ts +5 -2
  92. package/dist/api/punch-hole.d.ts.map +1 -1
  93. package/dist/api/punch-hole.js +4 -1
  94. package/dist/api/punch-hole.js.map +1 -1
  95. package/dist/api/replicate.d.ts +4 -5
  96. package/dist/api/replicate.d.ts.map +1 -1
  97. package/dist/api/replicate.js +4 -5
  98. package/dist/api/replicate.js.map +1 -1
  99. package/dist/api/selectors-to-refs.d.ts +83 -0
  100. package/dist/api/selectors-to-refs.d.ts.map +1 -0
  101. package/dist/api/selectors-to-refs.js +211 -0
  102. package/dist/api/selectors-to-refs.js.map +1 -0
  103. package/dist/api/shell.d.ts +17 -8
  104. package/dist/api/shell.d.ts.map +1 -1
  105. package/dist/api/shell.js +45 -15
  106. package/dist/api/shell.js.map +1 -1
  107. package/dist/api/sketch-on-face.d.ts +12 -6
  108. package/dist/api/sketch-on-face.d.ts.map +1 -1
  109. package/dist/api/sketch-on-face.js +31 -4
  110. package/dist/api/sketch-on-face.js.map +1 -1
  111. package/dist/api/sketch-on-plane.d.ts +3 -0
  112. package/dist/api/sketch-on-plane.d.ts.map +1 -1
  113. package/dist/api/sketch-on-plane.js +3 -0
  114. package/dist/api/sketch-on-plane.js.map +1 -1
  115. package/dist/api/sketch-on-surface.d.ts +4 -1
  116. package/dist/api/sketch-on-surface.d.ts.map +1 -1
  117. package/dist/api/sketch-on-surface.js +4 -1
  118. package/dist/api/sketch-on-surface.js.map +1 -1
  119. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  120. package/dist/api/surface/arg-spec.js +5 -6
  121. package/dist/api/surface/arg-spec.js.map +1 -1
  122. package/dist/api/topo-resolve.d.ts.map +1 -1
  123. package/dist/api/topo-resolve.js +24 -5
  124. package/dist/api/topo-resolve.js.map +1 -1
  125. package/dist/api/view/view-projection.d.ts.map +1 -1
  126. package/dist/api/view/view-projection.js +9 -2
  127. package/dist/api/view/view-projection.js.map +1 -1
  128. package/dist/brep/brep-chain.js +2 -2
  129. package/dist/brep/brep-chain.js.map +1 -1
  130. package/dist/brep/brep-ops.d.ts +1 -1
  131. package/dist/brep/brep-ops.js +1 -1
  132. package/dist/brep/brep-ops.js.map +1 -1
  133. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  134. package/dist/brep/engine/adapters/brep-mock.js +45 -0
  135. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  136. package/dist/brep/engine/primitives.d.ts +87 -3
  137. package/dist/brep/engine/primitives.d.ts.map +1 -1
  138. package/dist/brep/engine/primitives.js +1 -1
  139. package/dist/brep/engine/primitives.js.map +1 -1
  140. package/dist/brep/engine/registry.d.ts +33 -7
  141. package/dist/brep/engine/registry.d.ts.map +1 -1
  142. package/dist/brep/engine/registry.js +47 -16
  143. package/dist/brep/engine/registry.js.map +1 -1
  144. package/dist/brep/handle-bridge.d.ts +14 -15
  145. package/dist/brep/handle-bridge.d.ts.map +1 -1
  146. package/dist/brep/handle-bridge.js +35 -15
  147. package/dist/brep/handle-bridge.js.map +1 -1
  148. package/dist/brep/primitives-brep.js +2 -2
  149. package/dist/brep/primitives-brep.js.map +1 -1
  150. package/dist/brep/text/text-to-solid.d.ts +40 -3
  151. package/dist/brep/text/text-to-solid.d.ts.map +1 -1
  152. package/dist/brep/text/text-to-solid.js +104 -24
  153. package/dist/brep/text/text-to-solid.js.map +1 -1
  154. package/dist/brepkit-kernel/brepkitKernel.d.ts +2 -2
  155. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  156. package/dist/brepkit-kernel/brepkitKernel.js +328 -38
  157. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  158. package/dist/brepkit-kernel/brepkitWasm.d.ts +3 -1
  159. package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
  160. package/dist/brepkit-kernel/brepkitWasm.js +13 -9
  161. package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
  162. package/dist/brepkit-kernel/multi-version-test.d.ts +2 -2
  163. package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -1
  164. package/dist/brepkit-kernel/multi-version-test.js +6 -6
  165. package/dist/brepkit-kernel/multi-version-test.js.map +1 -1
  166. package/dist/browser.d.ts +2 -3
  167. package/dist/browser.d.ts.map +1 -1
  168. package/dist/browser.js +1 -2
  169. package/dist/browser.js.map +1 -1
  170. package/dist/cad-runtime/admit-compat-lib.d.ts +9 -1
  171. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  172. package/dist/cad-runtime/admit-compat-lib.js +11 -1
  173. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  174. package/dist/cad-runtime/browser-lib-loader.d.ts +16 -11
  175. package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
  176. package/dist/cad-runtime/browser-lib-loader.js +16 -8
  177. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  178. package/dist/cad-runtime/direct-executor.d.ts +62 -5
  179. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  180. package/dist/cad-runtime/direct-executor.js +617 -42
  181. package/dist/cad-runtime/direct-executor.js.map +1 -1
  182. package/dist/cad-runtime/interp/closure.d.ts +3 -2
  183. package/dist/cad-runtime/interp/closure.d.ts.map +1 -1
  184. package/dist/cad-runtime/interp/closure.js.map +1 -1
  185. package/dist/cad-runtime/interp/env.d.ts +9 -6
  186. package/dist/cad-runtime/interp/env.d.ts.map +1 -1
  187. package/dist/cad-runtime/interp/env.js +4 -2
  188. package/dist/cad-runtime/interp/env.js.map +1 -1
  189. package/dist/cad-runtime/lib-decl.d.ts +121 -0
  190. package/dist/cad-runtime/lib-decl.d.ts.map +1 -0
  191. package/dist/cad-runtime/lib-decl.js +100 -0
  192. package/dist/cad-runtime/lib-decl.js.map +1 -0
  193. package/dist/cad-runtime/ports.d.ts +12 -0
  194. package/dist/cad-runtime/ports.d.ts.map +1 -1
  195. package/dist/cad-runtime/ports.js.map +1 -1
  196. package/dist/cad-runtime/runtime.d.ts +59 -5
  197. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  198. package/dist/cad-runtime/runtime.js +252 -20
  199. package/dist/cad-runtime/runtime.js.map +1 -1
  200. package/dist/extra/browser.d.ts +9 -0
  201. package/dist/extra/browser.d.ts.map +1 -0
  202. package/dist/extra/browser.js +9 -0
  203. package/dist/extra/browser.js.map +1 -0
  204. package/dist/extra/editor-ops.d.ts +22 -0
  205. package/dist/extra/editor-ops.d.ts.map +1 -0
  206. package/dist/extra/editor-ops.js +21 -0
  207. package/dist/extra/editor-ops.js.map +1 -0
  208. package/dist/extra/extras/svg-extrude.d.ts +45 -0
  209. package/dist/extra/extras/svg-extrude.d.ts.map +1 -0
  210. package/dist/extra/extras/svg-extrude.js +110 -0
  211. package/dist/extra/extras/svg-extrude.js.map +1 -0
  212. package/dist/extra/extras/text-cjk.d.ts +36 -0
  213. package/dist/extra/extras/text-cjk.d.ts.map +1 -0
  214. package/dist/extra/extras/text-cjk.js +86 -0
  215. package/dist/extra/extras/text-cjk.js.map +1 -0
  216. package/dist/extra/extras/text-geometry.d.ts +69 -0
  217. package/dist/extra/extras/text-geometry.d.ts.map +1 -0
  218. package/dist/extra/extras/text-geometry.js +188 -0
  219. package/dist/extra/extras/text-geometry.js.map +1 -0
  220. package/dist/extra/index.d.ts +40 -0
  221. package/dist/extra/index.d.ts.map +1 -0
  222. package/dist/extra/index.js +40 -0
  223. package/dist/extra/index.js.map +1 -0
  224. package/dist/extra/mesh/drill-hole/DrillHoleCore.d.ts +94 -0
  225. package/dist/extra/mesh/drill-hole/DrillHoleCore.d.ts.map +1 -0
  226. package/dist/extra/mesh/drill-hole/DrillHoleCore.js +282 -0
  227. package/dist/extra/mesh/drill-hole/DrillHoleCore.js.map +1 -0
  228. package/dist/extra/mesh/drill-hole/drill-types.d.ts +34 -0
  229. package/dist/extra/mesh/drill-hole/drill-types.d.ts.map +1 -0
  230. package/dist/extra/mesh/drill-hole/drill-types.js +7 -0
  231. package/dist/extra/mesh/drill-hole/drill-types.js.map +1 -0
  232. package/dist/extra/mesh/engrave-decoration.d.ts +42 -0
  233. package/dist/extra/mesh/engrave-decoration.d.ts.map +1 -0
  234. package/dist/extra/mesh/engrave-decoration.js +39 -0
  235. package/dist/extra/mesh/engrave-decoration.js.map +1 -0
  236. package/dist/extra/mesh/fai_drill.d.ts +21 -0
  237. package/dist/extra/mesh/fai_drill.d.ts.map +1 -0
  238. package/dist/extra/mesh/fai_drill.js +89 -0
  239. package/dist/extra/mesh/fai_drill.js.map +1 -0
  240. package/dist/extra/mesh/fai_extrude.d.ts +24 -0
  241. package/dist/extra/mesh/fai_extrude.d.ts.map +1 -0
  242. package/dist/extra/mesh/fai_extrude.js +42 -0
  243. package/dist/extra/mesh/fai_extrude.js.map +1 -0
  244. package/dist/extra/mesh/fai_split.d.ts +164 -0
  245. package/dist/extra/mesh/fai_split.d.ts.map +1 -0
  246. package/dist/extra/mesh/fai_split.js +269 -0
  247. package/dist/extra/mesh/fai_split.js.map +1 -0
  248. package/dist/extra/mesh/primitives.d.ts +29 -0
  249. package/dist/extra/mesh/primitives.d.ts.map +1 -0
  250. package/dist/extra/mesh/primitives.js +41 -0
  251. package/dist/extra/mesh/primitives.js.map +1 -0
  252. package/dist/extra/op-names.d.ts +37 -0
  253. package/dist/extra/op-names.d.ts.map +1 -0
  254. package/dist/extra/op-names.js +46 -0
  255. package/dist/extra/op-names.js.map +1 -0
  256. package/dist/extra/ops/compound.d.ts +140 -0
  257. package/dist/extra/ops/compound.d.ts.map +1 -0
  258. package/dist/extra/ops/compound.js +167 -0
  259. package/dist/extra/ops/compound.js.map +1 -0
  260. package/dist/extra/ops/copy.d.ts +40 -0
  261. package/dist/extra/ops/copy.d.ts.map +1 -0
  262. package/dist/extra/ops/copy.js +83 -0
  263. package/dist/extra/ops/copy.js.map +1 -0
  264. package/dist/extra/ops/fai_drill.d.ts +51 -0
  265. package/dist/extra/ops/fai_drill.d.ts.map +1 -0
  266. package/dist/extra/ops/fai_drill.js +233 -0
  267. package/dist/extra/ops/fai_drill.js.map +1 -0
  268. package/dist/extra/ops/fai_extrude.d.ts +36 -0
  269. package/dist/extra/ops/fai_extrude.d.ts.map +1 -0
  270. package/dist/extra/ops/fai_extrude.js +84 -0
  271. package/dist/extra/ops/fai_extrude.js.map +1 -0
  272. package/dist/extra/ops/fai_split.d.ts +46 -0
  273. package/dist/extra/ops/fai_split.d.ts.map +1 -0
  274. package/dist/extra/ops/fai_split.js +235 -0
  275. package/dist/extra/ops/fai_split.js.map +1 -0
  276. package/dist/extra/ops/load.d.ts +49 -0
  277. package/dist/extra/ops/load.d.ts.map +1 -0
  278. package/dist/extra/ops/load.js +423 -0
  279. package/dist/extra/ops/load.js.map +1 -0
  280. package/dist/extra/ops/svg-extrude.d.ts +32 -0
  281. package/dist/extra/ops/svg-extrude.d.ts.map +1 -0
  282. package/dist/extra/ops/svg-extrude.js +74 -0
  283. package/dist/extra/ops/svg-extrude.js.map +1 -0
  284. package/dist/extra/ops/text.d.ts +34 -0
  285. package/dist/extra/ops/text.d.ts.map +1 -0
  286. package/dist/extra/ops/text.js +100 -0
  287. package/dist/extra/ops/text.js.map +1 -0
  288. package/dist/geometry2d/bridge/lift-on-plane.d.ts +8 -5
  289. package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -1
  290. package/dist/geometry2d/bridge/lift-on-plane.js +8 -5
  291. package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -1
  292. package/dist/index.d.ts +6 -2
  293. package/dist/index.d.ts.map +1 -1
  294. package/dist/index.js +8 -2
  295. package/dist/index.js.map +1 -1
  296. package/dist/lang/symbol-table.d.ts +3 -3
  297. package/dist/lang/symbol-table.generated.d.ts +10 -0
  298. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  299. package/dist/lang/symbol-table.generated.js +10 -0
  300. package/dist/lang/symbol-table.generated.js.map +1 -1
  301. package/dist/lang/symbol-table.js +3 -3
  302. package/dist/lang/symbol-table.js.map +1 -1
  303. package/dist/math3d/index.d.ts +1 -1
  304. package/dist/math3d/index.js +1 -1
  305. package/dist/math3d/index.js.map +1 -1
  306. package/dist/mesh/engrave.d.ts +2 -3
  307. package/dist/mesh/engrave.d.ts.map +1 -1
  308. package/dist/mesh/engrave.js +4 -11
  309. package/dist/mesh/engrave.js.map +1 -1
  310. package/dist/mesh/index.d.ts +0 -2
  311. package/dist/mesh/index.d.ts.map +1 -1
  312. package/dist/mesh/index.js +0 -2
  313. package/dist/mesh/index.js.map +1 -1
  314. package/dist/mesh/primitives.d.ts +7 -5
  315. package/dist/mesh/primitives.d.ts.map +1 -1
  316. package/dist/mesh/primitives.js +16 -9
  317. package/dist/mesh/primitives.js.map +1 -1
  318. package/dist/mesh/types.d.ts +4 -3
  319. package/dist/mesh/types.d.ts.map +1 -1
  320. package/dist/mesh/types.js.map +1 -1
  321. package/dist/node-host/cli.d.ts +11 -4
  322. package/dist/node-host/cli.d.ts.map +1 -1
  323. package/dist/node-host/cli.js +53 -28
  324. package/dist/node-host/cli.js.map +1 -1
  325. package/dist/node-host/execute-script.d.ts.map +1 -1
  326. package/dist/node-host/execute-script.js +3 -4
  327. package/dist/node-host/execute-script.js.map +1 -1
  328. package/dist/node-host/lib-package-json.d.ts +36 -0
  329. package/dist/node-host/lib-package-json.d.ts.map +1 -0
  330. package/dist/node-host/lib-package-json.js +73 -0
  331. package/dist/node-host/lib-package-json.js.map +1 -0
  332. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  333. package/dist/occt-kernel/occt-primitives.js +41 -0
  334. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  335. package/dist/occt-kernel/occtKernel.d.ts +1 -1
  336. package/dist/occt-kernel/occtKernel.js +1 -1
  337. package/dist/occt-kernel/occtKernel.js.map +1 -1
  338. package/dist/primitives/brep-primitives.d.ts.map +1 -1
  339. package/dist/primitives/brep-primitives.js +39 -12
  340. package/dist/primitives/brep-primitives.js.map +1 -1
  341. package/dist/runtime-state.d.ts +28 -1
  342. package/dist/runtime-state.d.ts.map +1 -1
  343. package/dist/runtime-state.js +14 -1
  344. package/dist/runtime-state.js.map +1 -1
  345. package/dist/sdk.d.ts +2 -2
  346. package/dist/sdk.d.ts.map +1 -1
  347. package/dist/sdk.js +11 -2
  348. package/dist/sdk.js.map +1 -1
  349. package/dist/sketch/bspline.d.ts +58 -0
  350. package/dist/sketch/bspline.d.ts.map +1 -0
  351. package/dist/sketch/bspline.js +104 -0
  352. package/dist/sketch/bspline.js.map +1 -0
  353. package/dist/sketch/canonical.d.ts +239 -0
  354. package/dist/sketch/canonical.d.ts.map +1 -0
  355. package/dist/sketch/canonical.js +17 -0
  356. package/dist/sketch/canonical.js.map +1 -0
  357. package/dist/sketch/contour.d.ts +43 -0
  358. package/dist/sketch/contour.d.ts.map +1 -0
  359. package/dist/sketch/contour.js +202 -0
  360. package/dist/sketch/contour.js.map +1 -0
  361. package/dist/sketch/dim-spec.d.ts +32 -0
  362. package/dist/sketch/dim-spec.d.ts.map +1 -0
  363. package/dist/sketch/dim-spec.js +112 -0
  364. package/dist/sketch/dim-spec.js.map +1 -0
  365. package/dist/sketch/faces.d.ts +45 -0
  366. package/dist/sketch/faces.d.ts.map +1 -0
  367. package/dist/sketch/faces.js +108 -0
  368. package/dist/sketch/faces.js.map +1 -0
  369. package/dist/sketch/fcstd-types.d.ts +194 -0
  370. package/dist/sketch/fcstd-types.d.ts.map +1 -0
  371. package/dist/sketch/fcstd-types.js +67 -0
  372. package/dist/sketch/fcstd-types.js.map +1 -0
  373. package/dist/sketch/index.d.ts +46 -0
  374. package/dist/sketch/index.d.ts.map +1 -0
  375. package/dist/sketch/index.js +39 -0
  376. package/dist/sketch/index.js.map +1 -0
  377. package/dist/sketch/node.d.ts +14 -0
  378. package/dist/sketch/node.d.ts.map +1 -0
  379. package/dist/sketch/node.js +43 -0
  380. package/dist/sketch/node.js.map +1 -0
  381. package/dist/sketch/op.d.ts +111 -0
  382. package/dist/sketch/op.d.ts.map +1 -0
  383. package/dist/sketch/op.js +185 -0
  384. package/dist/sketch/op.js.map +1 -0
  385. package/dist/sketch/planegcs-backend.d.ts +69 -0
  386. package/dist/sketch/planegcs-backend.d.ts.map +1 -0
  387. package/dist/sketch/planegcs-backend.js +812 -0
  388. package/dist/sketch/planegcs-backend.js.map +1 -0
  389. package/dist/sketch/project.d.ts +176 -0
  390. package/dist/sketch/project.d.ts.map +1 -0
  391. package/dist/sketch/project.js +656 -0
  392. package/dist/sketch/project.js.map +1 -0
  393. package/dist/sketch/shapes.d.ts +370 -0
  394. package/dist/sketch/shapes.d.ts.map +1 -0
  395. package/dist/sketch/shapes.js +959 -0
  396. package/dist/sketch/shapes.js.map +1 -0
  397. package/dist/sketch/solve.d.ts +21 -0
  398. package/dist/sketch/solve.d.ts.map +1 -0
  399. package/dist/sketch/solve.js +144 -0
  400. package/dist/sketch/solve.js.map +1 -0
  401. package/dist/sketch/solver-loader.d.ts +47 -0
  402. package/dist/sketch/solver-loader.d.ts.map +1 -0
  403. package/dist/sketch/solver-loader.js +77 -0
  404. package/dist/sketch/solver-loader.js.map +1 -0
  405. package/dist/sketch/solver.d.ts +63 -0
  406. package/dist/sketch/solver.d.ts.map +1 -0
  407. package/dist/sketch/solver.js +28 -0
  408. package/dist/sketch/solver.js.map +1 -0
  409. package/dist/sketch/verify.d.ts +53 -0
  410. package/dist/sketch/verify.d.ts.map +1 -0
  411. package/dist/sketch/verify.js +71 -0
  412. package/dist/sketch/verify.js.map +1 -0
  413. package/dist/topology/naming/geom-hint.d.ts +12 -0
  414. package/dist/topology/naming/geom-hint.d.ts.map +1 -1
  415. package/dist/topology/naming/geom-hint.js +1 -1
  416. package/dist/topology/naming/geom-hint.js.map +1 -1
  417. package/dist/topology/naming/lineage.d.ts +1 -0
  418. package/dist/topology/naming/lineage.d.ts.map +1 -1
  419. package/dist/topology/naming/lineage.js +37 -1
  420. package/dist/topology/naming/lineage.js.map +1 -1
  421. package/dist/topology/naming/resolve-face.d.ts +13 -2
  422. package/dist/topology/naming/resolve-face.d.ts.map +1 -1
  423. package/dist/topology/naming/resolve-face.js +18 -2
  424. package/dist/topology/naming/resolve-face.js.map +1 -1
  425. package/dist/weapp.d.ts +1 -1
  426. package/dist/weapp.d.ts.map +1 -1
  427. package/dist/weapp.js +1 -1
  428. package/dist/weapp.js.map +1 -1
  429. package/package.json +43 -11
@@ -1 +1 @@
1
- {"version":3,"file":"brep-ops.js","sourceRoot":"","sources":["../../src/brep/brep-ops.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 核心 BREP 操作 — 使用 OCCT 精确实体运算\n *\n * @platform occt — 本文件 import occt-kernel:`extrudeBrep` 用原生 `section`\n * (BRepAlgoAPI_Section,occt-only,L1 只有 sectionByPlane)构造截面 → 守卫①\n * 要求平台 import 自证身份。本文件是内部工具面(非 op 文件),文件级标注即满足\n * 守卫;调用方 op 若经本文件触达 occt-only 能力,须在 defineOp 声明 engines\n * (extrudeBrep 的 section 仅 occt 路径可达,brepkit 下由调用方引擎声明拦截)。\n *\n * See docs/api-contract.md §8 (dual-path geometry contract: BREP / Mesh).\n *\n * 与 mesh 路径(transform.ts / boolean/ / drill.ts / split.ts / extrude.ts)对照:\n * - mesh 路径:消费 Shape(三角网格),走 manifold-3d(mesh-CSG)\n * - BREP 路径:消费 BrepHandle(OCCT 实体句柄),走 OCCT 精确布尔/变换\n *\n * 所有函数都是纯函数(可 import occtWasmKernel,不读 store)。\n * 输入输出均为 OCCT BrepHandle,调用方负责句柄生命周期。\n *\n * 坐标系:Z-up、毫米,与 mesh 路径一致。\n */\n\nimport { Vec3 as Vec3C, Mat4, Euler, Quat } from '../math3d'\nimport type { BrepHandle, BrepMeshResult } from './engine/types'\nimport type { BrepEngineApi } from './engine/primitives'\nimport {\n getOcctKernel,\n importAssemblyFromStep,\n collectLeafParts,\n type ShapeHandle,\n type AssemblyPartNode,\n} from '../occt-kernel/occtKernel'\nimport { getSolidColorsOrdered } from '../occt-kernel/stepColorParser'\nimport type { Shape, Vec3 } from '../mesh/types'\nimport type { ImportAssemblyNode } from '../mesh/import-model'\nimport type { BrepChainState } from './brep-chain'\nimport type { PartName } from '../identity'\nimport { getSolidBoundingBox } from './brep-utils'\nimport { getTessellation, type TessellationDensity } from '../runtime-state'\n\n// ─── 通用工具 ───\n\n/**\n * 将 OCCT solid 三角化为 Shape(供显示用)。\n *\n * 如果传入 brepChain + stmtId,同时把完整 BrepMeshResult(含 faceGroups)缓存到\n * brepChain.meshShapeCache,供 buildBrepTopology 复用——确保拓扑 mesh 与显示 mesh\n * 完全一致(规则 1:拓扑数据生成所使用的 mesh,必须是当前用户看到的 mesh)。\n *\n * @param kernel the initialized OCCT kernel.\n * @param solid the CAD solid handle.\n * @param segments optional tessellation segment count (affects precision).\n * @param brepChain optional - caches the BrepMeshResult when provided.\n * @param partName optional - the part this solid belongs to, paired with brepChain as the cache key.\n * @param defaultDeflection optional - per-call deflection fallback when `segments` is absent\n * (wins over the global tessellation knob; explicit `segments` still wins over both).\n * @returns the tessellated Shape.\n */\nexport function solidToShape(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n segments?: number,\n brepChain?: BrepChainState,\n partName?: PartName,\n defaultDeflection?: TessellationDensity,\n): Shape {\n // Deflection precedence: explicit segments > per-call defaultDeflection > global\n // tessellation (host-tunable via createRuntime, proposal 2026-10-07).\n const fallback = defaultDeflection ?? getTessellation()\n const angularDeflection = segments\n ? (2 * Math.PI) / Math.max(3, segments)\n : fallback.angularDeflection\n const mesh: BrepMeshResult = kernel.meshShape(solid, {\n linearDeflection: fallback.linearDeflection,\n angularDeflection,\n })\n\n // 规则 1:缓存完整 BrepMeshResult(含 faceGroups),供 buildBrepTopology 复用\n if (brepChain?.meshShapeCache && partName) {\n brepChain.meshShapeCache.set(partName, mesh)\n }\n\n return {\n positions: new Float32Array(mesh.positions),\n indices: new Uint32Array(mesh.indices),\n }\n}\n\n// ─── 变换操作 ───\n\n/**\n * BREP 平移:使用 OCCT translate(精确,不损失几何精度)。\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param offset 平移量 [dx, dy, dz]\n * @returns 新实体(调用方负责释放输入实体)\n */\nexport function translateBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n offset: Vec3,\n): BrepHandle {\n return kernel.translate(solid, offset[0], offset[1], offset[2])\n}\n\n/**\n * BREP 旋转:使用 OCCT transform(3x4 仿射矩阵)。\n *\n * 与 mesh 路径 rotate_euler(shape, angles, pivot?) 一致:\n * - angles 为 XYZ 欧拉角(角度制)\n * - pivot 为旋转中心(可选,默认原点)\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param angles XYZ 欧拉角(角度制)\n * @param pivot 旋转中心(可选)\n * @returns 新实体\n */\nexport function rotateBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n angles: Vec3,\n pivot?: Vec3,\n): BrepHandle {\n const euler = new Euler(\n (angles[0] * Math.PI) / 180,\n (angles[1] * Math.PI) / 180,\n (angles[2] * Math.PI) / 180,\n )\n const matrix = new Mat4().makeRotationFromEuler(euler)\n if (pivot) {\n matrix.premultiply(new Mat4().makeTranslation(pivot[0], pivot[1], pivot[2]))\n matrix.multiply(new Mat4().makeTranslation(-pivot[0], -pivot[1], -pivot[2]))\n }\n return kernel.transform(solid, matrixToArray(matrix))\n}\n\n/**\n * 判定 3×4 行主序仿射矩阵的线性部分是否为**相似变换**(旋转/反射 × 等比缩放)——\n * 即 `gp_Trsf` 能精确承载、`kernel.transform`(BRepBuilderAPI_Transform)唯一\n * 正确处理的那一类。\n *\n * 判据必须用**相对**容差,不能像 2026-10-07 之前那样用绝对容差:\n * GOTCHA(2026-10-07,openscad example023 parity)——一个 60° 刚体旋转只要按\n * 7 位小数打印(`0.8660254`),行范数就是 `0.99999999645`(与 1 相差 3.6e-9)。\n * 绝对容差 1e-9 会判定 `|‖row2‖ − ‖row0‖| = 3.6e-9 > 1e-9` ⇒ 把这个**纯旋转**\n * 判成\"非相似\",从而错误地走进 `generalTransform`;而 occt 侧 `gp_GTrsf` 路径在\n * **已三角化**的形状上会重复计入被平移面的 TopLoc(顶盖 z 由 5 变 10,绕过在\n * `occt-kernel/occt-primitives.ts` 的 `generalTransform` 适配层,本层不感知)。\n * 相对容差 1e-6 覆盖 7 位小数打印精度,同时仍能区分真正的非等比缩放\n * (如 z×2.5 行范数相差 2.5 倍)。正交性同用 1e-6:7 位小数打印的旋转,行点积\n * 误差上界约 2e-7。\n *\n * @param m12 - 3×4 行主序矩阵(12 元素:`[r00,r01,r02,tx, r10,r11,r12,ty, r20,r21,r22,tz]`)。\n * @returns `true` 当且仅当线性部分可逆且为相似变换。\n */\nexport function isSimilarityAffine(m12: readonly number[]): boolean {\n const s0 = Math.hypot(m12[0]!, m12[1]!, m12[2]!)\n const s1 = Math.hypot(m12[4]!, m12[5]!, m12[6]!)\n const s2 = Math.hypot(m12[8]!, m12[9]!, m12[10]!)\n if (!(s0 > 1e-12) || !(s1 > 1e-12) || !(s2 > 1e-12)) return false\n const REL = 1e-6\n if (Math.abs(s1 - s0) > REL * s0 || Math.abs(s2 - s0) > REL * s0) return false\n const dot = (r: number, c: number): number =>\n m12[r * 4]! * m12[c * 4]! + m12[r * 4 + 1]! * m12[c * 4 + 1]! + m12[r * 4 + 2]! * m12[c * 4 + 2]!\n return (\n Math.abs(dot(0, 1)) <= REL * s0 * s1 &&\n Math.abs(dot(0, 2)) <= REL * s0 * s2 &&\n Math.abs(dot(1, 2)) <= REL * s1 * s2\n )\n}\n\n/**\n * 施加 3×4 行主序仿射矩阵,按矩阵类别选**唯一正确**的 OCCT 路径。\n *\n * 两条路径的差异是**正确性**而不只是性能:\n * - 相似(旋转/反射 × 等比缩放)→ `kernel.transform`(BRepBuilderAPI_Transform)。\n * - 其余(非等比缩放、错切)→ `kernel.generalTransform`(gp_GTrsf)。\n *\n * GOTCHA(2026-10-07):occt 的 `generalTransform` 在**已经三角化过**的形状上会\n * 重复计入被平移面的 TopLoc(精确 z∈[0,5],网格顶盖却落在 z=10;非等比 z×2.5 时\n * 12.5 vs 17.5)。该缺陷是 **occt 专属**(brepkit 的 GTrsf 路径干净),因此绕过\n * **不在本层**——本层是引擎中立分派,让每个引擎都为 occt 的毛病多付一次句柄分配\n * 是错的(还会扰动 brepkit 的 `cut` bbox,见 multi-engine-op-parity)。\n * 绕过落在 occt 适配层:`occt-kernel/occt-primitives.ts` 的 `generalTransform`\n * 先 `copy` 再变换。`kernel.transform` 无此问题,故相似矩阵不付这份深拷贝成本。\n *\n * 反向陷阱:把非相似矩阵交给 `kernel.transform` 是**静默错误**——OCCT 会按\n * `det^(1/3)` 取等比因子近似(实测 z×2.5 被当成 1.357 倍等比缩放)。所以分类\n * 判据既不能过严(把刚体旋转推给 GTrsf),也不能过宽(把非等比缩放塞给 Trsf)。\n *\n * @param kernel - L1 引擎句柄。\n * @param solid - 输入实体(不被消费、不被释放;调用方保留其所有权)。\n * @param m12 - 3×4 行主序矩阵(12 元素)。\n * @returns 变换后的新实体(调用方负责释放)。\n */\nexport function applyAffineBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n m12: readonly number[],\n): BrepHandle {\n if (isSimilarityAffine(m12)) return kernel.transform(solid, m12 as number[])\n return kernel.generalTransform(solid, m12 as number[])\n}\n\n/**\n * BREP 缩放:使用 OCCT transform(3x4 仿射矩阵)。\n *\n * 与 mesh 路径 scale(P6 §4.6)一致:\n * - factor 为 number(均匀缩放)或 Vec3 [sx, sy, sz](非均匀)\n * - center 为缩放不动点(p' = center + S·(p − center));缺省 [0,0,0](原点),\n * 与早期 brepjs `scale(shape, factor, { center? })` 的默认一致。\n *\n * 路径分派交给 {@link applyAffineBrep}:等比走 `transform`,非等比走\n * `generalTransform`(gp_Trsf 表达不了非等比)。注意判据是**数值**相似性而非\n * 因子逐分量相等——`[1, 1, 1+1e-9]` 这种数值上就是等比,归 `transform` 一侧。\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param factor 缩放因子\n * @param center 缩放不动点(可选,默认原点)\n * @returns 新实体\n */\nexport function scaleBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n factor: number | Vec3,\n center?: Vec3,\n): BrepHandle {\n const f = typeof factor === 'number' ? [factor, factor, factor] : factor\n const scale = new Mat4().makeScale(f[0], f[1], f[2])\n // T(c)·S·T(−c):不动点为 center;缺省时退化为原点缩放(现状行为)。\n const matrix = center\n ? new Mat4()\n .makeTranslation(center[0], center[1], center[2])\n .multiply(scale)\n .multiply(new Mat4().makeTranslation(-center[0], -center[1], -center[2]))\n : scale\n return applyAffineBrep(kernel, solid, matrixToArray(matrix))\n}\n\n// ─── 装配变换 ───\n\n/**\n * BREP 版 applyTransform:与 mesh ops/assemble.ts 的 applyTransform 同语义(绕 pivot 旋转 + 平移)。\n *\n * 数学公式:p' = R·(p − pivot) + pivot + translation\n * 等价 Matrix4 = T(pivot) · R · T(−pivot) · T(translation)\n *\n * 用四元数而非欧拉角,是因为装配变换源是 api/assembly 的四元数;\n * 转欧拉会引入顺序/万向锁歧义。与 mesh applyTransform 顶点公式完全等价。\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param quaternion 旋转四元数 [x, y, z, w]\n * @param pivot 旋转中心\n * @param translation 平移量\n * @returns 新实体(调用方负责释放输入实体)\n */\nexport function applyTransformBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n quaternion: [number, number, number, number],\n pivot: [number, number, number],\n translation: [number, number, number],\n): BrepHandle {\n const rotation = new Mat4().makeRotationFromQuaternion(\n new Quat(quaternion[0], quaternion[1], quaternion[2], quaternion[3]),\n )\n // T(translation) · T(pivot) · R · T(-pivot) = T(pivot+translation) · R · T(-pivot)\n // 先绕 pivot 旋转,再平移 translation(与 mesh 路径 applyTransform 一致)\n const matrix = new Mat4()\n .makeTranslation(pivot[0] + translation[0], pivot[1] + translation[1], pivot[2] + translation[2])\n .multiply(rotation)\n .multiply(new Mat4().makeTranslation(-pivot[0], -pivot[1], -pivot[2]))\n return kernel.transform(solid, matrixToArray(matrix))\n}\n\n// ─── 布尔操作 ───\n\n/**\n * BREP 布尔并集:使用 OCCT fuse(BRepAlgoAPI_Fuse)。\n *\n * @param kernel OCCT 内核\n * @param a 实体 A\n * @param b 实体 B\n * @returns 融合后的实体\n */\nexport function fuseBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): BrepHandle {\n return kernel.fuse(a, b)\n}\n\n/**\n * BREP 布尔差集:使用 OCCT cut(BRepAlgoAPI_Cut)。\n *\n * @param kernel OCCT 内核\n * @param a 基体\n * @param b 工具(从基体中减去)\n * @returns 切割后的实体\n */\nexport function cutBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): BrepHandle {\n return kernel.cut(a, b)\n}\n\n/**\n * BREP 布尔交集:使用 OCCT common(BRepAlgoAPI_Common)。\n *\n * @param kernel OCCT 内核\n * @param a 实体 A\n * @param b 实体 B\n * @returns 交集实体\n */\nexport function commonBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): BrepHandle {\n return kernel.common(a, b)\n}\n\n// ─── 钻孔操作 ───\n\n/** drillBrep 的参数 */\nexport interface DrillBrepParams {\n /** 孔直径 */\n diameter: number\n /** 孔深度(0 = 通孔) */\n depth: number\n /** 孔位置(世界空间) */\n position: Vec3\n /** 钻孔方向(世界空间,指向材料内部) */\n direction: Vec3\n /** 面法向(世界空间) */\n faceNormal: Vec3\n /** 孔类型 */\n holeType?: 'simple' | 'screw'\n}\n\n/**\n * BREP 钻孔:创建圆柱工具实体并用 OCCT cut 减去。\n *\n * 仅支持圆柱孔(holeType='simple')。\n * 螺丝孔(holeType='screw')由调用方判断为 mesh-only,触发 BREP 链断裂。\n *\n * 通孔(depth=0):创建一个足够长的圆柱体穿透整个零件。\n * 盲孔(depth>0):创建指定深度的圆柱体。\n *\n * @param kernel OCCT 内核\n * @param solid 目标实体\n * @param params 钻孔参数\n * @returns 钻孔后的实体\n */\n/** 钻孔几何参数(由 `DrillBrepParams` 推导;roleTable 路径与 `drillBrep` 共用同一份几何,避免重复计算)。 */\nexport interface DrillGeometry {\n readonly radius: number\n readonly holeHeight: number\n readonly holeCenter: Vec3C\n readonly direction: Vec3C\n}\n\n/** 从 `DrillBrepParams` 推导钻孔几何(孔中心/高度/轴向)。供 `drillBrep` 与 role-table 路径共用。\n * @param kernel - BREP 引擎接口\n * @param solid - 待钻孔实体(用于 bbox 推导通孔高度)\n * @param params - 钻孔参数(直径/深度/位置/方向/面法向)\n * @returns 钻孔几何(半径/高度/中心/轴向)\n */\nexport function computeDrillGeometry(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: DrillBrepParams,\n): DrillGeometry {\n const radius = params.diameter / 2\n const direction = new Vec3C(...params.direction).normalize()\n // 确保方向指向材料内部\n const faceNormal = new Vec3C(...params.faceNormal)\n if (direction.dot(faceNormal) > 0) {\n direction.negate()\n }\n\n // 计算孔的高度和中心\n const bbox = getSolidBoundingBox(kernel, solid)\n const bboxSize = new Vec3C(\n bbox.max[0] - bbox.min[0],\n bbox.max[1] - bbox.min[1],\n bbox.max[2] - bbox.min[2],\n )\n const bboxMax = Math.max(bboxSize.x, bboxSize.y, bboxSize.z)\n\n let holeHeight: number\n let holeCenter: Vec3C\n const pos = new Vec3C(...params.position)\n\n // 通孔:depth <= 0(契约:depth<=0 表示通孔,与 mesh 路径 `depth>0 ? 'blind':'through'` 一致)。\n // ⚠️ 只判 `=== 0` 会让 depth<0 落入盲孔分支 → safeDepth=0 → 零高圆柱 → OCCT transform 崩溃。\n if (params.depth <= 0) {\n const d = direction.clone().normalize()\n const bbMin = new Vec3C(bbox.min[0], bbox.min[1], bbox.min[2])\n const bbMax = new Vec3C(bbox.max[0], bbox.max[1], bbox.max[2])\n\n let tNear = -Infinity\n let tFar = Infinity\n const axes: Array<[number, number, number, number]> = [\n [0, d.x, bbMin.x, bbMax.x],\n [1, d.y, bbMin.y, bbMax.y],\n [2, d.z, bbMin.z, bbMax.z],\n ]\n const pArr = [pos.x, pos.y, pos.z]\n for (const [axis, di, lo, hi] of axes) {\n const pi = pArr[axis]\n if (Math.abs(di) > 1e-12) {\n const t1 = (lo - pi) / di\n const t2 = (hi - pi) / di\n tNear = Math.max(tNear, Math.min(t1, t2))\n tFar = Math.min(tFar, Math.max(t1, t2))\n } else if (pi < lo || pi > hi) {\n // 与 slab 平行且在外部 — 无交点(与 mesh 行为一致:几乎不钻孔)\n tNear = 0\n tFar = 0\n }\n }\n if (!isFinite(tNear) || !isFinite(tFar) || tFar < tNear) {\n // 不穿过 bbox:与 mesh 一致,只留 0.2mm 微小孔\n holeHeight = 0.2\n holeCenter = pos.clone()\n } else {\n holeHeight = tFar - tNear + 0.2\n holeCenter = pos.clone().add(direction.clone().normalize().multiplyScalar((tNear + tFar) / 2))\n }\n } else {\n // 盲孔:深度钳制到 bboxMax(与 mesh cad-core/drill.ts 一致)\n const safeDepth = Math.max(0, Math.min(params.depth, bboxMax))\n holeHeight = safeDepth\n holeCenter = pos.clone().add(direction.clone().normalize().multiplyScalar(safeDepth / 2))\n }\n\n return { radius, holeHeight, holeCenter, direction }\n}\n\n/** 由钻孔几何构造刀具实体(圆柱,旋转 + 平移到孔位)。调用方负责 release。\n * @param kernel - BREP 引擎接口\n * @param geom - 钻孔几何(半径/高度/中心/轴向)\n * @returns 刀具实体(BrepHandle,调用方负责 release)\n */\nexport function buildDrillToolSolid(kernel: BrepEngineApi, geom: DrillGeometry): BrepHandle {\n const cylinder = kernel.makeCylinder(geom.radius, geom.holeHeight)\n\n // 计算从 Z 轴到 direction 的旋转\n const zAxis = new Vec3C(0, 0, 1)\n const quat = new Quat().setFromUnitVectors(zAxis, geom.direction)\n const rotMatrix = new Mat4().makeRotationFromQuaternion(quat)\n\n // 平移矩阵:到孔中心,并减去 height/2(因为圆柱从 Z=0 开始)\n const transMatrix = new Mat4().makeTranslation(\n geom.holeCenter.x,\n geom.holeCenter.y,\n geom.holeCenter.z,\n )\n // 组合:先旋转,再平移\n const finalMatrix = new Mat4().multiplyMatrices(transMatrix, rotMatrix)\n // 还需要补偿圆柱的起始位置(从 Z=0 开始 → 需要先下移 height/2)\n const offsetMatrix = new Mat4().makeTranslation(0, 0, -geom.holeHeight / 2)\n const fullMatrix = new Mat4().multiplyMatrices(finalMatrix, offsetMatrix)\n\n const toolSolid = kernel.transform(cylinder, matrixToArray(fullMatrix))\n kernel.release(cylinder)\n return toolSolid\n}\n\n/** 在实体上钻一个孔:由参数推导几何、构造刀具实体并做布尔差。\n * @param kernel - BREP 引擎接口\n * @param solid - 待钻孔实体\n * @param params - 钻孔参数(直径/深度/位置/方向/面法向)\n * @returns 钻孔后的实体(BrepHandle)\n */\nexport function drillBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: DrillBrepParams,\n): BrepHandle {\n const geom = computeDrillGeometry(kernel, solid, params)\n const toolSolid = buildDrillToolSolid(kernel, geom)\n try {\n const result = kernel.cut(solid, toolSolid)\n kernel.release(toolSolid)\n return result\n } catch (err) {\n kernel.release(toolSolid)\n throw new Error(`[drillBrep] OCCT cut failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err })\n }\n}\n\n// ─── 分割操作 ───\n\n/** splitBrep 的参数 */\nexport interface SplitBrepParams {\n /** 切割平面法线 */\n normal: Vec3\n /**\n * 切割平面位置:世界系平面方程 d 值(n·x = planeDistance)。\n * 与 planeCenter 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeDistance?: number\n /**\n * 切割平面位置:世界坐标点(平面中心)。\n * 与 planeDistance 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeCenter?: Vec3\n}\n\n/** splitBrep 的结果 */\nexport interface SplitBrepResult {\n /** 法线正方向的半部分 */\n front: BrepHandle\n /** 法线负方向的半部分 */\n back: BrepHandle\n}\n\n/**\n * BREP 平面分割:使用 OCCT cut + common 实现平面分割。\n *\n * 仅支持平面分割(cutMode='plane')。\n * 燕尾/定位销/直榫等复杂分割由 joinery-brep.ts 处理。\n *\n * 实现方式:\n * 1. 创建一个大的半空间盒子(法线正方向一侧)\n * 2. common(solid, box) → 法线正方向的半部分\n * 3. cut(solid, box) → 法线负方向的半部分\n *\n * @param kernel OCCT 内核\n * @param solid 目标实体\n * @param params 分割参数\n * @returns 两个半部分\n */\nexport function splitBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: SplitBrepParams,\n): SplitBrepResult {\n const bbox = getSolidBoundingBox(kernel, solid)\n const bboxSize = new Vec3C(\n bbox.max[0] - bbox.min[0],\n bbox.max[1] - bbox.min[1],\n bbox.max[2] - bbox.min[2],\n )\n const bboxMax = Math.max(bboxSize.x, bboxSize.y, bboxSize.z)\n\n // 创建一个大的盒子代表法线正方向的半空间\n const normal = new Vec3C(...params.normal).normalize()\n const halfSize = bboxMax * 3 // 足够大\n\n // 先在局部坐标系(Z 轴 = 法线方向)创建盒子\n // 然后旋转到世界坐标系\n const zAxis = new Vec3C(0, 0, 1)\n const quat = new Quat().setFromUnitVectors(zAxis, normal)\n const rotMatrix = new Mat4().makeRotationFromQuaternion(quat)\n\n // 在局部坐标系中,盒子从 Z=0(切割平面)延伸到 Z=halfSize\n const localBox = kernel.makeBoxFromCorners(\n { x: -halfSize, y: -halfSize, z: 0 },\n { x: halfSize, y: halfSize, z: halfSize },\n )\n\n // 计算切割平面的世界坐标原点(planeCenter / planeDistance 二选一必填,\n // 都缺省直接报错,不隐式回退 bbox 中心)\n const planeOrigin = resolvePlaneOrigin(normal, params.planeCenter, params.planeDistance)\n\n const transMatrix = new Mat4().makeTranslation(\n planeOrigin.x,\n planeOrigin.y,\n planeOrigin.z,\n )\n const finalMatrix = new Mat4().multiplyMatrices(transMatrix, rotMatrix)\n\n const halfSpaceBox = kernel.transform(localBox, matrixToArray(finalMatrix))\n kernel.release(localBox)\n\n try {\n // P2(2026-10-06):规避 occt-wasm 在 Chrome worker 下 common 对\"平面退化 BOP\"\n // 挂死(common(solid, 半边盒) 不稳定;cut 稳定——drill 打孔 cut 在 worker 正常)。\n // 差集对偶:back(负侧)= solid - 正盒;front(正侧)= solid - 负盒。\n // 数学等价于 common/cut(盒覆盖 solid 全尺寸,边界同为切割平面),node 探针验证\n // 三角化结果与原实现一致。common 保留在 node/非 worker 环境的回退不可行——\n // 静态行为应一致,故统一走两 cut。\n const back = kernel.cut(solid, halfSpaceBox)\n // 负盒:local 系 z ∈ [-halfSize, 0],同 finalMatrix(平面沿 -normal 方向扩展)\n const localBoxNeg = kernel.makeBoxFromCorners(\n { x: -halfSize, y: -halfSize, z: -halfSize },\n { x: halfSize, y: halfSize, z: 0 },\n )\n const negBox = kernel.transform(localBoxNeg, matrixToArray(finalMatrix))\n kernel.release(localBoxNeg)\n const front = kernel.cut(solid, negBox)\n kernel.release(halfSpaceBox)\n kernel.release(negBox)\n return { front, back }\n } catch (err) {\n kernel.release(halfSpaceBox)\n throw new Error(`[splitBrep] OCCT split failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err })\n }\n}\n\n// ─── 拉伸操作 ───\n\n/** extrudeBrep 的参数 */\nexport interface ExtrudeBrepParams {\n /** 拉伸法线方向 */\n normal: Vec3\n /**\n * 切割平面位置:世界系平面方程 d 值(n·x = planeDistance)。\n * 与 planeCenter 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeDistance?: number\n /**\n * 切割平面位置:世界坐标点(平面中心)。\n * 与 planeDistance 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeCenter?: Vec3\n /** 拉伸长度 */\n length: number\n /** 拉伸模式 */\n mode?: 'centered' | 'forward' | 'backward'\n}\n\n/** 从 planeCenter / planeDistance 收敛出切割平面上的一个点(planeOrigin)。 */\nfunction resolvePlaneOrigin(\n normal: Vec3C,\n planeCenter?: Vec3,\n planeDistance?: number,\n): Vec3C {\n if (planeCenter !== undefined) {\n return new Vec3C(...planeCenter)\n }\n if (planeDistance !== undefined) {\n // 平面方程 n·x = d 上的点:取法线上距原点 d 处(n 为单位向量)\n return normal.clone().multiplyScalar(planeDistance)\n }\n throw new Error(\n '[extrudeBrep] plane location missing: provide planeCenter or planeDistance (implicit bbox-center fallback is forbidden)',\n )\n}\n\n/**\n * BREP 拉伸:在切割平面处将实体切开,中段沿法线拉伸 length,三段 fuse。\n *\n * 实现方式:\n * 1. 用平面分割得到 front + back\n * 2. 获取截面线(section edges → wire → face)\n * 3. 沿法线拉伸截面 face → 中段实体\n * 4. fuse(front, extruded, back)\n *\n * 如果截面无法构建 face(开放线框等),抛出错误由调用方处理为链断裂。\n *\n * @param kernel OCCT 内核\n * @param solid 目标实体\n * @param params 拉伸参数\n * @returns 拉伸后的实体\n */\nexport function extrudeBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: ExtrudeBrepParams,\n): BrepHandle {\n const mode = params.mode ?? 'centered'\n const normal = new Vec3C(...params.normal).normalize()\n const length = params.length\n\n // 1. 确定切割平面位置(世界系,来源静态:planeCenter 或 planeDistance,\n // 都缺省直接报错,不隐式回退 bbox 中心)\n const planeOrigin = resolvePlaneOrigin(normal, params.planeCenter, params.planeDistance)\n\n // 2. 分割实体\n const splitResult = splitBrep(kernel, solid, {\n normal: [normal.x, normal.y, normal.z],\n planeCenter: [planeOrigin.x, planeOrigin.y, planeOrigin.z],\n })\n\n // 3. 获取截面\n // 使用 section 获取切割平面与实体的交线\n const bbox = getSolidBoundingBox(kernel, solid)\n const zAxis = new Vec3C(0, 0, 1)\n const quat = new Quat().setFromUnitVectors(zAxis, normal)\n const rotMatrix = new Mat4().makeRotationFromQuaternion(quat)\n const transMatrix = new Mat4().makeTranslation(\n planeOrigin.x,\n planeOrigin.y,\n planeOrigin.z,\n )\n const planeMatrix = new Mat4().multiplyMatrices(transMatrix, rotMatrix)\n\n // 创建一个大的矩形面作为切割平面\n const bboxSize = new Vec3C(\n bbox.max[0] - bbox.min[0],\n bbox.max[1] - bbox.min[1],\n bbox.max[2] - bbox.min[2],\n )\n const planeSize = Math.max(bboxSize.x, bboxSize.y, bboxSize.z) * 3\n const planeRect = kernel.makeRectangle(planeSize, planeSize)\n // makeRectangle creates a face from [0,0] to [width,height] — center it at origin first\n const centerMatrix = new Mat4().makeTranslation(-planeSize / 2, -planeSize / 2, 0)\n const centeredRect = kernel.transform(planeRect, matrixToArray(centerMatrix))\n kernel.release(planeRect)\n const planeFace = kernel.transform(centeredRect, matrixToArray(planeMatrix))\n kernel.release(centeredRect)\n\n // 获取截面边(occt-only 平台面,D3)。BrepHandle(branded number)与\n // occt-wasm ShapeHandle 运行时同构,品牌转换只发生在平台边界;转回 BrepHandle\n // 后继续用 L1 面(getSubShapes/makeWire/extrude)。\n const sectionEdges = getOcctKernel().section(\n solid as unknown as ShapeHandle,\n planeFace as unknown as ShapeHandle,\n ) as unknown as BrepHandle\n kernel.release(planeFace)\n\n // 4. 构建截面 wire → face → 拉伸\n let extrudedSolid: BrepHandle\n try {\n // 尝试从截面边构建 wire\n const subShapes = kernel.getSubShapes(sectionEdges, 'edge')\n if (subShapes.length === 0) {\n kernel.release(sectionEdges)\n kernel.release(splitResult.front)\n kernel.release(splitResult.back)\n throw new Error('no section edges from plane intersection')\n }\n\n const wire = kernel.makeWire(subShapes)\n const face = kernel.makeFace(wire)\n kernel.release(wire)\n\n // 计算拉伸向量\n let extrudeVec: Vec3C\n if (mode === 'centered') {\n extrudeVec = normal.clone().multiplyScalar(length)\n } else if (mode === 'forward') {\n extrudeVec = normal.clone().multiplyScalar(length)\n } else {\n // backward\n extrudeVec = normal.clone().multiplyScalar(-length)\n }\n\n extrudedSolid = kernel.extrude(face, extrudeVec.x, extrudeVec.y, extrudeVec.z)\n kernel.release(face)\n kernel.release(sectionEdges)\n } catch {\n // 截面构建失败 — 释放资源并抛出\n if (sectionEdges) kernel.release(sectionEdges)\n kernel.release(splitResult.front)\n kernel.release(splitResult.back)\n throw new Error('[extrudeBrep] failed to build extrusion from section')\n }\n\n // 5. 中段落位补偿(修复 centered 模式中空 / 开壳)\n //\n // 切割平面位于 planeOrigin,splitBrep 产出的 front/back 其切面恰好在 planeOrigin。\n // - forward:front 偏移 +L、back 偏移 0 → 中段(从 planeOrigin 沿 +normal 拉伸 L,\n // 底面在 planeOrigin)的顶面(planeOrigin+L)正好接 front 底面,无需位移。\n // - backward:front 偏移 0、back 偏移 -L → 中段(沿 -normal 拉伸 L,顶在 planeOrigin)\n // 底面(planeOrigin-L)正好接 back 顶面,无需位移。\n // - centered:front 偏移 +L/2、back 偏移 -L/2,二者之间让出 L 的缝隙;但中段默认\n // 从 planeOrigin 沿 +normal 拉伸 L,落在 planeOrigin→planeOrigin+L,与 back 顶面\n // (planeOrigin-L/2) 和 front 底面 (planeOrigin+L/2) 各错开 L/2,形成两道 L/2 的缝隙\n // → fuse 后实体开壳 / 中空。必须对中段额外沿 -normal 位移 L/2,使其落在\n // planeOrigin-L/2 → planeOrigin+L/2,正好填补缝隙。\n const middleOffset = mode === 'centered' ? -length / 2 : 0\n if (middleOffset !== 0) {\n const translatedMiddle = kernel.translate(\n extrudedSolid,\n normal.x * middleOffset,\n normal.y * middleOffset,\n normal.z * middleOffset,\n )\n kernel.release(extrudedSolid)\n extrudedSolid = translatedMiddle\n }\n\n // 6. 计算各段位置\n let frontOffset: number\n let backOffset: number\n if (mode === 'centered') {\n frontOffset = length / 2\n backOffset = -length / 2\n } else if (mode === 'forward') {\n frontOffset = length\n backOffset = 0\n } else {\n frontOffset = 0\n backOffset = -length\n }\n\n // 平移 front 和 back\n const frontTranslated = kernel.translate(\n splitResult.front,\n normal.x * frontOffset,\n normal.y * frontOffset,\n normal.z * frontOffset,\n )\n kernel.release(splitResult.front)\n\n const backTranslated = kernel.translate(\n splitResult.back,\n normal.x * backOffset,\n normal.y * backOffset,\n normal.z * backOffset,\n )\n kernel.release(splitResult.back)\n\n // 7. Fuse 三段\n let result: BrepHandle\n try {\n const fused1 = kernel.fuse(frontTranslated, extrudedSolid)\n kernel.release(frontTranslated)\n kernel.release(extrudedSolid)\n result = kernel.fuse(fused1, backTranslated)\n kernel.release(fused1)\n kernel.release(backTranslated)\n } catch (err) {\n kernel.release(frontTranslated)\n kernel.release(extrudedSolid)\n kernel.release(backTranslated)\n throw new Error(`[extrudeBrep] fuse failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err })\n }\n\n return result\n}\n\n// ─── STEP/BREP 导入操作 ───\n\n/**\n * 单零件导入的 STEP 颜色挂载(P2,方案 §5 STEP 行)。\n *\n * `getSolidColorsOrdered`(stepColorParser)把 STYLED_ITEM → COLOUR_RGB 引用链\n * 解析为按 MANIFOLD_SOLID_BREP 文件序的颜色数组;该序与 OCCT\n * `getSubShapes(compound,'solid')` 一致(stepColorParser 注释),因此取 `[0]`\n * 即「loadBrep 单零件收敛取第一个 solid」的颜色,语义对齐。\n *\n * 宽容兼容外部数据:BREP(CASCADE Topology 文本)无颜色概念直接跳过;STEP\n * 文本无 `STYLED_ITEM` 早退(零额外开销);引用链缺失/未知预定义色返回 null,\n * 一律不挂外观、不抛错(AGENTS.md 全局铁律:不得以内部严格性拒收正常文件)。\n */\nfunction applyFirstStepColor(shape: Shape, buffer: ArrayBuffer): Shape {\n const head = new TextDecoder('utf-8').decode(buffer.slice(0, 64))\n if (head.includes('CASCADE Topology')) return shape\n const text = new TextDecoder('utf-8').decode(buffer)\n if (!text.includes('STYLED_ITEM')) return shape\n const c0 = getSolidColorsOrdered(text)[0]\n if (c0) shape.appearance = { color: [c0[0], c0[1], c0[2]] }\n return shape\n}\n\n/**\n * BREP-native STEP 导入:使用 OCCT kernel.importStep 导入 STEP 文件为精确实体。\n *\n * 与 mesh 路径(cad-core/io.ts importFile → loadFormat → meshes)对照:\n * - mesh 路径:STEP → 三角网格,丢弃 OCCT BrepHandle\n * - BREP 路径:STEP → kernel.importStep → 保留 BrepHandle,同时三角化为显示 mesh\n *\n * 导入的 solid 存入 brepChain.solidCache,后续操作(drillBrep/splitBrep 等)\n * 将其作为\"基座特征\"进行精确运算。\n *\n * **设计决策(I5 不准合并;fileid-container-and-nesting §5.4 单零件收敛)**:\n * - 单 solid STEP:`importStep` 返回 Compound 包裹(顶层是 `TopoDS_Compound`,\n * 内含 1 个 `TopoDS_Solid`)。此处**解包**返回真实 Solid(`solids[0]`),\n * 下游 `isValid`/编辑/导出都针对真实实体。\n * - 多 solid STEP:**只支持单零件**(§5.4)——降级取**第一个** solid 返回(单一\n * 非复合 Shape),并回传 `multiSolidCount`(≥2 表示本文件被降级取件,由 load op\n * 登记\"多零件降级\" pending,宿主据此弹警告 §5.4:166)。取件点唯一,逐 part 拆\n * 分只发生在 load op 内部,宿主不再发多条 load。\n * - **不调用 `kernel.isValid`**:`importStep` 对单 solid STEP 也返回 Compound 包裹,\n * `isValid(compound)` 返回 false(Compound 不是 Solid),这会误杀合法 STEP。\n * 合法性判据改为 `getSubShapes(top, 'solid').length >= 1`(含 ≥1 个 solid 即合法),\n * 与装配路径 `walkLabel` 一致。\n *\n * @param kernel the initialized OCCT kernel.\n * @param buffer the raw STEP file bytes (a text-encoded ArrayBuffer).\n * @param brepChain optional - caches the tessellated BrepMeshResult when provided.\n * @param stmtId optional - the part this solid belongs to, paired with brepChain as the cache key.\n * @param opts optional - `allowNonSolid` relaxes the solid requirement so\n * a frozen wireframe/surface asset (a Draft wire, a face, a\n * shell) can be imported as addressable geometry. Callers\n * must decide this STATICALLY from the asset itself (see\n * `brepTextHasSolid`), never by retrying after a failure.\n * @returns { solid: the OCCT solid handle, shape: the display tessellated mesh,\n * multiSolidCount: total solids declared when > 1 (single-part take-first) }\n */\nexport function loadBrep(\n kernel: BrepEngineApi,\n buffer: ArrayBuffer,\n brepChain?: BrepChainState,\n stmtId?: PartName,\n opts?: { allowNonSolid?: boolean },\n): { solid: BrepHandle; shape: Shape; multiSolidCount?: number } {\n // BREP 文件(CASCADE Topology 文本格式)必须用 kernel.fromBREP 解析;\n // 误用 STEP 解析器(importStep)读 BREP 会抛 \"failed to read STEP data\"。\n const decoder = new TextDecoder('utf-8')\n const head = decoder.decode(buffer.slice(0, 64))\n const top = head.includes('CASCADE Topology')\n ? kernel.fromBREP(decoder.decode(buffer))\n : kernel.importStep(buffer)\n\n // 校验:含至少一个 solid 子形即合法(不调用 isValid,见上文设计决策)\n const solids = kernel.getSubShapes(top, 'solid')\n if (solids.length < 1) {\n // 非实体导入(allowNonSolid):冻结资产是 wireframe/surface(Draft 线/面/壳)\n // 时仍可作为可寻址几何导入——顶点/边/线/面/壳都算有内容。此时返回 top 本身,\n // 它独立持有几何,不能释放。\n // 注意:这类 Shape 进不了布尔运算(OCCT fuse/cut 抛 \"boolean operation\n // failed\"),调用方必须自己保证它只流向变换/聚合。\n if (opts?.allowNonSolid && hasAnyTopology(kernel, top)) {\n const shape = solidToShape(kernel, top, undefined, brepChain, stmtId)\n return { solid: top, shape: applyFirstStepColor(shape, buffer) }\n }\n kernel.release(top)\n throw new Error(\n `[loadBrep] imported shape contains no solid sub-shapes ` +\n `(solidCount=0) — wireframe/surface/invalid shapes are not supported ` +\n `unless allowNonSolid is set`\n )\n }\n\n // 单 solid:解包返回真实 Solid(非 Compound 包裹)\n if (solids.length === 1) {\n const realSolid = solids[0]\n kernel.release(top) // 释放 Compound 包裹,realSolid 独立持有\n const shape = solidToShape(kernel, realSolid, undefined, brepChain, stmtId)\n return { solid: realSolid, shape: applyFirstStepColor(shape, buffer) }\n }\n\n // 多 solid(§5.4 单零件收敛):只支持单零件 —— 降级取**第一个** solid,\n // 返回单一非复合 Shape,并回传 multiSolidCount(≥2 表示本文件被降级取件,\n // 由 `cad.load` op 登记\"多零件降级\" pending,宿主据零件数弹警告 §5.4:166)。\n // 取件点唯一:多零件拆分只发生在 load op 内部,宿主不再逐 part 拆、不再发\n // 多条 load。`solids` 是 kernel.getSubShapes(top,'solid') 的内核枚举序;对同一\n // import 路径、同一 OCCT 版本,该序是确定性的,故\"第一个\"可复现(红线 7)。\n const first = solids[0]\n if (!first) {\n kernel.release(top)\n throw new Error(`[loadBrep] imported shape has 0 solid sub-shapes`)\n }\n // 释放其余多余子形句柄(first 独立持有几何,剩下的子是 top 的子引用)\n for (const s of solids.slice(1)) {\n try { kernel.release(s) } catch { /* already released */ }\n }\n kernel.release(top) // 释放 Compound 包裹,first 独立持有(同单 solid 模式)\n const shape = solidToShape(kernel, first, undefined, brepChain, stmtId)\n return { solid: first, shape: applyFirstStepColor(shape, buffer), multiSolidCount: solids.length }\n}\n\n/** Sub-shape kinds that make an imported shape \"addressable but not a solid\". */\nconst NON_SOLID_KINDS = ['vertex', 'edge', 'wire', 'face', 'shell'] as const\n\n/**\n * Does a freshly imported shape hold any sub-shape at all?\n *\n * Guards the `allowNonSolid` path: a file whose TShapes table is empty (or that\n * holds only a bare compound with nothing inside) is a broken asset, not a\n * wireframe one, and must still fail loudly.\n *\n * @param kernel - the initialized OCCT kernel.\n * @param top - the imported top-level shape handle.\n * @returns true when at least one non-solid sub-shape exists.\n */\nfunction hasAnyTopology(kernel: BrepEngineApi, top: BrepHandle): boolean {\n return NON_SOLID_KINDS.some((kind) => kernel.getSubShapes(top, kind).length > 0)\n}\n\n// ─── 多零件 STEP 装配导入(P0,方案 2026-10-06-step-3mf-multipart-import-plan.md §5.3)───\n\n/** 多零件 STEP 导入中的一个零件(几何 + solid 句柄 + 身份)。 */\nexport interface LoadBrepAssemblyPart {\n /** 零件序号(0 起,DFS 声明序)。 */\n index: number\n /** 零件名(XCAF label;无则回退 `imported:<index>`)。 */\n name: string\n /** 显示色 sRGB 0..1,无则 null。 */\n color: [number, number, number] | null\n /** 三角化显示 mesh。 */\n shape: Shape\n /** OCCT solid 句柄(已烘 location;生命周期归 brepChain,调用方经 fromBrep 绑定)。 */\n solid: BrepHandle\n}\n\n/**\n * BREP-native 多零件 STEP 导入(XCAF 装配树 → 逐零件 Shape + 装配层级)。\n *\n * 与 `loadBrep`(单零件收敛,§5.4 旧行为)对照:loadBrepAssembly 走\n * `importAssemblyFromStep`(XCAF),返回**全部**叶零件(DFS 声明序)与装配树。\n *\n * - 装配树叶子 = 零件;合成节点(syntheticGroup:单一产品含多 MANIFOLD_SOLID_BREP)\n * 如实表达为中间节点;\n * - 无装配结构的单叶文件 → 1 个零件、无 assembly(行为与现状单零件一致);\n * - 句柄互通(T0):`importAssemblyFromStep` 内部用 initOcctWasm() 全局单例内核,\n * 与注入的 `BrepEngineApi`(createOcctPrimitives 包装同一单例)句柄数值互通——\n * 探针见 test/brep/load-brep-assembly.test.ts;\n * - 释放:装配节点句柄已由 walkLabel 释放,叶句柄随返回 parts 交给调用方\n * (fromBrep 绑定后归 brepChain 管理,不在此释放)。\n *\n * @param kernel - the initialized OCCT kernel (L1 contract face).\n * @param buffer - the raw STEP file bytes (text-encoded ArrayBuffer; stpz\n * unzipping is the caller's job — faijs never unzips implicitly).\n * @returns 全部零件 + 装配层级(多叶时)+ 叶数(>1 时)。\n */\nexport async function loadBrepAssembly(\n kernel: BrepEngineApi,\n buffer: ArrayBuffer,\n): Promise<{ parts: LoadBrepAssemblyPart[]; assembly?: ImportAssemblyNode; multiSolidCount?: number }> {\n const nodes = await importAssemblyFromStep(buffer)\n const leaves = collectLeafParts(nodes)\n\n // DFS 声明序:leaf 序 = parts 序 = ImportModel.parts.index。\n // 实体校验(与 load op「要求导入物含实体」契约一致):leaf 必须持有实体\n // (自身是 solid,或 label 内含 solid);空 label / wireframe 零件跳过,\n // 全部跳过则报错(不静默回退)。parts 下标保持连续(0..N-1)。\n const leafIndex = new Map<AssemblyPartNode, number>()\n const parts: LoadBrepAssemblyPart[] = []\n for (const leaf of leaves) {\n if (!leaf.shapeHandle || !leafHasSolid(kernel, leaf.shapeHandle)) continue\n const idx = parts.length\n leafIndex.set(leaf, idx)\n const h = leaf.shapeHandle as unknown as BrepHandle\n parts.push({\n index: idx,\n name: leaf.name || `imported:${idx}`,\n color: leaf.color,\n shape: solidToShape(kernel, h),\n solid: h,\n })\n }\n\n // 无叶零件(空/异常/纯 wireframe 文件)→ 报错暴露(不静默回退)。\n if (parts.length === 0) {\n throw new Error('[loadBrepAssembly] imported STEP contains no solid leaf parts')\n }\n\n const assembly = toImportAssemblyNode(nodes, leafIndex)\n return {\n parts,\n ...(assembly ? { assembly } : {}),\n ...(parts.length > 1 ? { multiSolidCount: parts.length } : {}),\n }\n}\n\n/**\n * BREP-native 多零件 STEP 导入 —— **无 XCAF 的引擎**的装配读取通道。\n *\n * 与 `loadBrepAssembly`(XCAF 装配树,occt-only)对照:本函数只用 L1 契约面\n * (`kernel.importStep` / `kernel.fromBREP` / `kernel.getSubShapes`),因此对任何\n * 实现了这两个方法的引擎成立(brepkit 即此路径)。代价是拿不到 XCAF 的零件名 /\n * 颜色 / 装配层级——零件身份退回 `imported:<index>`,`assembly` 不产出。这是\n * **引擎能力事实**,不是静默降级(调用方按引擎 id 静态分派,见下)。\n *\n * 分派规则(静态,无运行时回退):XCAF(`STEPCAFControl_Reader`)是 occt 内核的\n * 装配读取器,brepkit 没有;调用方按当前引擎 id 选择本函数还是 XCAF 版本\n * (`cad.load` 见 `packages/faijs-extra/src/ops/load.ts`),不靠 try-catch 探测。\n *\n * 句柄归属:返回的每个 `part.solid` 即内核枚举出的实体本身(生命周期交给调用方,\n * `fromBrep` 绑定后归 brepChain)。顶层包装句柄在本函数内释放——但**若顶层句柄\n * 就是枚举出的那个实体**(brepkit 的 `getSubShapes(solid,'solid')` 对单实体返回\n * 自身,见 brepkitKernel 的 `catch { list = [s] }`)则不释放,否则返回件被释放。\n *\n * @param kernel - the initialized BREP kernel (L1 contract face).\n * @param buffer - the raw STEP (or CASCADE BREP text) file bytes.\n * @returns 全部实体零件(内核枚举序,index 连续)+ 实体数(>1 时)。\n */\nexport function loadBrepAssemblyNative(\n kernel: BrepEngineApi,\n buffer: ArrayBuffer,\n): { parts: LoadBrepAssemblyPart[]; multiSolidCount?: number } {\n // 与 loadBrep 同一格式判别:CASCADE Topology 文本走 fromBREP,其余(STEP/STP)走 importStep。\n const decoder = new TextDecoder('utf-8')\n const head = decoder.decode(buffer.slice(0, 64))\n const top = head.includes('CASCADE Topology')\n ? kernel.fromBREP(decoder.decode(buffer))\n : kernel.importStep(buffer)\n\n const solids = kernel.getSubShapes(top, 'solid')\n if (solids.length === 0) {\n kernel.release(top)\n throw new Error('[loadBrepAssemblyNative] imported file contains no solid sub-shapes')\n }\n if (!solids.some((s) => s === top)) kernel.release(top)\n\n const parts: LoadBrepAssemblyPart[] = solids.map((solid, index) => ({\n index,\n name: `imported:${index}`,\n color: null,\n shape: solidToShape(kernel, solid),\n solid,\n }))\n return { parts, ...(parts.length > 1 ? { multiSolidCount: parts.length } : {}) }\n}\n\n/**\n * leaf 是否持有实体(loadBrepAssembly 实体校验):自身是 solid(syntheticGroup\n * 拆出的单个 solid 句柄),或 label compound 内含 solid。getSubShapes 的引用\n * 句柄须立即 release(walkLabel 只释放了它自己取的副本)。\n */\nfunction leafHasSolid(kernel: BrepEngineApi, h: ShapeHandle): boolean {\n const bh = h as unknown as BrepHandle\n if (kernel.isSolid(bh)) return true\n const solids = kernel.getSubShapes(bh, 'solid')\n const n = solids.length\n for (const s of solids) kernel.release(s)\n return n > 0\n}\n\n/**\n * XCAF 装配树 → ImportAssemblyNode(DFS 序与 parts 一致)。\n *\n * - 单根且根为叶(无装配结构)→ undefined(单零件路径,与现状一致);\n * - 单根装配 → 该根;\n * - 多根 → 合成虚拟根 `{ name: 'imported' }`(确定性结构名,非零件身份)。\n */\nfunction toImportAssemblyNode(\n nodes: AssemblyPartNode[],\n leafIndex: Map<AssemblyPartNode, number>,\n): ImportAssemblyNode | undefined {\n if (nodes.length === 0) return undefined\n const convert = (node: AssemblyPartNode): ImportAssemblyNode => {\n if (node.children.length === 0) {\n const idx = leafIndex.get(node)\n return { name: node.name, ...(idx !== undefined ? { partIndex: idx } : {}) }\n }\n return { name: node.name, children: node.children.map(convert) }\n }\n if (nodes.length === 1) {\n const root = convert(nodes[0])\n // 单根且根为叶(无装配结构)→ 不表达装配层级\n if (root.partIndex !== undefined) return undefined\n return root\n }\n return { name: 'imported', children: nodes.map(convert) }\n}\n\n// ─── 辅助函数 ───\n\n/**\n * Convert a Mat4 into the 3x4 row-major array (12 doubles) the OCCT\n * transform expects.\n *\n * OCCT transform accepts [r00,r01,r02,tx, r10,r11,r12,ty, r20,r21,r22,tz].\n * @param matrix - the source matrix to convert.\n * @returns the 3x4 row-major array of 12 doubles.\n */\nexport function matrixToArray(matrix: Mat4): number[] {\n const e = matrix.elements\n // Mat4 是 column-major,OCCT 需要 row-major 3x4\n return [\n e[0], e[4], e[8], e[12],\n e[1], e[5], e[9], e[13],\n e[2], e[6], e[10], e[14],\n ]\n}\n"]}
1
+ {"version":3,"file":"brep-ops.js","sourceRoot":"","sources":["../../src/brep/brep-ops.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 核心 BREP 操作 — 使用 OCCT 精确实体运算\n *\n * @platform occt — 本文件 import occt-kernel:`extrudeBrep` 用原生 `section`\n * (BRepAlgoAPI_Section,occt-only,L1 只有 sectionByPlane)构造截面 → 守卫①\n * 要求平台 import 自证身份。本文件是内部工具面(非 op 文件),文件级标注即满足\n * 守卫;调用方 op 若经本文件触达 occt-only 能力,须在 defineOp 声明 engines\n * (extrudeBrep 的 section 仅 occt 路径可达,brepkit 下由调用方引擎声明拦截)。\n *\n * See docs/api-contract.md §8 (dual-path geometry contract: BREP / Mesh).\n *\n * 与 mesh 路径(transform.ts / boolean/ / drill.ts / split.ts / extrude.ts)对照:\n * - mesh 路径:消费 Shape(三角网格),走 manifold-3d(mesh-CSG)\n * - BREP 路径:消费 BrepHandle(OCCT 实体句柄),走 OCCT 精确布尔/变换\n *\n * 所有函数都是纯函数(可 import occtWasmKernel,不读 store)。\n * 输入输出均为 OCCT BrepHandle,调用方负责句柄生命周期。\n *\n * 坐标系:Z-up、毫米,与 mesh 路径一致。\n */\n\nimport { Vec3 as Vec3C, Mat4, Euler, Quat } from '../math3d'\nimport type { BrepHandle, BrepMeshResult } from './engine/types'\nimport type { BrepEngineApi } from './engine/primitives'\nimport {\n getOcctKernel,\n importAssemblyFromStep,\n collectLeafParts,\n type ShapeHandle,\n type AssemblyPartNode,\n} from '../occt-kernel/occtKernel'\nimport { getSolidColorsOrdered } from '../occt-kernel/stepColorParser'\nimport type { Shape, Vec3 } from '../mesh/types'\nimport type { ImportAssemblyNode } from '../mesh/import-model'\nimport type { BrepChainState } from './brep-chain'\nimport type { PartName } from '../identity'\nimport { getSolidBoundingBox } from './brep-utils'\nimport { getTessellation, type TessellationDensity } from '../runtime-state'\n\n// ─── 通用工具 ───\n\n/**\n * 将 OCCT solid 三角化为 Shape(供显示用)。\n *\n * 如果传入 brepChain + stmtId,同时把完整 BrepMeshResult(含 faceGroups)缓存到\n * brepChain.meshShapeCache,供 buildBrepTopology 复用——确保拓扑 mesh 与显示 mesh\n * 完全一致(规则 1:拓扑数据生成所使用的 mesh,必须是当前用户看到的 mesh)。\n *\n * @param kernel the initialized OCCT kernel.\n * @param solid the CAD solid handle.\n * @param segments optional tessellation segment count (affects precision).\n * @param brepChain optional - caches the BrepMeshResult when provided.\n * @param partName optional - the part this solid belongs to, paired with brepChain as the cache key.\n * @param defaultDeflection optional - per-call deflection fallback when `segments` is absent\n * (wins over the global tessellation knob; explicit `segments` still wins over both).\n * @returns the tessellated Shape.\n */\nexport function solidToShape(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n segments?: number,\n brepChain?: BrepChainState,\n partName?: PartName,\n defaultDeflection?: TessellationDensity,\n): Shape {\n // Deflection precedence: explicit segments > per-call defaultDeflection > global\n // tessellation (host-tunable via createRuntime, proposal 2026-10-07).\n const fallback = defaultDeflection ?? getTessellation()\n const angularDeflection = segments\n ? (2 * Math.PI) / Math.max(3, segments)\n : fallback.angularDeflection\n const mesh: BrepMeshResult = kernel.meshShape(solid, {\n linearDeflection: fallback.linearDeflection,\n angularDeflection,\n })\n\n // 规则 1:缓存完整 BrepMeshResult(含 faceGroups),供 buildBrepTopology 复用\n if (brepChain?.meshShapeCache && partName) {\n brepChain.meshShapeCache.set(partName, mesh)\n }\n\n return {\n positions: new Float32Array(mesh.positions),\n indices: new Uint32Array(mesh.indices),\n }\n}\n\n// ─── 变换操作 ───\n\n/**\n * BREP 平移:使用 OCCT translate(精确,不损失几何精度)。\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param offset 平移量 [dx, dy, dz]\n * @returns 新实体(调用方负责释放输入实体)\n */\nexport function translateBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n offset: Vec3,\n): BrepHandle {\n return kernel.translate(solid, offset[0], offset[1], offset[2])\n}\n\n/**\n * BREP 旋转:使用 OCCT transform(3x4 仿射矩阵)。\n *\n * 与 mesh 路径 rotate_euler(shape, angles, pivot?) 一致:\n * - angles 为 XYZ 欧拉角(角度制)\n * - pivot 为旋转中心(可选,默认原点)\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param angles XYZ 欧拉角(角度制)\n * @param pivot 旋转中心(可选)\n * @returns 新实体\n */\nexport function rotateBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n angles: Vec3,\n pivot?: Vec3,\n): BrepHandle {\n const euler = new Euler(\n (angles[0] * Math.PI) / 180,\n (angles[1] * Math.PI) / 180,\n (angles[2] * Math.PI) / 180,\n )\n const matrix = new Mat4().makeRotationFromEuler(euler)\n if (pivot) {\n matrix.premultiply(new Mat4().makeTranslation(pivot[0], pivot[1], pivot[2]))\n matrix.multiply(new Mat4().makeTranslation(-pivot[0], -pivot[1], -pivot[2]))\n }\n return kernel.transform(solid, matrixToArray(matrix))\n}\n\n/**\n * 判定 3×4 行主序仿射矩阵的线性部分是否为**相似变换**(旋转/反射 × 等比缩放)——\n * 即 `gp_Trsf` 能精确承载、`kernel.transform`(BRepBuilderAPI_Transform)唯一\n * 正确处理的那一类。\n *\n * 判据必须用**相对**容差,不能像 2026-10-07 之前那样用绝对容差:\n * GOTCHA(2026-10-07,openscad example023 parity)——一个 60° 刚体旋转只要按\n * 7 位小数打印(`0.8660254`),行范数就是 `0.99999999645`(与 1 相差 3.6e-9)。\n * 绝对容差 1e-9 会判定 `|‖row2‖ − ‖row0‖| = 3.6e-9 > 1e-9` ⇒ 把这个**纯旋转**\n * 判成\"非相似\",从而错误地走进 `generalTransform`;而 occt 侧 `gp_GTrsf` 路径在\n * **已三角化**的形状上会重复计入被平移面的 TopLoc(顶盖 z 由 5 变 10,绕过在\n * `occt-kernel/occt-primitives.ts` 的 `generalTransform` 适配层,本层不感知)。\n * 相对容差 1e-6 覆盖 7 位小数打印精度,同时仍能区分真正的非等比缩放\n * (如 z×2.5 行范数相差 2.5 倍)。正交性同用 1e-6:7 位小数打印的旋转,行点积\n * 误差上界约 2e-7。\n *\n * @param m12 - 3×4 行主序矩阵(12 元素:`[r00,r01,r02,tx, r10,r11,r12,ty, r20,r21,r22,tz]`)。\n * @returns `true` 当且仅当线性部分可逆且为相似变换。\n */\nexport function isSimilarityAffine(m12: readonly number[]): boolean {\n const s0 = Math.hypot(m12[0]!, m12[1]!, m12[2]!)\n const s1 = Math.hypot(m12[4]!, m12[5]!, m12[6]!)\n const s2 = Math.hypot(m12[8]!, m12[9]!, m12[10]!)\n if (!(s0 > 1e-12) || !(s1 > 1e-12) || !(s2 > 1e-12)) return false\n const REL = 1e-6\n if (Math.abs(s1 - s0) > REL * s0 || Math.abs(s2 - s0) > REL * s0) return false\n const dot = (r: number, c: number): number =>\n m12[r * 4]! * m12[c * 4]! + m12[r * 4 + 1]! * m12[c * 4 + 1]! + m12[r * 4 + 2]! * m12[c * 4 + 2]!\n return (\n Math.abs(dot(0, 1)) <= REL * s0 * s1 &&\n Math.abs(dot(0, 2)) <= REL * s0 * s2 &&\n Math.abs(dot(1, 2)) <= REL * s1 * s2\n )\n}\n\n/**\n * 施加 3×4 行主序仿射矩阵,按矩阵类别选**唯一正确**的 OCCT 路径。\n *\n * 两条路径的差异是**正确性**而不只是性能:\n * - 相似(旋转/反射 × 等比缩放)→ `kernel.transform`(BRepBuilderAPI_Transform)。\n * - 其余(非等比缩放、错切)→ `kernel.generalTransform`(gp_GTrsf)。\n *\n * GOTCHA(2026-10-07):occt 的 `generalTransform` 在**已经三角化过**的形状上会\n * 重复计入被平移面的 TopLoc(精确 z∈[0,5],网格顶盖却落在 z=10;非等比 z×2.5 时\n * 12.5 vs 17.5)。该缺陷是 **occt 专属**(brepkit 的 GTrsf 路径干净),因此绕过\n * **不在本层**——本层是引擎中立分派,让每个引擎都为 occt 的毛病多付一次句柄分配\n * 是错的(还会扰动 brepkit 的 `cut` bbox,见 multi-engine-op-parity)。\n * 绕过落在 occt 适配层:`occt-kernel/occt-primitives.ts` 的 `generalTransform`\n * 先 `copy` 再变换。`kernel.transform` 无此问题,故相似矩阵不付这份深拷贝成本。\n *\n * 反向陷阱:把非相似矩阵交给 `kernel.transform` 是**静默错误**——OCCT 会按\n * `det^(1/3)` 取等比因子近似(实测 z×2.5 被当成 1.357 倍等比缩放)。所以分类\n * 判据既不能过严(把刚体旋转推给 GTrsf),也不能过宽(把非等比缩放塞给 Trsf)。\n *\n * @param kernel - L1 引擎句柄。\n * @param solid - 输入实体(不被消费、不被释放;调用方保留其所有权)。\n * @param m12 - 3×4 行主序矩阵(12 元素)。\n * @returns 变换后的新实体(调用方负责释放)。\n */\nexport function applyAffineBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n m12: readonly number[],\n): BrepHandle {\n if (isSimilarityAffine(m12)) return kernel.transform(solid, m12 as number[])\n return kernel.generalTransform(solid, m12 as number[])\n}\n\n/**\n * BREP 缩放:使用 OCCT transform(3x4 仿射矩阵)。\n *\n * 与 mesh 路径 scale(P6 §4.6)一致:\n * - factor 为 number(均匀缩放)或 Vec3 [sx, sy, sz](非均匀)\n * - center 为缩放不动点(p' = center + S·(p − center));缺省 [0,0,0](原点),\n * 与早期 brepjs `scale(shape, factor, { center? })` 的默认一致。\n *\n * 路径分派交给 {@link applyAffineBrep}:等比走 `transform`,非等比走\n * `generalTransform`(gp_Trsf 表达不了非等比)。注意判据是**数值**相似性而非\n * 因子逐分量相等——`[1, 1, 1+1e-9]` 这种数值上就是等比,归 `transform` 一侧。\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param factor 缩放因子\n * @param center 缩放不动点(可选,默认原点)\n * @returns 新实体\n */\nexport function scaleBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n factor: number | Vec3,\n center?: Vec3,\n): BrepHandle {\n const f = typeof factor === 'number' ? [factor, factor, factor] : factor\n const scale = new Mat4().makeScale(f[0], f[1], f[2])\n // T(c)·S·T(−c):不动点为 center;缺省时退化为原点缩放(现状行为)。\n const matrix = center\n ? new Mat4()\n .makeTranslation(center[0], center[1], center[2])\n .multiply(scale)\n .multiply(new Mat4().makeTranslation(-center[0], -center[1], -center[2]))\n : scale\n return applyAffineBrep(kernel, solid, matrixToArray(matrix))\n}\n\n// ─── 装配变换 ───\n\n/**\n * BREP 版 applyTransform:与 mesh ops/assemble.ts 的 applyTransform 同语义(绕 pivot 旋转 + 平移)。\n *\n * 数学公式:p' = R·(p − pivot) + pivot + translation\n * 等价 Matrix4 = T(pivot) · R · T(−pivot) · T(translation)\n *\n * 用四元数而非欧拉角,是因为装配变换源是 api/assembly 的四元数;\n * 转欧拉会引入顺序/万向锁歧义。与 mesh applyTransform 顶点公式完全等价。\n *\n * @param kernel OCCT 内核\n * @param solid 输入实体\n * @param quaternion 旋转四元数 [x, y, z, w]\n * @param pivot 旋转中心\n * @param translation 平移量\n * @returns 新实体(调用方负责释放输入实体)\n */\nexport function applyTransformBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n quaternion: [number, number, number, number],\n pivot: [number, number, number],\n translation: [number, number, number],\n): BrepHandle {\n const rotation = new Mat4().makeRotationFromQuaternion(\n new Quat(quaternion[0], quaternion[1], quaternion[2], quaternion[3]),\n )\n // T(translation) · T(pivot) · R · T(-pivot) = T(pivot+translation) · R · T(-pivot)\n // 先绕 pivot 旋转,再平移 translation(与 mesh 路径 applyTransform 一致)\n const matrix = new Mat4()\n .makeTranslation(pivot[0] + translation[0], pivot[1] + translation[1], pivot[2] + translation[2])\n .multiply(rotation)\n .multiply(new Mat4().makeTranslation(-pivot[0], -pivot[1], -pivot[2]))\n return kernel.transform(solid, matrixToArray(matrix))\n}\n\n// ─── 布尔操作 ───\n\n/**\n * BREP 布尔并集:使用 OCCT fuse(BRepAlgoAPI_Fuse)。\n *\n * @param kernel OCCT 内核\n * @param a 实体 A\n * @param b 实体 B\n * @returns 融合后的实体\n */\nexport function fuseBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): BrepHandle {\n return kernel.fuse(a, b)\n}\n\n/**\n * BREP 布尔差集:使用 OCCT cut(BRepAlgoAPI_Cut)。\n *\n * @param kernel OCCT 内核\n * @param a 基体\n * @param b 工具(从基体中减去)\n * @returns 切割后的实体\n */\nexport function cutBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): BrepHandle {\n return kernel.cut(a, b)\n}\n\n/**\n * BREP 布尔交集:使用 OCCT common(BRepAlgoAPI_Common)。\n *\n * @param kernel OCCT 内核\n * @param a 实体 A\n * @param b 实体 B\n * @returns 交集实体\n */\nexport function commonBrep(\n kernel: BrepEngineApi,\n a: BrepHandle,\n b: BrepHandle,\n): BrepHandle {\n return kernel.common(a, b)\n}\n\n// ─── 钻孔操作 ───\n\n/** drillBrep 的参数 */\nexport interface DrillBrepParams {\n /** 孔直径 */\n diameter: number\n /** 孔深度(0 = 通孔) */\n depth: number\n /** 孔位置(世界空间) */\n position: Vec3\n /** 钻孔方向(世界空间,指向材料内部) */\n direction: Vec3\n /** 面法向(世界空间) */\n faceNormal: Vec3\n /** 孔类型 */\n holeType?: 'simple' | 'screw'\n}\n\n/**\n * BREP 钻孔:创建圆柱工具实体并用 OCCT cut 减去。\n *\n * 仅支持圆柱孔(holeType='simple')。\n * 螺丝孔(holeType='screw')由调用方判断为 mesh-only,触发 BREP 链断裂。\n *\n * 通孔(depth=0):创建一个足够长的圆柱体穿透整个零件。\n * 盲孔(depth>0):创建指定深度的圆柱体。\n *\n * @param kernel OCCT 内核\n * @param solid 目标实体\n * @param params 钻孔参数\n * @returns 钻孔后的实体\n */\n/** 钻孔几何参数(由 `DrillBrepParams` 推导;roleTable 路径与 `drillBrep` 共用同一份几何,避免重复计算)。 */\nexport interface DrillGeometry {\n readonly radius: number\n readonly holeHeight: number\n readonly holeCenter: Vec3C\n readonly direction: Vec3C\n}\n\n/** 从 `DrillBrepParams` 推导钻孔几何(孔中心/高度/轴向)。供 `drillBrep` 与 role-table 路径共用。\n * @param kernel - BREP 引擎接口\n * @param solid - 待钻孔实体(用于 bbox 推导通孔高度)\n * @param params - 钻孔参数(直径/深度/位置/方向/面法向)\n * @returns 钻孔几何(半径/高度/中心/轴向)\n */\nexport function computeDrillGeometry(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: DrillBrepParams,\n): DrillGeometry {\n const radius = params.diameter / 2\n const direction = new Vec3C(...params.direction).normalize()\n // 确保方向指向材料内部\n const faceNormal = new Vec3C(...params.faceNormal)\n if (direction.dot(faceNormal) > 0) {\n direction.negate()\n }\n\n // 计算孔的高度和中心\n const bbox = getSolidBoundingBox(kernel, solid)\n const bboxSize = new Vec3C(\n bbox.max[0] - bbox.min[0],\n bbox.max[1] - bbox.min[1],\n bbox.max[2] - bbox.min[2],\n )\n const bboxMax = Math.max(bboxSize.x, bboxSize.y, bboxSize.z)\n\n let holeHeight: number\n let holeCenter: Vec3C\n const pos = new Vec3C(...params.position)\n\n // 通孔:depth <= 0(契约:depth<=0 表示通孔,与 mesh 路径 `depth>0 ? 'blind':'through'` 一致)。\n // ⚠️ 只判 `=== 0` 会让 depth<0 落入盲孔分支 → safeDepth=0 → 零高圆柱 → OCCT transform 崩溃。\n if (params.depth <= 0) {\n const d = direction.clone().normalize()\n const bbMin = new Vec3C(bbox.min[0], bbox.min[1], bbox.min[2])\n const bbMax = new Vec3C(bbox.max[0], bbox.max[1], bbox.max[2])\n\n let tNear = -Infinity\n let tFar = Infinity\n const axes: Array<[number, number, number, number]> = [\n [0, d.x, bbMin.x, bbMax.x],\n [1, d.y, bbMin.y, bbMax.y],\n [2, d.z, bbMin.z, bbMax.z],\n ]\n const pArr = [pos.x, pos.y, pos.z]\n for (const [axis, di, lo, hi] of axes) {\n const pi = pArr[axis]\n if (Math.abs(di) > 1e-12) {\n const t1 = (lo - pi) / di\n const t2 = (hi - pi) / di\n tNear = Math.max(tNear, Math.min(t1, t2))\n tFar = Math.min(tFar, Math.max(t1, t2))\n } else if (pi < lo || pi > hi) {\n // 与 slab 平行且在外部 — 无交点(与 mesh 行为一致:几乎不钻孔)\n tNear = 0\n tFar = 0\n }\n }\n if (!isFinite(tNear) || !isFinite(tFar) || tFar < tNear) {\n // 不穿过 bbox:与 mesh 一致,只留 0.2mm 微小孔\n holeHeight = 0.2\n holeCenter = pos.clone()\n } else {\n holeHeight = tFar - tNear + 0.2\n holeCenter = pos.clone().add(direction.clone().normalize().multiplyScalar((tNear + tFar) / 2))\n }\n } else {\n // 盲孔:深度钳制到 bboxMax(与 mesh cad-core/drill.ts 一致)\n const safeDepth = Math.max(0, Math.min(params.depth, bboxMax))\n holeHeight = safeDepth\n holeCenter = pos.clone().add(direction.clone().normalize().multiplyScalar(safeDepth / 2))\n }\n\n return { radius, holeHeight, holeCenter, direction }\n}\n\n/** 由钻孔几何构造刀具实体(圆柱,旋转 + 平移到孔位)。调用方负责 release。\n * @param kernel - BREP 引擎接口\n * @param geom - 钻孔几何(半径/高度/中心/轴向)\n * @returns 刀具实体(BrepHandle,调用方负责 release)\n */\nexport function buildDrillToolSolid(kernel: BrepEngineApi, geom: DrillGeometry): BrepHandle {\n const cylinder = kernel.makeCylinder(geom.radius, geom.holeHeight)\n\n // 计算从 Z 轴到 direction 的旋转\n const zAxis = new Vec3C(0, 0, 1)\n const quat = new Quat().setFromUnitVectors(zAxis, geom.direction)\n const rotMatrix = new Mat4().makeRotationFromQuaternion(quat)\n\n // 平移矩阵:到孔中心,并减去 height/2(因为圆柱从 Z=0 开始)\n const transMatrix = new Mat4().makeTranslation(\n geom.holeCenter.x,\n geom.holeCenter.y,\n geom.holeCenter.z,\n )\n // 组合:先旋转,再平移\n const finalMatrix = new Mat4().multiplyMatrices(transMatrix, rotMatrix)\n // 还需要补偿圆柱的起始位置(从 Z=0 开始 → 需要先下移 height/2)\n const offsetMatrix = new Mat4().makeTranslation(0, 0, -geom.holeHeight / 2)\n const fullMatrix = new Mat4().multiplyMatrices(finalMatrix, offsetMatrix)\n\n const toolSolid = kernel.transform(cylinder, matrixToArray(fullMatrix))\n kernel.release(cylinder)\n return toolSolid\n}\n\n/** 在实体上钻一个孔:由参数推导几何、构造刀具实体并做布尔差。\n * @param kernel - BREP 引擎接口\n * @param solid - 待钻孔实体\n * @param params - 钻孔参数(直径/深度/位置/方向/面法向)\n * @returns 钻孔后的实体(BrepHandle)\n */\nexport function drillBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: DrillBrepParams,\n): BrepHandle {\n const geom = computeDrillGeometry(kernel, solid, params)\n const toolSolid = buildDrillToolSolid(kernel, geom)\n try {\n const result = kernel.cut(solid, toolSolid)\n kernel.release(toolSolid)\n return result\n } catch (err) {\n kernel.release(toolSolid)\n throw new Error(`[drillBrep] OCCT cut failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err })\n }\n}\n\n// ─── 分割操作 ───\n\n/** splitBrep 的参数 */\nexport interface SplitBrepParams {\n /** 切割平面法线 */\n normal: Vec3\n /**\n * 切割平面位置:世界系平面方程 d 值(n·x = planeDistance)。\n * 与 planeCenter 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeDistance?: number\n /**\n * 切割平面位置:世界坐标点(平面中心)。\n * 与 planeDistance 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeCenter?: Vec3\n}\n\n/** splitBrep 的结果 */\nexport interface SplitBrepResult {\n /** 法线正方向的半部分 */\n front: BrepHandle\n /** 法线负方向的半部分 */\n back: BrepHandle\n}\n\n/**\n * BREP 平面分割:使用 OCCT cut + common 实现平面分割。\n *\n * 仅支持平面分割(cutMode='plane')。\n * 燕尾/定位销/直榫等复杂分割由 joinery-brep.ts 处理。\n *\n * 实现方式:\n * 1. 创建一个大的半空间盒子(法线正方向一侧)\n * 2. common(solid, box) → 法线正方向的半部分\n * 3. cut(solid, box) → 法线负方向的半部分\n *\n * @param kernel OCCT 内核\n * @param solid 目标实体\n * @param params 分割参数\n * @returns 两个半部分\n */\nexport function splitBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: SplitBrepParams,\n): SplitBrepResult {\n const bbox = getSolidBoundingBox(kernel, solid)\n const bboxSize = new Vec3C(\n bbox.max[0] - bbox.min[0],\n bbox.max[1] - bbox.min[1],\n bbox.max[2] - bbox.min[2],\n )\n const bboxMax = Math.max(bboxSize.x, bboxSize.y, bboxSize.z)\n\n // 创建一个大的盒子代表法线正方向的半空间\n const normal = new Vec3C(...params.normal).normalize()\n const halfSize = bboxMax * 3 // 足够大\n\n // 先在局部坐标系(Z 轴 = 法线方向)创建盒子\n // 然后旋转到世界坐标系\n const zAxis = new Vec3C(0, 0, 1)\n const quat = new Quat().setFromUnitVectors(zAxis, normal)\n const rotMatrix = new Mat4().makeRotationFromQuaternion(quat)\n\n // 在局部坐标系中,盒子从 Z=0(切割平面)延伸到 Z=halfSize\n const localBox = kernel.makeBoxFromCorners(\n { x: -halfSize, y: -halfSize, z: 0 },\n { x: halfSize, y: halfSize, z: halfSize },\n )\n\n // 计算切割平面的世界坐标原点(planeCenter / planeDistance 二选一必填,\n // 都缺省直接报错,不隐式回退 bbox 中心)\n const planeOrigin = resolvePlaneOrigin(normal, params.planeCenter, params.planeDistance)\n\n const transMatrix = new Mat4().makeTranslation(\n planeOrigin.x,\n planeOrigin.y,\n planeOrigin.z,\n )\n const finalMatrix = new Mat4().multiplyMatrices(transMatrix, rotMatrix)\n\n const halfSpaceBox = kernel.transform(localBox, matrixToArray(finalMatrix))\n kernel.release(localBox)\n\n try {\n // P2(2026-10-06):规避 occt-wasm 在 Chrome worker 下 common 对\"平面退化 BOP\"\n // 挂死(common(solid, 半边盒) 不稳定;cut 稳定——drill 打孔 cut 在 worker 正常)。\n // 差集对偶:back(负侧)= solid - 正盒;front(正侧)= solid - 负盒。\n // 数学等价于 common/cut(盒覆盖 solid 全尺寸,边界同为切割平面),node 探针验证\n // 三角化结果与原实现一致。common 保留在 node/非 worker 环境的回退不可行——\n // 静态行为应一致,故统一走两 cut。\n const back = kernel.cut(solid, halfSpaceBox)\n // 负盒:local 系 z ∈ [-halfSize, 0],同 finalMatrix(平面沿 -normal 方向扩展)\n const localBoxNeg = kernel.makeBoxFromCorners(\n { x: -halfSize, y: -halfSize, z: -halfSize },\n { x: halfSize, y: halfSize, z: 0 },\n )\n const negBox = kernel.transform(localBoxNeg, matrixToArray(finalMatrix))\n kernel.release(localBoxNeg)\n const front = kernel.cut(solid, negBox)\n kernel.release(halfSpaceBox)\n kernel.release(negBox)\n return { front, back }\n } catch (err) {\n kernel.release(halfSpaceBox)\n throw new Error(`[splitBrep] OCCT split failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err })\n }\n}\n\n// ─── 拉伸操作 ───\n\n/** extrudeBrep 的参数 */\nexport interface ExtrudeBrepParams {\n /** 拉伸法线方向 */\n normal: Vec3\n /**\n * 切割平面位置:世界系平面方程 d 值(n·x = planeDistance)。\n * 与 planeCenter 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeDistance?: number\n /**\n * 切割平面位置:世界坐标点(平面中心)。\n * 与 planeDistance 二选一必填;都缺省时抛错,不隐式回退。\n */\n planeCenter?: Vec3\n /** 拉伸长度 */\n length: number\n /** 拉伸模式 */\n mode?: 'centered' | 'forward' | 'backward'\n}\n\n/** 从 planeCenter / planeDistance 收敛出切割平面上的一个点(planeOrigin)。 */\nfunction resolvePlaneOrigin(\n normal: Vec3C,\n planeCenter?: Vec3,\n planeDistance?: number,\n): Vec3C {\n if (planeCenter !== undefined) {\n return new Vec3C(...planeCenter)\n }\n if (planeDistance !== undefined) {\n // 平面方程 n·x = d 上的点:取法线上距原点 d 处(n 为单位向量)\n return normal.clone().multiplyScalar(planeDistance)\n }\n throw new Error(\n '[extrudeBrep] plane location missing: provide planeCenter or planeDistance (implicit bbox-center fallback is forbidden)',\n )\n}\n\n/**\n * BREP 拉伸:在切割平面处将实体切开,中段沿法线拉伸 length,三段 fuse。\n *\n * 实现方式:\n * 1. 用平面分割得到 front + back\n * 2. 获取截面线(section edges → wire → face)\n * 3. 沿法线拉伸截面 face → 中段实体\n * 4. fuse(front, extruded, back)\n *\n * 如果截面无法构建 face(开放线框等),抛出错误由调用方处理为链断裂。\n *\n * @param kernel OCCT 内核\n * @param solid 目标实体\n * @param params 拉伸参数\n * @returns 拉伸后的实体\n */\nexport function extrudeBrep(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n params: ExtrudeBrepParams,\n): BrepHandle {\n const mode = params.mode ?? 'centered'\n const normal = new Vec3C(...params.normal).normalize()\n const length = params.length\n\n // 1. 确定切割平面位置(世界系,来源静态:planeCenter 或 planeDistance,\n // 都缺省直接报错,不隐式回退 bbox 中心)\n const planeOrigin = resolvePlaneOrigin(normal, params.planeCenter, params.planeDistance)\n\n // 2. 分割实体\n const splitResult = splitBrep(kernel, solid, {\n normal: [normal.x, normal.y, normal.z],\n planeCenter: [planeOrigin.x, planeOrigin.y, planeOrigin.z],\n })\n\n // 3. 获取截面\n // 使用 section 获取切割平面与实体的交线\n const bbox = getSolidBoundingBox(kernel, solid)\n const zAxis = new Vec3C(0, 0, 1)\n const quat = new Quat().setFromUnitVectors(zAxis, normal)\n const rotMatrix = new Mat4().makeRotationFromQuaternion(quat)\n const transMatrix = new Mat4().makeTranslation(\n planeOrigin.x,\n planeOrigin.y,\n planeOrigin.z,\n )\n const planeMatrix = new Mat4().multiplyMatrices(transMatrix, rotMatrix)\n\n // 创建一个大的矩形面作为切割平面\n const bboxSize = new Vec3C(\n bbox.max[0] - bbox.min[0],\n bbox.max[1] - bbox.min[1],\n bbox.max[2] - bbox.min[2],\n )\n const planeSize = Math.max(bboxSize.x, bboxSize.y, bboxSize.z) * 3\n const planeRect = kernel.makeRectangle(planeSize, planeSize)\n // makeRectangle creates a face from [0,0] to [width,height] — center it at origin first\n const centerMatrix = new Mat4().makeTranslation(-planeSize / 2, -planeSize / 2, 0)\n const centeredRect = kernel.transform(planeRect, matrixToArray(centerMatrix))\n kernel.release(planeRect)\n const planeFace = kernel.transform(centeredRect, matrixToArray(planeMatrix))\n kernel.release(centeredRect)\n\n // 获取截面边(occt-only 平台面,D3)。BrepHandle(branded number)与\n // occt-wasm ShapeHandle 运行时同构,品牌转换只发生在平台边界;转回 BrepHandle\n // 后继续用 L1 面(getSubShapes/makeWire/extrude)。\n const sectionEdges = getOcctKernel().section(\n solid as unknown as ShapeHandle,\n planeFace as unknown as ShapeHandle,\n ) as unknown as BrepHandle\n kernel.release(planeFace)\n\n // 4. 构建截面 wire → face → 拉伸\n let extrudedSolid: BrepHandle\n try {\n // 尝试从截面边构建 wire\n const subShapes = kernel.getSubShapes(sectionEdges, 'edge')\n if (subShapes.length === 0) {\n kernel.release(sectionEdges)\n kernel.release(splitResult.front)\n kernel.release(splitResult.back)\n throw new Error('no section edges from plane intersection')\n }\n\n const wire = kernel.makeWire(subShapes)\n const face = kernel.makeFace(wire)\n kernel.release(wire)\n\n // 计算拉伸向量\n let extrudeVec: Vec3C\n if (mode === 'centered') {\n extrudeVec = normal.clone().multiplyScalar(length)\n } else if (mode === 'forward') {\n extrudeVec = normal.clone().multiplyScalar(length)\n } else {\n // backward\n extrudeVec = normal.clone().multiplyScalar(-length)\n }\n\n extrudedSolid = kernel.extrude(face, extrudeVec.x, extrudeVec.y, extrudeVec.z)\n kernel.release(face)\n kernel.release(sectionEdges)\n } catch {\n // 截面构建失败 — 释放资源并抛出\n if (sectionEdges) kernel.release(sectionEdges)\n kernel.release(splitResult.front)\n kernel.release(splitResult.back)\n throw new Error('[extrudeBrep] failed to build extrusion from section')\n }\n\n // 5. 中段落位补偿(修复 centered 模式中空 / 开壳)\n //\n // 切割平面位于 planeOrigin,splitBrep 产出的 front/back 其切面恰好在 planeOrigin。\n // - forward:front 偏移 +L、back 偏移 0 → 中段(从 planeOrigin 沿 +normal 拉伸 L,\n // 底面在 planeOrigin)的顶面(planeOrigin+L)正好接 front 底面,无需位移。\n // - backward:front 偏移 0、back 偏移 -L → 中段(沿 -normal 拉伸 L,顶在 planeOrigin)\n // 底面(planeOrigin-L)正好接 back 顶面,无需位移。\n // - centered:front 偏移 +L/2、back 偏移 -L/2,二者之间让出 L 的缝隙;但中段默认\n // 从 planeOrigin 沿 +normal 拉伸 L,落在 planeOrigin→planeOrigin+L,与 back 顶面\n // (planeOrigin-L/2) 和 front 底面 (planeOrigin+L/2) 各错开 L/2,形成两道 L/2 的缝隙\n // → fuse 后实体开壳 / 中空。必须对中段额外沿 -normal 位移 L/2,使其落在\n // planeOrigin-L/2 → planeOrigin+L/2,正好填补缝隙。\n const middleOffset = mode === 'centered' ? -length / 2 : 0\n if (middleOffset !== 0) {\n const translatedMiddle = kernel.translate(\n extrudedSolid,\n normal.x * middleOffset,\n normal.y * middleOffset,\n normal.z * middleOffset,\n )\n kernel.release(extrudedSolid)\n extrudedSolid = translatedMiddle\n }\n\n // 6. 计算各段位置\n let frontOffset: number\n let backOffset: number\n if (mode === 'centered') {\n frontOffset = length / 2\n backOffset = -length / 2\n } else if (mode === 'forward') {\n frontOffset = length\n backOffset = 0\n } else {\n frontOffset = 0\n backOffset = -length\n }\n\n // 平移 front 和 back\n const frontTranslated = kernel.translate(\n splitResult.front,\n normal.x * frontOffset,\n normal.y * frontOffset,\n normal.z * frontOffset,\n )\n kernel.release(splitResult.front)\n\n const backTranslated = kernel.translate(\n splitResult.back,\n normal.x * backOffset,\n normal.y * backOffset,\n normal.z * backOffset,\n )\n kernel.release(splitResult.back)\n\n // 7. Fuse 三段\n let result: BrepHandle\n try {\n const fused1 = kernel.fuse(frontTranslated, extrudedSolid)\n kernel.release(frontTranslated)\n kernel.release(extrudedSolid)\n result = kernel.fuse(fused1, backTranslated)\n kernel.release(fused1)\n kernel.release(backTranslated)\n } catch (err) {\n kernel.release(frontTranslated)\n kernel.release(extrudedSolid)\n kernel.release(backTranslated)\n throw new Error(`[extrudeBrep] fuse failed: ${err instanceof Error ? err.message : String(err)}`, { cause: err })\n }\n\n return result\n}\n\n// ─── STEP/BREP 导入操作 ───\n\n/**\n * 单零件导入的 STEP 颜色挂载(P2,方案 §5 STEP 行)。\n *\n * `getSolidColorsOrdered`(stepColorParser)把 STYLED_ITEM → COLOUR_RGB 引用链\n * 解析为按 MANIFOLD_SOLID_BREP 文件序的颜色数组;该序与 OCCT\n * `getSubShapes(compound,'solid')` 一致(stepColorParser 注释),因此取 `[0]`\n * 即「loadBrep 单零件收敛取第一个 solid」的颜色,语义对齐。\n *\n * 宽容兼容外部数据:BREP(CASCADE Topology 文本)无颜色概念直接跳过;STEP\n * 文本无 `STYLED_ITEM` 早退(零额外开销);引用链缺失/未知预定义色返回 null,\n * 一律不挂外观、不抛错(AGENTS.md 全局铁律:不得以内部严格性拒收正常文件)。\n */\nfunction applyFirstStepColor(shape: Shape, buffer: ArrayBuffer): Shape {\n const head = new TextDecoder('utf-8').decode(buffer.slice(0, 64))\n if (head.includes('CASCADE Topology')) return shape\n const text = new TextDecoder('utf-8').decode(buffer)\n if (!text.includes('STYLED_ITEM')) return shape\n const c0 = getSolidColorsOrdered(text)[0]\n if (c0) shape.appearance = { color: [c0[0], c0[1], c0[2]] }\n return shape\n}\n\n/**\n * BREP-native STEP 导入:使用 OCCT kernel.importStep 导入 STEP 文件为精确实体。\n *\n * 与 mesh 路径(cad-core/io.ts importFile → loadFormat → meshes)对照:\n * - mesh 路径:STEP → 三角网格,丢弃 OCCT BrepHandle\n * - BREP 路径:STEP → kernel.importStep → 保留 BrepHandle,同时三角化为显示 mesh\n *\n * 导入的 solid 存入 brepChain.solidCache,后续操作(drillBrep/splitBrep 等)\n * 将其作为\"基座特征\"进行精确运算。\n *\n * **设计决策(I5 不准合并;fileid-container-and-nesting §5.4 单零件收敛)**:\n * - 单 solid STEP:`importStep` 返回 Compound 包裹(顶层是 `TopoDS_Compound`,\n * 内含 1 个 `TopoDS_Solid`)。此处**解包**返回真实 Solid(`solids[0]`),\n * 下游 `isValid`/编辑/导出都针对真实实体。\n * - 多 solid STEP:**只支持单零件**(§5.4)——降级取**第一个** solid 返回(单一\n * 非复合 Shape),并回传 `multiSolidCount`(≥2 表示本文件被降级取件,由 load op\n * 登记\"多零件降级\" pending,宿主据此弹警告 §5.4:166)。取件点唯一,逐 part 拆\n * 分只发生在 load op 内部,宿主不再发多条 load。\n * - **不调用 `kernel.isValid`**:`importStep` 对单 solid STEP 也返回 Compound 包裹,\n * `isValid(compound)` 返回 false(Compound 不是 Solid),这会误杀合法 STEP。\n * 合法性判据改为 `getSubShapes(top, 'solid').length >= 1`(含 ≥1 个 solid 即合法),\n * 与装配路径 `walkLabel` 一致。\n *\n * @param kernel the initialized OCCT kernel.\n * @param buffer the raw STEP file bytes (a text-encoded ArrayBuffer).\n * @param brepChain optional - caches the tessellated BrepMeshResult when provided.\n * @param stmtId optional - the part this solid belongs to, paired with brepChain as the cache key.\n * @param opts optional - `allowNonSolid` relaxes the solid requirement so\n * a frozen wireframe/surface asset (a Draft wire, a face, a\n * shell) can be imported as addressable geometry. Callers\n * must decide this STATICALLY from the asset itself (see\n * `brepTextHasSolid`), never by retrying after a failure.\n * @returns { solid: the OCCT solid handle, shape: the display tessellated mesh,\n * multiSolidCount: total solids declared when > 1 (single-part take-first) }\n */\nexport function loadBrep(\n kernel: BrepEngineApi,\n buffer: ArrayBuffer,\n brepChain?: BrepChainState,\n stmtId?: PartName,\n opts?: { allowNonSolid?: boolean },\n): { solid: BrepHandle; shape: Shape; multiSolidCount?: number } {\n // BREP 文件(CASCADE Topology 文本格式)必须用 kernel.fromBREP 解析;\n // 误用 STEP 解析器(importStep)读 BREP 会抛 \"failed to read STEP data\"。\n const decoder = new TextDecoder('utf-8')\n const head = decoder.decode(buffer.slice(0, 64))\n const top = head.includes('CASCADE Topology')\n ? kernel.fromBREP(decoder.decode(buffer))\n : kernel.importStep(buffer)\n\n // 校验:含至少一个 solid 子形即合法(不调用 isValid,见上文设计决策)\n const solids = kernel.getSubShapes(top, 'solid')\n if (solids.length < 1) {\n // 非实体导入(allowNonSolid):冻结资产是 wireframe/surface(Draft 线/面/壳)\n // 时仍可作为可寻址几何导入——顶点/边/线/面/壳都算有内容。此时返回 top 本身,\n // 它独立持有几何,不能释放。\n // 注意:这类 Shape 进不了布尔运算(OCCT fuse/cut 抛 \"boolean operation\n // failed\"),调用方必须自己保证它只流向变换/聚合。\n if (opts?.allowNonSolid && hasAnyTopology(kernel, top)) {\n const shape = solidToShape(kernel, top, undefined, brepChain, stmtId)\n return { solid: top, shape: applyFirstStepColor(shape, buffer) }\n }\n kernel.release(top)\n throw new Error(\n `[loadBrep] imported shape contains no solid sub-shapes ` +\n `(solidCount=0) — wireframe/surface/invalid shapes are not supported ` +\n `unless allowNonSolid is set`\n )\n }\n\n // 单 solid:解包返回真实 Solid(非 Compound 包裹)\n if (solids.length === 1) {\n const realSolid = solids[0]\n kernel.release(top) // 释放 Compound 包裹,realSolid 独立持有\n const shape = solidToShape(kernel, realSolid, undefined, brepChain, stmtId)\n return { solid: realSolid, shape: applyFirstStepColor(shape, buffer) }\n }\n\n // 多 solid(§5.4 单零件收敛):只支持单零件 —— 降级取**第一个** solid,\n // 返回单一非复合 Shape,并回传 multiSolidCount(≥2 表示本文件被降级取件,\n // 由 `cad.load` op 登记\"多零件降级\" pending,宿主据零件数弹警告 §5.4:166)。\n // 取件点唯一:多零件拆分只发生在 load op 内部,宿主不再逐 part 拆、不再发\n // 多条 load。`solids` 是 kernel.getSubShapes(top,'solid') 的内核枚举序;对同一\n // import 路径、同一 OCCT 版本,该序是确定性的,故\"第一个\"可复现(红线 7)。\n const first = solids[0]\n if (!first) {\n kernel.release(top)\n throw new Error(`[loadBrep] imported shape has 0 solid sub-shapes`)\n }\n // 释放其余多余子形句柄(first 独立持有几何,剩下的子是 top 的子引用)\n for (const s of solids.slice(1)) {\n try { kernel.release(s) } catch { /* already released */ }\n }\n kernel.release(top) // 释放 Compound 包裹,first 独立持有(同单 solid 模式)\n const shape = solidToShape(kernel, first, undefined, brepChain, stmtId)\n return { solid: first, shape: applyFirstStepColor(shape, buffer), multiSolidCount: solids.length }\n}\n\n/** Sub-shape kinds that make an imported shape \"addressable but not a solid\". */\nconst NON_SOLID_KINDS = ['vertex', 'edge', 'wire', 'face', 'shell'] as const\n\n/**\n * Does a freshly imported shape hold any sub-shape at all?\n *\n * Guards the `allowNonSolid` path: a file whose TShapes table is empty (or that\n * holds only a bare compound with nothing inside) is a broken asset, not a\n * wireframe one, and must still fail loudly.\n *\n * @param kernel - the initialized OCCT kernel.\n * @param top - the imported top-level shape handle.\n * @returns true when at least one non-solid sub-shape exists.\n */\nfunction hasAnyTopology(kernel: BrepEngineApi, top: BrepHandle): boolean {\n return NON_SOLID_KINDS.some((kind) => kernel.getSubShapes(top, kind).length > 0)\n}\n\n// ─── 多零件 STEP 装配导入(P0,方案 2026-10-06-step-3mf-multipart-import-plan.md §5.3)───\n\n/** 多零件 STEP 导入中的一个零件(几何 + solid 句柄 + 身份)。 */\nexport interface LoadBrepAssemblyPart {\n /** 零件序号(0 起,DFS 声明序)。 */\n index: number\n /** 零件名(XCAF label;无则回退 `imported:<index>`)。 */\n name: string\n /** 显示色 sRGB 0..1,无则 null。 */\n color: [number, number, number] | null\n /** 三角化显示 mesh。 */\n shape: Shape\n /** OCCT solid 句柄(已烘 location;生命周期归 brepChain,调用方经 fromBrep 绑定)。 */\n solid: BrepHandle\n}\n\n/**\n * BREP-native 多零件 STEP 导入(XCAF 装配树 → 逐零件 Shape + 装配层级)。\n *\n * 与 `loadBrep`(单零件收敛,§5.4 旧行为)对照:loadBrepAssembly 走\n * `importAssemblyFromStep`(XCAF),返回**全部**叶零件(DFS 声明序)与装配树。\n *\n * - 装配树叶子 = 零件;合成节点(syntheticGroup:单一产品含多 MANIFOLD_SOLID_BREP)\n * 如实表达为中间节点;\n * - 无装配结构的单叶文件 → 1 个零件、无 assembly(行为与现状单零件一致);\n * - 句柄互通(T0):`importAssemblyFromStep` 内部用 initOcctWasm() 全局单例内核,\n * 与注入的 `BrepEngineApi`(createOcctPrimitives 包装同一单例)句柄数值互通——\n * 探针见 test/brep/load-brep-assembly.test.ts;\n * - 释放:装配节点句柄已由 walkLabel 释放,叶句柄随返回 parts 交给调用方\n * (fromBrep 绑定后归 brepChain 管理,不在此释放)。\n *\n * @param kernel - the initialized OCCT kernel (L1 contract face).\n * @param buffer - the raw STEP file bytes (text-encoded ArrayBuffer; stpz\n * unzipping is the caller's job — faijs never unzips implicitly).\n * @returns 全部零件 + 装配层级(多叶时)+ 叶数(>1 时)。\n */\nexport async function loadBrepAssembly(\n kernel: BrepEngineApi,\n buffer: ArrayBuffer,\n): Promise<{ parts: LoadBrepAssemblyPart[]; assembly?: ImportAssemblyNode; multiSolidCount?: number }> {\n const nodes = await importAssemblyFromStep(buffer)\n const leaves = collectLeafParts(nodes)\n\n // DFS 声明序:leaf 序 = parts 序 = ImportModel.parts.index。\n // 实体校验(与 load op「要求导入物含实体」契约一致):leaf 必须持有实体\n // (自身是 solid,或 label 内含 solid);空 label / wireframe 零件跳过,\n // 全部跳过则报错(不静默回退)。parts 下标保持连续(0..N-1)。\n const leafIndex = new Map<AssemblyPartNode, number>()\n const parts: LoadBrepAssemblyPart[] = []\n for (const leaf of leaves) {\n if (!leaf.shapeHandle || !leafHasSolid(kernel, leaf.shapeHandle)) continue\n const idx = parts.length\n leafIndex.set(leaf, idx)\n const h = leaf.shapeHandle as unknown as BrepHandle\n parts.push({\n index: idx,\n name: leaf.name || `imported:${idx}`,\n color: leaf.color,\n shape: solidToShape(kernel, h),\n solid: h,\n })\n }\n\n // 无叶零件(空/异常/纯 wireframe 文件)→ 报错暴露(不静默回退)。\n if (parts.length === 0) {\n throw new Error('[loadBrepAssembly] imported STEP contains no solid leaf parts')\n }\n\n const assembly = toImportAssemblyNode(nodes, leafIndex)\n return {\n parts,\n ...(assembly ? { assembly } : {}),\n ...(parts.length > 1 ? { multiSolidCount: parts.length } : {}),\n }\n}\n\n/**\n * BREP-native 多零件 STEP 导入 —— **无 XCAF 的引擎**的装配读取通道。\n *\n * 与 `loadBrepAssembly`(XCAF 装配树,occt-only)对照:本函数只用 L1 契约面\n * (`kernel.importStep` / `kernel.fromBREP` / `kernel.getSubShapes`),因此对任何\n * 实现了这两个方法的引擎成立(brepkit 即此路径)。代价是拿不到 XCAF 的零件名 /\n * 颜色 / 装配层级——零件身份退回 `imported:<index>`,`assembly` 不产出。这是\n * **引擎能力事实**,不是静默降级(调用方按引擎 id 静态分派,见下)。\n *\n * 分派规则(静态,无运行时回退):XCAF(`STEPCAFControl_Reader`)是 occt 内核的\n * 装配读取器,brepkit 没有;调用方按当前引擎 id 选择本函数还是 XCAF 版本\n * (`cad.load` 见 `packages/core/src/extra/ops/load.ts`),不靠 try-catch 探测。\n *\n * 句柄归属:返回的每个 `part.solid` 即内核枚举出的实体本身(生命周期交给调用方,\n * `fromBrep` 绑定后归 brepChain)。顶层包装句柄在本函数内释放——但**若顶层句柄\n * 就是枚举出的那个实体**(brepkit 的 `getSubShapes(solid,'solid')` 对单实体返回\n * 自身,见 brepkitKernel 的 `catch { list = [s] }`)则不释放,否则返回件被释放。\n *\n * @param kernel - the initialized BREP kernel (L1 contract face).\n * @param buffer - the raw STEP (or CASCADE BREP text) file bytes.\n * @returns 全部实体零件(内核枚举序,index 连续)+ 实体数(>1 时)。\n */\nexport function loadBrepAssemblyNative(\n kernel: BrepEngineApi,\n buffer: ArrayBuffer,\n): { parts: LoadBrepAssemblyPart[]; multiSolidCount?: number } {\n // 与 loadBrep 同一格式判别:CASCADE Topology 文本走 fromBREP,其余(STEP/STP)走 importStep。\n const decoder = new TextDecoder('utf-8')\n const head = decoder.decode(buffer.slice(0, 64))\n const top = head.includes('CASCADE Topology')\n ? kernel.fromBREP(decoder.decode(buffer))\n : kernel.importStep(buffer)\n\n const solids = kernel.getSubShapes(top, 'solid')\n if (solids.length === 0) {\n kernel.release(top)\n throw new Error('[loadBrepAssemblyNative] imported file contains no solid sub-shapes')\n }\n if (!solids.some((s) => s === top)) kernel.release(top)\n\n const parts: LoadBrepAssemblyPart[] = solids.map((solid, index) => ({\n index,\n name: `imported:${index}`,\n color: null,\n shape: solidToShape(kernel, solid),\n solid,\n }))\n return { parts, ...(parts.length > 1 ? { multiSolidCount: parts.length } : {}) }\n}\n\n/**\n * leaf 是否持有实体(loadBrepAssembly 实体校验):自身是 solid(syntheticGroup\n * 拆出的单个 solid 句柄),或 label compound 内含 solid。getSubShapes 的引用\n * 句柄须立即 release(walkLabel 只释放了它自己取的副本)。\n */\nfunction leafHasSolid(kernel: BrepEngineApi, h: ShapeHandle): boolean {\n const bh = h as unknown as BrepHandle\n if (kernel.isSolid(bh)) return true\n const solids = kernel.getSubShapes(bh, 'solid')\n const n = solids.length\n for (const s of solids) kernel.release(s)\n return n > 0\n}\n\n/**\n * XCAF 装配树 → ImportAssemblyNode(DFS 序与 parts 一致)。\n *\n * - 单根且根为叶(无装配结构)→ undefined(单零件路径,与现状一致);\n * - 单根装配 → 该根;\n * - 多根 → 合成虚拟根 `{ name: 'imported' }`(确定性结构名,非零件身份)。\n */\nfunction toImportAssemblyNode(\n nodes: AssemblyPartNode[],\n leafIndex: Map<AssemblyPartNode, number>,\n): ImportAssemblyNode | undefined {\n if (nodes.length === 0) return undefined\n const convert = (node: AssemblyPartNode): ImportAssemblyNode => {\n if (node.children.length === 0) {\n const idx = leafIndex.get(node)\n return { name: node.name, ...(idx !== undefined ? { partIndex: idx } : {}) }\n }\n return { name: node.name, children: node.children.map(convert) }\n }\n if (nodes.length === 1) {\n const root = convert(nodes[0])\n // 单根且根为叶(无装配结构)→ 不表达装配层级\n if (root.partIndex !== undefined) return undefined\n return root\n }\n return { name: 'imported', children: nodes.map(convert) }\n}\n\n// ─── 辅助函数 ───\n\n/**\n * Convert a Mat4 into the 3x4 row-major array (12 doubles) the OCCT\n * transform expects.\n *\n * OCCT transform accepts [r00,r01,r02,tx, r10,r11,r12,ty, r20,r21,r22,tz].\n * @param matrix - the source matrix to convert.\n * @returns the 3x4 row-major array of 12 doubles.\n */\nexport function matrixToArray(matrix: Mat4): number[] {\n const e = matrix.elements\n // Mat4 是 column-major,OCCT 需要 row-major 3x4\n return [\n e[0], e[4], e[8], e[12],\n e[1], e[5], e[9], e[13],\n e[2], e[6], e[10], e[14],\n ]\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"brep-mock.d.ts","sourceRoot":"","sources":["../../../../src/brep/engine/adapters/brep-mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,OAAO,KAAK,EAAE,aAAa,EAAgC,MAAM,eAAe,CAAA;AAEhF,wCAAwC;AACxC,eAAO,MAAM,mBAAmB,cAAc,CAAA;AAoC9C;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,CA2ZjD;AAED,yEAAyE;AACzE,wBAAgB,sBAAsB,IAAI,IAAI,CAK7C"}
1
+ {"version":3,"file":"brep-mock.d.ts","sourceRoot":"","sources":["../../../../src/brep/engine/adapters/brep-mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,OAAO,KAAK,EAAE,aAAa,EAAgC,MAAM,eAAe,CAAA;AAEhF,wCAAwC;AACxC,eAAO,MAAM,mBAAmB,cAAc,CAAA;AAoC9C;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,CAmcjD;AAED,yEAAyE;AACzE,wBAAgB,sBAAsB,IAAI,IAAI,CAK7C"}
@@ -155,6 +155,35 @@ export function createBrepMockApi() {
155
155
  }
156
156
  return alloc({ kind: 'solid', bbox: { xmin, ymin, zmin, xmax, ymax, zmax }, tag: `hullFromPoints(n=${points.length})` });
157
157
  },
158
+ bsplineSurface: (points) => {
159
+ // Mock approximation: bbox of the point grid as a face (同 hullFromPoints 口径)。
160
+ if (points.length === 0)
161
+ return unsupported('bsplineSurface: empty point grid');
162
+ let xmin = Infinity, ymin = Infinity, zmin = Infinity;
163
+ let xmax = -Infinity, ymax = -Infinity, zmax = -Infinity;
164
+ for (const p of points) {
165
+ xmin = Math.min(xmin, p.x);
166
+ ymin = Math.min(ymin, p.y);
167
+ zmin = Math.min(zmin, p.z);
168
+ xmax = Math.max(xmax, p.x);
169
+ ymax = Math.max(ymax, p.y);
170
+ zmax = Math.max(zmax, p.z);
171
+ }
172
+ return alloc({ kind: 'face', bbox: { xmin, ymin, zmin, xmax, ymax, zmax }, tag: `bsplineSurface(n=${points.length})` });
173
+ },
174
+ makeSolid: (shell) => alloc({ kind: 'solid', bbox: { ...need(shell, 'makeSolid').bbox }, tag: `solid(#${shell})` }),
175
+ thicken: (shape, thickness) => {
176
+ const s = need(shape, 'thicken');
177
+ // 沿三轴各外扩 thickness(mock 近似:不区分正负厚度方向)。
178
+ return alloc({
179
+ kind: 'solid',
180
+ bbox: {
181
+ xmin: s.bbox.xmin - thickness, ymin: s.bbox.ymin - thickness, zmin: s.bbox.zmin - thickness,
182
+ xmax: s.bbox.xmax + thickness, ymax: s.bbox.ymax + thickness, zmax: s.bbox.zmax + thickness,
183
+ },
184
+ tag: `thicken(${s.tag},t=${thickness})`,
185
+ });
186
+ },
158
187
  // ── 倒角与圆角(mock:只重打标签/复制,不做真几何;引擎切换测试覆盖签名面) ──
159
188
  chamfer: (solid, edges, distance) => {
160
189
  const s = need(solid, 'chamfer');
@@ -325,6 +354,19 @@ export function createBrepMockApi() {
325
354
  ];
326
355
  },
327
356
  makeCircleEdge: (center, _normal, radius) => alloc({ kind: 'edge', bbox: bboxOf('edge', [radius * 2, radius * 2, 0]), tag: `circle(${center.x},${center.y},${center.z},r=${radius})` }),
357
+ makeCircleArc: (center, _normal, radius, a0, a1) => alloc({ kind: 'edge', bbox: bboxOf('edge', [radius * 2, radius * 2, 0]), tag: `arc(${center.x},${center.y},${center.z},r=${radius},${a0}..${a1})` }),
358
+ makeHelixWire: (_origin, _axis, pitch, height, radius, leftHanded) => {
359
+ // 每圈沿轴推进 pitch → 圈数 = height/pitch;轴向跨度取总高的绝对值。
360
+ const turns = pitch !== 0 ? Math.abs(height / pitch) : 0;
361
+ return alloc({
362
+ kind: 'wire',
363
+ bbox: bboxOf('wire', [radius * 2, radius * 2, Math.abs(height)]),
364
+ // 手性只入 tag(替身不做几何,但参数不许被静默吞掉)。
365
+ tag: `helix(r=${radius},h=${height},p=${pitch},turns=${turns},handed=${leftHanded ? 'left' : 'right'})`,
366
+ });
367
+ },
368
+ approximatePoints: (points) => alloc({ kind: 'edge', bbox: bboxOf('edge', [1, 1, 1]), tag: `approximatePoints(n=${points.length})` }),
369
+ interpolatePointsWithTangents: (points) => alloc({ kind: 'edge', bbox: bboxOf('edge', [1, 1, 1]), tag: `interpolatePointsWithTangents(n=${points.length})` }),
328
370
  // ── 拓扑构造 ──
329
371
  makeWire: (edges) => alloc({ kind: 'wire', bbox: edges.length > 0 ? { ...need(edges[0], 'makeWire').bbox } : bboxOf('wire', [0, 0, 0]), tag: `wire(${edges.length})` }),
330
372
  makeFace: (wire) => alloc({ kind: 'face', bbox: { ...need(wire, 'makeFace').bbox }, tag: `face(#${wire})` }),
@@ -337,6 +379,7 @@ export function createBrepMockApi() {
337
379
  return alloc({ kind: 'compound', bbox: bbox ?? bboxOf('compound', [0, 0, 0]), tag: `compound(${parts.length})` });
338
380
  },
339
381
  buildTriFace: () => alloc({ kind: 'face', bbox: bboxOf('face', [1, 1, 0]), tag: 'triFace' }),
382
+ makeNonPlanarFace: (wire) => alloc({ kind: 'face', bbox: { ...need(wire, 'makeNonPlanarFace').bbox }, tag: `nonPlanarFace(#${wire})` }),
340
383
  addHolesInFace: (face) => alloc({ kind: 'face', bbox: { ...need(face, 'addHolesInFace').bbox }, tag: `holedFace(#${face})` }),
341
384
  // ── 三角化(BREP→mesh 唯一出口) ──
342
385
  meshShape: () => unitBoxMesh(),
@@ -347,6 +390,7 @@ export function createBrepMockApi() {
347
390
  hashCode: (shape) => shape % 2147483647,
348
391
  isSame: (a, b) => a === b,
349
392
  isSolid: () => true,
393
+ subShapeCount: () => 0,
350
394
  shapeType: () => 'SOLID',
351
395
  shapeOrientation: () => 'forward',
352
396
  edgeToFaceMap: () => ({}),
@@ -423,6 +467,7 @@ export function createBrepMockApi() {
423
467
  makeTorus: () => unsupported('makeTorus'),
424
468
  makeVertex: (x, y, z) => alloc({ kind: 'edge', bbox: { xmin: x, ymin: y, zmin: z, xmax: x, ymax: y, zmax: z }, tag: `vertex(${x},${y},${z})` }),
425
469
  mirror: (shape) => alloc({ kind: need(shape, 'mirror').kind, bbox: { ...need(shape, 'mirror').bbox }, tag: `mirror(#${shape})` }),
470
+ rotate: (shape, axis, angleRad) => alloc({ kind: need(shape, 'rotate').kind, bbox: { ...need(shape, 'rotate').bbox }, tag: `rotate(#${shape},${axis.direction.x},${axis.direction.y},${axis.direction.z},${angleRad})` }),
426
471
  surfaceCenterOfMass: (shape) => { const b = need(shape, 'surfaceCenterOfMass').bbox; return { x: (b.xmin + b.xmax) / 2, y: (b.ymin + b.ymax) / 2, z: (b.zmin + b.zmax) / 2 }; },
427
472
  locate: (shape) => alloc({ kind: need(shape, 'locate').kind, bbox: { ...need(shape, 'locate').bbox }, tag: `locate(#${shape})` }),
428
473
  copyShape: (shape) => alloc({ kind: need(shape, 'copyShape').kind, bbox: { ...need(shape, 'copyShape').bbox }, tag: `copy(#${shape})` }),