@faicad/faijs 0.29.5 → 0.30.9

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 (582) hide show
  1. package/NOTICE +6 -5
  2. package/dist/api/api-namespace.d.ts +1 -1
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +53 -1
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/appearance.d.ts +0 -2
  7. package/dist/api/appearance.d.ts.map +1 -1
  8. package/dist/api/appearance.js +0 -2
  9. package/dist/api/appearance.js.map +1 -1
  10. package/dist/api/assembly/entities.d.ts +1 -1
  11. package/dist/api/assembly/entities.js +1 -1
  12. package/dist/api/assembly/entities.js.map +1 -1
  13. package/dist/api/assembly/index.d.ts +1 -1
  14. package/dist/api/assembly/index.js +1 -1
  15. package/dist/api/assembly/index.js.map +1 -1
  16. package/dist/api/assembly/joints.d.ts +33 -15
  17. package/dist/api/assembly/joints.d.ts.map +1 -1
  18. package/dist/api/assembly/joints.js +31 -13
  19. package/dist/api/assembly/joints.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.js +1 -1
  22. package/dist/api/assembly/preview.js.map +1 -1
  23. package/dist/api/assembly/solve.d.ts +1 -1
  24. package/dist/api/assembly/solve.js +1 -1
  25. package/dist/api/assembly/solve.js.map +1 -1
  26. package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.js +1 -1
  28. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  29. package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
  30. package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
  31. package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
  32. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  33. package/dist/api/assembly/solvers/global-solver.js +3 -4
  34. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  35. package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
  36. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
  37. package/dist/api/assembly/solvers/linalg.d.ts +2 -2
  38. package/dist/api/assembly/solvers/linalg.js +2 -2
  39. package/dist/api/assembly/solvers/linalg.js.map +1 -1
  40. package/dist/api/assembly/solvers/types.d.ts +2 -5
  41. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  42. package/dist/api/assembly/solvers/types.js +1 -4
  43. package/dist/api/assembly/solvers/types.js.map +1 -1
  44. package/dist/api/boolean.d.ts.map +1 -1
  45. package/dist/api/boolean.js +7 -6
  46. package/dist/api/boolean.js.map +1 -1
  47. package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
  48. package/dist/api/brep-mirror/booleanFns.js +5 -5
  49. package/dist/api/brep-mirror/booleanFns.js.map +1 -1
  50. package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
  51. package/dist/api/brep-mirror/compoundFns.js +4 -4
  52. package/dist/api/brep-mirror/compoundFns.js.map +1 -1
  53. package/dist/api/brep-mirror/healingFns.d.ts +4 -4
  54. package/dist/api/brep-mirror/healingFns.js +4 -4
  55. package/dist/api/brep-mirror/healingFns.js.map +1 -1
  56. package/dist/api/brep-mirror/hullFns.d.ts +2 -2
  57. package/dist/api/brep-mirror/hullFns.js +2 -2
  58. package/dist/api/brep-mirror/hullFns.js.map +1 -1
  59. package/dist/api/brep-mirror/patternFns.d.ts +5 -5
  60. package/dist/api/brep-mirror/patternFns.js +10 -10
  61. package/dist/api/brep-mirror/patternFns.js.map +1 -1
  62. package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
  63. package/dist/api/brep-mirror/primitiveFns.js +4 -4
  64. package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
  65. package/dist/api/brep-mirror/roofFns.d.ts +3 -3
  66. package/dist/api/brep-mirror/roofFns.js +7 -7
  67. package/dist/api/brep-mirror/roofFns.js.map +1 -1
  68. package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
  69. package/dist/api/brep-mirror/sweepFns.js +14 -14
  70. package/dist/api/brep-mirror/sweepFns.js.map +1 -1
  71. package/dist/api/brep-mirror/threadFns.d.ts +1 -1
  72. package/dist/api/brep-mirror/threadFns.js +1 -1
  73. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  74. package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
  75. package/dist/api/brep-mirror/topologyFns.js +8 -8
  76. package/dist/api/brep-mirror/topologyFns.js.map +1 -1
  77. package/dist/api/brep-operations/booleanFns.d.ts +40 -0
  78. package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
  79. package/dist/api/brep-operations/booleanFns.js +104 -0
  80. package/dist/api/brep-operations/booleanFns.js.map +1 -0
  81. package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
  82. package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
  83. package/dist/api/brep-operations/brepHelpers.js +131 -0
  84. package/dist/api/brep-operations/brepHelpers.js.map +1 -0
  85. package/dist/api/brep-operations/compoundFns.d.ts +46 -0
  86. package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
  87. package/dist/api/brep-operations/compoundFns.js +299 -0
  88. package/dist/api/brep-operations/compoundFns.js.map +1 -0
  89. package/dist/api/brep-operations/healingFns.d.ts +78 -0
  90. package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
  91. package/dist/api/brep-operations/healingFns.js +294 -0
  92. package/dist/api/brep-operations/healingFns.js.map +1 -0
  93. package/dist/api/brep-operations/hullFns.d.ts +20 -0
  94. package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
  95. package/dist/api/brep-operations/hullFns.js +46 -0
  96. package/dist/api/brep-operations/hullFns.js.map +1 -0
  97. package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
  98. package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
  99. package/dist/api/brep-operations/joinery-brep.js +463 -0
  100. package/dist/api/brep-operations/joinery-brep.js.map +1 -0
  101. package/dist/api/brep-operations/patternFns.d.ts +43 -0
  102. package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
  103. package/dist/api/brep-operations/patternFns.js +178 -0
  104. package/dist/api/brep-operations/patternFns.js.map +1 -0
  105. package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
  106. package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
  107. package/dist/api/brep-operations/primitiveFns.js +104 -0
  108. package/dist/api/brep-operations/primitiveFns.js.map +1 -0
  109. package/dist/api/brep-operations/roofFns.d.ts +24 -0
  110. package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
  111. package/dist/api/brep-operations/roofFns.js +229 -0
  112. package/dist/api/brep-operations/roofFns.js.map +1 -0
  113. package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
  114. package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
  115. package/dist/api/brep-operations/straightSkeleton.js +431 -0
  116. package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
  117. package/dist/api/brep-operations/sweepFns.d.ts +60 -0
  118. package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
  119. package/dist/api/brep-operations/sweepFns.js +323 -0
  120. package/dist/api/brep-operations/sweepFns.js.map +1 -0
  121. package/dist/api/brep-operations/threadFns.d.ts +83 -0
  122. package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
  123. package/dist/api/brep-operations/threadFns.js +138 -0
  124. package/dist/api/brep-operations/threadFns.js.map +1 -0
  125. package/dist/api/brep-operations/topologyFns.d.ts +90 -0
  126. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
  127. package/dist/api/brep-operations/topologyFns.js +276 -0
  128. package/dist/api/brep-operations/topologyFns.js.map +1 -0
  129. package/dist/api/brep-topology.d.ts +1 -1
  130. package/dist/api/brep-topology.d.ts.map +1 -1
  131. package/dist/api/brep-topology.js +1 -1
  132. package/dist/api/brep-topology.js.map +1 -1
  133. package/dist/api/brepjs-compat/index.d.ts +1 -1
  134. package/dist/api/brepjs-compat/index.js +3 -3
  135. package/dist/api/brepjs-compat/index.js.map +1 -1
  136. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
  137. package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
  138. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
  139. package/dist/api/curve-sketch/index.d.ts +235 -0
  140. package/dist/api/curve-sketch/index.d.ts.map +1 -0
  141. package/dist/api/curve-sketch/index.js +487 -0
  142. package/dist/api/curve-sketch/index.js.map +1 -0
  143. package/dist/api/engrave.d.ts.map +1 -1
  144. package/dist/api/engrave.js +3 -2
  145. package/dist/api/engrave.js.map +1 -1
  146. package/dist/api/export-brep.d.ts +41 -0
  147. package/dist/api/export-brep.d.ts.map +1 -0
  148. package/dist/api/export-brep.js +58 -0
  149. package/dist/api/export-brep.js.map +1 -0
  150. package/dist/api/export-stl.d.ts +50 -0
  151. package/dist/api/export-stl.d.ts.map +1 -0
  152. package/dist/api/export-stl.js +99 -0
  153. package/dist/api/export-stl.js.map +1 -0
  154. package/dist/api/extrude.d.ts +8 -11
  155. package/dist/api/extrude.d.ts.map +1 -1
  156. package/dist/api/extrude.js +11 -14
  157. package/dist/api/extrude.js.map +1 -1
  158. package/dist/api/fillet-variable.d.ts +2 -2
  159. package/dist/api/fillet-variable.js +2 -2
  160. package/dist/api/fillet-variable.js.map +1 -1
  161. package/dist/api/fillet.d.ts +2 -4
  162. package/dist/api/fillet.d.ts.map +1 -1
  163. package/dist/api/fillet.js +2 -4
  164. package/dist/api/fillet.js.map +1 -1
  165. package/dist/api/generated/2d.d.ts +4 -0
  166. package/dist/api/generated/2d.d.ts.map +1 -1
  167. package/dist/api/generated/2d.js +4 -0
  168. package/dist/api/generated/2d.js.map +1 -1
  169. package/dist/api/generated/core.d.ts +4 -0
  170. package/dist/api/generated/core.d.ts.map +1 -1
  171. package/dist/api/generated/core.js +4 -0
  172. package/dist/api/generated/core.js.map +1 -1
  173. package/dist/api/generated/gear.d.ts +4 -0
  174. package/dist/api/generated/gear.d.ts.map +1 -1
  175. package/dist/api/generated/gear.js +4 -0
  176. package/dist/api/generated/gear.js.map +1 -1
  177. package/dist/api/generated/io.d.ts +4 -0
  178. package/dist/api/generated/io.d.ts.map +1 -1
  179. package/dist/api/generated/io.js +4 -0
  180. package/dist/api/generated/io.js.map +1 -1
  181. package/dist/api/generated/kernel.d.ts +4 -0
  182. package/dist/api/generated/kernel.d.ts.map +1 -1
  183. package/dist/api/generated/kernel.js +4 -0
  184. package/dist/api/generated/kernel.js.map +1 -1
  185. package/dist/api/generated/measurement.d.ts +21 -21
  186. package/dist/api/generated/measurement.d.ts.map +1 -1
  187. package/dist/api/generated/measurement.js +25 -21
  188. package/dist/api/generated/measurement.js.map +1 -1
  189. package/dist/api/generated/ns.d.ts +4 -0
  190. package/dist/api/generated/ns.d.ts.map +1 -1
  191. package/dist/api/generated/ns.js +4 -0
  192. package/dist/api/generated/ns.js.map +1 -1
  193. package/dist/api/generated/operations.d.ts +32 -32
  194. package/dist/api/generated/operations.d.ts.map +1 -1
  195. package/dist/api/generated/operations.js +52 -48
  196. package/dist/api/generated/operations.js.map +1 -1
  197. package/dist/api/generated/projection.d.ts +4 -0
  198. package/dist/api/generated/projection.d.ts.map +1 -1
  199. package/dist/api/generated/projection.js +4 -0
  200. package/dist/api/generated/projection.js.map +1 -1
  201. package/dist/api/generated/query.d.ts +4 -0
  202. package/dist/api/generated/query.d.ts.map +1 -1
  203. package/dist/api/generated/query.js +4 -0
  204. package/dist/api/generated/query.js.map +1 -1
  205. package/dist/api/generated/sketching.d.ts +2 -2
  206. package/dist/api/generated/sketching.d.ts.map +1 -1
  207. package/dist/api/generated/sketching.js +7 -3
  208. package/dist/api/generated/sketching.js.map +1 -1
  209. package/dist/api/generated/text.d.ts +4 -0
  210. package/dist/api/generated/text.d.ts.map +1 -1
  211. package/dist/api/generated/text.js +4 -0
  212. package/dist/api/generated/text.js.map +1 -1
  213. package/dist/api/generated/topology.d.ts +45 -45
  214. package/dist/api/generated/topology.d.ts.map +1 -1
  215. package/dist/api/generated/topology.js +67 -63
  216. package/dist/api/generated/topology.js.map +1 -1
  217. package/dist/api/generated/view.d.ts +4 -0
  218. package/dist/api/generated/view.d.ts.map +1 -1
  219. package/dist/api/generated/view.js +4 -0
  220. package/dist/api/generated/view.js.map +1 -1
  221. package/dist/api/geom-types/constants.d.ts +11 -0
  222. package/dist/api/geom-types/constants.d.ts.map +1 -0
  223. package/dist/api/geom-types/constants.js +11 -0
  224. package/dist/api/geom-types/constants.js.map +1 -0
  225. package/dist/api/geom-types/index.d.ts +21 -0
  226. package/dist/api/geom-types/index.d.ts.map +1 -0
  227. package/dist/api/geom-types/index.js +22 -0
  228. package/dist/api/geom-types/index.js.map +1 -0
  229. package/dist/api/geom-types/planeOps.d.ts +98 -0
  230. package/dist/api/geom-types/planeOps.d.ts.map +1 -0
  231. package/dist/api/geom-types/planeOps.js +170 -0
  232. package/dist/api/geom-types/planeOps.js.map +1 -0
  233. package/dist/api/geom-types/planeTypes.d.ts +24 -0
  234. package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
  235. package/dist/api/geom-types/planeTypes.js +8 -0
  236. package/dist/api/geom-types/planeTypes.js.map +1 -0
  237. package/dist/api/geom-types/types.d.ts +64 -0
  238. package/dist/api/geom-types/types.d.ts.map +1 -0
  239. package/dist/api/geom-types/types.js +48 -0
  240. package/dist/api/geom-types/types.js.map +1 -0
  241. package/dist/api/geom-types/vecOps.d.ts +124 -0
  242. package/dist/api/geom-types/vecOps.d.ts.map +1 -0
  243. package/dist/api/geom-types/vecOps.js +202 -0
  244. package/dist/api/geom-types/vecOps.js.map +1 -0
  245. package/dist/api/geom.d.ts.map +1 -1
  246. package/dist/api/geom.js +6 -5
  247. package/dist/api/geom.js.map +1 -1
  248. package/dist/api/half-space.d.ts +56 -0
  249. package/dist/api/half-space.d.ts.map +1 -0
  250. package/dist/api/half-space.js +82 -0
  251. package/dist/api/half-space.js.map +1 -0
  252. package/dist/api/helix.d.ts +10 -1
  253. package/dist/api/helix.d.ts.map +1 -1
  254. package/dist/api/helix.js +19 -3
  255. package/dist/api/helix.js.map +1 -1
  256. package/dist/api/index.d.ts +15 -6
  257. package/dist/api/index.d.ts.map +1 -1
  258. package/dist/api/index.js +29 -8
  259. package/dist/api/index.js.map +1 -1
  260. package/dist/api/internal/compat-op.d.ts +4 -30
  261. package/dist/api/internal/compat-op.d.ts.map +1 -1
  262. package/dist/api/internal/compat-op.js +10 -42
  263. package/dist/api/internal/compat-op.js.map +1 -1
  264. package/dist/api/internal/compat-projection.d.ts +5 -5
  265. package/dist/api/internal/compat-projection.js +5 -5
  266. package/dist/api/internal/compat-projection.js.map +1 -1
  267. package/dist/api/internal/dual-form-args.d.ts +0 -2
  268. package/dist/api/internal/dual-form-args.d.ts.map +1 -1
  269. package/dist/api/internal/dual-form-args.js +1 -3
  270. package/dist/api/internal/dual-form-args.js.map +1 -1
  271. package/dist/api/internal/l3-bridge.d.ts +5 -37
  272. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  273. package/dist/api/internal/l3-bridge.js +7 -76
  274. package/dist/api/internal/l3-bridge.js.map +1 -1
  275. package/dist/api/internal/profile-wire.d.ts +1 -1
  276. package/dist/api/internal/profile-wire.js +1 -1
  277. package/dist/api/internal/profile-wire.js.map +1 -1
  278. package/dist/api/internal/result-unwrap.d.ts +4 -6
  279. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  280. package/dist/api/internal/result-unwrap.js +4 -6
  281. package/dist/api/internal/result-unwrap.js.map +1 -1
  282. package/dist/api/knurl.d.ts.map +1 -1
  283. package/dist/api/knurl.js +5 -3
  284. package/dist/api/knurl.js.map +1 -1
  285. package/dist/api/loft.d.ts +2 -2
  286. package/dist/api/loft.d.ts.map +1 -1
  287. package/dist/api/loft.js +2 -2
  288. package/dist/api/loft.js.map +1 -1
  289. package/dist/api/measurement/index.d.ts +3 -3
  290. package/dist/api/measurement/index.js +3 -3
  291. package/dist/api/measurement/index.js.map +1 -1
  292. package/dist/api/meta.d.ts +0 -2
  293. package/dist/api/meta.d.ts.map +1 -1
  294. package/dist/api/meta.js +0 -2
  295. package/dist/api/meta.js.map +1 -1
  296. package/dist/api/offset2d.d.ts +49 -0
  297. package/dist/api/offset2d.d.ts.map +1 -0
  298. package/dist/api/offset2d.js +86 -0
  299. package/dist/api/offset2d.js.map +1 -0
  300. package/dist/api/pattern.js +3 -3
  301. package/dist/api/pattern.js.map +1 -1
  302. package/dist/api/primitives.d.ts.map +1 -1
  303. package/dist/api/primitives.js +7 -6
  304. package/dist/api/primitives.js.map +1 -1
  305. package/dist/api/replicate.d.ts +2 -2
  306. package/dist/api/replicate.d.ts.map +1 -1
  307. package/dist/api/replicate.js +12 -12
  308. package/dist/api/replicate.js.map +1 -1
  309. package/dist/api/result.d.ts +1 -1
  310. package/dist/api/result.js +1 -1
  311. package/dist/api/result.js.map +1 -1
  312. package/dist/api/revolve.d.ts +2 -2
  313. package/dist/api/revolve.js +3 -3
  314. package/dist/api/revolve.js.map +1 -1
  315. package/dist/api/screw.d.ts +1 -1
  316. package/dist/api/screw.d.ts.map +1 -1
  317. package/dist/api/screw.js +5 -4
  318. package/dist/api/screw.js.map +1 -1
  319. package/dist/api/sdf.d.ts.map +1 -1
  320. package/dist/api/sdf.js +3 -2
  321. package/dist/api/sdf.js.map +1 -1
  322. package/dist/api/shape-type/index.d.ts +141 -0
  323. package/dist/api/shape-type/index.d.ts.map +1 -0
  324. package/dist/api/shape-type/index.js +182 -0
  325. package/dist/api/shape-type/index.js.map +1 -0
  326. package/dist/api/shell.d.ts +2 -2
  327. package/dist/api/shell.js +2 -2
  328. package/dist/api/shell.js.map +1 -1
  329. package/dist/api/solid-from-faces.d.ts +45 -0
  330. package/dist/api/solid-from-faces.d.ts.map +1 -0
  331. package/dist/api/solid-from-faces.js +72 -0
  332. package/dist/api/solid-from-faces.js.map +1 -0
  333. package/dist/api/solid-offset/index.d.ts +67 -0
  334. package/dist/api/solid-offset/index.d.ts.map +1 -0
  335. package/dist/api/solid-offset/index.js +132 -0
  336. package/dist/api/solid-offset/index.js.map +1 -0
  337. package/dist/api/surface/arg-spec.d.ts +35 -33
  338. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  339. package/dist/api/surface/arg-spec.js +222 -224
  340. package/dist/api/surface/arg-spec.js.map +1 -1
  341. package/dist/api/surface-face/index.d.ts +104 -0
  342. package/dist/api/surface-face/index.d.ts.map +1 -0
  343. package/dist/api/surface-face/index.js +217 -0
  344. package/dist/api/surface-face/index.js.map +1 -0
  345. package/dist/api/surface.d.ts +44 -0
  346. package/dist/api/surface.d.ts.map +1 -0
  347. package/dist/api/surface.js +66 -0
  348. package/dist/api/surface.js.map +1 -0
  349. package/dist/api/sweep.d.ts +59 -9
  350. package/dist/api/sweep.d.ts.map +1 -1
  351. package/dist/api/sweep.js +11 -6
  352. package/dist/api/sweep.js.map +1 -1
  353. package/dist/api/thicken.d.ts +1 -1
  354. package/dist/api/thicken.js +1 -1
  355. package/dist/api/thicken.js.map +1 -1
  356. package/dist/api/transform.d.ts +5 -5
  357. package/dist/api/transform.d.ts.map +1 -1
  358. package/dist/api/transform.js +11 -10
  359. package/dist/api/transform.js.map +1 -1
  360. package/dist/api/view/cameraFns.d.ts +1 -1
  361. package/dist/api/view/cameraFns.d.ts.map +1 -1
  362. package/dist/api/view/cameraFns.js +1 -1
  363. package/dist/api/view/cameraFns.js.map +1 -1
  364. package/dist/api/view/index.d.ts +0 -2
  365. package/dist/api/view/index.d.ts.map +1 -1
  366. package/dist/api/view/index.js +0 -2
  367. package/dist/api/view/index.js.map +1 -1
  368. package/dist/api/view/projectionPlanes.d.ts +1 -1
  369. package/dist/api/view/projectionPlanes.d.ts.map +1 -1
  370. package/dist/api/view/projectionPlanes.js.map +1 -1
  371. package/dist/api/view/view-camera.d.ts +7 -9
  372. package/dist/api/view/view-camera.d.ts.map +1 -1
  373. package/dist/api/view/view-camera.js +4 -6
  374. package/dist/api/view/view-camera.js.map +1 -1
  375. package/dist/api/view/view-projection.d.ts +0 -2
  376. package/dist/api/view/view-projection.d.ts.map +1 -1
  377. package/dist/api/view/view-projection.js +0 -2
  378. package/dist/api/view/view-projection.js.map +1 -1
  379. package/dist/api/view/view-sheet.d.ts +0 -2
  380. package/dist/api/view/view-sheet.d.ts.map +1 -1
  381. package/dist/api/view/view-sheet.js +0 -2
  382. package/dist/api/view/view-sheet.js.map +1 -1
  383. package/dist/api/view-export/index.d.ts +97 -0
  384. package/dist/api/view-export/index.d.ts.map +1 -0
  385. package/dist/api/view-export/index.js +118 -0
  386. package/dist/api/view-export/index.js.map +1 -0
  387. package/dist/brep/brep-ops.d.ts +89 -1
  388. package/dist/brep/brep-ops.d.ts.map +1 -1
  389. package/dist/brep/brep-ops.js +176 -10
  390. package/dist/brep/brep-ops.js.map +1 -1
  391. package/dist/brep/brep-topology.d.ts +20 -0
  392. package/dist/brep/brep-topology.d.ts.map +1 -1
  393. package/dist/brep/brep-topology.js +46 -0
  394. package/dist/brep/brep-topology.js.map +1 -1
  395. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  396. package/dist/brep/engine/adapters/occt.js +7 -7
  397. package/dist/brep/engine/adapters/occt.js.map +1 -1
  398. package/dist/brep/engine/primitives.d.ts +2 -3
  399. package/dist/brep/engine/primitives.d.ts.map +1 -1
  400. package/dist/brep/engine/primitives.js +1 -2
  401. package/dist/brep/engine/primitives.js.map +1 -1
  402. package/dist/brep/engine/registry.d.ts +1 -1
  403. package/dist/brep/engine/registry.js +1 -1
  404. package/dist/brep/engine/registry.js.map +1 -1
  405. package/dist/brep/engine/types.d.ts +2 -2
  406. package/dist/brep/engine/types.js.map +1 -1
  407. package/dist/brep/handle-bridge.d.ts +2 -2
  408. package/dist/brep/handle-bridge.js +2 -2
  409. package/dist/brep/handle-bridge.js.map +1 -1
  410. package/dist/brep/index.d.ts +6 -3
  411. package/dist/brep/index.d.ts.map +1 -1
  412. package/dist/brep/index.js +6 -3
  413. package/dist/brep/index.js.map +1 -1
  414. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  415. package/dist/brepkit-kernel/brepkitKernel.js +2 -2
  416. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  417. package/dist/browser.d.ts +2 -2
  418. package/dist/browser.d.ts.map +1 -1
  419. package/dist/browser.js +5 -4
  420. package/dist/browser.js.map +1 -1
  421. package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
  422. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  423. package/dist/cad-runtime/admit-compat-lib.js +3 -9
  424. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  425. package/dist/cad-runtime/backend-dispatch.js +12 -3
  426. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  427. package/dist/cad-runtime/direct-executor.d.ts +6 -3
  428. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  429. package/dist/cad-runtime/direct-executor.js +31 -9
  430. package/dist/cad-runtime/direct-executor.js.map +1 -1
  431. package/dist/cad-runtime/interp/env.d.ts +1 -1
  432. package/dist/cad-runtime/interp/env.js.map +1 -1
  433. package/dist/cad-runtime/lib-id.d.ts +0 -2
  434. package/dist/cad-runtime/lib-id.d.ts.map +1 -1
  435. package/dist/cad-runtime/lib-id.js +0 -2
  436. package/dist/cad-runtime/lib-id.js.map +1 -1
  437. package/dist/cad-runtime/live-shapes.d.ts +3 -5
  438. package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
  439. package/dist/cad-runtime/live-shapes.js +8 -10
  440. package/dist/cad-runtime/live-shapes.js.map +1 -1
  441. package/dist/cad-runtime/ports.d.ts +3 -3
  442. package/dist/cad-runtime/ports.js.map +1 -1
  443. package/dist/cad-runtime/runtime.d.ts +21 -7
  444. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  445. package/dist/cad-runtime/runtime.js +45 -6
  446. package/dist/cad-runtime/runtime.js.map +1 -1
  447. package/dist/define-op.d.ts +4 -3
  448. package/dist/define-op.d.ts.map +1 -1
  449. package/dist/define-op.js +2 -2
  450. package/dist/define-op.js.map +1 -1
  451. package/dist/geometry2d/bridge/plane.d.ts +1 -1
  452. package/dist/geometry2d/bridge/plane.js +1 -1
  453. package/dist/geometry2d/bridge/plane.js.map +1 -1
  454. package/dist/geometry2d/curve2d.d.ts +1 -1
  455. package/dist/geometry2d/curve2d.js +1 -1
  456. package/dist/geometry2d/curve2d.js.map +1 -1
  457. package/dist/index.d.ts +1 -1
  458. package/dist/index.d.ts.map +1 -1
  459. package/dist/index.js +10 -4
  460. package/dist/index.js.map +1 -1
  461. package/dist/io/fai-zip/container-read.d.ts +16 -0
  462. package/dist/io/fai-zip/container-read.d.ts.map +1 -1
  463. package/dist/io/fai-zip/container-read.js +22 -0
  464. package/dist/io/fai-zip/container-read.js.map +1 -1
  465. package/dist/io/fai-zip/index.d.ts +1 -1
  466. package/dist/io/fai-zip/index.d.ts.map +1 -1
  467. package/dist/io/fai-zip/index.js +1 -1
  468. package/dist/io/fai-zip/index.js.map +1 -1
  469. package/dist/lang/code-to-args.d.ts.map +1 -1
  470. package/dist/lang/code-to-args.js +10 -1
  471. package/dist/lang/code-to-args.js.map +1 -1
  472. package/dist/lang/determinism-scanner.d.ts.map +1 -1
  473. package/dist/lang/determinism-scanner.js +22 -9
  474. package/dist/lang/determinism-scanner.js.map +1 -1
  475. package/dist/lang/metadata-extractor.d.ts +27 -6
  476. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  477. package/dist/lang/metadata-extractor.js +88 -8
  478. package/dist/lang/metadata-extractor.js.map +1 -1
  479. package/dist/lang/parse-error.d.ts +4 -0
  480. package/dist/lang/parse-error.d.ts.map +1 -1
  481. package/dist/lang/parse-error.js.map +1 -1
  482. package/dist/lang/security-scanner.d.ts +27 -2
  483. package/dist/lang/security-scanner.d.ts.map +1 -1
  484. package/dist/lang/security-scanner.js +29 -2
  485. package/dist/lang/security-scanner.js.map +1 -1
  486. package/dist/lang/source-edit.d.ts +2 -2
  487. package/dist/lang/source-edit.js.map +1 -1
  488. package/dist/lang/symbol-table.generated.d.ts +36 -0
  489. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  490. package/dist/lang/symbol-table.generated.js +36 -0
  491. package/dist/lang/symbol-table.generated.js.map +1 -1
  492. package/dist/mesh/import-model.d.ts +94 -0
  493. package/dist/mesh/import-model.d.ts.map +1 -0
  494. package/dist/mesh/import-model.js +15 -0
  495. package/dist/mesh/import-model.js.map +1 -0
  496. package/dist/mesh/index.d.ts +19 -58
  497. package/dist/mesh/index.d.ts.map +1 -1
  498. package/dist/mesh/index.js +19 -70
  499. package/dist/mesh/index.js.map +1 -1
  500. package/dist/mesh/io.d.ts +33 -16
  501. package/dist/mesh/io.d.ts.map +1 -1
  502. package/dist/mesh/io.js +144 -39
  503. package/dist/mesh/io.js.map +1 -1
  504. package/dist/mesh/primitives.js +1 -1
  505. package/dist/mesh/primitives.js.map +1 -1
  506. package/dist/mesh/threemf-bambu.d.ts +12 -1
  507. package/dist/mesh/threemf-bambu.d.ts.map +1 -1
  508. package/dist/mesh/threemf-bambu.js +68 -16
  509. package/dist/mesh/threemf-bambu.js.map +1 -1
  510. package/dist/mesh/threemf-loader.d.ts +14 -1
  511. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  512. package/dist/mesh/threemf-loader.js +24 -7
  513. package/dist/mesh/threemf-loader.js.map +1 -1
  514. package/dist/mesh/transform.d.ts +1 -1
  515. package/dist/mesh/transform.js +1 -1
  516. package/dist/mesh/transform.js.map +1 -1
  517. package/dist/mesh/types.d.ts +5 -5
  518. package/dist/mesh/types.d.ts.map +1 -1
  519. package/dist/mesh/types.js.map +1 -1
  520. package/dist/node-host/cli.d.ts +49 -1
  521. package/dist/node-host/cli.d.ts.map +1 -1
  522. package/dist/node-host/cli.js +125 -19
  523. package/dist/node-host/cli.js.map +1 -1
  524. package/dist/node-host/execute-script.d.ts +55 -0
  525. package/dist/node-host/execute-script.d.ts.map +1 -0
  526. package/dist/node-host/execute-script.js +46 -0
  527. package/dist/node-host/execute-script.js.map +1 -0
  528. package/dist/node.d.ts +2 -0
  529. package/dist/node.d.ts.map +1 -1
  530. package/dist/node.js +3 -0
  531. package/dist/node.js.map +1 -1
  532. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
  533. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
  534. package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
  535. package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
  536. package/dist/occt-kernel/hullGeometry.d.ts +2 -2
  537. package/dist/occt-kernel/hullGeometry.js +2 -3
  538. package/dist/occt-kernel/hullGeometry.js.map +1 -1
  539. package/dist/occt-kernel/hullOps.d.ts +3 -3
  540. package/dist/occt-kernel/hullOps.js +4 -4
  541. package/dist/occt-kernel/hullOps.js.map +1 -1
  542. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  543. package/dist/occt-kernel/occt-primitives.js +31 -4
  544. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  545. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  546. package/dist/occt-kernel/occtKernel.js +18 -0
  547. package/dist/occt-kernel/occtKernel.js.map +1 -1
  548. package/dist/occt-scan/recognize.d.ts +58 -0
  549. package/dist/occt-scan/recognize.d.ts.map +1 -0
  550. package/dist/occt-scan/recognize.js +216 -0
  551. package/dist/occt-scan/recognize.js.map +1 -0
  552. package/dist/primitives/brep-primitives.js +7 -7
  553. package/dist/primitives/brep-primitives.js.map +1 -1
  554. package/dist/result/bug.d.ts +1 -1
  555. package/dist/result/bug.js +1 -1
  556. package/dist/result/bug.js.map +1 -1
  557. package/dist/result/errors.d.ts +2 -2
  558. package/dist/result/errors.d.ts.map +1 -1
  559. package/dist/result/errors.js +1 -1
  560. package/dist/result/errors.js.map +1 -1
  561. package/dist/result/vec3.d.ts +1 -1
  562. package/dist/result/vec3.js +1 -1
  563. package/dist/result/vec3.js.map +1 -1
  564. package/dist/runtime-state.d.ts +16 -0
  565. package/dist/runtime-state.d.ts.map +1 -1
  566. package/dist/runtime-state.js +27 -0
  567. package/dist/runtime-state.js.map +1 -1
  568. package/dist/script-globals.d.ts +24 -0
  569. package/dist/script-globals.d.ts.map +1 -0
  570. package/dist/script-globals.js +24 -0
  571. package/dist/script-globals.js.map +1 -0
  572. package/dist/shape.d.ts +24 -0
  573. package/dist/shape.d.ts.map +1 -1
  574. package/dist/shape.js +40 -0
  575. package/dist/shape.js.map +1 -1
  576. package/dist/topology/naming/lineage.d.ts +3 -2
  577. package/dist/topology/naming/lineage.d.ts.map +1 -1
  578. package/dist/topology/naming/lineage.js.map +1 -1
  579. package/dist/weapp.d.ts +1 -1
  580. package/dist/weapp.js +1 -1
  581. package/dist/weapp.js.map +1 -1
  582. package/package.json +8 -10
