@faicad/faijs 0.29.5 → 0.31.1

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 (722) hide show
  1. package/NOTICE +6 -5
  2. package/dist/api/align/index.d.ts +64 -0
  3. package/dist/api/align/index.d.ts.map +1 -0
  4. package/dist/api/align/index.js +101 -0
  5. package/dist/api/align/index.js.map +1 -0
  6. package/dist/api/api-namespace.d.ts +6 -5
  7. package/dist/api/api-namespace.d.ts.map +1 -1
  8. package/dist/api/api-namespace.js +89 -5
  9. package/dist/api/api-namespace.js.map +1 -1
  10. package/dist/api/appearance.d.ts +0 -2
  11. package/dist/api/appearance.d.ts.map +1 -1
  12. package/dist/api/appearance.js +0 -2
  13. package/dist/api/appearance.js.map +1 -1
  14. package/dist/api/assembly/entities.d.ts +1 -1
  15. package/dist/api/assembly/entities.js +1 -1
  16. package/dist/api/assembly/entities.js.map +1 -1
  17. package/dist/api/assembly/index.d.ts +1 -1
  18. package/dist/api/assembly/index.js +1 -1
  19. package/dist/api/assembly/index.js.map +1 -1
  20. package/dist/api/assembly/joints.d.ts +33 -15
  21. package/dist/api/assembly/joints.d.ts.map +1 -1
  22. package/dist/api/assembly/joints.js +31 -13
  23. package/dist/api/assembly/joints.js.map +1 -1
  24. package/dist/api/assembly/preview.d.ts +1 -1
  25. package/dist/api/assembly/preview.js +1 -1
  26. package/dist/api/assembly/preview.js.map +1 -1
  27. package/dist/api/assembly/solve.d.ts +1 -1
  28. package/dist/api/assembly/solve.js +1 -1
  29. package/dist/api/assembly/solve.js.map +1 -1
  30. package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
  31. package/dist/api/assembly/solvers/assembly-tree.js +1 -1
  32. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  33. package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
  34. package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
  35. package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
  36. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  37. package/dist/api/assembly/solvers/global-solver.js +3 -4
  38. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  39. package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
  40. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
  41. package/dist/api/assembly/solvers/linalg.d.ts +2 -2
  42. package/dist/api/assembly/solvers/linalg.js +2 -2
  43. package/dist/api/assembly/solvers/linalg.js.map +1 -1
  44. package/dist/api/assembly/solvers/types.d.ts +2 -5
  45. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  46. package/dist/api/assembly/solvers/types.js +1 -4
  47. package/dist/api/assembly/solvers/types.js.map +1 -1
  48. package/dist/api/boolean-op/index.d.ts +65 -0
  49. package/dist/api/boolean-op/index.d.ts.map +1 -0
  50. package/dist/api/boolean-op/index.js +113 -0
  51. package/dist/api/boolean-op/index.js.map +1 -0
  52. package/dist/api/boolean.d.ts.map +1 -1
  53. package/dist/api/boolean.js +22 -33
  54. package/dist/api/boolean.js.map +1 -1
  55. package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
  56. package/dist/api/brep-mirror/booleanFns.js +5 -5
  57. package/dist/api/brep-mirror/booleanFns.js.map +1 -1
  58. package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
  59. package/dist/api/brep-mirror/compoundFns.js +4 -4
  60. package/dist/api/brep-mirror/compoundFns.js.map +1 -1
  61. package/dist/api/brep-mirror/healingFns.d.ts +4 -4
  62. package/dist/api/brep-mirror/healingFns.js +4 -4
  63. package/dist/api/brep-mirror/healingFns.js.map +1 -1
  64. package/dist/api/brep-mirror/hullFns.d.ts +2 -2
  65. package/dist/api/brep-mirror/hullFns.js +2 -2
  66. package/dist/api/brep-mirror/hullFns.js.map +1 -1
  67. package/dist/api/brep-mirror/patternFns.d.ts +5 -5
  68. package/dist/api/brep-mirror/patternFns.js +10 -10
  69. package/dist/api/brep-mirror/patternFns.js.map +1 -1
  70. package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
  71. package/dist/api/brep-mirror/primitiveFns.js +4 -4
  72. package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
  73. package/dist/api/brep-mirror/roofFns.d.ts +3 -3
  74. package/dist/api/brep-mirror/roofFns.js +7 -7
  75. package/dist/api/brep-mirror/roofFns.js.map +1 -1
  76. package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
  77. package/dist/api/brep-mirror/sweepFns.js +14 -14
  78. package/dist/api/brep-mirror/sweepFns.js.map +1 -1
  79. package/dist/api/brep-mirror/threadFns.d.ts +1 -1
  80. package/dist/api/brep-mirror/threadFns.js +1 -1
  81. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  82. package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
  83. package/dist/api/brep-mirror/topologyFns.js +8 -8
  84. package/dist/api/brep-mirror/topologyFns.js.map +1 -1
  85. package/dist/api/brep-operations/booleanFns.d.ts +40 -0
  86. package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
  87. package/dist/api/brep-operations/booleanFns.js +104 -0
  88. package/dist/api/brep-operations/booleanFns.js.map +1 -0
  89. package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
  90. package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
  91. package/dist/api/brep-operations/brepHelpers.js +131 -0
  92. package/dist/api/brep-operations/brepHelpers.js.map +1 -0
  93. package/dist/api/brep-operations/compoundFns.d.ts +46 -0
  94. package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
  95. package/dist/api/brep-operations/compoundFns.js +299 -0
  96. package/dist/api/brep-operations/compoundFns.js.map +1 -0
  97. package/dist/api/brep-operations/healingFns.d.ts +91 -0
  98. package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
  99. package/dist/api/brep-operations/healingFns.js +321 -0
  100. package/dist/api/brep-operations/healingFns.js.map +1 -0
  101. package/dist/api/brep-operations/hullFns.d.ts +20 -0
  102. package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
  103. package/dist/api/brep-operations/hullFns.js +46 -0
  104. package/dist/api/brep-operations/hullFns.js.map +1 -0
  105. package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
  106. package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
  107. package/dist/api/brep-operations/joinery-brep.js +463 -0
  108. package/dist/api/brep-operations/joinery-brep.js.map +1 -0
  109. package/dist/api/brep-operations/patternFns.d.ts +43 -0
  110. package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
  111. package/dist/api/brep-operations/patternFns.js +178 -0
  112. package/dist/api/brep-operations/patternFns.js.map +1 -0
  113. package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
  114. package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
  115. package/dist/api/brep-operations/primitiveFns.js +104 -0
  116. package/dist/api/brep-operations/primitiveFns.js.map +1 -0
  117. package/dist/api/brep-operations/roofFns.d.ts +24 -0
  118. package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
  119. package/dist/api/brep-operations/roofFns.js +229 -0
  120. package/dist/api/brep-operations/roofFns.js.map +1 -0
  121. package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
  122. package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
  123. package/dist/api/brep-operations/straightSkeleton.js +431 -0
  124. package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
  125. package/dist/api/brep-operations/sweepFns.d.ts +60 -0
  126. package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
  127. package/dist/api/brep-operations/sweepFns.js +323 -0
  128. package/dist/api/brep-operations/sweepFns.js.map +1 -0
  129. package/dist/api/brep-operations/threadFns.d.ts +83 -0
  130. package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
  131. package/dist/api/brep-operations/threadFns.js +138 -0
  132. package/dist/api/brep-operations/threadFns.js.map +1 -0
  133. package/dist/api/brep-operations/topologyFns.d.ts +111 -0
  134. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
  135. package/dist/api/brep-operations/topologyFns.js +300 -0
  136. package/dist/api/brep-operations/topologyFns.js.map +1 -0
  137. package/dist/api/brep-topology.d.ts +1 -1
  138. package/dist/api/brep-topology.d.ts.map +1 -1
  139. package/dist/api/brep-topology.js +1 -1
  140. package/dist/api/brep-topology.js.map +1 -1
  141. package/dist/api/brepjs-compat/index.d.ts +1 -1
  142. package/dist/api/brepjs-compat/index.js +3 -3
  143. package/dist/api/brepjs-compat/index.js.map +1 -1
  144. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
  145. package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
  146. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
  147. package/dist/api/chamfer.d.ts +5 -4
  148. package/dist/api/chamfer.d.ts.map +1 -1
  149. package/dist/api/chamfer.js +12 -11
  150. package/dist/api/chamfer.js.map +1 -1
  151. package/dist/api/curve-sketch/index.d.ts +235 -0
  152. package/dist/api/curve-sketch/index.d.ts.map +1 -0
  153. package/dist/api/curve-sketch/index.js +493 -0
  154. package/dist/api/curve-sketch/index.js.map +1 -0
  155. package/dist/api/draft.d.ts.map +1 -1
  156. package/dist/api/draft.js +1 -3
  157. package/dist/api/draft.js.map +1 -1
  158. package/dist/api/engrave.d.ts.map +1 -1
  159. package/dist/api/engrave.js +6 -15
  160. package/dist/api/engrave.js.map +1 -1
  161. package/dist/api/export-3mf.d.ts +73 -0
  162. package/dist/api/export-3mf.d.ts.map +1 -0
  163. package/dist/api/export-3mf.js +121 -0
  164. package/dist/api/export-3mf.js.map +1 -0
  165. package/dist/api/export-brep.d.ts +47 -0
  166. package/dist/api/export-brep.d.ts.map +1 -0
  167. package/dist/api/export-brep.js +67 -0
  168. package/dist/api/export-brep.js.map +1 -0
  169. package/dist/api/export-step.d.ts +67 -0
  170. package/dist/api/export-step.d.ts.map +1 -0
  171. package/dist/api/export-step.js +98 -0
  172. package/dist/api/export-step.js.map +1 -0
  173. package/dist/api/export-stl.d.ts +58 -0
  174. package/dist/api/export-stl.d.ts.map +1 -0
  175. package/dist/api/export-stl.js +114 -0
  176. package/dist/api/export-stl.js.map +1 -0
  177. package/dist/api/extrude.d.ts +8 -11
  178. package/dist/api/extrude.d.ts.map +1 -1
  179. package/dist/api/extrude.js +11 -14
  180. package/dist/api/extrude.js.map +1 -1
  181. package/dist/api/feature-repair.d.ts +1 -1
  182. package/dist/api/feature-repair.d.ts.map +1 -1
  183. package/dist/api/feature-repair.js +1 -7
  184. package/dist/api/feature-repair.js.map +1 -1
  185. package/dist/api/fillet-variable.d.ts +2 -2
  186. package/dist/api/fillet-variable.d.ts.map +1 -1
  187. package/dist/api/fillet-variable.js +2 -3
  188. package/dist/api/fillet-variable.js.map +1 -1
  189. package/dist/api/fillet.d.ts +5 -7
  190. package/dist/api/fillet.d.ts.map +1 -1
  191. package/dist/api/fillet.js +5 -8
  192. package/dist/api/fillet.js.map +1 -1
  193. package/dist/api/generated/2d.d.ts +4 -0
  194. package/dist/api/generated/2d.d.ts.map +1 -1
  195. package/dist/api/generated/2d.js +4 -0
  196. package/dist/api/generated/2d.js.map +1 -1
  197. package/dist/api/generated/core.d.ts +4 -0
  198. package/dist/api/generated/core.d.ts.map +1 -1
  199. package/dist/api/generated/core.js +4 -0
  200. package/dist/api/generated/core.js.map +1 -1
  201. package/dist/api/generated/gear.d.ts +4 -0
  202. package/dist/api/generated/gear.d.ts.map +1 -1
  203. package/dist/api/generated/gear.js +4 -0
  204. package/dist/api/generated/gear.js.map +1 -1
  205. package/dist/api/generated/io.d.ts +4 -0
  206. package/dist/api/generated/io.d.ts.map +1 -1
  207. package/dist/api/generated/io.js +4 -0
  208. package/dist/api/generated/io.js.map +1 -1
  209. package/dist/api/generated/kernel.d.ts +4 -0
  210. package/dist/api/generated/kernel.d.ts.map +1 -1
  211. package/dist/api/generated/kernel.js +4 -0
  212. package/dist/api/generated/kernel.js.map +1 -1
  213. package/dist/api/generated/measurement.d.ts +21 -21
  214. package/dist/api/generated/measurement.d.ts.map +1 -1
  215. package/dist/api/generated/measurement.js +25 -21
  216. package/dist/api/generated/measurement.js.map +1 -1
  217. package/dist/api/generated/ns.d.ts +4 -0
  218. package/dist/api/generated/ns.d.ts.map +1 -1
  219. package/dist/api/generated/ns.js +4 -0
  220. package/dist/api/generated/ns.js.map +1 -1
  221. package/dist/api/generated/operations.d.ts +32 -32
  222. package/dist/api/generated/operations.d.ts.map +1 -1
  223. package/dist/api/generated/operations.js +58 -54
  224. package/dist/api/generated/operations.js.map +1 -1
  225. package/dist/api/generated/projection.d.ts +4 -0
  226. package/dist/api/generated/projection.d.ts.map +1 -1
  227. package/dist/api/generated/projection.js +4 -0
  228. package/dist/api/generated/projection.js.map +1 -1
  229. package/dist/api/generated/query.d.ts +4 -0
  230. package/dist/api/generated/query.d.ts.map +1 -1
  231. package/dist/api/generated/query.js +4 -0
  232. package/dist/api/generated/query.js.map +1 -1
  233. package/dist/api/generated/script-face-manifest.d.ts +1 -1
  234. package/dist/api/generated/script-face-manifest.js +3 -3
  235. package/dist/api/generated/script-face-manifest.js.map +1 -1
  236. package/dist/api/generated/script-face.d.ts +1 -1
  237. package/dist/api/generated/script-face.js +1 -1
  238. package/dist/api/generated/script-face.js.map +1 -1
  239. package/dist/api/generated/sketching.d.ts +2 -2
  240. package/dist/api/generated/sketching.d.ts.map +1 -1
  241. package/dist/api/generated/sketching.js +8 -4
  242. package/dist/api/generated/sketching.js.map +1 -1
  243. package/dist/api/generated/text.d.ts +4 -0
  244. package/dist/api/generated/text.d.ts.map +1 -1
  245. package/dist/api/generated/text.js +4 -0
  246. package/dist/api/generated/text.js.map +1 -1
  247. package/dist/api/generated/topology.d.ts +45 -45
  248. package/dist/api/generated/topology.d.ts.map +1 -1
  249. package/dist/api/generated/topology.js +77 -73
  250. package/dist/api/generated/topology.js.map +1 -1
  251. package/dist/api/generated/view.d.ts +4 -0
  252. package/dist/api/generated/view.d.ts.map +1 -1
  253. package/dist/api/generated/view.js +4 -0
  254. package/dist/api/generated/view.js.map +1 -1
  255. package/dist/api/geom-types/constants.d.ts +11 -0
  256. package/dist/api/geom-types/constants.d.ts.map +1 -0
  257. package/dist/api/geom-types/constants.js +11 -0
  258. package/dist/api/geom-types/constants.js.map +1 -0
  259. package/dist/api/geom-types/index.d.ts +21 -0
  260. package/dist/api/geom-types/index.d.ts.map +1 -0
  261. package/dist/api/geom-types/index.js +22 -0
  262. package/dist/api/geom-types/index.js.map +1 -0
  263. package/dist/api/geom-types/planeOps.d.ts +98 -0
  264. package/dist/api/geom-types/planeOps.d.ts.map +1 -0
  265. package/dist/api/geom-types/planeOps.js +170 -0
  266. package/dist/api/geom-types/planeOps.js.map +1 -0
  267. package/dist/api/geom-types/planeTypes.d.ts +24 -0
  268. package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
  269. package/dist/api/geom-types/planeTypes.js +8 -0
  270. package/dist/api/geom-types/planeTypes.js.map +1 -0
  271. package/dist/api/geom-types/types.d.ts +64 -0
  272. package/dist/api/geom-types/types.d.ts.map +1 -0
  273. package/dist/api/geom-types/types.js +48 -0
  274. package/dist/api/geom-types/types.js.map +1 -0
  275. package/dist/api/geom-types/vecOps.d.ts +124 -0
  276. package/dist/api/geom-types/vecOps.d.ts.map +1 -0
  277. package/dist/api/geom-types/vecOps.js +202 -0
  278. package/dist/api/geom-types/vecOps.js.map +1 -0
  279. package/dist/api/geom.d.ts.map +1 -1
  280. package/dist/api/geom.js +6 -5
  281. package/dist/api/geom.js.map +1 -1
  282. package/dist/api/half-space.d.ts +56 -0
  283. package/dist/api/half-space.d.ts.map +1 -0
  284. package/dist/api/half-space.js +82 -0
  285. package/dist/api/half-space.js.map +1 -0
  286. package/dist/api/helix.d.ts +11 -2
  287. package/dist/api/helix.d.ts.map +1 -1
  288. package/dist/api/helix.js +20 -4
  289. package/dist/api/helix.js.map +1 -1
  290. package/dist/api/index.d.ts +19 -7
  291. package/dist/api/index.d.ts.map +1 -1
  292. package/dist/api/index.js +44 -11
  293. package/dist/api/index.js.map +1 -1
  294. package/dist/api/internal/compat-op.d.ts +10 -36
  295. package/dist/api/internal/compat-op.d.ts.map +1 -1
  296. package/dist/api/internal/compat-op.js +17 -51
  297. package/dist/api/internal/compat-op.js.map +1 -1
  298. package/dist/api/internal/compat-projection.d.ts +5 -5
  299. package/dist/api/internal/compat-projection.js +5 -5
  300. package/dist/api/internal/compat-projection.js.map +1 -1
  301. package/dist/api/internal/dual-form-args.d.ts +0 -2
  302. package/dist/api/internal/dual-form-args.d.ts.map +1 -1
  303. package/dist/api/internal/dual-form-args.js +1 -3
  304. package/dist/api/internal/dual-form-args.js.map +1 -1
  305. package/dist/api/internal/export-members.d.ts +80 -0
  306. package/dist/api/internal/export-members.d.ts.map +1 -0
  307. package/dist/api/internal/export-members.js +104 -0
  308. package/dist/api/internal/export-members.js.map +1 -0
  309. package/dist/api/internal/l3-bridge.d.ts +22 -37
  310. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  311. package/dist/api/internal/l3-bridge.js +30 -77
  312. package/dist/api/internal/l3-bridge.js.map +1 -1
  313. package/dist/api/internal/profile-wire.d.ts +1 -1
  314. package/dist/api/internal/profile-wire.js +1 -1
  315. package/dist/api/internal/profile-wire.js.map +1 -1
  316. package/dist/api/internal/result-unwrap.d.ts +4 -6
  317. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  318. package/dist/api/internal/result-unwrap.js +4 -6
  319. package/dist/api/internal/result-unwrap.js.map +1 -1
  320. package/dist/api/knurl.d.ts.map +1 -1
  321. package/dist/api/knurl.js +5 -3
  322. package/dist/api/knurl.js.map +1 -1
  323. package/dist/api/loft.d.ts +2 -2
  324. package/dist/api/loft.d.ts.map +1 -1
  325. package/dist/api/loft.js +2 -2
  326. package/dist/api/loft.js.map +1 -1
  327. package/dist/api/measure-query/index.d.ts +262 -0
  328. package/dist/api/measure-query/index.d.ts.map +1 -0
  329. package/dist/api/measure-query/index.js +390 -0
  330. package/dist/api/measure-query/index.js.map +1 -0
  331. package/dist/api/measurement/index.d.ts +3 -3
  332. package/dist/api/measurement/index.js +3 -3
  333. package/dist/api/measurement/index.js.map +1 -1
  334. package/dist/api/meta.d.ts +0 -2
  335. package/dist/api/meta.d.ts.map +1 -1
  336. package/dist/api/meta.js +0 -2
  337. package/dist/api/meta.js.map +1 -1
  338. package/dist/api/offset2d.d.ts +49 -0
  339. package/dist/api/offset2d.d.ts.map +1 -0
  340. package/dist/api/offset2d.js +86 -0
  341. package/dist/api/offset2d.js.map +1 -0
  342. package/dist/api/pattern.d.ts.map +1 -1
  343. package/dist/api/pattern.js +3 -6
  344. package/dist/api/pattern.js.map +1 -1
  345. package/dist/api/primitives.d.ts +6 -6
  346. package/dist/api/primitives.d.ts.map +1 -1
  347. package/dist/api/primitives.js +19 -17
  348. package/dist/api/primitives.js.map +1 -1
  349. package/dist/api/profile.d.ts.map +1 -1
  350. package/dist/api/profile.js +0 -1
  351. package/dist/api/profile.js.map +1 -1
  352. package/dist/api/punch-hole.d.ts.map +1 -1
  353. package/dist/api/punch-hole.js +0 -1
  354. package/dist/api/punch-hole.js.map +1 -1
  355. package/dist/api/replicate.d.ts +6 -8
  356. package/dist/api/replicate.d.ts.map +1 -1
  357. package/dist/api/replicate.js +27 -65
  358. package/dist/api/replicate.js.map +1 -1
  359. package/dist/api/result.d.ts +1 -1
  360. package/dist/api/result.js +1 -1
  361. package/dist/api/result.js.map +1 -1
  362. package/dist/api/revolve.d.ts +2 -2
  363. package/dist/api/revolve.js +3 -3
  364. package/dist/api/revolve.js.map +1 -1
  365. package/dist/api/screw.d.ts +1 -1
  366. package/dist/api/screw.d.ts.map +1 -1
  367. package/dist/api/screw.js +5 -4
  368. package/dist/api/screw.js.map +1 -1
  369. package/dist/api/sdf.d.ts.map +1 -1
  370. package/dist/api/sdf.js +3 -2
  371. package/dist/api/sdf.js.map +1 -1
  372. package/dist/api/section-by-plane.d.ts.map +1 -1
  373. package/dist/api/section-by-plane.js +0 -1
  374. package/dist/api/section-by-plane.js.map +1 -1
  375. package/dist/api/shape-type/index.d.ts +141 -0
  376. package/dist/api/shape-type/index.d.ts.map +1 -0
  377. package/dist/api/shape-type/index.js +182 -0
  378. package/dist/api/shape-type/index.js.map +1 -0
  379. package/dist/api/shell.d.ts +2 -2
  380. package/dist/api/shell.d.ts.map +1 -1
  381. package/dist/api/shell.js +12 -3
  382. package/dist/api/shell.js.map +1 -1
  383. package/dist/api/sketch-on-face.d.ts +3 -3
  384. package/dist/api/sketch-on-face.d.ts.map +1 -1
  385. package/dist/api/sketch-on-face.js +6 -4
  386. package/dist/api/sketch-on-face.js.map +1 -1
  387. package/dist/api/sketch-on-plane.d.ts.map +1 -1
  388. package/dist/api/sketch-on-plane.js +0 -1
  389. package/dist/api/sketch-on-plane.js.map +1 -1
  390. package/dist/api/solid-from-faces.d.ts +45 -0
  391. package/dist/api/solid-from-faces.d.ts.map +1 -0
  392. package/dist/api/solid-from-faces.js +72 -0
  393. package/dist/api/solid-from-faces.js.map +1 -0
  394. package/dist/api/solid-offset/index.d.ts +67 -0
  395. package/dist/api/solid-offset/index.d.ts.map +1 -0
  396. package/dist/api/solid-offset/index.js +132 -0
  397. package/dist/api/solid-offset/index.js.map +1 -0
  398. package/dist/api/split-by-plane.d.ts.map +1 -1
  399. package/dist/api/split-by-plane.js +0 -1
  400. package/dist/api/split-by-plane.js.map +1 -1
  401. package/dist/api/split.d.ts +1 -1
  402. package/dist/api/split.js +1 -1
  403. package/dist/api/split.js.map +1 -1
  404. package/dist/api/surface/arg-spec.d.ts +37 -44
  405. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  406. package/dist/api/surface/arg-spec.js +224 -233
  407. package/dist/api/surface/arg-spec.js.map +1 -1
  408. package/dist/api/surface-face/index.d.ts +104 -0
  409. package/dist/api/surface-face/index.d.ts.map +1 -0
  410. package/dist/api/surface-face/index.js +217 -0
  411. package/dist/api/surface-face/index.js.map +1 -0
  412. package/dist/api/surface.d.ts +44 -0
  413. package/dist/api/surface.d.ts.map +1 -0
  414. package/dist/api/surface.js +66 -0
  415. package/dist/api/surface.js.map +1 -0
  416. package/dist/api/sweep.d.ts +71 -9
  417. package/dist/api/sweep.d.ts.map +1 -1
  418. package/dist/api/sweep.js +13 -6
  419. package/dist/api/sweep.js.map +1 -1
  420. package/dist/api/thicken.d.ts +1 -1
  421. package/dist/api/thicken.d.ts.map +1 -1
  422. package/dist/api/thicken.js +12 -3
  423. package/dist/api/thicken.js.map +1 -1
  424. package/dist/api/transform.d.ts +8 -8
  425. package/dist/api/transform.d.ts.map +1 -1
  426. package/dist/api/transform.js +58 -27
  427. package/dist/api/transform.js.map +1 -1
  428. package/dist/api/view/cameraFns.d.ts +1 -1
  429. package/dist/api/view/cameraFns.d.ts.map +1 -1
  430. package/dist/api/view/cameraFns.js +1 -1
  431. package/dist/api/view/cameraFns.js.map +1 -1
  432. package/dist/api/view/index.d.ts +0 -2
  433. package/dist/api/view/index.d.ts.map +1 -1
  434. package/dist/api/view/index.js +0 -2
  435. package/dist/api/view/index.js.map +1 -1
  436. package/dist/api/view/projectionPlanes.d.ts +1 -1
  437. package/dist/api/view/projectionPlanes.d.ts.map +1 -1
  438. package/dist/api/view/projectionPlanes.js.map +1 -1
  439. package/dist/api/view/view-camera.d.ts +7 -9
  440. package/dist/api/view/view-camera.d.ts.map +1 -1
  441. package/dist/api/view/view-camera.js +4 -6
  442. package/dist/api/view/view-camera.js.map +1 -1
  443. package/dist/api/view/view-projection.d.ts +0 -2
  444. package/dist/api/view/view-projection.d.ts.map +1 -1
  445. package/dist/api/view/view-projection.js +0 -2
  446. package/dist/api/view/view-projection.js.map +1 -1
  447. package/dist/api/view/view-sheet.d.ts +0 -2
  448. package/dist/api/view/view-sheet.d.ts.map +1 -1
  449. package/dist/api/view/view-sheet.js +0 -2
  450. package/dist/api/view/view-sheet.js.map +1 -1
  451. package/dist/api/view-export/index.d.ts +97 -0
  452. package/dist/api/view-export/index.d.ts.map +1 -0
  453. package/dist/api/view-export/index.js +118 -0
  454. package/dist/api/view-export/index.js.map +1 -0
  455. package/dist/boolean/index.d.ts +23 -0
  456. package/dist/boolean/index.d.ts.map +1 -0
  457. package/dist/boolean/index.js +27 -0
  458. package/dist/boolean/index.js.map +1 -0
  459. package/dist/brep/brep-chain.d.ts +1 -19
  460. package/dist/brep/brep-chain.d.ts.map +1 -1
  461. package/dist/brep/brep-chain.js +0 -1
  462. package/dist/brep/brep-chain.js.map +1 -1
  463. package/dist/brep/brep-ops.d.ts +93 -2
  464. package/dist/brep/brep-ops.d.ts.map +1 -1
  465. package/dist/brep/brep-ops.js +185 -15
  466. package/dist/brep/brep-ops.js.map +1 -1
  467. package/dist/brep/brep-topology.d.ts +20 -0
  468. package/dist/brep/brep-topology.d.ts.map +1 -1
  469. package/dist/brep/brep-topology.js +46 -0
  470. package/dist/brep/brep-topology.js.map +1 -1
  471. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  472. package/dist/brep/engine/adapters/brep-mock.js +0 -3
  473. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  474. package/dist/brep/engine/adapters/brepkit.d.ts +4 -3
  475. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  476. package/dist/brep/engine/adapters/brepkit.js +4 -98
  477. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  478. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  479. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  480. package/dist/brep/engine/adapters/occt.js +4 -148
  481. package/dist/brep/engine/adapters/occt.js.map +1 -1
  482. package/dist/brep/engine/native-history.d.ts +27 -0
  483. package/dist/brep/engine/native-history.d.ts.map +1 -0
  484. package/dist/brep/engine/native-history.js +54 -0
  485. package/dist/brep/engine/native-history.js.map +1 -0
  486. package/dist/brep/engine/primitives.d.ts +2 -3
  487. package/dist/brep/engine/primitives.d.ts.map +1 -1
  488. package/dist/brep/engine/primitives.js +1 -2
  489. package/dist/brep/engine/primitives.js.map +1 -1
  490. package/dist/brep/engine/registry.d.ts +3 -5
  491. package/dist/brep/engine/registry.d.ts.map +1 -1
  492. package/dist/brep/engine/registry.js +2 -2
  493. package/dist/brep/engine/registry.js.map +1 -1
  494. package/dist/brep/engine/types.d.ts +35 -77
  495. package/dist/brep/engine/types.d.ts.map +1 -1
  496. package/dist/brep/engine/types.js.map +1 -1
  497. package/dist/brep/export/export-model.d.ts +21 -0
  498. package/dist/brep/export/export-model.d.ts.map +1 -1
  499. package/dist/brep/export/export-model.js +171 -73
  500. package/dist/brep/export/export-model.js.map +1 -1
  501. package/dist/brep/export/step.d.ts +17 -1
  502. package/dist/brep/export/step.d.ts.map +1 -1
  503. package/dist/brep/export/step.js +133 -0
  504. package/dist/brep/export/step.js.map +1 -1
  505. package/dist/brep/export/stl.d.ts +22 -1
  506. package/dist/brep/export/stl.d.ts.map +1 -1
  507. package/dist/brep/export/stl.js +58 -10
  508. package/dist/brep/export/stl.js.map +1 -1
  509. package/dist/brep/export/transform12.d.ts +47 -0
  510. package/dist/brep/export/transform12.d.ts.map +1 -0
  511. package/dist/brep/export/transform12.js +87 -0
  512. package/dist/brep/export/transform12.js.map +1 -0
  513. package/dist/brep/face-evolution.d.ts +53 -0
  514. package/dist/brep/face-evolution.d.ts.map +1 -1
  515. package/dist/brep/face-evolution.js +65 -0
  516. package/dist/brep/face-evolution.js.map +1 -1
  517. package/dist/brep/handle-bridge.d.ts +2 -2
  518. package/dist/brep/handle-bridge.js +2 -2
  519. package/dist/brep/handle-bridge.js.map +1 -1
  520. package/dist/brep/index.d.ts +6 -3
  521. package/dist/brep/index.d.ts.map +1 -1
  522. package/dist/brep/index.js +6 -3
  523. package/dist/brep/index.js.map +1 -1
  524. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  525. package/dist/brepkit-kernel/brepkitKernel.js +2 -2
  526. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  527. package/dist/browser-host/index.d.ts +4 -1
  528. package/dist/browser-host/index.d.ts.map +1 -1
  529. package/dist/browser-host/index.js +7 -1
  530. package/dist/browser-host/index.js.map +1 -1
  531. package/dist/browser.d.ts +5 -9
  532. package/dist/browser.d.ts.map +1 -1
  533. package/dist/browser.js +5 -26
  534. package/dist/browser.js.map +1 -1
  535. package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
  536. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  537. package/dist/cad-runtime/admit-compat-lib.js +3 -9
  538. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  539. package/dist/cad-runtime/backend-dispatch.d.ts +13 -58
  540. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  541. package/dist/cad-runtime/backend-dispatch.js +34 -83
  542. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  543. package/dist/cad-runtime/content-key.d.ts +3 -3
  544. package/dist/cad-runtime/content-key.js +3 -3
  545. package/dist/cad-runtime/content-key.js.map +1 -1
  546. package/dist/cad-runtime/direct-executor.d.ts +6 -3
  547. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  548. package/dist/cad-runtime/direct-executor.js +31 -9
  549. package/dist/cad-runtime/direct-executor.js.map +1 -1
  550. package/dist/cad-runtime/interp/env.d.ts +1 -1
  551. package/dist/cad-runtime/interp/env.js.map +1 -1
  552. package/dist/cad-runtime/lib-id.d.ts +0 -2
  553. package/dist/cad-runtime/lib-id.d.ts.map +1 -1
  554. package/dist/cad-runtime/lib-id.js +0 -2
  555. package/dist/cad-runtime/lib-id.js.map +1 -1
  556. package/dist/cad-runtime/live-shapes.d.ts +3 -5
  557. package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
  558. package/dist/cad-runtime/live-shapes.js +8 -10
  559. package/dist/cad-runtime/live-shapes.js.map +1 -1
  560. package/dist/cad-runtime/ports.d.ts +31 -3
  561. package/dist/cad-runtime/ports.d.ts.map +1 -1
  562. package/dist/cad-runtime/ports.js.map +1 -1
  563. package/dist/cad-runtime/runtime.d.ts +54 -19
  564. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  565. package/dist/cad-runtime/runtime.js +89 -54
  566. package/dist/cad-runtime/runtime.js.map +1 -1
  567. package/dist/define-op.d.ts +10 -14
  568. package/dist/define-op.d.ts.map +1 -1
  569. package/dist/define-op.js +5 -22
  570. package/dist/define-op.js.map +1 -1
  571. package/dist/env-agnostic.d.ts +2 -2
  572. package/dist/env-agnostic.d.ts.map +1 -1
  573. package/dist/env-agnostic.js +1 -1
  574. package/dist/env-agnostic.js.map +1 -1
  575. package/dist/geometry2d/bridge/plane.d.ts +1 -1
  576. package/dist/geometry2d/bridge/plane.js +1 -1
  577. package/dist/geometry2d/bridge/plane.js.map +1 -1
  578. package/dist/geometry2d/curve2d.d.ts +1 -1
  579. package/dist/geometry2d/curve2d.js +1 -1
  580. package/dist/geometry2d/curve2d.js.map +1 -1
  581. package/dist/index.d.ts +14 -65
  582. package/dist/index.d.ts.map +1 -1
  583. package/dist/index.js +18 -70
  584. package/dist/index.js.map +1 -1
  585. package/dist/io/fai-zip/container-read.d.ts +16 -0
  586. package/dist/io/fai-zip/container-read.d.ts.map +1 -1
  587. package/dist/io/fai-zip/container-read.js +22 -0
  588. package/dist/io/fai-zip/container-read.js.map +1 -1
  589. package/dist/io/fai-zip/index.d.ts +1 -1
  590. package/dist/io/fai-zip/index.d.ts.map +1 -1
  591. package/dist/io/fai-zip/index.js +1 -1
  592. package/dist/io/fai-zip/index.js.map +1 -1
  593. package/dist/lang/code-to-args.d.ts.map +1 -1
  594. package/dist/lang/code-to-args.js +10 -1
  595. package/dist/lang/code-to-args.js.map +1 -1
  596. package/dist/lang/determinism-scanner.d.ts.map +1 -1
  597. package/dist/lang/determinism-scanner.js +22 -9
  598. package/dist/lang/determinism-scanner.js.map +1 -1
  599. package/dist/lang/metadata-extractor.d.ts +27 -6
  600. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  601. package/dist/lang/metadata-extractor.js +88 -8
  602. package/dist/lang/metadata-extractor.js.map +1 -1
  603. package/dist/lang/parse-error.d.ts +4 -0
  604. package/dist/lang/parse-error.d.ts.map +1 -1
  605. package/dist/lang/parse-error.js.map +1 -1
  606. package/dist/lang/security-scanner.d.ts +27 -2
  607. package/dist/lang/security-scanner.d.ts.map +1 -1
  608. package/dist/lang/security-scanner.js +29 -2
  609. package/dist/lang/security-scanner.js.map +1 -1
  610. package/dist/lang/source-edit.d.ts +2 -2
  611. package/dist/lang/source-edit.js.map +1 -1
  612. package/dist/lang/symbol-table.generated.d.ts +53 -0
  613. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  614. package/dist/lang/symbol-table.generated.js +53 -0
  615. package/dist/lang/symbol-table.generated.js.map +1 -1
  616. package/dist/mesh/import-model.d.ts +94 -0
  617. package/dist/mesh/import-model.d.ts.map +1 -0
  618. package/dist/mesh/import-model.js +15 -0
  619. package/dist/mesh/import-model.js.map +1 -0
  620. package/dist/mesh/index.d.ts +19 -63
  621. package/dist/mesh/index.d.ts.map +1 -1
  622. package/dist/mesh/index.js +19 -72
  623. package/dist/mesh/index.js.map +1 -1
  624. package/dist/mesh/io.d.ts +62 -17
  625. package/dist/mesh/io.d.ts.map +1 -1
  626. package/dist/mesh/io.js +210 -41
  627. package/dist/mesh/io.js.map +1 -1
  628. package/dist/mesh/primitives.js +1 -1
  629. package/dist/mesh/primitives.js.map +1 -1
  630. package/dist/mesh/threemf-bambu.d.ts +12 -1
  631. package/dist/mesh/threemf-bambu.d.ts.map +1 -1
  632. package/dist/mesh/threemf-bambu.js +68 -16
  633. package/dist/mesh/threemf-bambu.js.map +1 -1
  634. package/dist/mesh/threemf-loader.d.ts +52 -5
  635. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  636. package/dist/mesh/threemf-loader.js +139 -41
  637. package/dist/mesh/threemf-loader.js.map +1 -1
  638. package/dist/mesh/transform.d.ts +1 -1
  639. package/dist/mesh/transform.js +1 -1
  640. package/dist/mesh/transform.js.map +1 -1
  641. package/dist/mesh/types.d.ts +35 -5
  642. package/dist/mesh/types.d.ts.map +1 -1
  643. package/dist/mesh/types.js.map +1 -1
  644. package/dist/node-host/cli.d.ts +49 -1
  645. package/dist/node-host/cli.d.ts.map +1 -1
  646. package/dist/node-host/cli.js +125 -19
  647. package/dist/node-host/cli.js.map +1 -1
  648. package/dist/node-host/execute-script.d.ts +56 -0
  649. package/dist/node-host/execute-script.d.ts.map +1 -0
  650. package/dist/node-host/execute-script.js +47 -0
  651. package/dist/node-host/execute-script.js.map +1 -0
  652. package/dist/node-host/index.d.ts +1 -0
  653. package/dist/node-host/index.d.ts.map +1 -1
  654. package/dist/node-host/index.js +4 -0
  655. package/dist/node-host/index.js.map +1 -1
  656. package/dist/node.d.ts +2 -0
  657. package/dist/node.d.ts.map +1 -1
  658. package/dist/node.js +3 -0
  659. package/dist/node.js.map +1 -1
  660. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
  661. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
  662. package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
  663. package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
  664. package/dist/occt-kernel/hullGeometry.d.ts +2 -2
  665. package/dist/occt-kernel/hullGeometry.js +2 -3
  666. package/dist/occt-kernel/hullGeometry.js.map +1 -1
  667. package/dist/occt-kernel/hullOps.d.ts +3 -3
  668. package/dist/occt-kernel/hullOps.js +4 -4
  669. package/dist/occt-kernel/hullOps.js.map +1 -1
  670. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  671. package/dist/occt-kernel/occt-primitives.js +31 -4
  672. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  673. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  674. package/dist/occt-kernel/occtKernel.js +18 -0
  675. package/dist/occt-kernel/occtKernel.js.map +1 -1
  676. package/dist/occt-scan/recognize.d.ts +58 -0
  677. package/dist/occt-scan/recognize.d.ts.map +1 -0
  678. package/dist/occt-scan/recognize.js +216 -0
  679. package/dist/occt-scan/recognize.js.map +1 -0
  680. package/dist/primitives/brep-primitives.js +7 -7
  681. package/dist/primitives/brep-primitives.js.map +1 -1
  682. package/dist/primitives/index.d.ts +19 -0
  683. package/dist/primitives/index.d.ts.map +1 -0
  684. package/dist/primitives/index.js +21 -0
  685. package/dist/primitives/index.js.map +1 -0
  686. package/dist/result/bug.d.ts +1 -1
  687. package/dist/result/bug.js +1 -1
  688. package/dist/result/bug.js.map +1 -1
  689. package/dist/result/errors.d.ts +2 -2
  690. package/dist/result/errors.d.ts.map +1 -1
  691. package/dist/result/errors.js +1 -1
  692. package/dist/result/errors.js.map +1 -1
  693. package/dist/result/vec3.d.ts +1 -1
  694. package/dist/result/vec3.js +1 -1
  695. package/dist/result/vec3.js.map +1 -1
  696. package/dist/runtime-state.d.ts +79 -29
  697. package/dist/runtime-state.d.ts.map +1 -1
  698. package/dist/runtime-state.js +84 -0
  699. package/dist/runtime-state.js.map +1 -1
  700. package/dist/script-globals.d.ts +24 -0
  701. package/dist/script-globals.d.ts.map +1 -0
  702. package/dist/script-globals.js +24 -0
  703. package/dist/script-globals.js.map +1 -0
  704. package/dist/sdf/index.d.ts +12 -0
  705. package/dist/sdf/index.d.ts.map +1 -0
  706. package/dist/sdf/index.js +13 -0
  707. package/dist/sdf/index.js.map +1 -0
  708. package/dist/sdk.d.ts +0 -1
  709. package/dist/sdk.d.ts.map +1 -1
  710. package/dist/sdk.js.map +1 -1
  711. package/dist/shape.d.ts +24 -0
  712. package/dist/shape.d.ts.map +1 -1
  713. package/dist/shape.js +40 -0
  714. package/dist/shape.js.map +1 -1
  715. package/dist/topology/naming/lineage.d.ts +3 -2
  716. package/dist/topology/naming/lineage.d.ts.map +1 -1
  717. package/dist/topology/naming/lineage.js.map +1 -1
  718. package/dist/weapp.d.ts +3 -3
  719. package/dist/weapp.d.ts.map +1 -1
  720. package/dist/weapp.js +2 -2
  721. package/dist/weapp.js.map +1 -1
  722. package/package.json +283 -44
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * BREP-TS compatibility surface (P21) — 2026-09-25 core-decouple rewrite.
3
3
  *
