@faicad/faijs 0.16.1 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/LICENSE +4 -5
  2. package/NOTICE +5 -6
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +19 -1
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/assembly/entities.d.ts +1 -1
  7. package/dist/api/assembly/entities.d.ts.map +1 -1
  8. package/dist/api/assembly/entities.js.map +1 -1
  9. package/dist/api/assembly/joints.d.ts +2 -2
  10. package/dist/api/assembly/joints.d.ts.map +1 -1
  11. package/dist/api/assembly/joints.js +2 -2
  12. package/dist/api/assembly/joints.js.map +1 -1
  13. package/dist/api/assembly/lower.d.ts +1 -1
  14. package/dist/api/assembly/lower.d.ts.map +1 -1
  15. package/dist/api/assembly/lower.js.map +1 -1
  16. package/dist/api/assembly/pose.d.ts +3 -3
  17. package/dist/api/assembly/pose.d.ts.map +1 -1
  18. package/dist/api/assembly/pose.js +1 -1
  19. package/dist/api/assembly/pose.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.d.ts.map +1 -1
  22. package/dist/api/assembly/preview.js +1 -1
  23. package/dist/api/assembly/preview.js.map +1 -1
  24. package/dist/api/assembly/solve.d.ts.map +1 -1
  25. package/dist/api/assembly/solve.js +3 -3
  26. package/dist/api/assembly/solve.js.map +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.d.ts +98 -0
  28. package/dist/api/assembly/solvers/assembly-tree.d.ts.map +1 -0
  29. package/dist/api/assembly/solvers/assembly-tree.js +130 -0
  30. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -0
  31. package/dist/api/assembly/solvers/chain-solver.d.ts +27 -0
  32. package/dist/api/assembly/solvers/chain-solver.d.ts.map +1 -0
  33. package/dist/api/assembly/solvers/chain-solver.js +330 -0
  34. package/dist/api/assembly/solvers/chain-solver.js.map +1 -0
  35. package/dist/api/assembly/solvers/global-solver.js +2 -2
  36. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  37. package/dist/api/assembly/solvers/joints-kinematics.d.ts +308 -0
  38. package/dist/api/assembly/solvers/joints-kinematics.d.ts.map +1 -0
  39. package/dist/api/assembly/solvers/joints-kinematics.js +643 -0
  40. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -0
  41. package/dist/api/assembly/solvers/quat.d.ts +35 -0
  42. package/dist/api/assembly/solvers/quat.d.ts.map +1 -0
  43. package/dist/api/assembly/solvers/quat.js +84 -0
  44. package/dist/api/assembly/solvers/quat.js.map +1 -0
  45. package/dist/api/assembly/solvers/types.d.ts +33 -0
  46. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  47. package/dist/api/assembly/solvers/types.js.map +1 -1
  48. package/dist/api/boolean.d.ts.map +1 -1
  49. package/dist/api/boolean.js +3 -4
  50. package/dist/api/boolean.js.map +1 -1
  51. package/dist/api/brep-mirror/booleanFns.d.ts +40 -0
  52. package/dist/api/brep-mirror/booleanFns.d.ts.map +1 -0
  53. package/dist/api/brep-mirror/booleanFns.js +99 -0
  54. package/dist/api/brep-mirror/booleanFns.js.map +1 -0
  55. package/dist/api/brep-mirror/brepHelpers.d.ts +55 -0
  56. package/dist/api/brep-mirror/brepHelpers.d.ts.map +1 -0
  57. package/dist/api/brep-mirror/brepHelpers.js +131 -0
  58. package/dist/api/brep-mirror/brepHelpers.js.map +1 -0
  59. package/dist/api/brep-mirror/compoundFns.d.ts +47 -0
  60. package/dist/api/brep-mirror/compoundFns.d.ts.map +1 -0
  61. package/dist/api/brep-mirror/compoundFns.js +300 -0
  62. package/dist/api/brep-mirror/compoundFns.js.map +1 -0
  63. package/dist/api/brep-mirror/healingFns.d.ts +78 -0
  64. package/dist/api/brep-mirror/healingFns.d.ts.map +1 -0
  65. package/dist/api/brep-mirror/healingFns.js +294 -0
  66. package/dist/api/brep-mirror/healingFns.js.map +1 -0
  67. package/dist/api/brep-mirror/hullFns.d.ts +20 -0
  68. package/dist/api/brep-mirror/hullFns.d.ts.map +1 -0
  69. package/dist/api/brep-mirror/hullFns.js +46 -0
  70. package/dist/api/brep-mirror/hullFns.js.map +1 -0
  71. package/dist/api/brep-mirror/patternFns.d.ts +43 -0
  72. package/dist/api/brep-mirror/patternFns.d.ts.map +1 -0
  73. package/dist/api/brep-mirror/patternFns.js +178 -0
  74. package/dist/api/brep-mirror/patternFns.js.map +1 -0
  75. package/dist/api/brep-mirror/primitiveFns.d.ts +42 -0
  76. package/dist/api/brep-mirror/primitiveFns.d.ts.map +1 -0
  77. package/dist/api/brep-mirror/primitiveFns.js +104 -0
  78. package/dist/api/brep-mirror/primitiveFns.js.map +1 -0
  79. package/dist/api/brep-mirror/roofFns.d.ts +24 -0
  80. package/dist/api/brep-mirror/roofFns.d.ts.map +1 -0
  81. package/dist/api/brep-mirror/roofFns.js +229 -0
  82. package/dist/api/brep-mirror/roofFns.js.map +1 -0
  83. package/dist/api/brep-mirror/straightSkeleton.d.ts +36 -0
  84. package/dist/api/brep-mirror/straightSkeleton.d.ts.map +1 -0
  85. package/dist/api/brep-mirror/straightSkeleton.js +443 -0
  86. package/dist/api/brep-mirror/straightSkeleton.js.map +1 -0
  87. package/dist/api/brep-mirror/sweepFns.d.ts +55 -0
  88. package/dist/api/brep-mirror/sweepFns.d.ts.map +1 -0
  89. package/dist/api/brep-mirror/sweepFns.js +200 -0
  90. package/dist/api/brep-mirror/sweepFns.js.map +1 -0
  91. package/dist/api/brep-mirror/threadFns.d.ts +15 -0
  92. package/dist/api/brep-mirror/threadFns.d.ts.map +1 -1
  93. package/dist/api/brep-mirror/threadFns.js +37 -2
  94. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  95. package/dist/api/brep-mirror/topologyFns.d.ts +74 -0
  96. package/dist/api/brep-mirror/topologyFns.d.ts.map +1 -0
  97. package/dist/api/brep-mirror/topologyFns.js +273 -0
  98. package/dist/api/brep-mirror/topologyFns.js.map +1 -0
  99. package/dist/api/brep-topology.d.ts +190 -0
  100. package/dist/api/brep-topology.d.ts.map +1 -0
  101. package/dist/api/brep-topology.js +337 -0
  102. package/dist/api/brep-topology.js.map +1 -0
  103. package/dist/api/brepjs-compat/constants.d.ts +11 -0
  104. package/dist/api/brepjs-compat/constants.d.ts.map +1 -0
  105. package/dist/api/brepjs-compat/constants.js +11 -0
  106. package/dist/api/brepjs-compat/constants.js.map +1 -0
  107. package/dist/api/brepjs-compat/index.d.ts +19 -232
  108. package/dist/api/brepjs-compat/index.d.ts.map +1 -1
  109. package/dist/api/brepjs-compat/index.js +19 -286
  110. package/dist/api/brepjs-compat/index.js.map +1 -1
  111. package/dist/api/brepjs-compat/planeOps.d.ts +98 -0
  112. package/dist/api/brepjs-compat/planeOps.d.ts.map +1 -0
  113. package/dist/api/brepjs-compat/planeOps.js +170 -0
  114. package/dist/api/brepjs-compat/planeOps.js.map +1 -0
  115. package/dist/api/brepjs-compat/planeTypes.d.ts +24 -0
  116. package/dist/api/brepjs-compat/planeTypes.d.ts.map +1 -0
  117. package/dist/api/brepjs-compat/planeTypes.js +8 -0
  118. package/dist/api/brepjs-compat/planeTypes.js.map +1 -0
  119. package/dist/api/brepjs-compat/types.d.ts +64 -0
  120. package/dist/api/brepjs-compat/types.d.ts.map +1 -0
  121. package/dist/api/brepjs-compat/types.js +48 -0
  122. package/dist/api/brepjs-compat/types.js.map +1 -0
  123. package/dist/api/brepjs-compat/vecOps.d.ts +124 -0
  124. package/dist/api/brepjs-compat/vecOps.d.ts.map +1 -0
  125. package/dist/api/brepjs-compat/vecOps.js +202 -0
  126. package/dist/api/brepjs-compat/vecOps.js.map +1 -0
  127. package/dist/api/chamfer.d.ts +5 -0
  128. package/dist/api/chamfer.d.ts.map +1 -1
  129. package/dist/api/chamfer.js +13 -8
  130. package/dist/api/chamfer.js.map +1 -1
  131. package/dist/api/compound-geom.d.ts.map +1 -1
  132. package/dist/api/compound-geom.js +8 -2
  133. package/dist/api/compound-geom.js.map +1 -1
  134. package/dist/api/draft.d.ts +69 -0
  135. package/dist/api/draft.d.ts.map +1 -0
  136. package/dist/api/draft.js +109 -0
  137. package/dist/api/draft.js.map +1 -0
  138. package/dist/api/edge-ref.d.ts.map +1 -1
  139. package/dist/api/edge-ref.js +2 -2
  140. package/dist/api/edge-ref.js.map +1 -1
  141. package/dist/api/engrave.d.ts.map +1 -1
  142. package/dist/api/engrave.js +2 -3
  143. package/dist/api/engrave.js.map +1 -1
  144. package/dist/api/extrude.d.ts.map +1 -1
  145. package/dist/api/extrude.js +28 -13
  146. package/dist/api/extrude.js.map +1 -1
  147. package/dist/api/face-ref.d.ts.map +1 -1
  148. package/dist/api/face-ref.js +2 -2
  149. package/dist/api/face-ref.js.map +1 -1
  150. package/dist/api/feature-repair.d.ts +137 -0
  151. package/dist/api/feature-repair.d.ts.map +1 -0
  152. package/dist/api/feature-repair.js +221 -0
  153. package/dist/api/feature-repair.js.map +1 -0
  154. package/dist/api/fillet-variable.d.ts +35 -0
  155. package/dist/api/fillet-variable.d.ts.map +1 -0
  156. package/dist/api/fillet-variable.js +71 -0
  157. package/dist/api/fillet-variable.js.map +1 -0
  158. package/dist/api/fillet.d.ts +3 -0
  159. package/dist/api/fillet.d.ts.map +1 -1
  160. package/dist/api/fillet.js +7 -4
  161. package/dist/api/fillet.js.map +1 -1
  162. package/dist/api/generated/2d.d.ts +1 -13
  163. package/dist/api/generated/2d.d.ts.map +1 -1
  164. package/dist/api/generated/2d.js +6 -1
  165. package/dist/api/generated/2d.js.map +1 -1
  166. package/dist/api/generated/brepjs/index.d.ts +298 -298
  167. package/dist/api/generated/brepjs/index.d.ts.map +1 -1
  168. package/dist/api/generated/brepjs/index.js +183 -183
  169. package/dist/api/generated/brepjs/index.js.map +1 -1
  170. package/dist/api/generated/core.d.ts +3 -123
  171. package/dist/api/generated/core.d.ts.map +1 -1
  172. package/dist/api/generated/core.js +2 -81
  173. package/dist/api/generated/core.js.map +1 -1
  174. package/dist/api/generated/gear.d.ts +1 -15
  175. package/dist/api/generated/gear.d.ts.map +1 -1
  176. package/dist/api/generated/gear.js +6 -3
  177. package/dist/api/generated/gear.js.map +1 -1
  178. package/dist/api/generated/io.d.ts +1 -13
  179. package/dist/api/generated/io.d.ts.map +1 -1
  180. package/dist/api/generated/io.js +6 -1
  181. package/dist/api/generated/io.js.map +1 -1
  182. package/dist/api/generated/kernel.d.ts +1 -39
  183. package/dist/api/generated/kernel.d.ts.map +1 -1
  184. package/dist/api/generated/kernel.js +6 -4
  185. package/dist/api/generated/kernel.js.map +1 -1
  186. package/dist/api/generated/measurement.d.ts +53 -97
  187. package/dist/api/generated/measurement.d.ts.map +1 -1
  188. package/dist/api/generated/measurement.js +48 -143
  189. package/dist/api/generated/measurement.js.map +1 -1
  190. package/dist/api/generated/ns.d.ts +1 -10
  191. package/dist/api/generated/ns.d.ts.map +1 -1
  192. package/dist/api/generated/ns.js +2 -10
  193. package/dist/api/generated/ns.js.map +1 -1
  194. package/dist/api/generated/operations.d.ts +65 -110
  195. package/dist/api/generated/operations.d.ts.map +1 -1
  196. package/dist/api/generated/operations.js +132 -80
  197. package/dist/api/generated/operations.js.map +1 -1
  198. package/dist/api/generated/projection.d.ts +1 -8
  199. package/dist/api/generated/projection.d.ts.map +1 -1
  200. package/dist/api/generated/projection.js +6 -4
  201. package/dist/api/generated/projection.js.map +1 -1
  202. package/dist/api/generated/query.d.ts +1 -9
  203. package/dist/api/generated/query.d.ts.map +1 -1
  204. package/dist/api/generated/query.js +6 -1
  205. package/dist/api/generated/query.js.map +1 -1
  206. package/dist/api/generated/script-face-manifest.d.ts +2 -0
  207. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  208. package/dist/api/generated/script-face-manifest.js +34 -22
  209. package/dist/api/generated/script-face-manifest.js.map +1 -1
  210. package/dist/api/generated/script-face.d.ts +52 -27
  211. package/dist/api/generated/script-face.d.ts.map +1 -1
  212. package/dist/api/generated/script-face.js +18 -4
  213. package/dist/api/generated/script-face.js.map +1 -1
  214. package/dist/api/generated/sketching.d.ts +4 -7
  215. package/dist/api/generated/sketching.d.ts.map +1 -1
  216. package/dist/api/generated/sketching.js +10 -8
  217. package/dist/api/generated/sketching.js.map +1 -1
  218. package/dist/api/generated/text.d.ts +1 -6
  219. package/dist/api/generated/text.d.ts.map +1 -1
  220. package/dist/api/generated/text.js +6 -3
  221. package/dist/api/generated/text.js.map +1 -1
  222. package/dist/api/generated/topology.d.ts +77 -175
  223. package/dist/api/generated/topology.d.ts.map +1 -1
  224. package/dist/api/generated/topology.js +172 -131
  225. package/dist/api/generated/topology.js.map +1 -1
  226. package/dist/api/geom.d.ts.map +1 -1
  227. package/dist/api/geom.js +2 -2
  228. package/dist/api/geom.js.map +1 -1
  229. package/dist/api/helix.d.ts +51 -0
  230. package/dist/api/helix.d.ts.map +1 -0
  231. package/dist/api/helix.js +63 -0
  232. package/dist/api/helix.js.map +1 -0
  233. package/dist/api/import-step.d.ts.map +1 -1
  234. package/dist/api/import-step.js +6 -2
  235. package/dist/api/import-step.js.map +1 -1
  236. package/dist/api/index.d.ts +18 -5
  237. package/dist/api/index.d.ts.map +1 -1
  238. package/dist/api/index.js +29 -12
  239. package/dist/api/index.js.map +1 -1
  240. package/dist/api/internal/compat-op.d.ts +10 -0
  241. package/dist/api/internal/compat-op.d.ts.map +1 -1
  242. package/dist/api/internal/compat-op.js +9 -3
  243. package/dist/api/internal/compat-op.js.map +1 -1
  244. package/dist/api/internal/compat-projection.d.ts +4 -4
  245. package/dist/api/internal/compat-projection.js +7 -7
  246. package/dist/api/internal/compat-projection.js.map +1 -1
  247. package/dist/api/internal/l3-bridge.d.ts +75 -42
  248. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  249. package/dist/api/internal/l3-bridge.js +105 -50
  250. package/dist/api/internal/l3-bridge.js.map +1 -1
  251. package/dist/api/internal/profile-wire.d.ts +31 -0
  252. package/dist/api/internal/profile-wire.d.ts.map +1 -0
  253. package/dist/api/internal/profile-wire.js +37 -0
  254. package/dist/api/internal/profile-wire.js.map +1 -0
  255. package/dist/api/internal/replica-role-table.js +2 -2
  256. package/dist/api/internal/replica-role-table.js.map +1 -1
  257. package/dist/api/loft.d.ts +66 -0
  258. package/dist/api/loft.d.ts.map +1 -0
  259. package/dist/api/loft.js +111 -0
  260. package/dist/api/loft.js.map +1 -0
  261. package/dist/api/measurement/index.d.ts +51 -0
  262. package/dist/api/measurement/index.d.ts.map +1 -0
  263. package/dist/api/measurement/index.js +71 -0
  264. package/dist/api/measurement/index.js.map +1 -0
  265. package/dist/api/occt-kernel-bridge.d.ts +5 -8
  266. package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
  267. package/dist/api/occt-kernel-bridge.js +18 -14
  268. package/dist/api/occt-kernel-bridge.js.map +1 -1
  269. package/dist/api/pattern.d.ts.map +1 -1
  270. package/dist/api/pattern.js +3 -4
  271. package/dist/api/pattern.js.map +1 -1
  272. package/dist/api/place.d.ts.map +1 -1
  273. package/dist/api/place.js +2 -4
  274. package/dist/api/place.js.map +1 -1
  275. package/dist/api/primitives.d.ts.map +1 -1
  276. package/dist/api/primitives.js +3 -4
  277. package/dist/api/primitives.js.map +1 -1
  278. package/dist/api/replicate.d.ts +28 -1
  279. package/dist/api/replicate.d.ts.map +1 -1
  280. package/dist/api/replicate.js +29 -19
  281. package/dist/api/replicate.js.map +1 -1
  282. package/dist/api/result.d.ts +6 -11
  283. package/dist/api/result.d.ts.map +1 -1
  284. package/dist/api/result.js +6 -11
  285. package/dist/api/result.js.map +1 -1
  286. package/dist/api/revolve.d.ts.map +1 -1
  287. package/dist/api/revolve.js +15 -14
  288. package/dist/api/revolve.js.map +1 -1
  289. package/dist/api/screw.d.ts +3 -0
  290. package/dist/api/screw.d.ts.map +1 -1
  291. package/dist/api/screw.js +9 -4
  292. package/dist/api/screw.js.map +1 -1
  293. package/dist/api/sdf.d.ts +1 -1
  294. package/dist/api/section-by-plane.d.ts +42 -0
  295. package/dist/api/section-by-plane.d.ts.map +1 -0
  296. package/dist/api/section-by-plane.js +61 -0
  297. package/dist/api/section-by-plane.js.map +1 -0
  298. package/dist/api/shell.d.ts +45 -0
  299. package/dist/api/shell.d.ts.map +1 -0
  300. package/dist/api/shell.js +73 -0
  301. package/dist/api/shell.js.map +1 -0
  302. package/dist/api/sketch.d.ts +8 -1
  303. package/dist/api/sketch.d.ts.map +1 -1
  304. package/dist/api/sketch.js +12 -7
  305. package/dist/api/sketch.js.map +1 -1
  306. package/dist/api/split-by-plane.d.ts +41 -0
  307. package/dist/api/split-by-plane.d.ts.map +1 -0
  308. package/dist/api/split-by-plane.js +60 -0
  309. package/dist/api/split-by-plane.js.map +1 -0
  310. package/dist/api/split.d.ts +6 -1
  311. package/dist/api/split.d.ts.map +1 -1
  312. package/dist/api/split.js +23 -9
  313. package/dist/api/split.js.map +1 -1
  314. package/dist/api/surface/arg-spec.d.ts +22 -0
  315. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  316. package/dist/api/surface/arg-spec.js +723 -476
  317. package/dist/api/surface/arg-spec.js.map +1 -1
  318. package/dist/api/sweep.d.ts +55 -0
  319. package/dist/api/sweep.d.ts.map +1 -0
  320. package/dist/api/sweep.js +86 -0
  321. package/dist/api/sweep.js.map +1 -0
  322. package/dist/api/thicken.d.ts +36 -0
  323. package/dist/api/thicken.d.ts.map +1 -0
  324. package/dist/api/thicken.js +55 -0
  325. package/dist/api/thicken.js.map +1 -0
  326. package/dist/api/transform.d.ts +8 -0
  327. package/dist/api/transform.d.ts.map +1 -1
  328. package/dist/api/transform.js +15 -4
  329. package/dist/api/transform.js.map +1 -1
  330. package/dist/api/view/cameraFns.d.ts +48 -0
  331. package/dist/api/view/cameraFns.d.ts.map +1 -0
  332. package/dist/api/view/cameraFns.js +75 -0
  333. package/dist/api/view/cameraFns.js.map +1 -0
  334. package/dist/api/view/projectionPlanes.d.ts +25 -0
  335. package/dist/api/view/projectionPlanes.d.ts.map +1 -0
  336. package/dist/api/view/projectionPlanes.js +30 -0
  337. package/dist/api/view/projectionPlanes.js.map +1 -0
  338. package/dist/api/view/view-camera.d.ts +2 -2
  339. package/dist/api/view/view-camera.d.ts.map +1 -1
  340. package/dist/api/view/view-camera.js +3 -3
  341. package/dist/api/view/view-camera.js.map +1 -1
  342. package/dist/api/view/view-projection.d.ts +9 -6
  343. package/dist/api/view/view-projection.d.ts.map +1 -1
  344. package/dist/api/view/view-projection.js +132 -65
  345. package/dist/api/view/view-projection.js.map +1 -1
  346. package/dist/api/wire.d.ts +45 -0
  347. package/dist/api/wire.d.ts.map +1 -0
  348. package/dist/api/wire.js +96 -0
  349. package/dist/api/wire.js.map +1 -0
  350. package/dist/boolean/creased-normals.d.ts +50 -0
  351. package/dist/boolean/creased-normals.d.ts.map +1 -0
  352. package/dist/boolean/creased-normals.js +114 -0
  353. package/dist/boolean/creased-normals.js.map +1 -0
  354. package/dist/boolean/deriveNormals.d.ts +4 -1
  355. package/dist/boolean/deriveNormals.d.ts.map +1 -1
  356. package/dist/boolean/deriveNormals.js +5 -2
  357. package/dist/boolean/deriveNormals.js.map +1 -1
  358. package/dist/brep/brep-ops.d.ts +6 -0
  359. package/dist/brep/brep-ops.d.ts.map +1 -1
  360. package/dist/brep/brep-ops.js +11 -2
  361. package/dist/brep/brep-ops.js.map +1 -1
  362. package/dist/brep/brep-topology.d.ts +4 -0
  363. package/dist/brep/brep-topology.d.ts.map +1 -1
  364. package/dist/brep/brep-topology.js +4 -0
  365. package/dist/brep/brep-topology.js.map +1 -1
  366. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  367. package/dist/brep/engine/adapters/brep-mock.js +79 -59
  368. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  369. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  370. package/dist/brep/engine/adapters/brepkit.js +7 -1
  371. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  372. package/dist/brep/engine/adapters/occt.d.ts +15 -7
  373. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  374. package/dist/brep/engine/adapters/occt.js +52 -167
  375. package/dist/brep/engine/adapters/occt.js.map +1 -1
  376. package/dist/brep/engine/primitives.d.ts +93 -130
  377. package/dist/brep/engine/primitives.d.ts.map +1 -1
  378. package/dist/brep/engine/primitives.js +9 -7
  379. package/dist/brep/engine/primitives.js.map +1 -1
  380. package/dist/brep/engine/types.d.ts +14 -1
  381. package/dist/brep/engine/types.d.ts.map +1 -1
  382. package/dist/brep/engine/types.js +11 -1
  383. package/dist/brep/engine/types.js.map +1 -1
  384. package/dist/brep/export/step.d.ts +3 -0
  385. package/dist/brep/export/step.d.ts.map +1 -1
  386. package/dist/brep/export/step.js +7 -1
  387. package/dist/brep/export/step.js.map +1 -1
  388. package/dist/brep/face-evolution.d.ts +8 -0
  389. package/dist/brep/face-evolution.d.ts.map +1 -1
  390. package/dist/brep/face-evolution.js +15 -3
  391. package/dist/brep/face-evolution.js.map +1 -1
  392. package/dist/brep/handle-bridge.d.ts +20 -2
  393. package/dist/brep/handle-bridge.d.ts.map +1 -1
  394. package/dist/brep/handle-bridge.js +25 -2
  395. package/dist/brep/handle-bridge.js.map +1 -1
  396. package/dist/brepkit-kernel/brepkitKernel.d.ts +25 -5
  397. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  398. package/dist/brepkit-kernel/brepkitKernel.js +336 -144
  399. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  400. package/dist/cad-runtime/admit-compat-lib.d.ts +6 -1
  401. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  402. package/dist/cad-runtime/admit-compat-lib.js +5 -1
  403. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  404. package/dist/cad-runtime/backend-dispatch.d.ts +9 -3
  405. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  406. package/dist/cad-runtime/backend-dispatch.js +32 -2
  407. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  408. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  409. package/dist/cad-runtime/direct-executor.js +8 -2
  410. package/dist/cad-runtime/direct-executor.js.map +1 -1
  411. package/dist/cad-runtime/runtime.d.ts +3 -0
  412. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  413. package/dist/cad-runtime/runtime.js +3 -1
  414. package/dist/cad-runtime/runtime.js.map +1 -1
  415. package/dist/define-op.d.ts +18 -2
  416. package/dist/define-op.d.ts.map +1 -1
  417. package/dist/define-op.js +29 -1
  418. package/dist/define-op.js.map +1 -1
  419. package/dist/env-agnostic.d.ts +3 -0
  420. package/dist/env-agnostic.d.ts.map +1 -1
  421. package/dist/env-agnostic.js +7 -0
  422. package/dist/env-agnostic.js.map +1 -1
  423. package/dist/index.d.ts.map +1 -1
  424. package/dist/index.js +3 -4
  425. package/dist/index.js.map +1 -1
  426. package/dist/lang/symbol-table.generated.d.ts +28 -0
  427. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  428. package/dist/lang/symbol-table.generated.js +29 -1
  429. package/dist/lang/symbol-table.generated.js.map +1 -1
  430. package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
  431. package/dist/occt-kernel/highLevelApi.js +6 -3
  432. package/dist/occt-kernel/highLevelApi.js.map +1 -1
  433. package/dist/occt-kernel/hullGeometry.d.ts +31 -0
  434. package/dist/occt-kernel/hullGeometry.d.ts.map +1 -0
  435. package/dist/occt-kernel/hullGeometry.js +319 -0
  436. package/dist/occt-kernel/hullGeometry.js.map +1 -0
  437. package/dist/occt-kernel/hullOps.d.ts +24 -0
  438. package/dist/occt-kernel/hullOps.d.ts.map +1 -0
  439. package/dist/occt-kernel/hullOps.js +52 -0
  440. package/dist/occt-kernel/hullOps.js.map +1 -0
  441. package/dist/occt-kernel/occt-primitives.d.ts +14 -0
  442. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -0
  443. package/dist/occt-kernel/occt-primitives.js +351 -0
  444. package/dist/occt-kernel/occt-primitives.js.map +1 -0
  445. package/dist/occt-kernel/occtKernel.d.ts +14 -6
  446. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  447. package/dist/occt-kernel/occtKernel.js +11 -3
  448. package/dist/occt-kernel/occtKernel.js.map +1 -1
  449. package/dist/occt-kernel/topologyExt.js +2 -2
  450. package/dist/occt-kernel/topologyExt.js.map +1 -1
  451. package/dist/primitives/brep-primitives.d.ts +4 -0
  452. package/dist/primitives/brep-primitives.d.ts.map +1 -1
  453. package/dist/primitives/brep-primitives.js +4 -0
  454. package/dist/primitives/brep-primitives.js.map +1 -1
  455. package/dist/result/bug.d.ts +22 -0
  456. package/dist/result/bug.d.ts.map +1 -0
  457. package/dist/result/bug.js +28 -0
  458. package/dist/result/bug.js.map +1 -0
  459. package/dist/result/errors.d.ts +270 -0
  460. package/dist/result/errors.d.ts.map +1 -0
  461. package/dist/result/errors.js +317 -0
  462. package/dist/result/errors.js.map +1 -0
  463. package/dist/result/kernelErrorTranslation.d.ts +21 -0
  464. package/dist/result/kernelErrorTranslation.d.ts.map +1 -0
  465. package/dist/result/kernelErrorTranslation.js +102 -0
  466. package/dist/result/kernelErrorTranslation.js.map +1 -0
  467. package/dist/result/result.d.ts +213 -0
  468. package/dist/result/result.d.ts.map +1 -0
  469. package/dist/result/result.js +336 -0
  470. package/dist/result/result.js.map +1 -0
  471. package/dist/result/vec3.d.ts +12 -0
  472. package/dist/result/vec3.d.ts.map +1 -0
  473. package/dist/result/vec3.js +14 -0
  474. package/dist/result/vec3.js.map +1 -0
  475. package/dist/runtime-state.d.ts +9 -0
  476. package/dist/runtime-state.d.ts.map +1 -1
  477. package/dist/runtime-state.js.map +1 -1
  478. package/dist/sdk.d.ts +3 -1
  479. package/dist/sdk.d.ts.map +1 -1
  480. package/dist/sdk.js +2 -1
  481. package/dist/sdk.js.map +1 -1
  482. package/dist/shape.d.ts +43 -1
  483. package/dist/shape.d.ts.map +1 -1
  484. package/dist/shape.js +57 -1
  485. package/dist/shape.js.map +1 -1
  486. package/dist/topology/naming/geom-hint.js +1 -1
  487. package/dist/topology/naming/geom-hint.js.map +1 -1
  488. package/dist/topology/naming/score.js +1 -1
  489. package/dist/topology/naming/score.js.map +1 -1
  490. package/package.json +6 -16