@@ -0,0 +1,487 @@
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 { solidToShape } from '../../brep/brep-ops.js';
30
+ import { getBrepApi } from '../../brep/handle-bridge.js';
31
+ import { brepOf, fromBrepCurve } from '../../shape.js';
32
+ import { defineOp } from '../../sdk.js';
33
+ import { getOcctKernel } from '../../occt-kernel/occtKernel.js';
34
+ import { assertEngineFor } from '../internal/l3-bridge.js';
35
+ /** 度 → 弧度(脚本面按契约收度;occt Geom_TrimmedCurve 吃弧度)。 */
36
+ const DEG2RAD = Math.PI / 180;
37
+ /** 1D 曲线产物登记:内核句柄 → kind:'curve' 的 faijs Shape。 */
38
+ function adoptCurve(handle) {
39
+ return fromBrepCurve(solidToShape(getBrepApi(), handle), { solid: handle });
40
+ }
41
+ /** 元组 → {x,y,z}(同 halfSpace:occt 原生向量形参是 {x,y,z} 对象)。 */
42
+ function toVec3(v, op, which) {
43
+ if (!Array.isArray(v) ||
44
+ v.length !== 3 ||
45
+ v.some((n) => typeof n !== 'number' || !Number.isFinite(n))) {
46
+ throw new Error(`E_${op.toUpperCase()}_BAD_${which.toUpperCase()}: ${which} must be [x,y,z] finite numbers`);
47
+ }
48
+ return { x: v[0], y: v[1], z: v[2] };
49
+ }
50
+ /** 非零向量校验(方向/切向量)。 */
51
+ function toNonZeroVec3(v, op, which) {
52
+ const out = toVec3(v, op, which);
53
+ if (out.x === 0 && out.y === 0 && out.z === 0) {
54
+ throw new Error(`E_${op.toUpperCase()}_BAD_${which.toUpperCase()}: ${which} must be a non-zero vector`);
55
+ }
56
+ return out;
57
+ }
58
+ /** 曲线输入 Shape → 内核句柄(无 BREP 槽报错)。 */
59
+ function curveHandleOf(shape, op) {
60
+ const h = brepOf(shape);
61
+ if (!h) {
62
+ throw new Error(`E_${op.toUpperCase()}_NO_BREP: ${op} requires a BREP handle (mesh-only shape has none)`);
63
+ }
64
+ return h;
65
+ }
66
+ // ─────────────────────────────────────────────────────────────────────────────
67
+ // edge — 顶点对构造边(occt 原生 makeEdge;顶点可来自 vertex Shape 或 [x,y,z])
68
+ // ─────────────────────────────────────────────────────────────────────────────
69
+ /** 顶点入参:vertex Shape 或 [x,y,z] 点(内部经契约 makeVertex 物化)。 */
70
+ function vertexHandleOf(v, op) {
71
+ if (Array.isArray(v)) {
72
+ const p = toVec3(v, op, 'vertex');
73
+ return getBrepApi().makeVertex(p.x, p.y, p.z);
74
+ }
75
+ return curveHandleOf(v, op);
76
+ }
77
+ /** BREP 路径:顶点对 → occt 原生 makeEdge。 */
78
+ function edgeBrep(v1, v2) {
79
+ if (v1 === undefined || v2 === undefined) {
80
+ throw new Error('E_EDGE_MISSING_VERTEX: edge requires two vertices (vertex Shape or [x,y,z])');
81
+ }
82
+ const h1 = vertexHandleOf(v1, 'edge');
83
+ const h2 = vertexHandleOf(v2, 'edge');
84
+ const handle = getOcctKernel().makeEdge(h1, h2);
85
+ return adoptCurve(handle);
86
+ }
87
+ /**
88
+ * 两顶点构造边。顶点入参可以是 vertex Shape,也可以是 `[x,y,z]` 点
89
+ * (点经 L1 契约 `makeVertex` 物化成顶点再配边)。
90
+ * @group 创建
91
+ * @inputs 2
92
+ * @async false
93
+ * @qual ok
94
+ * @name edge
95
+ * @note 平台 op:仅 occt 引擎(原生 makeEdge,L1 契约只有 makeLineEdge 等按几何构造)。
96
+ * 非 occt 引擎执行前报错;brep_mock 不拦截。
97
+ * @returns Shape 1D 直线边(kind:'curve')。
98
+ * @param v1 - 第一个顶点(vertex Shape 或 [x,y,z])。type:Shape|Vec3 required:true
99
+ * @param v2 - 第二个顶点(vertex Shape 或 [x,y,z])。type:Shape|Vec3 required:true
100
+ * @example
101
+ * const e = cad.edge([0,0,0], [10,0,0])
102
+ */
103
+ export const edge = defineOp({
104
+ name: 'edge',
105
+ brep(v1, v2) {
106
+ return edgeBrep(v1, v2);
107
+ },
108
+ engines: ['occt'],
109
+ naming: { kind: 'unmodeled', reason: '1D edge has no face role vocabulary' },
110
+ });
111
+ // ─────────────────────────────────────────────────────────────────────────────
112
+ // circleArc — 圆心+法向+半径+起止角(度)构造圆弧
113
+ // ─────────────────────────────────────────────────────────────────────────────
114
+ /** BREP 路径:occt 原生 makeCircleArc(角度内部换算弧度)。 */
115
+ function circleArcBrep(center, normal, radius, startAngleDeg, endAngleDeg) {
116
+ if (typeof radius !== 'number' || !(radius > 0)) {
117
+ throw new Error('E_CIRCLEARC_BAD_RADIUS: radius must be a positive number');
118
+ }
119
+ if (typeof startAngleDeg !== 'number' || !Number.isFinite(startAngleDeg) ||
120
+ typeof endAngleDeg !== 'number' || !Number.isFinite(endAngleDeg)) {
121
+ throw new Error('E_CIRCLEARC_BAD_ANGLE: startAngle/endAngle must be finite numbers (degrees)');
122
+ }
123
+ const c = toVec3(center, 'circleArc', 'center');
124
+ const n = toNonZeroVec3(normal, 'circleArc', 'normal');
125
+ const handle = getOcctKernel().makeCircleArc(c, n, radius, startAngleDeg * DEG2RAD, endAngleDeg * DEG2RAD);
126
+ return adoptCurve(handle);
127
+ }
128
+ /**
129
+ * 构造圆弧:圆心 + 法向 + 半径 + 起止角(度,绕法向右手逆时针)。
130
+ * @group 创建
131
+ * @inputs 0
132
+ * @async false
133
+ * @qual ok
134
+ * @name circleArc
135
+ * @note 平台 op:仅 occt 引擎(原生 makeCircleArc)。角度单位是**度**(内部换算弧度
136
+ * 传给 occt 的 Geom_TrimmedCurve)。
137
+ * @returns Shape 1D 圆弧(kind:'curve')。
138
+ * @param center - 圆心 [x,y,z]。type:Vec3 required:true
139
+ * @param normal - 圆面法向 [x,y,z](非零)。type:Vec3 required:true
140
+ * @param radius - 半径(mm,>0)。type:number required:true
141
+ * @param startAngle - 起始角(度,自法向基准 X 方向起量)。type:number required:true
142
+ * @param endAngle - 终止角(度)。type:number required:true
143
+ * @example
144
+ * const a = cad.circleArc([0,0,0], [0,0,1], 5, 0, 90)
145
+ */
146
+ export const circleArc = defineOp({
147
+ name: 'circleArc',
148
+ paramDims: { center: 'length', normal: 'length', radius: 'length', startAngle: 'angle', endAngle: 'angle' },
149
+ brep(center, normal, radius, startAngleDeg, endAngleDeg) {
150
+ return circleArcBrep(center, normal, radius, startAngleDeg, endAngleDeg);
151
+ },
152
+ engines: ['occt'],
153
+ naming: { kind: 'unmodeled', reason: '1D arc has no face role vocabulary' },
154
+ });
155
+ // ─────────────────────────────────────────────────────────────────────────────
156
+ // ellipseEdge / ellipseArc — 椭圆整边 / 椭圆弧
157
+ // ─────────────────────────────────────────────────────────────────────────────
158
+ /** 椭圆公共参数校验:两半径均正,且 major > minor(gp_Elips 约束)。 */
159
+ function checkEllipseRadii(op, majorRadius, minorRadius) {
160
+ if (typeof majorRadius !== 'number' || !(majorRadius > 0)) {
161
+ throw new Error(`E_${op.toUpperCase()}_BAD_MAJOR: majorRadius must be a positive number`);
162
+ }
163
+ if (typeof minorRadius !== 'number' || !(minorRadius > 0)) {
164
+ throw new Error(`E_${op.toUpperCase()}_BAD_MINOR: minorRadius must be a positive number`);
165
+ }
166
+ if (minorRadius > majorRadius) {
167
+ throw new Error(`E_${op.toUpperCase()}_BAD_RADII: minorRadius must be <= majorRadius (gp_Elips constraint)`);
168
+ }
169
+ }
170
+ /** BREP 路径:occt 原生 makeEllipseEdge。 */
171
+ function ellipseEdgeBrep(center, normal, majorRadius, minorRadius) {
172
+ checkEllipseRadii('ELLIPSEEDGE', majorRadius, minorRadius);
173
+ const c = toVec3(center, 'ellipseEdge', 'center');
174
+ const n = toNonZeroVec3(normal, 'ellipseEdge', 'normal');
175
+ const handle = getOcctKernel().makeEllipseEdge(c, n, majorRadius, minorRadius);
176
+ return adoptCurve(handle);
177
+ }
178
+ /**
179
+ * 构造整椭圆边:中心 + 法向 + 长半轴 + 短半轴。
180
+ * @group 创建
181
+ * @inputs 0
182
+ * @async false
183
+ * @qual ok
184
+ * @name ellipseEdge
185
+ * @note 平台 op:仅 occt 引擎(原生 makeEllipseEdge)。要求 majorRadius >= minorRadius。
186
+ * @returns Shape 1D 椭圆边(kind:'curve')。
187
+ * @param center - 椭圆中心 [x,y,z]。type:Vec3 required:true
188
+ * @param normal - 椭圆面法向 [x,y,z](非零)。type:Vec3 required:true
189
+ * @param majorRadius - 长半轴(mm,>0)。type:number required:true
190
+ * @param minorRadius - 短半轴(mm,>0 且 <= 长半轴)。type:number required:true
191
+ * @example
192
+ * const e = cad.ellipseEdge([0,0,0], [0,0,1], 10, 5)
193
+ */
194
+ export const ellipseEdge = defineOp({
195
+ name: 'ellipseEdge',
196
+ paramDims: { center: 'length', normal: 'length', majorRadius: 'length', minorRadius: 'length' },
197
+ brep(center, normal, majorRadius, minorRadius) {
198
+ return ellipseEdgeBrep(center, normal, majorRadius, minorRadius);
199
+ },
200
+ engines: ['occt'],
201
+ naming: { kind: 'unmodeled', reason: '1D ellipse has no face role vocabulary' },
202
+ });
203
+ /** BREP 路径:occt 原生 makeEllipseArc(角度内部换算弧度)。 */
204
+ function ellipseArcBrep(center, normal, majorRadius, minorRadius, startAngleDeg, endAngleDeg) {
205
+ checkEllipseRadii('ELLIPSEARC', majorRadius, minorRadius);
206
+ if (typeof startAngleDeg !== 'number' || !Number.isFinite(startAngleDeg) ||
207
+ typeof endAngleDeg !== 'number' || !Number.isFinite(endAngleDeg)) {
208
+ throw new Error('E_ELLIPSEARC_BAD_ANGLE: startAngle/endAngle must be finite numbers (degrees)');
209
+ }
210
+ const c = toVec3(center, 'ellipseArc', 'center');
211
+ const n = toNonZeroVec3(normal, 'ellipseArc', 'normal');
212
+ const handle = getOcctKernel().makeEllipseArc(c, n, majorRadius, minorRadius, startAngleDeg * DEG2RAD, endAngleDeg * DEG2RAD);
213
+ return adoptCurve(handle);
214
+ }
215
+ /**
216
+ * 构造椭圆弧:中心 + 法向 + 长短半轴 + 起止角(度)。
217
+ * @group 创建
218
+ * @inputs 0
219
+ * @async false
220
+ * @qual ok
221
+ * @name ellipseArc
222
+ * @note 平台 op:仅 occt 引擎(原生 makeEllipseArc)。角度单位是**度**(内部换算弧度)。
223
+ * @returns Shape 1D 椭圆弧(kind:'curve')。
224
+ * @param center - 椭圆中心 [x,y,z]。type:Vec3 required:true
225
+ * @param normal - 椭圆面法向 [x,y,z](非零)。type:Vec3 required:true
226
+ * @param majorRadius - 长半轴(mm,>0)。type:number required:true
227
+ * @param minorRadius - 短半轴(mm,>0 且 <= 长半轴)。type:number required:true
228
+ * @param startAngle - 起始角(度)。type:number required:true
229
+ * @param endAngle - 终止角(度)。type:number required:true
230
+ * @example
231
+ * const a = cad.ellipseArc([0,0,0], [0,0,1], 10, 5, 0, 90)
232
+ */
233
+ export const ellipseArc = defineOp({
234
+ name: 'ellipseArc',
235
+ paramDims: { center: 'length', normal: 'length', majorRadius: 'length', minorRadius: 'length', startAngle: 'angle', endAngle: 'angle' },
236
+ brep(center, normal, majorRadius, minorRadius, startAngleDeg, endAngleDeg) {
237
+ return ellipseArcBrep(center, normal, majorRadius, minorRadius, startAngleDeg, endAngleDeg);
238
+ },
239
+ engines: ['occt'],
240
+ naming: { kind: 'unmodeled', reason: '1D ellipse arc has no face role vocabulary' },
241
+ });
242
+ // ─────────────────────────────────────────────────────────────────────────────
243
+ // tangentArc — 起点+切向+终点构造圆弧
244
+ // ─────────────────────────────────────────────────────────────────────────────
245
+ /** BREP 路径:occt 原生 makeTangentArc(GC_MakeArcOfCircle(start, tangent, end))。 */
246
+ function tangentArcBrep(start, tangent, end) {
247
+ const s = toVec3(start, 'tangentArc', 'start');
248
+ const t = toNonZeroVec3(tangent, 'tangentArc', 'tangent');
249
+ const e = toVec3(end, 'tangentArc', 'end');
250
+ const handle = getOcctKernel().makeTangentArc(s, t, e);
251
+ return adoptCurve(handle);
252
+ }
253
+ /**
254
+ * 构造圆弧:过起点、以给定切向出发、终于终点(GC_MakeArcOfCircle 语义)。
255
+ * @group 创建
256
+ * @inputs 0
257
+ * @async false
258
+ * @qual ok
259
+ * @name tangentArc
260
+ * @note 平台 op:仅 occt 引擎(原生 makeTangentArc)。切向为零向量非法。
261
+ * @returns Shape 1D 圆弧(kind:'curve')。
262
+ * @param start - 起点 [x,y,z]。type:Vec3 required:true
263
+ * @param tangent - 起点切向 [x,y,z](非零,不必单位化)。type:Vec3 required:true
264
+ * @param end - 终点 [x,y,z]。type:Vec3 required:true
265
+ * @example
266
+ * const a = cad.tangentArc([0,0,0], [1,0,0], [5,5,0])
267
+ */
268
+ export const tangentArc = defineOp({
269
+ name: 'tangentArc',
270
+ paramDims: { start: 'length', tangent: 'length', end: 'length' },
271
+ brep(start, tangent, end) {
272
+ return tangentArcBrep(start, tangent, end);
273
+ },
274
+ engines: ['occt'],
275
+ naming: { kind: 'unmodeled', reason: '1D arc has no face role vocabulary' },
276
+ });
277
+ // ─────────────────────────────────────────────────────────────────────────────
278
+ // approximatePoints — 点集逼近(与 L1 interpolatePoints 的插值成对)
279
+ // ─────────────────────────────────────────────────────────────────────────────
280
+ /** 点集校验(≥2 点)。 */
281
+ function checkPoints(op, points) {
282
+ if (!Array.isArray(points) || points.length < 2) {
283
+ throw new Error(`E_${op.toUpperCase()}_BAD_POINTS: ${op} requires at least 2 points`);
284
+ }
285
+ for (const p of points)
286
+ toVec3(p, op, 'point');
287
+ }
288
+ /** BREP 路径:occt 原生 approximatePoints(逼近曲线;tolerance 缺省 = 原生 1e-3)。 */
289
+ function approximatePointsBrep(points, tolerance) {
290
+ checkPoints('APPROXIMATEPOINTS', points);
291
+ if (tolerance !== undefined && (typeof tolerance !== 'number' || !(tolerance > 0))) {
292
+ throw new Error('E_APPROXIMATEPOINTS_BAD_TOLERANCE: tolerance must be a positive number');
293
+ }
294
+ const handle = (tolerance === undefined
295
+ ? getOcctKernel().approximatePoints(points)
296
+ : getOcctKernel().approximatePoints(points, tolerance));
297
+ return adoptCurve(handle);
298
+ }
299
+ /**
300
+ * 点集**逼近**曲线:过点但不严格插值(逼近容差内贴合,产平滑 B 样条)。
301
+ * 与 L1 `interpolatePoints`(严格插值)成对的数学对偶路径。
302
+ * @group 创建
303
+ * @inputs 0
304
+ * @async false
305
+ * @qual ok
306
+ * @name approximatePoints
307
+ * @note 平台 op:仅 occt 引擎(原生 approximatePoints,tolerance 缺省 1e-3)。
308
+ * @returns Shape 1D 逼近曲线(kind:'curve')。
309
+ * @param points - 点集 [x,y,z][](≥2 点)。type:Vec3[] required:true
310
+ * @param tolerance - 逼近容差(mm,默认 1e-3)。type:number required:false
311
+ * @example
312
+ * const c = cad.approximatePoints([[0,0,0],[5,3,0],[10,0,0]])
313
+ */
314
+ export const approximatePoints = defineOp({
315
+ name: 'approximatePoints',
316
+ paramDims: { points: 'length', tolerance: 'length' },
317
+ brep(points, tolerance) {
318
+ return approximatePointsBrep(points, tolerance);
319
+ },
320
+ engines: ['occt'],
321
+ naming: { kind: 'unmodeled', reason: '1D approximated curve has no face role vocabulary' },
322
+ });
323
+ // ─────────────────────────────────────────────────────────────────────────────
324
+ // interpolateWithTangents — 带端点切向的插值
325
+ // ─────────────────────────────────────────────────────────────────────────────
326
+ /** BREP 路径:occt 原生 interpolatePointsWithTangents。 */
327
+ function interpolateWithTangentsBrep(points, startTangent, endTangent) {
328
+ checkPoints('INTERPOLATEWITHTANGENTS', points);
329
+ const st = toNonZeroVec3(startTangent, 'interpolateWithTangents', 'startTangent');
330
+ const et = toNonZeroVec3(endTangent, 'interpolateWithTangents', 'endTangent');
331
+ const handle = getOcctKernel().interpolatePointsWithTangents(points, st, et);
332
+ return adoptCurve(handle);
333
+ }
334
+ /**
335
+ * 点集**插值**曲线,带端点切向约束(三次 B 样条,过全部点且端点切向指定)。
336
+ * @group 创建
337
+ * @inputs 0
338
+ * @async false
339
+ * @qual ok
340
+ * @name interpolateWithTangents
341
+ * @note 平台 op:仅 occt 引擎(原生 interpolatePointsWithTangents)。两端切向非零。
342
+ * @returns Shape 1D 插值曲线(kind:'curve')。
343
+ * @param points - 点集 [x,y,z][](≥2 点)。type:Vec3[] required:true
344
+ * @param startTangent - 起点切向 [x,y,z](非零)。type:Vec3 required:true
345
+ * @param endTangent - 终点切向 [x,y,z](非零)。type:Vec3 required:true
346
+ * @example
347
+ * const c = cad.interpolateWithTangents([[0,0,0],[5,3,0],[10,0,0]], [1,0,0], [1,0,0])
348
+ */
349
+ export const interpolateWithTangents = defineOp({
350
+ name: 'interpolateWithTangents',
351
+ paramDims: { points: 'length', startTangent: 'length', endTangent: 'length' },
352
+ brep(points, startTangent, endTangent) {
353
+ return interpolateWithTangentsBrep(points, startTangent, endTangent);
354
+ },
355
+ engines: ['occt'],
356
+ naming: { kind: 'unmodeled', reason: '1D interpolated curve has no face role vocabulary' },
357
+ });
358
+ // ─────────────────────────────────────────────────────────────────────────────
359
+ // NURBS 精修族 — curveDegreeElevate / curveKnotInsert / curveKnotRemove
360
+ // ─────────────────────────────────────────────────────────────────────────────
361
+ /** BREP 路径:occt 原生 curveDegreeElevate(NURBS 升阶)。 */
362
+ function curveDegreeElevateBrep(curve, elevateBy) {
363
+ if (!Number.isInteger(elevateBy) || elevateBy <= 0) {
364
+ throw new Error('E_CURVEDEGREEELEVATE_BAD_STEP: elevateBy must be a positive integer');
365
+ }
366
+ const h = curveHandleOf(curve, 'curveDegreeElevate');
367
+ const handle = getOcctKernel().curveDegreeElevate(h, elevateBy);
368
+ return adoptCurve(handle);
369
+ }
370
+ /**
371
+ * NURBS 曲线升阶:把边/曲线的阶数提升 `elevateBy`(几何不变,表示空间变大)。
372
+ * @group 查询
373
+ * @inputs 1
374
+ * @async false
375
+ * @qual ok
376
+ * @name curveDegreeElevate
377
+ * @note 平台 op:仅 occt 引擎(原生 curveDegreeElevate)。输入边/曲线。
378
+ * @returns Shape 升阶后的 1D 曲线(kind:'curve')。
379
+ * @param curve - 输入边/曲线。type:Shape required:true
380
+ * @param elevateBy - 升阶量(正整数)。type:number required:true
381
+ * @example
382
+ * const up = cad.curveDegreeElevate(e, 2)
383
+ */
384
+ export const curveDegreeElevate = defineOp({
385
+ name: 'curveDegreeElevate',
386
+ brep(curve, elevateBy) {
387
+ return curveDegreeElevateBrep(curve, elevateBy);
388
+ },
389
+ engines: ['occt'],
390
+ naming: { kind: 'unmodeled', reason: '1D refined curve has no face role vocabulary' },
391
+ });
392
+ /** BREP 路径:occt 原生 curveKnotInsert(插节点 times 次)。 */
393
+ function curveKnotInsertBrep(curve, knot, times) {
394
+ if (typeof knot !== 'number' || !Number.isFinite(knot)) {
395
+ throw new Error('E_CURVEKNOTINSERT_BAD_KNOT: knot must be a finite number (curve parameter)');
396
+ }
397
+ if (!Number.isInteger(times) || times <= 0) {
398
+ throw new Error('E_CURVEKNOTINSERT_BAD_TIMES: times must be a positive integer');
399
+ }
400
+ const h = curveHandleOf(curve, 'curveKnotInsert');
401
+ const handle = getOcctKernel().curveKnotInsert(h, knot, times);
402
+ return adoptCurve(handle);
403
+ }
404
+ /**
405
+ * NURBS 曲线插节点:在曲线参数 `knot` 处插入节点 `times` 次(几何不变)。
406
+ * @group 查询
407
+ * @inputs 1
408
+ * @async false
409
+ * @qual ok
410
+ * @name curveKnotInsert
411
+ * @note 平台 op:仅 occt 引擎(原生 curveKnotInsert)。knot 是曲线参数(不是长度)。
412
+ * @returns Shape 插节点后的 1D 曲线(kind:'curve')。
413
+ * @param curve - 输入边/曲线。type:Shape required:true
414
+ * @param knot - 目标节点参数。type:number required:true
415
+ * @param times - 重复次数(正整数)。type:number required:true
416
+ * @example
417
+ * const refined = cad.curveKnotInsert(e, 0.5, 1)
418
+ */
419
+ export const curveKnotInsert = defineOp({
420
+ name: 'curveKnotInsert',
421
+ brep(curve, knot, times) {
422
+ return curveKnotInsertBrep(curve, knot, times);
423
+ },
424
+ engines: ['occt'],
425
+ naming: { kind: 'unmodeled', reason: '1D refined curve has no face role vocabulary' },
426
+ });
427
+ /** BREP 路径:occt 原生 curveKnotRemove(容差内去节点)。 */
428
+ function curveKnotRemoveBrep(curve, knot, tolerance) {
429
+ if (typeof knot !== 'number' || !Number.isFinite(knot)) {
430
+ throw new Error('E_CURVEKNOTREMOVE_BAD_KNOT: knot must be a finite number (curve parameter)');
431
+ }
432
+ if (typeof tolerance !== 'number' || !(tolerance > 0)) {
433
+ throw new Error('E_CURVEKNOTREMOVE_BAD_TOLERANCE: tolerance must be a positive number');
434
+ }
435
+ const h = curveHandleOf(curve, 'curveKnotRemove');
436
+ const handle = getOcctKernel().curveKnotRemove(h, knot, tolerance);
437
+ return adoptCurve(handle);
438
+ }
439
+ /**
440
+ * NURBS 曲线去节点:在容差内移除参数 `knot` 处的节点(几何漂移不超过 tolerance)。
441
+ * @group 查询
442
+ * @inputs 1
443
+ * @async false
444
+ * @qual ok
445
+ * @name curveKnotRemove
446
+ * @note 平台 op:仅 occt 引擎(原生 curveKnotRemove)。knot 是曲线参数(不是长度)。
447
+ * @returns Shape 去节点后的 1D 曲线(kind:'curve')。
448
+ * @param curve - 输入边/曲线。type:Shape required:true
449
+ * @param knot - 目标节点参数。type:number required:true
450
+ * @param tolerance - 允许的几何漂移(mm,>0)。type:number required:true
451
+ * @example
452
+ * const lean = cad.curveKnotRemove(e, 0.5, 1e-4)
453
+ */
454
+ export const curveKnotRemove = defineOp({
455
+ name: 'curveKnotRemove',
456
+ paramDims: { tolerance: 'length' },
457
+ brep(curve, knot, tolerance) {
458
+ return curveKnotRemoveBrep(curve, knot, tolerance);
459
+ },
460
+ engines: ['occt'],
461
+ naming: { kind: 'unmodeled', reason: '1D refined curve has no face role vocabulary' },
462
+ });
463
+ // ─────────────────────────────────────────────────────────────────────────────
464
+ // curveIsPeriodic — 周期性查询(返回布尔 ⇒ 普通函数形态,同 shape-type 族口径)
465
+ // ─────────────────────────────────────────────────────────────────────────────
466
+ /**
467
+ * 曲线是否周期(L1 契约只有 `curveIsClosed`,周期性是 occt 原生独有查询)。
468
+ * @group 查询
469
+ * @inputs 1
470
+ * @async false
471
+ * @qual ok
472
+ * @name curveIsPeriodic
473
+ * @note 平台 op:仅 occt 引擎(原生 curveIsPeriodic,L1 无对应成员)。非 occt 引擎
474
+ * 执行前报 E_BREP_UNSUPPORTED。
475
+ * @returns boolean 是否为周期曲线。
476
+ * @param curve - 被查询的边/曲线。type:Shape required:true
477
+ * @example
478
+ * const c = cad.circleArc([0,0,0], [0,0,1], 5, 0, 360)
479
+ * const periodic = cad.curveIsPeriodic(c)
480
+ */
481
+ export function curveIsPeriodic(curve) {
482
+ assertEngineFor('curveIsPeriodic', ['occt']);
483
+ const h = curveHandleOf(curve, 'curveIsPeriodic');
484
+ const kernel = getOcctKernel();
485
+ return kernel.curveIsPeriodic(h);
486
+ }
487
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/curve-sketch/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api curve-sketch — 曲线与草图构造族(S4,平台 op engines:['occt'])\n *\n * @platform occt — 本目录 import occt-kernel:各 op 直调 occt 原生曲线构造/精修方法\n * (`makeEdge` / `makeCircleArc` / `makeEllipseEdge` / `makeEllipseArc` /\n * `makeTangentArc` / `approximatePoints` / `interpolatePointsWithTangents` /\n * `curveDegreeElevate` / `curveKnotInsert` / `curveKnotRemove` / `curveIsPeriodic`,\n * occt-wasm 原生有)。这些原生方法**不在** L1 契约 `BrepEngineApi` 里(L1 只有\n * `makeLineEdge` / `makeArcEdge` / `interpolatePoints` 等按几何构造的子集,见\n * brep/engine/primitives.ts)⇒ 全族平台 op:defineOp 声明 `engines: ['occt']`(D11)。\n *\n * 方案落点:docs/plans/2026-10-07-occt-wasm-op-enablement-plan.md §3.4.1。\n * 与既有 op 的边界(§4.5 去重表):`edge`(顶点对构造)≠ `makeLineEdge`(L1 点对构造,\n * 无脚本符号)≠ `wire`(多边组装);`approximatePoints`(逼近)与 L1 `interpolatePoints`\n * (插值)是数学对偶的两条路径;`interpolateWithTangents` 是带端点切向的插值。\n *\n * 角度约定(实测钉住,见 test/api/occt-s4-curve-sketch.test.ts):occt 原生\n * `makeCircleArc` / `makeEllipseArc` 的起止角走 `Geom_TrimmedCurve`(**弧度**,\n * 见 occt-wasm facade `Geom_TrimmedCurve(new Geom_Circle(circle), startAngle, endAngle)`);\n * 本仓契约「角度用度」(docs/api-contract.md)⇒ 脚本面收**度**、内部换算弧度。\n *\n * 产物形态(同 offset2d / helix):1D 曲线经 `fromBrepCurve` 登记为 `kind:'curve'`\n * (wire/edge 三角载荷为空,显示走 L1 `wireframe`)。\n *\n * `curveIsPeriodic` 返回布尔(非 Shape)⇒ 与 shape-type 族同口径:普通函数 +\n * `assertEngineFor('curveIsPeriodic', ['occt'])`(见 api/shape-type/index.ts 头注),\n * 覆盖率扫描器经 PLAN_C2_EXTRA 计入。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { solidToShape } from '../../brep/brep-ops'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { brepOf, fromBrepCurve } from '../../shape'\nimport { defineOp } from '../../sdk'\nimport type { Provenance } from '../../topology/naming/lineage'\nimport { getOcctKernel } from '../../occt-kernel/occtKernel'\nimport { assertEngineFor } from '../internal/l3-bridge'\n\ntype Vec3 = [number, number, number]\n\n/** 度 → 弧度(脚本面按契约收度;occt Geom_TrimmedCurve 吃弧度)。 */\nconst DEG2RAD = Math.PI / 180\n\n/** 1D 曲线产物登记:内核句柄 → kind:'curve' 的 faijs Shape。 */\nfunction adoptCurve(handle: BrepHandle): Shape {\n return fromBrepCurve(solidToShape(getBrepApi(), handle), { solid: handle })\n}\n\n/** 元组 → {x,y,z}(同 halfSpace:occt 原生向量形参是 {x,y,z} 对象)。 */\nfunction toVec3(v: Vec3, op: string, which: string): { x: number; y: number; z: number } {\n if (\n !Array.isArray(v) ||\n v.length !== 3 ||\n v.some((n) => typeof n !== 'number' || !Number.isFinite(n))\n ) {\n throw new Error(`E_${op.toUpperCase()}_BAD_${which.toUpperCase()}: ${which} must be [x,y,z] finite numbers`)\n }\n return { x: v[0], y: v[1], z: v[2] }\n}\n\n/** 非零向量校验(方向/切向量)。 */\nfunction toNonZeroVec3(v: Vec3, op: string, which: string): { x: number; y: number; z: number } {\n const out = toVec3(v, op, which)\n if (out.x === 0 && out.y === 0 && out.z === 0) {\n throw new Error(`E_${op.toUpperCase()}_BAD_${which.toUpperCase()}: ${which} must be a non-zero vector`)\n }\n return out\n}\n\n/** 曲线输入 Shape → 内核句柄(无 BREP 槽报错)。 */\nfunction curveHandleOf(shape: Shape, op: string): BrepHandle {\n const h = brepOf(shape) as BrepHandle | undefined\n if (!h) {\n throw new Error(`E_${op.toUpperCase()}_NO_BREP: ${op} requires a BREP handle (mesh-only shape has none)`)\n }\n return h\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// edge — 顶点对构造边(occt 原生 makeEdge;顶点可来自 vertex Shape 或 [x,y,z])\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** 顶点入参:vertex Shape 或 [x,y,z] 点(内部经契约 makeVertex 物化)。 */\nfunction vertexHandleOf(v: Shape | Vec3, op: string): BrepHandle {\n if (Array.isArray(v)) {\n const p = toVec3(v, op, 'vertex')\n return getBrepApi().makeVertex(p.x, p.y, p.z) as unknown as BrepHandle\n }\n return curveHandleOf(v, op)\n}\n\n/** BREP 路径:顶点对 → occt 原生 makeEdge。 */\nfunction edgeBrep(v1: Shape | Vec3, v2: Shape | Vec3): Shape {\n if (v1 === undefined || v2 === undefined) {\n throw new Error('E_EDGE_MISSING_VERTEX: edge requires two vertices (vertex Shape or [x,y,z])')\n }\n const h1 = vertexHandleOf(v1, 'edge')\n const h2 = vertexHandleOf(v2, 'edge')\n const handle = getOcctKernel().makeEdge(h1 as never, h2 as never) as unknown as BrepHandle\n return adoptCurve(handle)\n}\n\n/**\n * 两顶点构造边。顶点入参可以是 vertex Shape,也可以是 `[x,y,z]` 点\n * (点经 L1 契约 `makeVertex` 物化成顶点再配边)。\n * @group 创建\n * @inputs 2\n * @async false\n * @qual ok\n * @name edge\n * @note 平台 op:仅 occt 引擎(原生 makeEdge,L1 契约只有 makeLineEdge 等按几何构造)。\n * 非 occt 引擎执行前报错;brep_mock 不拦截。\n * @returns Shape 1D 直线边(kind:'curve')。\n * @param v1 - 第一个顶点(vertex Shape 或 [x,y,z])。type:Shape|Vec3 required:true\n * @param v2 - 第二个顶点(vertex Shape 或 [x,y,z])。type:Shape|Vec3 required:true\n * @example\n * const e = cad.edge([0,0,0], [10,0,0])\n */\nexport const edge = defineOp({\n name: 'edge',\n brep(v1: Shape | Vec3, v2: Shape | Vec3) {\n return edgeBrep(v1, v2)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: '1D edge has no face role vocabulary' } as Provenance,\n})\n\n// ─────────────────────────────────────────────────────────────────────────────\n// circleArc — 圆心+法向+半径+起止角(度)构造圆弧\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** BREP 路径:occt 原生 makeCircleArc(角度内部换算弧度)。 */\nfunction circleArcBrep(\n center: Vec3,\n normal: Vec3,\n radius: number,\n startAngleDeg: number,\n endAngleDeg: number,\n): Shape {\n if (typeof radius !== 'number' || !(radius > 0)) {\n throw new Error('E_CIRCLEARC_BAD_RADIUS: radius must be a positive number')\n }\n if (\n typeof startAngleDeg !== 'number' || !Number.isFinite(startAngleDeg) ||\n typeof endAngleDeg !== 'number' || !Number.isFinite(endAngleDeg)\n ) {\n throw new Error('E_CIRCLEARC_BAD_ANGLE: startAngle/endAngle must be finite numbers (degrees)')\n }\n const c = toVec3(center, 'circleArc', 'center')\n const n = toNonZeroVec3(normal, 'circleArc', 'normal')\n const handle = getOcctKernel().makeCircleArc(\n c as never, n as never, radius, startAngleDeg * DEG2RAD, endAngleDeg * DEG2RAD,\n ) as unknown as BrepHandle\n return adoptCurve(handle)\n}\n\n/**\n * 构造圆弧:圆心 + 法向 + 半径 + 起止角(度,绕法向右手逆时针)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name circleArc\n * @note 平台 op:仅 occt 引擎(原生 makeCircleArc)。角度单位是**度**(内部换算弧度\n * 传给 occt 的 Geom_TrimmedCurve)。\n * @returns Shape 1D 圆弧(kind:'curve')。\n * @param center - 圆心 [x,y,z]。type:Vec3 required:true\n * @param normal - 圆面法向 [x,y,z](非零)。type:Vec3 required:true\n * @param radius - 半径(mm,>0)。type:number required:true\n * @param startAngle - 起始角(度,自法向基准 X 方向起量)。type:number required:true\n * @param endAngle - 终止角(度)。type:number required:true\n * @example\n * const a = cad.circleArc([0,0,0], [0,0,1], 5, 0, 90)\n */\nexport const circleArc = defineOp({\n name: 'circleArc',\n paramDims: { center: 'length', normal: 'length', radius: 'length', startAngle: 'angle', endAngle: 'angle' },\n brep(center: Vec3, normal: Vec3, radius: number, startAngleDeg: number, endAngleDeg: number) {\n return circleArcBrep(center, normal, radius, startAngleDeg, endAngleDeg)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: '1D arc has no face role vocabulary' } as Provenance,\n})\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ellipseEdge / ellipseArc — 椭圆整边 / 椭圆弧\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** 椭圆公共参数校验:两半径均正,且 major > minor(gp_Elips 约束)。 */\nfunction checkEllipseRadii(op: string, majorRadius: number, minorRadius: number): void {\n if (typeof majorRadius !== 'number' || !(majorRadius > 0)) {\n throw new Error(`E_${op.toUpperCase()}_BAD_MAJOR: majorRadius must be a positive number`)\n }\n if (typeof minorRadius !== 'number' || !(minorRadius > 0)) {\n throw new Error(`E_${op.toUpperCase()}_BAD_MINOR: minorRadius must be a positive number`)\n }\n if (minorRadius > majorRadius) {\n throw new Error(`E_${op.toUpperCase()}_BAD_RADII: minorRadius must be <= majorRadius (gp_Elips constraint)`)\n }\n}\n\n/** BREP 路径:occt 原生 makeEllipseEdge。 */\nfunction ellipseEdgeBrep(center: Vec3, normal: Vec3, majorRadius: number, minorRadius: number): Shape {\n checkEllipseRadii('ELLIPSEEDGE', majorRadius, minorRadius)\n const c = toVec3(center, 'ellipseEdge', 'center')\n const n = toNonZeroVec3(normal, 'ellipseEdge', 'normal')\n const handle = getOcctKernel().makeEllipseEdge(c as never, n as never, majorRadius, minorRadius) as unknown as BrepHandle\n return adoptCurve(handle)\n}\n\n/**\n * 构造整椭圆边:中心 + 法向 + 长半轴 + 短半轴。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name ellipseEdge\n * @note 平台 op:仅 occt 引擎(原生 makeEllipseEdge)。要求 majorRadius >= minorRadius。\n * @returns Shape 1D 椭圆边(kind:'curve')。\n * @param center - 椭圆中心 [x,y,z]。type:Vec3 required:true\n * @param normal - 椭圆面法向 [x,y,z](非零)。type:Vec3 required:true\n * @param majorRadius - 长半轴(mm,>0)。type:number required:true\n * @param minorRadius - 短半轴(mm,>0 且 <= 长半轴)。type:number required:true\n * @example\n * const e = cad.ellipseEdge([0,0,0], [0,0,1], 10, 5)\n */\nexport const ellipseEdge = defineOp({\n name: 'ellipseEdge',\n paramDims: { center: 'length', normal: 'length', majorRadius: 'length', minorRadius: 'length' },\n brep(center: Vec3, normal: Vec3, majorRadius: number, minorRadius: number) {\n return ellipseEdgeBrep(center, normal, majorRadius, minorRadius)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: '1D ellipse has no face role vocabulary' } as Provenance,\n})\n\n/** BREP 路径:occt 原生 makeEllipseArc(角度内部换算弧度)。 */\nfunction ellipseArcBrep(\n center: Vec3,\n normal: Vec3,\n majorRadius: number,\n minorRadius: number,\n startAngleDeg: number,\n endAngleDeg: number,\n): Shape {\n checkEllipseRadii('ELLIPSEARC', majorRadius, minorRadius)\n if (\n typeof startAngleDeg !== 'number' || !Number.isFinite(startAngleDeg) ||\n typeof endAngleDeg !== 'number' || !Number.isFinite(endAngleDeg)\n ) {\n throw new Error('E_ELLIPSEARC_BAD_ANGLE: startAngle/endAngle must be finite numbers (degrees)')\n }\n const c = toVec3(center, 'ellipseArc', 'center')\n const n = toNonZeroVec3(normal, 'ellipseArc', 'normal')\n const handle = getOcctKernel().makeEllipseArc(\n c as never, n as never, majorRadius, minorRadius, startAngleDeg * DEG2RAD, endAngleDeg * DEG2RAD,\n ) as unknown as BrepHandle\n return adoptCurve(handle)\n}\n\n/**\n * 构造椭圆弧:中心 + 法向 + 长短半轴 + 起止角(度)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name ellipseArc\n * @note 平台 op:仅 occt 引擎(原生 makeEllipseArc)。角度单位是**度**(内部换算弧度)。\n * @returns Shape 1D 椭圆弧(kind:'curve')。\n * @param center - 椭圆中心 [x,y,z]。type:Vec3 required:true\n * @param normal - 椭圆面法向 [x,y,z](非零)。type:Vec3 required:true\n * @param majorRadius - 长半轴(mm,>0)。type:number required:true\n * @param minorRadius - 短半轴(mm,>0 且 <= 长半轴)。type:number required:true\n * @param startAngle - 起始角(度)。type:number required:true\n * @param endAngle - 终止角(度)。type:number required:true\n * @example\n * const a = cad.ellipseArc([0,0,0], [0,0,1], 10, 5, 0, 90)\n */\nexport const ellipseArc = defineOp({\n name: 'ellipseArc',\n paramDims: { center: 'length', normal: 'length', majorRadius: 'length', minorRadius: 'length', startAngle: 'angle', endAngle: 'angle' },\n brep(center: Vec3, normal: Vec3, majorRadius: number, minorRadius: number, startAngleDeg: number, endAngleDeg: number) {\n return ellipseArcBrep(center, normal, majorRadius, minorRadius, startAngleDeg, endAngleDeg)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: '1D ellipse arc has no face role vocabulary' } as Provenance,\n})\n\n// ─────────────────────────────────────────────────────────────────────────────\n// tangentArc — 起点+切向+终点构造圆弧\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** BREP 路径:occt 原生 makeTangentArc(GC_MakeArcOfCircle(start, tangent, end))。 */\nfunction tangentArcBrep(start: Vec3, tangent: Vec3, end: Vec3): Shape {\n const s = toVec3(start, 'tangentArc', 'start')\n const t = toNonZeroVec3(tangent, 'tangentArc', 'tangent')\n const e = toVec3(end, 'tangentArc', 'end')\n const handle = getOcctKernel().makeTangentArc(s as never, t as never, e as never) as unknown as BrepHandle\n return adoptCurve(handle)\n}\n\n/**\n * 构造圆弧:过起点、以给定切向出发、终于终点(GC_MakeArcOfCircle 语义)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name tangentArc\n * @note 平台 op:仅 occt 引擎(原生 makeTangentArc)。切向为零向量非法。\n * @returns Shape 1D 圆弧(kind:'curve')。\n * @param start - 起点 [x,y,z]。type:Vec3 required:true\n * @param tangent - 起点切向 [x,y,z](非零,不必单位化)。type:Vec3 required:true\n * @param end - 终点 [x,y,z]。type:Vec3 required:true\n * @example\n * const a = cad.tangentArc([0,0,0], [1,0,0], [5,5,0])\n */\nexport const tangentArc = defineOp({\n name: 'tangentArc',\n paramDims: { start: 'length', tangent: 'length', end: 'length' },\n brep(start: Vec3, tangent: Vec3, end: Vec3) {\n return tangentArcBrep(start, tangent, end)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: '1D arc has no face role vocabulary' } as Provenance,\n})\n\n// ─────────────────────────────────────────────────────────────────────────────\n// approximatePoints — 点集逼近(与 L1 interpolatePoints 的插值成对)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** 点集校验(≥2 点)。 */\nfunction checkPoints(op: string, points: Vec3[]): void {\n if (!Array.isArray(points) || points.length < 2) {\n throw new Error(`E_${op.toUpperCase()}_BAD_POINTS: ${op} requires at least 2 points`)\n }\n for (const p of points) toVec3(p, op, 'point')\n}\n\n/** BREP 路径:occt 原生 approximatePoints(逼近曲线;tolerance 缺省 = 原生 1e-3)。 */\nfunction approximatePointsBrep(points: Vec3[], tolerance?: number): Shape {\n checkPoints('APPROXIMATEPOINTS', points)\n if (tolerance !== undefined && (typeof tolerance !== 'number' || !(tolerance > 0))) {\n throw new Error('E_APPROXIMATEPOINTS_BAD_TOLERANCE: tolerance must be a positive number')\n }\n const handle = (\n tolerance === undefined\n ? getOcctKernel().approximatePoints(points as never)\n : getOcctKernel().approximatePoints(points as never, tolerance)\n ) as unknown as BrepHandle\n return adoptCurve(handle)\n}\n\n/**\n * 点集**逼近**曲线:过点但不严格插值(逼近容差内贴合,产平滑 B 样条)。\n * 与 L1 `interpolatePoints`(严格插值)成对的数学对偶路径。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name approximatePoints\n * @note 平台 op:仅 occt 引擎(原生 approximatePoints,tolerance 缺省 1e-3)。\n * @returns Shape 1D 逼近曲线(kind:'curve')。\n * @param points - 点集 [x,y,z][](≥2 点)。type:Vec3[] required:true\n * @param tolerance - 逼近容差(mm,默认 1e-3)。type:number required:false\n * @example\n * const c = cad.approximatePoints([[0,0,0],[5,3,0],[10,0,0]])\n */\nexport const approximatePoints = defineOp({\n name: 'approximatePoints',\n paramDims: { points: 'length', tolerance: 'length' },\n brep(points: Vec3[], tolerance?: number) {\n return approximatePointsBrep(points, tolerance)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: '1D approximated curve has no face role vocabulary' } as Provenance,\n})\n\n// ─────────────────────────────────────────────────────────────────────────────\n// interpolateWithTangents — 带端点切向的插值\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** BREP 路径:occt 原生 interpolatePointsWithTangents。 */\nfunction interpolateWithTangentsBrep(points: Vec3[], startTangent: Vec3, endTangent: Vec3): Shape {\n checkPoints('INTERPOLATEWITHTANGENTS', points)\n const st = toNonZeroVec3(startTangent, 'interpolateWithTangents', 'startTangent')\n const et = toNonZeroVec3(endTangent, 'interpolateWithTangents', 'endTangent')\n const handle = getOcctKernel().interpolatePointsWithTangents(\n points as never, st as never, et as never,\n ) as unknown as BrepHandle\n return adoptCurve(handle)\n}\n\n/**\n * 点集**插值**曲线,带端点切向约束(三次 B 样条,过全部点且端点切向指定)。\n * @group 创建\n * @inputs 0\n * @async false\n * @qual ok\n * @name interpolateWithTangents\n * @note 平台 op:仅 occt 引擎(原生 interpolatePointsWithTangents)。两端切向非零。\n * @returns Shape 1D 插值曲线(kind:'curve')。\n * @param points - 点集 [x,y,z][](≥2 点)。type:Vec3[] required:true\n * @param startTangent - 起点切向 [x,y,z](非零)。type:Vec3 required:true\n * @param endTangent - 终点切向 [x,y,z](非零)。type:Vec3 required:true\n * @example\n * const c = cad.interpolateWithTangents([[0,0,0],[5,3,0],[10,0,0]], [1,0,0], [1,0,0])\n */\nexport const interpolateWithTangents = defineOp({\n name: 'interpolateWithTangents',\n paramDims: { points: 'length', startTangent: 'length', endTangent: 'length' },\n brep(points: Vec3[], startTangent: Vec3, endTangent: Vec3) {\n return interpolateWithTangentsBrep(points, startTangent, endTangent)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: '1D interpolated curve has no face role vocabulary' } as Provenance,\n})\n\n// ─────────────────────────────────────────────────────────────────────────────\n// NURBS 精修族 — curveDegreeElevate / curveKnotInsert / curveKnotRemove\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** BREP 路径:occt 原生 curveDegreeElevate(NURBS 升阶)。 */\nfunction curveDegreeElevateBrep(curve: Shape, elevateBy: number): Shape {\n if (!Number.isInteger(elevateBy) || elevateBy <= 0) {\n throw new Error('E_CURVEDEGREEELEVATE_BAD_STEP: elevateBy must be a positive integer')\n }\n const h = curveHandleOf(curve, 'curveDegreeElevate')\n const handle = getOcctKernel().curveDegreeElevate(h as never, elevateBy) as unknown as BrepHandle\n return adoptCurve(handle)\n}\n\n/**\n * NURBS 曲线升阶:把边/曲线的阶数提升 `elevateBy`(几何不变,表示空间变大)。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name curveDegreeElevate\n * @note 平台 op:仅 occt 引擎(原生 curveDegreeElevate)。输入边/曲线。\n * @returns Shape 升阶后的 1D 曲线(kind:'curve')。\n * @param curve - 输入边/曲线。type:Shape required:true\n * @param elevateBy - 升阶量(正整数)。type:number required:true\n * @example\n * const up = cad.curveDegreeElevate(e, 2)\n */\nexport const curveDegreeElevate = defineOp({\n name: 'curveDegreeElevate',\n brep(curve: Shape, elevateBy: number) {\n return curveDegreeElevateBrep(curve, elevateBy)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: '1D refined curve has no face role vocabulary' } as Provenance,\n})\n\n/** BREP 路径:occt 原生 curveKnotInsert(插节点 times 次)。 */\nfunction curveKnotInsertBrep(curve: Shape, knot: number, times: number): Shape {\n if (typeof knot !== 'number' || !Number.isFinite(knot)) {\n throw new Error('E_CURVEKNOTINSERT_BAD_KNOT: knot must be a finite number (curve parameter)')\n }\n if (!Number.isInteger(times) || times <= 0) {\n throw new Error('E_CURVEKNOTINSERT_BAD_TIMES: times must be a positive integer')\n }\n const h = curveHandleOf(curve, 'curveKnotInsert')\n const handle = getOcctKernel().curveKnotInsert(h as never, knot, times) as unknown as BrepHandle\n return adoptCurve(handle)\n}\n\n/**\n * NURBS 曲线插节点:在曲线参数 `knot` 处插入节点 `times` 次(几何不变)。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name curveKnotInsert\n * @note 平台 op:仅 occt 引擎(原生 curveKnotInsert)。knot 是曲线参数(不是长度)。\n * @returns Shape 插节点后的 1D 曲线(kind:'curve')。\n * @param curve - 输入边/曲线。type:Shape required:true\n * @param knot - 目标节点参数。type:number required:true\n * @param times - 重复次数(正整数)。type:number required:true\n * @example\n * const refined = cad.curveKnotInsert(e, 0.5, 1)\n */\nexport const curveKnotInsert = defineOp({\n name: 'curveKnotInsert',\n brep(curve: Shape, knot: number, times: number) {\n return curveKnotInsertBrep(curve, knot, times)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: '1D refined curve has no face role vocabulary' } as Provenance,\n})\n\n/** BREP 路径:occt 原生 curveKnotRemove(容差内去节点)。 */\nfunction curveKnotRemoveBrep(curve: Shape, knot: number, tolerance: number): Shape {\n if (typeof knot !== 'number' || !Number.isFinite(knot)) {\n throw new Error('E_CURVEKNOTREMOVE_BAD_KNOT: knot must be a finite number (curve parameter)')\n }\n if (typeof tolerance !== 'number' || !(tolerance > 0)) {\n throw new Error('E_CURVEKNOTREMOVE_BAD_TOLERANCE: tolerance must be a positive number')\n }\n const h = curveHandleOf(curve, 'curveKnotRemove')\n const handle = getOcctKernel().curveKnotRemove(h as never, knot, tolerance) as unknown as BrepHandle\n return adoptCurve(handle)\n}\n\n/**\n * NURBS 曲线去节点:在容差内移除参数 `knot` 处的节点(几何漂移不超过 tolerance)。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name curveKnotRemove\n * @note 平台 op:仅 occt 引擎(原生 curveKnotRemove)。knot 是曲线参数(不是长度)。\n * @returns Shape 去节点后的 1D 曲线(kind:'curve')。\n * @param curve - 输入边/曲线。type:Shape required:true\n * @param knot - 目标节点参数。type:number required:true\n * @param tolerance - 允许的几何漂移(mm,>0)。type:number required:true\n * @example\n * const lean = cad.curveKnotRemove(e, 0.5, 1e-4)\n */\nexport const curveKnotRemove = defineOp({\n name: 'curveKnotRemove',\n paramDims: { tolerance: 'length' },\n brep(curve: Shape, knot: number, tolerance: number) {\n return curveKnotRemoveBrep(curve, knot, tolerance)\n },\n engines: ['occt'],\n naming: { kind: 'unmodeled', reason: '1D refined curve has no face role vocabulary' } as Provenance,\n})\n\n// ─────────────────────────────────────────────────────────────────────────────\n// curveIsPeriodic — 周期性查询(返回布尔 ⇒ 普通函数形态,同 shape-type 族口径)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 曲线是否周期(L1 契约只有 `curveIsClosed`,周期性是 occt 原生独有查询)。\n * @group 查询\n * @inputs 1\n * @async false\n * @qual ok\n * @name curveIsPeriodic\n * @note 平台 op:仅 occt 引擎(原生 curveIsPeriodic,L1 无对应成员)。非 occt 引擎\n * 执行前报 E_BREP_UNSUPPORTED。\n * @returns boolean 是否为周期曲线。\n * @param curve - 被查询的边/曲线。type:Shape required:true\n * @example\n * const c = cad.circleArc([0,0,0], [0,0,1], 5, 0, 360)\n * const periodic = cad.curveIsPeriodic(c)\n */\nexport function curveIsPeriodic(curve: Shape): boolean {\n assertEngineFor('curveIsPeriodic', ['occt'])\n const h = curveHandleOf(curve, 'curveIsPeriodic')\n const kernel = getOcctKernel() as unknown as { curveIsPeriodic(h: unknown): boolean }\n return kernel.curveIsPeriodic(h)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"engrave.d.ts","sourceRoot":"","sources":["../../src/api/engrave.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAQ,MAAM,eAAe,CAAA;AAqBhD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CASzE;AAqID;;;;;;;;;;;;;;;;;;;;IAoBI;AACJ,eAAO,MAAM,OAAO;;CA8BlB,CAAA"}
1
+ {"version":3,"file":"engrave.d.ts","sourceRoot":"","sources":["../../src/api/engrave.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAQ,MAAM,eAAe,CAAA;AAsBhD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CASzE;AAqID;;;;;;;;;;;;;;;;;;;;IAoBI;AACJ,eAAO,MAAM,OAAO;;CA8BlB,CAAA"}
@@ -5,7 +5,8 @@
5
5
  * dispatchPath 静态判定 brep/mesh。
6
6
  * BREP 路径:textToSolid/svgToSolid + boolean(cut/fuse)。
7
7
  */
8
- import { cad } from '../mesh/index.js';
8
+ // B3 correction (2026-10-06): no library-face cad aggregate — import the impl from its own module.
9
+ import * as meshEngrave from '../mesh/engrave.js';
9
10
  import { parseSvgNaturalSize } from '../primitives/parse-svg-size.js';
10
11
  import { textToSolid } from '../brep/text/text-to-solid.js';
11
12
  import { svgToSolid } from '../brep/svg/svg-to-solid.js';
@@ -191,7 +192,7 @@ export const engrave = defineOp({
191
192
  const faceNormal = params.faceNormal ?? [0, 0, 1];
192
193
  const { naturalWidth, naturalHeight } = svgText ? parseSvgNaturalSize(svgText) : { naturalWidth: 0, naturalHeight: 0 };
193
194
  const hasText = !!params.text;
194
- return cad.engrave(input, {
195
+ return meshEngrave.engrave(input, {
195
196
  mode: params.mode ?? 'concave',
196
197
  depth: params.depth,
197
198
  face: { center: faceCenter, normal: faceNormal },