@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,51 @@
1
+ /**
2
+ * stdlib helix — 螺旋线(1D 曲线,平台 op engines:['occt'])
3
+ *
4
+ * @platform occt — 本文件 import occt-kernel:螺旋线用 `makeHelixWire` 构造
5
+ * (occt-wasm 原生有,L1 无)。守卫 ① 要求平台 import 自证身份;调用方 op 声明
6
+ * `engines: ['occt']` 由守卫 ② 校验。
7
+ *
8
+ * 用途:G-D 门控层的 1D 造线能力(Phase 3)。下游 sweep / loft 等可用螺旋线作 spine。
9
+ *
10
+ * 设计:
11
+ * - 平台 op:occt 原生 makeHelixWire(occt-wasm 有,L1 无)→ 声明 engines:['occt'](D11)。
12
+ * 不声明 capabilities:实现直连平台原生方法,能力由引擎身份本身界定。
13
+ * - 1D 产物:经 fromBrepCurve 登记,kind='curve'。
14
+ * - 非 occt 引擎(brepkit)→ 执行前 BrepUnsupportedError(D11-4);brep_mock 受 D11-3
15
+ * 豁免不拦截(且 getOcctKernel 为全局 occt 实例,brep_mock 下仍可真实出线)。
16
+ */
17
+ import type { Shape } from '../mesh/types.js';
18
+ /** `cad.helix` 参数。 */
19
+ export interface HelixOptions {
20
+ /** 螺旋半径(mm,>0)。 */
21
+ radius: number;
22
+ /** 螺距(mm,每圈沿轴的推进量,≠0)。 */
23
+ pitch: number;
24
+ /** 圈数(>0)。 */
25
+ turns: number;
26
+ /** 螺旋轴方向(单位向量,默认 +Z)。 */
27
+ axis?: [number, number, number];
28
+ /** 起点(默认原点)。 */
29
+ origin?: [number, number, number];
30
+ }
31
+ /**
32
+ * 构造螺旋线(1D 曲线)。
33
+ * @group 创建
34
+ * @inputs 0
35
+ * @async false
36
+ * @qual ok
37
+ * @name helix
38
+ * @note 平台 op:仅 occt 引擎(原生 makeHelixWire)。非 occt 引擎执行前报错;brep_mock 不拦截。
39
+ * @returns Shape 1D 螺旋线(kind:'curve')。
40
+ * @param options.radius - 螺旋半径(mm,>0)。type:number required:true
41
+ * @param options.pitch - 螺距(mm,≠0)。type:number required:true
42
+ * @param options.turns - 圈数(>0)。type:number required:true
43
+ * @param options.axis - 螺旋轴方向(默认 +Z)。type:Vec3 required:false
44
+ * @param options.origin - 起点(默认原点)。type:Vec3 required:false
45
+ * @example
46
+ * const h = cad.helix({ radius: 5, pitch: 2, turns: 3 })
47
+ */
48
+ export declare const helix: ((opts: HelixOptions) => Promise<Shape>) & {
49
+ __faijs__dualOp?: import("../define-op.js").DualOpMeta;
50
+ };
51
+ //# sourceMappingURL=helix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helix.d.ts","sourceRoot":"","sources":["../../src/api/helix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAS1C,sBAAsB;AACtB,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,cAAc;IACd,KAAK,EAAE,MAAM,CAAA;IACb,yBAAyB;IACzB,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,gBAAgB;IAChB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAuBD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,KAAK;;CAMhB,CAAA"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * stdlib helix — 螺旋线(1D 曲线,平台 op engines:['occt'])
3
+ *
4
+ * @platform occt — 本文件 import occt-kernel:螺旋线用 `makeHelixWire` 构造
5
+ * (occt-wasm 原生有,L1 无)。守卫 ① 要求平台 import 自证身份;调用方 op 声明
6
+ * `engines: ['occt']` 由守卫 ② 校验。
7
+ *
8
+ * 用途:G-D 门控层的 1D 造线能力(Phase 3)。下游 sweep / loft 等可用螺旋线作 spine。
9
+ *
10
+ * 设计:
11
+ * - 平台 op:occt 原生 makeHelixWire(occt-wasm 有,L1 无)→ 声明 engines:['occt'](D11)。
12
+ * 不声明 capabilities:实现直连平台原生方法,能力由引擎身份本身界定。
13
+ * - 1D 产物:经 fromBrepCurve 登记,kind='curve'。
14
+ * - 非 occt 引擎(brepkit)→ 执行前 BrepUnsupportedError(D11-4);brep_mock 受 D11-3
15
+ * 豁免不拦截(且 getOcctKernel 为全局 occt 实例,brep_mock 下仍可真实出线)。
16
+ */
17
+ import { solidToShape } from '../brep/brep-ops.js';
18
+ import { getBrepApi } from '../brep/handle-bridge.js';
19
+ import { fromBrepCurve } from '../shape.js';
20
+ import { defineOp } from '../sdk.js';
21
+ import { getOcctKernel } from '../occt-kernel/occtKernel.js';
22
+ /** BREP 路径:用 occt 原生 makeHelixWire 构造螺旋线,登记 1D 句柄。 */
23
+ function helixBrep(opts) {
24
+ const { radius, pitch, turns } = opts;
25
+ if (!(radius > 0))
26
+ throw new Error('E_HELIX_BAD_RADIUS: radius must be > 0');
27
+ if (!(pitch !== 0))
28
+ throw new Error('E_HELIX_BAD_PITCH: pitch must be non-zero');
29
+ if (!(turns > 0))
30
+ throw new Error('E_HELIX_BAD_TURNS: turns must be > 0');
31
+ const axis = opts.axis ?? [0, 0, 1];
32
+ const origin = opts.origin ?? [0, 0, 0];
33
+ const height = pitch * turns;
34
+ const kernel = getBrepApi();
35
+ const occt = getOcctKernel();
36
+ const handle = occt.makeHelixWire({ x: origin[0], y: origin[1], z: origin[2] }, { x: axis[0], y: axis[1], z: axis[2] }, pitch, height, radius);
37
+ return fromBrepCurve(solidToShape(kernel, handle), { solid: handle });
38
+ }
39
+ /**
40
+ * 构造螺旋线(1D 曲线)。
41
+ * @group 创建
42
+ * @inputs 0
43
+ * @async false
44
+ * @qual ok
45
+ * @name helix
46
+ * @note 平台 op:仅 occt 引擎(原生 makeHelixWire)。非 occt 引擎执行前报错;brep_mock 不拦截。
47
+ * @returns Shape 1D 螺旋线(kind:'curve')。
48
+ * @param options.radius - 螺旋半径(mm,>0)。type:number required:true
49
+ * @param options.pitch - 螺距(mm,≠0)。type:number required:true
50
+ * @param options.turns - 圈数(>0)。type:number required:true
51
+ * @param options.axis - 螺旋轴方向(默认 +Z)。type:Vec3 required:false
52
+ * @param options.origin - 起点(默认原点)。type:Vec3 required:false
53
+ * @example
54
+ * const h = cad.helix({ radius: 5, pitch: 2, turns: 3 })
55
+ */
56
+ export const helix = defineOp({
57
+ brep(opts) {
58
+ return helixBrep(opts);
59
+ },
60
+ engines: ['occt'],
61
+ naming: { kind: 'unmodeled', reason: 'construct vocabulary pending Phase 3' },
62
+ });
63
+ //# sourceMappingURL=helix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helix.js","sourceRoot":"","sources":["../../src/api/helix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAgBzD,sDAAsD;AACtD,SAAS,SAAS,CAAC,IAAkB;IACnC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IACrC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC5E,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAChF,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,KAAK,GAAG,KAAK,CAAA;IAC5B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,IAAI,GAAG,aAAa,EAAE,CAAA;IAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAC/B,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAC5C,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EACtC,KAAK,EACL,MAAM,EACN,MAAM,CACkB,CAAA;IAC1B,OAAO,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AACvE,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC5B,IAAI,CAAC,IAAkB;QACrB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,sCAAsC,EAAgB;CAC5F,CAAC,CAAA","sourcesContent":["/**\n * stdlib helix — 螺旋线(1D 曲线,平台 op engines:['occt'])\n *\n * @platform occt — 本文件 import occt-kernel:螺旋线用 `makeHelixWire` 构造\n * (occt-wasm 原生有,L1 无)。守卫 ① 要求平台 import 自证身份;调用方 op 声明\n * `engines: ['occt']` 由守卫 ② 校验。\n *\n * 用途:G-D 门控层的 1D 造线能力(Phase 3)。下游 sweep / loft 等可用螺旋线作 spine。\n *\n * 设计:\n * - 平台 op:occt 原生 makeHelixWire(occt-wasm 有,L1 无)→ 声明 engines:['occt'](D11)。\n * 不声明 capabilities:实现直连平台原生方法,能力由引擎身份本身界定。\n * - 1D 产物:经 fromBrepCurve 登记,kind='curve'。\n * - 非 occt 引擎(brepkit)→ 执行前 BrepUnsupportedError(D11-4);brep_mock 受 D11-3\n * 豁免不拦截(且 getOcctKernel 为全局 occt 实例,brep_mock 下仍可真实出线)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport type { BrepHandle } from '../brep/engine/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { fromBrepCurve } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { getOcctKernel } from '../occt-kernel/occtKernel'\n\n/** `cad.helix` 参数。 */\nexport interface HelixOptions {\n /** 螺旋半径(mm,>0)。 */\n radius: number\n /** 螺距(mm,每圈沿轴的推进量,≠0)。 */\n pitch: number\n /** 圈数(>0)。 */\n turns: number\n /** 螺旋轴方向(单位向量,默认 +Z)。 */\n axis?: [number, number, number]\n /** 起点(默认原点)。 */\n origin?: [number, number, number]\n}\n\n/** BREP 路径:用 occt 原生 makeHelixWire 构造螺旋线,登记 1D 句柄。 */\nfunction helixBrep(opts: HelixOptions): Shape {\n const { radius, pitch, turns } = opts\n if (!(radius > 0)) throw new Error('E_HELIX_BAD_RADIUS: radius must be > 0')\n if (!(pitch !== 0)) throw new Error('E_HELIX_BAD_PITCH: pitch must be non-zero')\n if (!(turns > 0)) throw new Error('E_HELIX_BAD_TURNS: turns must be > 0')\n const axis = opts.axis ?? [0, 0, 1]\n const origin = opts.origin ?? [0, 0, 0]\n const height = pitch * turns\n const kernel = getBrepApi()\n const occt = getOcctKernel()\n const handle = occt.makeHelixWire(\n { x: origin[0], y: origin[1], z: origin[2] },\n { x: axis[0], y: axis[1], z: axis[2] },\n pitch,\n height,\n radius,\n ) as unknown as BrepHandle\n return fromBrepCurve(solidToShape(kernel, handle), { solid: handle })\n}\n\n/**\n * 构造螺旋线(1D 曲线)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name helix\n * @note 平台 op:仅 occt 引擎(原生 makeHelixWire)。非 occt 引擎执行前报错;brep_mock 不拦截。\n * @returns Shape 1D 螺旋线(kind:'curve')。\n * @param options.radius - 螺旋半径(mm,>0)。type:number required:true\n * @param options.pitch - 螺距(mm,≠0)。type:number required:true\n * @param options.turns - 圈数(>0)。type:number required:true\n * @param options.axis - 螺旋轴方向(默认 +Z)。type:Vec3 required:false\n * @param options.origin - 起点(默认原点)。type:Vec3 required:false\n * @example\n * const h = cad.helix({ radius: 5, pitch: 2, turns: 3 })\n */\nexport const helix = defineOp({\n brep(opts: HelixOptions) {\n return helixBrep(opts)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: 'construct vocabulary pending Phase 3' } as Provenance,\n})\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"import-step.d.ts","sourceRoot":"","sources":["../../src/api/import-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAO1C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAwCjF"}
1
+ {"version":3,"file":"import-step.d.ts","sourceRoot":"","sources":["../../src/api/import-step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAQ1C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAuCjF"}
@@ -1,4 +1,5 @@
1
1
  import { getBackends, BrepUnsupportedError, getCurrentStmt } from '../runtime-state.js';
2
+ import { getBrepApi } from '../brep/handle-bridge.js';
2
3
  import { OpError } from './internal/result-unwrap.js';
3
4
  import { loadBrep } from '../brep/brep-ops.js';
4
5
  import { fromBrep } from '../shape.js';
@@ -37,8 +38,11 @@ export async function import_step(params) {
37
38
  throw new OpError('import_step', 'E_OP_FAILED', '[api/import_step] assets backend (resolveFile) is required');
38
39
  }
39
40
  const buffer = await assets.resolveFile(path);
40
- const kernel = getBackends().kernel.brep;
41
- if (!kernel) {
41
+ let kernel;
42
+ try {
43
+ kernel = getBrepApi();
44
+ }
45
+ catch {
42
46
  throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: import_step requires an OCCT kernel (STEP has no mesh parser)');
43
47
  }
44
48
  // C6:非实体一等公民(对齐 import_brep)。loadBrep 自适应:CASCADE Topology
@@ -1 +1 @@
1
- {"version":3,"file":"import-step.js","sourceRoot":"","sources":["../../src/api/import-step.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACpF,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAGnC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAA+B;IAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IACxB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,6CAA6C,CAAC,CAAA;IAC3F,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAEhB,CAAA;IACb,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,OAAO,CACf,aAAa,EACb,aAAa,EACb,4DAA4D,CAC7D,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IAE7C,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAA4B,CAAA;IAChE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,oBAAoB,CAC5B,mFAAmF,CACpF,CAAA;IACH,CAAC;IAED,2DAA2D;IAC3D,uDAAuD;IACvD,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,QAAQ,CAC5C,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CACzE,CAAA;IACD,4CAA4C;IAC5C,+CAA+C;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;IACrE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAA;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AACvF,CAAC","sourcesContent":["import type { Shape } from '../mesh/types'\nimport { getBackends, BrepUnsupportedError, getCurrentStmt } from '../runtime-state'\nimport { OpError } from './internal/result-unwrap'\nimport { loadBrep } from '../brep/brep-ops'\nimport { fromBrep } from '../shape'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/**\n * stdlib import_step — 任意路径 STEP 文件导入 op(方案 Phase 5 / Q2 真缺口)\n *\n * 与 `import_brep`(容器资产)和 `cad.load`(编辑器 FileRef)的职责切分:\n * - `cad.import_step` 是 faijs **平台**几何 op:单一本地路径(宿主 `resolveFile`),\n * OCCT STEPControl_Reader 读入,返回持 OCCT 句柄 + roleTable 的 Shape。\n * - `import_brep` 读的是容器 `assets/` 里的冻结 BREP 资产(key,去扩展名);\n * `cad.load` 是 `../3d_editor` 的「文件导入 Feature」(key/path/url 三键分流、\n * 画布语句位置语义),平台侧不要复用它(C7)。\n *\n * 非实体(wire/face/shell)一等公民(C6,对齐 import_brep):始终 allowNonSolid。\n * STEP 是 BREP 专属格式:mesh / 无内核模式抛 E_BREP_UNSUPPORTED。\n *\n * @group 创建\n * @inputs 0\n * @async true\n * @qual ok\n * @name import_step\n * @param params.path - 本地绝对路径(宿主 resolveFile 解析)。type:string required:true\n * @note 平台 STEP 导入 op。读文件经宿主资产解析器(`assets.resolveFile`),与 `cad.load` 同一通道;语义为「任意路径 STEP → OCCT 读入的 Shape」。\n * @note 非实体一等(C6):wire/face/shell 一律可导入。需要实体的 op(布尔、up-to 目标面)在**使用点**报错。\n * @returns Promise<Shape> 持 OCCT 句柄的几何(非实体亦可)。\n * @example\n * const a = await cad.import_step({ path: 'D:/models/box.step' })\n */\n\nexport async function import_step(params: Record<string, unknown>): Promise<Shape> {\n const path = params.path\n if (typeof path !== 'string' || path.length === 0) {\n throw new OpError('import_step', 'E_ARGS', '[api/import_step] path (string) is required')\n }\n\n const assets = getBackends().assets as {\n resolveFile?(path: string): Promise<ArrayBuffer>\n } | undefined\n if (!assets || !assets.resolveFile) {\n throw new OpError(\n 'import_step',\n 'E_OP_FAILED',\n '[api/import_step] assets backend (resolveFile) is required',\n )\n }\n\n const buffer = await assets.resolveFile(path)\n\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) {\n throw new BrepUnsupportedError(\n 'E_BREP_UNSUPPORTED: import_step requires an OCCT kernel (STEP has no mesh parser)',\n )\n }\n\n // C6:非实体一等公民(对齐 import_brep)。loadBrep 自适应:CASCADE Topology\n // 文本走 kernel.fromBREP,其余(STEP/STP)走 kernel.importStep。\n const { solid: solidHandle, shape } = loadBrep(\n kernel, buffer, undefined, undefined, undefined, { allowNonSolid: true },\n )\n // E3(H12):链根建 roleTable——导入文件的面没有语义名,按枚举序命名\n // imported:<i>(同一文件重复导入,枚举序稳定,role 名跨次导入保持一致)。\n const stmtId = String(getCurrentStmt()?.id ?? '')\n const hashes = kernel.subShapeHashes(solidHandle, 'face', 2147483647)\n const roles = new Map<string, number[]>()\n for (let i = 0; i < hashes.length; i++) {\n roles.set(`imported:${i}`, [hashes[i]!])\n }\n return fromBrep(shape, { solid: solidHandle, roleTable: new Map([[stmtId, roles]]) })\n}\n"]}
1
+ {"version":3,"file":"import-step.js","sourceRoot":"","sources":["../../src/api/import-step.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAGnC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAA+B;IAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IACxB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,6CAA6C,CAAC,CAAA;IAC3F,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAEhB,CAAA;IACb,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,OAAO,CACf,aAAa,EACb,aAAa,EACb,4DAA4D,CAC7D,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IAE7C,IAAI,MAAqB,CAAA;IACzB,IAAI,CAAC;QAAC,MAAM,GAAG,UAAU,EAAE,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,oBAAoB,CAChE,mFAAmF,CACpF,CAAA;IACH,CAAC;IAED,2DAA2D;IAC3D,uDAAuD;IACvD,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,QAAQ,CAC5C,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CACzE,CAAA;IACD,4CAA4C;IAC5C,+CAA+C;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;IACrE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAA;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AACvF,CAAC","sourcesContent":["import type { Shape } from '../mesh/types'\nimport { getBackends, BrepUnsupportedError, getCurrentStmt } from '../runtime-state'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { OpError } from './internal/result-unwrap'\nimport { loadBrep } from '../brep/brep-ops'\nimport { fromBrep } from '../shape'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/**\n * stdlib import_step — 任意路径 STEP 文件导入 op(方案 Phase 5 / Q2 真缺口)\n *\n * 与 `import_brep`(容器资产)和 `cad.load`(编辑器 FileRef)的职责切分:\n * - `cad.import_step` 是 faijs **平台**几何 op:单一本地路径(宿主 `resolveFile`),\n * OCCT STEPControl_Reader 读入,返回持 OCCT 句柄 + roleTable 的 Shape。\n * - `import_brep` 读的是容器 `assets/` 里的冻结 BREP 资产(key,去扩展名);\n * `cad.load` 是 `../3d_editor` 的「文件导入 Feature」(key/path/url 三键分流、\n * 画布语句位置语义),平台侧不要复用它(C7)。\n *\n * 非实体(wire/face/shell)一等公民(C6,对齐 import_brep):始终 allowNonSolid。\n * STEP 是 BREP 专属格式:mesh / 无内核模式抛 E_BREP_UNSUPPORTED。\n *\n * @group 创建\n * @inputs 0\n * @async true\n * @qual ok\n * @name import_step\n * @param params.path - 本地绝对路径(宿主 resolveFile 解析)。type:string required:true\n * @note 平台 STEP 导入 op。读文件经宿主资产解析器(`assets.resolveFile`),与 `cad.load` 同一通道;语义为「任意路径 STEP → OCCT 读入的 Shape」。\n * @note 非实体一等(C6):wire/face/shell 一律可导入。需要实体的 op(布尔、up-to 目标面)在**使用点**报错。\n * @returns Promise<Shape> 持 OCCT 句柄的几何(非实体亦可)。\n * @example\n * const a = await cad.import_step({ path: 'D:/models/box.step' })\n */\n\nexport async function import_step(params: Record<string, unknown>): Promise<Shape> {\n const path = params.path\n if (typeof path !== 'string' || path.length === 0) {\n throw new OpError('import_step', 'E_ARGS', '[api/import_step] path (string) is required')\n }\n\n const assets = getBackends().assets as {\n resolveFile?(path: string): Promise<ArrayBuffer>\n } | undefined\n if (!assets || !assets.resolveFile) {\n throw new OpError(\n 'import_step',\n 'E_OP_FAILED',\n '[api/import_step] assets backend (resolveFile) is required',\n )\n }\n\n const buffer = await assets.resolveFile(path)\n\n let kernel: BrepEngineApi\n try { kernel = getBrepApi() } catch { throw new BrepUnsupportedError(\n 'E_BREP_UNSUPPORTED: import_step requires an OCCT kernel (STEP has no mesh parser)',\n )\n }\n\n // C6:非实体一等公民(对齐 import_brep)。loadBrep 自适应:CASCADE Topology\n // 文本走 kernel.fromBREP,其余(STEP/STP)走 kernel.importStep。\n const { solid: solidHandle, shape } = loadBrep(\n kernel, buffer, undefined, undefined, undefined, { allowNonSolid: true },\n )\n // E3(H12):链根建 roleTable——导入文件的面没有语义名,按枚举序命名\n // imported:<i>(同一文件重复导入,枚举序稳定,role 名跨次导入保持一致)。\n const stmtId = String(getCurrentStmt()?.id ?? '')\n const hashes = kernel.subShapeHashes(solidHandle, 'face', 2147483647)\n const roles = new Map<string, number[]>()\n for (let i = 0; i < hashes.length; i++) {\n roles.set(`imported:${i}`, [hashes[i]!])\n }\n return fromBrep(shape, { solid: solidHandle, roleTable: new Map([[stmtId, roles]]) })\n}\n"]}
@@ -15,8 +15,20 @@ export { union, subtract, intersect, cut } from './boolean.js';
15
15
  export { engrave } from './engrave.js';
16
16
  export { chamfer } from './chamfer.js';
17
17
  export { fillet } from './fillet.js';
18
+ export { shell, type ShellParams } from './shell.js';
19
+ export { draft, type DraftParams } from './draft.js';
20
+ export { thicken } from './thicken.js';
21
+ export { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace, type SewParams } from './feature-repair.js';
22
+ export { filletVariable } from './fillet-variable.js';
23
+ export { splitByPlane, type SplitByPlaneParams } from './split-by-plane.js';
24
+ export { sectionByPlane, type SectionByPlaneParams } from './section-by-plane.js';
18
25
  export { screw } from './screw.js';
19
26
  export { sketch } from './sketch.js';
27
+ export { wire } from './wire.js';
28
+ export { helix } from './helix.js';
29
+ export { split } from './split.js';
30
+ export { sweep } from './sweep.js';
31
+ export { loft } from './loft.js';
20
32
  export { knurl } from './knurl.js';
21
33
  export { sdf } from './sdf.js';
22
34
  export { applyTransform } from '../mesh/rigid-transform.js';
@@ -31,13 +43,14 @@ export { faceRef } from './face-ref.js';
31
43
  export { asset } from './asset.js';
32
44
  export { solid, isShape, isCompound } from '../shape.js';
33
45
  export { compound as structCompound } from '../shape.js';
34
- export type { ShapeSlot, SolidShape, CompoundShape, StdShape, ShapeKind } from '../shape.js';
46
+ export type { ShapeSlot, SolidShape, CompoundShape, CurveShape, StdShape, ShapeKind } from '../shape.js';
47
+ export type { Shape } from '../mesh/types.js';
35
48
  export * from './generated/script-face.js';
36
49
  export { extrude } from './extrude.js';
37
50
  export { revolve } from './generated/operations.js';
38
51
  export { ok, err, isOk, isErr, unwrap, unwrapOr, vecAdd, vecSub, vecScale, vecDot, vecCross, vecLength, vecNormalize, createPlane, createNamedPlane, resolvePlane, kernelError, validationError, DEG2RAD, RAD2DEG, } from './brepjs-compat/index.js';
39
- export type { Result, Ok, Err, Vertex, Edge, Wire, Face, Shell, Solid, CompSolid, Shape3D, Plane, PlaneName, PlaneInput, Vec3, PointInput, Bounds3D, } from './brepjs-compat/index.js';
40
- export { makeExternalGear, makeInternalGear, makePlanetaryGear, thread, map, andThen, } from './brepjs-compat/index.js';
41
- export type { ExternalGearParams, InternalGearParams, PlanetaryGearParams, GearGeometry, GearResult, PlanetaryGearAssembly, ThreadOptions, ValidSolid, ClosedWire, } from './brepjs-compat/index.js';
42
- export * as brepjsCompat from './brepjs-compat/index.js';
52
+ export type { Result, Ok, Err, BrepError, Plane, PlaneName, PlaneInput, Vec3, PointInput, } from './brepjs-compat/index.js';
53
+ export { map, andThen } from './brepjs-compat/index.js';
54
+ export * from './brep-topology.js';
55
+ export { measureVolume, measureArea, measureLength } from './generated/measurement.js';
43
56
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAQjE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAG3B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAKxD,cAAc,YAAY,CAAA;AAE1B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrD,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,UAAU,CAAA;AACrD,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAOzF,cAAc,yBAAyB,CAAA;AAOvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAShD,OAAO,EACL,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EACtC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EACnE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAC3C,WAAW,EAAE,eAAe,EAC5B,OAAO,EAAE,OAAO,GACjB,MAAM,iBAAiB,CAAA;AACxB,YAAY,EACV,MAAM,EAAE,EAAE,EAAE,GAAG,EACf,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAC1D,KAAK,EAAE,SAAS,EAAE,UAAU,EAC5B,IAAI,EAAE,UAAU,EAChB,QAAQ,GACT,MAAM,iBAAiB,CAAA;AAIxB,OAAO,EACL,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,EAC7D,GAAG,EAAE,OAAO,GACb,MAAM,iBAAiB,CAAA;AACxB,YAAY,EACV,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAC3D,YAAY,EAAE,UAAU,EAAE,qBAAqB,EAAE,aAAa,EAC9D,UAAU,EAAE,UAAU,GACvB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,YAAY,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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"}
package/dist/api/index.js CHANGED
@@ -22,8 +22,20 @@ export { union, subtract, intersect, cut } from './boolean.js';
22
22
  export { engrave } from './engrave.js';
23
23
  export { chamfer } from './chamfer.js';
24
24
  export { fillet } from './fillet.js';
25
+ export { shell } from './shell.js';
26
+ export { draft } from './draft.js';
27
+ export { thicken } from './thicken.js';
28
+ export { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace } from './feature-repair.js';
29
+ export { filletVariable } from './fillet-variable.js';
30
+ export { splitByPlane } from './split-by-plane.js';
31
+ export { sectionByPlane } from './section-by-plane.js';
25
32
  export { screw } from './screw.js';
26
33
  export { sketch } from './sketch.js';
34
+ export { wire } from './wire.js';
35
+ export { helix } from './helix.js';
36
+ export { split } from './split.js';
37
+ export { sweep } from './sweep.js';
38
+ export { loft } from './loft.js';
27
39
  export { knurl } from './knurl.js';
28
40
  export { sdf } from './sdf.js';
29
41
  // 应用变换(mesh 顶点烘焙)下沉到引擎侧 src/mesh/rigid-transform.ts(E-b:
@@ -60,17 +72,22 @@ export * from './generated/script-face.js';
60
72
  export { extrude } from './extrude.js';
61
73
  export { revolve } from './generated/operations.js';
62
74
  //
63
- // ② brepjs 形态的 TS 兼容面(P21)以 `brepjsCompat` 命名空间整体导出(库作者面:
64
- // 句柄进出、Result 语义)。**op 符号不在此处平铺**——`brepjsCompat.fuse`(brepjs
65
- // 句柄形态)与脚本面 `fuse`(compatOp 包装的 faijs 形态)是同一 vendored
66
- // 实现的两个投影,按「一个名字一份实现」红线(§6.3),平铺面只保留脚本面
67
- // 那份;库作者继续 `import { brepjsCompat } from '@faicad/faijs'` 用上游形态。
68
- // 此处只平铺**无 op 语义**的组合器与纯工具(Result / 向量 / 平面 / 错误 /
69
- // 常量),它们在两个面之间语义一致且无同名冲突。
75
+ // ② 2026-09-25 core-decouple:brepjsCompat 命名空间与全部 op 投影随 vendored
76
+ // 树删除(§5.5 第 3 条,裁决 9)。此处只平铺**无 op 语义**的组合器与纯工具
77
+ // (Result / 向量 / 平面 / 错误 / 常量),它们为 core 内联实现(§5.2),
78
+ // 在两个面之间语义一致且无同名冲突。
70
79
  export { ok, err, isOk, isErr, unwrap, unwrapOr, vecAdd, vecSub, vecScale, vecDot, vecCross, vecLength, vecNormalize, createPlane, createNamedPlane, resolvePlane, kernelError, validationError, DEG2RAD, RAD2DEG, } from './brepjs-compat/index.js';
71
- // ── P24(§8.1):库建造工厂与 Result 组合器平铺。它们不是脚本面 op(不在
72
- // 符号表/`cad` 面),也不是 dual op——是库作者面的函数,与 P23 平铺的纯
73
- // 组合器同一规则(`makeExternalGear`/`thread`/`map` 无同名冲突,§6.3)。
74
- export { makeExternalGear, makeInternalGear, makePlanetaryGear, thread, map, andThen, } from './brepjs-compat/index.js';
75
- export * as brepjsCompat from './brepjs-compat/index.js';
80
+ // ── 2026-09-25 core-decouple:vendored 库建造工厂(makeExternalGear /
81
+ // makeInternalGear / makePlanetaryGear / thread)与其句柄类型
82
+ // (Vertex/Edge/…/Shape3D/ValidSolid/Bounds3D/Gear*)随裁决 9 删除;
83
+ // Result 组合器 map/andThen 为 core 内联(§5.2),保留平铺;
84
+ // brepjsCompat 命名空间整体删除(§5.5 第 3 条)。
85
+ export { map, andThen } from './brepjs-compat/index.js';
86
+ // ── 2026-09-25 core-decouple wrapup §2.2:sheetmetal 拓扑查询 / 构造 / 测量
87
+ // 出口(faijs 风格,裁决 3 补进公开导出)。isValid 不在此面——cad 脚本面
88
+ // 已有同语义出口(见 brep-topology.ts 头部注释)。同步测量(measureVolume
89
+ // / measureArea / measureLength)为 api/generated/measurement.ts 第一方
90
+ // 同步版,一并平铺(cad 面的 volume/area/length 为 async 脚本面重命名)。
91
+ export * from './brep-topology.js';
92
+ export { measureVolume, measureArea, measureLength } from './generated/measurement.js';
76
93
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * L3 API 面(api/)— faijs 库函数命名空间(替代原 packages/stdlib)\n *\n * 设计文档:docs/plans/2026-09-01-layered-api-architecture.md §D1/D2(P6 迁入 core)\n *\n * 导出全部官方库函数、Shape 构造器与 schema 表。\n * 库函数签名 = .fai.js 源码里的调用形态(无隐式参数);\n * 后端资源经 getBackends() 获取,保留声明经 keep() 表达。\n * 实现来源按 D11:mesh 侧复用 mesh/ 层,brep 侧复用既有 brep/ 层;\n * 缺失 brep 能力时经 D10 桥接调移植树 L2(见各 op 实现)。\n */\n\nexport { box, sphere, cylinder, cone, wedge } from './primitives'\n// `../3d_editor` 消费面(**不是废弃项**,措辞于 2026-09-22 校正):transform 家族\n// (translate/rotate_euler/scale/scale3d)为编辑器应用提供(拖拽 / 时间线语句),\n// 不属 faijs 平台面,但服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**;\n// 各 op 的 JSDoc 已带校正后的 @deprecated。\n//\n// D1(2026-09-23 扩展库拆分,选项 C):四个 transform op **全部留 core**——\n// `translate` 是通用几何变换且是小程序端唯一在用的 transform op,同族不拆散。\nexport { translate, rotate_euler, scale, scale3d } from './transform'\nexport { union, subtract, intersect, cut } from './boolean'\nexport { engrave } from './engrave'\nexport { chamfer } from './chamfer'\nexport { fillet } from './fillet'\nexport { screw } from './screw'\nexport { sketch } from './sketch'\nexport { knurl } from './knurl'\nexport { sdf } from './sdf'\n// 应用变换(mesh 顶点烘焙)下沉到引擎侧 src/mesh/rigid-transform.ts(E-b:\n// 引擎不得 import stdlib/compound;公共 API 经本 re-export 保持)。\nexport { applyTransform } from '../mesh/rigid-transform'\n// P2-f3:装配子层全量导出(solvePreview/entityFromGeometry 等经此到门面)。\n// A/B 组 op(fai_* / group / assembly / copy / load / text / svgExtrude)已迁出\n// core,见 @faicad/faijs-extra;装配**求解器**(solve/validate/joints/solvers)\n// 仍是平台能力,留在此处。\nexport * from './assembly'\n// ── H11:平台几何 op(方案 §4,替代 FCStd 迁移对编辑器 op 的借用)──\nexport { import_brep } from './import-brep'\nexport { import_step } from './import-step'\nexport { compound } from './compound-geom'\nexport { place } from './place'\nexport { faceNormal, bboxCenter, bboxMin, bboxMax } from './geom'\nexport { edgeRef } from './edge-ref'\nexport { faceRef } from './face-ref'\nexport { asset } from './asset'\nexport { solid, isShape, isCompound } from '../shape'\nexport { compound as structCompound } from '../shape'\nexport type { ShapeSlot, SolidShape, CompoundShape, StdShape, ShapeKind } from '../shape'\n\n// ── P23:brepjs 兼容面接线(§4.2 / B1 三源一致)──\n//\n// ① 生成脚本面 op(与 api-namespace 的 cad 面同源:api/generated/script-face.ts)。\n// 这批 op 经 `compatOp(projectBrepOp(…))` 包装,faijs 形态(Shape 进 / Shape 出、\n// 布尔双形态、brep-only),TS 侧与 `.fai.js` 侧同语义。\nexport * from './generated/script-face'\n// P25: compat extrude/revolve (brep-only, face→prism / face→lathe) share one\n// definition between the TS surface and the cad scripting surface. The fcstd\n// codegen wires Pad/Pocket/Extrusion/Revolution through these (sketch face →\n// cad.extrude / cad.revolve).\n// extrude 是平台手写 op(承载 upTo;长度形态委托生成投影)——见 api/extrude.ts;\n// revolve 仍直接取生成投影。\nexport { extrude } from './extrude'\nexport { revolve } from './generated/operations'\n//\n// ② brepjs 形态的 TS 兼容面(P21)以 `brepjsCompat` 命名空间整体导出(库作者面:\n// 句柄进出、Result 语义)。**op 符号不在此处平铺**——`brepjsCompat.fuse`(brepjs\n// 句柄形态)与脚本面 `fuse`(compatOp 包装的 faijs 形态)是同一 vendored\n// 实现的两个投影,按「一个名字一份实现」红线(§6.3),平铺面只保留脚本面\n// 那份;库作者继续 `import { brepjsCompat } from '@faicad/faijs'` 用上游形态。\n// 此处只平铺**无 op 语义**的组合器与纯工具(Result / 向量 / 平面 / 错误 /\n// 常量),它们在两个面之间语义一致且无同名冲突。\nexport {\n ok, err, isOk, isErr, unwrap, unwrapOr,\n vecAdd, vecSub, vecScale, vecDot, vecCross, vecLength, vecNormalize,\n createPlane, createNamedPlane, resolvePlane,\n kernelError, validationError,\n DEG2RAD, RAD2DEG,\n} from './brepjs-compat'\nexport type {\n Result, Ok, Err,\n Vertex, Edge, Wire, Face, Shell, Solid, CompSolid, Shape3D,\n Plane, PlaneName, PlaneInput,\n Vec3, PointInput,\n Bounds3D,\n} from './brepjs-compat'\n// ── P24(§8.1):库建造工厂与 Result 组合器平铺。它们不是脚本面 op(不在\n// 符号表/`cad` 面),也不是 dual op——是库作者面的函数,与 P23 平铺的纯\n// 组合器同一规则(`makeExternalGear`/`thread`/`map` 无同名冲突,§6.3)。\nexport {\n makeExternalGear, makeInternalGear, makePlanetaryGear, thread,\n map, andThen,\n} from './brepjs-compat'\nexport type {\n ExternalGearParams, InternalGearParams, PlanetaryGearParams,\n GearGeometry, GearResult, PlanetaryGearAssembly, ThreadOptions,\n ValidSolid, ClosedWire,\n} from './brepjs-compat'\nexport * as brepjsCompat from './brepjs-compat'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * L3 API 面(api/)— faijs 库函数命名空间(替代原 packages/stdlib)\n *\n * 设计文档:docs/plans/2026-09-01-layered-api-architecture.md §D1/D2(P6 迁入 core)\n *\n * 导出全部官方库函数、Shape 构造器与 schema 表。\n * 库函数签名 = .fai.js 源码里的调用形态(无隐式参数);\n * 后端资源经 getBackends() 获取,保留声明经 keep() 表达。\n * 实现来源按 D11:mesh 侧复用 mesh/ 层,brep 侧复用既有 brep/ 层;\n * 缺失 brep 能力时经 D10 桥接调移植树 L2(见各 op 实现)。\n */\n\nexport { box, sphere, cylinder, cone, wedge } from './primitives'\n// `../3d_editor` 消费面(**不是废弃项**,措辞于 2026-09-22 校正):transform 家族\n// (translate/rotate_euler/scale/scale3d)为编辑器应用提供(拖拽 / 时间线语句),\n// 不属 faijs 平台面,但服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**;\n// 各 op 的 JSDoc 已带校正后的 @deprecated。\n//\n// D1(2026-09-23 扩展库拆分,选项 C):四个 transform op **全部留 core**——\n// `translate` 是通用几何变换且是小程序端唯一在用的 transform op,同族不拆散。\nexport { translate, rotate_euler, scale, scale3d } from './transform'\nexport { union, subtract, intersect, cut } from './boolean'\nexport { engrave } from './engrave'\nexport { chamfer } from './chamfer'\nexport { fillet } from './fillet'\nexport { shell, type ShellParams } from './shell'\nexport { draft, type DraftParams } from './draft'\nexport { thicken } from './thicken'\nexport { defeature, reverseShape, unifySameDomain, sew, sewAndSolidify, removeHolesFromFace, type SewParams } from './feature-repair'\nexport { filletVariable } from './fillet-variable'\nexport { splitByPlane, type SplitByPlaneParams } from './split-by-plane'\nexport { sectionByPlane, type SectionByPlaneParams } from './section-by-plane'\nexport { screw } from './screw'\nexport { sketch } from './sketch'\nexport { wire } from './wire'\nexport { helix } from './helix'\nexport { split } from './split'\nexport { sweep } from './sweep'\nexport { loft } from './loft'\nexport { knurl } from './knurl'\nexport { sdf } from './sdf'\n// 应用变换(mesh 顶点烘焙)下沉到引擎侧 src/mesh/rigid-transform.ts(E-b:\n// 引擎不得 import stdlib/compound;公共 API 经本 re-export 保持)。\nexport { applyTransform } from '../mesh/rigid-transform'\n// P2-f3:装配子层全量导出(solvePreview/entityFromGeometry 等经此到门面)。\n// A/B 组 op(fai_* / group / assembly / copy / load / text / svgExtrude)已迁出\n// core,见 @faicad/faijs-extra;装配**求解器**(solve/validate/joints/solvers)\n// 仍是平台能力,留在此处。\nexport * from './assembly'\n// ── H11:平台几何 op(方案 §4,替代 FCStd 迁移对编辑器 op 的借用)──\nexport { import_brep } from './import-brep'\nexport { import_step } from './import-step'\nexport { compound } from './compound-geom'\nexport { place } from './place'\nexport { faceNormal, bboxCenter, bboxMin, bboxMax } from './geom'\nexport { edgeRef } from './edge-ref'\nexport { faceRef } from './face-ref'\nexport { asset } from './asset'\nexport { solid, isShape, isCompound } from '../shape'\nexport { compound as structCompound } from '../shape'\nexport type { ShapeSlot, SolidShape, CompoundShape, CurveShape, StdShape, ShapeKind } from '../shape'\nexport type { Shape } from '../mesh/types'\n\n// ── P23:brepjs 兼容面接线(§4.2 / B1 三源一致)──\n//\n// ① 生成脚本面 op(与 api-namespace 的 cad 面同源:api/generated/script-face.ts)。\n// 这批 op 经 `compatOp(projectBrepOp(…))` 包装,faijs 形态(Shape 进 / Shape 出、\n// 布尔双形态、brep-only),TS 侧与 `.fai.js` 侧同语义。\nexport * from './generated/script-face'\n// P25: compat extrude/revolve (brep-only, face→prism / face→lathe) share one\n// definition between the TS surface and the cad scripting surface. The fcstd\n// codegen wires Pad/Pocket/Extrusion/Revolution through these (sketch face →\n// cad.extrude / cad.revolve).\n// extrude 是平台手写 op(承载 upTo;长度形态委托生成投影)——见 api/extrude.ts;\n// revolve 仍直接取生成投影。\nexport { extrude } from './extrude'\nexport { revolve } from './generated/operations'\n//\n// ② 2026-09-25 core-decouple:brepjsCompat 命名空间与全部 op 投影随 vendored\n// 树删除(§5.5 第 3 条,裁决 9)。此处只平铺**无 op 语义**的组合器与纯工具\n// (Result / 向量 / 平面 / 错误 / 常量),它们为 core 内联实现(§5.2),\n// 在两个面之间语义一致且无同名冲突。\nexport {\n ok, err, isOk, isErr, unwrap, unwrapOr,\n vecAdd, vecSub, vecScale, vecDot, vecCross, vecLength, vecNormalize,\n createPlane, createNamedPlane, resolvePlane,\n kernelError, validationError,\n DEG2RAD, RAD2DEG,\n} from './brepjs-compat'\nexport type {\n Result, Ok, Err,\n BrepError,\n Plane, PlaneName, PlaneInput,\n Vec3, PointInput,\n} from './brepjs-compat'\n// ── 2026-09-25 core-decouple:vendored 库建造工厂(makeExternalGear /\n// makeInternalGear / makePlanetaryGear / thread)与其句柄类型\n// (Vertex/Edge/…/Shape3D/ValidSolid/Bounds3D/Gear*)随裁决 9 删除;\n// Result 组合器 map/andThen 为 core 内联(§5.2),保留平铺;\n// brepjsCompat 命名空间整体删除(§5.5 第 3 条)。\nexport { map, andThen } from './brepjs-compat'\n// ── 2026-09-25 core-decouple wrapup §2.2:sheetmetal 拓扑查询 / 构造 / 测量\n// 出口(faijs 风格,裁决 3 补进公开导出)。isValid 不在此面——cad 脚本面\n// 已有同语义出口(见 brep-topology.ts 头部注释)。同步测量(measureVolume\n// / measureArea / measureLength)为 api/generated/measurement.ts 第一方\n// 同步版,一并平铺(cad 面的 volume/area/length 为 async 脚本面重命名)。\nexport * from './brep-topology'\nexport { measureVolume, measureArea, measureLength } from './generated/measurement'\n"]}
@@ -44,6 +44,16 @@ import type { Shape } from '../../mesh/types.js';
44
44
  export interface CompatSpec extends Omit<DualOpOptions, 'mesh' | 'brep'> {
45
45
  /** Op name (error messages + metadata; required, unlike defineOp's optional name). */
46
46
  name: string;
47
+ /**
48
+ * 是否按 brepjs 句柄形态借入输入(默认 true)。
49
+ *
50
+ * faijs 化库(内部直接消费 core Shape 与 core op,如 sheetmetal)必须传
51
+ * `borrow: false`:borrowDeep 会把嵌套的 faijs Shape 替换成 brepjs 形态的
52
+ * `BorrowedShapeHandle`,而 core op 只认带 BREP 槽的 Shape,替换后库内部
53
+ * 布尔/拓扑调用会报「input is not on the BREP chain」。真 brepjs 形态的库
54
+ * (消费 ShapeHandle 对象)保持默认 true。
55
+ */
56
+ borrow?: boolean;
47
57
  }
48
58
  /**
49
59
  * Inward bridging step: deep walk with faijs Shapes replaced by borrowed
@@ -1 +1 @@
1
- {"version":3,"file":"compat-op.d.ts","sourceRoot":"","sources":["../../../src/api/internal/compat-op.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAEL,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,aAAa,EAGnB,MAAM,iBAAiB,CAAA;AAIxB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAE7C,kFAAkF;AAClF,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IACtE,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAA;CACb;AAID;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAQ7D;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/D;AA6ED,gFAAgF;AAChF,KAAK,WAAW,GAAG;IAAE,CAAC,YAAY,CAAC,CAAC,EAAE,UAAU,CAAA;CAAE,CAAA;AAElD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CACtB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EACnC,IAAI,EAAE,UAAU,GACf,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,WAAW,CAcxD"}
1
+ {"version":3,"file":"compat-op.d.ts","sourceRoot":"","sources":["../../../src/api/internal/compat-op.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAEL,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,aAAa,EAGnB,MAAM,iBAAiB,CAAA;AAIxB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAE7C,kFAAkF;AAClF,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IACtE,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAID;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAQ7D;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/D;AAgFD,gFAAgF;AAChF,KAAK,WAAW,GAAG;IAAE,CAAC,YAAY,CAAC,CAAC,EAAE,UAAU,CAAA;CAAE,CAAA;AAElD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CACtB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EACnC,IAAI,EAAE,UAAU,GACf,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,WAAW,CAiBxD"}
@@ -142,13 +142,16 @@ function readSegmentsFromArgs(args) {
142
142
  */
143
143
  function buildAdapter(fn, spec) {
144
144
  return async (...args) => {
145
- const borrowed = args.map((a) => borrowDeep(a, 0));
145
+ // borrow: false(faijs 化库)时输入原样直传——嵌套的 core Shape 保留其
146
+ // BREP 槽,库内部调 core op 才能取到 OCCT 句柄(否则报 input not on the
147
+ // BREP chain)。默认 true 保持 brepjs 形态库的借入语义。
148
+ const effective = spec.borrow === false ? args : args.map((a) => borrowDeep(a, 0));
146
149
  // Async library fns are supported: a library that awaits its kernel (every
147
150
  // `@faicad/fai-cq-gears` factory does — `await getGearKernel()`) returns
148
151
  // `Promise<Result<…>>`, and the shared unwrap is a sync leaf that only
149
152
  // recognizes settled Result records. Awaiting a non-promise product is a
150
153
  // no-op, so sync libraries are unaffected.
151
- const value = unwrapOrThrow(await callBrepjs(fn, borrowed), spec.name);
154
+ const value = unwrapOrThrow(await callBrepjs(fn, effective), spec.name);
152
155
  return adoptOut(value, spec, readSegmentsFromArgs(args));
153
156
  };
154
157
  }
@@ -167,7 +170,7 @@ function buildAdapter(fn, spec) {
167
170
  * @returns the compat op facade, carrying dual-op metadata.
168
171
  */
169
172
  export function compatOp(fn, spec) {
170
- const { outputs, capabilities, schema, slotMap, naming } = spec;
173
+ const { outputs, capabilities, engines, schema, slotMap, naming } = spec;
171
174
  // `outputs` flows through defineOp's own wrapping path: the adapter adopts
172
175
  // per declared field, then defineOp wraps — isShape passthrough, so no
173
176
  // double wrapping (§3.2).
@@ -175,6 +178,9 @@ export function compatOp(fn, spec) {
175
178
  brep: buildAdapter(fn, spec),
176
179
  name: spec.name,
177
180
  capabilities,
181
+ // D11 透传:平台 op(vendored 实现调 occt-only 方法)在生成物里声明 engines。
182
+ // engines 与 capabilities 可并存(2026-09-24 撤销 D11-7 互斥),此处两条独立透传。
183
+ engines,
178
184
  outputs,
179
185
  schema,
180
186
  slotMap,
@@ -1 +1 @@
1
- {"version":3,"file":"compat-op.js","sourceRoot":"","sources":["../../../src/api/internal/compat-op.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * compat-op — lift an arbitrary brepjs-shaped function into a faijs statement\n * op, built **on top of** defineOp (single implementation entry, v1).\n *\n * Design: docs/plans/2026-09-06-compatop-on-defineop.md §3\n *\n * compatOp is NOT a second implementation path parallel to defineOp: every\n * shared mechanism is owned by defineOp — dispatch (dispatchPath + capability\n * routing), the Result boundary (runImpl + unwrapResult), product wrapping\n * (wrapBrepOne / wrapByKeys), `DUAL_OP_META` mounting and\n * `assertLibConforms` validation. compatOp only does two things:\n * - spec pass-through: `CompatSpec` is a combinatorial inheritance of\n * `DualOpOptions` (single source of truth, fields auto-sync — §3.1);\n * - adapter construction: a brepjs-shaped bridge feeding the brep impl — the\n * three bridging steps that cannot be shared (all reuse shared\n * infrastructure, §3.2):\n * 1. borrowDeep — inward borrow: deep walk, any faijs Shape →\n * borrowBrepjsShape view (zero-copy; library-private handles pass\n * through untouched);\n * 2. call + unwrap — callBrepjs through the shared unwrapResult\n * (`err` throws an OpError carrying the op name + BrepError code);\n * async library fns are awaited first, so `Promise<Result<…>>` —\n * the shape every kernel-awaiting library returns — unwraps too;\n * 3. adoptOut — outward adoption: top-level handle / `outputs`-declared\n * fields (single handle or handle array) → adoptEntity\n * (unregister finalizer + fromHandle).\n *\n * The keep / keepHidden contract is untouched: compatOp neither blocks nor\n * rewrites it — any function running inside a DirectExecutor context can use\n * function-body declarations (C1), and call-site declarations override them\n * (`lang/keep.ts` resolveKeep). The decorated product therefore behaves like\n * any defineOp product: `keep`-safe, capability-aware, multi-output\n * (`DUAL_OP_META.outputs` visible).\n *\n * No self-invented fields: `CompatSpec` extends `Omit<DualOpOptions, 'mesh' |\n * 'brep'>` and declares nothing else; the only tweak is `name` tightened\n * (inherited field, not a new one).\n *\n * @module\n */\n\nimport {\n defineOp,\n DUAL_OP_META,\n type DualOpMeta,\n type DualOpOptions,\n type BrepImpl,\n type BrepProduct,\n} from '../../define-op'\nimport { isShape } from '../../shape'\nimport { borrowBrepjsShape, adoptEntity, callBrepjs } from './l3-bridge'\nimport { unwrapResult } from './result-unwrap'\nimport type { Shape } from '../../mesh/types'\n\n/** compatOp's static spec: combinatorial inheritance (single source of truth). */\nexport interface CompatSpec extends Omit<DualOpOptions, 'mesh' | 'brep'> {\n /** Op name (error messages + metadata; required, unlike defineOp's optional name). */\n name: string\n}\n\nconst MAX_WALK_DEPTH = 4\n\n/**\n * Inward bridging step: deep walk with faijs Shapes replaced by borrowed\n * brepjs views (zero-copy); everything else passes through.\n * Class instances are not traversed (defensive); library-private handles\n * pass through (§4.3.4 of the design).\n *\n * @param v - the value to borrow from (plain object, array, or primitive).\n * @param depth - current traversal depth (guard against deep recursion).\n * @returns the value with faijs Shapes replaced by borrowed views.\n */\nexport function borrowDeep(v: unknown, depth: number): unknown {\n if (depth > MAX_WALK_DEPTH || v === null || typeof v !== 'object') return v\n if (isShape(v)) return borrowBrepjsShape(v)\n if (Array.isArray(v)) return v.map((x) => borrowDeep(x, depth + 1))\n if (Object.getPrototypeOf(v) !== Object.prototype) return v\n const out: Record<string, unknown> = {}\n for (const [k, x] of Object.entries(v)) out[k] = borrowDeep(x, depth + 1)\n return out\n}\n\n/**\n * Statement-boundary unwrap — `err` becomes an execution error carrying the op\n * name and the `BrepError` code. Delegates to the shared\n * {@link unwrapResult} so the compat boundary and defineOp's Result boundary\n * share one leaf implementation (no drift).\n *\n * @param r - the Result-like value to unwrap.\n * @param name - the op name used in error messages.\n * @returns the unwrapped ok value.\n */\nexport function unwrapOrThrow(r: unknown, name: string): unknown {\n return unwrapResult(r, name)\n}\n\n/**\n * Bridging step: outward adoption — top-level handle or `outputs`-declared\n * fields → adoptEntity (unregister finalizer + fromHandle). `outputs` may also\n * name an array field of handles; every element is adopted individually.\n * Deduplication of already-adopted handles lives inside adoptEntity. A field\n * already being a faijs Shape passes through untouched (no double adoption).\n *\n * @param v - the library product.\n * @param spec - the compat spec (name + optional `outputs`).\n * @param segments - caller-provided `segments` (裁决 1,§5.2), forwarded so the\n * adopted handles' tessellation honors it.\n * @returns the adopted record / Shape, or the plain data untouched.\n */\nfunction adoptOut(v: unknown, spec: CompatSpec, segments?: number): unknown {\n if (isShape(v)) return v\n if (spec.outputs && typeof v === 'object' && v !== null && !Array.isArray(v)) {\n const rec = v as Record<string, unknown>\n for (const f of spec.outputs) {\n const field = rec[f]\n rec[f] = Array.isArray(field)\n ? field.map((x) => adoptEntity(x, spec.name, segments))\n : adoptEntity(field, spec.name, segments)\n }\n return v\n }\n return adoptEntity(v, spec.name, segments)\n}\n\n/**\n * Read the caller-supplied tessellation density from a compat op's args.\n *\n * 裁决 1:faijs 的 `segments` 显式超集在 brepjs 投影侧也必须可选;这里从调用点\n * 的尾参 options(或任一 plain-object 实参)抓取 `segments`,在产出句柄被收编为\n * faijs Shape 时透传给 `fromHandle` 的三角化(§5.2 机制)。默认不传 = 由\n * handle-bridge 的 64 兜底。\n */\nfunction readSegmentsFromArgs(args: unknown[]): number | undefined {\n for (let i = args.length - 1; i >= 0; i--) {\n const a = args[i]\n if (\n a !== null &&\n typeof a === 'object' &&\n !Array.isArray(a) &&\n Object.getPrototypeOf(a) === Object.prototype\n ) {\n const seg = (a as Record<string, unknown>).segments\n if (typeof seg === 'number' && Number.isFinite(seg)) return seg\n }\n }\n return undefined\n}\n\n/**\n * Build the brep-only adapter: borrow inputs → call the vendor function through\n * the shared unwrap → adopt the product (with the caller's `segments`,\n * 裁决 1/§5.2). The adapter never dispatches and never mounts metadata —\n * those are defineOp's.\n *\n * @param fn the brepjs-shaped function (dual-form normalization inside, D11).\n * @param spec the static op spec (name + options pass-through).\n * @returns a `BrepImpl` compatible with defineOp's brep-only decl.\n */\nfunction buildAdapter(fn: (...args: unknown[]) => unknown, spec: CompatSpec): BrepImpl<unknown[]> {\n return async (...args: unknown[]): Promise<BrepProduct> => {\n const borrowed = args.map((a) => borrowDeep(a, 0))\n // Async library fns are supported: a library that awaits its kernel (every\n // `@faicad/fai-cq-gears` factory does — `await getGearKernel()`) returns\n // `Promise<Result<…>>`, and the shared unwrap is a sync leaf that only\n // recognizes settled Result records. Awaiting a non-promise product is a\n // no-op, so sync libraries are unaffected.\n const value = unwrapOrThrow(await callBrepjs(fn as never, borrowed), spec.name)\n return adoptOut(value, spec, readSegmentsFromArgs(args)) as BrepProduct\n }\n}\n\n/** Carrier of the DualOpMeta mounted by defineOp (same shape as defineOp's). */\ntype MetaCarrier = { [DUAL_OP_META]?: DualOpMeta }\n\n/**\n * Lift a brepjs-shaped function into a defineOp-decorated op facade (brep-only).\n *\n * The decorated product is identical to a defineOp product: same `DUAL_OP_META`\n * field set (kind 'dual-op', brep impl, name, capabilities, outputs, schema,\n * slotMap), same dispatch semantics, same Result boundary. The adapter carries\n * only the brepjs bridging (borrow / call / adopt); every other mechanism\n * belongs to defineOp.\n *\n * @param fn the brepjs-shaped function.\n * @param spec the static spec (name required; capabilities/outputs/slotMap/\n * schema pass through and take effect).\n * @returns the compat op facade, carrying dual-op metadata.\n */\nexport function compatOp(\n fn: (...args: unknown[]) => unknown,\n spec: CompatSpec,\n): ((...args: unknown[]) => Promise<Shape>) & MetaCarrier {\n const { outputs, capabilities, schema, slotMap, naming } = spec\n // `outputs` flows through defineOp's own wrapping path: the adapter adopts\n // per declared field, then defineOp wraps — isShape passthrough, so no\n // double wrapping (§3.2).\n return defineOp({\n brep: buildAdapter(fn, spec),\n name: spec.name,\n capabilities,\n outputs,\n schema,\n slotMap,\n naming,\n }) as unknown as ((...args: unknown[]) => Promise<Shape>) & MetaCarrier\n}"]}
1
+ {"version":3,"file":"compat-op.js","sourceRoot":"","sources":["../../../src/api/internal/compat-op.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * compat-op — lift an arbitrary brepjs-shaped function into a faijs statement\n * op, built **on top of** defineOp (single implementation entry, v1).\n *\n * Design: docs/plans/2026-09-06-compatop-on-defineop.md §3\n *\n * compatOp is NOT a second implementation path parallel to defineOp: every\n * shared mechanism is owned by defineOp — dispatch (dispatchPath + capability\n * routing), the Result boundary (runImpl + unwrapResult), product wrapping\n * (wrapBrepOne / wrapByKeys), `DUAL_OP_META` mounting and\n * `assertLibConforms` validation. compatOp only does two things:\n * - spec pass-through: `CompatSpec` is a combinatorial inheritance of\n * `DualOpOptions` (single source of truth, fields auto-sync — §3.1);\n * - adapter construction: a brepjs-shaped bridge feeding the brep impl — the\n * three bridging steps that cannot be shared (all reuse shared\n * infrastructure, §3.2):\n * 1. borrowDeep — inward borrow: deep walk, any faijs Shape →\n * borrowBrepjsShape view (zero-copy; library-private handles pass\n * through untouched);\n * 2. call + unwrap — callBrepjs through the shared unwrapResult\n * (`err` throws an OpError carrying the op name + BrepError code);\n * async library fns are awaited first, so `Promise<Result<…>>` —\n * the shape every kernel-awaiting library returns — unwraps too;\n * 3. adoptOut — outward adoption: top-level handle / `outputs`-declared\n * fields (single handle or handle array) → adoptEntity\n * (unregister finalizer + fromHandle).\n *\n * The keep / keepHidden contract is untouched: compatOp neither blocks nor\n * rewrites it — any function running inside a DirectExecutor context can use\n * function-body declarations (C1), and call-site declarations override them\n * (`lang/keep.ts` resolveKeep). The decorated product therefore behaves like\n * any defineOp product: `keep`-safe, capability-aware, multi-output\n * (`DUAL_OP_META.outputs` visible).\n *\n * No self-invented fields: `CompatSpec` extends `Omit<DualOpOptions, 'mesh' |\n * 'brep'>` and declares nothing else; the only tweak is `name` tightened\n * (inherited field, not a new one).\n *\n * @module\n */\n\nimport {\n defineOp,\n DUAL_OP_META,\n type DualOpMeta,\n type DualOpOptions,\n type BrepImpl,\n type BrepProduct,\n} from '../../define-op'\nimport { isShape } from '../../shape'\nimport { borrowBrepjsShape, adoptEntity, callBrepjs } from './l3-bridge'\nimport { unwrapResult } from './result-unwrap'\nimport type { Shape } from '../../mesh/types'\n\n/** compatOp's static spec: combinatorial inheritance (single source of truth). */\nexport interface CompatSpec extends Omit<DualOpOptions, 'mesh' | 'brep'> {\n /** Op name (error messages + metadata; required, unlike defineOp's optional name). */\n name: string\n /**\n * 是否按 brepjs 句柄形态借入输入(默认 true)。\n *\n * faijs 化库(内部直接消费 core Shape 与 core op,如 sheetmetal)必须传\n * `borrow: false`:borrowDeep 会把嵌套的 faijs Shape 替换成 brepjs 形态的\n * `BorrowedShapeHandle`,而 core op 只认带 BREP 槽的 Shape,替换后库内部\n * 布尔/拓扑调用会报「input is not on the BREP chain」。真 brepjs 形态的库\n * (消费 ShapeHandle 对象)保持默认 true。\n */\n borrow?: boolean\n}\n\nconst MAX_WALK_DEPTH = 4\n\n/**\n * Inward bridging step: deep walk with faijs Shapes replaced by borrowed\n * brepjs views (zero-copy); everything else passes through.\n * Class instances are not traversed (defensive); library-private handles\n * pass through (§4.3.4 of the design).\n *\n * @param v - the value to borrow from (plain object, array, or primitive).\n * @param depth - current traversal depth (guard against deep recursion).\n * @returns the value with faijs Shapes replaced by borrowed views.\n */\nexport function borrowDeep(v: unknown, depth: number): unknown {\n if (depth > MAX_WALK_DEPTH || v === null || typeof v !== 'object') return v\n if (isShape(v)) return borrowBrepjsShape(v)\n if (Array.isArray(v)) return v.map((x) => borrowDeep(x, depth + 1))\n if (Object.getPrototypeOf(v) !== Object.prototype) return v\n const out: Record<string, unknown> = {}\n for (const [k, x] of Object.entries(v)) out[k] = borrowDeep(x, depth + 1)\n return out\n}\n\n/**\n * Statement-boundary unwrap — `err` becomes an execution error carrying the op\n * name and the `BrepError` code. Delegates to the shared\n * {@link unwrapResult} so the compat boundary and defineOp's Result boundary\n * share one leaf implementation (no drift).\n *\n * @param r - the Result-like value to unwrap.\n * @param name - the op name used in error messages.\n * @returns the unwrapped ok value.\n */\nexport function unwrapOrThrow(r: unknown, name: string): unknown {\n return unwrapResult(r, name)\n}\n\n/**\n * Bridging step: outward adoption — top-level handle or `outputs`-declared\n * fields → adoptEntity (unregister finalizer + fromHandle). `outputs` may also\n * name an array field of handles; every element is adopted individually.\n * Deduplication of already-adopted handles lives inside adoptEntity. A field\n * already being a faijs Shape passes through untouched (no double adoption).\n *\n * @param v - the library product.\n * @param spec - the compat spec (name + optional `outputs`).\n * @param segments - caller-provided `segments` (裁决 1,§5.2), forwarded so the\n * adopted handles' tessellation honors it.\n * @returns the adopted record / Shape, or the plain data untouched.\n */\nfunction adoptOut(v: unknown, spec: CompatSpec, segments?: number): unknown {\n if (isShape(v)) return v\n if (spec.outputs && typeof v === 'object' && v !== null && !Array.isArray(v)) {\n const rec = v as Record<string, unknown>\n for (const f of spec.outputs) {\n const field = rec[f]\n rec[f] = Array.isArray(field)\n ? field.map((x) => adoptEntity(x, spec.name, segments))\n : adoptEntity(field, spec.name, segments)\n }\n return v\n }\n return adoptEntity(v, spec.name, segments)\n}\n\n/**\n * Read the caller-supplied tessellation density from a compat op's args.\n *\n * 裁决 1:faijs 的 `segments` 显式超集在 brepjs 投影侧也必须可选;这里从调用点\n * 的尾参 options(或任一 plain-object 实参)抓取 `segments`,在产出句柄被收编为\n * faijs Shape 时透传给 `fromHandle` 的三角化(§5.2 机制)。默认不传 = 由\n * handle-bridge 的 64 兜底。\n */\nfunction readSegmentsFromArgs(args: unknown[]): number | undefined {\n for (let i = args.length - 1; i >= 0; i--) {\n const a = args[i]\n if (\n a !== null &&\n typeof a === 'object' &&\n !Array.isArray(a) &&\n Object.getPrototypeOf(a) === Object.prototype\n ) {\n const seg = (a as Record<string, unknown>).segments\n if (typeof seg === 'number' && Number.isFinite(seg)) return seg\n }\n }\n return undefined\n}\n\n/**\n * Build the brep-only adapter: borrow inputs → call the vendor function through\n * the shared unwrap → adopt the product (with the caller's `segments`,\n * 裁决 1/§5.2). The adapter never dispatches and never mounts metadata —\n * those are defineOp's.\n *\n * @param fn the brepjs-shaped function (dual-form normalization inside, D11).\n * @param spec the static op spec (name + options pass-through).\n * @returns a `BrepImpl` compatible with defineOp's brep-only decl.\n */\nfunction buildAdapter(fn: (...args: unknown[]) => unknown, spec: CompatSpec): BrepImpl<unknown[]> {\n return async (...args: unknown[]): Promise<BrepProduct> => {\n // borrow: false(faijs 化库)时输入原样直传——嵌套的 core Shape 保留其\n // BREP 槽,库内部调 core op 才能取到 OCCT 句柄(否则报 input not on the\n // BREP chain)。默认 true 保持 brepjs 形态库的借入语义。\n const effective = spec.borrow === false ? args : args.map((a) => borrowDeep(a, 0))\n // Async library fns are supported: a library that awaits its kernel (every\n // `@faicad/fai-cq-gears` factory does — `await getGearKernel()`) returns\n // `Promise<Result<…>>`, and the shared unwrap is a sync leaf that only\n // recognizes settled Result records. Awaiting a non-promise product is a\n // no-op, so sync libraries are unaffected.\n const value = unwrapOrThrow(await callBrepjs(fn as never, effective), spec.name)\n return adoptOut(value, spec, readSegmentsFromArgs(args)) as BrepProduct\n }\n}\n\n/** Carrier of the DualOpMeta mounted by defineOp (same shape as defineOp's). */\ntype MetaCarrier = { [DUAL_OP_META]?: DualOpMeta }\n\n/**\n * Lift a brepjs-shaped function into a defineOp-decorated op facade (brep-only).\n *\n * The decorated product is identical to a defineOp product: same `DUAL_OP_META`\n * field set (kind 'dual-op', brep impl, name, capabilities, outputs, schema,\n * slotMap), same dispatch semantics, same Result boundary. The adapter carries\n * only the brepjs bridging (borrow / call / adopt); every other mechanism\n * belongs to defineOp.\n *\n * @param fn the brepjs-shaped function.\n * @param spec the static spec (name required; capabilities/outputs/slotMap/\n * schema pass through and take effect).\n * @returns the compat op facade, carrying dual-op metadata.\n */\nexport function compatOp(\n fn: (...args: unknown[]) => unknown,\n spec: CompatSpec,\n): ((...args: unknown[]) => Promise<Shape>) & MetaCarrier {\n const { outputs, capabilities, engines, schema, slotMap, naming } = spec\n // `outputs` flows through defineOp's own wrapping path: the adapter adopts\n // per declared field, then defineOp wraps — isShape passthrough, so no\n // double wrapping (§3.2).\n return defineOp({\n brep: buildAdapter(fn, spec),\n name: spec.name,\n capabilities,\n // D11 透传:平台 op(vendored 实现调 occt-only 方法)在生成物里声明 engines。\n // engines 与 capabilities 可并存(2026-09-24 撤销 D11-7 互斥),此处两条独立透传。\n engines,\n outputs,\n schema,\n slotMap,\n naming,\n }) as unknown as ((...args: unknown[]) => Promise<Shape>) & MetaCarrier\n}"]}
@@ -23,10 +23,10 @@ import { type FormClass } from './dual-form-args.js';
23
23
  * Assert that a BREP kernel is bound before invoking a compat op.
24
24
  *
25
25
  * Reads the configured backend's kernel slot, guarding against the throw that
26
- * `getBackends()` performs before host configuration. Falls back to the
27
- * vendored kernel-registry injection flag (engine-neutral, Phase 2 P2-5: the
28
- * registry is injected with the current BREP engine during assembly, not
29
- * hard-bound to occt) when nothing is configured.
26
+ * `getBackends()` performs before host configuration. Falls back to the core
27
+ * engine-registry activation flag(2026-09-25 core-decouple wrapup:brepjs
28
+ * registry 随子包删除——此处只问「core registry 是否已有激活 brep 引擎」)
29
+ * when nothing is configured.
30
30
  *
31
31
  * @param name - op name, used in the guiding error message.
32
32
  * @throws when no BREP kernel is bound (the message tells the host what to do,
@@ -20,16 +20,16 @@
20
20
  */
21
21
  import { resolveArgs } from './dual-form-args.js';
22
22
  import { callBrepjs } from './l3-bridge.js';
23
- import { isKernelInjected } from '../occt-kernel-bridge.js';
23
+ import { getActiveBrepEngineId } from '../../brep/engine/registry.js';
24
24
  import { getBackends } from '../../runtime-state.js';
25
25
  /**
26
26
  * Assert that a BREP kernel is bound before invoking a compat op.
27
27
  *
28
28
  * Reads the configured backend's kernel slot, guarding against the throw that
29
- * `getBackends()` performs before host configuration. Falls back to the
30
- * vendored kernel-registry injection flag (engine-neutral, Phase 2 P2-5: the
31
- * registry is injected with the current BREP engine during assembly, not
32
- * hard-bound to occt) when nothing is configured.
29
+ * `getBackends()` performs before host configuration. Falls back to the core
30
+ * engine-registry activation flag(2026-09-25 core-decouple wrapup:brepjs
31
+ * registry 随子包删除——此处只问「core registry 是否已有激活 brep 引擎」)
32
+ * when nothing is configured.
33
33
  *
34
34
  * @param name - op name, used in the guiding error message.
35
35
  * @throws when no BREP kernel is bound (the message tells the host what to do,
@@ -43,9 +43,9 @@ export function assertKernelBound(name) {
43
43
  catch {
44
44
  // backends not configured yet — that is not an error, just no kernel
45
45
  }
46
- if (!kernelBound && !isKernelInjected()) {
46
+ if (!kernelBound && getActiveBrepEngineId() === null) {
47
47
  throw new Error(`[compat:${name}] no BREP kernel bound; run host init/inject (e.g. initOcct + ` +
48
- `injectCurrentBrepEngineAsKernel) before the first compat.${name} call. ` +
48
+ `register the occt brep engine) before the first compat.${name} call. ` +
49
49
  `Library code must not install kernels itself.`);
50
50
  }
51
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compat-projection.js","sourceRoot":"","sources":["../../../src/api/internal/compat-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAkB,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,WAAW,GAAG,KAAK,CAAA;IACvB,IAAI,CAAC;QACH,WAAW,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CACb,WAAW,IAAI,gEAAgE;YAC7E,4DAA4D,IAAI,SAAS;YACzE,+CAA+C,CAClD,CAAA;IACH,CAAC;AACH,CAAC;AAKD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,MAAgB,EAChB,SAAoB,EACpB,IAAmC;IAEnC,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;QAC5B,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvB,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;QACjE,OAAO,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACrC,CAAC,CAAA;AACH,CAAC","sourcesContent":["/**\n * compat-projection — the single BREP-TS projection wrapper factory (P23, §4.2).\n *\n * Design: docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.2 / §4.3.2\n *\n * Every symbol on the TS compat face and every generated `compatOp` op funnels\n * through {@link projectBrepOp}. That is what makes the generated face and the\n * hand-curated `api/brepjs-compat` face one mechanism rather than two:\n *\n * 1. single-kernel assert (D10) — library code never installs a kernel;\n * 2. D11 dual-form normalization — object form → positional form, in the\n * exported function (§4.2 「归一化位置」), not in a script-side adapter;\n * 3. the vendored call itself, through `callBrepjs` (Result shape preserved).\n *\n * P21's `api/brepjs-compat` used a private copy of steps 1–3 (`wrapDual`); P23 lifts it\n * here so `gen-l3-surface.ts` can emit one `compatOp(projectBrepOp(…), …)` line\n * per symbol instead of re-expanding the template for each op.\n *\n * @module\n */\n\nimport { resolveArgs, type FormClass } from './dual-form-args'\nimport { callBrepjs } from './l3-bridge'\nimport { isKernelInjected } from '../occt-kernel-bridge'\nimport { getBackends } from '../../runtime-state'\n\n/**\n * Assert that a BREP kernel is bound before invoking a compat op.\n *\n * Reads the configured backend's kernel slot, guarding against the throw that\n * `getBackends()` performs before host configuration. Falls back to the\n * vendored kernel-registry injection flag (engine-neutral, Phase 2 P2-5: the\n * registry is injected with the current BREP engine during assembly, not\n * hard-bound to occt) when nothing is configured.\n *\n * @param name - op name, used in the guiding error message.\n * @throws when no BREP kernel is bound (the message tells the host what to do,\n * because library code must never install a kernel itself — §4.2 rule 1).\n */\nexport function assertKernelBound(name: string): void {\n let kernelBound = false\n try {\n kernelBound = getBackends().kernel.brep != null\n } catch {\n // backends not configured yet — that is not an error, just no kernel\n }\n if (!kernelBound && !isKernelInjected()) {\n throw new Error(\n `[compat:${name}] no BREP kernel bound; run host init/inject (e.g. initOcct + ` +\n `injectCurrentBrepEngineAsKernel) before the first compat.${name} call. ` +\n `Library code must not install kernels itself.`\n )\n }\n}\n\n/** Signature of a projected compat op (inputs normalized before the call). */\nexport type CompatProjection = (...args: unknown[]) => unknown\n\n/**\n * Project a vendored brepjs function onto the faijs TS compat face.\n *\n * The returned function is brepjs-shaped: positional arguments in, `Result`\n * (or whatever the vendored function returns) out — no faijs `Shape`, no\n * adoption. Adoption and the statement-boundary unwrap are `compatOp`'s job\n * (§4.3.2 steps 4/5), which is why the script face can wrap the very same\n * projection the TS face exports.\n *\n * @param name - op name (error messages + D11 discriminant context).\n * @param params - machine parameter-name table (object form → positional).\n * @param formClass - D11 form class (A single-name dual-form / B1 options-only /\n * B2 two names).\n * @param impl - the vendored function.\n * @returns the projected compat op.\n */\nexport function projectBrepOp(\n name: string,\n params: string[],\n formClass: FormClass,\n impl: (...args: never[]) => unknown,\n): CompatProjection {\n return (...args: unknown[]) => {\n assertKernelBound(name)\n const positional = resolveArgs(args, { name, params, formClass })\n return callBrepjs(impl, positional)\n }\n}\n"]}
1
+ {"version":3,"file":"compat-projection.js","sourceRoot":"","sources":["../../../src/api/internal/compat-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAkB,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,WAAW,GAAG,KAAK,CAAA;IACvB,IAAI,CAAC;QACH,WAAW,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CACb,WAAW,IAAI,gEAAgE;YAC7E,0DAA0D,IAAI,SAAS;YACvE,+CAA+C,CAClD,CAAA;IACH,CAAC;AACH,CAAC;AAKD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,MAAgB,EAChB,SAAoB,EACpB,IAAmC;IAEnC,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;QAC5B,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvB,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;QACjE,OAAO,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACrC,CAAC,CAAA;AACH,CAAC","sourcesContent":["/**\n * compat-projection — the single BREP-TS projection wrapper factory (P23, §4.2).\n *\n * Design: docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.2 / §4.3.2\n *\n * Every symbol on the TS compat face and every generated `compatOp` op funnels\n * through {@link projectBrepOp}. That is what makes the generated face and the\n * hand-curated `api/brepjs-compat` face one mechanism rather than two:\n *\n * 1. single-kernel assert (D10) — library code never installs a kernel;\n * 2. D11 dual-form normalization — object form → positional form, in the\n * exported function (§4.2 「归一化位置」), not in a script-side adapter;\n * 3. the vendored call itself, through `callBrepjs` (Result shape preserved).\n *\n * P21's `api/brepjs-compat` used a private copy of steps 1–3 (`wrapDual`); P23 lifts it\n * here so `gen-l3-surface.ts` can emit one `compatOp(projectBrepOp(…), …)` line\n * per symbol instead of re-expanding the template for each op.\n *\n * @module\n */\n\nimport { resolveArgs, type FormClass } from './dual-form-args'\nimport { callBrepjs } from './l3-bridge'\nimport { getActiveBrepEngineId } from '../../brep/engine/registry'\nimport { getBackends } from '../../runtime-state'\n\n/**\n * Assert that a BREP kernel is bound before invoking a compat op.\n *\n * Reads the configured backend's kernel slot, guarding against the throw that\n * `getBackends()` performs before host configuration. Falls back to the core\n * engine-registry activation flag(2026-09-25 core-decouple wrapup:brepjs\n * registry 随子包删除——此处只问「core registry 是否已有激活 brep 引擎」)\n * when nothing is configured.\n *\n * @param name - op name, used in the guiding error message.\n * @throws when no BREP kernel is bound (the message tells the host what to do,\n * because library code must never install a kernel itself — §4.2 rule 1).\n */\nexport function assertKernelBound(name: string): void {\n let kernelBound = false\n try {\n kernelBound = getBackends().kernel.brep != null\n } catch {\n // backends not configured yet — that is not an error, just no kernel\n }\n if (!kernelBound && getActiveBrepEngineId() === null) {\n throw new Error(\n `[compat:${name}] no BREP kernel bound; run host init/inject (e.g. initOcct + ` +\n `register the occt brep engine) before the first compat.${name} call. ` +\n `Library code must not install kernels itself.`\n )\n }\n}\n\n/** Signature of a projected compat op (inputs normalized before the call). */\nexport type CompatProjection = (...args: unknown[]) => unknown\n\n/**\n * Project a vendored brepjs function onto the faijs TS compat face.\n *\n * The returned function is brepjs-shaped: positional arguments in, `Result`\n * (or whatever the vendored function returns) out — no faijs `Shape`, no\n * adoption. Adoption and the statement-boundary unwrap are `compatOp`'s job\n * (§4.3.2 steps 4/5), which is why the script face can wrap the very same\n * projection the TS face exports.\n *\n * @param name - op name (error messages + D11 discriminant context).\n * @param params - machine parameter-name table (object form → positional).\n * @param formClass - D11 form class (A single-name dual-form / B1 options-only /\n * B2 two names).\n * @param impl - the vendored function.\n * @returns the projected compat op.\n */\nexport function projectBrepOp(\n name: string,\n params: string[],\n formClass: FormClass,\n impl: (...args: never[]) => unknown,\n): CompatProjection {\n return (...args: unknown[]) => {\n assertKernelBound(name)\n const positional = resolveArgs(args, { name, params, formClass })\n return callBrepjs(impl, positional)\n }\n}\n"]}