4
- * The vendored BREP TS tree (packages/brepjs) is deleted (裁决 9). Every
4
+ * The old BREP TS tree (packages/brepjs) is deleted (裁决 9). Every
5
5
  * op projection (primitives / booleans / evolutions / topology queries /
6
6
  * sketching DSL / raw 2D-morph ports) is gone with it — those symbols have no
7
7
  * receiver (裁决 1). What remains in this module is the ④ group only: the pure
@@ -11,8 +11,8 @@
11
11
  */
12
12
  // ─────────────────────────────────────────────────────────────────────────────
13
13
  // ④ combinators / pure helpers / types(2026-09-25 core-decouple:op 投影面
14
- // ① ② ③ ⑤ 已随 vendored 树删除;④ 全部为 core 内联实现,保留为本文件的
15
- // 唯一内容。vendored 句柄类型(Vertex/Edge/…/Shape3D/ValidSolid)随裁决 9 删除)
14
+ // ① ② ③ ⑤ 已随旧子包删除;④ 全部为 core 内联实现,保留为本文件的
15
+ // 唯一内容。旧句柄类型(Vertex/Edge/…/Shape3D/ValidSolid)随裁决 9 删除)
16
16
  // ─────────────────────────────────────────────────────────────────────────────
17
17
  export { ok, err, isOk, isErr, unwrap, unwrapOr, map, andThen, } from '../../result/result.js';
