@faicad/faijs 0.16.1 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/LICENSE +4 -5
  2. package/NOTICE +5 -6
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +19 -1
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/assembly/entities.d.ts +1 -1
  7. package/dist/api/assembly/entities.d.ts.map +1 -1
  8. package/dist/api/assembly/entities.js.map +1 -1
  9. package/dist/api/assembly/joints.d.ts +2 -2
  10. package/dist/api/assembly/joints.d.ts.map +1 -1
  11. package/dist/api/assembly/joints.js +2 -2
  12. package/dist/api/assembly/joints.js.map +1 -1
  13. package/dist/api/assembly/lower.d.ts +1 -1
  14. package/dist/api/assembly/lower.d.ts.map +1 -1
  15. package/dist/api/assembly/lower.js.map +1 -1
  16. package/dist/api/assembly/pose.d.ts +3 -3
  17. package/dist/api/assembly/pose.d.ts.map +1 -1
  18. package/dist/api/assembly/pose.js +1 -1
  19. package/dist/api/assembly/pose.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.d.ts.map +1 -1
  22. package/dist/api/assembly/preview.js +1 -1
  23. package/dist/api/assembly/preview.js.map +1 -1
  24. package/dist/api/assembly/solve.d.ts.map +1 -1
  25. package/dist/api/assembly/solve.js +3 -3
  26. package/dist/api/assembly/solve.js.map +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.d.ts +98 -0
  28. package/dist/api/assembly/solvers/assembly-tree.d.ts.map +1 -0
  29. package/dist/api/assembly/solvers/assembly-tree.js +130 -0
  30. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -0
  31. package/dist/api/assembly/solvers/chain-solver.d.ts +27 -0
  32. package/dist/api/assembly/solvers/chain-solver.d.ts.map +1 -0
  33. package/dist/api/assembly/solvers/chain-solver.js +330 -0
  34. package/dist/api/assembly/solvers/chain-solver.js.map +1 -0
  35. package/dist/api/assembly/solvers/global-solver.js +2 -2
  36. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  37. package/dist/api/assembly/solvers/joints-kinematics.d.ts +308 -0
  38. package/dist/api/assembly/solvers/joints-kinematics.d.ts.map +1 -0
  39. package/dist/api/assembly/solvers/joints-kinematics.js +643 -0
  40. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -0
  41. package/dist/api/assembly/solvers/quat.d.ts +35 -0
  42. package/dist/api/assembly/solvers/quat.d.ts.map +1 -0
  43. package/dist/api/assembly/solvers/quat.js +84 -0
  44. package/dist/api/assembly/solvers/quat.js.map +1 -0
  45. package/dist/api/assembly/solvers/types.d.ts +33 -0
  46. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  47. package/dist/api/assembly/solvers/types.js.map +1 -1
  48. package/dist/api/boolean.d.ts.map +1 -1
  49. package/dist/api/boolean.js +3 -4
  50. package/dist/api/boolean.js.map +1 -1
  51. package/dist/api/brep-mirror/booleanFns.d.ts +40 -0
  52. package/dist/api/brep-mirror/booleanFns.d.ts.map +1 -0
  53. package/dist/api/brep-mirror/booleanFns.js +99 -0
  54. package/dist/api/brep-mirror/booleanFns.js.map +1 -0
  55. package/dist/api/brep-mirror/brepHelpers.d.ts +55 -0
  56. package/dist/api/brep-mirror/brepHelpers.d.ts.map +1 -0
  57. package/dist/api/brep-mirror/brepHelpers.js +131 -0
  58. package/dist/api/brep-mirror/brepHelpers.js.map +1 -0
  59. package/dist/api/brep-mirror/compoundFns.d.ts +47 -0
  60. package/dist/api/brep-mirror/compoundFns.d.ts.map +1 -0
  61. package/dist/api/brep-mirror/compoundFns.js +300 -0
  62. package/dist/api/brep-mirror/compoundFns.js.map +1 -0
  63. package/dist/api/brep-mirror/healingFns.d.ts +78 -0
  64. package/dist/api/brep-mirror/healingFns.d.ts.map +1 -0
  65. package/dist/api/brep-mirror/healingFns.js +294 -0
  66. package/dist/api/brep-mirror/healingFns.js.map +1 -0
  67. package/dist/api/brep-mirror/hullFns.d.ts +20 -0
  68. package/dist/api/brep-mirror/hullFns.d.ts.map +1 -0
  69. package/dist/api/brep-mirror/hullFns.js +46 -0
  70. package/dist/api/brep-mirror/hullFns.js.map +1 -0
  71. package/dist/api/brep-mirror/patternFns.d.ts +43 -0
  72. package/dist/api/brep-mirror/patternFns.d.ts.map +1 -0
  73. package/dist/api/brep-mirror/patternFns.js +178 -0
  74. package/dist/api/brep-mirror/patternFns.js.map +1 -0
  75. package/dist/api/brep-mirror/primitiveFns.d.ts +42 -0
  76. package/dist/api/brep-mirror/primitiveFns.d.ts.map +1 -0
  77. package/dist/api/brep-mirror/primitiveFns.js +104 -0
  78. package/dist/api/brep-mirror/primitiveFns.js.map +1 -0
  79. package/dist/api/brep-mirror/roofFns.d.ts +24 -0
  80. package/dist/api/brep-mirror/roofFns.d.ts.map +1 -0
  81. package/dist/api/brep-mirror/roofFns.js +229 -0
  82. package/dist/api/brep-mirror/roofFns.js.map +1 -0
  83. package/dist/api/brep-mirror/straightSkeleton.d.ts +36 -0
  84. package/dist/api/brep-mirror/straightSkeleton.d.ts.map +1 -0
  85. package/dist/api/brep-mirror/straightSkeleton.js +443 -0
  86. package/dist/api/brep-mirror/straightSkeleton.js.map +1 -0
  87. package/dist/api/brep-mirror/sweepFns.d.ts +55 -0
  88. package/dist/api/brep-mirror/sweepFns.d.ts.map +1 -0
  89. package/dist/api/brep-mirror/sweepFns.js +200 -0
  90. package/dist/api/brep-mirror/sweepFns.js.map +1 -0
  91. package/dist/api/brep-mirror/threadFns.d.ts +15 -0
  92. package/dist/api/brep-mirror/threadFns.d.ts.map +1 -1
  93. package/dist/api/brep-mirror/threadFns.js +37 -2
  94. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  95. package/dist/api/brep-mirror/topologyFns.d.ts +74 -0
  96. package/dist/api/brep-mirror/topologyFns.d.ts.map +1 -0
  97. package/dist/api/brep-mirror/topologyFns.js +273 -0
  98. package/dist/api/brep-mirror/topologyFns.js.map +1 -0
  99. package/dist/api/brep-topology.d.ts +190 -0
  100. package/dist/api/brep-topology.d.ts.map +1 -0
  101. package/dist/api/brep-topology.js +337 -0
  102. package/dist/api/brep-topology.js.map +1 -0
  103. package/dist/api/brepjs-compat/constants.d.ts +11 -0
  104. package/dist/api/brepjs-compat/constants.d.ts.map +1 -0
  105. package/dist/api/brepjs-compat/constants.js +11 -0
  106. package/dist/api/brepjs-compat/constants.js.map +1 -0
  107. package/dist/api/brepjs-compat/index.d.ts +19 -232
  108. package/dist/api/brepjs-compat/index.d.ts.map +1 -1
  109. package/dist/api/brepjs-compat/index.js +19 -286
  110. package/dist/api/brepjs-compat/index.js.map +1 -1
  111. package/dist/api/brepjs-compat/planeOps.d.ts +98 -0
  112. package/dist/api/brepjs-compat/planeOps.d.ts.map +1 -0
  113. package/dist/api/brepjs-compat/planeOps.js +170 -0
  114. package/dist/api/brepjs-compat/planeOps.js.map +1 -0
  115. package/dist/api/brepjs-compat/planeTypes.d.ts +24 -0
  116. package/dist/api/brepjs-compat/planeTypes.d.ts.map +1 -0
  117. package/dist/api/brepjs-compat/planeTypes.js +8 -0
  118. package/dist/api/brepjs-compat/planeTypes.js.map +1 -0
  119. package/dist/api/brepjs-compat/types.d.ts +64 -0
  120. package/dist/api/brepjs-compat/types.d.ts.map +1 -0
  121. package/dist/api/brepjs-compat/types.js +48 -0
  122. package/dist/api/brepjs-compat/types.js.map +1 -0
  123. package/dist/api/brepjs-compat/vecOps.d.ts +124 -0
  124. package/dist/api/brepjs-compat/vecOps.d.ts.map +1 -0
  125. package/dist/api/brepjs-compat/vecOps.js +202 -0
  126. package/dist/api/brepjs-compat/vecOps.js.map +1 -0
  127. package/dist/api/chamfer.d.ts +5 -0
  128. package/dist/api/chamfer.d.ts.map +1 -1
  129. package/dist/api/chamfer.js +13 -8
  130. package/dist/api/chamfer.js.map +1 -1
  131. package/dist/api/compound-geom.d.ts.map +1 -1
  132. package/dist/api/compound-geom.js +8 -2
  133. package/dist/api/compound-geom.js.map +1 -1
  134. package/dist/api/draft.d.ts +69 -0
  135. package/dist/api/draft.d.ts.map +1 -0
  136. package/dist/api/draft.js +109 -0
  137. package/dist/api/draft.js.map +1 -0
  138. package/dist/api/edge-ref.d.ts.map +1 -1
  139. package/dist/api/edge-ref.js +2 -2
  140. package/dist/api/edge-ref.js.map +1 -1
  141. package/dist/api/engrave.d.ts.map +1 -1
  142. package/dist/api/engrave.js +2 -3
  143. package/dist/api/engrave.js.map +1 -1
  144. package/dist/api/extrude.d.ts.map +1 -1
  145. package/dist/api/extrude.js +28 -13
  146. package/dist/api/extrude.js.map +1 -1
  147. package/dist/api/face-ref.d.ts.map +1 -1
  148. package/dist/api/face-ref.js +2 -2
  149. package/dist/api/face-ref.js.map +1 -1
  150. package/dist/api/feature-repair.d.ts +137 -0
  151. package/dist/api/feature-repair.d.ts.map +1 -0
  152. package/dist/api/feature-repair.js +221 -0
  153. package/dist/api/feature-repair.js.map +1 -0
  154. package/dist/api/fillet-variable.d.ts +35 -0
  155. package/dist/api/fillet-variable.d.ts.map +1 -0
  156. package/dist/api/fillet-variable.js +71 -0
  157. package/dist/api/fillet-variable.js.map +1 -0
  158. package/dist/api/fillet.d.ts +3 -0
  159. package/dist/api/fillet.d.ts.map +1 -1
  160. package/dist/api/fillet.js +7 -4
  161. package/dist/api/fillet.js.map +1 -1
  162. package/dist/api/generated/2d.d.ts +1 -13
  163. package/dist/api/generated/2d.d.ts.map +1 -1
  164. package/dist/api/generated/2d.js +6 -1
  165. package/dist/api/generated/2d.js.map +1 -1
  166. package/dist/api/generated/brepjs/index.d.ts +298 -298
  167. package/dist/api/generated/brepjs/index.d.ts.map +1 -1
  168. package/dist/api/generated/brepjs/index.js +183 -183
  169. package/dist/api/generated/brepjs/index.js.map +1 -1
  170. package/dist/api/generated/core.d.ts +3 -123
  171. package/dist/api/generated/core.d.ts.map +1 -1
  172. package/dist/api/generated/core.js +2 -81
  173. package/dist/api/generated/core.js.map +1 -1
  174. package/dist/api/generated/gear.d.ts +1 -15
  175. package/dist/api/generated/gear.d.ts.map +1 -1
  176. package/dist/api/generated/gear.js +6 -3
  177. package/dist/api/generated/gear.js.map +1 -1
  178. package/dist/api/generated/io.d.ts +1 -13
  179. package/dist/api/generated/io.d.ts.map +1 -1
  180. package/dist/api/generated/io.js +6 -1
  181. package/dist/api/generated/io.js.map +1 -1
  182. package/dist/api/generated/kernel.d.ts +1 -39
  183. package/dist/api/generated/kernel.d.ts.map +1 -1
  184. package/dist/api/generated/kernel.js +6 -4
  185. package/dist/api/generated/kernel.js.map +1 -1
  186. package/dist/api/generated/measurement.d.ts +53 -97
  187. package/dist/api/generated/measurement.d.ts.map +1 -1
  188. package/dist/api/generated/measurement.js +48 -143
  189. package/dist/api/generated/measurement.js.map +1 -1
  190. package/dist/api/generated/ns.d.ts +1 -10
  191. package/dist/api/generated/ns.d.ts.map +1 -1
  192. package/dist/api/generated/ns.js +2 -10
  193. package/dist/api/generated/ns.js.map +1 -1
  194. package/dist/api/generated/operations.d.ts +65 -110
  195. package/dist/api/generated/operations.d.ts.map +1 -1
  196. package/dist/api/generated/operations.js +132 -80
  197. package/dist/api/generated/operations.js.map +1 -1
  198. package/dist/api/generated/projection.d.ts +1 -8
  199. package/dist/api/generated/projection.d.ts.map +1 -1
  200. package/dist/api/generated/projection.js +6 -4
  201. package/dist/api/generated/projection.js.map +1 -1
  202. package/dist/api/generated/query.d.ts +1 -9
  203. package/dist/api/generated/query.d.ts.map +1 -1
  204. package/dist/api/generated/query.js +6 -1
  205. package/dist/api/generated/query.js.map +1 -1
  206. package/dist/api/generated/script-face-manifest.d.ts +2 -0
  207. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  208. package/dist/api/generated/script-face-manifest.js +34 -22
  209. package/dist/api/generated/script-face-manifest.js.map +1 -1
  210. package/dist/api/generated/script-face.d.ts +52 -27
  211. package/dist/api/generated/script-face.d.ts.map +1 -1
  212. package/dist/api/generated/script-face.js +18 -4
  213. package/dist/api/generated/script-face.js.map +1 -1
  214. package/dist/api/generated/sketching.d.ts +4 -7
  215. package/dist/api/generated/sketching.d.ts.map +1 -1
  216. package/dist/api/generated/sketching.js +10 -8
  217. package/dist/api/generated/sketching.js.map +1 -1
  218. package/dist/api/generated/text.d.ts +1 -6
  219. package/dist/api/generated/text.d.ts.map +1 -1
  220. package/dist/api/generated/text.js +6 -3
  221. package/dist/api/generated/text.js.map +1 -1
  222. package/dist/api/generated/topology.d.ts +77 -175
  223. package/dist/api/generated/topology.d.ts.map +1 -1
  224. package/dist/api/generated/topology.js +172 -131
  225. package/dist/api/generated/topology.js.map +1 -1
  226. package/dist/api/geom.d.ts.map +1 -1
  227. package/dist/api/geom.js +2 -2
  228. package/dist/api/geom.js.map +1 -1
  229. package/dist/api/helix.d.ts +51 -0
  230. package/dist/api/helix.d.ts.map +1 -0
  231. package/dist/api/helix.js +63 -0
  232. package/dist/api/helix.js.map +1 -0
  233. package/dist/api/import-step.d.ts.map +1 -1
  234. package/dist/api/import-step.js +6 -2
  235. package/dist/api/import-step.js.map +1 -1
  236. package/dist/api/index.d.ts +18 -5
  237. package/dist/api/index.d.ts.map +1 -1
  238. package/dist/api/index.js +29 -12
  239. package/dist/api/index.js.map +1 -1
  240. package/dist/api/internal/compat-op.d.ts +10 -0
  241. package/dist/api/internal/compat-op.d.ts.map +1 -1
  242. package/dist/api/internal/compat-op.js +9 -3
  243. package/dist/api/internal/compat-op.js.map +1 -1
  244. package/dist/api/internal/compat-projection.d.ts +4 -4
  245. package/dist/api/internal/compat-projection.js +7 -7
  246. package/dist/api/internal/compat-projection.js.map +1 -1
  247. package/dist/api/internal/l3-bridge.d.ts +75 -42
  248. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  249. package/dist/api/internal/l3-bridge.js +105 -50
  250. package/dist/api/internal/l3-bridge.js.map +1 -1
  251. package/dist/api/internal/profile-wire.d.ts +31 -0
  252. package/dist/api/internal/profile-wire.d.ts.map +1 -0
  253. package/dist/api/internal/profile-wire.js +37 -0
  254. package/dist/api/internal/profile-wire.js.map +1 -0
  255. package/dist/api/internal/replica-role-table.js +2 -2
  256. package/dist/api/internal/replica-role-table.js.map +1 -1
  257. package/dist/api/loft.d.ts +66 -0
  258. package/dist/api/loft.d.ts.map +1 -0
  259. package/dist/api/loft.js +111 -0
  260. package/dist/api/loft.js.map +1 -0
  261. package/dist/api/measurement/index.d.ts +51 -0
  262. package/dist/api/measurement/index.d.ts.map +1 -0
  263. package/dist/api/measurement/index.js +71 -0
  264. package/dist/api/measurement/index.js.map +1 -0
  265. package/dist/api/occt-kernel-bridge.d.ts +5 -8
  266. package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
  267. package/dist/api/occt-kernel-bridge.js +18 -14
  268. package/dist/api/occt-kernel-bridge.js.map +1 -1
  269. package/dist/api/pattern.d.ts.map +1 -1
  270. package/dist/api/pattern.js +3 -4
  271. package/dist/api/pattern.js.map +1 -1
  272. package/dist/api/place.d.ts.map +1 -1
  273. package/dist/api/place.js +2 -4
  274. package/dist/api/place.js.map +1 -1
  275. package/dist/api/primitives.d.ts.map +1 -1
  276. package/dist/api/primitives.js +3 -4
  277. package/dist/api/primitives.js.map +1 -1
  278. package/dist/api/replicate.d.ts +28 -1
  279. package/dist/api/replicate.d.ts.map +1 -1
  280. package/dist/api/replicate.js +29 -19
  281. package/dist/api/replicate.js.map +1 -1
  282. package/dist/api/result.d.ts +6 -11
  283. package/dist/api/result.d.ts.map +1 -1
  284. package/dist/api/result.js +6 -11
  285. package/dist/api/result.js.map +1 -1
  286. package/dist/api/revolve.d.ts.map +1 -1
  287. package/dist/api/revolve.js +15 -14
  288. package/dist/api/revolve.js.map +1 -1
  289. package/dist/api/screw.d.ts +3 -0
  290. package/dist/api/screw.d.ts.map +1 -1
  291. package/dist/api/screw.js +9 -4
  292. package/dist/api/screw.js.map +1 -1
  293. package/dist/api/sdf.d.ts +1 -1
  294. package/dist/api/section-by-plane.d.ts +42 -0
  295. package/dist/api/section-by-plane.d.ts.map +1 -0
  296. package/dist/api/section-by-plane.js +61 -0
  297. package/dist/api/section-by-plane.js.map +1 -0
  298. package/dist/api/shell.d.ts +45 -0
  299. package/dist/api/shell.d.ts.map +1 -0
  300. package/dist/api/shell.js +73 -0
  301. package/dist/api/shell.js.map +1 -0
  302. package/dist/api/sketch.d.ts +8 -1
  303. package/dist/api/sketch.d.ts.map +1 -1
  304. package/dist/api/sketch.js +12 -7
  305. package/dist/api/sketch.js.map +1 -1
  306. package/dist/api/split-by-plane.d.ts +41 -0
  307. package/dist/api/split-by-plane.d.ts.map +1 -0
  308. package/dist/api/split-by-plane.js +60 -0
  309. package/dist/api/split-by-plane.js.map +1 -0
  310. package/dist/api/split.d.ts +6 -1
  311. package/dist/api/split.d.ts.map +1 -1
  312. package/dist/api/split.js +23 -9
  313. package/dist/api/split.js.map +1 -1
  314. package/dist/api/surface/arg-spec.d.ts +22 -0
  315. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  316. package/dist/api/surface/arg-spec.js +723 -476
  317. package/dist/api/surface/arg-spec.js.map +1 -1
  318. package/dist/api/sweep.d.ts +55 -0
  319. package/dist/api/sweep.d.ts.map +1 -0
  320. package/dist/api/sweep.js +86 -0
  321. package/dist/api/sweep.js.map +1 -0
  322. package/dist/api/thicken.d.ts +36 -0
  323. package/dist/api/thicken.d.ts.map +1 -0
  324. package/dist/api/thicken.js +55 -0
  325. package/dist/api/thicken.js.map +1 -0
  326. package/dist/api/transform.d.ts +8 -0
  327. package/dist/api/transform.d.ts.map +1 -1
  328. package/dist/api/transform.js +15 -4
  329. package/dist/api/transform.js.map +1 -1
  330. package/dist/api/view/cameraFns.d.ts +48 -0
  331. package/dist/api/view/cameraFns.d.ts.map +1 -0
  332. package/dist/api/view/cameraFns.js +75 -0
  333. package/dist/api/view/cameraFns.js.map +1 -0
  334. package/dist/api/view/projectionPlanes.d.ts +25 -0
  335. package/dist/api/view/projectionPlanes.d.ts.map +1 -0
  336. package/dist/api/view/projectionPlanes.js +30 -0
  337. package/dist/api/view/projectionPlanes.js.map +1 -0
  338. package/dist/api/view/view-camera.d.ts +2 -2
  339. package/dist/api/view/view-camera.d.ts.map +1 -1
  340. package/dist/api/view/view-camera.js +3 -3
  341. package/dist/api/view/view-camera.js.map +1 -1
  342. package/dist/api/view/view-projection.d.ts +9 -6
  343. package/dist/api/view/view-projection.d.ts.map +1 -1
  344. package/dist/api/view/view-projection.js +132 -65
  345. package/dist/api/view/view-projection.js.map +1 -1
  346. package/dist/api/wire.d.ts +45 -0
  347. package/dist/api/wire.d.ts.map +1 -0
  348. package/dist/api/wire.js +96 -0
  349. package/dist/api/wire.js.map +1 -0
  350. package/dist/boolean/creased-normals.d.ts +50 -0
  351. package/dist/boolean/creased-normals.d.ts.map +1 -0
  352. package/dist/boolean/creased-normals.js +114 -0
  353. package/dist/boolean/creased-normals.js.map +1 -0
  354. package/dist/boolean/deriveNormals.d.ts +4 -1
  355. package/dist/boolean/deriveNormals.d.ts.map +1 -1
  356. package/dist/boolean/deriveNormals.js +5 -2
  357. package/dist/boolean/deriveNormals.js.map +1 -1
  358. package/dist/brep/brep-ops.d.ts +6 -0
  359. package/dist/brep/brep-ops.d.ts.map +1 -1
  360. package/dist/brep/brep-ops.js +11 -2
  361. package/dist/brep/brep-ops.js.map +1 -1
  362. package/dist/brep/brep-topology.d.ts +4 -0
  363. package/dist/brep/brep-topology.d.ts.map +1 -1
  364. package/dist/brep/brep-topology.js +4 -0
  365. package/dist/brep/brep-topology.js.map +1 -1
  366. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  367. package/dist/brep/engine/adapters/brep-mock.js +79 -59
  368. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  369. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  370. package/dist/brep/engine/adapters/brepkit.js +7 -1
  371. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  372. package/dist/brep/engine/adapters/occt.d.ts +15 -7
  373. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  374. package/dist/brep/engine/adapters/occt.js +52 -167
  375. package/dist/brep/engine/adapters/occt.js.map +1 -1
  376. package/dist/brep/engine/primitives.d.ts +93 -130
  377. package/dist/brep/engine/primitives.d.ts.map +1 -1
  378. package/dist/brep/engine/primitives.js +9 -7
  379. package/dist/brep/engine/primitives.js.map +1 -1
  380. package/dist/brep/engine/types.d.ts +14 -1
  381. package/dist/brep/engine/types.d.ts.map +1 -1
  382. package/dist/brep/engine/types.js +11 -1
  383. package/dist/brep/engine/types.js.map +1 -1
  384. package/dist/brep/export/step.d.ts +3 -0
  385. package/dist/brep/export/step.d.ts.map +1 -1
  386. package/dist/brep/export/step.js +7 -1
  387. package/dist/brep/export/step.js.map +1 -1
  388. package/dist/brep/face-evolution.d.ts +8 -0
  389. package/dist/brep/face-evolution.d.ts.map +1 -1
  390. package/dist/brep/face-evolution.js +15 -3
  391. package/dist/brep/face-evolution.js.map +1 -1
  392. package/dist/brep/handle-bridge.d.ts +20 -2
  393. package/dist/brep/handle-bridge.d.ts.map +1 -1
  394. package/dist/brep/handle-bridge.js +25 -2
  395. package/dist/brep/handle-bridge.js.map +1 -1
  396. package/dist/brepkit-kernel/brepkitKernel.d.ts +25 -5
  397. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  398. package/dist/brepkit-kernel/brepkitKernel.js +336 -144
  399. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  400. package/dist/cad-runtime/admit-compat-lib.d.ts +6 -1
  401. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  402. package/dist/cad-runtime/admit-compat-lib.js +5 -1
  403. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  404. package/dist/cad-runtime/backend-dispatch.d.ts +9 -3
  405. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  406. package/dist/cad-runtime/backend-dispatch.js +32 -2
  407. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  408. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  409. package/dist/cad-runtime/direct-executor.js +8 -2
  410. package/dist/cad-runtime/direct-executor.js.map +1 -1
  411. package/dist/cad-runtime/runtime.d.ts +3 -0
  412. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  413. package/dist/cad-runtime/runtime.js +3 -1
  414. package/dist/cad-runtime/runtime.js.map +1 -1
  415. package/dist/define-op.d.ts +18 -2
  416. package/dist/define-op.d.ts.map +1 -1
  417. package/dist/define-op.js +29 -1
  418. package/dist/define-op.js.map +1 -1
  419. package/dist/env-agnostic.d.ts +3 -0
  420. package/dist/env-agnostic.d.ts.map +1 -1
  421. package/dist/env-agnostic.js +7 -0
  422. package/dist/env-agnostic.js.map +1 -1
  423. package/dist/index.d.ts.map +1 -1
  424. package/dist/index.js +3 -4
  425. package/dist/index.js.map +1 -1
  426. package/dist/lang/symbol-table.generated.d.ts +28 -0
  427. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  428. package/dist/lang/symbol-table.generated.js +29 -1
  429. package/dist/lang/symbol-table.generated.js.map +1 -1
  430. package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
  431. package/dist/occt-kernel/highLevelApi.js +6 -3
  432. package/dist/occt-kernel/highLevelApi.js.map +1 -1
  433. package/dist/occt-kernel/hullGeometry.d.ts +31 -0
  434. package/dist/occt-kernel/hullGeometry.d.ts.map +1 -0
  435. package/dist/occt-kernel/hullGeometry.js +319 -0
  436. package/dist/occt-kernel/hullGeometry.js.map +1 -0
  437. package/dist/occt-kernel/hullOps.d.ts +24 -0
  438. package/dist/occt-kernel/hullOps.d.ts.map +1 -0
  439. package/dist/occt-kernel/hullOps.js +52 -0
  440. package/dist/occt-kernel/hullOps.js.map +1 -0
  441. package/dist/occt-kernel/occt-primitives.d.ts +14 -0
  442. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -0
  443. package/dist/occt-kernel/occt-primitives.js +351 -0
  444. package/dist/occt-kernel/occt-primitives.js.map +1 -0
  445. package/dist/occt-kernel/occtKernel.d.ts +14 -6
  446. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  447. package/dist/occt-kernel/occtKernel.js +11 -3
  448. package/dist/occt-kernel/occtKernel.js.map +1 -1
  449. package/dist/occt-kernel/topologyExt.js +2 -2
  450. package/dist/occt-kernel/topologyExt.js.map +1 -1
  451. package/dist/primitives/brep-primitives.d.ts +4 -0
  452. package/dist/primitives/brep-primitives.d.ts.map +1 -1
  453. package/dist/primitives/brep-primitives.js +4 -0
  454. package/dist/primitives/brep-primitives.js.map +1 -1
  455. package/dist/result/bug.d.ts +22 -0
  456. package/dist/result/bug.d.ts.map +1 -0
  457. package/dist/result/bug.js +28 -0
  458. package/dist/result/bug.js.map +1 -0
  459. package/dist/result/errors.d.ts +270 -0
  460. package/dist/result/errors.d.ts.map +1 -0
  461. package/dist/result/errors.js +317 -0
  462. package/dist/result/errors.js.map +1 -0
  463. package/dist/result/kernelErrorTranslation.d.ts +21 -0
  464. package/dist/result/kernelErrorTranslation.d.ts.map +1 -0
  465. package/dist/result/kernelErrorTranslation.js +102 -0
  466. package/dist/result/kernelErrorTranslation.js.map +1 -0
  467. package/dist/result/result.d.ts +213 -0
  468. package/dist/result/result.d.ts.map +1 -0
  469. package/dist/result/result.js +336 -0
  470. package/dist/result/result.js.map +1 -0
  471. package/dist/result/vec3.d.ts +12 -0
  472. package/dist/result/vec3.d.ts.map +1 -0
  473. package/dist/result/vec3.js +14 -0
  474. package/dist/result/vec3.js.map +1 -0
  475. package/dist/runtime-state.d.ts +9 -0
  476. package/dist/runtime-state.d.ts.map +1 -1
  477. package/dist/runtime-state.js.map +1 -1
  478. package/dist/sdk.d.ts +3 -1
  479. package/dist/sdk.d.ts.map +1 -1
  480. package/dist/sdk.js +2 -1
  481. package/dist/sdk.js.map +1 -1
  482. package/dist/shape.d.ts +43 -1
  483. package/dist/shape.d.ts.map +1 -1
  484. package/dist/shape.js +57 -1
  485. package/dist/shape.js.map +1 -1
  486. package/dist/topology/naming/geom-hint.js +1 -1
  487. package/dist/topology/naming/geom-hint.js.map +1 -1
  488. package/dist/topology/naming/score.js +1 -1
  489. package/dist/topology/naming/score.js.map +1 -1
  490. package/package.json +6 -16
