@faicad/faijs 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/LICENSE +4 -5
  2. package/NOTICE +5 -6
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +19 -1
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/assembly/entities.d.ts +1 -1
  7. package/dist/api/assembly/entities.d.ts.map +1 -1
  8. package/dist/api/assembly/entities.js.map +1 -1
  9. package/dist/api/assembly/joints.d.ts +2 -2
  10. package/dist/api/assembly/joints.d.ts.map +1 -1
  11. package/dist/api/assembly/joints.js +2 -2
  12. package/dist/api/assembly/joints.js.map +1 -1
  13. package/dist/api/assembly/lower.d.ts +1 -1
  14. package/dist/api/assembly/lower.d.ts.map +1 -1
  15. package/dist/api/assembly/lower.js.map +1 -1
  16. package/dist/api/assembly/pose.d.ts +3 -3
  17. package/dist/api/assembly/pose.d.ts.map +1 -1
  18. package/dist/api/assembly/pose.js +1 -1
  19. package/dist/api/assembly/pose.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.d.ts.map +1 -1
  22. package/dist/api/assembly/preview.js +1 -1
  23. package/dist/api/assembly/preview.js.map +1 -1
  24. package/dist/api/assembly/solve.d.ts.map +1 -1
  25. package/dist/api/assembly/solve.js +3 -3
  26. package/dist/api/assembly/solve.js.map +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.d.ts +98 -0
  28. package/dist/api/assembly/solvers/assembly-tree.d.ts.map +1 -0
  29. package/dist/api/assembly/solvers/assembly-tree.js +130 -0
  30. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -0
  31. package/dist/api/assembly/solvers/chain-solver.d.ts +27 -0
  32. package/dist/api/assembly/solvers/chain-solver.d.ts.map +1 -0
  33. package/dist/api/assembly/solvers/chain-solver.js +330 -0
  34. package/dist/api/assembly/solvers/chain-solver.js.map +1 -0
  35. package/dist/api/assembly/solvers/global-solver.js +2 -2
  36. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  37. package/dist/api/assembly/solvers/joints-kinematics.d.ts +308 -0
  38. package/dist/api/assembly/solvers/joints-kinematics.d.ts.map +1 -0
  39. package/dist/api/assembly/solvers/joints-kinematics.js +643 -0
  40. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -0
  41. package/dist/api/assembly/solvers/quat.d.ts +35 -0
  42. package/dist/api/assembly/solvers/quat.d.ts.map +1 -0
  43. package/dist/api/assembly/solvers/quat.js +84 -0
  44. package/dist/api/assembly/solvers/quat.js.map +1 -0
  45. package/dist/api/assembly/solvers/types.d.ts +33 -0
  46. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  47. package/dist/api/assembly/solvers/types.js.map +1 -1
  48. package/dist/api/boolean.d.ts.map +1 -1
  49. package/dist/api/boolean.js +3 -4
  50. package/dist/api/boolean.js.map +1 -1
  51. package/dist/api/brep-mirror/booleanFns.d.ts +40 -0
  52. package/dist/api/brep-mirror/booleanFns.d.ts.map +1 -0
  53. package/dist/api/brep-mirror/booleanFns.js +99 -0
  54. package/dist/api/brep-mirror/booleanFns.js.map +1 -0
  55. package/dist/api/brep-mirror/brepHelpers.d.ts +55 -0
  56. package/dist/api/brep-mirror/brepHelpers.d.ts.map +1 -0
  57. package/dist/api/brep-mirror/brepHelpers.js +131 -0
  58. package/dist/api/brep-mirror/brepHelpers.js.map +1 -0
  59. package/dist/api/brep-mirror/compoundFns.d.ts +47 -0
  60. package/dist/api/brep-mirror/compoundFns.d.ts.map +1 -0
  61. package/dist/api/brep-mirror/compoundFns.js +300 -0
  62. package/dist/api/brep-mirror/compoundFns.js.map +1 -0
  63. package/dist/api/brep-mirror/healingFns.d.ts +78 -0
  64. package/dist/api/brep-mirror/healingFns.d.ts.map +1 -0
  65. package/dist/api/brep-mirror/healingFns.js +294 -0
  66. package/dist/api/brep-mirror/healingFns.js.map +1 -0
  67. package/dist/api/brep-mirror/hullFns.d.ts +20 -0
  68. package/dist/api/brep-mirror/hullFns.d.ts.map +1 -0
  69. package/dist/api/brep-mirror/hullFns.js +46 -0
  70. package/dist/api/brep-mirror/hullFns.js.map +1 -0
  71. package/dist/api/brep-mirror/patternFns.d.ts +43 -0
  72. package/dist/api/brep-mirror/patternFns.d.ts.map +1 -0
  73. package/dist/api/brep-mirror/patternFns.js +178 -0
  74. package/dist/api/brep-mirror/patternFns.js.map +1 -0
  75. package/dist/api/brep-mirror/primitiveFns.d.ts +42 -0
  76. package/dist/api/brep-mirror/primitiveFns.d.ts.map +1 -0
  77. package/dist/api/brep-mirror/primitiveFns.js +104 -0
  78. package/dist/api/brep-mirror/primitiveFns.js.map +1 -0
  79. package/dist/api/brep-mirror/roofFns.d.ts +24 -0
  80. package/dist/api/brep-mirror/roofFns.d.ts.map +1 -0
  81. package/dist/api/brep-mirror/roofFns.js +229 -0
  82. package/dist/api/brep-mirror/roofFns.js.map +1 -0
  83. package/dist/api/brep-mirror/straightSkeleton.d.ts +36 -0
  84. package/dist/api/brep-mirror/straightSkeleton.d.ts.map +1 -0
  85. package/dist/api/brep-mirror/straightSkeleton.js +443 -0
  86. package/dist/api/brep-mirror/straightSkeleton.js.map +1 -0
  87. package/dist/api/brep-mirror/sweepFns.d.ts +55 -0
  88. package/dist/api/brep-mirror/sweepFns.d.ts.map +1 -0
  89. package/dist/api/brep-mirror/sweepFns.js +200 -0
  90. package/dist/api/brep-mirror/sweepFns.js.map +1 -0
  91. package/dist/api/brep-mirror/threadFns.d.ts +15 -0
  92. package/dist/api/brep-mirror/threadFns.d.ts.map +1 -1
  93. package/dist/api/brep-mirror/threadFns.js +37 -2
  94. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  95. package/dist/api/brep-mirror/topologyFns.d.ts +74 -0
  96. package/dist/api/brep-mirror/topologyFns.d.ts.map +1 -0
  97. package/dist/api/brep-mirror/topologyFns.js +273 -0
  98. package/dist/api/brep-mirror/topologyFns.js.map +1 -0
  99. package/dist/api/brep-topology.d.ts +190 -0
  100. package/dist/api/brep-topology.d.ts.map +1 -0
  101. package/dist/api/brep-topology.js +337 -0
  102. package/dist/api/brep-topology.js.map +1 -0
  103. package/dist/api/brepjs-compat/constants.d.ts +11 -0
  104. package/dist/api/brepjs-compat/constants.d.ts.map +1 -0
  105. package/dist/api/brepjs-compat/constants.js +11 -0
  106. package/dist/api/brepjs-compat/constants.js.map +1 -0
  107. package/dist/api/brepjs-compat/index.d.ts +19 -232
  108. package/dist/api/brepjs-compat/index.d.ts.map +1 -1
  109. package/dist/api/brepjs-compat/index.js +19 -286
  110. package/dist/api/brepjs-compat/index.js.map +1 -1
  111. package/dist/api/brepjs-compat/planeOps.d.ts +98 -0
  112. package/dist/api/brepjs-compat/planeOps.d.ts.map +1 -0
  113. package/dist/api/brepjs-compat/planeOps.js +170 -0
  114. package/dist/api/brepjs-compat/planeOps.js.map +1 -0
  115. package/dist/api/brepjs-compat/planeTypes.d.ts +24 -0
  116. package/dist/api/brepjs-compat/planeTypes.d.ts.map +1 -0
  117. package/dist/api/brepjs-compat/planeTypes.js +8 -0
  118. package/dist/api/brepjs-compat/planeTypes.js.map +1 -0
  119. package/dist/api/brepjs-compat/types.d.ts +64 -0
  120. package/dist/api/brepjs-compat/types.d.ts.map +1 -0
  121. package/dist/api/brepjs-compat/types.js +48 -0
  122. package/dist/api/brepjs-compat/types.js.map +1 -0
  123. package/dist/api/brepjs-compat/vecOps.d.ts +124 -0
  124. package/dist/api/brepjs-compat/vecOps.d.ts.map +1 -0
  125. package/dist/api/brepjs-compat/vecOps.js +202 -0
  126. package/dist/api/brepjs-compat/vecOps.js.map +1 -0
  127. package/dist/api/chamfer.d.ts +5 -0
  128. package/dist/api/chamfer.d.ts.map +1 -1
  129. package/dist/api/chamfer.js +13 -8
  130. package/dist/api/chamfer.js.map +1 -1
  131. package/dist/api/compound-geom.d.ts.map +1 -1
  132. package/dist/api/compound-geom.js +8 -2
  133. package/dist/api/compound-geom.js.map +1 -1
  134. package/dist/api/draft.d.ts +69 -0
  135. package/dist/api/draft.d.ts.map +1 -0
  136. package/dist/api/draft.js +109 -0
  137. package/dist/api/draft.js.map +1 -0
  138. package/dist/api/edge-ref.d.ts.map +1 -1
  139. package/dist/api/edge-ref.js +2 -2
  140. package/dist/api/edge-ref.js.map +1 -1
  141. package/dist/api/engrave.d.ts.map +1 -1
  142. package/dist/api/engrave.js +2 -3
  143. package/dist/api/engrave.js.map +1 -1
  144. package/dist/api/extrude.d.ts.map +1 -1
  145. package/dist/api/extrude.js +28 -13
  146. package/dist/api/extrude.js.map +1 -1
  147. package/dist/api/face-ref.d.ts.map +1 -1
  148. package/dist/api/face-ref.js +2 -2
  149. package/dist/api/face-ref.js.map +1 -1
  150. package/dist/api/feature-repair.d.ts +137 -0
  151. package/dist/api/feature-repair.d.ts.map +1 -0
  152. package/dist/api/feature-repair.js +221 -0
  153. package/dist/api/feature-repair.js.map +1 -0
  154. package/dist/api/fillet-variable.d.ts +35 -0
  155. package/dist/api/fillet-variable.d.ts.map +1 -0
  156. package/dist/api/fillet-variable.js +71 -0
  157. package/dist/api/fillet-variable.js.map +1 -0
  158. package/dist/api/fillet.d.ts +3 -0
  159. package/dist/api/fillet.d.ts.map +1 -1
  160. package/dist/api/fillet.js +7 -4
  161. package/dist/api/fillet.js.map +1 -1
  162. package/dist/api/generated/2d.d.ts +1 -13
  163. package/dist/api/generated/2d.d.ts.map +1 -1
  164. package/dist/api/generated/2d.js +6 -1
  165. package/dist/api/generated/2d.js.map +1 -1
  166. package/dist/api/generated/brepjs/index.d.ts +298 -298
  167. package/dist/api/generated/brepjs/index.d.ts.map +1 -1
  168. package/dist/api/generated/brepjs/index.js +183 -183
  169. package/dist/api/generated/brepjs/index.js.map +1 -1
  170. package/dist/api/generated/core.d.ts +3 -123
  171. package/dist/api/generated/core.d.ts.map +1 -1
  172. package/dist/api/generated/core.js +2 -81
  173. package/dist/api/generated/core.js.map +1 -1
  174. package/dist/api/generated/gear.d.ts +1 -15
  175. package/dist/api/generated/gear.d.ts.map +1 -1
  176. package/dist/api/generated/gear.js +6 -3
  177. package/dist/api/generated/gear.js.map +1 -1
  178. package/dist/api/generated/io.d.ts +1 -13
  179. package/dist/api/generated/io.d.ts.map +1 -1
  180. package/dist/api/generated/io.js +6 -1
  181. package/dist/api/generated/io.js.map +1 -1
  182. package/dist/api/generated/kernel.d.ts +1 -39
  183. package/dist/api/generated/kernel.d.ts.map +1 -1
  184. package/dist/api/generated/kernel.js +6 -4
  185. package/dist/api/generated/kernel.js.map +1 -1
  186. package/dist/api/generated/measurement.d.ts +53 -97
  187. package/dist/api/generated/measurement.d.ts.map +1 -1
  188. package/dist/api/generated/measurement.js +48 -143
  189. package/dist/api/generated/measurement.js.map +1 -1
  190. package/dist/api/generated/ns.d.ts +1 -10
  191. package/dist/api/generated/ns.d.ts.map +1 -1
  192. package/dist/api/generated/ns.js +2 -10
  193. package/dist/api/generated/ns.js.map +1 -1
  194. package/dist/api/generated/operations.d.ts +65 -110
  195. package/dist/api/generated/operations.d.ts.map +1 -1
  196. package/dist/api/generated/operations.js +132 -80
  197. package/dist/api/generated/operations.js.map +1 -1
  198. package/dist/api/generated/projection.d.ts +1 -8
  199. package/dist/api/generated/projection.d.ts.map +1 -1
  200. package/dist/api/generated/projection.js +6 -4
  201. package/dist/api/generated/projection.js.map +1 -1
  202. package/dist/api/generated/query.d.ts +1 -9
  203. package/dist/api/generated/query.d.ts.map +1 -1
  204. package/dist/api/generated/query.js +6 -1
  205. package/dist/api/generated/query.js.map +1 -1
  206. package/dist/api/generated/script-face-manifest.d.ts +2 -0
  207. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  208. package/dist/api/generated/script-face-manifest.js +34 -22
  209. package/dist/api/generated/script-face-manifest.js.map +1 -1
  210. package/dist/api/generated/script-face.d.ts +52 -27
  211. package/dist/api/generated/script-face.d.ts.map +1 -1
  212. package/dist/api/generated/script-face.js +18 -4
  213. package/dist/api/generated/script-face.js.map +1 -1
  214. package/dist/api/generated/sketching.d.ts +4 -7
  215. package/dist/api/generated/sketching.d.ts.map +1 -1
  216. package/dist/api/generated/sketching.js +10 -8
  217. package/dist/api/generated/sketching.js.map +1 -1
  218. package/dist/api/generated/text.d.ts +1 -6
  219. package/dist/api/generated/text.d.ts.map +1 -1
  220. package/dist/api/generated/text.js +6 -3
  221. package/dist/api/generated/text.js.map +1 -1
  222. package/dist/api/generated/topology.d.ts +77 -175
  223. package/dist/api/generated/topology.d.ts.map +1 -1
  224. package/dist/api/generated/topology.js +172 -131
  225. package/dist/api/generated/topology.js.map +1 -1
  226. package/dist/api/geom.d.ts.map +1 -1
  227. package/dist/api/geom.js +2 -2
  228. package/dist/api/geom.js.map +1 -1
  229. package/dist/api/helix.d.ts +51 -0
  230. package/dist/api/helix.d.ts.map +1 -0
  231. package/dist/api/helix.js +63 -0
  232. package/dist/api/helix.js.map +1 -0
  233. package/dist/api/import-step.d.ts.map +1 -1
  234. package/dist/api/import-step.js +6 -2
  235. package/dist/api/import-step.js.map +1 -1
  236. package/dist/api/index.d.ts +18 -5
  237. package/dist/api/index.d.ts.map +1 -1
  238. package/dist/api/index.js +29 -12
  239. package/dist/api/index.js.map +1 -1
  240. package/dist/api/internal/compat-op.d.ts +10 -0
  241. package/dist/api/internal/compat-op.d.ts.map +1 -1
  242. package/dist/api/internal/compat-op.js +9 -3
  243. package/dist/api/internal/compat-op.js.map +1 -1
  244. package/dist/api/internal/compat-projection.d.ts +4 -4
  245. package/dist/api/internal/compat-projection.js +7 -7
  246. package/dist/api/internal/compat-projection.js.map +1 -1
  247. package/dist/api/internal/l3-bridge.d.ts +75 -42
  248. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  249. package/dist/api/internal/l3-bridge.js +105 -50
  250. package/dist/api/internal/l3-bridge.js.map +1 -1
  251. package/dist/api/internal/profile-wire.d.ts +31 -0
  252. package/dist/api/internal/profile-wire.d.ts.map +1 -0
  253. package/dist/api/internal/profile-wire.js +37 -0
  254. package/dist/api/internal/profile-wire.js.map +1 -0
  255. package/dist/api/internal/replica-role-table.js +2 -2
  256. package/dist/api/internal/replica-role-table.js.map +1 -1
  257. package/dist/api/loft.d.ts +66 -0
  258. package/dist/api/loft.d.ts.map +1 -0
  259. package/dist/api/loft.js +111 -0
  260. package/dist/api/loft.js.map +1 -0
  261. package/dist/api/measurement/index.d.ts +51 -0
  262. package/dist/api/measurement/index.d.ts.map +1 -0
  263. package/dist/api/measurement/index.js +71 -0
  264. package/dist/api/measurement/index.js.map +1 -0
  265. package/dist/api/occt-kernel-bridge.d.ts +5 -8
  266. package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
  267. package/dist/api/occt-kernel-bridge.js +18 -14
  268. package/dist/api/occt-kernel-bridge.js.map +1 -1
  269. package/dist/api/pattern.d.ts.map +1 -1
  270. package/dist/api/pattern.js +3 -4
  271. package/dist/api/pattern.js.map +1 -1
  272. package/dist/api/place.d.ts.map +1 -1
  273. package/dist/api/place.js +2 -4
  274. package/dist/api/place.js.map +1 -1
  275. package/dist/api/primitives.d.ts.map +1 -1
  276. package/dist/api/primitives.js +3 -4
  277. package/dist/api/primitives.js.map +1 -1
  278. package/dist/api/replicate.d.ts +28 -1
  279. package/dist/api/replicate.d.ts.map +1 -1
  280. package/dist/api/replicate.js +29 -19
  281. package/dist/api/replicate.js.map +1 -1
  282. package/dist/api/result.d.ts +6 -11
  283. package/dist/api/result.d.ts.map +1 -1
  284. package/dist/api/result.js +6 -11
  285. package/dist/api/result.js.map +1 -1
  286. package/dist/api/revolve.d.ts.map +1 -1
  287. package/dist/api/revolve.js +15 -14
  288. package/dist/api/revolve.js.map +1 -1
  289. package/dist/api/screw.d.ts +3 -0
  290. package/dist/api/screw.d.ts.map +1 -1
  291. package/dist/api/screw.js +9 -4
  292. package/dist/api/screw.js.map +1 -1
  293. package/dist/api/sdf.d.ts +1 -1
  294. package/dist/api/section-by-plane.d.ts +42 -0
  295. package/dist/api/section-by-plane.d.ts.map +1 -0
  296. package/dist/api/section-by-plane.js +61 -0
  297. package/dist/api/section-by-plane.js.map +1 -0
  298. package/dist/api/shell.d.ts +45 -0
  299. package/dist/api/shell.d.ts.map +1 -0
  300. package/dist/api/shell.js +73 -0
  301. package/dist/api/shell.js.map +1 -0
  302. package/dist/api/sketch.d.ts +8 -1
  303. package/dist/api/sketch.d.ts.map +1 -1
  304. package/dist/api/sketch.js +12 -7
  305. package/dist/api/sketch.js.map +1 -1
  306. package/dist/api/split-by-plane.d.ts +41 -0
  307. package/dist/api/split-by-plane.d.ts.map +1 -0
  308. package/dist/api/split-by-plane.js +60 -0
  309. package/dist/api/split-by-plane.js.map +1 -0
  310. package/dist/api/split.d.ts +6 -1
  311. package/dist/api/split.d.ts.map +1 -1
  312. package/dist/api/split.js +23 -9
  313. package/dist/api/split.js.map +1 -1
  314. package/dist/api/surface/arg-spec.d.ts +22 -0
  315. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  316. package/dist/api/surface/arg-spec.js +723 -476
  317. package/dist/api/surface/arg-spec.js.map +1 -1
  318. package/dist/api/sweep.d.ts +55 -0
  319. package/dist/api/sweep.d.ts.map +1 -0
  320. package/dist/api/sweep.js +86 -0
  321. package/dist/api/sweep.js.map +1 -0
  322. package/dist/api/thicken.d.ts +36 -0
  323. package/dist/api/thicken.d.ts.map +1 -0
  324. package/dist/api/thicken.js +55 -0
  325. package/dist/api/thicken.js.map +1 -0
  326. package/dist/api/transform.d.ts +8 -0
  327. package/dist/api/transform.d.ts.map +1 -1
  328. package/dist/api/transform.js +15 -4
  329. package/dist/api/transform.js.map +1 -1
  330. package/dist/api/view/cameraFns.d.ts +48 -0
  331. package/dist/api/view/cameraFns.d.ts.map +1 -0
  332. package/dist/api/view/cameraFns.js +75 -0
  333. package/dist/api/view/cameraFns.js.map +1 -0
  334. package/dist/api/view/projectionPlanes.d.ts +25 -0
  335. package/dist/api/view/projectionPlanes.d.ts.map +1 -0
  336. package/dist/api/view/projectionPlanes.js +30 -0
  337. package/dist/api/view/projectionPlanes.js.map +1 -0
  338. package/dist/api/view/view-camera.d.ts +2 -2
  339. package/dist/api/view/view-camera.d.ts.map +1 -1
  340. package/dist/api/view/view-camera.js +3 -3
  341. package/dist/api/view/view-camera.js.map +1 -1
  342. package/dist/api/view/view-projection.d.ts +9 -6
  343. package/dist/api/view/view-projection.d.ts.map +1 -1
  344. package/dist/api/view/view-projection.js +132 -65
  345. package/dist/api/view/view-projection.js.map +1 -1
  346. package/dist/api/wire.d.ts +45 -0
  347. package/dist/api/wire.d.ts.map +1 -0
  348. package/dist/api/wire.js +96 -0
  349. package/dist/api/wire.js.map +1 -0
  350. package/dist/boolean/creased-normals.d.ts +50 -0
  351. package/dist/boolean/creased-normals.d.ts.map +1 -0
  352. package/dist/boolean/creased-normals.js +114 -0
  353. package/dist/boolean/creased-normals.js.map +1 -0
  354. package/dist/boolean/deriveNormals.d.ts +4 -1
  355. package/dist/boolean/deriveNormals.d.ts.map +1 -1
  356. package/dist/boolean/deriveNormals.js +5 -2
  357. package/dist/boolean/deriveNormals.js.map +1 -1
  358. package/dist/brep/brep-ops.d.ts +6 -0
  359. package/dist/brep/brep-ops.d.ts.map +1 -1
  360. package/dist/brep/brep-ops.js +11 -2
  361. package/dist/brep/brep-ops.js.map +1 -1
  362. package/dist/brep/brep-topology.d.ts +4 -0
  363. package/dist/brep/brep-topology.d.ts.map +1 -1
  364. package/dist/brep/brep-topology.js +4 -0
  365. package/dist/brep/brep-topology.js.map +1 -1
  366. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  367. package/dist/brep/engine/adapters/brep-mock.js +79 -59
  368. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  369. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  370. package/dist/brep/engine/adapters/brepkit.js +7 -1
  371. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  372. package/dist/brep/engine/adapters/occt.d.ts +15 -7
  373. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  374. package/dist/brep/engine/adapters/occt.js +52 -167
  375. package/dist/brep/engine/adapters/occt.js.map +1 -1
  376. package/dist/brep/engine/primitives.d.ts +93 -130
  377. package/dist/brep/engine/primitives.d.ts.map +1 -1
  378. package/dist/brep/engine/primitives.js +9 -7
  379. package/dist/brep/engine/primitives.js.map +1 -1
  380. package/dist/brep/engine/types.d.ts +14 -1
  381. package/dist/brep/engine/types.d.ts.map +1 -1
  382. package/dist/brep/engine/types.js +11 -1
  383. package/dist/brep/engine/types.js.map +1 -1
  384. package/dist/brep/export/step.d.ts +3 -0
  385. package/dist/brep/export/step.d.ts.map +1 -1
  386. package/dist/brep/export/step.js +7 -1
  387. package/dist/brep/export/step.js.map +1 -1
  388. package/dist/brep/face-evolution.d.ts +8 -0
  389. package/dist/brep/face-evolution.d.ts.map +1 -1
  390. package/dist/brep/face-evolution.js +15 -3
  391. package/dist/brep/face-evolution.js.map +1 -1
  392. package/dist/brep/handle-bridge.d.ts +20 -2
  393. package/dist/brep/handle-bridge.d.ts.map +1 -1
  394. package/dist/brep/handle-bridge.js +25 -2
  395. package/dist/brep/handle-bridge.js.map +1 -1
  396. package/dist/brepkit-kernel/brepkitKernel.d.ts +25 -5
  397. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  398. package/dist/brepkit-kernel/brepkitKernel.js +336 -144
  399. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  400. package/dist/cad-runtime/admit-compat-lib.d.ts +6 -1
  401. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  402. package/dist/cad-runtime/admit-compat-lib.js +5 -1
  403. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  404. package/dist/cad-runtime/backend-dispatch.d.ts +9 -3
  405. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  406. package/dist/cad-runtime/backend-dispatch.js +32 -2
  407. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  408. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  409. package/dist/cad-runtime/direct-executor.js +8 -2
  410. package/dist/cad-runtime/direct-executor.js.map +1 -1
  411. package/dist/cad-runtime/runtime.d.ts +3 -0
  412. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  413. package/dist/cad-runtime/runtime.js +3 -1
  414. package/dist/cad-runtime/runtime.js.map +1 -1
  415. package/dist/define-op.d.ts +18 -2
  416. package/dist/define-op.d.ts.map +1 -1
  417. package/dist/define-op.js +29 -1
  418. package/dist/define-op.js.map +1 -1
  419. package/dist/env-agnostic.d.ts +3 -0
  420. package/dist/env-agnostic.d.ts.map +1 -1
  421. package/dist/env-agnostic.js +7 -0
  422. package/dist/env-agnostic.js.map +1 -1
  423. package/dist/index.d.ts.map +1 -1
  424. package/dist/index.js +3 -4
  425. package/dist/index.js.map +1 -1
  426. package/dist/lang/symbol-table.generated.d.ts +28 -0
  427. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  428. package/dist/lang/symbol-table.generated.js +29 -1
  429. package/dist/lang/symbol-table.generated.js.map +1 -1
  430. package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
  431. package/dist/occt-kernel/highLevelApi.js +6 -3
  432. package/dist/occt-kernel/highLevelApi.js.map +1 -1
  433. package/dist/occt-kernel/hullGeometry.d.ts +31 -0
  434. package/dist/occt-kernel/hullGeometry.d.ts.map +1 -0
  435. package/dist/occt-kernel/hullGeometry.js +319 -0
  436. package/dist/occt-kernel/hullGeometry.js.map +1 -0
  437. package/dist/occt-kernel/hullOps.d.ts +24 -0
  438. package/dist/occt-kernel/hullOps.d.ts.map +1 -0
  439. package/dist/occt-kernel/hullOps.js +52 -0
  440. package/dist/occt-kernel/hullOps.js.map +1 -0
  441. package/dist/occt-kernel/occt-primitives.d.ts +14 -0
  442. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -0
  443. package/dist/occt-kernel/occt-primitives.js +351 -0
  444. package/dist/occt-kernel/occt-primitives.js.map +1 -0
  445. package/dist/occt-kernel/occtKernel.d.ts +14 -6
  446. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  447. package/dist/occt-kernel/occtKernel.js +11 -3
  448. package/dist/occt-kernel/occtKernel.js.map +1 -1
  449. package/dist/occt-kernel/topologyExt.js +2 -2
  450. package/dist/occt-kernel/topologyExt.js.map +1 -1
  451. package/dist/primitives/brep-primitives.d.ts +4 -0
  452. package/dist/primitives/brep-primitives.d.ts.map +1 -1
  453. package/dist/primitives/brep-primitives.js +4 -0
  454. package/dist/primitives/brep-primitives.js.map +1 -1
  455. package/dist/result/bug.d.ts +22 -0
  456. package/dist/result/bug.d.ts.map +1 -0
  457. package/dist/result/bug.js +28 -0
  458. package/dist/result/bug.js.map +1 -0
  459. package/dist/result/errors.d.ts +270 -0
  460. package/dist/result/errors.d.ts.map +1 -0
  461. package/dist/result/errors.js +317 -0
  462. package/dist/result/errors.js.map +1 -0
  463. package/dist/result/kernelErrorTranslation.d.ts +21 -0
  464. package/dist/result/kernelErrorTranslation.d.ts.map +1 -0
  465. package/dist/result/kernelErrorTranslation.js +102 -0
  466. package/dist/result/kernelErrorTranslation.js.map +1 -0
  467. package/dist/result/result.d.ts +213 -0
  468. package/dist/result/result.d.ts.map +1 -0
  469. package/dist/result/result.js +336 -0
  470. package/dist/result/result.js.map +1 -0
  471. package/dist/result/vec3.d.ts +12 -0
  472. package/dist/result/vec3.d.ts.map +1 -0
  473. package/dist/result/vec3.js +14 -0
  474. package/dist/result/vec3.js.map +1 -0
  475. package/dist/runtime-state.d.ts +9 -0
  476. package/dist/runtime-state.d.ts.map +1 -1
  477. package/dist/runtime-state.js.map +1 -1
  478. package/dist/sdk.d.ts +3 -1
  479. package/dist/sdk.d.ts.map +1 -1
  480. package/dist/sdk.js +2 -1
  481. package/dist/sdk.js.map +1 -1
  482. package/dist/shape.d.ts +43 -1
  483. package/dist/shape.d.ts.map +1 -1
  484. package/dist/shape.js +57 -1
  485. package/dist/shape.js.map +1 -1
  486. package/dist/topology/naming/geom-hint.js +1 -1
  487. package/dist/topology/naming/geom-hint.js.map +1 -1
  488. package/dist/topology/naming/score.js +1 -1
  489. package/dist/topology/naming/score.js.map +1 -1
  490. package/package.json +6 -16
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-repair.js","sourceRoot":"","sources":["../../src/api/feature-repair.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib feature-repair — L1 薄包装族(手写 op,Phase 5)\n *\n * 六条 L1 已有动作的手写薄包装,全部走 `getBrepApi()`(D12):\n * - `defeature(shape, faces)` — 移除特征面(孔/凸台等)\n * - `removeHolesFromFace(face)` — 移除面上的孔\n * - `reverseShape(shape)` — 反转壳体朝向 —— **occt-only**(见下)\n * - `unifySameDomain(shape)` — 合并同域面/边\n * - `sew(shapes, tolerance?)` — 缝合壳\n * - `sewAndSolidify(shapes, tolerance?)` — 缝合并固化为实体\n *\n * 每条都极薄:解析入参 → 直调 L1 → 收养。选面口径与 `shell`/`draft` 一致\n * (FaceTopoRef[],设计原则 4)。\n *\n * 引擎声明(**逐条判定,不整族一刀切**):\n * - `reverseShape` 声明 `engines: ['occt']` —— 实证收窄:brepkit 实测在 **op 级**\n * 失败(`invalid solid handle: index N is out of bounds`,callee = reverseShape,\n * 非输入构造侧),静态门须在执行前拒绝。\n * - 其余五条保持中立(声明 `capabilities: ['directEdit']`,无 engines)。\n * 注意 `unifySameDomain` 在 brepkit 上**可用但语义有差**(会把体重新居中),\n * 未收窄 —— 缺证据表明它不可用,不擅自扩大范围。\n *\n * 未覆盖(诚实留档,本轮未验):`defeature` / `sew` / `sewAndSolidify` /\n * `removeHolesFromFace` 在 brepkit 上的 op 级行为未取得干净证据(探针的面输入\n * 先撞到 faceRef/输入构造侧限制),故不做引擎声明。\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\ntype ProvenanceLike = Provenance\n\n/** BREP 输入守卫:取 BREP 句柄,无则报错。 */\nfunction requireBrep(input: Shape, op: string): BrepHandle {\n const handle = brepOf(input) as BrepHandle | undefined\n if (!handle) throw new Error(`E_${op.toUpperCase()}_NO_BREP: ${op} input is not BREP`)\n return handle\n}\n\n/** 解析 FaceTopoRef[] → 句柄数组(shell/draft 同款口径)。 */\nfunction resolveFaces(kernel: ReturnType<typeof getBrepApi>, input: Shape, refs: FaceTopoRef[], op: string): BrepHandle[] {\n const ctx = buildEdgeResolutionContext(kernel, input as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `${op}: input has no BREP naming context`)\n return refs.map((ref) => {\n if (!ref || (ref as { kind?: unknown }).kind !== 'face') {\n throw new Error(`E_${op.toUpperCase()}_BAD_FACE_REF: every faces 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', `${op}: face resolved without handle (${ref.origin}/${ref.role})`)\n }\n return r.handle as BrepHandle\n })\n}\n\n/** 借入一组输入 Shape → 句柄数组(sew 族)。 */\nfunction borrowHandles(shapes: Shape[], op: string): BrepHandle[] {\n if (!Array.isArray(shapes) || shapes.length === 0) {\n throw new Error(`E_${op.toUpperCase()}_NO_SHAPES: ${op} requires a non-empty array of shapes`)\n }\n return shapes.map((s) => {\n const h = brepOf(s) as BrepHandle | undefined\n if (!h) throw new Error(`E_${op.toUpperCase()}_NO_BREP: ${op} input shape is not BREP`)\n return h\n })\n}\n\nfunction adopt(kernel: ReturnType<typeof getBrepApi>, handle: BrepHandle): Shape {\n return fromBrep(solidToShape(kernel, handle), { solid: handle })\n}\n\nconst kernelNaming = { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as ProvenanceLike\n\n/**\n * 移除特征面(孔/凸台等),恢复基础形状。\n * @group 修复\n * @inputs 1\n * @async true\n * @qual ok\n * @name defeature\n * @note 中立 op:L1 defeature 两引擎同实现。仅 BREP 可用。\n * @returns Shape 移除特征后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param faces - 要移除的面(FaceTopoRef[],cad.faceRef 产物)。type:FaceTopoRef[] required:true\n * @example\n * const base = await cad.defeature(part0, [cad.faceRef(part0, 5)])\n */\nexport const defeature = defineOp({\n capabilities: ['directEdit'],\n brep(input: Shape, faces: FaceTopoRef[]) {\n if (!Array.isArray(faces) || faces.length === 0) {\n throw new Error('E_DEFEATURE_NO_FACES: defeature requires at least one FaceTopoRef')\n }\n const kernel = getBrepApi()\n const solid = requireBrep(input, 'defeature')\n const handles = resolveFaces(kernel, input, faces, 'defeature')\n return adopt(kernel, kernel.defeature(solid, handles))\n },\n naming: kernelNaming,\n})\n\n/**\n * 反转壳体朝向(内表面 ↔ 外表面)。\n * @group 修复\n * @inputs 1\n * @async true\n * @qual ok\n * @name reverseShape\n * @note **occt-only**(`engines: ['occt']`,实证收窄):brepkit 实测在 op 级抛\n * `invalid solid handle: index N is out of bounds`(非输入侧失败),\n * 故由静态门在执行前拒绝而非等到运行时。产物 `getVolume` 返回**有向**体积\n * (朝向反转 ⇒ 符号翻转)。仅 BREP 可用。\n * @returns Shape 朝向反转后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @example\n * const flipped = await cad.reverseShape(sh)\n */\nexport const reverseShape = defineOp({\n capabilities: ['directEdit'],\n // 实证收窄(2026-09-24):brepkit op 级失败 → 静态门提前拒绝。\n engines: ['occt'],\n brep(input: Shape) {\n const kernel = getBrepApi()\n const solid = requireBrep(input, 'reverseShape')\n return adopt(kernel, kernel.reverseShape(solid))\n },\n naming: kernelNaming,\n})\n\n/**\n * 合并同域面/边(去除被分割成多片的冗余细分)。\n * @group 修复\n * @inputs 1\n * @async true\n * @qual ok\n * @name unifySameDomain\n * @note 中立 op:L1 unifySameDomain 两引擎同实现。仅 BREP 可用。\n * @returns Shape 合并后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @example\n * const merged = await cad.unifySameDomain(part0)\n */\nexport const unifySameDomain = defineOp({\n capabilities: ['directEdit'],\n brep(input: Shape) {\n const kernel = getBrepApi()\n const solid = requireBrep(input, 'unifySameDomain')\n return adopt(kernel, kernel.unifySameDomain(solid))\n },\n naming: kernelNaming,\n})\n\n/** `cad.sew` / `cad.sewAndSolidify` 公共参数。 */\nexport interface SewParams {\n /** 缝合容差(mm,可选)。 */\n tolerance?: number\n}\n\n/**\n * 缝合:把一组面/壳沿公共边缝成一张壳。\n * @group 修复\n * @inputs 1\n * @async true\n * @qual ok\n * @name sew\n * @note 中立 op:L1 sew 两引擎同实现。产物是壳(不保证闭合);要实体用 sewAndSolidify。\n * @returns Shape 缝合后的壳。\n * @param shapes - 面/壳集合。type:Shape[] required:true\n * @param params.tolerance - 缝合容差(mm)。type:number required:false\n * @example\n * const shellShape = await cad.sew([f1, f2, f3], { tolerance: 1e-5 })\n */\nexport const sew = defineOp({\n capabilities: ['directEdit'],\n brep(shapes: Shape[], params?: SewParams) {\n const kernel = getBrepApi()\n const handles = borrowHandles(shapes, 'sew')\n return adopt(kernel, kernel.sew(handles, params?.tolerance))\n },\n naming: kernelNaming,\n})\n\n/**\n * 缝合并固化为实体:缝合后若闭合则生成 solid。\n * @group 修复\n * @inputs 1\n * @async true\n * @qual ok\n * @name sewAndSolidify\n * @note 中立 op:L1 sewAndSolidify 两引擎同实现。仅 BREP 可用。\n * @returns Shape 缝合固化后的实体。\n * @param shapes - 面/壳集合。type:Shape[] required:true\n * @param params.tolerance - 缝合容差(mm)。type:number required:false\n * @example\n * const solid = await cad.sewAndSolidify([f1, f2, f3, f4, f5, f6])\n */\nexport const sewAndSolidify = defineOp({\n capabilities: ['directEdit'],\n brep(shapes: Shape[], params?: SewParams) {\n const kernel = getBrepApi()\n const handles = borrowHandles(shapes, 'sewAndSolidify')\n return adopt(kernel, kernel.sewAndSolidify(handles, params?.tolerance))\n },\n naming: kernelNaming,\n})\n\n/**\n * 移除面(或实体某面)上的孔。\n * @group 修复\n * @inputs 1\n * @async true\n * @qual ok\n * @name removeHolesFromFace\n * @note 中立 op:L1 removeHolesFromFace 两引擎同实现。入参为含孔的面 Shape\n * (L1 形参是面句柄;借入输入 Shape 的 BREP 槽位句柄)。\n * @returns Shape 去孔后的面。\n * @param face - 含孔的面几何。type:Shape required:true\n * @example\n * const plain = await cad.removeHolesFromFace(faceWithHoles)\n */\nexport const removeHolesFromFace = defineOp({\n capabilities: ['directEdit'],\n brep(face: Shape) {\n if (!face) throw new Error('E_REMOVEHOLES_NO_FACE: removeHolesFromFace requires a face shape')\n const kernel = getBrepApi()\n const handle = brepOf(face) as BrepHandle | undefined\n if (!handle) throw new Error('E_REMOVEHOLES_NO_BREP: removeHolesFromFace input is not BREP')\n return adopt(kernel, kernel.removeHolesFromFace(handle))\n },\n naming: kernelNaming,\n})\n"]}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * stdlib fillet-variable — 变半径圆角:单边起止半径(手写中立 op,Phase 5)
3
+ *
4
+ * 中立 op:L1 `filletVariable(solid, edge, startRadius, endRadius)` 在 occt 与
5
+ * brepkit 两侧均有真实现(engine-method-map 实测 `dialect`)⇒ 走 `getBrepApi()`
6
+ * (D12),不声明 engines(中立 op:实现只经 L1 契约面)。
7
+ *
8
+ * 这是 faijs 简化形态(单边 + 起止半径);vendored 的 per-edge 回调形态
9
+ * (`variableFillet`)维持 skip(状态化回调不可静态建模)。
10
+ * 选边口径与 `fillet` 一致(EdgeTopoRef,faces 两面 role 线路)。
11
+ */
12
+ import type { Shape } from '../mesh/types.js';
13
+ import type { EdgeTopoRef } from '../topology/naming/index.js';
14
+ /**
15
+ * 变半径圆角:对单条边施加从起点到终点的线性变半径圆角。
16
+ * @group 特征
17
+ * @inputs 1
18
+ * @async true
19
+ * @qual ok
20
+ * @name filletVariable
21
+ * @note 中立 op:L1 filletVariable 两引擎同实现。`r1 == r2` 时与 cad.fillet 等半径
22
+ * 结果等价。vendored 的 per-edge 回调变半径(variableFillet)不上脚本面。
23
+ * 仅 BREP 可用。
24
+ * @returns Shape 变半径圆角后的几何。
25
+ * @param input - 目标几何。type:Shape required:true
26
+ * @param edge - 目标边(EdgeTopoRef,同 cad.fillet 的 edges 条目)。type:EdgeTopoRef required:true
27
+ * @param r1 - 起点半径(mm,>0)。type:number required:true
28
+ * @param r2 - 终点半径(mm,>0)。type:number required:true
29
+ * @example
30
+ * const v = await cad.filletVariable(part0, partEdges[0], 1, 4)
31
+ */
32
+ export declare const filletVariable: ((input: Shape, edge: EdgeTopoRef, r1: number, r2: number) => Promise<Shape>) & {
33
+ __faijs__dualOp?: import("../define-op.js").DualOpMeta;
34
+ };
35
+ //# sourceMappingURL=fillet-variable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fillet-variable.d.ts","sourceRoot":"","sources":["../../src/api/fillet-variable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAkCrD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc;;CAMzB,CAAA"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * stdlib fillet-variable — 变半径圆角:单边起止半径(手写中立 op,Phase 5)
3
+ *
4
+ * 中立 op:L1 `filletVariable(solid, edge, startRadius, endRadius)` 在 occt 与
5
+ * brepkit 两侧均有真实现(engine-method-map 实测 `dialect`)⇒ 走 `getBrepApi()`
6
+ * (D12),不声明 engines(中立 op:实现只经 L1 契约面)。
7
+ *
8
+ * 这是 faijs 简化形态(单边 + 起止半径);vendored 的 per-edge 回调形态
9
+ * (`variableFillet`)维持 skip(状态化回调不可静态建模)。
10
+ * 选边口径与 `fillet` 一致(EdgeTopoRef,faces 两面 role 线路)。
11
+ */
12
+ import { solidToShape } from '../brep/brep-ops.js';
13
+ import { getBrepApi } from '../brep/handle-bridge.js';
14
+ import { brepOf, fromBrep } from '../shape.js';
15
+ import { defineOp } from '../sdk.js';
16
+ import { resolveTopoRef, TopoRefError } from '../topology/naming/index.js';
17
+ import { buildEdgeResolutionContext } from './topo-resolve.js';
18
+ /** BREP 路径:解析边引用 → L1 filletVariable → 收养。 */
19
+ function filletVariableBrep(input, edge, startRadius, endRadius) {
20
+ if (!edge || edge.kind !== 'edge') {
21
+ throw new Error('E_FILLETVAR_BAD_EDGE_REF: edge must be an EdgeTopoRef (as consumed by cad.fillet)');
22
+ }
23
+ const faces = edge.faces;
24
+ if (!Array.isArray(faces) || faces.length !== 2) {
25
+ throw new Error('E_FILLETVAR_BAD_EDGE_REF: EdgeTopoRef.faces must be a two-entry RoleQualifier pair');
26
+ }
27
+ for (const r of [startRadius, endRadius]) {
28
+ if (typeof r !== 'number' || !Number.isFinite(r) || r <= 0) {
29
+ throw new Error('E_FILLETVAR_BAD_RADIUS: startRadius / endRadius must be positive numbers');
30
+ }
31
+ }
32
+ const kernel = getBrepApi();
33
+ const solid = brepOf(input);
34
+ if (!solid)
35
+ throw new Error('E_FILLETVAR_NO_BREP: filletVariable input is not BREP');
36
+ const ctx = buildEdgeResolutionContext(kernel, input);
37
+ if (!ctx)
38
+ throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', 'filletVariable: input has no BREP naming context');
39
+ const r = resolveTopoRef(edge, ctx);
40
+ if (r.handle === undefined) {
41
+ throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `filletVariable: edge resolved without handle (${edge.faces[0].role}/${edge.faces[1].role})`);
42
+ }
43
+ const result = kernel.filletVariable(solid, r.handle, startRadius, endRadius);
44
+ return fromBrep(solidToShape(kernel, result), { solid: result });
45
+ }
46
+ /**
47
+ * 变半径圆角:对单条边施加从起点到终点的线性变半径圆角。
48
+ * @group 特征
49
+ * @inputs 1
50
+ * @async true
51
+ * @qual ok
52
+ * @name filletVariable
53
+ * @note 中立 op:L1 filletVariable 两引擎同实现。`r1 == r2` 时与 cad.fillet 等半径
54
+ * 结果等价。vendored 的 per-edge 回调变半径(variableFillet)不上脚本面。
55
+ * 仅 BREP 可用。
56
+ * @returns Shape 变半径圆角后的几何。
57
+ * @param input - 目标几何。type:Shape required:true
58
+ * @param edge - 目标边(EdgeTopoRef,同 cad.fillet 的 edges 条目)。type:EdgeTopoRef required:true
59
+ * @param r1 - 起点半径(mm,>0)。type:number required:true
60
+ * @param r2 - 终点半径(mm,>0)。type:number required:true
61
+ * @example
62
+ * const v = await cad.filletVariable(part0, partEdges[0], 1, 4)
63
+ */
64
+ export const filletVariable = defineOp({
65
+ capabilities: ['directEdit'],
66
+ brep(input, edge, r1, r2) {
67
+ return filletVariableBrep(input, edge, r1, r2);
68
+ },
69
+ naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
70
+ });
71
+ //# sourceMappingURL=fillet-variable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fillet-variable.js","sourceRoot":"","sources":["../../src/api/fillet-variable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;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;AAE3D,8CAA8C;AAC9C,SAAS,kBAAkB,CAAC,KAAY,EAAE,IAAiB,EAAE,WAAmB,EAAE,SAAiB;IACjG,IAAI,CAAC,IAAI,IAAK,IAA2B,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAA;IACtG,CAAC;IACD,MAAM,KAAK,GAAI,IAA4B,CAAC,KAAK,CAAA;IACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAA;IACvG,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAA;QAC7F,CAAC;IACH,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,uDAAuD,CAAC,CAAA;IAEpF,MAAM,GAAG,GAAG,0BAA0B,CAAC,MAAM,EAAE,KAAe,CAAC,CAAA;IAC/D,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,kDAAkD,CAAC,CAAA;IAChH,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACnC,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,iDAAiD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAA;IAClJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,MAAoB,EAAE,WAAW,EAAE,SAAS,CAAC,CAAA;IAC3F,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAClE,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;IACrC,YAAY,EAAE,CAAC,YAAY,CAAC;IAC5B,IAAI,CAAC,KAAY,EAAE,IAAiB,EAAE,EAAU,EAAE,EAAU;QAC1D,OAAO,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IAChD,CAAC;IACD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,EAAgB;CAC3E,CAAC,CAAA","sourcesContent":["/**\n * stdlib fillet-variable — 变半径圆角:单边起止半径(手写中立 op,Phase 5)\n *\n * 中立 op:L1 `filletVariable(solid, edge, startRadius, endRadius)` 在 occt 与\n * brepkit 两侧均有真实现(engine-method-map 实测 `dialect`)⇒ 走 `getBrepApi()`\n * (D12),不声明 engines(中立 op:实现只经 L1 契约面)。\n *\n * 这是 faijs 简化形态(单边 + 起止半径);vendored 的 per-edge 回调形态\n * (`variableFillet`)维持 skip(状态化回调不可静态建模)。\n * 选边口径与 `fillet` 一致(EdgeTopoRef,faces 两面 role 线路)。\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 { EdgeTopoRef } from '../topology/naming'\nimport { resolveTopoRef, TopoRefError } from '../topology/naming'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { buildEdgeResolutionContext } from './topo-resolve'\n\n/** BREP 路径:解析边引用 → L1 filletVariable → 收养。 */\nfunction filletVariableBrep(input: Shape, edge: EdgeTopoRef, startRadius: number, endRadius: number): Shape {\n if (!edge || (edge as { kind?: unknown }).kind !== 'edge') {\n throw new Error('E_FILLETVAR_BAD_EDGE_REF: edge must be an EdgeTopoRef (as consumed by cad.fillet)')\n }\n const faces = (edge as { faces?: unknown }).faces\n if (!Array.isArray(faces) || faces.length !== 2) {\n throw new Error('E_FILLETVAR_BAD_EDGE_REF: EdgeTopoRef.faces must be a two-entry RoleQualifier pair')\n }\n for (const r of [startRadius, endRadius]) {\n if (typeof r !== 'number' || !Number.isFinite(r) || r <= 0) {\n throw new Error('E_FILLETVAR_BAD_RADIUS: startRadius / endRadius must be positive numbers')\n }\n }\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('E_FILLETVAR_NO_BREP: filletVariable input is not BREP')\n\n const ctx = buildEdgeResolutionContext(kernel, input as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', 'filletVariable: input has no BREP naming context')\n const r = resolveTopoRef(edge, ctx)\n if (r.handle === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `filletVariable: edge resolved without handle (${edge.faces[0].role}/${edge.faces[1].role})`)\n }\n\n const result = kernel.filletVariable(solid, r.handle as BrepHandle, startRadius, endRadius)\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 filletVariable\n * @note 中立 op:L1 filletVariable 两引擎同实现。`r1 == r2` 时与 cad.fillet 等半径\n * 结果等价。vendored 的 per-edge 回调变半径(variableFillet)不上脚本面。\n * 仅 BREP 可用。\n * @returns Shape 变半径圆角后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param edge - 目标边(EdgeTopoRef,同 cad.fillet 的 edges 条目)。type:EdgeTopoRef required:true\n * @param r1 - 起点半径(mm,>0)。type:number required:true\n * @param r2 - 终点半径(mm,>0)。type:number required:true\n * @example\n * const v = await cad.filletVariable(part0, partEdges[0], 1, 4)\n */\nexport const filletVariable = defineOp({\n capabilities: ['directEdit'],\n brep(input: Shape, edge: EdgeTopoRef, r1: number, r2: number) {\n return filletVariableBrep(input, edge, r1, r2)\n },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * stdlib fillet — fillet 圆角库函数(BREP-only,directEdit 能力)
3
3
  *
4
+ * 平台分层(narrowing plan Phase 5,D11):**中立 op**——`filletWithHistory` 是
5
+ * L1 核心面(brepkit 亦实现),实现全程走 L1(getBrepApi,D12),不声明 engines;
6
+ * capabilities 保留族级 `directEdit`(brepkit 声明 directEdit: true)。
4
7
  *
5
8
  * 与 chamfer 的差异:fillet 用 filletWithHistory 走面演化 + roleTable 传播
6
9
  * (chamfer 在 P5 同步改造)。M1 只支持等半径;M2 计划支持变半径与几何限定符。
@@ -1 +1 @@
1
- {"version":3,"file":"fillet.d.ts","sourceRoot":"","sources":["../../src/api/fillet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAe1C;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAkBxE;AAoED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,MAAM;;CAOjB,CAAA"}
1
+ {"version":3,"file":"fillet.d.ts","sourceRoot":"","sources":["../../src/api/fillet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAe1C;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAkBxE;AAoED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,MAAM;;CAOjB,CAAA"}
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * stdlib fillet — fillet 圆角库函数(BREP-only,directEdit 能力)
3
3
  *
4
+ * 平台分层(narrowing plan Phase 5,D11):**中立 op**——`filletWithHistory` 是
5
+ * L1 核心面(brepkit 亦实现),实现全程走 L1(getBrepApi,D12),不声明 engines;
6
+ * capabilities 保留族级 `directEdit`(brepkit 声明 directEdit: true)。
4
7
  *
5
8
  * 与 chamfer 的差异:fillet 用 filletWithHistory 走面演化 + roleTable 传播
6
9
  * (chamfer 在 P5 同步改造)。M1 只支持等半径;M2 计划支持变半径与几何限定符。
@@ -18,7 +21,8 @@
18
21
  */
19
22
  import { solidToShape } from '../brep/brep-ops.js';
20
23
  import { filletWithRoleTable } from '../brep/face-evolution.js';
21
- import { getBackends, getCurrentStmt } from '../runtime-state.js';
24
+ import { getBrepApi } from '../brep/handle-bridge.js';
25
+ import { getCurrentStmt } from '../runtime-state.js';
22
26
  import { fromBrep, brepOf, inputRoleTable } from '../shape.js';
23
27
  import { defineOp } from '../sdk.js';
24
28
  import { resolveTopoRef, TopoRefError } from '../topology/naming/index.js';
@@ -71,9 +75,8 @@ function translateOcctError(err) {
71
75
  }
72
76
  /** BREP-only 主入口(M1 等半径 flow)。 */
73
77
  function filletBrep(input, params) {
74
- const kernel = getBackends().kernel.brep;
75
- if (!kernel)
76
- throw new Error('[stdlib/fillet] no BREP kernel');
78
+ // L1 面(D12):filletWithHistory 是 L1,全链路中立。
79
+ const kernel = getBrepApi();
77
80
  const solid = brepOf(input);
78
81
  if (!solid)
79
82
  throw new Error('E_FILLET_NO_BREP: fillet input is not BREP');
@@ -1 +1 @@
1
- {"version":3,"file":"fillet.js","sourceRoot":"","sources":["../../src/api/fillet.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib fillet — fillet 圆角库函数(BREP-only,directEdit 能力)\n *\n *\n * 与 chamfer 的差异:fillet 用 filletWithHistory 走面演化 + roleTable 传播\n * (chamfer 在 P5 同步改造)。M1 只支持等半径;M2 计划支持变半径与几何限定符。\n *\n * 设计见 docs/plans/2026-09-10-fillet-op-and-editor-ui.md §2–§3。\n *\n * M1:\n * - 等半径(number):kernel.filletWithHistory(solid, edges, radius, hashes, bound)\n * - 走 filletWithRoleTable 传播 roleTable(§3.2)\n * - BREP-only:mesh 输入 → E_MESH_UNSUPPORTED(backend-dispatch 静态判定)\n *\n * M2(未实施):\n * - 变半径 [r1, r2]:filletVariable + 单边 + 不产 roleTable(§3.3 降级)\n * - 几何限定符字符串选边(§4)\n */\n\nimport type { Shape } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { filletWithRoleTable } from '../brep/face-evolution'\nimport { getBackends, getCurrentStmt } from '../runtime-state'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { EdgeTopoRef, ResolutionContext } from '../topology/naming'\nimport { resolveTopoRef, TopoRefError } from '../topology/naming'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { buildEdgeResolutionContext } from './topo-resolve'\n\n// ── 参数自校验(stdlib 被直接 import 时的防御层)──\n\n/**\n * Validate fillet parameters: `edges` must be a non-empty array of EdgeTopoRef,\n * each with kind key \"edge\" and a two-entry faces pair; `radius` must be a\n * positive number (M1: uniform radius only).\n * @param params the raw fillet operation parameters.\n */\nexport function assertFilletParams(params: Record<string, unknown>): void {\n const edges = params.edges\n if (!Array.isArray(edges) || edges.length === 0) {\n throw new Error('E_FILLET_NO_EDGES: fillet requires at least one edge')\n }\n for (const e of edges) {\n if (!e || typeof e !== 'object' || (e as { kind?: unknown }).kind !== 'edge') {\n throw new Error('E_FILLET_BAD_EDGE_REF: every edge entry must be an EdgeTopoRef with kind:\"edge\"')\n }\n const faces = (e as { faces?: unknown }).faces\n if (!Array.isArray(faces) || faces.length !== 2) {\n throw new Error('E_FILLET_BAD_EDGE_REF: EdgeTopoRef.faces must be a two-entry RoleQualifier pair')\n }\n }\n const radius = params.radius\n if (typeof radius !== 'number' || !Number.isFinite(radius) || radius <= 0) {\n throw new Error('E_FILLET_BAD_RADIUS: fillet.radius must be a positive number')\n }\n}\n\n/** 解析一条 EdgeTopoRef → handle;失败抛命名层 TopoRefError。 */\nfunction resolveEdge(ctx: ResolutionContext, ref: EdgeTopoRef): BrepHandle {\n const r = resolveTopoRef(ref, ctx)\n if (r.handle === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `fillet: edge resolved without handle (${ref.faces[0].role}/${ref.faces[1].role})`)\n }\n return r.handle as BrepHandle\n}\n\n/**\n * 把内核 OcctError 回译成 E_FILLET_RADIUS_TOO_LARGE。\n *\n * OCCT 在半径超过邻面尺寸、三面交汇处、凹边处都可能失败。\n * 绝不可静默返回未圆角的原形状(§9 风险)。\n */\nfunction translateOcctError(err: unknown): Error {\n const msg = err instanceof Error ? err.message : String(err)\n if (msg.includes('E_FILLET') || msg.includes('E_TOPO')) return err as Error\n return new Error(`E_FILLET_RADIUS_TOO_LARGE: OCCT fillet failed — ${msg}`)\n}\n\n/** BREP-only 主入口(M1 等半径 flow)。 */\nfunction filletBrep(input: Shape, params: Record<string, unknown>): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/fillet] no BREP kernel')\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('E_FILLET_NO_BREP: fillet input is not BREP')\n\n const edges = params.edges as EdgeTopoRef[]\n const radius = params.radius as number\n const ctx = buildEdgeResolutionContext(kernel, input as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', 'fillet: input has no edge naming context')\n\n // 解析所有 EdgeTopoRef → Edge 句柄\n const edgeHandles = edges.map((e) => resolveEdge(ctx, e))\n\n // 输入 roleTable + outStmt(与 boolean.ts 同构)。Phase 1.6:origin=本次语句 StmtId。\n const inputTable = inputRoleTable(input) as ReadonlyMap<unknown, unknown> | undefined\n const outStmt = String(getCurrentStmt()?.id ?? '')\n\n let resultSolid: BrepHandle\n let faceEvolution: Map<number, number[]> | undefined\n let roleTable: ReadonlyMap<unknown, unknown> | undefined\n\n try {\n const r = filletWithRoleTable(\n kernel,\n solid,\n edgeHandles,\n radius,\n inputTable ?? new Map(),\n outStmt,\n )\n resultSolid = r.result\n faceEvolution = r.faceEvolution\n roleTable = r.roleTable\n } catch (err) {\n throw translateOcctError(err)\n }\n\n return fromBrep(\n solidToShape(kernel, resultSolid),\n { solid: resultSolid, faceEvolution, roleTable },\n )\n}\n\n/**\n * 在几何体上做圆角(等半径)。仅 BREP 可用。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name fillet\n * @note 圆角是 BREP-only:非 BREP 输入抛 E_MESH_UNSUPPORTED。`radius` 为正数(mm)。\n * 圆角后 roleTable 经 filletWithHistory 传播,保证后续特征仍可按 role 选面/选边。\n * @returns Shape 圆角后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.edges - 参与圆角的边(EdgeTopoRef[],条目为相邻两面的 role 线路)。type:EdgeTopoRef[] required:true\n * @param params.radius - 圆角半径(mm,>0)。type:number required:true\n * @example\n * const p = await cad.fillet(part0, { edges: [{ kind:'edge', faces:[{ origin:'box', role:'box:top' }, { origin:'box', role:'box:front' }], hint:{ kind:'edge' } }], radius:2 })\n */\nexport const fillet = defineOp({\n capabilities: ['directEdit'],\n brep(input: Shape, params: Record<string, unknown>) {\n assertFilletParams(params)\n return filletBrep(input, params)\n },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
1
+ {"version":3,"file":"fillet.js","sourceRoot":"","sources":["../../src/api/fillet.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib fillet — fillet 圆角库函数(BREP-only,directEdit 能力)\n *\n * 平台分层(narrowing plan Phase 5,D11):**中立 op**——`filletWithHistory` 是\n * L1 核心面(brepkit 亦实现),实现全程走 L1(getBrepApi,D12),不声明 engines;\n * capabilities 保留族级 `directEdit`(brepkit 声明 directEdit: true)。\n *\n * 与 chamfer 的差异:fillet 用 filletWithHistory 走面演化 + roleTable 传播\n * (chamfer 在 P5 同步改造)。M1 只支持等半径;M2 计划支持变半径与几何限定符。\n *\n * 设计见 docs/plans/2026-09-10-fillet-op-and-editor-ui.md §2–§3。\n *\n * M1:\n * - 等半径(number):kernel.filletWithHistory(solid, edges, radius, hashes, bound)\n * - 走 filletWithRoleTable 传播 roleTable(§3.2)\n * - BREP-only:mesh 输入 → E_MESH_UNSUPPORTED(backend-dispatch 静态判定)\n *\n * M2(未实施):\n * - 变半径 [r1, r2]:filletVariable + 单边 + 不产 roleTable(§3.3 降级)\n * - 几何限定符字符串选边(§4)\n */\n\nimport type { Shape } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { filletWithRoleTable } from '../brep/face-evolution'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { getCurrentStmt } from '../runtime-state'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { EdgeTopoRef, ResolutionContext } from '../topology/naming'\nimport { resolveTopoRef, TopoRefError } from '../topology/naming'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { buildEdgeResolutionContext } from './topo-resolve'\n\n// ── 参数自校验(stdlib 被直接 import 时的防御层)──\n\n/**\n * Validate fillet parameters: `edges` must be a non-empty array of EdgeTopoRef,\n * each with kind key \"edge\" and a two-entry faces pair; `radius` must be a\n * positive number (M1: uniform radius only).\n * @param params the raw fillet operation parameters.\n */\nexport function assertFilletParams(params: Record<string, unknown>): void {\n const edges = params.edges\n if (!Array.isArray(edges) || edges.length === 0) {\n throw new Error('E_FILLET_NO_EDGES: fillet requires at least one edge')\n }\n for (const e of edges) {\n if (!e || typeof e !== 'object' || (e as { kind?: unknown }).kind !== 'edge') {\n throw new Error('E_FILLET_BAD_EDGE_REF: every edge entry must be an EdgeTopoRef with kind:\"edge\"')\n }\n const faces = (e as { faces?: unknown }).faces\n if (!Array.isArray(faces) || faces.length !== 2) {\n throw new Error('E_FILLET_BAD_EDGE_REF: EdgeTopoRef.faces must be a two-entry RoleQualifier pair')\n }\n }\n const radius = params.radius\n if (typeof radius !== 'number' || !Number.isFinite(radius) || radius <= 0) {\n throw new Error('E_FILLET_BAD_RADIUS: fillet.radius must be a positive number')\n }\n}\n\n/** 解析一条 EdgeTopoRef → handle;失败抛命名层 TopoRefError。 */\nfunction resolveEdge(ctx: ResolutionContext, ref: EdgeTopoRef): BrepHandle {\n const r = resolveTopoRef(ref, ctx)\n if (r.handle === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `fillet: edge resolved without handle (${ref.faces[0].role}/${ref.faces[1].role})`)\n }\n return r.handle as BrepHandle\n}\n\n/**\n * 把内核 OcctError 回译成 E_FILLET_RADIUS_TOO_LARGE。\n *\n * OCCT 在半径超过邻面尺寸、三面交汇处、凹边处都可能失败。\n * 绝不可静默返回未圆角的原形状(§9 风险)。\n */\nfunction translateOcctError(err: unknown): Error {\n const msg = err instanceof Error ? err.message : String(err)\n if (msg.includes('E_FILLET') || msg.includes('E_TOPO')) return err as Error\n return new Error(`E_FILLET_RADIUS_TOO_LARGE: OCCT fillet failed — ${msg}`)\n}\n\n/** BREP-only 主入口(M1 等半径 flow)。 */\nfunction filletBrep(input: Shape, params: Record<string, unknown>): Shape {\n // L1 面(D12):filletWithHistory 是 L1,全链路中立。\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('E_FILLET_NO_BREP: fillet input is not BREP')\n\n const edges = params.edges as EdgeTopoRef[]\n const radius = params.radius as number\n const ctx = buildEdgeResolutionContext(kernel, input as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', 'fillet: input has no edge naming context')\n\n // 解析所有 EdgeTopoRef → Edge 句柄\n const edgeHandles = edges.map((e) => resolveEdge(ctx, e))\n\n // 输入 roleTable + outStmt(与 boolean.ts 同构)。Phase 1.6:origin=本次语句 StmtId。\n const inputTable = inputRoleTable(input) as ReadonlyMap<unknown, unknown> | undefined\n const outStmt = String(getCurrentStmt()?.id ?? '')\n\n let resultSolid: BrepHandle\n let faceEvolution: Map<number, number[]> | undefined\n let roleTable: ReadonlyMap<unknown, unknown> | undefined\n\n try {\n const r = filletWithRoleTable(\n kernel,\n solid,\n edgeHandles,\n radius,\n inputTable ?? new Map(),\n outStmt,\n )\n resultSolid = r.result\n faceEvolution = r.faceEvolution\n roleTable = r.roleTable\n } catch (err) {\n throw translateOcctError(err)\n }\n\n return fromBrep(\n solidToShape(kernel, resultSolid),\n { solid: resultSolid, faceEvolution, roleTable },\n )\n}\n\n/**\n * 在几何体上做圆角(等半径)。仅 BREP 可用。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name fillet\n * @note 圆角是 BREP-only:非 BREP 输入抛 E_MESH_UNSUPPORTED。`radius` 为正数(mm)。\n * 圆角后 roleTable 经 filletWithHistory 传播,保证后续特征仍可按 role 选面/选边。\n * @returns Shape 圆角后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.edges - 参与圆角的边(EdgeTopoRef[],条目为相邻两面的 role 线路)。type:EdgeTopoRef[] required:true\n * @param params.radius - 圆角半径(mm,>0)。type:number required:true\n * @example\n * const p = await cad.fillet(part0, { edges: [{ kind:'edge', faces:[{ origin:'box', role:'box:top' }, { origin:'box', role:'box:front' }], hint:{ kind:'edge' } }], radius:2 })\n */\nexport const fillet = defineOp({\n capabilities: ['directEdit'],\n brep(input: Shape, params: Record<string, unknown>) {\n assertFilletParams(params)\n return filletBrep(input, params)\n },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
@@ -1,18 +1,6 @@
1
1
  /**
2
2
  * generated/2d.ts — 生成文件,勿手改。
3
3
  * 由 packages/core/scripts/gen-l3-surface.ts 依据 api/surface/arg-spec.ts 生成(E5/P14 分片)。
4
- * 2d 模块:12 个投影符号;另有 33 个 skip 登记。
4
+ * 2d 模块:0 个投影符号;另有 45 个 skip 登记。
5
5
  */
6
- export type { Blueprint } from '../../vendored/brepjs/index.js';
7
- export type { Blueprints } from '../../vendored/brepjs/index.js';
8
- export type { BoundingBox2d } from '../../vendored/brepjs/index.js';
9
- export type { CompoundBlueprint } from '../../vendored/brepjs/index.js';
10
- export type { Curve2D } from '../../vendored/brepjs/index.js';
11
- export type { DrawingInterface } from '../../vendored/brepjs/index.js';
12
- export type { GenericSketcher } from '../../vendored/brepjs/index.js';
13
- export type { Point2D } from '../../vendored/brepjs/index.js';
14
- export type { ScaleMode } from '../../vendored/brepjs/index.js';
15
- export type { Shape2D } from '../../vendored/brepjs/index.js';
16
- export type { SketchData } from '../../vendored/brepjs/index.js';
17
- export type { SplineOptions } from '../../vendored/brepjs/index.js';
18
6
  //# sourceMappingURL=2d.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"2d.d.ts","sourceRoot":"","sources":["../../../src/api/generated/2d.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,YAAY,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAE/D,YAAY,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAEhE,YAAY,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAEnE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,YAAY,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAE7D,YAAY,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAEtE,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAErE,YAAY,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAE7D,YAAY,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAE/D,YAAY,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AAE7D,YAAY,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAEhE,YAAY,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA"}
1
+ {"version":3,"file":"2d.d.ts","sourceRoot":"","sources":["../../../src/api/generated/2d.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -1,2 +1,7 @@
1
- export {};
1
+ "use strict";
2
+ /**
3
+ * generated/2d.ts — 生成文件,勿手改。
4
+ * 由 packages/core/scripts/gen-l3-surface.ts 依据 api/surface/arg-spec.ts 生成(E5/P14 分片)。
5
+ * 2d 模块:0 个投影符号;另有 45 个 skip 登记。
6
+ */
2
7
  //# sourceMappingURL=2d.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"2d.js","sourceRoot":"","sources":["../../../src/api/generated/2d.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * generated/2d.ts — 生成文件,勿手改。\n * 由 packages/core/scripts/gen-l3-surface.ts 依据 api/surface/arg-spec.ts 生成(E5/P14 分片)。\n * 2d 模块:12 个投影符号;另有 33 个 skip 登记。\n */\nexport type { Blueprint } from '../../vendored/brepjs/index.js'\n\nexport type { Blueprints } from '../../vendored/brepjs/index.js'\n\nexport type { BoundingBox2d } from '../../vendored/brepjs/index.js'\n\nexport type { CompoundBlueprint } from '../../vendored/brepjs/index.js'\n\nexport type { Curve2D } from '../../vendored/brepjs/index.js'\n\nexport type { DrawingInterface } from '../../vendored/brepjs/index.js'\n\nexport type { GenericSketcher } from '../../vendored/brepjs/index.js'\n\nexport type { Point2D } from '../../vendored/brepjs/index.js'\n\nexport type { ScaleMode } from '../../vendored/brepjs/index.js'\n\nexport type { Shape2D } from '../../vendored/brepjs/index.js'\n\nexport type { SketchData } from '../../vendored/brepjs/index.js'\n\nexport type { SplineOptions } from '../../vendored/brepjs/index.js'\n"]}
1
+ {"version":3,"file":"2d.js","sourceRoot":"","sources":["../../../src/api/generated/2d.ts"],"names":[],"mappings":";AAAA;;;;GAIG","sourcesContent":["/**\n * generated/2d.ts — 生成文件,勿手改。\n * 由 packages/core/scripts/gen-l3-surface.ts 依据 api/surface/arg-spec.ts 生成(E5/P14 分片)。\n * 2d 模块:0 个投影符号;另有 45 个 skip 登记。\n */\n"]}