@@ -1,19 +1,32 @@
1
1
  /**
2
- * brepkit-kernel/brepkitKernel — brepkit 内核 → faijs BrepEngineApi 适配器(v1 白名单)
2
+ * brepkit-kernel/brepkitKernel — brepkit 内核 → faijs BrepEngineApi 适配器
3
+ *
4
+ * Phase 4(docs/plans/2026-09-24-brep-engine-api-narrowing-native-access.md):
5
+ * 本文件是 L1 契约 `BrepEngineApi` 的 **brepkit 显式对象字面量实现**——与 occt 侧
6
+ * `occt-primitives.ts` 同构:逐方法接线、方言在适配器内消化、零 `unsupported()` 桩。
7
+ *
8
+ * 契约面收窄后 L1 只含 occt/brepkit 双方**语义可对齐**的方法(唯一真源:
9
+ * `api/surface/engine-method-map.json` 的 aligned/dialect 条目)。brepkit 独有
10
+ * 能力(chamfer2d/chamferV2/filletV2/sketch* 族、serializeSolid、meshBoolean、
11
+ * minkowskiSum …)与单方语义(loft、平面 section/split 之外的 splitter 语义…)
12
+ * 都不在本对象里——平台代码经原生面 `getBrepkitKernel()`(D3)访问。
3
13
  *
4
14
  * 设计要点(对应 3d_editor 项目的 weapp-voice-ai-modeling 设计计划 §5):
5
15
  * - 句柄:brepkit u32 句柄与 faijs BrepHandle(number) 同构,直通零转换;
6
16
  * - 拓扑红线:meshShape 用 tessellateSolidGrouped 输出 faceGroups,与三角化几何同源;
7
17
  * - 面溯源:布尔/倒角走 *WithEvolution,映射为 BrepEvolutionData(hash 编码);
8
18
  * - 链纪律:kernel.meshFallbackCount 计数差 > 0 → getMeshFallbackCount 暴露给宿主,
9
- * 由宿主标记 BREP 链中断(不在此层静默处理);
10
- * - v1 白名单之外的方法:显式抛错(报错好于掩盖,禁止空实现假成功)。
19
+ * 由宿主标记 BREP 链中断(不在此层静默处理)。
11
20
  */
