@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
@@ -0,0 +1,66 @@
1
+ /**
2
+ * stdlib loft — 放样:多个截面之间蒙皮生成体(手写平台 op,Phase 4 → G5 core 直连)
3
+ *
4
+ * @platform occt — 实现走 core 直连 `occt-wasm loft` / `loftWithVertices`
5
+ * (BRepOffsetAPI_ThruSections;engine-method-map 里 `loft` 为 occt-only)⇒ 平台 op:
6
+ * defineOp 声明 `engines: ['occt']`(D11)。
7
+ *
8
+ * 为什么手写而不走生成投影:与 `api/sweep.ts` 同因——截面最常见来源是
9
+ * `cad.sketch(...)`(产出 **face**),内核 `loft(wires, …)` 只吃 wire ⇒
10
+ * 需要「面 → 外环」输入适配(`internal/profile-wire.ts` 的唯一步径)。
11
+ *
12
+ * core-decouple G5:vendored `loft`(brepjs)替换为 occt-wasm 原生直连,
13
+ * 产物经 `fromBrep` 收养(替代 l3-bridge adoptEntity)。
14
+ */
15
+ import type { Shape } from '../mesh/types.js';
16
+ /** 放样配置(与 vendored LoftOptions 同形;本文件自持,去 brepjs 依赖)。 */
17
+ export interface LoftOptions {
18
+ /** 直线插值(ruled)。默认 true。 */
19
+ ruled?: boolean;
20
+ /** 起点(退化到点的蒙皮)。 */
21
+ startPoint?: readonly [number, number, number] | {
22
+ x: number;
23
+ y: number;
24
+ z: number;
25
+ };
26
+ /** 终点(退化到点的蒙皮)。 */
27
+ endPoint?: readonly [number, number, number] | {
28
+ x: number;
29
+ y: number;
30
+ z: number;
31
+ };
32
+ /** ThruSections 缝合公差。默认 1e-6。 */
33
+ tolerance?: number;
34
+ }
35
+ /**
36
+ * 放样:按给定顺序在截面之间蒙皮生成体。
37
+ * @group 特征
38
+ * @inputs 1
39
+ * @async true
40
+ * @qual ok
41
+ * @name loft
42
+ * @note 平台 op:仅 occt 引擎(BRepOffsetAPI_ThruSections)。截面可为 wire 或面
43
+ * (面取其外环),至少 2 个;`startPoint` / `endPoint` 可做退化到点的蒙皮。
44
+ * 非 occt 引擎执行前报错;brep_mock 不拦截。不做 `loftAll`(数组产物)。
45
+ * @returns Shape 放样体。
46
+ * @param sections - 有序截面集合(wire 或面;面取其外环)。type:Shape[] required:true
47
+ * @param opts - 放样配置(ruled / startPoint / endPoint / tolerance)。type:LoftOptions required:false
48
+ * @example
49
+ * const bottom = cad.sketch({ contours: [{ segments: [
50
+ * { kind: 'line', x1: -5, y1: -5, x2: 5, y2: -5 },
51
+ * { kind: 'line', x1: 5, y1: -5, x2: 5, y2: 5 },
52
+ * { kind: 'line', x1: 5, y1: 5, x2: -5, y2: 5 },
53
+ * { kind: 'line', x1: -5, y1: 5, x2: -5, y2: -5 },
54
+ * ] }] })
55
+ * const top = cad.translate(cad.sketch({ contours: [{ segments: [
56
+ * { kind: 'line', x1: -3, y1: -3, x2: 3, y2: -3 },
57
+ * { kind: 'line', x1: 3, y1: -3, x2: 3, y2: 3 },
58
+ * { kind: 'line', x1: 3, y1: 3, x2: -3, y2: 3 },
59
+ * { kind: 'line', x1: -3, y1: 3, x2: -3, y2: -3 },
60
+ * ] }] }), [0, 0, 20])
61
+ * const body = await cad.loft([bottom, top])
62
+ */
63
+ export declare const loft: ((sections: Shape[], opts?: LoftOptions | undefined) => Promise<Shape>) & {
64
+ __faijs__dualOp?: import("../define-op.js").DualOpMeta;
65
+ };
66
+ //# sourceMappingURL=loft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loft.d.ts","sourceRoot":"","sources":["../../src/api/loft.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAU1C,yDAAyD;AACzD,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,mBAAmB;IACnB,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACpF,mBAAmB;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAClF,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAiDD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,IAAI;;CAOf,CAAA"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * stdlib loft — 放样:多个截面之间蒙皮生成体(手写平台 op,Phase 4 → G5 core 直连)
3
+ *
4
+ * @platform occt — 实现走 core 直连 `occt-wasm loft` / `loftWithVertices`
5
+ * (BRepOffsetAPI_ThruSections;engine-method-map 里 `loft` 为 occt-only)⇒ 平台 op:
6
+ * defineOp 声明 `engines: ['occt']`(D11)。
7
+ *
8
+ * 为什么手写而不走生成投影:与 `api/sweep.ts` 同因——截面最常见来源是
9
+ * `cad.sketch(...)`(产出 **face**),内核 `loft(wires, …)` 只吃 wire ⇒
10
+ * 需要「面 → 外环」输入适配(`internal/profile-wire.ts` 的唯一步径)。
11
+ *
12
+ * core-decouple G5:vendored `loft`(brepjs)替换为 occt-wasm 原生直连,
13
+ * 产物经 `fromBrep` 收养(替代 l3-bridge adoptEntity)。
14
+ */
15
+ import { defineOp } from '../sdk.js';
16
+ import { getBrepApi } from '../brep/handle-bridge.js';
17
+ import { fromBrep } from '../shape.js';
18
+ import { solidToShape } from '../brep/brep-ops.js';
19
+ import { getOcctKernel } from '../occt-kernel/occtKernel.js';
20
+ import { toProfileWireView } from './internal/profile-wire.js';
21
+ /** PointInput → [x,y,z](vendored toVec3 同口径)。 */
22
+ function toVec3(p) {
23
+ if (Array.isArray(p) && p.length >= 3)
24
+ return [p[0], p[1], p[2]];
25
+ const o = p;
26
+ return [o.x, o.y, o.z];
27
+ }
28
+ /** BREP 路径:按序蒙皮各截面(wire 视图 → occt-wasm 直连 → fromBrep 收养)。 */
29
+ function loftBrep(sections, opts) {
30
+ if (!Array.isArray(sections) || sections.length === 0) {
31
+ throw new Error('E_LOFT_NO_SECTIONS: loft requires a non-empty array of section shapes');
32
+ }
33
+ // 每截面:wire 直用;面取外环(孔环不参与放样)。
34
+ const wireViews = sections.map((s) => toProfileWireView(s));
35
+ const { ruled = true, startPoint, endPoint } = opts ?? {};
36
+ const kernel = getBrepApi();
37
+ const k = getOcctKernel();
38
+ const wireHandles = wireViews.map((w) => w.wrapped);
39
+ try {
40
+ let h;
41
+ if (startPoint !== undefined || endPoint !== undefined) {
42
+ const startVertex = startPoint !== undefined ? k.makeVertex(...toVec3(startPoint)) : undefined;
43
+ const endVertex = endPoint !== undefined ? k.makeVertex(...toVec3(endPoint)) : undefined;
44
+ try {
45
+ h = k.loftWithVertices(wireHandles, true, ruled, startVertex, endVertex);
46
+ }
47
+ finally {
48
+ if (startVertex !== undefined)
49
+ k.release(startVertex);
50
+ if (endVertex !== undefined)
51
+ k.release(endVertex);
52
+ }
53
+ }
54
+ else {
55
+ h = k.loft(wireHandles, true, ruled);
56
+ }
57
+ return fromBrep(solidToShape(kernel, h), { solid: h });
58
+ }
59
+ catch (e) {
60
+ const raw = e instanceof Error ? e.message : String(e);
61
+ throw new Error(`E_LOFT_FAILED: loft failed: ${raw}`, { cause: e });
62
+ }
63
+ finally {
64
+ // 面→外环产出的 wire 是 arena 新句柄(曲线借用不 release)
65
+ for (const w of wireViews) {
66
+ if (!w.borrowed) {
67
+ try {
68
+ kernel.release(w.wrapped);
69
+ }
70
+ catch { /* 已释放 */ }
71
+ }
72
+ }
73
+ }
74
+ }
75
+ /**
76
+ * 放样:按给定顺序在截面之间蒙皮生成体。
77
+ * @group 特征
78
+ * @inputs 1
79
+ * @async true
80
+ * @qual ok
81
+ * @name loft
82
+ * @note 平台 op:仅 occt 引擎(BRepOffsetAPI_ThruSections)。截面可为 wire 或面
83
+ * (面取其外环),至少 2 个;`startPoint` / `endPoint` 可做退化到点的蒙皮。
84
+ * 非 occt 引擎执行前报错;brep_mock 不拦截。不做 `loftAll`(数组产物)。
85
+ * @returns Shape 放样体。
86
+ * @param sections - 有序截面集合(wire 或面;面取其外环)。type:Shape[] required:true
87
+ * @param opts - 放样配置(ruled / startPoint / endPoint / tolerance)。type:LoftOptions required:false
88
+ * @example
89
+ * const bottom = cad.sketch({ contours: [{ segments: [
90
+ * { kind: 'line', x1: -5, y1: -5, x2: 5, y2: -5 },
91
+ * { kind: 'line', x1: 5, y1: -5, x2: 5, y2: 5 },
92
+ * { kind: 'line', x1: 5, y1: 5, x2: -5, y2: 5 },
93
+ * { kind: 'line', x1: -5, y1: 5, x2: -5, y2: -5 },
94
+ * ] }] })
95
+ * const top = cad.translate(cad.sketch({ contours: [{ segments: [
96
+ * { kind: 'line', x1: -3, y1: -3, x2: 3, y2: -3 },
97
+ * { kind: 'line', x1: 3, y1: -3, x2: 3, y2: 3 },
98
+ * { kind: 'line', x1: 3, y1: 3, x2: -3, y2: 3 },
99
+ * { kind: 'line', x1: -3, y1: 3, x2: -3, y2: -3 },
100
+ * ] }] }), [0, 0, 20])
101
+ * const body = await cad.loft([bottom, top])
102
+ */
103
+ export const loft = defineOp({
104
+ name: 'loft',
105
+ brep(sections, opts) {
106
+ return loftBrep(sections, opts);
107
+ },
108
+ engines: ['occt'],
109
+ naming: { kind: 'unmodeled', reason: 'lofted-body face vocabulary not defined' },
110
+ });
111
+ //# sourceMappingURL=loft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loft.js","sourceRoot":"","sources":["../../src/api/loft.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib loft — 放样:多个截面之间蒙皮生成体(手写平台 op,Phase 4 → G5 core 直连)\n *\n * @platform occt — 实现走 core 直连 `occt-wasm loft` / `loftWithVertices`\n * (BRepOffsetAPI_ThruSections;engine-method-map 里 `loft` 为 occt-only)⇒ 平台 op:\n * defineOp 声明 `engines: ['occt']`(D11)。\n *\n * 为什么手写而不走生成投影:与 `api/sweep.ts` 同因——截面最常见来源是\n * `cad.sketch(...)`(产出 **face**),内核 `loft(wires, …)` 只吃 wire ⇒\n * 需要「面 → 外环」输入适配(`internal/profile-wire.ts` 的唯一步径)。\n *\n * core-decouple G5:vendored `loft`(brepjs)替换为 occt-wasm 原生直连,\n * 产物经 `fromBrep` 收养(替代 l3-bridge adoptEntity)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { fromBrep } from '../shape'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getOcctKernel } from '../occt-kernel/occtKernel'\nimport { toProfileWireView } from './internal/profile-wire'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/** 放样配置(与 vendored LoftOptions 同形;本文件自持,去 brepjs 依赖)。 */\nexport interface LoftOptions {\n /** 直线插值(ruled)。默认 true。 */\n ruled?: boolean\n /** 起点(退化到点的蒙皮)。 */\n startPoint?: readonly [number, number, number] | { x: number; y: number; z: number }\n /** 终点(退化到点的蒙皮)。 */\n endPoint?: readonly [number, number, number] | { x: number; y: number; z: number }\n /** ThruSections 缝合公差。默认 1e-6。 */\n tolerance?: number\n}\n\n/** PointInput → [x,y,z](vendored toVec3 同口径)。 */\nfunction toVec3(p: LoftOptions['startPoint']): [number, number, number] {\n if (Array.isArray(p) && p.length >= 3) return [p[0]!, p[1]!, p[2]!]\n const o = p as { x: number; y: number; z: number }\n return [o.x, o.y, o.z]\n}\n\n/** BREP 路径:按序蒙皮各截面(wire 视图 → occt-wasm 直连 → fromBrep 收养)。 */\nfunction loftBrep(sections: Shape[], opts?: LoftOptions): Shape {\n if (!Array.isArray(sections) || sections.length === 0) {\n throw new Error('E_LOFT_NO_SECTIONS: loft requires a non-empty array of section shapes')\n }\n // 每截面:wire 直用;面取外环(孔环不参与放样)。\n const wireViews = sections.map((s) => toProfileWireView(s))\n const { ruled = true, startPoint, endPoint } = opts ?? {}\n const kernel = getBrepApi()\n const k = getOcctKernel()\n const wireHandles = wireViews.map((w) => w.wrapped as never)\n\n try {\n let h: unknown\n if (startPoint !== undefined || endPoint !== undefined) {\n const startVertex = startPoint !== undefined ? k.makeVertex(...toVec3(startPoint)) : undefined\n const endVertex = endPoint !== undefined ? k.makeVertex(...toVec3(endPoint)) : undefined\n try {\n h = k.loftWithVertices(wireHandles, true, ruled, startVertex as never, endVertex as never)\n } finally {\n if (startVertex !== undefined) k.release(startVertex)\n if (endVertex !== undefined) k.release(endVertex)\n }\n } else {\n h = k.loft(wireHandles, true, ruled)\n }\n return fromBrep(solidToShape(kernel, h as BrepHandle), { solid: h as BrepHandle })\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n throw new Error(`E_LOFT_FAILED: loft failed: ${raw}`, { cause: e })\n } finally {\n // 面→外环产出的 wire 是 arena 新句柄(曲线借用不 release)\n for (const w of wireViews) {\n if (!w.borrowed) {\n try { kernel.release(w.wrapped) } catch { /* 已释放 */ }\n }\n }\n }\n}\n\n/**\n * 放样:按给定顺序在截面之间蒙皮生成体。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name loft\n * @note 平台 op:仅 occt 引擎(BRepOffsetAPI_ThruSections)。截面可为 wire 或面\n * (面取其外环),至少 2 个;`startPoint` / `endPoint` 可做退化到点的蒙皮。\n * 非 occt 引擎执行前报错;brep_mock 不拦截。不做 `loftAll`(数组产物)。\n * @returns Shape 放样体。\n * @param sections - 有序截面集合(wire 或面;面取其外环)。type:Shape[] required:true\n * @param opts - 放样配置(ruled / startPoint / endPoint / tolerance)。type:LoftOptions required:false\n * @example\n * const bottom = cad.sketch({ contours: [{ segments: [\n * { kind: 'line', x1: -5, y1: -5, x2: 5, y2: -5 },\n * { kind: 'line', x1: 5, y1: -5, x2: 5, y2: 5 },\n * { kind: 'line', x1: 5, y1: 5, x2: -5, y2: 5 },\n * { kind: 'line', x1: -5, y1: 5, x2: -5, y2: -5 },\n * ] }] })\n * const top = cad.translate(cad.sketch({ contours: [{ segments: [\n * { kind: 'line', x1: -3, y1: -3, x2: 3, y2: -3 },\n * { kind: 'line', x1: 3, y1: -3, x2: 3, y2: 3 },\n * { kind: 'line', x1: 3, y1: 3, x2: -3, y2: 3 },\n * { kind: 'line', x1: -3, y1: 3, x2: -3, y2: -3 },\n * ] }] }), [0, 0, 20])\n * const body = await cad.loft([bottom, top])\n */\nexport const loft = defineOp({\n name: 'loft',\n brep(sections: Shape[], opts?: LoftOptions) {\n return loftBrep(sections, opts)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: 'lofted-body face vocabulary not defined' } as Provenance,\n})\n"]}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * measurement — cad 脚本面测量 op(Phase 7,narrowing plan §Phase 7 / Q4)
3
+ *
4
+ * 补齐 §1.5 的反向缺口:BrepEngineApi 的 L1 测量面(getSurfaceArea / getLength)
5
+ * 在脚本面此前没有任何入口——脚本里量不出面积、长度。本模块提供两个**中立**测量
6
+ * op(走 getBrepApi() 的 L1 契约面,occt / brepkit / 小程序端同一份 .fai.js 都可跑):
7
+ * - area(shape) → 表面积(getSurfaceArea);
8
+ * - length(shape) → 边长/线长(getLength);
9
+ * - volume(shape) → 体积(getVolume);
10
+ * - centerOfMass(shape) → 质心坐标(getCenterOfMass,BrepVec3 {x,y,z})。
11
+ *
12
+ * 与 vendored 测量面(api/generated/measurement.ts 的 measureArea / measureLength)
13
+ * 的区别:那些 op 经 l3-bridge 借入层 + vendored 函数绑定 occt-wasm,整体 occt-only
14
+ * (Phase 6 已声明 engines: ['occt']);本模块直接调 L1 方法,无借入层、无引擎绑定,
15
+ * 是脚本面的中立测量入口。返回纯数字,不产出 Shape、不消费 shape。
16
+ *
17
+ * 三源一致(B1):本模块经 arg-spec 的 `scriptFace: true` 条目(kind 'faijs')登记,
18
+ * 由 gen-l3-surface.ts re-export 进 api/generated/script-face.ts / script-face-manifest.ts,
19
+ * gen-symbol-table.ts 同步 check() 符号表——cad 命名空间、manifest、符号表三处同源。
20
+ */
21
+ import type { Shape } from '../../mesh/types.js';
22
+ import type { BrepVec3 } from '../../brep/engine/types.js';
23
+ /**
24
+ * 测量形状的表面积(L1 getSurfaceArea,两引擎同口径)。
25
+ *
26
+ * @param shape - 被测量的形状(Face / Shape3D / compound)。
27
+ * @returns 表面积(mm²)。
28
+ */
29
+ export declare function area(shape: Shape): Promise<number>;
30
+ /**
31
+ * 测量形状的边长/线长(L1 getLength,两引擎同口径)。
32
+ *
33
+ * @param shape - 被测量的形状(edge / wire / solid,solid 按内核口径计边)。
34
+ * @returns 长度(mm)。
35
+ */
36
+ export declare function length(shape: Shape): Promise<number>;
37
+ /**
38
+ * 测量形状的体素体积(L1 getVolume,两引擎同口径)。
39
+ *
40
+ * @param shape - 被测量的形状(solid / compound;对 wire / face 内核按自身口径计,可能返回 0)。
41
+ * @returns 体积(mm³)。
42
+ */
43
+ export declare function volume(shape: Shape): Promise<number>;
44
+ /**
45
+ * 测量形状的质心(L1 getCenterOfMass,两引擎同口径)。
46
+ *
47
+ * @param shape - 被测量的形状(solid / compound / face)。
48
+ * @returns 质心坐标(mm,BREP 中立形态 {x,y,z})。
49
+ */
50
+ export declare function centerOfMass(shape: Shape): Promise<BrepVec3>;
51
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/measurement/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAc,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAanE;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxD;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAG1D;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAG1D;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,CAGlE"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * measurement — cad 脚本面测量 op(Phase 7,narrowing plan §Phase 7 / Q4)
3
+ *
4
+ * 补齐 §1.5 的反向缺口:BrepEngineApi 的 L1 测量面(getSurfaceArea / getLength)
5
+ * 在脚本面此前没有任何入口——脚本里量不出面积、长度。本模块提供两个**中立**测量
6
+ * op(走 getBrepApi() 的 L1 契约面,occt / brepkit / 小程序端同一份 .fai.js 都可跑):
7
+ * - area(shape) → 表面积(getSurfaceArea);
8
+ * - length(shape) → 边长/线长(getLength);
9
+ * - volume(shape) → 体积(getVolume);
10
+ * - centerOfMass(shape) → 质心坐标(getCenterOfMass,BrepVec3 {x,y,z})。
11
+ *
12
+ * 与 vendored 测量面(api/generated/measurement.ts 的 measureArea / measureLength)
13
+ * 的区别:那些 op 经 l3-bridge 借入层 + vendored 函数绑定 occt-wasm,整体 occt-only
14
+ * (Phase 6 已声明 engines: ['occt']);本模块直接调 L1 方法,无借入层、无引擎绑定,
15
+ * 是脚本面的中立测量入口。返回纯数字,不产出 Shape、不消费 shape。
16
+ *
17
+ * 三源一致(B1):本模块经 arg-spec 的 `scriptFace: true` 条目(kind 'faijs')登记,
18
+ * 由 gen-l3-surface.ts re-export 进 api/generated/script-face.ts / script-face-manifest.ts,
19
+ * gen-symbol-table.ts 同步 check() 符号表——cad 命名空间、manifest、符号表三处同源。
20
+ */
21
+ import { brepOf } from '../../shape.js';
22
+ import { getBrepApi } from '../../brep/handle-bridge.js';
23
+ /** 读该 Shape 的 BREP 句柄;mesh-only 输入在测量前显式报错(不静默降级)。 */
24
+ function requireBrepHandle(shape, op) {
25
+ const h = brepOf(shape);
26
+ if (h === undefined) {
27
+ throw new Error(`[faijs/measurement] ${op}: E_BREP_ONLY_INPUT: measurement requires a BREP-backed shape (mesh-only input has no BREP handle)`);
28
+ }
29
+ return h;
30
+ }
31
+ /**
32
+ * 测量形状的表面积(L1 getSurfaceArea,两引擎同口径)。
33
+ *
34
+ * @param shape - 被测量的形状(Face / Shape3D / compound)。
35
+ * @returns 表面积(mm²)。
36
+ */
37
+ export async function area(shape) {
38
+ const h = requireBrepHandle(shape, 'area');
39
+ return getBrepApi().getSurfaceArea(h);
40
+ }
41
+ /**
42
+ * 测量形状的边长/线长(L1 getLength,两引擎同口径)。
43
+ *
44
+ * @param shape - 被测量的形状(edge / wire / solid,solid 按内核口径计边)。
45
+ * @returns 长度(mm)。
46
+ */
47
+ export async function length(shape) {
48
+ const h = requireBrepHandle(shape, 'length');
49
+ return getBrepApi().getLength(h);
50
+ }
51
+ /**
52
+ * 测量形状的体素体积(L1 getVolume,两引擎同口径)。
53
+ *
54
+ * @param shape - 被测量的形状(solid / compound;对 wire / face 内核按自身口径计,可能返回 0)。
55
+ * @returns 体积(mm³)。
56
+ */
57
+ export async function volume(shape) {
58
+ const h = requireBrepHandle(shape, 'volume');
59
+ return getBrepApi().getVolume(h);
60
+ }
61
+ /**
62
+ * 测量形状的质心(L1 getCenterOfMass,两引擎同口径)。
63
+ *
64
+ * @param shape - 被测量的形状(solid / compound / face)。
65
+ * @returns 质心坐标(mm,BREP 中立形态 {x,y,z})。
66
+ */
67
+ export async function centerOfMass(shape) {
68
+ const h = requireBrepHandle(shape, 'centerOfMass');
69
+ return getBrepApi().getCenterOfMass(h);
70
+ }
71
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/measurement/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAIrD,sDAAsD;AACtD,SAAS,iBAAiB,CAAC,KAAY,EAAE,EAAU;IACjD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACvB,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,uBAAuB,EAAE,oGAAoG,CAC9H,CAAA;IACH,CAAC;IACD,OAAO,CAAe,CAAA;AACxB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,KAAY;IACrC,MAAM,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC1C,OAAO,UAAU,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAY;IACvC,MAAM,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAC5C,OAAO,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAY;IACvC,MAAM,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAC5C,OAAO,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAY;IAC7C,MAAM,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAA;IAClD,OAAO,UAAU,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;AACxC,CAAC","sourcesContent":["/**\n * measurement — cad 脚本面测量 op(Phase 7,narrowing plan §Phase 7 / Q4)\n *\n * 补齐 §1.5 的反向缺口:BrepEngineApi 的 L1 测量面(getSurfaceArea / getLength)\n * 在脚本面此前没有任何入口——脚本里量不出面积、长度。本模块提供两个**中立**测量\n * op(走 getBrepApi() 的 L1 契约面,occt / brepkit / 小程序端同一份 .fai.js 都可跑):\n * - area(shape) → 表面积(getSurfaceArea);\n * - length(shape) → 边长/线长(getLength);\n * - volume(shape) → 体积(getVolume);\n * - centerOfMass(shape) → 质心坐标(getCenterOfMass,BrepVec3 {x,y,z})。\n *\n * 与 vendored 测量面(api/generated/measurement.ts 的 measureArea / measureLength)\n * 的区别:那些 op 经 l3-bridge 借入层 + vendored 函数绑定 occt-wasm,整体 occt-only\n * (Phase 6 已声明 engines: ['occt']);本模块直接调 L1 方法,无借入层、无引擎绑定,\n * 是脚本面的中立测量入口。返回纯数字,不产出 Shape、不消费 shape。\n *\n * 三源一致(B1):本模块经 arg-spec 的 `scriptFace: true` 条目(kind 'faijs')登记,\n * 由 gen-l3-surface.ts re-export 进 api/generated/script-face.ts / script-face-manifest.ts,\n * gen-symbol-table.ts 同步 check() 符号表——cad 命名空间、manifest、符号表三处同源。\n */\n\nimport { brepOf } from '../../shape'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport type { Shape } from '../../mesh/types'\nimport type { BrepHandle, BrepVec3 } from '../../brep/engine/types'\n\n/** 读该 Shape 的 BREP 句柄;mesh-only 输入在测量前显式报错(不静默降级)。 */\nfunction requireBrepHandle(shape: Shape, op: string): BrepHandle {\n const h = brepOf(shape)\n if (h === undefined) {\n throw new Error(\n `[faijs/measurement] ${op}: E_BREP_ONLY_INPUT: measurement requires a BREP-backed shape (mesh-only input has no BREP handle)`,\n )\n }\n return h as BrepHandle\n}\n\n/**\n * 测量形状的表面积(L1 getSurfaceArea,两引擎同口径)。\n *\n * @param shape - 被测量的形状(Face / Shape3D / compound)。\n * @returns 表面积(mm²)。\n */\nexport async function area(shape: Shape): Promise<number> {\n const h = requireBrepHandle(shape, 'area')\n return getBrepApi().getSurfaceArea(h)\n}\n\n/**\n * 测量形状的边长/线长(L1 getLength,两引擎同口径)。\n *\n * @param shape - 被测量的形状(edge / wire / solid,solid 按内核口径计边)。\n * @returns 长度(mm)。\n */\nexport async function length(shape: Shape): Promise<number> {\n const h = requireBrepHandle(shape, 'length')\n return getBrepApi().getLength(h)\n}\n\n/**\n * 测量形状的体素体积(L1 getVolume,两引擎同口径)。\n *\n * @param shape - 被测量的形状(solid / compound;对 wire / face 内核按自身口径计,可能返回 0)。\n * @returns 体积(mm³)。\n */\nexport async function volume(shape: Shape): Promise<number> {\n const h = requireBrepHandle(shape, 'volume')\n return getBrepApi().getVolume(h)\n}\n\n/**\n * 测量形状的质心(L1 getCenterOfMass,两引擎同口径)。\n *\n * @param shape - 被测量的形状(solid / compound / face)。\n * @returns 质心坐标(mm,BREP 中立形态 {x,y,z})。\n */\nexport async function centerOfMass(shape: Shape): Promise<BrepVec3> {\n const h = requireBrepHandle(shape, 'centerOfMass')\n return getBrepApi().getCenterOfMass(h)\n}\n"]}
@@ -1,6 +1,10 @@
1
1
  /**
2
2
  * L3 bridge — vendored kernel registry injection (engine-neutral, Phase 2 P2-5).
3
3
  *
4
+ * @platform occt — 本文件 import occt-kernel(occtKernel):桥接层把当前引擎的
5
+ * BrepEngineApi 适配器包装为 brepjs KernelAdapter 注入 vendored registry,平台
6
+ * 类型(OcctKernel 句柄)只在桥内出现;守卫 R1 豁免、R2 无 defineOp 不适用。
7
+ *
4
8
  * 原 occt-kernel-bridge 的职责是「把 vendored kernel registry 冻结绑定到 occt-wasm
5
9
  * 单实例」(D10)。Phase 2 起改为**跟随当前 BREP 引擎**:装配期把 registry 里当前
6
10
  * 引擎(occt / brepkit / mock)的 `BrepEngineApi` 适配器包装为 brepjs `KernelAdapter`
@@ -18,7 +22,7 @@
18
22
  * 则在**装配期**报错(而非执行期崩)。清单见 {@link GLUE_METHODS}。
19
23
  */