18
18
  export { vecAdd, vecSub, vecScale, vecDot, vecCross, vecLength, vecNormalize, } from './vecOps.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/brepjs-compat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,gFAAgF;AAChF,uEAAuE;AACvE,kDAAkD;AAClD,gEAAgE;AAChE,gFAAgF;AAEhF,OAAO,EACL,EAAE,EACF,GAAG,EACH,IAAI,EACJ,KAAK,EACL,MAAM,EACN,QAAQ,EACR,GAAG,EACH,OAAO,GACR,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,MAAM,EACN,MAAM,EACN,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,SAAS,EACT,YAAY,GACb,MAAM,UAAU,CAAA;AAEjB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,YAAY,GACb,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAGlE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA","sourcesContent":["/**\n * BREP-TS compatibility surface (P21) — 2026-09-25 core-decouple rewrite.\n *\n * The vendored BREP TS tree (packages/brepjs) is deleted (裁决 9). Every\n * op projection (primitives / booleans / evolutions / topology queries /\n * sketching DSL / raw 2D-morph ports) is gone with it — those symbols have no\n * receiver (裁决 1). What remains in this module is the ④ group only: the pure\n * combinators / types inlined into core (§5.2) — Result, vectors, planes,\n * errors, constants — which stay flat-exported from the core facade for\n * library authors (import { ok, vecAdd } from '@faicad/faijs').\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ④ combinators / pure helpers / types(2026-09-25 core-decouple:op 投影面\n// ① ② ③ ⑤ 已随 vendored 树删除;④ 全部为 core 内联实现,保留为本文件的\n// 唯一内容。vendored 句柄类型(Vertex/Edge/…/Shape3D/ValidSolid)随裁决 9 删除)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport {\n ok,\n err,\n isOk,\n isErr,\n unwrap,\n unwrapOr,\n map,\n andThen,\n} from '../../result/result'\nexport type { Result, Ok, Err } from '../../result/result'\n\nexport {\n vecAdd,\n vecSub,\n vecScale,\n vecDot,\n vecCross,\n vecLength,\n vecNormalize,\n} from './vecOps'\n\nexport {\n createPlane,\n createNamedPlane,\n resolvePlane,\n} from './planeOps'\n\nexport { kernelError, validationError } from '../../result/errors'\nexport type { BrepError } from '../../result/errors'\n\nexport { DEG2RAD, RAD2DEG } from './constants'\n\nexport type { Plane, PlaneName, PlaneInput } from './planeTypes'\n\nexport type { Vec3, PointInput } from './types'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/brepjs-compat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,gFAAgF;AAChF,uEAAuE;AACvE,0CAA0C;AAC1C,wDAAwD;AACxD,gFAAgF;AAEhF,OAAO,EACL,EAAE,EACF,GAAG,EACH,IAAI,EACJ,KAAK,EACL,MAAM,EACN,QAAQ,EACR,GAAG,EACH,OAAO,GACR,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,MAAM,EACN,MAAM,EACN,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,SAAS,EACT,YAAY,GACb,MAAM,UAAU,CAAA;AAEjB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,YAAY,GACb,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAGlE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA","sourcesContent":["/**\n * BREP-TS compatibility surface (P21) — 2026-09-25 core-decouple rewrite.\n *\n * The old BREP TS tree (packages/brepjs) is deleted (裁决 9). Every\n * op projection (primitives / booleans / evolutions / topology queries /\n * sketching DSL / raw 2D-morph ports) is gone with it — those symbols have no\n * receiver (裁决 1). What remains in this module is the ④ group only: the pure\n * combinators / types inlined into core (§5.2) — Result, vectors, planes,\n * errors, constants — which stay flat-exported from the core facade for\n * library authors (import { ok, vecAdd } from '@faicad/faijs').\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ④ combinators / pure helpers / types(2026-09-25 core-decouple:op 投影面\n// ① ② ③ ⑤ 已随旧子包删除;④ 全部为 core 内联实现,保留为本文件的\n// 唯一内容。旧句柄类型(Vertex/Edge/…/Shape3D/ValidSolid)随裁决 9 删除)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport {\n ok,\n err,\n isOk,\n isErr,\n unwrap,\n unwrapOr,\n map,\n andThen,\n} from '../../result/result'\nexport type { Result, Ok, Err } from '../../result/result'\n\nexport {\n vecAdd,\n vecSub,\n vecScale,\n vecDot,\n vecCross,\n vecLength,\n vecNormalize,\n} from './vecOps'\n\nexport {\n createPlane,\n createNamedPlane,\n resolvePlane,\n} from './planeOps'\n\nexport { kernelError, validationError } from '../../result/errors'\nexport type { BrepError } from '../../result/errors'\n\nexport { DEG2RAD, RAD2DEG } from './constants'\n\nexport type { Plane, PlaneName, PlaneInput } from './planeTypes'\n\nexport type { Vec3, PointInput } from './types'\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"borrow-bridge.d.ts","sourceRoot":"","sources":["../../../src/api/cadquery-selectors/borrow-bridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAuB7C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,KAAK,CAgB7C"}