12
21
  import { initBrepkitWasm } from './brepkitWasm.js';
13
22
  // ── 句柄桥接:brepkit number 句柄 ↔ BrepHandle(零运行时成本,与 occt 适配器同构) ──
14
23
  const asHandle = (n) => n;
15
24
  const asNum = (h) => h;
16
25
  const arr = (x) => Array.from(x);
26
+ /** 适配器内部的显式失败(替代旧 unsupported 桩:能力缺失一律在静态判定拦截,不在实现体里伪装)。 */
27
+ function fail(detail) {
28
+ throw new Error(`[brepkit-kernel] ${detail}`);
29
+ }
17
30
  /**
18
31
  * brepkit 几何查询返回值归一为 number[]。
19
32
  *
@@ -64,10 +77,6 @@ function toNumArray(v) {
64
77
  }
65
78
  return [];
66
79
  }
67
- /** v1 白名单外的方法统一抛错(携带适配器上下文与 v1 范围说明)。 */
68
- function unsupported(name) {
69
- throw new Error(`[brepkit-kernel] BrepEngineApi.${name} 不在 brepkit 适配器 v1 白名单内(能力表见设计文档 §5.2)。该操作请在 OCCT 链执行,或等待适配器扩展。`);
70
- }
71
80
  /** 面稳定指纹:解析曲面参数 + 面积 → FNV-1a → 取模上界(跨操作可追溯,与句柄无关)。 */