20
24
  import { type BrepEngine } from '../brep/engine/registry.js';
21
- import type { KernelAdapter } from '../vendored/brepjs/kernel/types.js';
25
+ import type { KernelAdapter } from '@faicad/faijs-brepjs/kernel/types.js';
22
26
  /** occt-wasm 适配器在 vendored registry 中的注册 id。这是 vendored 注册表的
23
27
  * 槽位名(宿主侧判据 + D10 globalThis 单例兼容),**不是**引擎身份标识——
24
28
  * 实际引擎由注入的 adapter 决定(vendored 面全部无参 `getKernel()` 取默认)。 */
@@ -66,13 +70,6 @@ export declare function injectCurrentBrepEngineAsKernel(): Promise<KernelAdapter
66
70
  * 其它引擎 → BrepEngineApi 透传包装,pattern 族 Vec3↔三元组适配)。
67
71
  */
68
72
  export declare function buildKernelAdapter(engine: BrepEngine): KernelAdapter;
69
- /**
70
- * vendored kernel methods with no source capability in BrepEngineApi.
71
- * Registered explicitly (not silently undefined): tests assert this list and
72
- * the engine-contract gap is a separate decision, not a wrapping bug. No
73
- * stubs, no fake zeros — a silent 0 is worse than a crash.
74
- */
75
- export declare const UNMAPPED_VENDORED_MEASURE_METHODS: readonly ["area", "length", "linearCenterOfMass"];
76
73
  /**
77
74
  * 装配期完整性检查:KernelAdapter 胶水方法齐备断言。
78
75
  *
@@ -1 +1 @@
1
- {"version":3,"file":"occt-kernel-bridge.d.ts","sourceRoot":"","sources":["../../src/api/occt-kernel-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAYxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAEvE;;4DAE4D;AAC5D,eAAO,MAAM,uBAAuB,cAAc,CAAA;AAwBlD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,+BAA+B,IAAI,OAAO,CAAC,aAAa,CAAC,CAgB9E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,CAMpE;AAKD;;;;;GAKG;AACH,eAAO,MAAM,iCAAiC,mDAIpC,CAAA;AAmIV;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAWlF;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,IAAI,IAAI,CAGrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAG1C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,aAAa,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,aAAa,CAM9C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
1
+ {"version":3,"file":"occt-kernel-bridge.d.ts","sourceRoot":"","sources":["../../src/api/occt-kernel-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAYxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAA;AAEzE;;4DAE4D;AAC5D,eAAO,MAAM,uBAAuB,cAAc,CAAA;AAwBlD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,+BAA+B,IAAI,OAAO,CAAC,aAAa,CAAC,CAgB9E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,CAUpE;AA8ID;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAWlF;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,IAAI,IAAI,CAGrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAG1C;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,aAAa,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,aAAa,CAM9C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
@@ -1,6 +1,10 @@
1
1
  /**
2
2
  * L3 bridge — vendored kernel registry injection (engine-neutral, Phase 2 P2-5).
3
3
  *
4
+ * @platform occt — 本文件 import occt-kernel(occtKernel):桥接层把当前引擎的
5
+ * BrepEngineApi 适配器包装为 brepjs KernelAdapter 注入 vendored registry,平台
6
+ * 类型(OcctKernel 句柄)只在桥内出现;守卫 R1 豁免、R2 无 defineOp 不适用。
7
+ *
4
8
  * 原 occt-kernel-bridge 的职责是「把 vendored kernel registry 冻结绑定到 occt-wasm
5
9
  * 单实例」(D10)。Phase 2 起改为**跟随当前 BREP 引擎**:装配期把 registry 里当前
6
10
  * 引擎(occt / brepkit / mock)的 `BrepEngineApi` 适配器包装为 brepjs `KernelAdapter`
@@ -19,8 +23,8 @@
19
23
  */