@@ -1,15 +1,10 @@
1
1
  /**
2
- * Platform Result face (L3 bridge) — the only legal way for non-`api/` core
3
- * code to reach the vendored `Result` implementation.
2
+ * Platform Result face — the first-party Result implementation.
4
3
  *
5
- * D8 (docs/plans/2026-09-01-layered-api-architecture.md) forbids importing the
6
- * vendored tree from anywhere outside `src/api/`, while `src/fcstd/*` needs
7
- * `ok` / `err` / `isOk` / `Result`. Routing that need through this projection
8
- * keeps the bridge explicit instead of reaching into
9
- * `../vendored/brepjs/core/result.js` directly.
10
- *
11
- * Projection only — no reimplementation: the vendored module stays the single
12
- * source of truth for the Result semantics shared with the compat face.
4
+ * 2026-09-25 core-decouple Phase 1:从「vendored 投影」(旧 `export * from
5
+ * '@faicad/faijs-brepjs/core/result.js'`)改为 core 第一方模块 `result/result.ts`
6
+ * (同源复制,签名不变)。`@faicad/faijs/api/result` 深路径保持可用
7
+ * (fcstd 等下游按此 import)。
13
8
  */
14
- export * from '../vendored/brepjs/core/result.js';
9
+ export * from '../result/result.js';
15
10
  //# sourceMappingURL=result.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/api/result.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,cAAc,mCAAmC,CAAA","sourcesContent":["/**\n * Platform Result face (L3 bridge) — the only legal way for non-`api/` core\n * code to reach the vendored `Result` implementation.\n *\n * D8 (docs/plans/2026-09-01-layered-api-architecture.md) forbids importing the\n * vendored tree from anywhere outside `src/api/`, while `src/fcstd/*` needs\n * `ok` / `err` / `isOk` / `Result`. Routing that need through this projection\n * keeps the bridge explicit instead of reaching into\n * `../vendored/brepjs/core/result.js` directly.\n *\n * Projection only — no reimplementation: the vendored module stays the single\n * source of truth for the Result semantics shared with the compat face.\n */\nexport * from '../vendored/brepjs/core/result.js'\n"]}
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/api/result.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,kBAAkB,CAAA","sourcesContent":["/**\n * Platform Result face — the first-party Result implementation.\n *\n * 2026-09-25 core-decouple Phase 1:从「vendored 投影」(旧 `export * from\n * '@faicad/faijs-brepjs/core/result.js'`)改为 core 第一方模块 `result/result.ts`\n * (同源复制,签名不变)。`@faicad/faijs/api/result` 深路径保持可用\n * (fcstd 等下游按此 import)。\n */\nexport * from '../result/result'\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"revolve.d.ts","sourceRoot":"","sources":["../../src/api/revolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAoG1C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,OAAO;WAC2B,OAAO;;;CAqCpD,CAAA"}
1
+ {"version":3,"file":"revolve.d.ts","sourceRoot":"","sources":["../../src/api/revolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAkG1C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,OAAO;WAC2B,OAAO;;;CAwCpD,CAAA"}
@@ -15,13 +15,11 @@
15
15
  * 其余(含圆柱等曲面侧面)→ wall:i。无法分类的面不进表(缺身份是显式状态)。
16
16
  */
17
17
  import { defineOp } from '../sdk.js';
18
- import { getBackends, getCurrentStmt } from '../runtime-state.js';
19
- import { brepOf } from '../shape.js';
20
- import { adoptEntity, callBrepjs } from './internal/l3-bridge.js';
21
- import { borrowDeep } from './internal/compat-op.js';
22
- import { unwrapResult } from './internal/result-unwrap.js';
18
+ import { getCurrentStmt } from '../runtime-state.js';
19
+ import { getBrepApi } from '../brep/handle-bridge.js';
20
+ import { brepOf, fromBrep } from '../shape.js';
21
+ import { solidToShape } from '../brep/brep-ops.js';
23
22
  import { runtimeLineage } from '../topology/naming/lineage.js';
24
- import { revolve as vendoredRevolve } from '../vendored/brepjs/operations/api.js';
25
23
  import { formatRoleName, semantic, wall } from '../topology/naming/role-name.js';
26
24
  /**
27
25
  * revolve 的 construct 词汇表:`bottom` / `top`(旋转轴两端的平面端面)+ `wall:<i>`。
@@ -71,7 +69,7 @@ function revolveConstructRoles(kernel, solid, axisOpt) {
71
69
  if (hashes[i] === undefined)
72
70
  continue;
73
71
  if (isPlaneCap[i]) {
74
- const c = kernel.getSurfaceCenterOfMass(faceHandles[i]);
72
+ const c = kernel.surfaceCenterOfMass(faceHandles[i]);
75
73
  caps.push({ idx: i, t: c.x * ax[0] + c.y * ax[1] + c.z * ax[2] });
76
74
  }
77
75
  }
@@ -130,11 +128,14 @@ export const revolve = defineOp({
130
128
  // vendored 语义经 l3-bridge 三步桥接(与 compatOp 的 adapter 相同步骤,
131
129
  // 但在这里执行以便在**同一处**收编产物并建链根 roleTable——compatOp 的
132
130
  // 自动 adoptOut 会先登记一次,二次 fromBrep 会让 edgeRef 读到残缺表)。
133
- const value = unwrapResult(await callBrepjs(vendoredRevolve, [borrowDeep(face, 0), borrowDeep(options ?? {}, 0)]), 'revolve');
134
- const s = adoptEntity(value, 'revolve');
135
- const kernel = getBackends().kernel.brep;
136
- const handle = kernel ? brepOf(s) : undefined;
137
- if (!kernel || !handle)
131
+ const kernel = getBrepApi();
132
+ const handle = brepOf(face);
133
+ if (!handle)
134
+ throw new Error('[revolve] input is not BREP');
135
+ const { at = [0, 0, 0], axis = [0, 0, 1], angle = 2 * Math.PI } = (options ?? {});
136
+ const revolved = kernel.revolveVec(handle, { x: at[0], y: at[1], z: at[2] }, { x: axis[0], y: axis[1], z: axis[2] }, (angle * 180) / Math.PI);
137
+ const s = fromBrep(solidToShape(kernel, revolved), { solid: revolved });
138
+ if (!getBrepApi())
138
139
  return s;
139
140
  // E3(Q13 路线①):链根建 roleTable,origin = 语句 StmtId(Phase 1.6 口径)。
140
141
  // GOTCHA(2026-09-23):不能对 adoptEntity 的产物再走一次 fromBrep——同语句的
@@ -142,12 +143,12 @@ export const revolve = defineOp({
142
143
  // 语句键)。直接经 runtimeLineage.recordOutput 落语句键表;define-op 包装层
143
144
  // 会在 impl 返回后把它传播到 part 键权威位(edgeRef 的读口)。
144
145
  const origin = String(getCurrentStmt()?.id ?? '');
145
- const table = new Map([[origin, revolveConstructRoles(kernel, handle, options?.axis)]]);
146
+ const table = new Map([[origin, revolveConstructRoles(kernel, revolved, options?.axis)]]);
146
147
  // GOTCHA:recordOutput 必须带第 4 参 part——part 键表(outputTablesByPart)
147
148
  // 是 op 实现与 edgeRef 解析的权威读口,只落语句键表时 part 键会保持
148
149
  // adoptEntity 时登记的空表(探针实测),下游仍报 no role lineage。
149
150
  const part = getCurrentStmt()?.outputs?.[0];
150
- runtimeLineage.recordOutput(origin, table, handle, part);
151
+ runtimeLineage.recordOutput(origin, table, revolved, part);
151
152
  return s;
152
153
  },
153
154
  naming: {
@@ -1 +1 @@
1
- {"version":3,"file":"revolve.js","sourceRoot":"","sources":["../../src/api/revolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,sCAAsC,CAAA;AACjF,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAA;AAI7E;;;GAGG;AAEH,uCAAuC;AACvC,SAAS,OAAO,CAAC,CAAU;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC/E,OAAO,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAA;IAC9B,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,GAAG,IAAK,CAAY,EAAE,CAAC;QAChE,MAAM,CAAC,GAAG,CAAwC,CAAA;QAClD,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACxB,CAAC;IACD,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,qBAAqB,CAC5B,MAAqB,EACrB,KAAiB,EACjB,OAAgB;IAEhB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAA;IACzC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;QAC/D,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QACvC,IAAI,KAAK,GAAG,IAAI;YAAE,OAAO,KAAK,CAAA;QAC9B,MAAM,EAAE,GAAsC,CAAC,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,CAAC,CAAA;QAErF,MAAM,IAAI,GAAiC,EAAE,CAAA;QAC7C,MAAM,UAAU,GAAc,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAClD,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,OAAO;gBAAE,OAAO,KAAK,CAAA;YACnD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;YACnF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,CAAA;YACtE,OAAO,GAAG,GAAG,KAAK,CAAA;QACpB,CAAC,CAAC,CAAA;QACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS;gBAAE,SAAQ;YACrC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClB,MAAM,CAAC,GAAG,MAAM,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,CAAA;gBACxD,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,EAAE,CAAC,CAAA;YACtE,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACrB,gDAAgD;YAChD,IAAI,OAAO,GAAG,CAAC,CAAA;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;gBACtB,IAAI,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC;oBAAE,SAAQ;gBACjD,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;gBAChD,OAAO,EAAE,CAAA;YACX,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9B,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,GAAG,CAAE,CAAC,CAAC,CAAA;YACtE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG,CAAE,CAAC,CAAC,CAAA;QACnF,CAAC;aAAM,CAAC;YACN,iDAAiD;YACjD,uCAAuC;YACvC,8CAA8C;YAC9C,wCAAwC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;gBACtB,IAAI,IAAI,KAAK,SAAS;oBAAE,SAAQ;gBAChC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC;gBAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;IAC9B,IAAI,EAAE,KAAK,EAAE,IAAW,EAAE,OAA4B,EAAE,EAAE;QACxD,yDAAyD;QACzD,iDAAiD;QACjD,oDAAoD;QACpD,MAAM,KAAK,GAAG,YAAY,CACxB,MAAM,UAAU,CAAC,eAAwB,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAC/F,SAAS,CACV,CAAA;QACD,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,SAAS,CAAU,CAAA;QAChD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAA4B,CAAA;QAChE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAE,MAAM,CAAC,CAAC,CAA4B,CAAC,CAAC,CAAC,SAAS,CAAA;QACzE,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAA;QAChC,8DAA8D;QAC9D,4DAA4D;QAC5D,sDAAsD;QACtD,2DAA2D;QAC3D,2CAA2C;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACvF,iEAAiE;QACjE,6CAA6C;QAC7C,iDAAiD;QACjD,MAAM,IAAI,GAAG,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3C,cAAc,CAAC,YAAY,CAAC,MAAe,EAAE,KAAK,EAAE,MAAM,EAAE,IAAa,CAAC,CAAA;QAC1E,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,EAAE;QACN,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE;YACR,GAAG,EAAE,UAAU;YACf,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE;gBACjC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACpC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE;aAC3B;SACF;KACO;CACX,CAAC,CAAA","sourcesContent":["/**\n * revolve — 手写平台 op(E3 / Q13 路线①的 revolve 实例)\n *\n * 生成投影(`api/generated/operations.ts` 的 revolve)是 compat op:几何由\n * vendored brepjs 承载,但**没有可挂面命名的代码位置**,产物不带 roleTable,\n * 下游 `cad.edgeRef` 抛 \"nameless shape\"(ModelFromV021 缺陷)。\n *\n * 本文件按 `cut` 覆盖生成投影的同一先例(`api-namespace.ts`),用 defineOp 包住\n * 投影调用,并在产物登记处建链根 roleTable(origin = 语句 StmtId,与\n * `extrude.ts` / `import-brep.ts` 同源机制)。\n *\n * 词汇表沿用生成 spec 的 construct 声明:`bottom` / `top`(旋转轴两端的平面\n * 端面)+ `wall:<i>`(其余侧面,按枚举序)。判定口径与 extrude 相同——现场\n * 几何是唯一真值:平面法向与轴 |cos| ≈ 1 → 端面,按中心沿轴坐标分 bottom/top;\n * 其余(含圆柱等曲面侧面)→ wall:i。无法分类的面不进表(缺身份是显式状态)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { defineOp } from '../sdk'\nimport { getBackends, getCurrentStmt } from '../runtime-state'\nimport { brepOf } from '../shape'\nimport { adoptEntity, callBrepjs } from './internal/l3-bridge'\nimport { borrowDeep } from './internal/compat-op'\nimport { unwrapResult } from './internal/result-unwrap'\nimport { runtimeLineage } from '../topology/naming/lineage'\nimport { revolve as vendoredRevolve } from '../vendored/brepjs/operations/api.js'\nimport { formatRoleName, semantic, wall } from '../topology/naming/role-name'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/**\n * revolve 的 construct 词汇表:`bottom` / `top`(旋转轴两端的平面端面)+ `wall:<i>`。\n * 判定口径见 {@link revolveConstructRoles}。\n */\n\n/** options.axis 的宽松形态(数组或 {x,y,z})。 */\nfunction axisVec(v: unknown): readonly [number, number, number] {\n if (Array.isArray(v) && v.length >= 3 && v.every((n) => typeof n === 'number')) {\n return [v[0]!, v[1]!, v[2]!]\n }\n if (typeof v === 'object' && v !== null && 'x' in (v as object)) {\n const o = v as { x: number; y: number; z: number }\n return [o.x, o.y, o.z]\n }\n return [0, 0, 1]\n}\n\n/**\n * revolve 的 construct 词汇枚举器(与 `extrudeConstructRoles` 同口径,轴来源不同:\n * extrude 从端面法向对差反推,revolve 直接用调用点声明的旋转轴)。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the revolved solid.\n * @param axis - the revolution axis (call-site declared; default [0,0,1]).\n * @returns role(线格式串)→ hash 子表。\n */\nfunction revolveConstructRoles(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n axisOpt: unknown,\n): Map<string, number[]> {\n const roles = new Map<string, number[]>()\n const faceHandles = kernel.getSubShapes(solid, 'face')\n try {\n const hashes = kernel.subShapeHashes(solid, 'face', 2147483647)\n const [ax0, ax1, ax2] = axisVec(axisOpt)\n const axLen = Math.hypot(ax0, ax1, ax2)\n if (axLen < 1e-9) return roles\n const ax: readonly [number, number, number] = [ax0 / axLen, ax1 / axLen, ax2 / axLen]\n\n const caps: { idx: number; t: number }[] = []\n const isPlaneCap: boolean[] = faceHandles.map((f) => {\n if (kernel.surfaceType(f) !== 'plane') return false\n const uv = kernel.uvBounds(f)\n const n = kernel.surfaceNormal(f, (uv.uMin + uv.uMax) / 2, (uv.vMin + uv.vMax) / 2)\n const len = Math.hypot(n.x, n.y, n.z) || 1\n const cos = Math.abs(n.x * ax[0]! + n.y * ax[1]! + n.z * ax[2]!) / len\n return cos > 0.999\n })\n for (let i = 0; i < faceHandles.length; i++) {\n if (hashes[i] === undefined) continue\n if (isPlaneCap[i]) {\n const c = kernel.getSurfaceCenterOfMass(faceHandles[i]!)\n caps.push({ idx: i, t: c.x * ax[0]! + c.y * ax[1]! + c.z * ax[2]! })\n }\n }\n if (caps.length >= 2) {\n // 常规旋转体:轴两端平面端面 = bottom/top,其余面(含曲面侧面)wall:<i>\n let wallIdx = 0\n for (let i = 0; i < faceHandles.length; i++) {\n const hash = hashes[i]\n if (hash === undefined || isPlaneCap[i]) continue\n roles.set(formatRoleName(wall(wallIdx)), [hash])\n wallIdx++\n }\n caps.sort((p, q) => p.t - q.t)\n roles.set(formatRoleName(semantic('bottom')), [hashes[caps[0]!.idx]!])\n roles.set(formatRoleName(semantic('top')), [hashes[caps[caps.length - 1]!.idx]!])\n } else {\n // GOTCHA(退化形态,2026-09-23):轮廓面在轴平面内(如 XY 草图绕 Z 转)\n // 时产物的面法向全部 ∥ 轴 → caps 判不出两端。此时退化为按枚举序\n // wall:<i> 命名全部面——身份是能力,退化形态不给名字就会重演 nameless\n // shape 缺陷;枚举序稳定(同 extrude 的 wall 序依据)。\n for (let i = 0; i < faceHandles.length; i++) {\n const hash = hashes[i]\n if (hash === undefined) continue\n roles.set(formatRoleName(wall(i)), [hash])\n }\n }\n return roles\n } finally {\n for (const h of faceHandles) {\n try { kernel.release(h) } catch { /* 已释放 */ }\n }\n }\n}\n\n/**\n * 旋转成形:把平面轮廓绕轴旋转(兼容生成投影签名)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name revolve\n * @param face - 平面轮廓。type:Shape required:true\n * @param options - 旋转轴/点/角度(透传 vendored 语义)。type:RevolveOptions\n * @returns Shape 旋转体(带链根 roleTable:bottom/top/wall:i)。\n * @example\n * const p1 = await cad.revolve(part0, { axis: [0, 0, 1], at: [0, 0, 0], angle: 6.283185307179586 })\n */\nexport const revolve = defineOp({\n brep: async (face: Shape, options?: { axis?: unknown }) => {\n // vendored 语义经 l3-bridge 三步桥接(与 compatOp 的 adapter 相同步骤,\n // 但在这里执行以便在**同一处**收编产物并建链根 roleTable——compatOp 的\n // 自动 adoptOut 会先登记一次,二次 fromBrep 会让 edgeRef 读到残缺表)。\n const value = unwrapResult(\n await callBrepjs(vendoredRevolve as never, [borrowDeep(face, 0), borrowDeep(options ?? {}, 0)]),\n 'revolve',\n )\n const s = adoptEntity(value, 'revolve') as Shape\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n const handle = kernel ? (brepOf(s) as BrepHandle | undefined) : undefined\n if (!kernel || !handle) return s\n // E3(Q13 路线①):链根建 roleTable,origin = 语句 StmtId(Phase 1.6 口径)。\n // GOTCHA(2026-09-23):不能对 adoptEntity 的产物再走一次 fromBrep——同语句的\n // registeredStmtId 去重会让第二次登记被吞(探针实测:outputTables 里没有本\n // 语句键)。直接经 runtimeLineage.recordOutput 落语句键表;define-op 包装层\n // 会在 impl 返回后把它传播到 part 键权威位(edgeRef 的读口)。\n const origin = String(getCurrentStmt()?.id ?? '')\n const table = new Map([[origin, revolveConstructRoles(kernel, handle, options?.axis)]])\n // GOTCHA:recordOutput 必须带第 4 参 part——part 键表(outputTablesByPart)\n // 是 op 实现与 edgeRef 解析的权威读口,只落语句键表时 part 键会保持\n // adoptEntity 时登记的空表(探针实测),下游仍报 no role lineage。\n const part = getCurrentStmt()?.outputs?.[0]\n runtimeLineage.recordOutput(origin as never, table, handle, part as never)\n return s\n },\n naming: {\n kind: 'construct',\n newFaces: {\n via: 'explicit',\n vocab: [\n { kind: 'semantic', name: 'top' },\n { kind: 'semantic', name: 'bottom' },\n { kind: 'wall', index: 0 },\n ],\n },\n } as never,\n})\n"]}
1
+ {"version":3,"file":"revolve.js","sourceRoot":"","sources":["../../src/api/revolve.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * revolve — 手写平台 op(E3 / Q13 路线①的 revolve 实例)\n *\n * 生成投影(`api/generated/operations.ts` 的 revolve)是 compat op:几何由\n * vendored brepjs 承载,但**没有可挂面命名的代码位置**,产物不带 roleTable,\n * 下游 `cad.edgeRef` 抛 \"nameless shape\"(ModelFromV021 缺陷)。\n *\n * 本文件按 `cut` 覆盖生成投影的同一先例(`api-namespace.ts`),用 defineOp 包住\n * 投影调用,并在产物登记处建链根 roleTable(origin = 语句 StmtId,与\n * `extrude.ts` / `import-brep.ts` 同源机制)。\n *\n * 词汇表沿用生成 spec 的 construct 声明:`bottom` / `top`(旋转轴两端的平面\n * 端面)+ `wall:<i>`(其余侧面,按枚举序)。判定口径与 extrude 相同——现场\n * 几何是唯一真值:平面法向与轴 |cos| ≈ 1 → 端面,按中心沿轴坐标分 bottom/top;\n * 其余(含圆柱等曲面侧面)→ wall:i。无法分类的面不进表(缺身份是显式状态)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { defineOp } from '../sdk'\nimport { getCurrentStmt } from '../runtime-state'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { brepOf, fromBrep } from '../shape'\nimport { solidToShape } from '../brep/brep-ops'\nimport { runtimeLineage } from '../topology/naming/lineage'\nimport { formatRoleName, semantic, wall } from '../topology/naming/role-name'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/**\n * revolve 的 construct 词汇表:`bottom` / `top`(旋转轴两端的平面端面)+ `wall:<i>`。\n * 判定口径见 {@link revolveConstructRoles}。\n */\n\n/** options.axis 的宽松形态(数组或 {x,y,z})。 */\nfunction axisVec(v: unknown): readonly [number, number, number] {\n if (Array.isArray(v) && v.length >= 3 && v.every((n) => typeof n === 'number')) {\n return [v[0]!, v[1]!, v[2]!]\n }\n if (typeof v === 'object' && v !== null && 'x' in (v as object)) {\n const o = v as { x: number; y: number; z: number }\n return [o.x, o.y, o.z]\n }\n return [0, 0, 1]\n}\n\n/**\n * revolve 的 construct 词汇枚举器(与 `extrudeConstructRoles` 同口径,轴来源不同:\n * extrude 从端面法向对差反推,revolve 直接用调用点声明的旋转轴)。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the revolved solid.\n * @param axis - the revolution axis (call-site declared; default [0,0,1]).\n * @returns role(线格式串)→ hash 子表。\n */\nfunction revolveConstructRoles(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n axisOpt: unknown,\n): Map<string, number[]> {\n const roles = new Map<string, number[]>()\n const faceHandles = kernel.getSubShapes(solid, 'face')\n try {\n const hashes = kernel.subShapeHashes(solid, 'face', 2147483647)\n const [ax0, ax1, ax2] = axisVec(axisOpt)\n const axLen = Math.hypot(ax0, ax1, ax2)\n if (axLen < 1e-9) return roles\n const ax: readonly [number, number, number] = [ax0 / axLen, ax1 / axLen, ax2 / axLen]\n\n const caps: { idx: number; t: number }[] = []\n const isPlaneCap: boolean[] = faceHandles.map((f) => {\n if (kernel.surfaceType(f) !== 'plane') return false\n const uv = kernel.uvBounds(f)\n const n = kernel.surfaceNormal(f, (uv.uMin + uv.uMax) / 2, (uv.vMin + uv.vMax) / 2)\n const len = Math.hypot(n.x, n.y, n.z) || 1\n const cos = Math.abs(n.x * ax[0]! + n.y * ax[1]! + n.z * ax[2]!) / len\n return cos > 0.999\n })\n for (let i = 0; i < faceHandles.length; i++) {\n if (hashes[i] === undefined) continue\n if (isPlaneCap[i]) {\n const c = kernel.surfaceCenterOfMass(faceHandles[i]!)\n caps.push({ idx: i, t: c.x * ax[0]! + c.y * ax[1]! + c.z * ax[2]! })\n }\n }\n if (caps.length >= 2) {\n // 常规旋转体:轴两端平面端面 = bottom/top,其余面(含曲面侧面)wall:<i>\n let wallIdx = 0\n for (let i = 0; i < faceHandles.length; i++) {\n const hash = hashes[i]\n if (hash === undefined || isPlaneCap[i]) continue\n roles.set(formatRoleName(wall(wallIdx)), [hash])\n wallIdx++\n }\n caps.sort((p, q) => p.t - q.t)\n roles.set(formatRoleName(semantic('bottom')), [hashes[caps[0]!.idx]!])\n roles.set(formatRoleName(semantic('top')), [hashes[caps[caps.length - 1]!.idx]!])\n } else {\n // GOTCHA(退化形态,2026-09-23):轮廓面在轴平面内(如 XY 草图绕 Z 转)\n // 时产物的面法向全部 ∥ 轴 → caps 判不出两端。此时退化为按枚举序\n // wall:<i> 命名全部面——身份是能力,退化形态不给名字就会重演 nameless\n // shape 缺陷;枚举序稳定(同 extrude 的 wall 序依据)。\n for (let i = 0; i < faceHandles.length; i++) {\n const hash = hashes[i]\n if (hash === undefined) continue\n roles.set(formatRoleName(wall(i)), [hash])\n }\n }\n return roles\n } finally {\n for (const h of faceHandles) {\n try { kernel.release(h) } catch { /* 已释放 */ }\n }\n }\n}\n\n/**\n * 旋转成形:把平面轮廓绕轴旋转(兼容生成投影签名)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name revolve\n * @param face - 平面轮廓。type:Shape required:true\n * @param options - 旋转轴/点/角度(透传 vendored 语义)。type:RevolveOptions\n * @returns Shape 旋转体(带链根 roleTable:bottom/top/wall:i)。\n * @example\n * const p1 = await cad.revolve(part0, { axis: [0, 0, 1], at: [0, 0, 0], angle: 6.283185307179586 })\n */\nexport const revolve = defineOp({\n brep: async (face: Shape, options?: { axis?: unknown }) => {\n // vendored 语义经 l3-bridge 三步桥接(与 compatOp 的 adapter 相同步骤,\n // 但在这里执行以便在**同一处**收编产物并建链根 roleTable——compatOp 的\n // 自动 adoptOut 会先登记一次,二次 fromBrep 会让 edgeRef 读到残缺表)。\n const kernel = getBrepApi()\n const handle = brepOf(face) as BrepHandle\n if (!handle) throw new Error('[revolve] input is not BREP')\n const { at = [0, 0, 0], axis = [0, 0, 1], angle = 2 * Math.PI } = (options ?? {}) as {\n at?: [number, number, number]\n axis?: [number, number, number]\n angle?: number\n }\n const revolved = kernel.revolveVec(handle, { x: at[0], y: at[1], z: at[2] }, { x: axis[0], y: axis[1], z: axis[2] }, (angle * 180) / Math.PI)\n const s = fromBrep(solidToShape(kernel, revolved), { solid: revolved }) as Shape\n if (!getBrepApi()) return s\n // E3(Q13 路线①):链根建 roleTable,origin = 语句 StmtId(Phase 1.6 口径)。\n // GOTCHA(2026-09-23):不能对 adoptEntity 的产物再走一次 fromBrep——同语句的\n // registeredStmtId 去重会让第二次登记被吞(探针实测:outputTables 里没有本\n // 语句键)。直接经 runtimeLineage.recordOutput 落语句键表;define-op 包装层\n // 会在 impl 返回后把它传播到 part 键权威位(edgeRef 的读口)。\n const origin = String(getCurrentStmt()?.id ?? '')\n const table = new Map([[origin, revolveConstructRoles(kernel, revolved, options?.axis)]])\n // GOTCHA:recordOutput 必须带第 4 参 part——part 键表(outputTablesByPart)\n // 是 op 实现与 edgeRef 解析的权威读口,只落语句键表时 part 键会保持\n // adoptEntity 时登记的空表(探针实测),下游仍报 no role lineage。\n const part = getCurrentStmt()?.outputs?.[0]\n runtimeLineage.recordOutput(origin as never, table, revolved, part as never)\n return s\n },\n naming: {\n kind: 'construct',\n newFaces: {\n via: 'explicit',\n vocab: [\n { kind: 'semantic', name: 'top' },\n { kind: 'semantic', name: 'bottom' },\n { kind: 'wall', index: 0 },\n ],\n },\n } as never,\n})\n"]}
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * stdlib screw — 螺丝创建库函数(creator 函数,无输入)
3
3
  *
4
+ * 平台分层(narrowing plan Phase 5,D11):**平台 op(occt)**——BREP 路径的
5
+ * 螺纹经 `threadBrep`(brep-mirror/threadFns.ts)走 occt-only `loft`(D3)→
6
+ * `engines: ['occt']`。mesh 路径(cad.screw)在 auto 模式下正常降级。
4
7
  *
5
8
  * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。
6
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"screw.d.ts","sourceRoot":"","sources":["../../src/api/screw.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAyH1C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CASvE;AAED;;;;;;;;;;;;;;;;;;;;IAoBI;AACJ,eAAO,MAAM,KAAK;;CAkBhB,CAAA"}
1
+ {"version":3,"file":"screw.d.ts","sourceRoot":"","sources":["../../src/api/screw.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AA0H1C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CASvE;AAED;;;;;;;;;;;;;;;;;;;;IAoBI;AACJ,eAAO,MAAM,KAAK;;CAoBhB,CAAA"}
package/dist/api/screw.js CHANGED
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * stdlib screw — 螺丝创建库函数(creator 函数,无输入)
3
3
  *
4
+ * 平台分层(narrowing plan Phase 5,D11):**平台 op(occt)**——BREP 路径的
5
+ * 螺纹经 `threadBrep`(brep-mirror/threadFns.ts)走 occt-only `loft`(D3)→
6
+ * `engines: ['occt']`。mesh 路径(cad.screw)在 auto 模式下正常降级。
4
7
  *
5
8
  * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。
6
9
  */
@@ -8,14 +11,14 @@ import { cad } from '../mesh/index.js';
8
11
  import { solidToShape } from '../brep/brep-ops.js';
9
12
  import { threadBrep } from './brep-mirror/threadFns.js';
10
13
  import { getScrewSpec, threadToPitchMm, SCREW_HEAD_DIMS } from '../primitives/screw/screw-db.js';
11
- import { getBackends } from '../runtime-state.js';
14
+ import { getBrepApi } from '../brep/handle-bridge.js';
12
15
  import { fromBrep } from '../shape.js';
13
16
  import { defineOp } from '../sdk.js';
14
17
  /** BREP 路径:threadBrep + fuse 构造精确螺纹螺钉 + 三角化 + fromBrep 登记。 */
15
18
  async function screwBrep(params) {
16
- const kernel = getBackends().kernel.brep;
17
- if (!kernel)
18
- throw new Error('[stdlib/screw] no OCCT kernel');
19
+ // L1 面(D12):makeCylinder/translate/fuse/makeCone 等全是 L1;螺纹 loft 在
20
+ // threadFns 内部走 occt 平台面。
21
+ const kernel = getBrepApi();
19
22
  const system = params.system;
20
23
  const specIdx = params.specIdx;
21
24
  const spec = getScrewSpec(system, specIdx);
@@ -156,6 +159,8 @@ export const screw = defineOp({
156
159
  assertScrewParams(params);
157
160
  return screwBrep(params);
158
161
  },
162
+ // 平台 op(D11):螺纹 loft 是 occt-only(threadFns.ts,D3)→ engines 声明。
163
+ engines: ['occt'],
159
164
  naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } },
160
165
  });
161
166
  //# sourceMappingURL=screw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"screw.js","sourceRoot":"","sources":["../../src/api/screw.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib screw — 螺丝创建库函数(creator 函数,无输入)\n *\n *\n * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { solidToShape } from '../brep/brep-ops'\nimport { threadBrep } from './brep-mirror/threadFns'\nimport { getScrewSpec, threadToPitchMm, SCREW_HEAD_DIMS } from '../primitives/screw/screw-db'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/** BREP 路径:threadBrep + fuse 构造精确螺纹螺钉 + 三角化 + fromBrep 登记。 */\nasync function screwBrep(params: Record<string, unknown>): Promise<Shape> {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/screw] no OCCT kernel')\n\n const system = params.system as 'metric' | 'imperial'\n const specIdx = params.specIdx as number\n const spec = getScrewSpec(system, specIdx)\n const length = params.length as number\n const head = params.head as 'hex' | 'chc' | 'none'\n const thread = params.thread as 'coarse' | 'fine' | 'custom' | 'none'\n const pitchCustom = params.pitchCustom as number | undefined\n\n // 1. 螺杆(圆柱体,居中)\n const shank = kernel.makeCylinder(spec.dia / 2, length)\n const centeredShank = kernel.translate(shank, 0, 0, -length / 2)\n kernel.release(shank)\n\n let result = centeredShank\n\n // 2. 螺纹(外螺纹)\n if (thread !== 'none') {\n const pitch = threadToPitchMm(system, spec, thread, pitchCustom)\n if (pitch > 0) {\n const threadSolid = threadBrep(kernel, {\n radius: spec.dia / 2,\n pitch,\n height: length,\n })\n // threadBrep creates thread from Z=0 to Z=height; center it to match shank\n const centeredThread = kernel.translate(threadSolid, 0, 0, -length / 2)\n kernel.release(threadSolid)\n const fused = kernel.fuse(result, centeredThread)\n kernel.release(result)\n kernel.release(centeredThread)\n result = fused\n }\n }\n\n // 3. 螺钉头\n if (head === 'hex') {\n // 六棱柱头\n const headHeight = spec.dia * SCREW_HEAD_DIMS.hex.heightFactor\n const headRadius = spec.dia * SCREW_HEAD_DIMS.hex.radiusFactor\n const headSolid = makeHexPrismBrep(kernel, headRadius, headHeight, length / 2)\n const fused = kernel.fuse(result, headSolid)\n kernel.release(result)\n kernel.release(headSolid)\n result = fused\n } else if (head === 'chc') {\n // 沉头(圆锥)\n const headHeight = spec.dia * SCREW_HEAD_DIMS.chc.heightFactor\n const headRadius = spec.dia * SCREW_HEAD_DIMS.chc.radiusFactor\n const cone = kernel.makeCone(headRadius, 0, headHeight)\n const positioned = kernel.translate(cone, 0, 0, length / 2)\n kernel.release(cone)\n const fused = kernel.fuse(result, positioned)\n kernel.release(result)\n kernel.release(positioned)\n result = fused\n }\n\n return fromBrep(solidToShape(kernel, result), { solid: result })\n}\n\n/**\n * 构造六棱柱 BREP solid\n */\nfunction makeHexPrismBrep(\n kernel: BrepEngineApi,\n radius: number,\n height: number,\n zOffset: number,\n): BrepHandle {\n // 六边形顶点\n const pts: { x: number; y: number; z: number }[] = []\n for (let i = 0; i < 6; i++) {\n const angle = (i * 2 * Math.PI) / 6\n pts.push({\n x: radius * Math.cos(angle),\n y: radius * Math.sin(angle),\n z: 0,\n })\n }\n\n // 构建边\n const edges: BrepHandle[] = []\n for (let i = 0; i < 6; i++) {\n const edge = kernel.makeLineEdge(pts[i], pts[(i + 1) % 6])\n edges.push(edge)\n }\n\n // 构建 wire → face → extrude\n const wire = kernel.makeWire(edges)\n const face = kernel.makeFace(wire)\n const extruded = kernel.extrude(face, 0, 0, height)\n\n // 平移到 zOffset\n const positioned = kernel.translate(extruded, 0, 0, zOffset)\n\n // 释放中间句柄\n for (const e of edges) kernel.release(e)\n kernel.release(wire)\n kernel.release(face)\n kernel.release(extruded)\n\n return positioned\n}\n\n/**\n * Validate screw parameters: `system` and `specIdx` are required, and `length`\n * must be a finite number.\n * @param params - the raw screw operation parameters.\n */\nexport function assertScrewParams(params: Record<string, unknown>): void {\n if (typeof params.system !== 'string' || typeof params.specIdx !== 'number') {\n throw new Error(\n `[stdlib/screw] system (string) and specIdx (number) are required, got system=${JSON.stringify(params.system)}, specIdx=${JSON.stringify(params.specIdx)}`,\n )\n }\n if (typeof params.length !== 'number' || !Number.isFinite(params.length)) {\n throw new Error(`[stdlib/screw] length must be a finite number, got ${JSON.stringify(params.length)}`)\n }\n}\n\n/**\n * 生成螺丝零件(螺纹 + 头型)。\n * @group 创建\n * @inputs 0\n * @async true\n * @qual ok\n * @name screw\n * @returns Shape 螺丝几何,生成独立零件。\n * @param params.system - 制式。type:'metric' | 'imperial' required:true\n * @param params.specIdx - 规格索引(决定公称直径,如 5 → M5、6 → M6)。type:number required:true\n * @param params.thread - 螺纹类型。type:'coarse' | 'fine' | 'custom' | 'none' 默认 'coarse'\n * @param params.length - 螺杆长度(mm)。type:number required:true\n * @param params.head - 头型(hex 六角 / chc 沉头 / none 无头)。type:'hex' | 'chc' | 'none' 默认 'none'\n * @param params.pitchCustom - 自定螺距(thread='custom' 时用)。type:number\n * @param params.nRad - 径向分段数(拓扑参数)。type:number 默认 32\n * @note nRad 是拓扑参数不是渲染参数:mesh 路径直接决定分段数;BREP 路径用精确曲面,nRad 仅作 BREP→mesh 三角化角度提示(angular deflection ≈ 2π/nRad)。.fai.js 默认 32 不输出,非默认才输出以保证可复现。\n * @note pitchCustom 执行层已支持(makeScrew/threadBrep 均读取),codegen 曾不序列化(TODO);当前已机械输出。\n * @example\n * const s = await cad.screw({ system: 'metric', specIdx: 6, thread: 'coarse', length: 20, head: 'hex' })\n * const s = await cad.screw({ system: 'metric', specIdx: 6, thread: 'coarse', length: 20, head: 'hex', nRad: 64 })\n */\nexport const screw = defineOp({\n mesh: async (params: Record<string, unknown>) => {\n assertScrewParams(params)\n return cad.screw({\n system: params.system as 'metric' | 'imperial',\n specIdx: params.specIdx as number,\n thread: params.thread as 'coarse' | 'fine' | 'custom' | 'none',\n pitchCustom: params.pitchCustom as number | undefined,\n length: params.length as number,\n head: params.head as 'hex' | 'chc' | 'none',\n nRad: params.nRad as number | undefined,\n })\n },\n brep: async (params: Record<string, unknown>) => {\n assertScrewParams(params)\n return screwBrep(params)\n },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } } as Provenance,\n})\n"]}
1
+ {"version":3,"file":"screw.js","sourceRoot":"","sources":["../../src/api/screw.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib screw — 螺丝创建库函数(creator 函数,无输入)\n *\n * 平台分层(narrowing plan Phase 5,D11):**平台 op(occt)**——BREP 路径的\n * 螺纹经 `threadBrep`(brep-mirror/threadFns.ts)走 occt-only `loft`(D3)→\n * `engines: ['occt']`。mesh 路径(cad.screw)在 auto 模式下正常降级。\n *\n * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { solidToShape } from '../brep/brep-ops'\nimport { threadBrep } from './brep-mirror/threadFns'\nimport { getScrewSpec, threadToPitchMm, SCREW_HEAD_DIMS } from '../primitives/screw/screw-db'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { fromBrep } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/** BREP 路径:threadBrep + fuse 构造精确螺纹螺钉 + 三角化 + fromBrep 登记。 */\nasync function screwBrep(params: Record<string, unknown>): Promise<Shape> {\n // L1 面(D12):makeCylinder/translate/fuse/makeCone 等全是 L1;螺纹 loft 在\n // threadFns 内部走 occt 平台面。\n const kernel = getBrepApi()\n\n const system = params.system as 'metric' | 'imperial'\n const specIdx = params.specIdx as number\n const spec = getScrewSpec(system, specIdx)\n const length = params.length as number\n const head = params.head as 'hex' | 'chc' | 'none'\n const thread = params.thread as 'coarse' | 'fine' | 'custom' | 'none'\n const pitchCustom = params.pitchCustom as number | undefined\n\n // 1. 螺杆(圆柱体,居中)\n const shank = kernel.makeCylinder(spec.dia / 2, length)\n const centeredShank = kernel.translate(shank, 0, 0, -length / 2)\n kernel.release(shank)\n\n let result = centeredShank\n\n // 2. 螺纹(外螺纹)\n if (thread !== 'none') {\n const pitch = threadToPitchMm(system, spec, thread, pitchCustom)\n if (pitch > 0) {\n const threadSolid = threadBrep(kernel, {\n radius: spec.dia / 2,\n pitch,\n height: length,\n })\n // threadBrep creates thread from Z=0 to Z=height; center it to match shank\n const centeredThread = kernel.translate(threadSolid, 0, 0, -length / 2)\n kernel.release(threadSolid)\n const fused = kernel.fuse(result, centeredThread)\n kernel.release(result)\n kernel.release(centeredThread)\n result = fused\n }\n }\n\n // 3. 螺钉头\n if (head === 'hex') {\n // 六棱柱头\n const headHeight = spec.dia * SCREW_HEAD_DIMS.hex.heightFactor\n const headRadius = spec.dia * SCREW_HEAD_DIMS.hex.radiusFactor\n const headSolid = makeHexPrismBrep(kernel, headRadius, headHeight, length / 2)\n const fused = kernel.fuse(result, headSolid)\n kernel.release(result)\n kernel.release(headSolid)\n result = fused\n } else if (head === 'chc') {\n // 沉头(圆锥)\n const headHeight = spec.dia * SCREW_HEAD_DIMS.chc.heightFactor\n const headRadius = spec.dia * SCREW_HEAD_DIMS.chc.radiusFactor\n const cone = kernel.makeCone(headRadius, 0, headHeight)\n const positioned = kernel.translate(cone, 0, 0, length / 2)\n kernel.release(cone)\n const fused = kernel.fuse(result, positioned)\n kernel.release(result)\n kernel.release(positioned)\n result = fused\n }\n\n return fromBrep(solidToShape(kernel, result), { solid: result })\n}\n\n/**\n * 构造六棱柱 BREP solid\n */\nfunction makeHexPrismBrep(\n kernel: BrepEngineApi,\n radius: number,\n height: number,\n zOffset: number,\n): BrepHandle {\n // 六边形顶点\n const pts: { x: number; y: number; z: number }[] = []\n for (let i = 0; i < 6; i++) {\n const angle = (i * 2 * Math.PI) / 6\n pts.push({\n x: radius * Math.cos(angle),\n y: radius * Math.sin(angle),\n z: 0,\n })\n }\n\n // 构建边\n const edges: BrepHandle[] = []\n for (let i = 0; i < 6; i++) {\n const edge = kernel.makeLineEdge(pts[i], pts[(i + 1) % 6])\n edges.push(edge)\n }\n\n // 构建 wire → face → extrude\n const wire = kernel.makeWire(edges)\n const face = kernel.makeFace(wire)\n const extruded = kernel.extrude(face, 0, 0, height)\n\n // 平移到 zOffset\n const positioned = kernel.translate(extruded, 0, 0, zOffset)\n\n // 释放中间句柄\n for (const e of edges) kernel.release(e)\n kernel.release(wire)\n kernel.release(face)\n kernel.release(extruded)\n\n return positioned\n}\n\n/**\n * Validate screw parameters: `system` and `specIdx` are required, and `length`\n * must be a finite number.\n * @param params - the raw screw operation parameters.\n */\nexport function assertScrewParams(params: Record<string, unknown>): void {\n if (typeof params.system !== 'string' || typeof params.specIdx !== 'number') {\n throw new Error(\n `[stdlib/screw] system (string) and specIdx (number) are required, got system=${JSON.stringify(params.system)}, specIdx=${JSON.stringify(params.specIdx)}`,\n )\n }\n if (typeof params.length !== 'number' || !Number.isFinite(params.length)) {\n throw new Error(`[stdlib/screw] length must be a finite number, got ${JSON.stringify(params.length)}`)\n }\n}\n\n/**\n * 生成螺丝零件(螺纹 + 头型)。\n * @group 创建\n * @inputs 0\n * @async true\n * @qual ok\n * @name screw\n * @returns Shape 螺丝几何,生成独立零件。\n * @param params.system - 制式。type:'metric' | 'imperial' required:true\n * @param params.specIdx - 规格索引(决定公称直径,如 5 → M5、6 → M6)。type:number required:true\n * @param params.thread - 螺纹类型。type:'coarse' | 'fine' | 'custom' | 'none' 默认 'coarse'\n * @param params.length - 螺杆长度(mm)。type:number required:true\n * @param params.head - 头型(hex 六角 / chc 沉头 / none 无头)。type:'hex' | 'chc' | 'none' 默认 'none'\n * @param params.pitchCustom - 自定螺距(thread='custom' 时用)。type:number\n * @param params.nRad - 径向分段数(拓扑参数)。type:number 默认 32\n * @note nRad 是拓扑参数不是渲染参数:mesh 路径直接决定分段数;BREP 路径用精确曲面,nRad 仅作 BREP→mesh 三角化角度提示(angular deflection ≈ 2π/nRad)。.fai.js 默认 32 不输出,非默认才输出以保证可复现。\n * @note pitchCustom 执行层已支持(makeScrew/threadBrep 均读取),codegen 曾不序列化(TODO);当前已机械输出。\n * @example\n * const s = await cad.screw({ system: 'metric', specIdx: 6, thread: 'coarse', length: 20, head: 'hex' })\n * const s = await cad.screw({ system: 'metric', specIdx: 6, thread: 'coarse', length: 20, head: 'hex', nRad: 64 })\n */\nexport const screw = defineOp({\n mesh: async (params: Record<string, unknown>) => {\n assertScrewParams(params)\n return cad.screw({\n system: params.system as 'metric' | 'imperial',\n specIdx: params.specIdx as number,\n thread: params.thread as 'coarse' | 'fine' | 'custom' | 'none',\n pitchCustom: params.pitchCustom as number | undefined,\n length: params.length as number,\n head: params.head as 'hex' | 'chc' | 'none',\n nRad: params.nRad as number | undefined,\n })\n },\n brep: async (params: Record<string, unknown>) => {\n assertScrewParams(params)\n return screwBrep(params)\n },\n // 平台 op(D11):螺纹 loft 是 occt-only(threadFns.ts,D3)→ engines 声明。\n engines: ['occt'],\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } } as Provenance,\n})\n"]}
package/dist/api/sdf.d.ts CHANGED
@@ -26,7 +26,7 @@ export declare function assertSdfParams(params: Record<string, unknown>): void;
26
26
  * @example
27
27
  * const s = await cad.sdf({ code: 'return sphere(10) - sphere(5, [10,0,0])', box: [[-20,-20,-20],[30,20,20]], resolution: 1 })
28
28
  */
29
- export declare const sdf: ((params: Record<string, unknown>) => Promise<import("..").Shape>) & {
29
+ export declare const sdf: ((params: Record<string, unknown>) => Promise<import(".").Shape>) & {
30
30
  __faijs__dualOp?: import("../define-op.js").DualOpMeta;
31
31
  };
32
32
  //# sourceMappingURL=sdf.d.ts.map
@@ -0,0 +1,42 @@
1
+ /**
2
+ * stdlib sectionByPlane — 平面截面:solid 与无限平面的精确交线(手写中立 op,Phase 6.2)
3
+ *
4
+ * 中立 op:L1 `sectionByPlane(shape, point, normal)` 在 occt 与 brepkit 两侧均有
5
+ * 真实现 ⇒ 走 `getBrepApi()`(D12),不声明 engines。
6
+ *
7
+ * 产物形态(设计原则 5 + §2.4①):L1 返回交线句柄**数组**(occt 适配器把
8
+ * compound 逐条 downcast 成 edge/wire),数组过不了单产物边界 —— 收拢为
9
+ * **1D compound**(`makeCompound(edges)`)经 `fromBrepCurve` 登记为
10
+ * `kind:'curve'`(Phase 3 判别位;wire/edge 载荷为空,显示走 L1 `wireframe`)。
11
+ * 无交线(平面不与体相交)显式报错 —— 不返回假空产物(原则 9)。
12
+ */
13
+ import type { Shape } from '../mesh/types.js';
14
+ type Vec3 = [number, number, number];
15
+ /** `cad.sectionByPlane` 参数。 */
16
+ export interface SectionByPlaneParams {
17
+ /** 平面上一点(mm)。 */
18
+ point: Vec3;
19
+ /** 平面法向(不必单位化)。 */
20
+ normal: Vec3;
21
+ }
22
+ /**
23
+ * 求实体与无限平面的精确截面线(1D 曲线,可继续建模/导出 STEP)。
24
+ * @group 特征
25
+ * @inputs 1
26
+ * @async true
27
+ * @qual ok
28
+ * @name sectionByPlane
29
+ * @note 中立 op:L1 sectionByPlane 两引擎同实现。产物是 1D 曲线(kind:'curve',
30
+ * 全部交线收拢为一个 compound);平面不与体相交时显式报错。
31
+ * @returns Shape 1D 截面曲线。
32
+ * @param input - 目标实体。type:Shape required:true
33
+ * @param params.point - 平面上一点 [x,y,z](mm)。type:Vec3 required:true
34
+ * @param params.normal - 平面法向 [x,y,z]。type:Vec3 required:true
35
+ * @example
36
+ * const sec = await cad.sectionByPlane(part0, { point: [0,0,5], normal: [0,0,1] })
37
+ */
38
+ export declare const sectionByPlane: ((input: Shape, params: SectionByPlaneParams) => Promise<Shape>) & {
39
+ __faijs__dualOp?: import("../define-op.js").DualOpMeta;
40
+ };
41
+ export {};
42
+ //# sourceMappingURL=section-by-plane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-by-plane.d.ts","sourceRoot":"","sources":["../../src/api/section-by-plane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAQ1C,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAEpC,+BAA+B;AAC/B,MAAM,WAAW,oBAAoB;IACnC,iBAAiB;IACjB,KAAK,EAAE,IAAI,CAAA;IACX,mBAAmB;IACnB,MAAM,EAAE,IAAI,CAAA;CACb;AAwBD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,cAAc;;CAMzB,CAAA"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * stdlib sectionByPlane — 平面截面:solid 与无限平面的精确交线(手写中立 op,Phase 6.2)
3
+ *
4
+ * 中立 op:L1 `sectionByPlane(shape, point, normal)` 在 occt 与 brepkit 两侧均有
5
+ * 真实现 ⇒ 走 `getBrepApi()`(D12),不声明 engines。
6
+ *
7
+ * 产物形态(设计原则 5 + §2.4①):L1 返回交线句柄**数组**(occt 适配器把
8
+ * compound 逐条 downcast 成 edge/wire),数组过不了单产物边界 —— 收拢为
9
+ * **1D compound**(`makeCompound(edges)`)经 `fromBrepCurve` 登记为
10
+ * `kind:'curve'`(Phase 3 判别位;wire/edge 载荷为空,显示走 L1 `wireframe`)。
11
+ * 无交线(平面不与体相交)显式报错 —— 不返回假空产物(原则 9)。
12
+ */
13
+ import { solidToShape } from '../brep/brep-ops.js';
14
+ import { getBrepApi } from '../brep/handle-bridge.js';
15
+ import { brepOf, fromBrepCurve } from '../shape.js';
16
+ import { defineOp } from '../sdk.js';
17
+ /** 元组 → BrepVec3 对象(同 split-by-plane:L1 向量形参是 {x,y,z} 对象)。 */
18
+ function toVec3(v) {
19
+ if (!Array.isArray(v) || v.length !== 3 || v.some((n) => typeof n !== 'number' || !Number.isFinite(n))) {
20
+ throw new Error('E_SECTION_BY_PLANE_BAD_VEC: point/normal must be [x,y,z] finite numbers');
21
+ }
22
+ return { x: v[0], y: v[1], z: v[2] };
23
+ }
24
+ /** BREP 路径:L1 sectionByPlane → 交线收拢为 1D compound → fromBrepCurve 登记。 */
25
+ function sectionByPlaneBrep(input, params) {
26
+ const { point, normal } = params ?? {};
27
+ const kernel = getBrepApi();
28
+ const solid = brepOf(input);
29
+ if (!solid)
30
+ throw new Error('E_SECTION_BY_PLANE_NO_BREP: sectionByPlane input is not BREP');
31
+ const curves = kernel.sectionByPlane(solid, toVec3(point), toVec3(normal));
32
+ if (!curves || curves.length === 0) {
33
+ throw new Error('E_SECTION_BY_PLANE_NO_INTERSECTION: plane does not intersect the shape');
34
+ }
35
+ const compound = kernel.makeCompound(curves);
36
+ return fromBrepCurve(solidToShape(kernel, compound), { solid: compound });
37
+ }
38
+ /**
39
+ * 求实体与无限平面的精确截面线(1D 曲线,可继续建模/导出 STEP)。
40
+ * @group 特征
41
+ * @inputs 1
42
+ * @async true
43
+ * @qual ok
44
+ * @name sectionByPlane
45
+ * @note 中立 op:L1 sectionByPlane 两引擎同实现。产物是 1D 曲线(kind:'curve',
46
+ * 全部交线收拢为一个 compound);平面不与体相交时显式报错。
47
+ * @returns Shape 1D 截面曲线。
48
+ * @param input - 目标实体。type:Shape required:true
49
+ * @param params.point - 平面上一点 [x,y,z](mm)。type:Vec3 required:true
50
+ * @param params.normal - 平面法向 [x,y,z]。type:Vec3 required:true
51
+ * @example
52
+ * const sec = await cad.sectionByPlane(part0, { point: [0,0,5], normal: [0,0,1] })
53
+ */
54
+ export const sectionByPlane = defineOp({
55
+ capabilities: ['directEdit'],
56
+ brep(input, params) {
57
+ return sectionByPlaneBrep(input, params);
58
+ },
59
+ naming: { kind: 'unmodeled', reason: '1D section curves have no face role vocabulary' },
60
+ });
61
+ //# sourceMappingURL=section-by-plane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-by-plane.js","sourceRoot":"","sources":["../../src/api/section-by-plane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAajC,8DAA8D;AAC9D,SAAS,MAAM,CAAC,CAAO;IACrB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACvG,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA;IAC5F,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACtC,CAAC;AAED,wEAAwE;AACxE,SAAS,kBAAkB,CAAC,KAAY,EAAE,MAA4B;IACpE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,IAAK,EAA2B,CAAA;IAChE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAA2B,CAAA;IACrD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IAC3F,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1E,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAA;IAC3F,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IAC5C,OAAO,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;AAC3E,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;IACrC,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,IAAI,CAAC,KAAY,EAAE,MAA4B;QAC7C,OAAO,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC1C,CAAC;IACD,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,gDAAgD,EAAgB;CACtG,CAAC,CAAA","sourcesContent":["/**\n * stdlib sectionByPlane — 平面截面:solid 与无限平面的精确交线(手写中立 op,Phase 6.2)\n *\n * 中立 op:L1 `sectionByPlane(shape, point, normal)` 在 occt 与 brepkit 两侧均有\n * 真实现 ⇒ 走 `getBrepApi()`(D12),不声明 engines。\n *\n * 产物形态(设计原则 5 + §2.4①):L1 返回交线句柄**数组**(occt 适配器把\n * compound 逐条 downcast 成 edge/wire),数组过不了单产物边界 —— 收拢为\n * **1D compound**(`makeCompound(edges)`)经 `fromBrepCurve` 登记为\n * `kind:'curve'`(Phase 3 判别位;wire/edge 载荷为空,显示走 L1 `wireframe`)。\n * 无交线(平面不与体相交)显式报错 —— 不返回假空产物(原则 9)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport type { BrepHandle, BrepVec3 } from '../brep/engine/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { brepOf, fromBrepCurve } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\n\ntype Vec3 = [number, number, number]\n\n/** `cad.sectionByPlane` 参数。 */\nexport interface SectionByPlaneParams {\n /** 平面上一点(mm)。 */\n point: Vec3\n /** 平面法向(不必单位化)。 */\n normal: Vec3\n}\n\n/** 元组 → BrepVec3 对象(同 split-by-plane:L1 向量形参是 {x,y,z} 对象)。 */\nfunction toVec3(v: Vec3): BrepVec3 {\n if (!Array.isArray(v) || v.length !== 3 || v.some((n) => typeof n !== 'number' || !Number.isFinite(n))) {\n throw new Error('E_SECTION_BY_PLANE_BAD_VEC: point/normal must be [x,y,z] finite numbers')\n }\n return { x: v[0], y: v[1], z: v[2] }\n}\n\n/** BREP 路径:L1 sectionByPlane → 交线收拢为 1D compound → fromBrepCurve 登记。 */\nfunction sectionByPlaneBrep(input: Shape, params: SectionByPlaneParams): Shape {\n const { point, normal } = params ?? ({} as SectionByPlaneParams)\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('E_SECTION_BY_PLANE_NO_BREP: sectionByPlane input is not BREP')\n const curves = kernel.sectionByPlane(solid, toVec3(point), toVec3(normal))\n if (!curves || curves.length === 0) {\n throw new Error('E_SECTION_BY_PLANE_NO_INTERSECTION: plane does not intersect the shape')\n }\n const compound = kernel.makeCompound(curves)\n return fromBrepCurve(solidToShape(kernel, compound), { solid: compound })\n}\n\n/**\n * 求实体与无限平面的精确截面线(1D 曲线,可继续建模/导出 STEP)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name sectionByPlane\n * @note 中立 op:L1 sectionByPlane 两引擎同实现。产物是 1D 曲线(kind:'curve',\n * 全部交线收拢为一个 compound);平面不与体相交时显式报错。\n * @returns Shape 1D 截面曲线。\n * @param input - 目标实体。type:Shape required:true\n * @param params.point - 平面上一点 [x,y,z](mm)。type:Vec3 required:true\n * @param params.normal - 平面法向 [x,y,z]。type:Vec3 required:true\n * @example\n * const sec = await cad.sectionByPlane(part0, { point: [0,0,5], normal: [0,0,1] })\n */\nexport const sectionByPlane = defineOp({\n capabilities: ['directEdit'],\n brep(input: Shape, params: SectionByPlaneParams) {\n return sectionByPlaneBrep(input, params)\n },\n naming: { kind: 'unmodeled', reason: '1D section curves have no face role vocabulary' } as Provenance,\n})\n"]}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * stdlib shell — 抽壳:按面移除生成等厚薄壁(手写中立 op,Phase 5)
3
+ *
4
+ * 中立 op:L1 `shell(solid, facesToRemove, thickness, tolerance)` 在 occt 与
5
+ * brepkit 两侧均有真实现(engine-method-map 实测 `dialect`)⇒ 走 `getBrepApi()`
6
+ * (D12),不声明 engines(中立 op:实现只经 L1 契约面)。相对现状是
7
+ * 能力升级——vendored 版是 occt 平台 op(arg-spec `engines:['occt']`,skip)。
8
+ *
9
+ * 选面口径(设计原则 4):`openFaces: FaceTopoRef[]`(`cad.faceRef` 产物),
10
+ * 与 `fillet` 的 `EdgeTopoRef[]` / `extrude` 的 `upTo` 同族;不复刻 vendored 的
11
+ * `Face[]` 句柄入参。解析在 op 内一处完成(`buildEdgeResolutionContext` 现场枚举
12
+ * + `resolveTopoRef`)。
13
+ */
14
+ import type { Shape } from '../mesh/types.js';
15
+ import type { FaceTopoRef } from '../topology/naming/index.js';
16
+ /** `cad.shell` 参数。 */
17
+ export interface ShellParams {
18
+ /** 抽壳时移除的面(FaceTopoRef[],`cad.faceRef` 产物;空数组 = 全封闭薄壁)。 */
19
+ openFaces: FaceTopoRef[];
20
+ /** 壁厚(mm,>0,向内偏置)。 */
21
+ thickness: number;
22
+ /** 容差(mm,可选;默认走内核约定值)。 */
23
+ tolerance?: number;
24
+ }
25
+ /**
26
+ * 抽壳:移除指定面并把余下面偏置成等厚薄壁。
27
+ * @group 特征
28
+ * @inputs 1
29
+ * @async true
30
+ * @qual ok
31
+ * @name shell
32
+ * @note 中立 op:L1 shell 两引擎同实现。`openFaces` 为空数组时生成全封闭薄壁。
33
+ * 仅 BREP 可用:mesh 输入执行前报错(backend-dispatch 静态判定)。
34
+ * @returns Shape 抽壳后的薄壁体。
35
+ * @param input - 目标几何。type:Shape required:true
36
+ * @param params.openFaces - 要移除的面(FaceTopoRef[],cad.faceRef 产物)。type:FaceTopoRef[] required:true
37
+ * @param params.thickness - 壁厚(mm,>0)。type:number required:true
38
+ * @param params.tolerance - 容差(mm)。type:number required:false
39
+ * @example
40
+ * const sh = await cad.shell(part0, { openFaces: [cad.faceRef(part0, 1)], thickness: 2 })
41
+ */
42
+ export declare const shell: ((input: Shape, params: ShellParams) => Promise<Shape>) & {
43
+ __faijs__dualOp?: import("../define-op.js").DualOpMeta;
44
+ };
45
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/api/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAKrD,sBAAsB;AACtB,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,SAAS,EAAE,WAAW,EAAE,CAAA;IACxB,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAgCD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,KAAK;;CAMhB,CAAA"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * stdlib shell — 抽壳:按面移除生成等厚薄壁(手写中立 op,Phase 5)
3
+ *
4
+ * 中立 op:L1 `shell(solid, facesToRemove, thickness, tolerance)` 在 occt 与
5
+ * brepkit 两侧均有真实现(engine-method-map 实测 `dialect`)⇒ 走 `getBrepApi()`
6
+ * (D12),不声明 engines(中立 op:实现只经 L1 契约面)。相对现状是
7
+ * 能力升级——vendored 版是 occt 平台 op(arg-spec `engines:['occt']`,skip)。
8
+ *
9
+ * 选面口径(设计原则 4):`openFaces: FaceTopoRef[]`(`cad.faceRef` 产物),
10
+ * 与 `fillet` 的 `EdgeTopoRef[]` / `extrude` 的 `upTo` 同族;不复刻 vendored 的
11
+ * `Face[]` 句柄入参。解析在 op 内一处完成(`buildEdgeResolutionContext` 现场枚举
12
+ * + `resolveTopoRef`)。
13
+ */
14
+ import { solidToShape } from '../brep/brep-ops.js';
15
+ import { getBrepApi } from '../brep/handle-bridge.js';
16
+ import { brepOf, fromBrep } from '../shape.js';
17
+ import { defineOp } from '../sdk.js';
18
+ import { resolveTopoRef, TopoRefError } from '../topology/naming/index.js';
19
+ import { buildEdgeResolutionContext } from './topo-resolve.js';
20
+ /** BREP 路径:解析面引用 → L1 shell → 收养。 */
21
+ function shellBrep(input, params) {
22
+ const { openFaces, thickness, tolerance } = params ?? {};
23
+ if (!Array.isArray(openFaces)) {
24
+ throw new Error('E_SHELL_BAD_OPEN_FACES: shell.openFaces must be an array of FaceTopoRef');
25
+ }
26
+ if (typeof thickness !== 'number' || !Number.isFinite(thickness) || thickness <= 0) {
27
+ throw new Error('E_SHELL_BAD_THICKNESS: shell.thickness must be a positive number');
28
+ }
29
+ const kernel = getBrepApi();
30
+ const solid = brepOf(input);
31
+ if (!solid)
32
+ throw new Error('E_SHELL_NO_BREP: shell input is not BREP');
33
+ const ctx = buildEdgeResolutionContext(kernel, input);
34
+ if (!ctx)
35
+ throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', 'shell: input has no BREP naming context');
36
+ const faceHandles = openFaces.map((ref) => {
37
+ if (!ref || ref.kind !== 'face') {
38
+ throw new Error('E_SHELL_BAD_OPEN_FACES: every openFaces entry must be a FaceTopoRef (cad.faceRef)');
39
+ }
40
+ const r = resolveTopoRef(ref, ctx);
41
+ if (r.handle === undefined) {
42
+ throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `shell: face resolved without handle (${ref.origin}/${ref.role})`);
43
+ }
44
+ return r.handle;
45
+ });
46
+ const result = kernel.shell(solid, faceHandles, thickness, tolerance ?? 1e-6);
47
+ return fromBrep(solidToShape(kernel, result), { solid: result });
48
+ }
49
+ /**
50
+ * 抽壳:移除指定面并把余下面偏置成等厚薄壁。
51
+ * @group 特征
52
+ * @inputs 1
53
+ * @async true
54
+ * @qual ok
55
+ * @name shell
56
+ * @note 中立 op:L1 shell 两引擎同实现。`openFaces` 为空数组时生成全封闭薄壁。
57
+ * 仅 BREP 可用:mesh 输入执行前报错(backend-dispatch 静态判定)。
58
+ * @returns Shape 抽壳后的薄壁体。
59
+ * @param input - 目标几何。type:Shape required:true
60
+ * @param params.openFaces - 要移除的面(FaceTopoRef[],cad.faceRef 产物)。type:FaceTopoRef[] required:true
61
+ * @param params.thickness - 壁厚(mm,>0)。type:number required:true
62
+ * @param params.tolerance - 容差(mm)。type:number required:false
63
+ * @example
64
+ * const sh = await cad.shell(part0, { openFaces: [cad.faceRef(part0, 1)], thickness: 2 })
65
+ */
66
+ export const shell = defineOp({
67
+ capabilities: ['directEdit'],
68
+ brep(input, params) {
69
+ return shellBrep(input, params);
70
+ },
71
+ naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
72
+ });
73
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/api/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAY3D,qCAAqC;AACrC,SAAS,SAAS,CAAC,KAAY,EAAE,MAAmB;IAClD,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,IAAK,EAAkB,CAAA;IACzE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA;IAC5F,CAAC;IACD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;IACrF,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAA2B,CAAA;IACrD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAEvE,MAAM,GAAG,GAAG,0BAA0B,CAAC,MAAM,EAAE,KAAe,CAAC,CAAA;IAC/D,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,yCAAyC,CAAC,CAAA;IACvG,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACxC,IAAI,CAAC,GAAG,IAAK,GAA0B,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAA;QACtG,CAAC;QACD,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAClC,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,wCAAwC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAA;QACvH,CAAC;QACD,OAAO,CAAC,CAAC,MAAoB,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC,CAAA;IAC7E,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAClE,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC5B,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,IAAI,CAAC,KAAY,EAAE,MAAmB;QACpC,OAAO,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACjC,CAAC;IACD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,EAAgB;CAC3E,CAAC,CAAA","sourcesContent":["/**\n * stdlib shell — 抽壳:按面移除生成等厚薄壁(手写中立 op,Phase 5)\n *\n * 中立 op:L1 `shell(solid, facesToRemove, thickness, tolerance)` 在 occt 与\n * brepkit 两侧均有真实现(engine-method-map 实测 `dialect`)⇒ 走 `getBrepApi()`\n * (D12),不声明 engines(中立 op:实现只经 L1 契约面)。相对现状是\n * 能力升级——vendored 版是 occt 平台 op(arg-spec `engines:['occt']`,skip)。\n *\n * 选面口径(设计原则 4):`openFaces: FaceTopoRef[]`(`cad.faceRef` 产物),\n * 与 `fillet` 的 `EdgeTopoRef[]` / `extrude` 的 `upTo` 同族;不复刻 vendored 的\n * `Face[]` 句柄入参。解析在 op 内一处完成(`buildEdgeResolutionContext` 现场枚举\n * + `resolveTopoRef`)。\n */\n\nimport type { Shape } from '../mesh/types'\nimport type { BrepHandle } from '../brep/engine/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { brepOf, fromBrep } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { FaceTopoRef } from '../topology/naming'\nimport { resolveTopoRef, TopoRefError } from '../topology/naming'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { buildEdgeResolutionContext } from './topo-resolve'\n\n/** `cad.shell` 参数。 */\nexport interface ShellParams {\n /** 抽壳时移除的面(FaceTopoRef[],`cad.faceRef` 产物;空数组 = 全封闭薄壁)。 */\n openFaces: FaceTopoRef[]\n /** 壁厚(mm,>0,向内偏置)。 */\n thickness: number\n /** 容差(mm,可选;默认走内核约定值)。 */\n tolerance?: number\n}\n\n/** BREP 路径:解析面引用 → L1 shell → 收养。 */\nfunction shellBrep(input: Shape, params: ShellParams): Shape {\n const { openFaces, thickness, tolerance } = params ?? ({} as ShellParams)\n if (!Array.isArray(openFaces)) {\n throw new Error('E_SHELL_BAD_OPEN_FACES: shell.openFaces must be an array of FaceTopoRef')\n }\n if (typeof thickness !== 'number' || !Number.isFinite(thickness) || thickness <= 0) {\n throw new Error('E_SHELL_BAD_THICKNESS: shell.thickness must be a positive number')\n }\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('E_SHELL_NO_BREP: shell input is not BREP')\n\n const ctx = buildEdgeResolutionContext(kernel, input as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', 'shell: input has no BREP naming context')\n const faceHandles = openFaces.map((ref) => {\n if (!ref || (ref as { kind?: unknown }).kind !== 'face') {\n throw new Error('E_SHELL_BAD_OPEN_FACES: every openFaces entry must be a FaceTopoRef (cad.faceRef)')\n }\n const r = resolveTopoRef(ref, ctx)\n if (r.handle === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `shell: face resolved without handle (${ref.origin}/${ref.role})`)\n }\n return r.handle as BrepHandle\n })\n\n const result = kernel.shell(solid, faceHandles, thickness, tolerance ?? 1e-6)\n return fromBrep(solidToShape(kernel, result), { solid: result })\n}\n\n/**\n * 抽壳:移除指定面并把余下面偏置成等厚薄壁。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name shell\n * @note 中立 op:L1 shell 两引擎同实现。`openFaces` 为空数组时生成全封闭薄壁。\n * 仅 BREP 可用:mesh 输入执行前报错(backend-dispatch 静态判定)。\n * @returns Shape 抽壳后的薄壁体。\n * @param input - 目标几何。type:Shape required:true\n * @param params.openFaces - 要移除的面(FaceTopoRef[],cad.faceRef 产物)。type:FaceTopoRef[] required:true\n * @param params.thickness - 壁厚(mm,>0)。type:number required:true\n * @param params.tolerance - 容差(mm)。type:number required:false\n * @example\n * const sh = await cad.shell(part0, { openFaces: [cad.faceRef(part0, 1)], thickness: 2 })\n */\nexport const shell = defineOp({\n capabilities: ['directEdit'],\n brep(input: Shape, params: ShellParams) {\n return shellBrep(input, params)\n },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
@@ -48,6 +48,11 @@ export interface SketchLoop {
48
48
  /** `cad.sketch` 参数:轮廓环集合(第一个为外环,其余为孔)。 */
49
49
  export interface SketchContoursParams {
50
50
  contours: SketchLoop[];
51
+ /**
52
+ * 产物形态:'face'(默认)构面;'wire' 只交出不带面的外环 wire(1D 曲线),
53
+ * 供扫掠族(sweep/loft/…)直接作 spine。'wire' 形态丢弃孔环(扫掠脊柱为单闭合轮廓)。
54
+ */
55
+ as?: 'face' | 'wire';
51
56
  }
52
57
  /**
53
58
  * Validate sketch parameters: `contours` must be a non-empty array of loops,
@@ -62,10 +67,12 @@ export declare function assertSketchParams(params: Record<string, unknown>): voi
62
67
  * @async false
63
68
  * @qual ok
64
69
  * @name sketch
65
- * @returns Shape 平面几何(mesh 三角化 + BREP 句柄)。
70
+ * @returns Shape 平面几何(mesh 三角化 + BREP 句柄);`as:'wire'` 时返回 1D 曲线(kind:'curve')。
66
71
  * @param params.contours - 有序 2D 轮廓(线段/圆弧;外环 + 孔)。type:SketchLoop[] required:true
72
+ * @param params.as - 产物形态:'face'(默认)构面;'wire' 只交外环 wire(1D 曲线)。type:'face'|'wire' required:false
67
73
  * @example
68
74
  * const f = cad.sketch({ contours: [{ segments: [{ kind:'line', x1:0,y1:0,x2:10,y2:0 }, ...] }] })
75
+ * const w = cad.sketch({ contours: [{ segments: [{ kind:'line', x1:0,y1:0,x2:10,y2:0 }, ...] }], as: 'wire' })
69
76
  */
70
77
  export declare const sketch: ((params: Record<string, unknown>) => Promise<Shape>) & {
71
78
  __faijs__dualOp?: import("../define-op.js").DualOpMeta;
@@ -1 +1 @@
1
- {"version":3,"file":"sketch.d.ts","sourceRoot":"","sources":["../../src/api/sketch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAU1C,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,iCAAiC;AACjC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,cAAc;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,OAAO,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,0BAA0B;AAC1B,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,YAAY,CAAA;AAEpD,yBAAyB;AACzB,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,SAAS,EAAE,CAAA;CACtB;AAED,0CAA0C;AAC1C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,UAAU,EAAE,CAAA;CACvB;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAaxE;AA+FD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM;;CAOjB,CAAA"}
1
+ {"version":3,"file":"sketch.d.ts","sourceRoot":"","sources":["../../src/api/sketch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAU1C,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,iCAAiC;AACjC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,KAAK,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,cAAc;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,OAAO,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,0BAA0B;AAC1B,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,YAAY,CAAA;AAEpD,yBAAyB;AACzB,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,SAAS,EAAE,CAAA;CACtB;AAED,0CAA0C;AAC1C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,UAAU,EAAE,CAAA;IACtB;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACrB;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAaxE;AAqGD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM;;CAOjB,CAAA"}