72
81
  function faceFingerprint(kernel, face, upperBound) {
73
82
  let params = '';
@@ -128,9 +137,45 @@ function mapEvolution(kernel, raw, resultHandle, inputFaceHashes, hashUpperBound
128
137
  }
129
138
  /** per-kernel 的 hash↔handle 登记表(fuseWithHistory 溯源对齐用)。 */
130
139
  const hashRegistry = new WeakMap();
140
+ /** 三点外接圆(makeArcEdge 方言消化:occt 吃 3 点,brepkit 吃圆心+轴)。 */
141
+ function circumcircle(a, b, c) {
142
+ const abx = b.x - a.x, aby = b.y - a.y, abz = b.z - a.z;
143
+ const acx = c.x - a.x, acy = c.y - a.y, acz = c.z - a.z;
144
+ const nx = aby * acz - abz * acy;
145
+ const ny = abz * acx - abx * acz;
146
+ const nz = abx * acy - aby * acx;
147
+ const n2 = nx * nx + ny * ny + nz * nz;
148
+ if (n2 < 1e-18)
149
+ fail('makeArcEdge: 3 points are collinear (no circumscribed circle)');
150
+ const ab2 = abx * abx + aby * aby + abz * abz;
151
+ const ac2 = acx * acx + acy * acy + acz * acz;
152
+ // center = a + ( ac2·(ab×n) + ab2·(n×ac) ) / (2·n²)
153
+ const abxnx = aby * nz - abz * ny, abxny = abz * nx - abx * nz, abxnz = abx * ny - aby * nx;
154
+ const nxacx = ny * acz - nz * acy, nxacy = nz * acx - nx * acz, nxacz = nx * acy - ny * acx;
155
+ const denom = 2 * n2;
156
+ const len = Math.sqrt(n2);
157
+ return {
158
+ center: {
159
+ x: a.x + (ac2 * abxnx + ab2 * nxacx) / denom,
160
+ y: a.y + (ac2 * abxny + ab2 * nxacy) / denom,
161
+ z: a.z + (ac2 * abxnz + ab2 * nxacz) / denom,
162
+ },
163
+ axis: { x: nx / len, y: ny / len, z: nz / len },
164
+ };
165
+ }
166
+ /** BrepVec3[] → 扁平 Float64Array(brepkit 坐标数组方言)。 */
167
+ function flattenPoints(points) {
168
+ const out = new Float64Array(points.length * 3);
169
+ for (let i = 0; i < points.length; i++) {
170
+ out[i * 3] = points[i].x;
171
+ out[i * 3 + 1] = points[i].y;
172
+ out[i * 3 + 2] = points[i].z;
173
+ }
174
+ return out;
175
+ }
131
176
  /**
132
- * 创建 brepkit BrepEngineApi 实现(v1 白名单)。
133
- * 与 occt 的 initOcctWasm 同位:返回满足引擎契约的原语集合。
177
+ * 创建 brepkit BrepEngineApi 实现(L1 契约显式对象字面量)。
178
+ * 与 occt 的 createOcctPrimitives 同位:返回满足引擎契约的原语集合。
134
179
  * @returns a promise resolving to the BrepEngineApi implementation plus brepkit-specific
135
180
  * diagnostics (`getMeshFallbackCount`).
136
181
  */
@@ -138,8 +183,9 @@ export async function createBrepkitPrimitives() {
138
183
  const kernel = await initBrepkitWasm();
139
184
  liveKernel = kernel;
140
185
  let lastFallbackCount = 0;
141
- // 已知面句柄集合:getSubShapes(shape,'face') 返回的面在此登记;
142
- // getSubShapes(handle,'edge'/'vertex') 据此分发到 face 级或 solid 级 API。
186
+ // 已知面句柄集合:getSubShapes(shape,'face') / makeRectangle / makeFace / buildTriFace
187
+ // 返回的面在此登记;extrude/revolveVec 的 face 输入断言、getSubShapes 的
188
+ // edge/vertex 分发都据此判定(brepkit 无 shape-type 分类 API,见下方注释)。
143
189
  const knownFaces = new Set();
144
190
  const readFallback = () => {
145
191
  try {
@@ -151,9 +197,18 @@ export async function createBrepkitPrimitives() {
151
197
  };
152
198
  /** 布尔类操作后登记回退计数差(§5.4:宿主每步读取,>0 即链中断)。 */
153
199
  const trackFallback = (r) => { lastFallbackCount = readFallback(); return r; };
200
+ const faceCenterOfMass = (face) => {
201
+ // brepkit 无 per-face 质心 API;用 UV 域中点在曲面上求值作为面中心近似
202
+ // (与 OCCT 路径的「面中心用于命名/拾取锚点」语义一致,不追求精确质心)。
203
+ const d = toNumArray(kernel.getSurfaceDomain(asNum(face)));
204
+ const u = ((d[0] ?? 0) + (d[1] ?? 1)) / 2;
205
+ const v = ((d[2] ?? 0) + (d[3] ?? 1)) / 2;
206
+ return vec3Of(toNumArray(kernel.evaluateSurface(asNum(face), u, v)));
207
+ };
154
208
  const api = {
155
209
  // ── 生命周期 ──
156
210
  release(_shape) { },
211
+ dispose(_shape) { },
157
212
  /** 内核级诊断:距上次读取的 mesh 布尔回退计数差(>0 = BREP 链已中断)。 */
158
213
  getMeshFallbackCount() {
159
214
  const now = readFallback();
@@ -166,45 +221,113 @@ export async function createBrepkitPrimitives() {
166
221
  makeBoxFromCorners(corner1, corner2) {
167
222
  const dx = Math.abs(corner2.x - corner1.x), dy = Math.abs(corner2.y - corner1.y), dz = Math.abs(corner2.z - corner1.z);
168
223
  const h = kernel.makeBox(dx, dy, dz);
169
- return asHandle(kernel.transformSolid(h, toKernelMatrix(translationMatrix(Math.min(corner1.x, corner2.x), Math.min(corner1.y, corner2.y), Math.min(corner1.z, corner2.z)))));
224
+ // ⚠️ transformSolid 是「原地修改、返回 undefined」——makeBox 的句柄本身即新实体,
225
+ // 直接原地变换后返回 h;若写 `asHandle(transformSolid(...))` 会拿到 undefined 句柄
226
+ // (2026-09-25 实证:导致 splitBrep 基于半空间盒的 common/cut 全部失效)。
227
+ kernel.transformSolid(h, toKernelMatrix(translationMatrix(Math.min(corner1.x, corner2.x), Math.min(corner1.y, corner2.y), Math.min(corner1.z, corner2.z))));
228
+ return asHandle(h);
170
229
  },
171
230
  makeCylinder(radius, height) { return asHandle(kernel.makeCylinder(radius, height)); },
172
231
  makeSphere(radius) { return asHandle(kernel.makeSphere(radius, 32)); },
173
232
  makeCone(r1, r2, height) { return asHandle(kernel.makeCone(r1, r2, height)); },
174
- makeRectangle(_width, _height) { return unsupported('makeRectangle'); },
233
+ makeRectangle(width, height) {
234
+ const f = kernel.makeRectangle(width, height);
235
+ knownFaces.add(f);
236
+ return asHandle(f);
237
+ },
238
+ makeEllipsoid(rx, ry, rz) { return asHandle(kernel.makeEllipsoid(rx, ry, rz)); },
239
+ makeTorus(majorRadius, minorRadius) { return asHandle(kernel.makeTorus(majorRadius, minorRadius, 64)); },
240
+ makeVertex(x, y, z) { return asHandle(kernel.makeVertex(x, y, z)); },
175
241
  // ── 造型运算 ──
176
- extrude(_shape, _dx, _dy, _dz) { return unsupported('extrude'); }, // ⚠️ wasm extrude(face, dir, distance) 语义不同 → 保持 unsupported
177
- loft(_wires, _isSolid, _ruled) { return unsupported('loft'); },
242
+ extrude(shape, dx, dy, dz) {
243
+ // 方言归一(§3.6-1):L1 口径是挤出向量;brepkit 原生吃 (face, dir, distance)。
244
+ const s = asNum(shape);
245
+ if (!knownFaces.has(s)) {
246
+ fail('extrude requires a face input (plan §3.6-1); got a handle that is not a known face');
247
+ }
248
+ const len = Math.hypot(dx, dy, dz);
249
+ if (len === 0)
250
+ fail('extrude: zero-length extrusion vector');
251
+ return asHandle(kernel.extrude(s, dx / len, dy / len, dz / len, len));
252
+ },
253
+ revolveVec(shape, center, direction, angleDeg) {
254
+ // 方言归一:brepkit revolve 只吃 face(与 extrude 同族断言)。
255
+ const s = asNum(shape);
256
+ if (!knownFaces.has(s)) {
257
+ fail('revolveVec requires a face input; got a handle that is not a known face');
258
+ }
259
+ return asHandle(kernel.revolve(s, center.x, center.y, center.z, direction.x, direction.y, direction.z, angleDeg));
260
+ },
261
+ sew(shapesList, tolerance) {
262
+ return asHandle(kernel.sewFaces(Uint32Array.from(shapesList.map(asNum)), tolerance ?? 1e-6));
263
+ },
264
+ sewAndSolidify(faces, _tolerance) {
265
+ // brepkit 的 makeSolid 即「缝合并固化成实体」(sewFaces + 建 solid)。
266
+ return asHandle(kernel.makeSolid(Uint32Array.from(faces.map(asNum))));
267
+ },
268
+ shell(solid, facesToRemove, thickness, _tolerance) {
269
+ // brepkit 参数序 (solid, thickness, open_faces);tolerance 内核固定。
270
+ return asHandle(kernel.shell(asNum(solid), thickness, Uint32Array.from(facesToRemove.map(asNum))));
271
+ },
272
+ hullFromPoints(points, _tolerance) {
273
+ return asHandle(kernel.convexHull(flattenPoints(points)));
274
+ },
178
275
  // ── 布尔与分割 ──
179
276
  fuse(a, b) { return asHandle(trackFallback(kernel.fuse(asNum(a), asNum(b)))); },
180
277
  cut(a, b) { return asHandle(trackFallback(kernel.cut(asNum(a), asNum(b)))); },
181
- common(a, b) { return asHandle(trackFallback(kernel.common(asNum(a), asNum(b)))); },
182
- intersect(a, b) { return asHandle(trackFallback(kernel.common(asNum(a), asNum(b)))); },
183
- section(_a, _b) { return unsupported('section'); }, // ⚠️ wasm section(solid+平面) 语义不同 → 保持 unsupported
184
- fuseAll(shapes) {
185
- return asHandle(trackFallback(kernel.fuseAll(Int32Array.from(shapes.map(asNum)))));
278
+ common(a, b) {
279
+ // brepkit 无 `common` 原生名;交集语义由 `intersect` 承担(method-map: dialect)。
280
+ return asHandle(trackFallback(kernel.intersect(asNum(a), asNum(b))));
281
+ },
282
+ intersect(a, b) { return asHandle(trackFallback(kernel.intersect(asNum(a), asNum(b)))); },
283
+ fuseAll(shapesList) {
284
+ return asHandle(trackFallback(kernel.fuseAll(Int32Array.from(shapesList.map(asNum)))));
285
+ },
286
+ sectionByPlane(shape, point, normal) {
287
+ // brepkit 原生 section(solid, plane) 返回剖面 face 句柄组(§3.6-2 新中立名)。
288
+ return arr(kernel.section(asNum(shape), point.x, point.y, point.z, normal.x, normal.y, normal.z)).map(asHandle);
289
+ },
290
+ splitByPlane(shape, point, normal) {
291
+ const parts = arr(kernel.split(asNum(shape), point.x, point.y, point.z, normal.x, normal.y, normal.z));
292
+ if (parts.length !== 2) {
293
+ fail(`splitByPlane: expected 2 solids, got ${parts.length}`);
294
+ }
295
+ // 法向正侧 = positive(§3.7):按质心在平面法向的投影分类。
296
+ const originDot = point.x * normal.x + point.y * normal.y + point.z * normal.z;
297
+ const side = (h) => {
298
+ const c = toNumArray(kernel.centerOfMass(h, 0.05));
299
+ return (c[0] ?? 0) * normal.x + (c[1] ?? 0) * normal.y + (c[2] ?? 0) * normal.z - originDot;
300
+ };
301
+ const [a, b] = parts;
302
+ return side(a) >= side(b)
303
+ ? { positive: asHandle(a), negative: asHandle(b) }
304
+ : { positive: asHandle(b), negative: asHandle(a) };
186
305
  },
187
- // ── 倒角与圆角 ──
306
+ // ── 倒角与圆角(Q7:只对齐等距 + 距角两种粒度)──
188
307
  chamfer(solid, edges, distance) {
189
- return asHandle(trackFallback(kernel.chamfer(asNum(solid), Int32Array.from(edges.map(asNum)), distance)));
308
+ return asHandle(trackFallback(kernel.chamfer(asNum(solid), Uint32Array.from(edges.map(asNum)), distance)));
190
309
  },
191
310
  chamferDistAngle(solid, edges, distance, angleDeg) {
192
- return asHandle(trackFallback(kernel.chamferDistanceAngle(asNum(solid), Int32Array.from(edges.map(asNum)), distance, angleDeg)));
311
+ // 方言映射:L1 chamferDistAngle ↔ brepkit chamferDistanceAngle。
312
+ // ⚠️ 单位方言:L1 口径是**度**(`AddDA(distance, angleDeg, E, F)`),brepkit 内核吃**弧度**
313
+ // (2026-09-25 实证:传 45 抛 "angle must be less than π/2";传 π/4 正常倒角)。
314
+ const angleRad = (angleDeg * Math.PI) / 180;
315
+ return asHandle(trackFallback(kernel.chamferDistanceAngle(asNum(solid), Uint32Array.from(edges.map(asNum)), distance, angleRad)));
193
316
  },
194
317
  fillet(solid, edges, radius) {
195
- return asHandle(trackFallback(kernel.fillet(asNum(solid), Int32Array.from(edges.map(asNum)), radius)));
318
+ return asHandle(trackFallback(kernel.fillet(asNum(solid), Uint32Array.from(edges.map(asNum)), radius)));
196
319
  },
197
320
  filletVariable(solid, edge, startRadius, endRadius) {
198
- return asHandle(trackFallback(kernel.filletVariable(asNum(solid), asNum(edge), startRadius, endRadius)));
321
+ // 方言映射:L1 filletVariable(solid, edge, startRadius, endRadius)(单边变半径)
322
+ // ↔ brepkit filletVariable(solid, json) 吃**序列** `[{edge, radius1, radius2}, ...]`。
323
+ // ⚠️ 直接传 4 个位置参数会触发 wasm memory out of bounds(2026-09-25 实证)。
324
+ const spec = JSON.stringify([{ edge: asNum(edge), radius1: startRadius, radius2: endRadius }]);
325
+ return asHandle(trackFallback(kernel.filletVariable(asNum(solid), spec)));
199
326
  },
200
327
  filletWithHistory(solid, edges, radius, inputFaceHashes, hashUpperBound) {
201
328
  const raw = kernel.filletWithEvolution(asNum(solid), Int32Array.from(edges.map(asNum)), radius);
202
329
  return mapEvolution(kernel, raw, JSON.parse(raw).solid, inputFaceHashes, hashUpperBound);
203
330
  },
204
- chamferWithHistory(_solid, _edges, _distance, _inputFaceHashes, _hashUpperBound) {
205
- // brepkit 无 chamferWithEvolution → 等距倒角演化不支持,诚实报错(能力表 evolution 仅覆盖 fuse/cut/fillet)
206
- return unsupported('chamferWithHistory');
207
- },
208
331
  // ── 变换 ──
209
332
  // ⚠️ brepkit 的 transformSolid 是「原地修改、返回 undefined」——必须先 copySolid
210
333
  // 复制出新句柄再变换,否则会篡改调用方手里的原实体(单测 2026-09-19 实证)。
@@ -231,20 +354,33 @@ export async function createBrepkitPrimitives() {
231
354
  kernel.transformSolid(c, toKernelMatrix(matrix));
232
355
  return asHandle(c);
233
356
  },
357
+ locate(shape, matrix) {
358
+ const c = kernel.copySolid(asNum(shape));
359
+ kernel.transformSolid(c, toKernelMatrix(matrix));
360
+ return asHandle(c);
361
+ },
234
362
  generalTransform(shape, matrix) {
235
363
  const c = kernel.copySolid(asNum(shape));
236
364
  kernel.transformSolid(c, toKernelMatrix(matrix));
237
365
  return asHandle(c);
238
366
  },
239
367
  copy(shape) { return asHandle(kernel.copySolid(asNum(shape))); },
240
- // ── 阵列(Phase 2:brepkit wasm 已导出 linearPattern/circularPattern/gridPattern) ──
241
- // brepkit wasm 的 pattern 内核函数都返回 compound(含全部副本,README「Returns a
242
- // compound handle containing all copies」实证)→ 经 getCompoundSolids 拆成数组。
368
+ copyShape(shape) { return asHandle(kernel.copySolid(asNum(shape))); },
369
+ composeTransform(m1, m2) {
370
+ // 方言:L1 是 3×4 行主序 12 元素;brepkit composeTransforms 吃/回 4×4 16 元素。
371
+ const r = kernel.composeTransforms(Float64Array.from(toKernelMatrix(m1)), Float64Array.from(toKernelMatrix(m2)));
372
+ return Array.from(r).slice(0, 12);
373
+ },
374
+ mirror(shape, point, normal) {
375
+ return asHandle(kernel.mirror(asNum(shape), point.x, point.y, point.z, normal.x, normal.y, normal.z));
376
+ },
377
+ // ── 阵列 ──
378
+ // brepkit wasm 的 pattern 内核函数都返回 compound(含全部副本)→ 经 getCompoundSolids 拆成数组。
243
379
  linearPattern(shape, direction, spacing, count) {
244
380
  const compound = kernel.linearPattern(asNum(shape), direction.x, direction.y, direction.z, spacing, count);
245
381
  return arr(kernel.getCompoundSolids(compound)).map(asHandle);
246
382
  },
247
- circularPattern(shape, center, axis, angleStep, count) {
383
+ circularPattern(shape, _center, axis, _angleStep, count) {
248
384
  // ⚠️ brepkit wasm circularPattern(solid, ax, ay, az, count) 无 center/angle 参数:
249
385
  // 固定整圆均分(每份 360°/count)。fullAngle=360 时与 vendored/occt 语义一致;
250
386
  // 其它角度跨度无法表达(语义限制记录于此,parity 测试用整圆)。
@@ -258,23 +394,50 @@ export async function createBrepkitPrimitives() {
258
394
  makeLineEdge(start, end) {
259
395
  return asHandle(kernel.makeLineEdge(start.x, start.y, start.z, end.x, end.y, end.z));
260
396
  },
261
- makeArcEdge(_start, _mid, _end) { return unsupported('makeArcEdge'); },
262
- makeBezierEdge(_controlPoints) { return unsupported('makeBezierEdge'); },
397
+ makeArcEdge(start, mid, end) {
398
+ // 方言消化:occt 吃 3 点;brepkit makeCircleArc3d 吃 (start,end,center,axis)。
399
+ const { center, axis } = circumcircle(start, mid, end);
400
+ return asHandle(kernel.makeCircleArc3d(start.x, start.y, start.z, end.x, end.y, end.z, center.x, center.y, center.z, axis.x, axis.y, axis.z));
401
+ },
402
+ makeBezierEdge(controlPoints) {
403
+ // 方言消化:L1 吃控制点(Bezier);brepkit 原生 makeNurbsEdge 吃
404
+ // (start,end,degree,knots,control_points,weights)。Bezier = degree n-1 的
405
+ // clamped NURBS,knots = [0]×n + [1]×n,weights 全 1。
406
+ const n = controlPoints.length;
407
+ if (n < 2)
408
+ fail('makeBezierEdge: need at least 2 control points');
409
+ const degree = n - 1;
410
+ const knots = new Float64Array(2 * n);
411
+ for (let i = n; i < 2 * n; i++)
412
+ knots[i] = 1;
413
+ const weights = new Float64Array(n).fill(1);
414
+ const first = controlPoints[0];
415
+ const last = controlPoints[n - 1];
416
+ return asHandle(kernel.makeNurbsEdge(first.x, first.y, first.z, last.x, last.y, last.z, degree, knots, flattenPoints(controlPoints), weights));
417
+ },
418
+ makeCircleEdge(center, normal, radius) {
419
+ return asHandle(kernel.makeCircleEdge(center.x, center.y, center.z, normal.x, normal.y, normal.z, radius));
420
+ },
263
421
  // ── 拓扑构造 ──
264
422
  makeWire(edges) {
265
423
  return asHandle(kernel.makeWire(Int32Array.from(edges.map(asNum)), false));
266
424
  },
267
- makeFace(wire) { return asHandle(kernel.makeFaceFromWire(asNum(wire))); },
268
- makeCompound(shapes) {
269
- return asHandle(kernel.makeCompound(Int32Array.from(shapes.map(asNum))));
425
+ makeFace(wire) {
426
+ const f = kernel.makeFaceFromWire(asNum(wire));
427
+ knownFaces.add(f);
428
+ return asHandle(f);
270
429
  },
271
- sewAndSolidify(faces, tolerance) {
272
- return asHandle(kernel.sewFaces(Int32Array.from(faces.map(asNum)), tolerance ?? 1e-6));
430
+ makeCompound(shapesList) {
431
+ return asHandle(kernel.makeCompound(Int32Array.from(shapesList.map(asNum))));
273
432
  },
274
- buildTriFace(_a, _b, _c) { return unsupported('buildTriFace'); },
275
433
  addHolesInFace(face, holeWires) {
276
434
  return asHandle(kernel.addHolesToFace(asNum(face), Int32Array.from(holeWires.map(asNum))));
277
435
  },
436
+ buildTriFace(a, b, c) {
437
+ const f = kernel.makePolygon(flattenPoints([a, b, c]));
438
+ knownFaces.add(f);
439
+ return asHandle(f);
440
+ },
278
441
  // ── 三角化(BREP→mesh 唯一出口) ──
279
442
  meshShape(shape, options) {
280
443
  const deflection = options?.linearDeflection ?? 0.1;
@@ -369,23 +532,13 @@ export async function createBrepkitPrimitives() {
369
532
  }
370
533
  }
371
534
  else {
372
- return unsupported(`getSubShapes(${type})`);
535
+ fail(`getSubShapes(${type}): unsupported sub-shape type`);
373
536
  }
374
537
  return list.map(asHandle);
375
538
  },
376
- queryBatch(shapes) {
377
- return shapes.map(h => {
378
- try {
379
- return { area: Number(kernel.faceArea(asNum(h))) };
380
- }
381
- catch {
382
- return { area: 0 };
383
- }
384
- });
385
- },
386
539
  subShapeHashes(shape, type, hashUpperBound) {
387
540
  if (type !== 'face')
388
- return unsupported(`subShapeHashes(${type})`);
541
+ fail(`subShapeHashes(${type}): only 'face' is supported by brepkit`);
389
542
  const faces = arr(kernel.getSolidFaces(asNum(shape)));
390
543
  const hashes = faces.map(f => faceFingerprint(kernel, f, hashUpperBound));
391
544
  // 登记 hash↔handle(fuseWithHistory 溯源对齐依赖此表)
@@ -406,6 +559,16 @@ export async function createBrepkitPrimitives() {
406
559
  return false;
407
560
  }
408
561
  },
562
+ shapeType(shape) {
563
+ try {
564
+ const s = arr(kernel.getSolidFaces(asNum(shape)));
565
+ const f = arr(kernel.getFaces(asNum(shape)));
566
+ return s.length > 0 ? 'SOLID' : f.length > 0 ? 'FACE' : 'COMPOUND';
567
+ }
568
+ catch {
569
+ return 'COMPOUND';
570
+ }
571
+ },
409
572
  shapeOrientation(shape) {
410
573
  try {
411
574
  return String(kernel.getShapeOrientation(asNum(shape)));
@@ -414,6 +577,16 @@ export async function createBrepkitPrimitives() {
414
577
  return 'forward';
415
578
  }
416
579
  },
580
+ edgeToFaceMap(shape) {
581
+ // brepkit 返回 JSON 字符串 {"edgeId":[faceId,...]};L1 契约是 unknown(调用方自解析)。
582
+ return kernel.edgeToFaceMap(asNum(shape));
583
+ },
584
+ adjacentFaces(shape, face) {
585
+ return arr(kernel.adjacentFaces(asNum(shape), asNum(face))).map(asHandle);
586
+ },
587
+ sharedEdges(a, b) {
588
+ return arr(kernel.sharedEdges(asNum(a), asNum(b))).map(asHandle);
589
+ },
417
590
  // ── 几何求值 ──
418
591
  curveType(edge) { return String(kernel.getEdgeCurveType(asNum(edge))); },
419
592
  curvePointAtParam(edge, param) {
@@ -472,12 +645,7 @@ export async function createBrepkitPrimitives() {
472
645
  const d = toNumArray(kernel.getSurfaceDomain(asNum(face)));
473
646
  return { uMin: d[0] ?? 0, uMax: d[1] ?? 1, vMin: d[2] ?? 0, vMax: d[3] ?? 1 };
474
647
  },
475
- getSurfaceCenterOfMass(face) {
476
- // brepkit 无 per-face 质心 API;用 UV 域中点在曲面上求值作为面中心近似
477
- // (与 OCCT 路径的「面中心用于命名/拾取锚点」语义一致,不追求精确质心)。
478
- const b = this.uvBounds(face);
479
- return this.pointOnSurface(face, (b.uMin + b.uMax) / 2, (b.vMin + b.vMax) / 2);
480
- },
648
+ surfaceCenterOfMass: faceCenterOfMass,
481
649
  getFaceCylinderData(face) {
482
650
  try {
483
651
  const p = JSON.parse(kernel.getAnalyticSurfaceParams(asNum(face)));
@@ -496,6 +664,25 @@ export async function createBrepkitPrimitives() {
496
664
  catch { /* 非 Nurbs 边 */ }
497
665
  return null;
498
666
  },
667
+ interpolatePoints(points, degree) {
668
+ return asHandle(kernel.interpolatePoints(flattenPoints(points), degree));
669
+ },
670
+ defeature(shape, faces) {
671
+ return asHandle(kernel.defeature(asNum(shape), Uint32Array.from(faces.map(asNum))));
672
+ },
673
+ draft(shape, faces, pull, neutral, angleDeg) {
674
+ return asHandle(kernel.draft(asNum(shape), Uint32Array.from(faces.map(asNum)), pull.x, pull.y, pull.z, neutral.x, neutral.y, neutral.z, angleDeg));
675
+ },
676
+ removeHolesFromFace(face) {
677
+ return asHandle(kernel.removeHolesFromFace(asNum(face)));
678
+ },
679
+ reverseShape(shape) {
680
+ return asHandle(kernel.reverseShape(asNum(shape)));
681
+ },
682
+ projectEdges(shape, origin, direction, xAxis, hiddenLines, deflection) {
683
+ // brepkit 返回 JSON 字符串 {"visible":[[x,y,…]],"hidden":[[…]]};L1 契约是 unknown。
684
+ return kernel.projectEdges(asNum(shape), origin.x, origin.y, origin.z, direction.x, direction.y, direction.z, xAxis.x, xAxis.y, xAxis.z, hiddenLines, deflection);
685
+ },
499
686
  // ── 测量 ──
500
687
  getBoundingBox(shape, _useTriangulation) {
501
688
  const b = kernel.boundingBox(asNum(shape));
@@ -506,29 +693,88 @@ export async function createBrepkitPrimitives() {
506
693
  // centerOfMass 返回 Float64Array [x,y,z](非 JSON 字符串)
507
694
  return vec3Of(toNumArray(kernel.centerOfMass(asNum(shape), 0.05)));
508
695
  },
696
+ getSurfaceArea(shape) {
697
+ // 方言映射:L1 getSurfaceArea ↔ brepkit surfaceArea(solid, deflection)。
698
+ return Number(kernel.surfaceArea(asNum(shape), 0.05));
699
+ },
700
+ getLength(shape) {
701
+ // 方言映射:L1 getLength ↔ brepkit edgeLength(edge) / wireLength(wire)。
702
+ // wire 与 edge 的入参差异在适配器内判别(D6):edgeLength 只吃 edge 句柄,
703
+ // 对 wire 会抛错;据此分发,两条路径都失败时如实抛出(不静默返回 0)。
704
+ const s = asNum(shape);
705
+ try {
706
+ kernel.getEdgeCurveType(s);
707
+ return Number(kernel.edgeLength(s));
708
+ }
709
+ catch {
710
+ return Number(kernel.wireLength(s));
711
+ }
712
+ },
509
713
  // ── 校验与修复 ──
510
- isValid(_shape) { return unsupported('isValid'); },
511
- unifySameDomain(shape) { return shape; /* brepkit 无对应 API;恒等返回(不丢句柄) */ },
512
- healSolid(shape, _tolerance) { return asHandle(kernel.healSolid(asNum(shape))); },
513
- fixShape(shape) { return asHandle(kernel.healSolid(asNum(shape))); },
514
- fixFaceOrientations(shape) { return asHandle(kernel.fixFaceOrientations(asNum(shape))); },
515
- removeDegenerateEdges(_shape) { return unsupported('removeDegenerateEdges'); },
714
+ // ⚠️ brepkit 的修复类内核函数全部是「**原地修改入参实体 + 返回修复计数**」,不是返回新句柄:
715
+ // healSolid(solid) → 修复的问题数
716
+ // fixFaceOrientations(solid) → 修复的面数
717
+ // unifyFaces(solid) → 合并删除的面数
718
+ // removeDegenerateEdges(s,tol) → 删除的边数
719
+ // repairSolid(solid) → 修复后剩余错误数
720
+ // 直接 `asHandle(kernel.healSolid(...))` 会把计数(常见为 0)当成句柄,得到无效实体
721
+ // (2026-09-25 实证)。正确适配:先 copySolid 保护调用方原实体,再原地修复副本,返回副本句柄。
722
+ isValid(shape) {
723
+ // brepkit validateSolid 返回错误数(0 = 有效)。
724
+ return Number(kernel.validateSolid(asNum(shape))) === 0;
725
+ },
726
+ unifySameDomain(shape) {
727
+ const c = kernel.copySolid(asNum(shape));
728
+ kernel.unifyFaces(c);
729
+ return asHandle(c);
730
+ },
731
+ healSolid(shape, _tolerance) {
732
+ const c = kernel.copySolid(asNum(shape));
733
+ kernel.healSolid(c);
734
+ return asHandle(c);
735
+ },
736
+ fixShape(shape) {
737
+ const c = kernel.copySolid(asNum(shape));
738
+ kernel.healSolid(c);
739
+ return asHandle(c);
740
+ },
741
+ fixFaceOrientations(shape) {
742
+ const c = kernel.copySolid(asNum(shape));
743
+ kernel.fixFaceOrientations(c);
744
+ return asHandle(c);
745
+ },
746
+ removeDegenerateEdges(shape, tolerance) {
747
+ const c = kernel.copySolid(asNum(shape));
748
+ kernel.removeDegenerateEdges(c, tolerance ?? 1e-6);
749
+ return asHandle(c);
750
+ },
516
751
  // ── IO ──
517
752
  importStep(data) {
518
- const text = typeof data === 'string' ? data : new TextDecoder().decode(data);
519
- return asHandle(kernel.importStep(text));
753
+ // ⚠️ brepkit importStep 吃 **Uint8Array**(不是字符串),返回 **Uint32Array**(文件内可含多个 solid)。
754
+ // L1 契约是单 BrepHandle:0 个 → fail;1 个 → 直通;多个 → 合成 compound(2026-09-25 实证)。
755
+ const bytes = typeof data === 'string' ? new TextEncoder().encode(data) : new Uint8Array(data);
756
+ const solids = arr(kernel.importStep(bytes));
757
+ if (solids.length === 0)
758
+ fail('importStep: kernel returned no solid');
759
+ return asHandle(solids.length === 1 ? solids[0] : kernel.makeCompound(Uint32Array.from(solids)));
520
760
  },
521
761
  exportStep(shape) {
522
762
  // brepkit exportStep 返回 UTF-8 字节(Uint8Array),需解码为 STEP 文本(2026-09-19 实测)
523
763
  const bytes = kernel.exportStep(asNum(shape));
524
764
  return typeof bytes === 'string' ? bytes : new TextDecoder().decode(bytes);
525
765
  },
526
- importStl(_data) { return unsupported('importStl'); },
766
+ importStl(data) {
767
+ const bytes = typeof data === 'string' ? new TextEncoder().encode(data) : new Uint8Array(data);
768
+ return asHandle(kernel.importStl(bytes));
769
+ },
527
770
  fromBREP(data) {
528
- const bytes = Uint8Array.from(atobPolyfill(data));
529
- return asHandle(kernel.deserializeSolid(bytes));
771
+ // ⚠️ brepkit fromBREP 吃字符串(STEP 文本或 toBREP/toBrepJson 输出,内核自动判别),
772
+ // 与 serializeSolid/deserializeSolid 的**二进制 arena** 是两套机制。
773
+ // 旧实现误用 `deserializeSolid(atob(data))`:base64 解码破坏了 STEP 文本 → 往返必失败
774
+ // (2026-09-25 实证:fromBREP(STEP)、fromBREP(toBREP)、fromBREP(toBrepJson) 均成功)。
775
+ return asHandle(kernel.fromBREP(data));
530
776
  },
531
- // ── 面演化(可选能力槽) ──
777
+ // ── 面演化(L1 三员 + filletWithHistory,双方都有对齐实现) ──
532
778
  cutWithHistory(a, b, inputFaceHashes, hashUpperBound) {
533
779
  const raw = kernel.cutWithEvolution(asNum(a), asNum(b));
534
780
  return mapEvolution(kernel, raw, JSON.parse(raw).solid, inputFaceHashes, hashUpperBound);
@@ -537,73 +783,10 @@ export async function createBrepkitPrimitives() {
537
783
  const raw = kernel.fuseWithEvolution(asNum(a), asNum(b));
538
784
  return mapEvolution(kernel, raw, JSON.parse(raw).solid, inputFaceHashes, hashUpperBound);
539
785
  },
540
- intersectWithHistory(_a, _b, _inputFaceHashes, _hashUpperBound) {
541
- return unsupported('intersectWithHistory');
542
- },
543
- // Phase 0.1 补齐的 7 个:brepkit 适配器 v1 未实现 —— 如实抛错,不伪造。
544
- // ⚠️ 这些桩**不能**被当作"已实现"来探测:`typeof api.xWithHistory === 'function'`
545
- // 恒为真。Phase 0.2 起适配器的 `evolution` 是逐核函数**名单**
546
- // (`adapters/brepkit.ts` = ['fuse','cut','fillet']),名单才是唯一真相来源;
547
- // 声明多写一项 = 让该 op 静默通过静态判定后死在这些桩上(红线违规)。
548
- translateWithHistory(_shape, _dx, _dy, _dz, _inputFaceHashes, _hashUpperBound) {
549
- return unsupported('translateWithHistory');
550
- },
551
- rotateWithHistory(_shape, _axis, _angleRad, _inputFaceHashes, _hashUpperBound) {
552
- return unsupported('rotateWithHistory');
553
- },
554
- mirrorWithHistory(_shape, _point, _normal, _inputFaceHashes, _hashUpperBound) {
555
- return unsupported('mirrorWithHistory');
556
- },
557
- scaleWithHistory(_shape, _center, _factor, _inputFaceHashes, _hashUpperBound) {
558
- return unsupported('scaleWithHistory');
559
- },
560
- shellWithHistory(_solid, _faces, _thickness, _tolerance, _inputFaceHashes, _hashUpperBound) {
561
- return unsupported('shellWithHistory');
562
- },
563
- offsetWithHistory(_solid, _distance, _tolerance, _inputFaceHashes, _hashUpperBound) {
564
- return unsupported('offsetWithHistory');
565
- },
566
- thickenWithHistory(_shape, _thickness, _tolerance, _inputFaceHashes, _hashUpperBound) {
567
- return unsupported('thickenWithHistory');
786
+ intersectWithHistory(a, b, inputFaceHashes, hashUpperBound) {
787
+ const raw = kernel.intersectWithEvolution(asNum(a), asNum(b));
788
+ return mapEvolution(kernel, raw, JSON.parse(raw).solid, inputFaceHashes, hashUpperBound);
568
789
  },
569
- // ── XCAF 装配(v1 关闭) ──
570
- createXCAFDocument() { return unsupported('createXCAFDocument'); },
571
- importXCAFFromSTEP(_stepData) { return unsupported('importXCAFFromSTEP'); },
572
- // ── Phase 3 登记方法(capability-map 64 方法收口):真实现 3 个(wasm 有对应导出,
573
- // 命名映射),其余如实 unsupported——能力表不声明,静态判定拦截 ──
574
- boundingBox(shape) { return kernel.getBoundingBox(asNum(shape)); },
575
- surfaceCenterOfMass(face) { return kernel.getSurfaceCenterOfMass(asNum(face)); },
576
- dispose(_shape) { },
577
- shapeType(_shape) { return unsupported('shapeType'); },
578
- isNull(_shape) { return unsupported('isNull'); },
579
- iterShapes(_shape) { return unsupported('iterShapes'); },
580
- locate(_shape, _matrix) { return unsupported('locate'); },
581
- copyShape(_shape) { return unsupported('copyShape'); },
582
- downcast(_shape, _targetType) { return unsupported('downcast'); },
583
- composeTransform(_m1, _m2) { return unsupported('composeTransform'); },
584
- buildExtrusionLaw(_profile, _length, _endFactor) { return unsupported('buildExtrusionLaw'); },
585
- buildEdgeOnSurface(_curve, _surface) { return unsupported('buildEdgeOnSurface'); },
586
- healFace(_shape, _tolerance) { return unsupported('healFace'); },
587
- healWire(_shape, _tolerance) { return unsupported('healWire'); },
588
- fixSelfIntersection(_wire) { return unsupported('fixSelfIntersection'); },
589
- hullFromPoints(_points, _tolerance) { return unsupported('hullFromPoints'); },
590
- loftAdvanced(_wires, _options) { return unsupported('loftAdvanced'); },
591
- makeEllipsoid(rx, ry, rz) { return asHandle(kernel.makeEllipsoid(rx, ry, rz)); }, // Phase 3: wasm 同签名真实现(brepkit-wasm.d.ts:1354)
592
- makeFaceOnSurface(_face, _wire) { return unsupported('makeFaceOnSurface'); },
593
- makeTorus(majorRadius, minorRadius) { return asHandle(kernel.makeTorus(majorRadius, minorRadius, 64)); }, // Phase 3: wasm 真实现(segments 固定 64,BrepEngineApi 不暴露)
594
- makeVertex(x, y, z) { return asHandle(kernel.makeVertex(x, y, z)); }, // Phase 3: wasm 同签名真实现
595
- makeWireFromMixed(_items) { return unsupported('makeWireFromMixed'); },
596
- mirror(shape, point, normal) { return asHandle(kernel.mirror(asNum(shape), point.x, point.y, point.z, normal.x, normal.y, normal.z)); }, // Phase 3: wasm 真实现
597
- revolveVec(_shape, _center, _direction, _angleDeg) { return unsupported('revolveVec'); },
598
- sew(_shapes, _tolerance) { return unsupported('sew'); },
599
- shell(solid, facesToRemove, thickness, _tolerance) { return asHandle(kernel.shell(asNum(solid), thickness, Uint32Array.from(facesToRemove.map(asNum)))); }, // Phase 3: wasm 真实现(tolerance 忽略)
600
- simplePipe(_profile, _spine) { return unsupported('simplePipe'); },
601
- simplify(_shape) { return unsupported('simplify'); },
602
- split(_shape, _tools) { return unsupported('split'); }, // ⚠️ wasm split 是平面分割(solid+平面参数),与 BrepEngineApi 工具实体分割语义不匹配 → 保持 unsupported
603
- sweepPipeShell(_profile, _spine, _freenet, _smooth) { return unsupported('sweepPipeShell'); },
604
- generalTransformNonOrthogonal(_shape, _matrix) { return unsupported('generalTransformNonOrthogonal'); },
605
- generalTransformWithHistory(_shape, _matrix, _inputFaceHashes, _hashUpperBound) { return unsupported('generalTransformWithHistory'); },
606
- applyComposedTransformWithHistory(_shape, _matrix, _inputFaceHashes, _hashUpperBound) { return unsupported('applyComposedTransformWithHistory'); },
607
790
  };
608
791
  return api;
609
792
  }
@@ -647,14 +830,23 @@ function vec3Of(p) {
647
830
  return { x: p[0], y: p[1], z: p[2] };
648
831
  return { x: Number(p.x), y: Number(p.y), z: Number(p.z) };
649
832
  }
650
- /** base64 解码(node 与浏览器通用,避免直接依赖 Buffer)。 */
651
- function atobPolyfill(s) {
652
- if (typeof atob === 'function')
653
- return atob(s);
654
- return Buffer.from(s, 'base64').toString('binary');
655
- }
656
- /** 释放内核单例(测试收尾用;宿主常驻不需调用)。 */
833
+ /** 已初始化的 brepkit 内核单例(createBrepkitPrimitives 时赋值)。 */
657
834
  let liveKernel = null;
835
+ /**
836
+ * 原生 brepkit 内核面(D3):平台特定代码访问 brepkit 独有能力的唯一入口
837
+ * (chamfer2d/chamferV2/filletV2/sketch* 族、serializeSolid、meshBoolean 等)。
838
+ *
839
+ * ⚠️ 这是**平台特定**出口——import 本函数即声明「这段代码只跑在 brepkit 引擎下」。
840
+ * 可移植代码请用 `getBrepApi()`(L1 契约面)。
841
+ *
842
+ * @returns the live brepkit wasm kernel singleton.
843
+ */
844
+ export function getBrepkitKernel() {
845
+ if (!liveKernel) {
846
+ throw new Error('[brepkit-kernel] kernel not initialized: call createBrepkitPrimitives() first');
847
+ }
848
+ return liveKernel;
849
+ }
658
850
  /** 释放内核单例(测试收尾用;宿主常驻不需调用)。 */
659
851
  export function disposeBrepkit() {
660
852
  try {