20
24
  import { getKernel as getFaijsKernel } from '../occt-kernel/occtKernel.js';
21
25
  import { getBrepEngine } from '../brep/engine/registry.js';
22
- import { OcctWasmAdapter } from '../vendored/brepjs/kernel/occtWasm/occtWasmAdapter.js';
23
- import { freezeKernels, getActiveKernelId, getKernel as getVendoredKernel, registerKernel, syncRegistryFromGlobal, syncRegistryToGlobal, __resetKernelRegistryForTests, } from '../vendored/brepjs/kernel/index.js';
26
+ import { OcctWasmAdapter } from '@faicad/faijs-brepjs/kernel/occtWasm/occtWasmAdapter.js';
27
+ import { freezeKernels, getActiveKernelId, getKernel as getVendoredKernel, registerKernel, syncRegistryFromGlobal, syncRegistryToGlobal, __resetKernelRegistryForTests, } from '@faicad/faijs-brepjs/kernel/index.js';
24
28
  /** occt-wasm 适配器在 vendored registry 中的注册 id。这是 vendored 注册表的
25
29
  * 槽位名(宿主侧判据 + D10 globalThis 单例兼容),**不是**引擎身份标识——
26
30
  * 实际引擎由注入的 adapter 决定(vendored 面全部无参 `getKernel()` 取默认)。 */