1
+ {"version":3,"file":"borrow-bridge.d.ts","sourceRoot":"","sources":["../../../src/api/cadquery-selectors/borrow-bridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAsB7C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,KAAK,CAgB7C"}
@@ -6,12 +6,11 @@
6
6
  */
7
7
  import { fromHandle } from '../../sdk.js';
8
8
  import { isShape } from '../../shape.js';
9
- // ── compatOp 提升边界归一(GOTCHA:borrowDeep 把实参 Shape 换成借用视图)──
9
+ // ── compatOp 提升边界归一(GOTCHA:compatOp 提升后实参形态可能变化)──
10
10
  //
11
11
  // 当 cq-compat 命名空间被 registerLib 提升(无 dual-op → autoLift=true)时,
12
- // 每个裸导出函数的实参先经 borrowDeep:faijs Shape → 借用 brepjs 视图
13
- // `{ wrapped, disposed, delete, onDispose }`(`isShape=false`、`brepOf=undefined`)。
14
- // 直接调用(测试进程内)拿到的则是真实 Shape。两个形态都必须能消费:
12
+ // 每个裸导出函数的实参经 compatOp 适配器传入。直接调用(测试进程内)拿到的
13
+ // 则是真实 Shape。两个形态都必须能消费:
15
14
  //
16
15
  // asBrepShape(v) —
17
16
  // - 真实 Shape → 原样返回;
@@ -1 +1 @@
1
- {"version":3,"file":"borrow-bridge.js","sourceRoot":"","sources":["../../../src/api/cadquery-selectors/borrow-bridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAGrC,2DAA2D;AAC3D,EAAE;AACF,gEAAgE;AAChE,qDAAqD;AACrD,kFAAkF;AAClF,uCAAuC;AACvC,EAAE;AACF,qBAAqB;AACrB,uBAAuB;AACvB,wDAAwD;AACxD,sDAAsD;AACtD,uBAAuB;AACvB,6BAA6B;AAC7B,EAAE;AACF,2DAA2D;AAC3D,uDAAuD;AACvD,oCAAoC;AACpC,mEAAmE;AACnE,oCAAoC;AACpC,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAAiB,CAAA;AAEvD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,CAAU;IACpC,IAAI,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAU,CAAA;IACjC,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,CAAyB,CAAA;QACtC,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,GAAG;YAAE,OAAO,GAAG,CAAA;QACnB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAA;QAC/B,MAAM,MAAM,GACV,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,IAAI,IAAI,UAAU;YACzE,CAAC,CAAE,UAA6B,CAAC,EAAE;YACnC,CAAC,CAAC,UAAU,CAAA;QAChB,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAU,CAAA;QACrC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAC/B,OAAO,CAAC,CAAA;IACV,CAAC;IACD,OAAO,CAAU,CAAA;AACnB,CAAC","sourcesContent":["/**\n * cadquery-selectors/borrow-bridge — compatOp 提升边界归一(等价搬运自 cq-compat)\n *\n * 原实现位于 `packages/faijs-cadquery/src/workplane.ts` 的 `asBrepShape`,本文件为\n * 原样搬运(仅 import 路径改为 core 内部相对路径),零逻辑改动。\n */\n\nimport { fromHandle } from '../../sdk'\nimport { isShape } from '../../shape'\nimport type { Shape } from '../../mesh/types'\n\n// ── compatOp 提升边界归一(GOTCHA:borrowDeep 把实参 Shape 换成借用视图)──\n//\n// 当 cq-compat 命名空间被 registerLib 提升(无 dual-op → autoLift=true)时,\n// 每个裸导出函数的实参先经 borrowDeep:faijs Shape → 借用 brepjs 视图\n// `{ wrapped, disposed, delete, onDispose }`(`isShape=false`、`brepOf=undefined`)。\n// 直接调用(测试进程内)拿到的则是真实 Shape。两个形态都必须能消费:\n//\n// asBrepShape(v) —\n// - 真实 Shape → 原样返回;\n// - 借用视图(有 `.wrapped`)→ 提取原始 OCCT 句柄,fromHandle 还原为真实\n// Shape(mesh 三角化 + BREP 身份槽登记,brepOf 可恢复),按视图对象缓存\n// (同句柄多次调用不重复三角化);\n// - 其余 → 原样返回(调用方自行判空/报错)。\n//\n// 所有权:归一出的新 Shape 与原 part Shape 的 slot 指向同一 OCCT 句柄,但 slot\n// 按 Shape 对象各自持有(fromBrep 写的是新 Shape 的 slot),无共享释放路径——\n// 与 core fromHandle 收编模式同构,不引入双重释放。\n// 视图 `.wrapped` 是 OcctWasmHandle 对象({ id, type, __occtWasm }),内核只收\n// 数字 id → 解包方式与 core fromHandle 一致。\nconst borrowedShapeCache = new WeakMap<object, Shape>()\n\n/**\n * 把可能是借用视图的几何输入归一为真实 faijs Shape(见上方注释)。\n * @param v 真实 Shape、借用视图(`{ wrapped }`)或其他原样透传的输入。\n * @returns 真实 faijs `Shape`(借用视图经 `fromHandle` 还原并缓存)。\n */\nexport function asBrepShape(v: unknown): Shape {\n if (isShape(v)) return v as Shape\n if (v !== null && typeof v === 'object' && 'wrapped' in v) {\n const view = v as { wrapped: unknown }\n const hit = borrowedShapeCache.get(view)\n if (hit) return hit\n const wrappedAny = view.wrapped\n const handle =\n typeof wrappedAny === 'object' && wrappedAny !== null && 'id' in wrappedAny\n ? (wrappedAny as { id: number }).id\n : wrappedAny\n const s = fromHandle(handle) as Shape\n borrowedShapeCache.set(view, s)\n return s\n }\n return v as Shape\n}"]}
1
+ {"version":3,"file":"borrow-bridge.js","sourceRoot":"","sources":["../../../src/api/cadquery-selectors/borrow-bridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAGrC,oDAAoD;AACpD,EAAE;AACF,gEAAgE;AAChE,4CAA4C;AAC5C,yBAAyB;AACzB,EAAE;AACF,qBAAqB;AACrB,uBAAuB;AACvB,wDAAwD;AACxD,sDAAsD;AACtD,uBAAuB;AACvB,6BAA6B;AAC7B,EAAE;AACF,2DAA2D;AAC3D,uDAAuD;AACvD,oCAAoC;AACpC,mEAAmE;AACnE,oCAAoC;AACpC,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAAiB,CAAA;AAEvD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,CAAU;IACpC,IAAI,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAU,CAAA;IACjC,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,CAAyB,CAAA;QACtC,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,GAAG;YAAE,OAAO,GAAG,CAAA;QACnB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAA;QAC/B,MAAM,MAAM,GACV,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,IAAI,IAAI,UAAU;YACzE,CAAC,CAAE,UAA6B,CAAC,EAAE;YACnC,CAAC,CAAC,UAAU,CAAA;QAChB,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAU,CAAA;QACrC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAC/B,OAAO,CAAC,CAAA;IACV,CAAC;IACD,OAAO,CAAU,CAAA;AACnB,CAAC","sourcesContent":["/**\n * cadquery-selectors/borrow-bridge — compatOp 提升边界归一(等价搬运自 cq-compat)\n *\n * 原实现位于 `packages/faijs-cadquery/src/workplane.ts` 的 `asBrepShape`,本文件为\n * 原样搬运(仅 import 路径改为 core 内部相对路径),零逻辑改动。\n */\n\nimport { fromHandle } from '../../sdk'\nimport { isShape } from '../../shape'\nimport type { Shape } from '../../mesh/types'\n\n// ── compatOp 提升边界归一(GOTCHA:compatOp 提升后实参形态可能变化)──\n//\n// 当 cq-compat 命名空间被 registerLib 提升(无 dual-op → autoLift=true)时,\n// 每个裸导出函数的实参经 compatOp 适配器传入。直接调用(测试进程内)拿到的\n// 则是真实 Shape。两个形态都必须能消费:\n//\n// asBrepShape(v) —\n// - 真实 Shape → 原样返回;\n// - 借用视图(有 `.wrapped`)→ 提取原始 OCCT 句柄,fromHandle 还原为真实\n// Shape(mesh 三角化 + BREP 身份槽登记,brepOf 可恢复),按视图对象缓存\n// (同句柄多次调用不重复三角化);\n// - 其余 → 原样返回(调用方自行判空/报错)。\n//\n// 所有权:归一出的新 Shape 与原 part Shape 的 slot 指向同一 OCCT 句柄,但 slot\n// 按 Shape 对象各自持有(fromBrep 写的是新 Shape 的 slot),无共享释放路径——\n// 与 core fromHandle 收编模式同构,不引入双重释放。\n// 视图 `.wrapped` 是 OcctWasmHandle 对象({ id, type, __occtWasm }),内核只收\n// 数字 id → 解包方式与 core fromHandle 一致。\nconst borrowedShapeCache = new WeakMap<object, Shape>()\n\n/**\n * 把可能是借用视图的几何输入归一为真实 faijs Shape(见上方注释)。\n * @param v 真实 Shape、借用视图(`{ wrapped }`)或其他原样透传的输入。\n * @returns 真实 faijs `Shape`(借用视图经 `fromHandle` 还原并缓存)。\n */\nexport function asBrepShape(v: unknown): Shape {\n if (isShape(v)) return v as Shape\n if (v !== null && typeof v === 'object' && 'wrapped' in v) {\n const view = v as { wrapped: unknown }\n const hit = borrowedShapeCache.get(view)\n if (hit) return hit\n const wrappedAny = view.wrapped\n const handle =\n typeof wrappedAny === 'object' && wrappedAny !== null && 'id' in wrappedAny\n ? (wrappedAny as { id: number }).id\n : wrappedAny\n const s = fromHandle(handle) as Shape\n borrowedShapeCache.set(view, s)\n return s\n }\n return v as Shape\n}"]}
@@ -1,11 +1,12 @@
1
1
  /**
2
- * api chamfer — chamfer 倒角库函数(BREP-only,directEdit 能力)
2
+ * api chamfer — chamfer 倒角库函数(BREP-only,directEdit 族)
3
3
  *
4
4
  * 平台分层(2026-09-26 B 批降级):**中立 op**(不再声明 `engines:['occt']`)。
5
- * equal 分支按引擎能力**静态定轨**(与 intersect 同构,读 `dispatchPath` 同源的能力集):
6
- * - occt(声明 `chamferWithHistory`)→ `chamferWithRoleTable`(→ face-evolution.ts 的
5
+ * equal 分支按引擎事实**静态定轨**(与 intersect 同构,读 `hasNativeHistory`——
6
+ * 引擎身份是唯一判据,没有能力集可读):
7
+ * - occt(原生有 `chamferWithHistory`)→ `chamferWithRoleTable`(→ face-evolution.ts 的
7
8
  * occt 原生 `chamferWithHistory`,D3 面演化 + roleTable 传播)——历史路径,不回退;
8
- * - brepkit(无 chamferWithHistory,但裸 `kernel.chamfer` 是真实现)→ L1 裸
9
+ * - brepkit(无 `chamferWithHistory`,但裸 `kernel.chamfer` 是真实现)→ L1 裸
9
10
  * `kernel.chamfer(solid, edges, width)`:几何正确,**无面演化、无 roleTable 传播**
10
11
  * (如实降级,不伪造恒等映射)。
11
12
  * distanceAngle / twoDistances 分支本就走 L1 `kernel.chamferDistAngle`(brepkit 真实现,
@@ -1 +1 @@
1
- {"version":3,"file":"chamfer.d.ts","sourceRoot":"","sources":["../../src/api/chamfer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAQ1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,KAAK,EAAe,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAUxE;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1C,IAAI,CA6CN;AAyCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,iBAAiB,EACtB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAgBxC;AAsKD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,OAAO;;CAclB,CAAA"}
1
+ {"version":3,"file":"chamfer.d.ts","sourceRoot":"","sources":["../../src/api/chamfer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAQ1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,KAAK,EAAe,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAUxE;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1C,IAAI,CA6CN;AAyCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,iBAAiB,EACtB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAgBxC;AAsKD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,OAAO;;CAclB,CAAA"}
@@ -1,11 +1,12 @@
1
1
  /**
2
- * api chamfer — chamfer 倒角库函数(BREP-only,directEdit 能力)
2
+ * api chamfer — chamfer 倒角库函数(BREP-only,directEdit 族)
3
3
  *
4
4
  * 平台分层(2026-09-26 B 批降级):**中立 op**(不再声明 `engines:['occt']`)。
5
- * equal 分支按引擎能力**静态定轨**(与 intersect 同构,读 `dispatchPath` 同源的能力集):
6
- * - occt(声明 `chamferWithHistory`)→ `chamferWithRoleTable`(→ face-evolution.ts 的
5
+ * equal 分支按引擎事实**静态定轨**(与 intersect 同构,读 `hasNativeHistory`——
6
+ * 引擎身份是唯一判据,没有能力集可读):
7
+ * - occt(原生有 `chamferWithHistory`)→ `chamferWithRoleTable`(→ face-evolution.ts 的
7
8
  * occt 原生 `chamferWithHistory`,D3 面演化 + roleTable 传播)——历史路径,不回退;
8
- * - brepkit(无 chamferWithHistory,但裸 `kernel.chamfer` 是真实现)→ L1 裸
9
+ * - brepkit(无 `chamferWithHistory`,但裸 `kernel.chamfer` 是真实现)→ L1 裸
9
10
  * `kernel.chamfer(solid, edges, width)`:几何正确,**无面演化、无 roleTable 传播**
10
11
  * (如实降级,不伪造恒等映射)。
11
12
  * distanceAngle / twoDistances 分支本就走 L1 `kernel.chamferDistAngle`(brepkit 真实现,
@@ -24,8 +25,8 @@
24
25
  import { solidToShape } from '../brep/brep-ops.js';
25
26
  import { chamferWithRoleTable, identityEvolution } from '../brep/face-evolution.js';
26
27
  import { getBrepApi } from '../brep/handle-bridge.js';
27
- import { getBackends, getCurrentStmt } from '../runtime-state.js';
28
- import { engineCapabilitySet } from '../cad-runtime/backend-dispatch.js';
28
+ import { getCurrentStmt } from '../runtime-state.js';
29
+ import { hasNativeHistory } from '../brep/engine/native-history.js';
29
30
  import { fromBrep, brepOf, inputRoleTable } from '../shape.js';
30
31
  import { defineOp } from '../sdk.js';
31
32
  import { resolveTopoRef, facesForQualifier, TopoRefError } from '../topology/naming/index.js';
@@ -197,11 +198,11 @@ function chamferBrep(input, params) {
197
198
  // 输入 roleTable + outStmt(与 boolean.ts / fillet.ts 同构)。Phase 1.6:origin=StmtId。
198
199
  const inputTable = inputRoleTable(input);
199
200
  const outStmt = String(getCurrentStmt()?.id ?? '');
200
- // 静态定轨:当前引擎是否声明 chamferWithHistory 面演化核函数(读与 dispatchPath
201
- // 同源的能力集,非运行时探测)。occt 声明 → equal 走 chamferWithRoleTable 历史路径;
202
- // brepkit 未声明(裸 kernel.chamfer 真实现但无 *WithHistory)→ L1 裸调用,
201
+ // 静态定轨:当前引擎是否原生实现 chamferWithHistory 面演化核函数(引擎事实,非运行时
202
+ // 探测)。occt 有 → equal 走 chamferWithRoleTable 历史路径;brepkit 没有
203
+ // (裸 kernel.chamfer 是真实现,但无 *WithHistory)→ L1 裸调用,
203
204
  // 不伪造面演化/roleTable(与 intersect 降级同构)。
204
- const useHistory = engineCapabilitySet(getBackends().config.brepCapabilities).has('chamferWithHistory');
205
+ const useHistory = hasNativeHistory('chamferWithHistory');
205
206
  let resultSolid;
206
207
  let faceEvolution;
207
208
  let roleTable;
@@ -311,7 +312,7 @@ function chamferMeshSolid(input, params) {
311
312
  * const q = await cad.chamfer(meshPart, { edges: [3], type:'equal', width:1 })
312
313
  */
313
314
  export const chamfer = defineOp({
314
- // 中立 op(2026-09-26 B 批):不再声明 engines——equal 路径按引擎能力静态分派
315
+ // 中立 op(2026-09-26 B 批):不再声明 engines——equal 路径按引擎事实静态分派
315
316
  // (occt→chamferWithHistory 历史路径;brepkit→裸 kernel.chamfer 无演化降级)。
316
317
  // meshEngines:网格实体路径由 brepkit 网格后端提供(方案 2026-10-01 §3.4)。
317
318
  meshEngines: ['brepkit'],
@@ -1 +1 @@
1
- {"version":3,"file":"chamfer.js","sourceRoot":"","sources":["../../src/api/chamfer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api chamfer — chamfer 倒角库函数(BREP-only,directEdit 能力)\n *\n * 平台分层(2026-09-26 B 批降级):**中立 op**(不再声明 `engines:['occt']`)。\n * equal 分支按引擎能力**静态定轨**(与 intersect 同构,读 `dispatchPath` 同源的能力集):\n * - occt(声明 `chamferWithHistory`)→ `chamferWithRoleTable`(→ face-evolution.ts 的\n * occt 原生 `chamferWithHistory`,D3 面演化 + roleTable 传播)——历史路径,不回退;\n * - brepkit(无 chamferWithHistory,但裸 `kernel.chamfer` 是真实现)→ L1 裸\n * `kernel.chamfer(solid, edges, width)`:几何正确,**无面演化、无 roleTable 传播**\n * (如实降级,不伪造恒等映射)。\n * distanceAngle / twoDistances 分支本就走 L1 `kernel.chamferDistAngle`(brepkit 真实现,\n * 度→弧度方言在 brepkitKernel 内消化);occt 上仍挂 identityEvolution + 原 roleTable\n * (既有行为,零回退),brepkit 上同样不伪造演化。\n *\n * 与 drill/engrave 的差异:没有 mesh 实现(defineOp({ brep })),输入非 BREP\n * 时由 dispatchPath 抛 E_MESH_UNSUPPORTED。\n *\n * 类型:\n * - equal(对称):occt→chamferWithHistory;brepkit→kernel.chamfer(solid, edges, width)\n * - distanceAngle:kernel.chamferDistAngle(solid, edges, width, angle)\n * - twoDistances(双距):逐边按 §3.5 换算(width1,width2 + β → dF, θ),\n * per-edge 调 kernel.chamferDistAngle;凹棱(β ≥ 180°)→ E_CHAMFER_REFLEX_EDGE。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { chamferWithRoleTable, identityEvolution } from '../brep/face-evolution'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { getBackends, getCurrentStmt } from '../runtime-state'\nimport { engineCapabilitySet } from '../cad-runtime/backend-dispatch'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { EdgeTopoRef, ResolutionContext } from '../topology/naming'\nimport { resolveTopoRef, facesForQualifier, TopoRefError } from '../topology/naming'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { buildEdgeResolutionContext, buildEdgeContextFromSolid } from './topo-resolve'\nimport { OpError } from './internal/result-unwrap'\nimport { meshKernelFailure, meshSolidEntry, meshSolidProduct, resolveMeshEdges } from './internal/mesh-solid-op'\nimport { angleBetweenNormals, materialDihedralFromNormalAngle, chamferAngleFromDistances } from './chamfer-math'\n\n// ── 参数自校验(api 层被直接 import 时的防御层)──\n\n/**\n * Validate chamfer parameters: `edges` must be a non-empty array of EdgeTopoRef,\n * each with kind key \"edge\" and a two-entry faces pair — or of 1-based ordinals\n * when `opts.allowOrdinals` (the mesh chain, which has no role layer to match\n * edges against).\n * @param params the raw chamfer operation parameters.\n * @param opts the selector-form options (mesh chain allows ordinals).\n */\nexport function assertChamferParams(\n params: Record<string, unknown>,\n opts?: { readonly allowOrdinals?: boolean },\n): void {\n const edges = params.edges\n if (!Array.isArray(edges) || edges.length === 0) {\n throw new Error('E_CHAMFER_NO_EDGES: chamfer requires at least one edge')\n }\n for (const e of edges) {\n if (opts?.allowOrdinals && typeof e === 'number') {\n if (!Number.isInteger(e) || e < 1) {\n throw new Error('E_CHAMFER_BAD_EDGE_REF: an edge ordinal must be a positive integer (1-based)')\n }\n continue\n }\n if (!e || typeof e !== 'object' || (e as { kind?: unknown }).kind !== 'edge') {\n throw new Error('E_CHAMFER_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_CHAMFER_BAD_EDGE_REF: EdgeTopoRef.faces must be a two-entry RoleQualifier pair')\n }\n }\n const type = params.type\n if (type !== 'equal' && type !== 'twoDistances' && type !== 'distanceAngle') {\n throw new Error('E_CHAMFER_BAD_TYPE: type must be equal | twoDistances | distanceAngle')\n }\n if (type === 'equal' || type === 'distanceAngle') {\n const width = params.width\n if (typeof width !== 'number' || !Number.isFinite(width) || width <= 0) {\n throw new Error('E_CHAMFER_BAD_WIDTH: chamfer.width must be a positive number')\n }\n if (type === 'distanceAngle') {\n const angle = params.angle\n if (typeof angle !== 'number' || !Number.isFinite(angle) || angle <= 0 || angle >= 90) {\n throw new Error('E_CHAMFER_BAD_ANGLE: chamfer.angle must be in (0, 90) degrees')\n }\n }\n } else {\n const w1 = params.width1\n const w2 = params.width2\n if (typeof w1 !== 'number' || !Number.isFinite(w1) || w1 <= 0) {\n throw new Error('E_CHAMFER_BAD_WIDTH: chamfer.width1 must be a positive number')\n }\n if (typeof w2 !== 'number' || !Number.isFinite(w2) || w2 <= 0) {\n throw new Error('E_CHAMFER_BAD_WIDTH: chamfer.width2 must be a positive number')\n }\n }\n}\n\n// ── §3.5 几何换算 ──\n\n/** 面中心外法向(与 captureFaceHint 同口径)。 */\nfunction faceMidNormal(kernel: BrepEngineApi, face: BrepHandle): [number, number, number] {\n const uv = kernel.uvBounds(face)\n const n = kernel.surfaceNormal(face, (uv.uMin + uv.uMax) / 2, (uv.vMin + uv.vMax) / 2)\n return [n.x, n.y, n.z]\n}\n\nfunction dot3(a: readonly number[], b: readonly number[]): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n}\n\nfunction radToDeg(rad: number): number {\n return (rad * 180) / Math.PI\n}\n\n/** 复刻 occt-wasm 的双层枚举(config.rs:517-527):返回内核选用的参考面在\n * `faceHandles`(getSubShapes(solid,'face'))数组中的下标(0 起);找不到 → null。 */\nfunction refFaceIndex(kernel: BrepEngineApi, faceHandles: BrepHandle[], edge: BrepHandle): number | null {\n for (let fi = 0; fi < faceHandles.length; fi++) {\n for (const fe of kernel.getSubShapes(faceHandles[fi], 'edge')) {\n if (kernel.isSame(fe, edge)) return fi\n }\n }\n return null\n}\n\n/** 两邻面 outer-normal 夹角 → β(材料侧二面角,弧度)。 */\nfunction materialDihedralRad(kernel: BrepEngineApi, ctx: ResolutionContext, a: number, b: number): number {\n const ha = ctx.faces[a - 1]?.handle\n const hb = ctx.faces[b - 1]?.handle\n if (ha === undefined || hb === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `chamfer: adjacent face ${a}/${b} has no live handle`)\n }\n const gamma = angleBetweenNormals(dot3(faceMidNormal(kernel, ha), faceMidNormal(kernel, hb)))\n return materialDihedralFromNormalAngle(gamma)\n}\n\n/**\n * twoDistances 单边换算:width1/width2 + β(§3.5)→ (dF, θ) 供一次 chamferDistAngle。\n * 参考面由内核自选(refOrdinal 的面);width1 对应 faces[0] 侧、width2 对应 faces[1] 侧。\n *\n * @param kernel the OCCT kernel.\n * @param ctx the edge resolution context (faces with live handles).\n * @param refAOrdinal resolved ordinal of `EdgeTopoRef.faces[0]` (1-based).\n * @param refBOrdinal resolved ordinal of `EdgeTopoRef.faces[1]` (1-based).\n * @param refOrdinal the kernel reference face ordinal (1-based; the F in §3.5).\n * @param width1 the `width1` argument.\n * @param width2 the `width2` argument.\n * @returns { dF, angleDeg } for a single `kernel.chamferDistAngle` call.\n */\nexport function twoDistParams(\n kernel: BrepEngineApi,\n ctx: ResolutionContext,\n refAOrdinal: number,\n refBOrdinal: number,\n refOrdinal: number,\n width1: number,\n width2: number,\n): { distance: number; angleDeg: number } {\n const betaRad = materialDihedralRad(kernel, ctx, refAOrdinal, refBOrdinal)\n // dF/dO:§3.5 —— 内核参考面 == faces[0] → width1,== faces[1] → width2。\n let dF: number\n let dO: number\n if (refOrdinal === refAOrdinal) {\n dF = width1\n dO = width2\n } else if (refOrdinal === refBOrdinal) {\n dF = width2\n dO = width1\n } else {\n throw new Error(`E_CHAMFER_EDGE_MISMATCH: kernel ref face ordinal ${refOrdinal} not in [${refAOrdinal}, ${refBOrdinal}]`)\n }\n const angleRad = chamferAngleFromDistances(dF, dO, betaRad)\n return { distance: dF, angleDeg: radToDeg(angleRad) }\n}\n\n/** 解析一条 EdgeTopoRef → (ordinal, handle);失败抛命名层 TopoRefError。 */\nfunction resolveEdge(ctx: ResolutionContext, ref: EdgeTopoRef): { ordinal: number; handle: BrepHandle } {\n const r = resolveTopoRef(ref, ctx)\n if (r.handle === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `chamfer: edge resolved without handle (${ref.faces[0].role}/${ref.faces[1].role})`)\n }\n return { ordinal: r.ordinal, handle: r.handle as BrepHandle }\n}\n\n/** twoDistances 逐边构建(§3.6 V1):每条边一次 chamferDistAngle。 */\nfunction chamferTwoDistances(\n kernel: BrepEngineApi,\n edges: EdgeTopoRef[],\n startCtx: ResolutionContext,\n solid: BrepHandle,\n width1: number,\n width2: number,\n): BrepHandle {\n let resultSolid = solid\n for (const ref of edges) {\n const ctx = resultSolid === solid ? startCtx : buildEdgeContextFromSolid(kernel, resultSolid, startCtx.roleTable)\n const entity = resolveEdge(ctx, ref)\n const faces = resultSolid === solid ? startCtx.faces : ctx.faces\n const idx = refFaceIndex(kernel, faces.map((f) => f.handle).filter((h): h is BrepHandle => h !== undefined), entity.handle)\n if (idx === null) {\n throw new Error('E_CHAMFER_EDGE_MISMATCH: kernel cannot locate ref face (bug)')\n }\n const a = facesForQualifier(ref.faces[0], ctx)[0]\n const b = facesForQualifier(ref.faces[1], ctx)[0]\n const refOrdinal = idx + 1\n const p = twoDistParams(kernel, ctx, a?.ordinal ?? -1, b?.ordinal ?? -1, refOrdinal, width1, width2)\n resultSolid = kernel.chamferDistAngle(resultSolid, [entity.handle], p.distance, p.angleDeg)\n }\n return resultSolid\n}\n\n/** BREP-only 主入口(§3.6 flow)。 */\nfunction chamferBrep(input: Shape, params: Record<string, unknown>): Shape {\n // L1 面:chamferDistAngle/枚举/命名(D12)。equal 分支经 face-evolution 走 occt 平台面。\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('[api/chamfer] E_CHAMFER_NO_BREP: input is not BREP')\n\n const edges = (params.edges as unknown as EdgeTopoRef[] | undefined) ?? []\n const type = params.type as string\n const ctx = buildEdgeResolutionContext(kernel, input as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', 'input has no edge naming context')\n\n // 输入 roleTable + outStmt(与 boolean.ts / fillet.ts 同构)。Phase 1.6:origin=StmtId。\n const inputTable = inputRoleTable(input) as ReadonlyMap<unknown, unknown> | undefined\n const outStmt = String(getCurrentStmt()?.id ?? '')\n\n // 静态定轨:当前引擎是否声明 chamferWithHistory 面演化核函数(读与 dispatchPath\n // 同源的能力集,非运行时探测)。occt 声明 → equal 走 chamferWithRoleTable 历史路径;\n // brepkit 未声明(裸 kernel.chamfer 真实现但无 *WithHistory)→ L1 裸调用,\n // 不伪造面演化/roleTable(与 intersect 降级同构)。\n const useHistory = engineCapabilitySet(getBackends().config.brepCapabilities).has('chamferWithHistory')\n\n let resultSolid: BrepHandle\n let faceEvolution: Map<number, number[]> | undefined\n let roleTable: ReadonlyMap<unknown, unknown> | undefined\n\n switch (type) {\n case 'equal': {\n const edgeHandles = edges.map((e) => resolveEdge(ctx, e).handle)\n if (useHistory) {\n // occt 历史路径(P5:chamferWithHistory + roleTable 传播,§3.2 末段)\n const r = chamferWithRoleTable(\n kernel,\n solid,\n edgeHandles,\n params.width as number,\n inputTable ?? new Map(),\n outStmt,\n )\n resultSolid = r.result\n faceEvolution = r.faceEvolution\n roleTable = r.roleTable\n } else {\n // brepkit 裸降级:kernel.chamfer(solid, edges, width)——几何正确,无面演化。\n resultSolid = kernel.chamfer(solid, edgeHandles, params.width as number)\n faceEvolution = undefined\n roleTable = undefined\n }\n break\n }\n case 'distanceAngle':\n resultSolid = kernel.chamferDistAngle(solid, edges.map((e) => resolveEdge(ctx, e).handle), params.width as number, params.angle as number)\n if (useHistory) {\n // occt:chamferDistAngle 无 WithHistory 版本——用恒等面演化 + 原表(既有行为)。\n faceEvolution = identityEvolution(kernel, resultSolid)\n roleTable = inputTable\n } else {\n // brepkit:不伪造演化/roleTable。\n faceEvolution = undefined\n roleTable = undefined\n }\n break\n case 'twoDistances':\n resultSolid = chamferTwoDistances(kernel, edges, ctx, solid, params.width1 as number, params.width2 as number)\n if (useHistory) {\n faceEvolution = identityEvolution(kernel, resultSolid)\n roleTable = inputTable\n } else {\n faceEvolution = undefined\n roleTable = undefined\n }\n break\n default:\n throw new Error('E_CHAMFER_BAD_TYPE')\n }\n\n return fromBrep(\n solidToShape(kernel, resultSolid),\n faceEvolution ? { solid: resultSolid, faceEvolution, roleTable } : { solid: resultSolid, roleTable },\n )\n}\n\n/**\n * 网格实体路径:对近似拓扑里识别出的边倒角(方案 2026-10-01 §3.5 三明治)。\n *\n * 支持的形态与 BREP 路径的差异:\n * - `equal` → L1 裸 `kernel.chamfer`;`distanceAngle` → `kernel.chamferDistAngle`;\n * - `twoDistances` **不支持**:它要把 `faces[0]/faces[1]` 两个 role 限定符解析到面,\n * 再由内核选中的参考面决定 width1/width2 各归哪一侧。近似拓扑没有 role 层,\n * 这两个限定符无从解析——如实拒绝,不猜一个参考面(猜错 = 倒角落在错误的一侧)。\n *\n * 与 fillet 同一条 GOTCHA:一次请求里的全部边交给内核会在共面边链上被整体拒绝,\n * 本实现如实失败,不自动拆成逐边重试。\n *\n * @param input - the mesh-solid input.\n * @param params - the validated chamfer parameters.\n * @returns the chamfered mesh solid as a new mesh part.\n */\nfunction chamferMeshSolid(input: Shape, params: Record<string, unknown>): Shape {\n const type = params.type as string\n const edges = (params.edges as unknown as (number | EdgeTopoRef)[] | undefined) ?? []\n if (type === 'twoDistances') {\n throw new OpError(\n 'chamfer',\n 'E_MESH_SOLID_UNSUPPORTED',\n '[api/chamfer] twoDistances needs role-resolvable adjacent faces to decide which side ' +\n 'carries width1/width2; a mesh solid has no role layer — use type:\"equal\" or \"distanceAngle\"',\n )\n }\n const entry = meshSolidEntry(input, 'chamfer')\n const edgeHandles = resolveMeshEdges(entry, edges, 'chamfer')\n\n let result: BrepHandle\n try {\n result = type === 'distanceAngle'\n ? entry.kernel.chamferDistAngle(entry.solid, edgeHandles, params.width as number, params.angle as number)\n : entry.kernel.chamfer(entry.solid, edgeHandles, params.width as number)\n } catch (cause) {\n throw meshKernelFailure(\n 'chamfer',\n 'E_CHAMFER_FAILED',\n `chamfer(type=${type}) on ${edgeHandles.length} edge(s)`,\n cause,\n )\n }\n return meshSolidProduct(entry, result)\n}\n\n/**\n * 在几何体上倒角(等距 / 双距 / 距角)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name chamfer\n * @note BREP 输入走完整三形态;**网格实体**输入只支持 `equal` / `distanceAngle`\n * (`twoDistances` 需要 role 可解析的邻面,近似拓扑没有 role)。\n * `width1` 沿 faces[0] 侧、`width2` 沿 faces[1] 侧(BREP 路径)。\n * @returns Shape 倒角后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.edges - 参与倒角的边(EdgeTopoRef[],条目为相邻两面的 role 线路)。type:EdgeTopoRef[] required:true\n * @param params.type - 倒角类型(equal | twoDistances | distanceAngle)。type:string required:true\n * @param params.width - type=equal: 倒角宽度(mm)。type:number 默认 1\n * @param params.width1 - type=twoDistances: 沿 faces[0] 侧距离(mm)。type:number\n * @param params.width2 - type=twoDistances: 沿 faces[1] 侧距离(mm)。type:number\n * @param params.angle - type=distanceAngle: 与参考面夹角(度,(0,90))。type:number\n * @example\n * const p = await cad.chamfer(part0, { edges: [{ kind:'edge', faces:[{ origin:'box', role:'box:top' }, { origin:'box', role:'box:front' }], hint:{ kind:'edge' } }], type:'equal', width:1 })\n * const q = await cad.chamfer(meshPart, { edges: [3], type:'equal', width:1 })\n */\nexport const chamfer = defineOp({\n // 中立 op(2026-09-26 B 批):不再声明 engines——equal 路径按引擎能力静态分派\n // (occt→chamferWithHistory 历史路径;brepkit→裸 kernel.chamfer 无演化降级)。\n // meshEngines:网格实体路径由 brepkit 网格后端提供(方案 2026-10-01 §3.4)。\n meshEngines: ['brepkit'],\n mesh(input: Shape, params: Record<string, unknown>) {\n assertChamferParams(params, { allowOrdinals: true })\n return chamferMeshSolid(input, params)\n },\n brep(input: Shape, params: Record<string, unknown>) {\n assertChamferParams(params)\n return chamferBrep(input, params)\n },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
1
+ {"version":3,"file":"chamfer.js","sourceRoot":"","sources":["../../src/api/chamfer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api chamfer — chamfer 倒角库函数(BREP-only,directEdit 族)\n *\n * 平台分层(2026-09-26 B 批降级):**中立 op**(不再声明 `engines:['occt']`)。\n * equal 分支按引擎事实**静态定轨**(与 intersect 同构,读 `hasNativeHistory`——\n * 引擎身份是唯一判据,没有能力集可读):\n * - occt(原生有 `chamferWithHistory`)→ `chamferWithRoleTable`(→ face-evolution.ts 的\n * occt 原生 `chamferWithHistory`,D3 面演化 + roleTable 传播)——历史路径,不回退;\n * - brepkit(无 `chamferWithHistory`,但裸 `kernel.chamfer` 是真实现)→ L1 裸\n * `kernel.chamfer(solid, edges, width)`:几何正确,**无面演化、无 roleTable 传播**\n * (如实降级,不伪造恒等映射)。\n * distanceAngle / twoDistances 分支本就走 L1 `kernel.chamferDistAngle`(brepkit 真实现,\n * 度→弧度方言在 brepkitKernel 内消化);occt 上仍挂 identityEvolution + 原 roleTable\n * (既有行为,零回退),brepkit 上同样不伪造演化。\n *\n * 与 drill/engrave 的差异:没有 mesh 实现(defineOp({ brep })),输入非 BREP\n * 时由 dispatchPath 抛 E_MESH_UNSUPPORTED。\n *\n * 类型:\n * - equal(对称):occt→chamferWithHistory;brepkit→kernel.chamfer(solid, edges, width)\n * - distanceAngle:kernel.chamferDistAngle(solid, edges, width, angle)\n * - twoDistances(双距):逐边按 §3.5 换算(width1,width2 + β → dF, θ),\n * per-edge 调 kernel.chamferDistAngle;凹棱(β ≥ 180°)→ E_CHAMFER_REFLEX_EDGE。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { chamferWithRoleTable, identityEvolution } from '../brep/face-evolution'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { getCurrentStmt } from '../runtime-state'\nimport { hasNativeHistory } from '../brep/engine/native-history'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { EdgeTopoRef, ResolutionContext } from '../topology/naming'\nimport { resolveTopoRef, facesForQualifier, TopoRefError } from '../topology/naming'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { buildEdgeResolutionContext, buildEdgeContextFromSolid } from './topo-resolve'\nimport { OpError } from './internal/result-unwrap'\nimport { meshKernelFailure, meshSolidEntry, meshSolidProduct, resolveMeshEdges } from './internal/mesh-solid-op'\nimport { angleBetweenNormals, materialDihedralFromNormalAngle, chamferAngleFromDistances } from './chamfer-math'\n\n// ── 参数自校验(api 层被直接 import 时的防御层)──\n\n/**\n * Validate chamfer parameters: `edges` must be a non-empty array of EdgeTopoRef,\n * each with kind key \"edge\" and a two-entry faces pair — or of 1-based ordinals\n * when `opts.allowOrdinals` (the mesh chain, which has no role layer to match\n * edges against).\n * @param params the raw chamfer operation parameters.\n * @param opts the selector-form options (mesh chain allows ordinals).\n */\nexport function assertChamferParams(\n params: Record<string, unknown>,\n opts?: { readonly allowOrdinals?: boolean },\n): void {\n const edges = params.edges\n if (!Array.isArray(edges) || edges.length === 0) {\n throw new Error('E_CHAMFER_NO_EDGES: chamfer requires at least one edge')\n }\n for (const e of edges) {\n if (opts?.allowOrdinals && typeof e === 'number') {\n if (!Number.isInteger(e) || e < 1) {\n throw new Error('E_CHAMFER_BAD_EDGE_REF: an edge ordinal must be a positive integer (1-based)')\n }\n continue\n }\n if (!e || typeof e !== 'object' || (e as { kind?: unknown }).kind !== 'edge') {\n throw new Error('E_CHAMFER_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_CHAMFER_BAD_EDGE_REF: EdgeTopoRef.faces must be a two-entry RoleQualifier pair')\n }\n }\n const type = params.type\n if (type !== 'equal' && type !== 'twoDistances' && type !== 'distanceAngle') {\n throw new Error('E_CHAMFER_BAD_TYPE: type must be equal | twoDistances | distanceAngle')\n }\n if (type === 'equal' || type === 'distanceAngle') {\n const width = params.width\n if (typeof width !== 'number' || !Number.isFinite(width) || width <= 0) {\n throw new Error('E_CHAMFER_BAD_WIDTH: chamfer.width must be a positive number')\n }\n if (type === 'distanceAngle') {\n const angle = params.angle\n if (typeof angle !== 'number' || !Number.isFinite(angle) || angle <= 0 || angle >= 90) {\n throw new Error('E_CHAMFER_BAD_ANGLE: chamfer.angle must be in (0, 90) degrees')\n }\n }\n } else {\n const w1 = params.width1\n const w2 = params.width2\n if (typeof w1 !== 'number' || !Number.isFinite(w1) || w1 <= 0) {\n throw new Error('E_CHAMFER_BAD_WIDTH: chamfer.width1 must be a positive number')\n }\n if (typeof w2 !== 'number' || !Number.isFinite(w2) || w2 <= 0) {\n throw new Error('E_CHAMFER_BAD_WIDTH: chamfer.width2 must be a positive number')\n }\n }\n}\n\n// ── §3.5 几何换算 ──\n\n/** 面中心外法向(与 captureFaceHint 同口径)。 */\nfunction faceMidNormal(kernel: BrepEngineApi, face: BrepHandle): [number, number, number] {\n const uv = kernel.uvBounds(face)\n const n = kernel.surfaceNormal(face, (uv.uMin + uv.uMax) / 2, (uv.vMin + uv.vMax) / 2)\n return [n.x, n.y, n.z]\n}\n\nfunction dot3(a: readonly number[], b: readonly number[]): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n}\n\nfunction radToDeg(rad: number): number {\n return (rad * 180) / Math.PI\n}\n\n/** 复刻 occt-wasm 的双层枚举(config.rs:517-527):返回内核选用的参考面在\n * `faceHandles`(getSubShapes(solid,'face'))数组中的下标(0 起);找不到 → null。 */\nfunction refFaceIndex(kernel: BrepEngineApi, faceHandles: BrepHandle[], edge: BrepHandle): number | null {\n for (let fi = 0; fi < faceHandles.length; fi++) {\n for (const fe of kernel.getSubShapes(faceHandles[fi], 'edge')) {\n if (kernel.isSame(fe, edge)) return fi\n }\n }\n return null\n}\n\n/** 两邻面 outer-normal 夹角 → β(材料侧二面角,弧度)。 */\nfunction materialDihedralRad(kernel: BrepEngineApi, ctx: ResolutionContext, a: number, b: number): number {\n const ha = ctx.faces[a - 1]?.handle\n const hb = ctx.faces[b - 1]?.handle\n if (ha === undefined || hb === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `chamfer: adjacent face ${a}/${b} has no live handle`)\n }\n const gamma = angleBetweenNormals(dot3(faceMidNormal(kernel, ha), faceMidNormal(kernel, hb)))\n return materialDihedralFromNormalAngle(gamma)\n}\n\n/**\n * twoDistances 单边换算:width1/width2 + β(§3.5)→ (dF, θ) 供一次 chamferDistAngle。\n * 参考面由内核自选(refOrdinal 的面);width1 对应 faces[0] 侧、width2 对应 faces[1] 侧。\n *\n * @param kernel the OCCT kernel.\n * @param ctx the edge resolution context (faces with live handles).\n * @param refAOrdinal resolved ordinal of `EdgeTopoRef.faces[0]` (1-based).\n * @param refBOrdinal resolved ordinal of `EdgeTopoRef.faces[1]` (1-based).\n * @param refOrdinal the kernel reference face ordinal (1-based; the F in §3.5).\n * @param width1 the `width1` argument.\n * @param width2 the `width2` argument.\n * @returns { dF, angleDeg } for a single `kernel.chamferDistAngle` call.\n */\nexport function twoDistParams(\n kernel: BrepEngineApi,\n ctx: ResolutionContext,\n refAOrdinal: number,\n refBOrdinal: number,\n refOrdinal: number,\n width1: number,\n width2: number,\n): { distance: number; angleDeg: number } {\n const betaRad = materialDihedralRad(kernel, ctx, refAOrdinal, refBOrdinal)\n // dF/dO:§3.5 —— 内核参考面 == faces[0] → width1,== faces[1] → width2。\n let dF: number\n let dO: number\n if (refOrdinal === refAOrdinal) {\n dF = width1\n dO = width2\n } else if (refOrdinal === refBOrdinal) {\n dF = width2\n dO = width1\n } else {\n throw new Error(`E_CHAMFER_EDGE_MISMATCH: kernel ref face ordinal ${refOrdinal} not in [${refAOrdinal}, ${refBOrdinal}]`)\n }\n const angleRad = chamferAngleFromDistances(dF, dO, betaRad)\n return { distance: dF, angleDeg: radToDeg(angleRad) }\n}\n\n/** 解析一条 EdgeTopoRef → (ordinal, handle);失败抛命名层 TopoRefError。 */\nfunction resolveEdge(ctx: ResolutionContext, ref: EdgeTopoRef): { ordinal: number; handle: BrepHandle } {\n const r = resolveTopoRef(ref, ctx)\n if (r.handle === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `chamfer: edge resolved without handle (${ref.faces[0].role}/${ref.faces[1].role})`)\n }\n return { ordinal: r.ordinal, handle: r.handle as BrepHandle }\n}\n\n/** twoDistances 逐边构建(§3.6 V1):每条边一次 chamferDistAngle。 */\nfunction chamferTwoDistances(\n kernel: BrepEngineApi,\n edges: EdgeTopoRef[],\n startCtx: ResolutionContext,\n solid: BrepHandle,\n width1: number,\n width2: number,\n): BrepHandle {\n let resultSolid = solid\n for (const ref of edges) {\n const ctx = resultSolid === solid ? startCtx : buildEdgeContextFromSolid(kernel, resultSolid, startCtx.roleTable)\n const entity = resolveEdge(ctx, ref)\n const faces = resultSolid === solid ? startCtx.faces : ctx.faces\n const idx = refFaceIndex(kernel, faces.map((f) => f.handle).filter((h): h is BrepHandle => h !== undefined), entity.handle)\n if (idx === null) {\n throw new Error('E_CHAMFER_EDGE_MISMATCH: kernel cannot locate ref face (bug)')\n }\n const a = facesForQualifier(ref.faces[0], ctx)[0]\n const b = facesForQualifier(ref.faces[1], ctx)[0]\n const refOrdinal = idx + 1\n const p = twoDistParams(kernel, ctx, a?.ordinal ?? -1, b?.ordinal ?? -1, refOrdinal, width1, width2)\n resultSolid = kernel.chamferDistAngle(resultSolid, [entity.handle], p.distance, p.angleDeg)\n }\n return resultSolid\n}\n\n/** BREP-only 主入口(§3.6 flow)。 */\nfunction chamferBrep(input: Shape, params: Record<string, unknown>): Shape {\n // L1 面:chamferDistAngle/枚举/命名(D12)。equal 分支经 face-evolution 走 occt 平台面。\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('[api/chamfer] E_CHAMFER_NO_BREP: input is not BREP')\n\n const edges = (params.edges as unknown as EdgeTopoRef[] | undefined) ?? []\n const type = params.type as string\n const ctx = buildEdgeResolutionContext(kernel, input as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', 'input has no edge naming context')\n\n // 输入 roleTable + outStmt(与 boolean.ts / fillet.ts 同构)。Phase 1.6:origin=StmtId。\n const inputTable = inputRoleTable(input) as ReadonlyMap<unknown, unknown> | undefined\n const outStmt = String(getCurrentStmt()?.id ?? '')\n\n // 静态定轨:当前引擎是否原生实现 chamferWithHistory 面演化核函数(引擎事实,非运行时\n // 探测)。occt 有 → equal 走 chamferWithRoleTable 历史路径;brepkit 没有\n // (裸 kernel.chamfer 是真实现,但无 *WithHistory)→ L1 裸调用,\n // 不伪造面演化/roleTable(与 intersect 降级同构)。\n const useHistory = hasNativeHistory('chamferWithHistory')\n\n let resultSolid: BrepHandle\n let faceEvolution: Map<number, number[]> | undefined\n let roleTable: ReadonlyMap<unknown, unknown> | undefined\n\n switch (type) {\n case 'equal': {\n const edgeHandles = edges.map((e) => resolveEdge(ctx, e).handle)\n if (useHistory) {\n // occt 历史路径(P5:chamferWithHistory + roleTable 传播,§3.2 末段)\n const r = chamferWithRoleTable(\n kernel,\n solid,\n edgeHandles,\n params.width as number,\n inputTable ?? new Map(),\n outStmt,\n )\n resultSolid = r.result\n faceEvolution = r.faceEvolution\n roleTable = r.roleTable\n } else {\n // brepkit 裸降级:kernel.chamfer(solid, edges, width)——几何正确,无面演化。\n resultSolid = kernel.chamfer(solid, edgeHandles, params.width as number)\n faceEvolution = undefined\n roleTable = undefined\n }\n break\n }\n case 'distanceAngle':\n resultSolid = kernel.chamferDistAngle(solid, edges.map((e) => resolveEdge(ctx, e).handle), params.width as number, params.angle as number)\n if (useHistory) {\n // occt:chamferDistAngle 无 WithHistory 版本——用恒等面演化 + 原表(既有行为)。\n faceEvolution = identityEvolution(kernel, resultSolid)\n roleTable = inputTable\n } else {\n // brepkit:不伪造演化/roleTable。\n faceEvolution = undefined\n roleTable = undefined\n }\n break\n case 'twoDistances':\n resultSolid = chamferTwoDistances(kernel, edges, ctx, solid, params.width1 as number, params.width2 as number)\n if (useHistory) {\n faceEvolution = identityEvolution(kernel, resultSolid)\n roleTable = inputTable\n } else {\n faceEvolution = undefined\n roleTable = undefined\n }\n break\n default:\n throw new Error('E_CHAMFER_BAD_TYPE')\n }\n\n return fromBrep(\n solidToShape(kernel, resultSolid),\n faceEvolution ? { solid: resultSolid, faceEvolution, roleTable } : { solid: resultSolid, roleTable },\n )\n}\n\n/**\n * 网格实体路径:对近似拓扑里识别出的边倒角(方案 2026-10-01 §3.5 三明治)。\n *\n * 支持的形态与 BREP 路径的差异:\n * - `equal` → L1 裸 `kernel.chamfer`;`distanceAngle` → `kernel.chamferDistAngle`;\n * - `twoDistances` **不支持**:它要把 `faces[0]/faces[1]` 两个 role 限定符解析到面,\n * 再由内核选中的参考面决定 width1/width2 各归哪一侧。近似拓扑没有 role 层,\n * 这两个限定符无从解析——如实拒绝,不猜一个参考面(猜错 = 倒角落在错误的一侧)。\n *\n * 与 fillet 同一条 GOTCHA:一次请求里的全部边交给内核会在共面边链上被整体拒绝,\n * 本实现如实失败,不自动拆成逐边重试。\n *\n * @param input - the mesh-solid input.\n * @param params - the validated chamfer parameters.\n * @returns the chamfered mesh solid as a new mesh part.\n */\nfunction chamferMeshSolid(input: Shape, params: Record<string, unknown>): Shape {\n const type = params.type as string\n const edges = (params.edges as unknown as (number | EdgeTopoRef)[] | undefined) ?? []\n if (type === 'twoDistances') {\n throw new OpError(\n 'chamfer',\n 'E_MESH_SOLID_UNSUPPORTED',\n '[api/chamfer] twoDistances needs role-resolvable adjacent faces to decide which side ' +\n 'carries width1/width2; a mesh solid has no role layer — use type:\"equal\" or \"distanceAngle\"',\n )\n }\n const entry = meshSolidEntry(input, 'chamfer')\n const edgeHandles = resolveMeshEdges(entry, edges, 'chamfer')\n\n let result: BrepHandle\n try {\n result = type === 'distanceAngle'\n ? entry.kernel.chamferDistAngle(entry.solid, edgeHandles, params.width as number, params.angle as number)\n : entry.kernel.chamfer(entry.solid, edgeHandles, params.width as number)\n } catch (cause) {\n throw meshKernelFailure(\n 'chamfer',\n 'E_CHAMFER_FAILED',\n `chamfer(type=${type}) on ${edgeHandles.length} edge(s)`,\n cause,\n )\n }\n return meshSolidProduct(entry, result)\n}\n\n/**\n * 在几何体上倒角(等距 / 双距 / 距角)。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name chamfer\n * @note BREP 输入走完整三形态;**网格实体**输入只支持 `equal` / `distanceAngle`\n * (`twoDistances` 需要 role 可解析的邻面,近似拓扑没有 role)。\n * `width1` 沿 faces[0] 侧、`width2` 沿 faces[1] 侧(BREP 路径)。\n * @returns Shape 倒角后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.edges - 参与倒角的边(EdgeTopoRef[],条目为相邻两面的 role 线路)。type:EdgeTopoRef[] required:true\n * @param params.type - 倒角类型(equal | twoDistances | distanceAngle)。type:string required:true\n * @param params.width - type=equal: 倒角宽度(mm)。type:number 默认 1\n * @param params.width1 - type=twoDistances: 沿 faces[0] 侧距离(mm)。type:number\n * @param params.width2 - type=twoDistances: 沿 faces[1] 侧距离(mm)。type:number\n * @param params.angle - type=distanceAngle: 与参考面夹角(度,(0,90))。type:number\n * @example\n * const p = await cad.chamfer(part0, { edges: [{ kind:'edge', faces:[{ origin:'box', role:'box:top' }, { origin:'box', role:'box:front' }], hint:{ kind:'edge' } }], type:'equal', width:1 })\n * const q = await cad.chamfer(meshPart, { edges: [3], type:'equal', width:1 })\n */\nexport const chamfer = defineOp({\n // 中立 op(2026-09-26 B 批):不再声明 engines——equal 路径按引擎事实静态分派\n // (occt→chamferWithHistory 历史路径;brepkit→裸 kernel.chamfer 无演化降级)。\n // meshEngines:网格实体路径由 brepkit 网格后端提供(方案 2026-10-01 §3.4)。\n meshEngines: ['brepkit'],\n mesh(input: Shape, params: Record<string, unknown>) {\n assertChamferParams(params, { allowOrdinals: true })\n return chamferMeshSolid(input, params)\n },\n brep(input: Shape, params: Record<string, unknown>) {\n assertChamferParams(params)\n return chamferBrep(input, params)\n },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * api curve-sketch — 曲线与草图构造族(S4,平台 op engines:['occt'])
3
+ *
4
+ * @platform occt — 本目录 import occt-kernel:各 op 直调 occt 原生曲线构造/精修方法
5
+ * (`makeEdge` / `makeCircleArc` / `makeEllipseEdge` / `makeEllipseArc` /
6
+ * `makeTangentArc` / `approximatePoints` / `interpolatePointsWithTangents` /
7
+ * `curveDegreeElevate` / `curveKnotInsert` / `curveKnotRemove` / `curveIsPeriodic`,
8
+ * occt-wasm 原生有)。这些原生方法**不在** L1 契约 `BrepEngineApi` 里(L1 只有
9
+ * `makeLineEdge` / `makeArcEdge` / `interpolatePoints` 等按几何构造的子集,见
10
+ * brep/engine/primitives.ts)⇒ 全族平台 op:defineOp 声明 `engines: ['occt']`(D11)。
11
+ *
12
+ * 方案落点:docs/plans/2026-10-07-occt-wasm-op-enablement-plan.md §3.4.1。
13
+ * 与既有 op 的边界(§4.5 去重表):`edge`(顶点对构造)≠ `makeLineEdge`(L1 点对构造,
14
+ * 无脚本符号)≠ `wire`(多边组装);`approximatePoints`(逼近)与 L1 `interpolatePoints`
15
+ * (插值)是数学对偶的两条路径;`interpolateWithTangents` 是带端点切向的插值。
16
+ *
17
+ * 角度约定(实测钉住,见 test/api/occt-s4-curve-sketch.test.ts):occt 原生
18
+ * `makeCircleArc` / `makeEllipseArc` 的起止角走 `Geom_TrimmedCurve`(**弧度**,
19
+ * 见 occt-wasm facade `Geom_TrimmedCurve(new Geom_Circle(circle), startAngle, endAngle)`);
20
+ * 本仓契约「角度用度」(docs/api-contract.md)⇒ 脚本面收**度**、内部换算弧度。
21
+ *
22
+ * 产物形态(同 offset2d / helix):1D 曲线经 `fromBrepCurve` 登记为 `kind:'curve'`
23
+ * (wire/edge 三角载荷为空,显示走 L1 `wireframe`)。
24
+ *
25
+ * `curveIsPeriodic` 返回布尔(非 Shape)⇒ 与 shape-type 族同口径:普通函数 +
26
+ * `assertEngineFor('curveIsPeriodic', ['occt'])`(见 api/shape-type/index.ts 头注),
27
+ * 覆盖率扫描器经 PLAN_C2_EXTRA 计入。
28
+ */
29
+ import type { Shape } from '../../mesh/types.js';
30
+ type Vec3 = [number, number, number];
31
+ /**
32
+ * 两顶点构造边。顶点入参可以是 vertex Shape,也可以是 `[x,y,z]` 点
33
+ * (点经 L1 契约 `makeVertex` 物化成顶点再配边)。
34
+ * @group 创建
35
+ * @inputs 2
36
+ * @async false
37
+ * @qual ok
38
+ * @name edge
39
+ * @note 平台 op:仅 occt 引擎(原生 makeEdge,L1 契约只有 makeLineEdge 等按几何构造)。
40
+ * 非 occt 引擎执行前报错;brep_mock 不拦截。
41
+ * @returns Shape 1D 直线边(kind:'curve')。
42
+ * @param v1 - 第一个顶点(vertex Shape 或 [x,y,z])。type:Shape|Vec3 required:true
43
+ * @param v2 - 第二个顶点(vertex Shape 或 [x,y,z])。type:Shape|Vec3 required:true
44
+ * @example
45
+ * const e = cad.edge([0,0,0], [10,0,0])
46
+ */
47
+ export declare const edge: ((v1: Shape | Vec3, v2: Shape | Vec3) => Promise<Shape>) & {
48
+ __faijs__dualOp?: import("../../define-op.js").DualOpMeta;
49
+ };
50
+ /**
51
+ * 构造圆弧:圆心 + 法向 + 半径 + 起止角(度,绕法向右手逆时针)。
52
+ * @group 创建
53
+ * @inputs 0
54
+ * @async false
55
+ * @qual ok
56
+ * @name circleArc
57
+ * @note 平台 op:仅 occt 引擎(原生 makeCircleArc)。角度单位是**度**(内部换算弧度
58
+ * 传给 occt 的 Geom_TrimmedCurve)。
59
+ * @returns Shape 1D 圆弧(kind:'curve')。
60
+ * @param center - 圆心 [x,y,z]。type:Vec3 required:true
61
+ * @param normal - 圆面法向 [x,y,z](非零)。type:Vec3 required:true
62
+ * @param radius - 半径(mm,>0)。type:number required:true
63
+ * @param startAngle - 起始角(度,自法向基准 X 方向起量)。type:number required:true
64
+ * @param endAngle - 终止角(度)。type:number required:true
65
+ * @example
66
+ * const a = cad.circleArc([0,0,0], [0,0,1], 5, 0, 90)
67
+ */
68
+ export declare const circleArc: ((center: Vec3, normal: Vec3, radius: number, startAngleDeg: number, endAngleDeg: number) => Promise<Shape>) & {
69
+ __faijs__dualOp?: import("../../define-op.js").DualOpMeta;
70
+ };
71
+ /**
72
+ * 构造整椭圆边:中心 + 法向 + 长半轴 + 短半轴。
73
+ * @group 创建
74
+ * @inputs 0
75
+ * @async false
76
+ * @qual ok
77
+ * @name ellipseEdge
78
+ * @note 平台 op:仅 occt 引擎(原生 makeEllipseEdge)。要求 majorRadius >= minorRadius。
79
+ * @returns Shape 1D 椭圆边(kind:'curve')。
80
+ * @param center - 椭圆中心 [x,y,z]。type:Vec3 required:true
81
+ * @param normal - 椭圆面法向 [x,y,z](非零)。type:Vec3 required:true
82
+ * @param majorRadius - 长半轴(mm,>0)。type:number required:true
83
+ * @param minorRadius - 短半轴(mm,>0 且 <= 长半轴)。type:number required:true
84
+ * @example
85
+ * const e = cad.ellipseEdge([0,0,0], [0,0,1], 10, 5)
86
+ */
87
+ export declare const ellipseEdge: ((center: Vec3, normal: Vec3, majorRadius: number, minorRadius: number) => Promise<Shape>) & {
88
+ __faijs__dualOp?: import("../../define-op.js").DualOpMeta;
89
+ };
90
+ /**
91
+ * 构造椭圆弧:中心 + 法向 + 长短半轴 + 起止角(度)。
92
+ * @group 创建
93
+ * @inputs 0
94
+ * @async false
95
+ * @qual ok
96
+ * @name ellipseArc
97
+ * @note 平台 op:仅 occt 引擎(原生 makeEllipseArc)。角度单位是**度**(内部换算弧度)。
98
+ * @returns Shape 1D 椭圆弧(kind:'curve')。
99
+ * @param center - 椭圆中心 [x,y,z]。type:Vec3 required:true
100
+ * @param normal - 椭圆面法向 [x,y,z](非零)。type:Vec3 required:true
101
+ * @param majorRadius - 长半轴(mm,>0)。type:number required:true
102
+ * @param minorRadius - 短半轴(mm,>0 且 <= 长半轴)。type:number required:true
103
+ * @param startAngle - 起始角(度)。type:number required:true
104
+ * @param endAngle - 终止角(度)。type:number required:true
105
+ * @example
106
+ * const a = cad.ellipseArc([0,0,0], [0,0,1], 10, 5, 0, 90)
107
+ */
108
+ export declare const ellipseArc: ((center: Vec3, normal: Vec3, majorRadius: number, minorRadius: number, startAngleDeg: number, endAngleDeg: number) => Promise<Shape>) & {
109
+ __faijs__dualOp?: import("../../define-op.js").DualOpMeta;
110
+ };
111
+ /**
112
+ * 构造圆弧:过起点、以给定切向出发、终于终点(GC_MakeArcOfCircle 语义)。
113
+ * @group 创建
114
+ * @inputs 0
115
+ * @async false
116
+ * @qual ok
117
+ * @name tangentArc
118
+ * @note 平台 op:仅 occt 引擎(原生 makeTangentArc)。切向为零向量非法。
119
+ * @returns Shape 1D 圆弧(kind:'curve')。
120
+ * @param start - 起点 [x,y,z]。type:Vec3 required:true
121
+ * @param tangent - 起点切向 [x,y,z](非零,不必单位化)。type:Vec3 required:true
122
+ * @param end - 终点 [x,y,z]。type:Vec3 required:true
123
+ * @example
124
+ * const a = cad.tangentArc([0,0,0], [1,0,0], [5,5,0])
125
+ */
126
+ export declare const tangentArc: ((start: Vec3, tangent: Vec3, end: Vec3) => Promise<Shape>) & {
127
+ __faijs__dualOp?: import("../../define-op.js").DualOpMeta;
128
+ };
129
+ /**
130
+ * 点集**逼近**曲线:过点但不严格插值(逼近容差内贴合,产平滑 B 样条)。
131
+ * 与 L1 `interpolatePoints`(严格插值)成对的数学对偶路径。
132
+ * @group 创建
133
+ * @inputs 0
134
+ * @async false
135
+ * @qual ok
136
+ * @name approximatePoints
137
+ * @note 平台 op:仅 occt 引擎(原生 approximatePoints,tolerance 缺省 1e-3)。
138
+ * @returns Shape 1D 逼近曲线(kind:'curve')。
139
+ * @param points - 点集 [x,y,z][](≥2 点)。type:Vec3[] required:true
140
+ * @param tolerance - 逼近容差(mm,默认 1e-3)。type:number required:false
141
+ * @example
142
+ * const c = cad.approximatePoints([[0,0,0],[5,3,0],[10,0,0]])
143
+ */
144
+ export declare const approximatePoints: ((points: Vec3[], tolerance?: number | undefined) => Promise<Shape>) & {
145
+ __faijs__dualOp?: import("../../define-op.js").DualOpMeta;
146
+ };
147
+ /**
148
+ * 点集**插值**曲线,带端点切向约束(三次 B 样条,过全部点且端点切向指定)。
149
+ * @group 创建
150
+ * @inputs 0
151
+ * @async false
152
+ * @qual ok
153
+ * @name interpolateWithTangents
154
+ * @note 平台 op:仅 occt 引擎(原生 interpolatePointsWithTangents)。两端切向非零。
155
+ * @returns Shape 1D 插值曲线(kind:'curve')。
156
+ * @param points - 点集 [x,y,z][](≥2 点)。type:Vec3[] required:true
157
+ * @param startTangent - 起点切向 [x,y,z](非零)。type:Vec3 required:true
158
+ * @param endTangent - 终点切向 [x,y,z](非零)。type:Vec3 required:true
159
+ * @example
160
+ * const c = cad.interpolateWithTangents([[0,0,0],[5,3,0],[10,0,0]], [1,0,0], [1,0,0])
161
+ */
162
+ export declare const interpolateWithTangents: ((points: Vec3[], startTangent: Vec3, endTangent: Vec3) => Promise<Shape>) & {
163
+ __faijs__dualOp?: import("../../define-op.js").DualOpMeta;
164
+ };
165
+ /**
166
+ * NURBS 曲线升阶:把边/曲线的阶数提升 `elevateBy`(几何不变,表示空间变大)。
167
+ * @group 查询
168
+ * @inputs 1
169
+ * @async false
170
+ * @qual ok
171
+ * @name curveDegreeElevate
172
+ * @note 平台 op:仅 occt 引擎(原生 curveDegreeElevate)。输入边/曲线。
173
+ * @returns Shape 升阶后的 1D 曲线(kind:'curve')。
174
+ * @param curve - 输入边/曲线。type:Shape required:true
175
+ * @param elevateBy - 升阶量(正整数)。type:number required:true
176
+ * @example
177
+ * const up = cad.curveDegreeElevate(e, 2)
178
+ */
179
+ export declare const curveDegreeElevate: ((curve: Shape, elevateBy: number) => Promise<Shape>) & {
180
+ __faijs__dualOp?: import("../../define-op.js").DualOpMeta;
181
+ };
182
+ /**
183
+ * NURBS 曲线插节点:在曲线参数 `knot` 处插入节点 `times` 次(几何不变)。
184
+ * @group 查询
185
+ * @inputs 1
186
+ * @async false
187
+ * @qual ok
188
+ * @name curveKnotInsert
189
+ * @note 平台 op:仅 occt 引擎(原生 curveKnotInsert)。knot 是曲线参数(不是长度)。
190
+ * @returns Shape 插节点后的 1D 曲线(kind:'curve')。
191
+ * @param curve - 输入边/曲线。type:Shape required:true
192
+ * @param knot - 目标节点参数。type:number required:true
193
+ * @param times - 重复次数(正整数)。type:number required:true
194
+ * @example
195
+ * const refined = cad.curveKnotInsert(e, 0.5, 1)
196
+ */
197
+ export declare const curveKnotInsert: ((curve: Shape, knot: number, times: number) => Promise<Shape>) & {
198
+ __faijs__dualOp?: import("../../define-op.js").DualOpMeta;
199
+ };
200
+ /**
201
+ * NURBS 曲线去节点:在容差内移除参数 `knot` 处的节点(几何漂移不超过 tolerance)。
202
+ * @group 查询
203
+ * @inputs 1
204
+ * @async false
205
+ * @qual ok
206
+ * @name curveKnotRemove
207
+ * @note 平台 op:仅 occt 引擎(原生 curveKnotRemove)。knot 是曲线参数(不是长度)。
208
+ * @returns Shape 去节点后的 1D 曲线(kind:'curve')。
209
+ * @param curve - 输入边/曲线。type:Shape required:true
210
+ * @param knot - 目标节点参数。type:number required:true
211
+ * @param tolerance - 允许的几何漂移(mm,>0)。type:number required:true
212
+ * @example
213
+ * const lean = cad.curveKnotRemove(e, 0.5, 1e-4)
214
+ */
215
+ export declare const curveKnotRemove: ((curve: Shape, knot: number, tolerance: number) => Promise<Shape>) & {
216
+ __faijs__dualOp?: import("../../define-op.js").DualOpMeta;
217
+ };
218
+ /**
219
+ * 曲线是否周期(L1 契约只有 `curveIsClosed`,周期性是 occt 原生独有查询)。
220
+ * @group 查询
221
+ * @inputs 1
222
+ * @async false
223
+ * @qual ok
224
+ * @name curveIsPeriodic
225
+ * @note 平台 op:仅 occt 引擎(原生 curveIsPeriodic,L1 无对应成员)。非 occt 引擎
226
+ * 执行前报 E_BREP_UNSUPPORTED。
227
+ * @returns boolean 是否为周期曲线。
228
+ * @param curve - 被查询的边/曲线。type:Shape required:true
229
+ * @example
230
+ * const c = cad.circleArc([0,0,0], [0,0,1], 5, 0, 360)
231
+ * const periodic = cad.curveIsPeriodic(c)
232
+ */
233
+ export declare function curveIsPeriodic(curve: Shape): boolean;
234
+ export {};
235
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/curve-sketch/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAU7C,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAgEpC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,IAAI;;CAOf,CAAA;AA+BF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,SAAS;;CAQpB,CAAA;AA4BF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,WAAW;;CAQtB,CAAA;AA0BF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,UAAU;;CAQrB,CAAA;AAeF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,UAAU;;CAQrB,CAAA;AAkCF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB;;CAQ5B,CAAA;AAkBF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,uBAAuB;;CAQlC,CAAA;AAgBF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB;;CAO7B,CAAA;AAeF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,eAAe;;CAO1B,CAAA;AAeF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,eAAe;;CAQ1B,CAAA;AAMF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAKrD"}