@@ -104,7 +108,11 @@ export async function injectCurrentBrepEngineAsKernel() {
104
108
  */
105
109
  export function buildKernelAdapter(engine) {
106
110
  if (engine.id === 'occt') {
107
- const faijsKernel = engine.primitives;
111
+ // Phase 3 (narrowing plan): engine.primitives is now the L1 adapter object
112
+ // (createOcctPrimitives), NOT the raw kernel — the old cast lied. The
113
+ // vendored full adapter needs the raw occt-wasm singleton, which is exactly
114
+ // what getKernel() returns (process-level singleton, D10 unchanged).
115
+ const faijsKernel = getFaijsKernel();
108
116
  return OcctWasmAdapter.fromKernel(faijsKernel);
109
117
  }
110
118
  return wrapBrepEngineApi(engine.primitives);
@@ -112,16 +120,11 @@ export function buildKernelAdapter(engine) {
112
120
  /** No-op `delete` for synthesized glue objects (mirrors vendored `noop`). */
113
121
  const noop = () => { };
114
122
  /**
115
- * vendored kernel methods with no source capability in BrepEngineApi.
116
- * Registered explicitly (not silently undefined): tests assert this list and
117
- * the engine-contract gap is a separate decision, not a wrapping bug. No
118
- * stubs, no fake zeros — a silent 0 is worse than a crash.
123
+ * vendored 测量名 ↔ BrepEngineApi 能力映射(Phase 6 收口,D7):
124
+ * area/length 已映射到 L1 测量面(getSurfaceArea/getLength,Phase 4 D9 接线);
125
+ * linearCenterOfMass 无 L1 对应(L2 平台面,primitives.ts 注释),保留真实缺口——
126
+ * 不补桩、不返回 0(静默 0 比崩溃更糟),测试内联钉住 undefined。
119
127
  */
120
- export const UNMAPPED_VENDORED_MEASURE_METHODS = [
121
- 'area',
122
- 'length',
123
- 'linearCenterOfMass',
124
- ];
125
128
  /** Unwrap a vendored KernelShape (handle view or bare number) to a BrepHandle. */
126
129
  function unwrapHandle(h) {
127
130
  if (typeof h === 'number')
@@ -149,10 +152,11 @@ function mapMeasureMethods(adapter, api) {
149
152
  max: [bb.xmax, bb.ymax, bb.zmax],
150
153
  };
151
154
  };
155
+ adapter['area'] = (s) => api.getSurfaceArea(unwrapHandle(s));
156
+ adapter['length'] = (s) => api.getLength(unwrapHandle(s));
152
157
  // shapeType / isNull: same name, same semantics — already covered by the
153
158
  // transparent pass-through in wrapBrepEngineApi; listed here for docs only.
154
- // Known contract gaps (UNMAPPED_VENDORED_MEASURE_METHODS) are NOT stubbed:
155
- // they remain undefined so tests can pin the gap explicitly.
159
+ // linearCenterOfMass(L2 平台面)无 L1 对应,保持 undefined(缺口由测试内联钉住)。
156
160
  }
157
161
  /**
158
162
  * Synthesize the vendored glue/auxiliary construction methods over any engine's
@@ -1 +1 @@
1
- {"version":3,"file":"occt-kernel-bridge.js","sourceRoot":"","sources":["../../src/api/occt-kernel-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * L3 bridge — vendored kernel registry injection (engine-neutral, Phase 2 P2-5).\n *\n * 原 occt-kernel-bridge 的职责是「把 vendored kernel registry 冻结绑定到 occt-wasm\n * 单实例」(D10)。Phase 2 起改为**跟随当前 BREP 引擎**:装配期把 registry 里当前\n * 引擎(occt / brepkit / mock)的 `BrepEngineApi` 适配器包装为 brepjs `KernelAdapter`\n * 形态注册进 vendored registry,使 `vendoredRegistry.getKernel()` 返回当前引擎——\n * vendored 函数全部逻辑(命名/角色表/Result)原样保留、零改动。\n *\n * 边界规则(D8/R5)不变:本文件是 faijs 侧唯一把 vendored kernel registry 与\n * faijs 引擎接线的地方;core 侧只从 `api/` import vendored 树。\n *\n * 装配期完整性检查(方案 §Phase 2.5):KernelAdapter 是 211 方法大接口,但 vendored\n * 面存在大量**辅助构造方法**(createVector3d / createPoint3d / createDirection3d /\n * createAxis1 / createAxis2 / createAxis3,见 vendored core/kernelBoundary.ts)——\n * 它们不落在能力名体系内(BrepMethodKind 之外)、无法由 op 声明覆盖,任何 compat\n * op / TS compat 面都可能触发。⇒ 注入前必须断言这些胶水方法在适配器上齐备,缺失\n * 则在**装配期**报错(而非执行期崩)。清单见 {@link GLUE_METHODS}。\n */\n\nimport { getKernel as getFaijsKernel } from '../occt-kernel/occtKernel'\nimport type { OcctKernelOwner } from '../vendored/brepjs/kernel/occtWasm/occtWasmAdapter.js'\nimport { getBrepEngine, type BrepEngine } from '../brep/engine/registry'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { OcctWasmAdapter } from '../vendored/brepjs/kernel/occtWasm/occtWasmAdapter.js'\nimport {\n freezeKernels,\n getActiveKernelId,\n getKernel as getVendoredKernel,\n registerKernel,\n syncRegistryFromGlobal,\n syncRegistryToGlobal,\n __resetKernelRegistryForTests,\n} from '../vendored/brepjs/kernel/index.js'\nimport type { KernelAdapter } from '../vendored/brepjs/kernel/types.js'\n\n/** occt-wasm 适配器在 vendored registry 中的注册 id。这是 vendored 注册表的\n * 槽位名(宿主侧判据 + D10 globalThis 单例兼容),**不是**引擎身份标识——\n * 实际引擎由注入的 adapter 决定(vendored 面全部无参 `getKernel()` 取默认)。 */\nexport const VENDORED_OCCT_KERNEL_ID = 'occt-wasm'\n\n/**\n * 装配期完整性检查清单——vendored 面辅助构造/生命周期胶水方法。\n *\n * 这些方法不在 `BrepMethodKind` 能力名体系内(能力判定无法覆盖),但 vendored 面\n * 大量使用(kernelBoundary.ts / wrapperFns / castShape 等)。当前引擎的\n * KernelAdapter 包装必须全部具备,否则对应 compat op / TS compat 面会在执行期崩。\n *\n * Phase 0 盘点实证:36 个 compat op 的 vendored 函数(capability-map 64 方法)与\n * kernelBoundary 都不需要 createAxis*(2D sketcher / TS compat 面需要)——清单按\n * 「vendored 面实际触发面」保守枚举,缺即装配期报错。\n */\nconst GLUE_METHODS = [\n 'createVector3d',\n 'createPoint3d',\n 'createDirection3d',\n 'createAxis1',\n 'createAxis2',\n 'createAxis3',\n] as const\n\nlet _injected = false\n\n/**\n * Inject the currently-registered BREP engine into the vendored kernel registry\n * (replaces the old occt-only `bindOcctKernel()` fixed binding, Phase 2 P2-5).\n *\n * 装配期调用(在 `registerOcctBrepEngine()` / 其它引擎注册之后)。从引擎注册表取\n * 当前默认 BREP 引擎,按其 id 构造 KernelAdapter 形态注册进 vendored registry:\n *\n * - occt:`OcctWasmAdapter.fromKernel(当前引擎 primitives)`——同一 occt-wasm 单实例\n * (D10 不变),211 方法完整适配器,vendored 函数行为与旧 bindOcctKernel 完全一致;\n * - 其它引擎(brepkit/mock):将 BrepEngineApi 透传包装为 KernelAdapter 形态\n * (`dispose`→`release` 等方法名映射 + pattern 返回形态适配),**不做方法伪造**;\n * - 任一引擎注入前都做**装配期完整性检查**(GLUE_METHODS 齐备断言)。\n *\n * 幂等:首次调用后注册并冻结;重复调用返回已注入的适配器。\n *\n * @returns 注册进 vendored registry 的 kernel adapter。\n * @throws 无 BREP 引擎注册;或完整性检查失败(胶水方法缺失)——装配期报错。\n */\nexport async function injectCurrentBrepEngineAsKernel(): Promise<KernelAdapter> {\n // CDN 宿主跨实例同步:host bundle 已注入则直接复用(同旧 bindOcctKernel 语义)。\n // 短路判据与 isKernelInjected() 一致(含 registry 侧激活 id 分支),避免\n // 「registry 已注入但模块级 _injected=false」时走完整路径撞 frozen 抛错。\n syncRegistryFromGlobal()\n if (isKernelInjected()) return getVendoredKernel()\n\n const engine = await getBrepEngine()\n const adapter = buildKernelAdapter(engine)\n assertGlueMethodsComplete(engine.id, adapter)\n\n registerKernel(VENDORED_OCCT_KERNEL_ID, adapter)\n freezeKernels()\n _injected = true\n syncRegistryToGlobal()\n return adapter\n}\n\n/**\n * 按引擎 id 构造 KernelAdapter 形态(occt 走完整适配器;其它引擎透传包装)。\n *\n * occt 分支保持旧 bindOcctKernel 行为:OcctWasmAdapter.fromKernel 需要 occt-wasm\n * 实例(OcctKernelOwner)。当前引擎的 primitives 即 initOcctWasm 单例(occtApi 是\n * 同一实例的实例覆盖,方法面完整),转换安全。\n *\n * 其它引擎分支:BrepEngineApi → KernelAdapter 契约面——\n * - `dispose` → `release`(vendored 面用 dispose,BrepEngineApi 用 release);\n * - `linearPattern` / `circularPattern` 的方向/中心/轴参数是 Vec3 对象(BrepEngineApi\n * 口径),vendored 面传 [x,y,z] 三元组——包装为对象再转发;\n * - 返回 BrepHandle[](BrepEngineApi)→ KernelShape[](vendored castResultShape 消费\n * `.wrapped` + `.type`)——包装为 `{ wrapped, type: 'solid' }`;\n * - `gridPattern` 返回单 BrepHandle → 单 KernelShape(compound 语义一致)。\n * 不声明 `rectangularPattern`(纯 JS 组合,不调内核——capability-map 实证)。\n *\n * ⚠️ 不伪造:BrepEngineApi 未提供的方法**不**补桩;vendored 函数若触发,由\n * compat op 的静态能力判定(backend-dispatch,Phase 1)在执行前拦截。\n *\n * @param engine - 当前 BREP 引擎(装配期从引擎注册表取得)。\n * @returns 该引擎的 vendored KernelAdapter(occt → OcctWasmAdapter.fromKernel;\n * 其它引擎 → BrepEngineApi 透传包装,pattern 族 Vec3↔三元组适配)。\n */\nexport function buildKernelAdapter(engine: BrepEngine): KernelAdapter {\n if (engine.id === 'occt') {\n const faijsKernel = engine.primitives as unknown as OcctKernelOwner\n return OcctWasmAdapter.fromKernel(faijsKernel)\n }\n return wrapBrepEngineApi(engine.primitives)\n}\n\n/** No-op `delete` for synthesized glue objects (mirrors vendored `noop`). */\nconst noop = (): void => {}\n\n/**\n * vendored kernel methods with no source capability in BrepEngineApi.\n * Registered explicitly (not silently undefined): tests assert this list and\n * the engine-contract gap is a separate decision, not a wrapping bug. No\n * stubs, no fake zeros — a silent 0 is worse than a crash.\n */\nexport const UNMAPPED_VENDORED_MEASURE_METHODS = [\n 'area',\n 'length',\n 'linearCenterOfMass',\n] as const\n\n/** Unwrap a vendored KernelShape (handle view or bare number) to a BrepHandle. */\nfunction unwrapHandle(h: unknown): unknown {\n if (typeof h === 'number') return h\n const view = h as { id?: unknown }\n return typeof view.id === 'number' ? view.id : h\n}\n\n/**\n * Map vendored measure method names/shapes onto BrepEngineApi capabilities.\n * The vendored measure face calls `kernel.volume/area/length/centerOfMass/...`\n * (its own naming); the occt adapter carries an internal mapping layer — this\n * is the engine-neutral equivalent for any wrapped BrepEngineApi. Only real\n * BrepEngineApi capabilities are mapped; the rest stay in the gap registry.\n */\nfunction mapMeasureMethods(adapter: Record<string, unknown>, api: BrepEngineApi): void {\n adapter['volume'] = (s: unknown) => api.getVolume(unwrapHandle(s) as never)\n adapter['centerOfMass'] = (s: unknown): [number, number, number] => {\n const v = api.getCenterOfMass(unwrapHandle(s) as never)\n return [v.x, v.y, v.z]\n }\n adapter['boundingBox'] = (s: unknown) => {\n const bb = api.getBoundingBox(unwrapHandle(s) as never, true)\n return {\n min: [bb.xmin, bb.ymin, bb.zmin],\n max: [bb.xmax, bb.ymax, bb.zmax],\n }\n }\n // shapeType / isNull: same name, same semantics — already covered by the\n // transparent pass-through in wrapBrepEngineApi; listed here for docs only.\n // Known contract gaps (UNMAPPED_VENDORED_MEASURE_METHODS) are NOT stubbed:\n // they remain undefined so tests can pin the gap explicitly.\n}\n\n/**\n * Synthesize the vendored glue/auxiliary construction methods over any engine's\n * primitives. These 6 methods are pure JS data-literal constructors in the\n * vendored surface (zero kernel calls — see vendored constructionOps.ts), i.e.\n * a *calling convention*, not a kernel capability — so they are synthesized at\n * the faijs wrapper layer (engine-neutral) rather than added to BrepEngineApi.\n * Field shapes are copied verbatim from the vendored occt adapter; `delete` is\n * mandatory (kernelBoundary's with* helpers call it in `finally`).\n */\nfunction synthesizeGlueMethods(adapter: Record<string, unknown>): void {\n const pnt = (x: number, y: number, z: number, __type: string) => ({ x, y, z, __type, delete: noop })\n adapter['createPoint3d'] = (x: number, y: number, z: number) => pnt(x, y, z, 'point3d')\n adapter['createDirection3d'] = (x: number, y: number, z: number) => pnt(x, y, z, 'direction3d')\n adapter['createVector3d'] = (x: number, y: number, z: number) => pnt(x, y, z, 'vector3d')\n adapter['createAxis1'] = (cx: number, cy: number, cz: number, dx: number, dy: number, dz: number) => ({\n origin: { x: cx, y: cy, z: cz },\n direction: { x: dx, y: dy, z: dz },\n __type: 'axis1',\n delete: noop,\n })\n // axis2/axis3: 6- or 9-arg forms (origin + zDir + optional xDir).\n const makeAxis = (__type: 'axis2' | 'axis3') =>\n (ox: number, oy: number, oz: number, zx: number, zy: number, zz: number, xx?: number, xy?: number, xz?: number) => ({\n origin: { x: ox, y: oy, z: oz },\n zDir: { x: zx, y: zy, z: zz },\n xDir: xx !== undefined ? { x: xx, y: xy as number, z: xz as number } : undefined,\n __type,\n delete: noop,\n })\n adapter['createAxis2'] = makeAxis('axis2')\n adapter['createAxis3'] = makeAxis('axis3')\n}\n\n/** 把 BrepEngineApi 透传包装为 KernelAdapter 形态(非 occt 引擎)。 */\nfunction wrapBrepEngineApi(api: BrepEngineApi): KernelAdapter {\n const adapter: Record<string, unknown> = {\n // 生命周期:vendored 面统一用 dispose(BrepEngineApi 用 release)。\n dispose: (h: unknown) => api.release(h as never),\n }\n synthesizeGlueMethods(adapter)\n for (const key of Object.keys(api)) {\n if (key === 'release') continue // 上面已映射为 dispose\n adapter[key] = (api as unknown as Record<string, unknown>)[key]\n }\n // 测量面映射在透传之后追加,覆盖同名键(vendored 名 → BrepEngineApi 名 + 形态转换)。\n mapMeasureMethods(adapter, api)\n // pattern 族形态适配(BrepEngineApi 对象 Vec3 ↔ vendored 三元组)。\n adapter['linearPattern'] = (\n shape: unknown,\n direction: [number, number, number],\n spacing: number,\n count: number,\n ) =>\n api.linearPattern(\n shape as never,\n { x: direction[0], y: direction[1], z: direction[2] },\n spacing,\n count,\n ).map((h) => ({ wrapped: h, type: 'solid' }))\n adapter['circularPattern'] = (\n shape: unknown,\n center: [number, number, number],\n axis: [number, number, number],\n angleStep: number,\n count: number,\n ) =>\n api.circularPattern(\n shape as never,\n { x: center[0], y: center[1], z: center[2] },\n { x: axis[0], y: axis[1], z: axis[2] },\n angleStep,\n count,\n ).map((h) => ({ wrapped: h, type: 'solid' }))\n adapter['gridPattern'] = (\n shape: unknown,\n directionX: [number, number, number],\n directionY: [number, number, number],\n spacingX: number,\n spacingY: number,\n countX: number,\n countY: number,\n ) => ({\n wrapped: api.gridPattern(\n shape as never,\n { x: directionX[0], y: directionX[1], z: directionX[2] },\n { x: directionY[0], y: directionY[1], z: directionY[2] },\n spacingX,\n spacingY,\n countX,\n countY,\n ),\n type: 'compound',\n })\n return adapter as unknown as KernelAdapter\n}\n\n/**\n * 装配期完整性检查:KernelAdapter 胶水方法齐备断言。\n *\n * @param id - 引擎注册 id(报错时定位到引擎)。\n * @param adapter - 待注入 vendored registry 的 KernelAdapter。\n * @throws 缺失任一胶水方法 → 装配期报错(列出引擎 id 与缺失方法名)。\n */\nexport function assertGlueMethodsComplete(id: string, adapter: KernelAdapter): void {\n const missing = GLUE_METHODS.filter((m) => typeof (adapter as unknown as Record<string, unknown>)[m] !== 'function')\n if (missing.length > 0) {\n throw new Error(\n `[faijs] BREP engine '${id}' cannot back the vendored compat surface: KernelAdapter ` +\n `missing glue method(s): ${missing.join(', ')}. These auxiliary construction methods ` +\n `(createVector3d / createPoint3d / createDirection3d / createAxis1/2/3) are required by ` +\n `the vendored kernel boundary and cannot be covered by capability declarations. ` +\n `Fix the adapter (add real implementations) or do not inject this engine into the vendored registry.`\n )\n }\n}\n\n/**\n * Test-only: clear the injection cache and reset the vendored kernel registry\n * so a re-assembly (e.g. switching engines in tests) re-runs buildKernelAdapter\n * + assertGlueMethodsComplete for the new engine. Never called in prod.\n */\nexport function __resetKernelInjectionForTests(): void {\n _injected = false\n __resetKernelRegistryForTests()\n}\n\n/**\n * Whether the vendored kernel registry has been injected (engine-neutral D10).\n *\n * 取代旧的 `isOcctKernelBound()`(其判据 `_bound && getActiveKernelId() === 'occt-wasm'`\n * 把注入面写死为 occt)。新判据只问「vendored registry 是否已注入当前引擎」——\n * 不关心引擎 id,装配期换引擎(brepkit/mock)同样成立。\n *\n * @returns 注入是否已完成(vendored registry 已装配当前 BREP 引擎)。\n */\nexport function isKernelInjected(): boolean {\n syncRegistryFromGlobal()\n return _injected || getActiveKernelId() !== null\n}\n\n/**\n * Access the currently injected vendored kernel adapter (reads the registry).\n * @throws If the bridge has not been injected.\n * @returns the vendored kernel adapter for the current BREP engine.\n */\nexport function getBrepjsKernel(): KernelAdapter {\n return getVendoredKernel()\n}\n\n/**\n * 固定绑定 occt 内核到 vendored registry(Phase 2 前的装配方式)。\n *\n * @deprecated Phase 2 P2-5:固定绑定已被引擎中立的 injectCurrentBrepEngineAsKernel\n * 取代。保留导出仅为兼容旧调用点(适配器层迁移期);新代码一律用注入函数。\n * @returns 恒抛错——本函数已移除,仅保留签名占位。\n */\nexport function bindOcctKernel(): KernelAdapter {\n void getFaijsKernel\n throw new Error(\n '[faijs] bindOcctKernel() removed (Phase 2 P2-5): use injectCurrentBrepEngineAsKernel() ' +\n 'during host assembly to inject the current BREP engine into the vendored registry.'\n )\n}\n\n/**\n * 旧 occt 专用注入判据(Phase 2 前语义:绑定且激活内核为 occt-wasm)。\n *\n * @deprecated Phase 2 P2-5:occt 专用判据已被引擎中立的 isKernelInjected() 取代。\n * @returns 当前是否已注入(透传 isKernelInjected())。\n */\nexport function isOcctKernelBound(): boolean {\n return isKernelInjected()\n}\n"]}
1
+ {"version":3,"file":"occt-kernel-bridge.js","sourceRoot":"","sources":["../../src/api/occt-kernel-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * L3 bridge — vendored kernel registry injection (engine-neutral, Phase 2 P2-5).\n *\n * @platform occt — 本文件 import occt-kernel(occtKernel):桥接层把当前引擎的\n * BrepEngineApi 适配器包装为 brepjs KernelAdapter 注入 vendored registry,平台\n * 类型(OcctKernel 句柄)只在桥内出现;守卫 R1 豁免、R2 无 defineOp 不适用。\n *\n * 原 occt-kernel-bridge 的职责是「把 vendored kernel registry 冻结绑定到 occt-wasm\n * 单实例」(D10)。Phase 2 起改为**跟随当前 BREP 引擎**:装配期把 registry 里当前\n * 引擎(occt / brepkit / mock)的 `BrepEngineApi` 适配器包装为 brepjs `KernelAdapter`\n * 形态注册进 vendored registry,使 `vendoredRegistry.getKernel()` 返回当前引擎——\n * vendored 函数全部逻辑(命名/角色表/Result)原样保留、零改动。\n *\n * 边界规则(D8/R5)不变:本文件是 faijs 侧唯一把 vendored kernel registry 与\n * faijs 引擎接线的地方;core 侧只从 `api/` import vendored 树。\n *\n * 装配期完整性检查(方案 §Phase 2.5):KernelAdapter 是 211 方法大接口,但 vendored\n * 面存在大量**辅助构造方法**(createVector3d / createPoint3d / createDirection3d /\n * createAxis1 / createAxis2 / createAxis3,见 vendored core/kernelBoundary.ts)——\n * 它们不落在能力名体系内(BrepMethodKind 之外)、无法由 op 声明覆盖,任何 compat\n * op / TS compat 面都可能触发。⇒ 注入前必须断言这些胶水方法在适配器上齐备,缺失\n * 则在**装配期**报错(而非执行期崩)。清单见 {@link GLUE_METHODS}。\n */\n\nimport { getKernel as getFaijsKernel } from '../occt-kernel/occtKernel'\nimport { getBrepEngine, type BrepEngine } from '../brep/engine/registry'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport { OcctWasmAdapter } from '@faicad/faijs-brepjs/kernel/occtWasm/occtWasmAdapter.js'\nimport {\n freezeKernels,\n getActiveKernelId,\n getKernel as getVendoredKernel,\n registerKernel,\n syncRegistryFromGlobal,\n syncRegistryToGlobal,\n __resetKernelRegistryForTests,\n} from '@faicad/faijs-brepjs/kernel/index.js'\nimport type { KernelAdapter } from '@faicad/faijs-brepjs/kernel/types.js'\n\n/** occt-wasm 适配器在 vendored registry 中的注册 id。这是 vendored 注册表的\n * 槽位名(宿主侧判据 + D10 globalThis 单例兼容),**不是**引擎身份标识——\n * 实际引擎由注入的 adapter 决定(vendored 面全部无参 `getKernel()` 取默认)。 */\nexport const VENDORED_OCCT_KERNEL_ID = 'occt-wasm'\n\n/**\n * 装配期完整性检查清单——vendored 面辅助构造/生命周期胶水方法。\n *\n * 这些方法不在 `BrepMethodKind` 能力名体系内(能力判定无法覆盖),但 vendored 面\n * 大量使用(kernelBoundary.ts / wrapperFns / castShape 等)。当前引擎的\n * KernelAdapter 包装必须全部具备,否则对应 compat op / TS compat 面会在执行期崩。\n *\n * Phase 0 盘点实证:36 个 compat op 的 vendored 函数(capability-map 64 方法)与\n * kernelBoundary 都不需要 createAxis*(2D sketcher / TS compat 面需要)——清单按\n * 「vendored 面实际触发面」保守枚举,缺即装配期报错。\n */\nconst GLUE_METHODS = [\n 'createVector3d',\n 'createPoint3d',\n 'createDirection3d',\n 'createAxis1',\n 'createAxis2',\n 'createAxis3',\n] as const\n\nlet _injected = false\n\n/**\n * Inject the currently-registered BREP engine into the vendored kernel registry\n * (replaces the old occt-only `bindOcctKernel()` fixed binding, Phase 2 P2-5).\n *\n * 装配期调用(在 `registerOcctBrepEngine()` / 其它引擎注册之后)。从引擎注册表取\n * 当前默认 BREP 引擎,按其 id 构造 KernelAdapter 形态注册进 vendored registry:\n *\n * - occt:`OcctWasmAdapter.fromKernel(当前引擎 primitives)`——同一 occt-wasm 单实例\n * (D10 不变),211 方法完整适配器,vendored 函数行为与旧 bindOcctKernel 完全一致;\n * - 其它引擎(brepkit/mock):将 BrepEngineApi 透传包装为 KernelAdapter 形态\n * (`dispose`→`release` 等方法名映射 + pattern 返回形态适配),**不做方法伪造**;\n * - 任一引擎注入前都做**装配期完整性检查**(GLUE_METHODS 齐备断言)。\n *\n * 幂等:首次调用后注册并冻结;重复调用返回已注入的适配器。\n *\n * @returns 注册进 vendored registry 的 kernel adapter。\n * @throws 无 BREP 引擎注册;或完整性检查失败(胶水方法缺失)——装配期报错。\n */\nexport async function injectCurrentBrepEngineAsKernel(): Promise<KernelAdapter> {\n // CDN 宿主跨实例同步:host bundle 已注入则直接复用(同旧 bindOcctKernel 语义)。\n // 短路判据与 isKernelInjected() 一致(含 registry 侧激活 id 分支),避免\n // 「registry 已注入但模块级 _injected=false」时走完整路径撞 frozen 抛错。\n syncRegistryFromGlobal()\n if (isKernelInjected()) return getVendoredKernel()\n\n const engine = await getBrepEngine()\n const adapter = buildKernelAdapter(engine)\n assertGlueMethodsComplete(engine.id, adapter)\n\n registerKernel(VENDORED_OCCT_KERNEL_ID, adapter)\n freezeKernels()\n _injected = true\n syncRegistryToGlobal()\n return adapter\n}\n\n/**\n * 按引擎 id 构造 KernelAdapter 形态(occt 走完整适配器;其它引擎透传包装)。\n *\n * occt 分支保持旧 bindOcctKernel 行为:OcctWasmAdapter.fromKernel 需要 occt-wasm\n * 实例(OcctKernelOwner)。当前引擎的 primitives 即 initOcctWasm 单例(occtApi 是\n * 同一实例的实例覆盖,方法面完整),转换安全。\n *\n * 其它引擎分支:BrepEngineApi → KernelAdapter 契约面——\n * - `dispose` → `release`(vendored 面用 dispose,BrepEngineApi 用 release);\n * - `linearPattern` / `circularPattern` 的方向/中心/轴参数是 Vec3 对象(BrepEngineApi\n * 口径),vendored 面传 [x,y,z] 三元组——包装为对象再转发;\n * - 返回 BrepHandle[](BrepEngineApi)→ KernelShape[](vendored castResultShape 消费\n * `.wrapped` + `.type`)——包装为 `{ wrapped, type: 'solid' }`;\n * - `gridPattern` 返回单 BrepHandle → 单 KernelShape(compound 语义一致)。\n * 不声明 `rectangularPattern`(纯 JS 组合,不调内核——capability-map 实证)。\n *\n * ⚠️ 不伪造:BrepEngineApi 未提供的方法**不**补桩;vendored 函数若触发,由\n * compat op 的静态能力判定(backend-dispatch,Phase 1)在执行前拦截。\n *\n * @param engine - 当前 BREP 引擎(装配期从引擎注册表取得)。\n * @returns 该引擎的 vendored KernelAdapter(occt → OcctWasmAdapter.fromKernel;\n * 其它引擎 → BrepEngineApi 透传包装,pattern 族 Vec3↔三元组适配)。\n */\nexport function buildKernelAdapter(engine: BrepEngine): KernelAdapter {\n if (engine.id === 'occt') {\n // Phase 3 (narrowing plan): engine.primitives is now the L1 adapter object\n // (createOcctPrimitives), NOT the raw kernel — the old cast lied. The\n // vendored full adapter needs the raw occt-wasm singleton, which is exactly\n // what getKernel() returns (process-level singleton, D10 unchanged).\n const faijsKernel = getFaijsKernel()\n return OcctWasmAdapter.fromKernel(faijsKernel)\n }\n return wrapBrepEngineApi(engine.primitives)\n}\n\n/** No-op `delete` for synthesized glue objects (mirrors vendored `noop`). */\nconst noop = (): void => {}\n\n/**\n * vendored 测量名 ↔ BrepEngineApi 能力映射(Phase 6 收口,D7):\n * area/length 已映射到 L1 测量面(getSurfaceArea/getLength,Phase 4 D9 接线);\n * linearCenterOfMass 无 L1 对应(L2 平台面,primitives.ts 注释),保留真实缺口——\n * 不补桩、不返回 0(静默 0 比崩溃更糟),测试内联钉住 undefined。\n */\n\n/** Unwrap a vendored KernelShape (handle view or bare number) to a BrepHandle. */\nfunction unwrapHandle(h: unknown): unknown {\n if (typeof h === 'number') return h\n const view = h as { id?: unknown }\n return typeof view.id === 'number' ? view.id : h\n}\n\n/**\n * Map vendored measure method names/shapes onto BrepEngineApi capabilities.\n * The vendored measure face calls `kernel.volume/area/length/centerOfMass/...`\n * (its own naming); the occt adapter carries an internal mapping layer — this\n * is the engine-neutral equivalent for any wrapped BrepEngineApi. Only real\n * BrepEngineApi capabilities are mapped; the rest stay in the gap registry.\n */\nfunction mapMeasureMethods(adapter: Record<string, unknown>, api: BrepEngineApi): void {\n adapter['volume'] = (s: unknown) => api.getVolume(unwrapHandle(s) as never)\n adapter['centerOfMass'] = (s: unknown): [number, number, number] => {\n const v = api.getCenterOfMass(unwrapHandle(s) as never)\n return [v.x, v.y, v.z]\n }\n adapter['boundingBox'] = (s: unknown) => {\n const bb = api.getBoundingBox(unwrapHandle(s) as never, true)\n return {\n min: [bb.xmin, bb.ymin, bb.zmin],\n max: [bb.xmax, bb.ymax, bb.zmax],\n }\n }\n adapter['area'] = (s: unknown) => api.getSurfaceArea(unwrapHandle(s) as never)\n adapter['length'] = (s: unknown) => api.getLength(unwrapHandle(s) as never)\n // shapeType / isNull: same name, same semantics — already covered by the\n // transparent pass-through in wrapBrepEngineApi; listed here for docs only.\n // linearCenterOfMass(L2 平台面)无 L1 对应,保持 undefined(缺口由测试内联钉住)。\n}\n\n/**\n * Synthesize the vendored glue/auxiliary construction methods over any engine's\n * primitives. These 6 methods are pure JS data-literal constructors in the\n * vendored surface (zero kernel calls — see vendored constructionOps.ts), i.e.\n * a *calling convention*, not a kernel capability — so they are synthesized at\n * the faijs wrapper layer (engine-neutral) rather than added to BrepEngineApi.\n * Field shapes are copied verbatim from the vendored occt adapter; `delete` is\n * mandatory (kernelBoundary's with* helpers call it in `finally`).\n */\nfunction synthesizeGlueMethods(adapter: Record<string, unknown>): void {\n const pnt = (x: number, y: number, z: number, __type: string) => ({ x, y, z, __type, delete: noop })\n adapter['createPoint3d'] = (x: number, y: number, z: number) => pnt(x, y, z, 'point3d')\n adapter['createDirection3d'] = (x: number, y: number, z: number) => pnt(x, y, z, 'direction3d')\n adapter['createVector3d'] = (x: number, y: number, z: number) => pnt(x, y, z, 'vector3d')\n adapter['createAxis1'] = (cx: number, cy: number, cz: number, dx: number, dy: number, dz: number) => ({\n origin: { x: cx, y: cy, z: cz },\n direction: { x: dx, y: dy, z: dz },\n __type: 'axis1',\n delete: noop,\n })\n // axis2/axis3: 6- or 9-arg forms (origin + zDir + optional xDir).\n const makeAxis = (__type: 'axis2' | 'axis3') =>\n (ox: number, oy: number, oz: number, zx: number, zy: number, zz: number, xx?: number, xy?: number, xz?: number) => ({\n origin: { x: ox, y: oy, z: oz },\n zDir: { x: zx, y: zy, z: zz },\n xDir: xx !== undefined ? { x: xx, y: xy as number, z: xz as number } : undefined,\n __type,\n delete: noop,\n })\n adapter['createAxis2'] = makeAxis('axis2')\n adapter['createAxis3'] = makeAxis('axis3')\n}\n\n/** 把 BrepEngineApi 透传包装为 KernelAdapter 形态(非 occt 引擎)。 */\nfunction wrapBrepEngineApi(api: BrepEngineApi): KernelAdapter {\n const adapter: Record<string, unknown> = {\n // 生命周期:vendored 面统一用 dispose(BrepEngineApi 用 release)。\n dispose: (h: unknown) => api.release(h as never),\n }\n synthesizeGlueMethods(adapter)\n for (const key of Object.keys(api)) {\n if (key === 'release') continue // 上面已映射为 dispose\n adapter[key] = (api as unknown as Record<string, unknown>)[key]\n }\n // 测量面映射在透传之后追加,覆盖同名键(vendored 名 → BrepEngineApi 名 + 形态转换)。\n mapMeasureMethods(adapter, api)\n // pattern 族形态适配(BrepEngineApi 对象 Vec3 ↔ vendored 三元组)。\n adapter['linearPattern'] = (\n shape: unknown,\n direction: [number, number, number],\n spacing: number,\n count: number,\n ) =>\n api.linearPattern(\n shape as never,\n { x: direction[0], y: direction[1], z: direction[2] },\n spacing,\n count,\n ).map((h) => ({ wrapped: h, type: 'solid' }))\n adapter['circularPattern'] = (\n shape: unknown,\n center: [number, number, number],\n axis: [number, number, number],\n angleStep: number,\n count: number,\n ) =>\n api.circularPattern(\n shape as never,\n { x: center[0], y: center[1], z: center[2] },\n { x: axis[0], y: axis[1], z: axis[2] },\n angleStep,\n count,\n ).map((h) => ({ wrapped: h, type: 'solid' }))\n adapter['gridPattern'] = (\n shape: unknown,\n directionX: [number, number, number],\n directionY: [number, number, number],\n spacingX: number,\n spacingY: number,\n countX: number,\n countY: number,\n ) => ({\n wrapped: api.gridPattern(\n shape as never,\n { x: directionX[0], y: directionX[1], z: directionX[2] },\n { x: directionY[0], y: directionY[1], z: directionY[2] },\n spacingX,\n spacingY,\n countX,\n countY,\n ),\n type: 'compound',\n })\n return adapter as unknown as KernelAdapter\n}\n\n/**\n * 装配期完整性检查:KernelAdapter 胶水方法齐备断言。\n *\n * @param id - 引擎注册 id(报错时定位到引擎)。\n * @param adapter - 待注入 vendored registry 的 KernelAdapter。\n * @throws 缺失任一胶水方法 → 装配期报错(列出引擎 id 与缺失方法名)。\n */\nexport function assertGlueMethodsComplete(id: string, adapter: KernelAdapter): void {\n const missing = GLUE_METHODS.filter((m) => typeof (adapter as unknown as Record<string, unknown>)[m] !== 'function')\n if (missing.length > 0) {\n throw new Error(\n `[faijs] BREP engine '${id}' cannot back the vendored compat surface: KernelAdapter ` +\n `missing glue method(s): ${missing.join(', ')}. These auxiliary construction methods ` +\n `(createVector3d / createPoint3d / createDirection3d / createAxis1/2/3) are required by ` +\n `the vendored kernel boundary and cannot be covered by capability declarations. ` +\n `Fix the adapter (add real implementations) or do not inject this engine into the vendored registry.`\n )\n }\n}\n\n/**\n * Test-only: clear the injection cache and reset the vendored kernel registry\n * so a re-assembly (e.g. switching engines in tests) re-runs buildKernelAdapter\n * + assertGlueMethodsComplete for the new engine. Never called in prod.\n */\nexport function __resetKernelInjectionForTests(): void {\n _injected = false\n __resetKernelRegistryForTests()\n}\n\n/**\n * Whether the vendored kernel registry has been injected (engine-neutral D10).\n *\n * 取代旧的 `isOcctKernelBound()`(其判据 `_bound && getActiveKernelId() === 'occt-wasm'`\n * 把注入面写死为 occt)。新判据只问「vendored registry 是否已注入当前引擎」——\n * 不关心引擎 id,装配期换引擎(brepkit/mock)同样成立。\n *\n * @returns 注入是否已完成(vendored registry 已装配当前 BREP 引擎)。\n */\nexport function isKernelInjected(): boolean {\n syncRegistryFromGlobal()\n return _injected || getActiveKernelId() !== null\n}\n\n/**\n * Access the currently injected vendored kernel adapter (reads the registry).\n * @throws If the bridge has not been injected.\n * @returns the vendored kernel adapter for the current BREP engine.\n */\nexport function getBrepjsKernel(): KernelAdapter {\n return getVendoredKernel()\n}\n\n/**\n * 固定绑定 occt 内核到 vendored registry(Phase 2 前的装配方式)。\n *\n * @deprecated Phase 2 P2-5:固定绑定已被引擎中立的 injectCurrentBrepEngineAsKernel\n * 取代。保留导出仅为兼容旧调用点(适配器层迁移期);新代码一律用注入函数。\n * @returns 恒抛错——本函数已移除,仅保留签名占位。\n */\nexport function bindOcctKernel(): KernelAdapter {\n void getFaijsKernel\n throw new Error(\n '[faijs] bindOcctKernel() removed (Phase 2 P2-5): use injectCurrentBrepEngineAsKernel() ' +\n 'during host assembly to inject the current BREP engine into the vendored registry.'\n )\n}\n\n/**\n * 旧 occt 专用注入判据(Phase 2 前语义:绑定且激活内核为 occt-wasm)。\n *\n * @deprecated Phase 2 P2-5:occt 专用判据已被引擎中立的 isKernelInjected() 取代。\n * @returns 当前是否已注入(透传 isKernelInjected())。\n */\nexport function isOcctKernelBound(): boolean {\n return isKernelInjected()\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/api/pattern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAqDhD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa;;CAUxB,CAAA"}
1
+ {"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/api/pattern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAoDhD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa;;CAUxB,CAAA"}
@@ -9,7 +9,8 @@
9
9
  * 倍数即得 k;再按「面内坐标」(centroid − t·dir)匹配输入面对应面,回投其 inner role。
10
10
  */
11
11
  import { solidToShape } from '../brep/brep-ops.js';
12
- import { getBackends, getCurrentStmt, keep } from '../runtime-state.js';
12
+ import { getCurrentStmt, keep } from '../runtime-state.js';
13
+ import { getBrepApi } from '../brep/handle-bridge.js';
13
14
  import { fromBrep, brepOf } from '../shape.js';
14
15
  import { defineOp } from '../sdk.js';
15
16
  import { buildReplicaRoleTable } from './internal/replica-role-table.js';
@@ -22,9 +23,7 @@ function norm(v) {
22
23
  }
23
24
  /** BREP 路径:沿 direction 复制 count 份,质心聚类回投输入面角色。 */
24
25
  function linearPatternBrep(input, direction, count, spacing) {
25
- const kernel = getBackends().kernel.brep;
26
- if (!kernel)
27
- throw new Error('[stdlib/pattern] no OCCT kernel');
26
+ const kernel = getBrepApi();
28
27
  const inputSolid = brepOf(input);
29
28
  if (!inputSolid)
30
29
  throw new Error('[stdlib/pattern] input is not BREP');