@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
@@ -5,7 +5,7 @@
5
5
  * @platform occt
6
6
  *
7
7
  * Brep-shaped implementations for `torus`, `ellipsoid`, `makeBaseBox`.
8
- * Semantics mirror vendored `topology/primitiveFns.ts` + `solidBuilders.ts`
8
+ * Semantics mirror brepjs `topology/primitiveFns.ts` + `solidBuilders.ts`
9
9
  * (`makeTorus`/`makeEllipsoid` take at/axis placement) and
10
10
  * `sketching/shortcuts.ts` `makeBaseBox` (origin-centered XY rectangle extruded
11
11
  * along +Z). Placement is composed from L1 `translate`/`generalTransform`
@@ -30,7 +30,7 @@ function translated(kernel, h, v) {
30
30
  return next;
31
31
  }
32
32
  /**
33
- * Create a torus (vendored `torus(majorRadius, minorRadius, {at, axis})`).
33
+ * Create a torus (brepjs `torus(majorRadius, minorRadius, {at, axis})`).
34
34
  *
35
35
  * The L1 `makeTorus(major, minor)` builds the ring on the +Z axis at the
36
36
  * origin; placement is composed afterwards (`axis` → rotation, `at` →
@@ -59,7 +59,7 @@ export function torusBrep(...args) {
59
59
  }
60
60
  }
61
61
  /**
62
- * Create an ellipsoid (vendored `ellipsoid(rx, ry, rz, {at})`).
62
+ * Create an ellipsoid (brepjs `ellipsoid(rx, ry, rz, {at})`).
63
63
  *
64
64
  * @param args - Resolved arguments (rx, ry, rz, placement options).
65
65
  * @returns The ellipsoid as a `BrepHandle`.
@@ -80,7 +80,7 @@ export function ellipsoidBrep(...args) {
80
80
  }
81
81
  /**
82
82
  * Create a base box: origin-centered XY rectangle extruded by `zLength` along
83
- * +Z (vendored `makeBaseBox(xLength, yLength, zLength)` via the sketcher).
83
+ * +Z (brepjs `makeBaseBox(xLength, yLength, zLength)` via the sketcher).
84
84
  *
85
85
  * @param args - Resolved arguments (xLength, yLength, zLength).
86
86
  * @returns The box as a `BrepHandle`.
@@ -1 +1 @@
1
- {"version":3,"file":"primitiveFns.js","sourceRoot":"","sources":["../../../src/api/brep-mirror/primitiveFns.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Self-hosted compat-op implementations — solid primitives\n * (core-decouple Phase 3, §5.4).\n *\n * @platform occt\n *\n * Brep-shaped implementations for `torus`, `ellipsoid`, `makeBaseBox`.\n * Semantics mirror vendored `topology/primitiveFns.ts` + `solidBuilders.ts`\n * (`makeTorus`/`makeEllipsoid` take at/axis placement) and\n * `sketching/shortcuts.ts` `makeBaseBox` (origin-centered XY rectangle extruded\n * along +Z). Placement is composed from L1 `translate`/`generalTransform`\n * since the L1 `makeTorus`/`makeEllipsoid` signatures carry no location.\n */\n\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { ok, err, type Result } from '../../result/result'\nimport { kernelError } from '../../result/errors'\nimport type { FormClass } from '../internal/dual-form-args'\nimport { resolveArgs } from '../internal/dual-form-args'\nimport type { Vec3 } from '../brepjs-compat/types'\nimport { rotationZTo } from './brepHelpers'\n\nconst TORUS_PARAMS = { name: 'torus', params: ['majorRadius', 'minorRadius', 'options'], formClass: 'A' as FormClass }\nconst ELLIPSOID_PARAMS = { name: 'ellipsoid', params: ['rx', 'ry', 'rz', 'options'], formClass: 'A' as FormClass }\nconst MAKE_BASE_BOX_PARAMS = {\n name: 'makeBaseBox',\n params: ['xLength', 'yLength', 'zLength'],\n formClass: 'A' as FormClass,\n}\n\n/** Translate a handle, releasing the intermediate (kernel returns a fresh one). */\nfunction translated(kernel: ReturnType<typeof getBrepApi>, h: BrepHandle, v: Vec3): BrepHandle {\n const next = kernel.translate(h, v[0], v[1], v[2])\n kernel.release(h)\n return next\n}\n\n/**\n * Create a torus (vendored `torus(majorRadius, minorRadius, {at, axis})`).\n *\n * The L1 `makeTorus(major, minor)` builds the ring on the +Z axis at the\n * origin; placement is composed afterwards (`axis` → rotation, `at` →\n * translation).\n *\n * @param args - Resolved arguments (majorRadius, minorRadius, placement options).\n * @returns The torus as a `BrepHandle`.\n */\nexport function torusBrep(...args: unknown[]): Result<BrepHandle> {\n const [majorRadius, minorRadius, options] = resolveArgs(args, TORUS_PARAMS)\n const opts = (options ?? {}) as { at?: Vec3; axis?: Vec3 }\n const kernel = getBrepApi()\n try {\n let h = kernel.makeTorus(majorRadius as number, minorRadius as number)\n if (opts.axis && !(opts.axis[0] === 0 && opts.axis[1] === 0 && opts.axis[2] === 1)) {\n const rotated = kernel.generalTransform(h, rotationZTo(opts.axis))\n kernel.release(h)\n h = rotated\n }\n if (opts.at) h = translated(kernel, h, opts.at)\n return ok(h)\n } catch (e) {\n return err(\n kernelError('TORUS_FAILED', `torus: kernel failure: ${e instanceof Error ? e.message : String(e)}`, e),\n )\n }\n}\n\n/**\n * Create an ellipsoid (vendored `ellipsoid(rx, ry, rz, {at})`).\n *\n * @param args - Resolved arguments (rx, ry, rz, placement options).\n * @returns The ellipsoid as a `BrepHandle`.\n */\nexport function ellipsoidBrep(...args: unknown[]): Result<BrepHandle> {\n const [rx, ry, rz, options] = resolveArgs(args, ELLIPSOID_PARAMS)\n const opts = (options ?? {}) as { at?: Vec3 }\n const kernel = getBrepApi()\n try {\n let h = kernel.makeEllipsoid(rx as number, ry as number, rz as number)\n if (opts.at) h = translated(kernel, h, opts.at)\n return ok(h)\n } catch (e) {\n return err(\n kernelError('ELLIPSOID_FAILED', `ellipsoid: kernel failure: ${e instanceof Error ? e.message : String(e)}`, e),\n )\n }\n}\n\n/**\n * Create a base box: origin-centered XY rectangle extruded by `zLength` along\n * +Z (vendored `makeBaseBox(xLength, yLength, zLength)` via the sketcher).\n *\n * @param args - Resolved arguments (xLength, yLength, zLength).\n * @returns The box as a `BrepHandle`.\n */\nexport function makeBaseBoxBrep(...args: unknown[]): Result<BrepHandle> {\n const [xLength, yLength, zLength] = resolveArgs(args, MAKE_BASE_BOX_PARAMS)\n const kernel = getBrepApi()\n try {\n const rect = kernel.makeRectangle(xLength as number, yLength as number)\n try {\n return ok(kernel.extrude(rect, 0, 0, zLength as number))\n } finally {\n kernel.release(rect)\n }\n } catch (e) {\n return err(\n kernelError('MAKE_BASE_BOX_FAILED', `makeBaseBox: kernel failure: ${e instanceof Error ? e.message : String(e)}`, e),\n )\n }\n}\n"]}
1
+ {"version":3,"file":"primitiveFns.js","sourceRoot":"","sources":["../../../src/api/brep-mirror/primitiveFns.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Self-hosted compat-op implementations — solid primitives\n * (core-decouple Phase 3, §5.4).\n *\n * @platform occt\n *\n * Brep-shaped implementations for `torus`, `ellipsoid`, `makeBaseBox`.\n * Semantics mirror brepjs `topology/primitiveFns.ts` + `solidBuilders.ts`\n * (`makeTorus`/`makeEllipsoid` take at/axis placement) and\n * `sketching/shortcuts.ts` `makeBaseBox` (origin-centered XY rectangle extruded\n * along +Z). Placement is composed from L1 `translate`/`generalTransform`\n * since the L1 `makeTorus`/`makeEllipsoid` signatures carry no location.\n */\n\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { ok, err, type Result } from '../../result/result'\nimport { kernelError } from '../../result/errors'\nimport type { FormClass } from '../internal/dual-form-args'\nimport { resolveArgs } from '../internal/dual-form-args'\nimport type { Vec3 } from '../brepjs-compat/types'\nimport { rotationZTo } from './brepHelpers'\n\nconst TORUS_PARAMS = { name: 'torus', params: ['majorRadius', 'minorRadius', 'options'], formClass: 'A' as FormClass }\nconst ELLIPSOID_PARAMS = { name: 'ellipsoid', params: ['rx', 'ry', 'rz', 'options'], formClass: 'A' as FormClass }\nconst MAKE_BASE_BOX_PARAMS = {\n name: 'makeBaseBox',\n params: ['xLength', 'yLength', 'zLength'],\n formClass: 'A' as FormClass,\n}\n\n/** Translate a handle, releasing the intermediate (kernel returns a fresh one). */\nfunction translated(kernel: ReturnType<typeof getBrepApi>, h: BrepHandle, v: Vec3): BrepHandle {\n const next = kernel.translate(h, v[0], v[1], v[2])\n kernel.release(h)\n return next\n}\n\n/**\n * Create a torus (brepjs `torus(majorRadius, minorRadius, {at, axis})`).\n *\n * The L1 `makeTorus(major, minor)` builds the ring on the +Z axis at the\n * origin; placement is composed afterwards (`axis` → rotation, `at` →\n * translation).\n *\n * @param args - Resolved arguments (majorRadius, minorRadius, placement options).\n * @returns The torus as a `BrepHandle`.\n */\nexport function torusBrep(...args: unknown[]): Result<BrepHandle> {\n const [majorRadius, minorRadius, options] = resolveArgs(args, TORUS_PARAMS)\n const opts = (options ?? {}) as { at?: Vec3; axis?: Vec3 }\n const kernel = getBrepApi()\n try {\n let h = kernel.makeTorus(majorRadius as number, minorRadius as number)\n if (opts.axis && !(opts.axis[0] === 0 && opts.axis[1] === 0 && opts.axis[2] === 1)) {\n const rotated = kernel.generalTransform(h, rotationZTo(opts.axis))\n kernel.release(h)\n h = rotated\n }\n if (opts.at) h = translated(kernel, h, opts.at)\n return ok(h)\n } catch (e) {\n return err(\n kernelError('TORUS_FAILED', `torus: kernel failure: ${e instanceof Error ? e.message : String(e)}`, e),\n )\n }\n}\n\n/**\n * Create an ellipsoid (brepjs `ellipsoid(rx, ry, rz, {at})`).\n *\n * @param args - Resolved arguments (rx, ry, rz, placement options).\n * @returns The ellipsoid as a `BrepHandle`.\n */\nexport function ellipsoidBrep(...args: unknown[]): Result<BrepHandle> {\n const [rx, ry, rz, options] = resolveArgs(args, ELLIPSOID_PARAMS)\n const opts = (options ?? {}) as { at?: Vec3 }\n const kernel = getBrepApi()\n try {\n let h = kernel.makeEllipsoid(rx as number, ry as number, rz as number)\n if (opts.at) h = translated(kernel, h, opts.at)\n return ok(h)\n } catch (e) {\n return err(\n kernelError('ELLIPSOID_FAILED', `ellipsoid: kernel failure: ${e instanceof Error ? e.message : String(e)}`, e),\n )\n }\n}\n\n/**\n * Create a base box: origin-centered XY rectangle extruded by `zLength` along\n * +Z (brepjs `makeBaseBox(xLength, yLength, zLength)` via the sketcher).\n *\n * @param args - Resolved arguments (xLength, yLength, zLength).\n * @returns The box as a `BrepHandle`.\n */\nexport function makeBaseBoxBrep(...args: unknown[]): Result<BrepHandle> {\n const [xLength, yLength, zLength] = resolveArgs(args, MAKE_BASE_BOX_PARAMS)\n const kernel = getBrepApi()\n try {\n const rect = kernel.makeRectangle(xLength as number, yLength as number)\n try {\n return ok(kernel.extrude(rect, 0, 0, zLength as number))\n } finally {\n kernel.release(rect)\n }\n } catch (e) {\n return err(\n kernelError('MAKE_BASE_BOX_FAILED', `makeBaseBox: kernel failure: ${e instanceof Error ? e.message : String(e)}`, e),\n )\n }\n}\n"]}
@@ -4,18 +4,18 @@
4
4
  *
5
5
  * @platform occt
6
6
  *
7
- * 迁移自 vendored `operations/roofFns.ts`(含 pure-TS straightSkeleton,
7
+ * 迁移自 brepjs `operations/roofFns.ts`(含 pure-TS straightSkeleton,
8
8
  * 见同目录 straightSkeleton.ts)。适配:
9
9
  * - getEdges → kernel.getSubShapes(handle, 'edge')
10
10
  * - curveStartPoint → kernel.curvePointAtParam(edge, 0)
11
11
  * - isValidSolid → kernel.isSolid(sew 兜底路径的闭合校验近似)
12
12
  * - Result/BrepError 用 core 面;输出 Result<BrepHandle>
13
- * 守卫与错误码保持 vendored:ROOF_FAILED / STRAIGHT_SKELETON_FAILED。
13
+ * 守卫与错误码保持 brepjs:ROOF_FAILED / STRAIGHT_SKELETON_FAILED。
14
14
  */
15
15
  import type { BrepHandle } from '../../brep/engine/types.js';
16
16
  import { type Result } from '../../result/result.js';
17
17
  /**
18
- * Roof — planar wire to straight-skeleton roof solid (vendored roofFns.ts#roof).
18
+ * Roof — planar wire to straight-skeleton roof solid (brepjs roofFns.ts#roof).
19
19
  *
20
20
  * @param args - Resolved arguments (wire, roof options).
21
21
  * @returns The generated roof solid as a `BrepHandle`.
@@ -4,13 +4,13 @@
4
4
  *
5
5
  * @platform occt
6
6
  *
7
- * 迁移自 vendored `operations/roofFns.ts`(含 pure-TS straightSkeleton,
7
+ * 迁移自 brepjs `operations/roofFns.ts`(含 pure-TS straightSkeleton,
8
8
  * 见同目录 straightSkeleton.ts)。适配:
9
9
  * - getEdges → kernel.getSubShapes(handle, 'edge')
10
10
  * - curveStartPoint → kernel.curvePointAtParam(edge, 0)
11
11
  * - isValidSolid → kernel.isSolid(sew 兜底路径的闭合校验近似)
12
12
  * - Result/BrepError 用 core 面;输出 Result<BrepHandle>
13
- * 守卫与错误码保持 vendored:ROOF_FAILED / STRAIGHT_SKELETON_FAILED。
13
+ * 守卫与错误码保持 brepjs:ROOF_FAILED / STRAIGHT_SKELETON_FAILED。
14
14
  */
15
15
  import { getBrepApi } from '../../brep/handle-bridge.js';
16
16
  import { ok, err } from '../../result/result.js';
@@ -20,7 +20,7 @@ import { brepHandleOf } from './brepHelpers.js';
20
20
  import { computeStraightSkeleton } from './straightSkeleton.js';
21
21
  const ROOF_PARAMS = { name: 'roof', params: ['shape', 'options'], formClass: 'A' };
22
22
  // ---------------------------------------------------------------------------
23
- // Helpers(照抄 vendored roofFns.ts)
23
+ // Helpers(照抄 brepjs roofFns.ts)
24
24
  // ---------------------------------------------------------------------------
25
25
  function extractPolygon(kernel, wire) {
26
26
  const edges = kernel.getSubShapes(wire, 'edge');
@@ -60,7 +60,7 @@ function pointInTriangle(px, py, ax, ay, bx, by, cx, cy) {
60
60
  const hasPos = d1 > 0 || d2 > 0 || d3 > 0;
61
61
  return !(hasNeg && hasPos);
62
62
  }
63
- /** Ear-clip triangulate a simple polygon(照抄 vendored,含 CW→CCW 归一)。 */
63
+ /** Ear-clip triangulate a simple polygon(照抄 brepjs,含 CW→CCW 归一)。 */
64
64
  function earClipTriangulate(poly) {
65
65
  const n = poly.length;
66
66
  if (n < 3)
@@ -122,7 +122,7 @@ function earClipTriangulate(poly) {
122
122
  }
123
123
  return tris;
124
124
  }
125
- /** Convert skeleton faces into 3D triangular kernel faces(照抄 vendored)。 */
125
+ /** Convert skeleton faces into 3D triangular kernel faces(照抄 brepjs)。 */
126
126
  function buildSkeletonTriFaces(skeleton, tanAngle, kernel) {
127
127
  const triFaces = [];
128
128
  for (const skFace of skeleton.faces) {
@@ -158,10 +158,10 @@ function buildSkeletonTriFaces(skeleton, tanAngle, kernel) {
158
158
  return triFaces;
159
159
  }
160
160
  // ---------------------------------------------------------------------------
161
- // roof — 平面 wire → 直骨架屋顶实体(vendored roofFns.ts#roof)
161
+ // roof — 平面 wire → 直骨架屋顶实体(brepjs roofFns.ts#roof)
162
162
  // ---------------------------------------------------------------------------
163
163
  /**
164
- * Roof — planar wire to straight-skeleton roof solid (vendored roofFns.ts#roof).
164
+ * Roof — planar wire to straight-skeleton roof solid (brepjs roofFns.ts#roof).
165
165
  *
166
166
  * @param args - Resolved arguments (wire, roof options).
167
167
  * @returns The generated roof solid as a `BrepHandle`.
@@ -1 +1 @@
1
- {"version":3,"file":"roofFns.js","sourceRoot":"","sources":["../../../src/api/brep-mirror/roofFns.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Self-hosted compat-op implementation — roof\n * (core-decouple Phase 3, §5.4; G4).\n *\n * @platform occt\n *\n * 迁移自 vendored `operations/roofFns.ts`(含 pure-TS straightSkeleton,\n * 见同目录 straightSkeleton.ts)。适配:\n * - getEdges → kernel.getSubShapes(handle, 'edge')\n * - curveStartPoint → kernel.curvePointAtParam(edge, 0)\n * - isValidSolid → kernel.isSolid(sew 兜底路径的闭合校验近似)\n * - Result/BrepError 用 core 面;输出 Result<BrepHandle>\n * 守卫与错误码保持 vendored:ROOF_FAILED / STRAIGHT_SKELETON_FAILED。\n */\n\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { ok, err, type Result } from '../../result/result'\nimport { kernelError, BrepErrorCode } from '../../result/errors'\nimport type { FormClass } from '../internal/dual-form-args'\nimport { resolveArgs } from '../internal/dual-form-args'\nimport { brepHandleOf } from './brepHelpers'\nimport { computeStraightSkeleton, type SkPoint2D } from './straightSkeleton'\n\nconst ROOF_PARAMS = { name: 'roof', params: ['shape', 'options'], formClass: 'A' as FormClass }\n\n// ---------------------------------------------------------------------------\n// Helpers(照抄 vendored roofFns.ts)\n// ---------------------------------------------------------------------------\n\nfunction extractPolygon(kernel: ReturnType<typeof getBrepApi>, wire: BrepHandle): SkPoint2D[] {\n const edges = kernel.getSubShapes(wire, 'edge')\n const pts = edges.map((e) => {\n const pt = kernel.curvePointAtParam(e, 0)\n return { x: pt.x, y: pt.y }\n })\n const first = pts[0]\n const last = pts[pts.length - 1]\n if (\n pts.length > 1 &&\n first !== undefined &&\n last !== undefined &&\n Math.abs(first.x - last.x) < 1e-10 &&\n Math.abs(first.y - last.y) < 1e-10\n ) {\n pts.pop()\n }\n return pts\n}\n\n/** Fan-triangulate a convex polygon into triangles (index triples). */\nfunction fanTriangulate(count: number): Array<[number, number, number]> {\n const tris: Array<[number, number, number]> = []\n for (let i = 1; i < count - 1; i++) {\n tris.push([0, i, i + 1])\n }\n return tris\n}\n\n/** Signed area cross product for three 2D points (positive = CCW). */\nfunction cross2d(ax: number, ay: number, bx: number, by: number, cx: number, cy: number): number {\n return (bx - ax) * (cy - ay) - (by - ay) * (cx - ax)\n}\n\n/** Check if point (px,py) is strictly inside triangle (a,b,c). */\nfunction pointInTriangle(\n px: number,\n py: number,\n ax: number,\n ay: number,\n bx: number,\n by: number,\n cx: number,\n cy: number,\n): boolean {\n const d1 = cross2d(ax, ay, bx, by, px, py)\n const d2 = cross2d(bx, by, cx, cy, px, py)\n const d3 = cross2d(cx, cy, ax, ay, px, py)\n const hasNeg = d1 < 0 || d2 < 0 || d3 < 0\n const hasPos = d1 > 0 || d2 > 0 || d3 > 0\n return !(hasNeg && hasPos)\n}\n\n/** Ear-clip triangulate a simple polygon(照抄 vendored,含 CW→CCW 归一)。 */\nfunction earClipTriangulate(poly: SkPoint2D[]): Array<[number, number, number]> {\n const n = poly.length\n if (n < 3) return []\n if (n === 3) return [[0, 1, 2]]\n\n let area2 = 0\n for (let i = 0; i < n; i++) {\n const a = poly[i]\n const b = poly[(i + 1) % n]\n if (a && b) area2 += a.x * b.y - b.x * a.y\n }\n if (area2 < 0) {\n const tris = earClipTriangulate([...poly].reverse())\n return tris.map(([a, b, c]) => [n - 1 - a, n - 1 - b, n - 1 - c])\n }\n\n const tris: Array<[number, number, number]> = []\n const idx = poly.map((_, i) => i)\n const isEar = (prev: number, curr: number, next: number): boolean => {\n const a = poly[prev]\n const b = poly[curr]\n const c = poly[next]\n if (!a || !b || !c) return false\n if (cross2d(a.x, a.y, b.x, b.y, c.x, c.y) <= 0) return false\n for (let j = 0; j < n; j++) {\n const p = poly[j]\n if (!p || j === prev || j === curr || j === next) continue\n if (pointInTriangle(p.x, p.y, a.x, a.y, b.x, b.y, c.x, c.y)) return false\n }\n return true\n }\n\n while (idx.length > 3) {\n let clipped = false\n for (let i = 0; i < idx.length; i++) {\n const prev = idx[(i - 1 + idx.length) % idx.length]\n const curr = idx[i]\n const next = idx[(i + 1) % idx.length]\n if (prev === undefined || curr === undefined || next === undefined) continue\n if (isEar(prev, curr, next)) {\n tris.push([prev, curr, next])\n idx.splice(i, 1)\n clipped = true\n break\n }\n }\n if (!clipped) break\n }\n if (idx.length === 3) {\n const [a, b, c] = idx\n if (a !== undefined && b !== undefined && c !== undefined) tris.push([a, b, c])\n }\n return tris\n}\n\n/** Convert skeleton faces into 3D triangular kernel faces(照抄 vendored)。 */\nfunction buildSkeletonTriFaces(\n skeleton: { faces: Array<{ vertices: SkPoint2D[]; heights: number[] }> },\n tanAngle: number,\n kernel: ReturnType<typeof getBrepApi>,\n): BrepHandle[] {\n const triFaces: BrepHandle[] = []\n for (const skFace of skeleton.faces) {\n const verts3d: Array<[number, number, number]> = skFace.vertices.map(\n (v: SkPoint2D, i: number): [number, number, number] => [\n v.x,\n v.y,\n (skFace.heights[i] ?? 0) * tanAngle,\n ],\n )\n\n const tris = fanTriangulate(verts3d.length)\n\n for (const [ai, bi, ci] of tris) {\n const va = verts3d[ai]\n const vb = verts3d[bi]\n const vc = verts3d[ci]\n if (!va || !vb || !vc) continue\n\n const abx = vb[0] - va[0]\n const aby = vb[1] - va[1]\n const abz = vb[2] - va[2]\n const acx = vc[0] - va[0]\n const acy = vc[1] - va[1]\n const acz = vc[2] - va[2]\n const nx = aby * acz - abz * acy\n const ny = abz * acx - abx * acz\n const nz = abx * acy - aby * acx\n const areaSq = nx * nx + ny * ny + nz * nz\n if (areaSq < 1e-20) continue\n\n const triFace = kernel.buildTriFace({ x: va[0], y: va[1], z: va[2] }, { x: vb[0], y: vb[1], z: vb[2] }, { x: vc[0], y: vc[1], z: vc[2] })\n if (triFace !== null) triFaces.push(triFace)\n }\n }\n return triFaces\n}\n\n// ---------------------------------------------------------------------------\n// roof — 平面 wire → 直骨架屋顶实体(vendored roofFns.ts#roof)\n// ---------------------------------------------------------------------------\n\n/**\n * Roof — planar wire to straight-skeleton roof solid (vendored roofFns.ts#roof).\n *\n * @param args - Resolved arguments (wire, roof options).\n * @returns The generated roof solid as a `BrepHandle`.\n */\nexport function roofBrep(...args: unknown[]): Result<BrepHandle> {\n const [shape, options] = resolveArgs(args, ROOF_PARAMS)\n const kernel = getBrepApi()\n const wire = brepHandleOf(shape)\n const angle = ((options as { angle?: number } | undefined)?.angle ?? 45) * (Math.PI / 180)\n const tanAngle = Math.tan(angle)\n\n try {\n const polygon = extractPolygon(kernel, wire)\n if (polygon.length < 3) {\n return err(\n kernelError(BrepErrorCode.ROOF_FAILED, 'Wire must have at least 3 edges for roof generation'),\n )\n }\n\n const skeletonResult = computeStraightSkeleton(polygon)\n if (!skeletonResult.ok) return skeletonResult\n const skeleton = skeletonResult.value\n if (skeleton.faces.length === 0) {\n return err(\n kernelError(BrepErrorCode.ROOF_FAILED, 'Straight skeleton computation produced no faces'),\n )\n }\n\n const triFaces: BrepHandle[] = buildSkeletonTriFaces(skeleton, tanAngle, kernel)\n\n // Bottom face(z=0,ear-clip 支持凹多边形)\n for (const [ai, bi, ci] of earClipTriangulate(polygon)) {\n const pa = polygon[ai]\n const pb = polygon[bi]\n const pc = polygon[ci]\n if (!pa || !pb || !pc) continue\n const va: [number, number, number] = [pa.x, pa.y, 0]\n const vb: [number, number, number] = [pb.x, pb.y, 0]\n const vc: [number, number, number] = [pc.x, pc.y, 0]\n const triFace = kernel.buildTriFace({ x: va[0], y: va[1], z: va[2] }, { x: vc[0], y: vc[1], z: vc[2] }, { x: vb[0], y: vb[1], z: vb[2] })\n if (triFace !== null) triFaces.push(triFace)\n }\n\n if (triFaces.length === 0) {\n return err(\n kernelError(BrepErrorCode.ROOF_FAILED, 'No valid triangular faces could be built'),\n )\n }\n\n try {\n const solid = kernel.sewAndSolidify(triFaces, 1e-6)\n const fixed = kernel.fixShape(solid)\n if (fixed !== solid) kernel.release(solid)\n return ok(fixed)\n } catch (solidifyErr) {\n try {\n const sewn = kernel.sew(triFaces, 1e-6)\n if (kernel.isSolid(sewn)) return ok(sewn)\n return err(\n kernelError(BrepErrorCode.ROOF_FAILED, 'Sew fallback produced invalid solid', solidifyErr),\n )\n } catch (sewErr) {\n return err(kernelError(BrepErrorCode.ROOF_FAILED, 'Failed to sew roof faces', sewErr))\n }\n }\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n return err(kernelError(BrepErrorCode.ROOF_FAILED, `Roof generation failed: ${raw}`, e))\n }\n}\n"]}
1
+ {"version":3,"file":"roofFns.js","sourceRoot":"","sources":["../../../src/api/brep-mirror/roofFns.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Self-hosted compat-op implementation — roof\n * (core-decouple Phase 3, §5.4; G4).\n *\n * @platform occt\n *\n * 迁移自 brepjs `operations/roofFns.ts`(含 pure-TS straightSkeleton,\n * 见同目录 straightSkeleton.ts)。适配:\n * - getEdges → kernel.getSubShapes(handle, 'edge')\n * - curveStartPoint → kernel.curvePointAtParam(edge, 0)\n * - isValidSolid → kernel.isSolid(sew 兜底路径的闭合校验近似)\n * - Result/BrepError 用 core 面;输出 Result<BrepHandle>\n * 守卫与错误码保持 brepjs:ROOF_FAILED / STRAIGHT_SKELETON_FAILED。\n */\n\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { ok, err, type Result } from '../../result/result'\nimport { kernelError, BrepErrorCode } from '../../result/errors'\nimport type { FormClass } from '../internal/dual-form-args'\nimport { resolveArgs } from '../internal/dual-form-args'\nimport { brepHandleOf } from './brepHelpers'\nimport { computeStraightSkeleton, type SkPoint2D } from './straightSkeleton'\n\nconst ROOF_PARAMS = { name: 'roof', params: ['shape', 'options'], formClass: 'A' as FormClass }\n\n// ---------------------------------------------------------------------------\n// Helpers(照抄 brepjs roofFns.ts)\n// ---------------------------------------------------------------------------\n\nfunction extractPolygon(kernel: ReturnType<typeof getBrepApi>, wire: BrepHandle): SkPoint2D[] {\n const edges = kernel.getSubShapes(wire, 'edge')\n const pts = edges.map((e) => {\n const pt = kernel.curvePointAtParam(e, 0)\n return { x: pt.x, y: pt.y }\n })\n const first = pts[0]\n const last = pts[pts.length - 1]\n if (\n pts.length > 1 &&\n first !== undefined &&\n last !== undefined &&\n Math.abs(first.x - last.x) < 1e-10 &&\n Math.abs(first.y - last.y) < 1e-10\n ) {\n pts.pop()\n }\n return pts\n}\n\n/** Fan-triangulate a convex polygon into triangles (index triples). */\nfunction fanTriangulate(count: number): Array<[number, number, number]> {\n const tris: Array<[number, number, number]> = []\n for (let i = 1; i < count - 1; i++) {\n tris.push([0, i, i + 1])\n }\n return tris\n}\n\n/** Signed area cross product for three 2D points (positive = CCW). */\nfunction cross2d(ax: number, ay: number, bx: number, by: number, cx: number, cy: number): number {\n return (bx - ax) * (cy - ay) - (by - ay) * (cx - ax)\n}\n\n/** Check if point (px,py) is strictly inside triangle (a,b,c). */\nfunction pointInTriangle(\n px: number,\n py: number,\n ax: number,\n ay: number,\n bx: number,\n by: number,\n cx: number,\n cy: number,\n): boolean {\n const d1 = cross2d(ax, ay, bx, by, px, py)\n const d2 = cross2d(bx, by, cx, cy, px, py)\n const d3 = cross2d(cx, cy, ax, ay, px, py)\n const hasNeg = d1 < 0 || d2 < 0 || d3 < 0\n const hasPos = d1 > 0 || d2 > 0 || d3 > 0\n return !(hasNeg && hasPos)\n}\n\n/** Ear-clip triangulate a simple polygon(照抄 brepjs,含 CW→CCW 归一)。 */\nfunction earClipTriangulate(poly: SkPoint2D[]): Array<[number, number, number]> {\n const n = poly.length\n if (n < 3) return []\n if (n === 3) return [[0, 1, 2]]\n\n let area2 = 0\n for (let i = 0; i < n; i++) {\n const a = poly[i]\n const b = poly[(i + 1) % n]\n if (a && b) area2 += a.x * b.y - b.x * a.y\n }\n if (area2 < 0) {\n const tris = earClipTriangulate([...poly].reverse())\n return tris.map(([a, b, c]) => [n - 1 - a, n - 1 - b, n - 1 - c])\n }\n\n const tris: Array<[number, number, number]> = []\n const idx = poly.map((_, i) => i)\n const isEar = (prev: number, curr: number, next: number): boolean => {\n const a = poly[prev]\n const b = poly[curr]\n const c = poly[next]\n if (!a || !b || !c) return false\n if (cross2d(a.x, a.y, b.x, b.y, c.x, c.y) <= 0) return false\n for (let j = 0; j < n; j++) {\n const p = poly[j]\n if (!p || j === prev || j === curr || j === next) continue\n if (pointInTriangle(p.x, p.y, a.x, a.y, b.x, b.y, c.x, c.y)) return false\n }\n return true\n }\n\n while (idx.length > 3) {\n let clipped = false\n for (let i = 0; i < idx.length; i++) {\n const prev = idx[(i - 1 + idx.length) % idx.length]\n const curr = idx[i]\n const next = idx[(i + 1) % idx.length]\n if (prev === undefined || curr === undefined || next === undefined) continue\n if (isEar(prev, curr, next)) {\n tris.push([prev, curr, next])\n idx.splice(i, 1)\n clipped = true\n break\n }\n }\n if (!clipped) break\n }\n if (idx.length === 3) {\n const [a, b, c] = idx\n if (a !== undefined && b !== undefined && c !== undefined) tris.push([a, b, c])\n }\n return tris\n}\n\n/** Convert skeleton faces into 3D triangular kernel faces(照抄 brepjs)。 */\nfunction buildSkeletonTriFaces(\n skeleton: { faces: Array<{ vertices: SkPoint2D[]; heights: number[] }> },\n tanAngle: number,\n kernel: ReturnType<typeof getBrepApi>,\n): BrepHandle[] {\n const triFaces: BrepHandle[] = []\n for (const skFace of skeleton.faces) {\n const verts3d: Array<[number, number, number]> = skFace.vertices.map(\n (v: SkPoint2D, i: number): [number, number, number] => [\n v.x,\n v.y,\n (skFace.heights[i] ?? 0) * tanAngle,\n ],\n )\n\n const tris = fanTriangulate(verts3d.length)\n\n for (const [ai, bi, ci] of tris) {\n const va = verts3d[ai]\n const vb = verts3d[bi]\n const vc = verts3d[ci]\n if (!va || !vb || !vc) continue\n\n const abx = vb[0] - va[0]\n const aby = vb[1] - va[1]\n const abz = vb[2] - va[2]\n const acx = vc[0] - va[0]\n const acy = vc[1] - va[1]\n const acz = vc[2] - va[2]\n const nx = aby * acz - abz * acy\n const ny = abz * acx - abx * acz\n const nz = abx * acy - aby * acx\n const areaSq = nx * nx + ny * ny + nz * nz\n if (areaSq < 1e-20) continue\n\n const triFace = kernel.buildTriFace({ x: va[0], y: va[1], z: va[2] }, { x: vb[0], y: vb[1], z: vb[2] }, { x: vc[0], y: vc[1], z: vc[2] })\n if (triFace !== null) triFaces.push(triFace)\n }\n }\n return triFaces\n}\n\n// ---------------------------------------------------------------------------\n// roof — 平面 wire → 直骨架屋顶实体(brepjs roofFns.ts#roof)\n// ---------------------------------------------------------------------------\n\n/**\n * Roof — planar wire to straight-skeleton roof solid (brepjs roofFns.ts#roof).\n *\n * @param args - Resolved arguments (wire, roof options).\n * @returns The generated roof solid as a `BrepHandle`.\n */\nexport function roofBrep(...args: unknown[]): Result<BrepHandle> {\n const [shape, options] = resolveArgs(args, ROOF_PARAMS)\n const kernel = getBrepApi()\n const wire = brepHandleOf(shape)\n const angle = ((options as { angle?: number } | undefined)?.angle ?? 45) * (Math.PI / 180)\n const tanAngle = Math.tan(angle)\n\n try {\n const polygon = extractPolygon(kernel, wire)\n if (polygon.length < 3) {\n return err(\n kernelError(BrepErrorCode.ROOF_FAILED, 'Wire must have at least 3 edges for roof generation'),\n )\n }\n\n const skeletonResult = computeStraightSkeleton(polygon)\n if (!skeletonResult.ok) return skeletonResult\n const skeleton = skeletonResult.value\n if (skeleton.faces.length === 0) {\n return err(\n kernelError(BrepErrorCode.ROOF_FAILED, 'Straight skeleton computation produced no faces'),\n )\n }\n\n const triFaces: BrepHandle[] = buildSkeletonTriFaces(skeleton, tanAngle, kernel)\n\n // Bottom face(z=0,ear-clip 支持凹多边形)\n for (const [ai, bi, ci] of earClipTriangulate(polygon)) {\n const pa = polygon[ai]\n const pb = polygon[bi]\n const pc = polygon[ci]\n if (!pa || !pb || !pc) continue\n const va: [number, number, number] = [pa.x, pa.y, 0]\n const vb: [number, number, number] = [pb.x, pb.y, 0]\n const vc: [number, number, number] = [pc.x, pc.y, 0]\n const triFace = kernel.buildTriFace({ x: va[0], y: va[1], z: va[2] }, { x: vc[0], y: vc[1], z: vc[2] }, { x: vb[0], y: vb[1], z: vb[2] })\n if (triFace !== null) triFaces.push(triFace)\n }\n\n if (triFaces.length === 0) {\n return err(\n kernelError(BrepErrorCode.ROOF_FAILED, 'No valid triangular faces could be built'),\n )\n }\n\n try {\n const solid = kernel.sewAndSolidify(triFaces, 1e-6)\n const fixed = kernel.fixShape(solid)\n if (fixed !== solid) kernel.release(solid)\n return ok(fixed)\n } catch (solidifyErr) {\n try {\n const sewn = kernel.sew(triFaces, 1e-6)\n if (kernel.isSolid(sewn)) return ok(sewn)\n return err(\n kernelError(BrepErrorCode.ROOF_FAILED, 'Sew fallback produced invalid solid', solidifyErr),\n )\n } catch (sewErr) {\n return err(kernelError(BrepErrorCode.ROOF_FAILED, 'Failed to sew roof faces', sewErr))\n }\n }\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n return err(kernelError(BrepErrorCode.ROOF_FAILED, `Roof generation failed: ${raw}`, e))\n }\n}\n"]}
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * @platform occt
6
6
  *
7
- * Semantics mirror vendored `operations/{api,extrudeFns,sweepFns}.ts`:
7
+ * Semantics mirror brepjs `operations/{api,extrudeFns,sweepFns}.ts`:
8
8
  * - `extrudeBrep` — height: number → [0,0,h]; Vec3 → as-is. EXTRUDE_ZERO_VECTOR guard.
9
9
  * - `revolveBrep` — options { at, axis, angle(radians, default 2π) }; REVOLUTION_NOT_3D.
10
10
  * - `sweepBrep` — config.mode 'simple' → simplePipe; default → sweepPipeShell(frenet).
@@ -12,41 +12,41 @@
12
12
  * supported after selfhosting (cad 面取手写 api/sweep.ts,shell 元组不暴露 §2.4①).
13
13
  * - `complexExtrudeBrep` / `twistExtrudeBrep` — linear / helix spine built on
14
14
  * occt-wasm makeLineEdge+makeWire / makeHelixWire, then sweepPipeShell.
15
- * ExtrusionProfile scaling law is not supported (vendored buildLawFromProfile
15
+ * ExtrusionProfile scaling law is not supported (brepjs buildLawFromProfile
16
16
  * has no L1 equivalent); non-undefined profile → LAW_UNSUPPORTED error.
17
17
  */
18
18
  import type { BrepHandle } from '../../brep/engine/types.js';
19
19
  import { type Result } from '../../result/result.js';
20
20
  /**
21
- * Extrude a face along a vector/height (vendored api.js#extrude + extrudeFns.ts#extrude).
21
+ * Extrude a face along a vector/height (brepjs api.js#extrude + extrudeFns.ts#extrude).
22
22
  *
23
23
  * @param args - Resolved arguments (face, height or extrusion vector).
24
24
  * @returns The extruded solid as a `BrepHandle`.
25
25
  */
26
26
  export declare function extrudeBrep(...args: unknown[]): Result<BrepHandle>;
27
27
  /**
28
- * Revolve a face around an axis (vendored api.js#revolve; angle in radians, default 2π).
28
+ * Revolve a face around an axis (brepjs api.js#revolve; angle in radians, default 2π).
29
29
  *
30
30
  * @param args - Resolved arguments (face, revolve options).
31
31
  * @returns The revolved solid as a `BrepHandle`.
32
32
  */
33
33
  export declare function revolveBrep(...args: unknown[]): Result<BrepHandle>;
34
34
  /**
35
- * Sweep a profile along a spine (vendored sweepFns.ts#sweep).
35
+ * Sweep a profile along a spine (brepjs sweepFns.ts#sweep).
36
36
  *
37
37
  * @param args - Resolved arguments (wire, spine, config, shellMode).
38
38
  * @returns The swept solid as a `BrepHandle`.
39
39
  */
40
40
  export declare function sweepBrep(...args: unknown[]): Result<BrepHandle>;
41
41
  /**
42
- * Extrude a wire along a normal (vendored sweepFns.ts#complexExtrude).
42
+ * Extrude a wire along a normal (brepjs sweepFns.ts#complexExtrude).
43
43
  *
44
44
  * @param args - Resolved arguments (wire, center, normal, profile).
45
45
  * @returns The extruded solid as a `BrepHandle`.
46
46
  */
47
47
  export declare function complexExtrudeBrep(...args: unknown[]): Result<BrepHandle>;
48
48
  /**
49
- * Extrude a wire along a helical path (vendored sweepFns.ts#twistExtrude).
49
+ * Extrude a wire along a helical path (brepjs sweepFns.ts#twistExtrude).
50
50
  *
51
51
  * @param args - Resolved arguments (wire, angleDegrees, center, normal, profile).
52
52
  * @returns The twisted extrusion as a `BrepHandle`.
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * @platform occt
6
6
  *
7
- * Semantics mirror vendored `operations/{api,extrudeFns,sweepFns}.ts`:
7
+ * Semantics mirror brepjs `operations/{api,extrudeFns,sweepFns}.ts`:
8
8
  * - `extrudeBrep` — height: number → [0,0,h]; Vec3 → as-is. EXTRUDE_ZERO_VECTOR guard.
9
9
  * - `revolveBrep` — options { at, axis, angle(radians, default 2π) }; REVOLUTION_NOT_3D.
10
10
  * - `sweepBrep` — config.mode 'simple' → simplePipe; default → sweepPipeShell(frenet).
@@ -12,7 +12,7 @@
12
12
  * supported after selfhosting (cad 面取手写 api/sweep.ts,shell 元组不暴露 §2.4①).
13
13
  * - `complexExtrudeBrep` / `twistExtrudeBrep` — linear / helix spine built on
14
14
  * occt-wasm makeLineEdge+makeWire / makeHelixWire, then sweepPipeShell.
15
- * ExtrusionProfile scaling law is not supported (vendored buildLawFromProfile
15
+ * ExtrusionProfile scaling law is not supported (brepjs buildLawFromProfile
16
16
  * has no L1 equivalent); non-undefined profile → LAW_UNSUPPORTED error.
17
17
  */
18
18
  import { getBrepApi } from '../../brep/handle-bridge.js';
@@ -29,7 +29,7 @@ const TWIST_EXTRUDE_PARAMS = { name: 'twistExtrude', params: ['wire', 'angleDegr
29
29
  function vecLength(v) {
30
30
  return Math.hypot(v[0], v[1], v[2]);
31
31
  }
32
- /** 构造直线 spine wire(vendored makeSpineWire)。 */
32
+ /** 构造直线 spine wire(brepjs makeSpineWire)。 */
33
33
  function makeSpineWire(kernel, start, end) {
34
34
  const e = kernel.makeLineEdge({ x: start[0], y: start[1], z: start[2] }, { x: end[0], y: end[1], z: end[2] });
35
35
  const w = kernel.makeWire([e]);
@@ -37,10 +37,10 @@ function makeSpineWire(kernel, start, end) {
37
37
  return w;
38
38
  }
39
39
  // ---------------------------------------------------------------------------
40
- // extrude — face 沿向量/高度拉伸(vendored api.js#extrude + extrudeFns.ts#extrude)
40
+ // extrude — face 沿向量/高度拉伸(brepjs api.js#extrude + extrudeFns.ts#extrude)
41
41
  // ---------------------------------------------------------------------------
42
42
  /**
43
- * Extrude a face along a vector/height (vendored api.js#extrude + extrudeFns.ts#extrude).
43
+ * Extrude a face along a vector/height (brepjs api.js#extrude + extrudeFns.ts#extrude).
44
44
  *
45
45
  * @param args - Resolved arguments (face, height or extrusion vector).
46
46
  * @returns The extruded solid as a `BrepHandle`.
@@ -62,10 +62,10 @@ export function extrudeBrep(...args) {
62
62
  }
63
63
  }
64
64
  // ---------------------------------------------------------------------------
65
- // revolve — face 绕轴旋转(vendored api.js#revolve;angle 单位弧度,默认 2π)
65
+ // revolve — face 绕轴旋转(brepjs api.js#revolve;angle 单位弧度,默认 2π)
66
66
  // ---------------------------------------------------------------------------
67
67
  /**
68
- * Revolve a face around an axis (vendored api.js#revolve; angle in radians, default 2π).
68
+ * Revolve a face around an axis (brepjs api.js#revolve; angle in radians, default 2π).
69
69
  *
70
70
  * @param args - Resolved arguments (face, revolve options).
71
71
  * @returns The revolved solid as a `BrepHandle`.
@@ -85,10 +85,10 @@ export function revolveBrep(...args) {
85
85
  }
86
86
  }
87
87
  // ---------------------------------------------------------------------------
88
- // sweep — 截面沿脊柱扫掠(vendored sweepFns.ts#sweep)
88
+ // sweep — 截面沿脊柱扫掠(brepjs sweepFns.ts#sweep)
89
89
  // ---------------------------------------------------------------------------
90
90
  /**
91
- * Sweep a profile along a spine (vendored sweepFns.ts#sweep).
91
+ * Sweep a profile along a spine (brepjs sweepFns.ts#sweep).
92
92
  *
93
93
  * @param args - Resolved arguments (wire, spine, config, shellMode).
94
94
  * @returns The swept solid as a `BrepHandle`.
@@ -116,10 +116,10 @@ export function sweepBrep(...args) {
116
116
  }
117
117
  }
118
118
  // ---------------------------------------------------------------------------
119
- // complexExtrude — wire 沿 normal 挤出(vendored sweepFns.ts#complexExtrude)
119
+ // complexExtrude — wire 沿 normal 挤出(brepjs sweepFns.ts#complexExtrude)
120
120
  // ---------------------------------------------------------------------------
121
121
  /**
122
- * Extrude a wire along a normal (vendored sweepFns.ts#complexExtrude).
122
+ * Extrude a wire along a normal (brepjs sweepFns.ts#complexExtrude).
123
123
  *
124
124
  * @param args - Resolved arguments (wire, center, normal, profile).
125
125
  * @returns The extruded solid as a `BrepHandle`.
@@ -151,10 +151,10 @@ export function complexExtrudeBrep(...args) {
151
151
  }
152
152
  }
153
153
  // ---------------------------------------------------------------------------
154
- // twistExtrude — wire 沿螺旋挤出(vendored sweepFns.ts#twistExtrude)
154
+ // twistExtrude — wire 沿螺旋挤出(brepjs sweepFns.ts#twistExtrude)
155
155
  // ---------------------------------------------------------------------------
156
156
  /**
157
- * Extrude a wire along a helical path (vendored sweepFns.ts#twistExtrude).
157
+ * Extrude a wire along a helical path (brepjs sweepFns.ts#twistExtrude).
158
158
  *
159
159
  * @param args - Resolved arguments (wire, angleDegrees, center, normal, profile).
160
160
  * @returns The twisted extrusion as a `BrepHandle`.
@@ -180,7 +180,7 @@ export function twistExtrudeBrep(...args) {
180
180
  }
181
181
  const extrusionLength = vecLength(n);
182
182
  const pitch = (360.0 / Math.abs(angle)) * extrusionLength;
183
- // vendored 语义:主 spine=直线、auxiliary=helix,sweepPipeShell 传对象参数
183
+ // brepjs 语义:主 spine=直线、auxiliary=helix,sweepPipeShell 传对象参数
184
184
  // (occt-wasm 运行时接受 auxiliary 键;d.ts 窄签名用 as never 绕过)
185
185
  const endPointTwist = [c[0] + n[0], c[1] + n[1], c[2] + n[2]];
186
186
  const spine = makeSpineWire(kernel, c, endPointTwist);
@@ -1 +1 @@
1
- {"version":3,"file":"sweepFns.js","sourceRoot":"","sources":["../../../src/api/brep-mirror/sweepFns.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Self-hosted compat-op implementations — extrude/revolve/sweep family\n * (core-decouple Phase 3, §5.4; G3).\n *\n * @platform occt\n *\n * Semantics mirror vendored `operations/{api,extrudeFns,sweepFns}.ts`:\n * - `extrudeBrep` — height: number → [0,0,h]; Vec3 → as-is. EXTRUDE_ZERO_VECTOR guard.\n * - `revolveBrep` — options { at, axis, angle(radians, default 2π) }; REVOLUTION_NOT_3D.\n * - `sweepBrep` — config.mode 'simple' → simplePipe; default → sweepPipeShell(frenet).\n * shellMode / law / auxiliarySpine / support / correction configs are not\n * supported after selfhosting (cad 面取手写 api/sweep.ts,shell 元组不暴露 §2.4①).\n * - `complexExtrudeBrep` / `twistExtrudeBrep` — linear / helix spine built on\n * occt-wasm makeLineEdge+makeWire / makeHelixWire, then sweepPipeShell.\n * ExtrusionProfile scaling law is not supported (vendored buildLawFromProfile\n * has no L1 equivalent); non-undefined profile → LAW_UNSUPPORTED error.\n */\n\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { ok, err, type Result } from '../../result/result'\nimport { kernelError, validationError } from '../../result/errors'\nimport type { FormClass } from '../internal/dual-form-args'\nimport { resolveArgs } from '../internal/dual-form-args'\nimport type { Vec3 } from '../brepjs-compat/types'\nimport { brepHandleOf } from './brepHelpers'\nimport { getOcctKernel } from '../../occt-kernel/occtKernel'\n\nconst EXTRUDE_PARAMS = { name: 'extrude', params: ['face', 'height'], formClass: 'A' as FormClass }\nconst REVOLVE_PARAMS = { name: 'revolve', params: ['face', 'options'], formClass: 'A' as FormClass }\nconst SWEEP_PARAMS = { name: 'sweep', params: ['wire', 'spine', 'config', 'shellMode'], formClass: 'A' as FormClass }\nconst COMPLEX_EXTRUDE_PARAMS = { name: 'complexExtrude', params: ['wire', 'center', 'normal', 'profile'], formClass: 'A' as FormClass }\nconst TWIST_EXTRUDE_PARAMS = { name: 'twistExtrude', params: ['wire', 'angleDegrees', 'center', 'normal', 'profile'], formClass: 'A' as FormClass }\n\nfunction vecLength(v: readonly number[]): number {\n return Math.hypot(v[0], v[1], v[2])\n}\n\n/** 构造直线 spine wire(vendored makeSpineWire)。 */\nfunction makeSpineWire(kernel: ReturnType<typeof getBrepApi>, start: Vec3, end: Vec3): BrepHandle {\n const e = kernel.makeLineEdge({ x: start[0], y: start[1], z: start[2] }, { x: end[0], y: end[1], z: end[2] })\n const w = kernel.makeWire([e])\n kernel.release(e)\n return w\n}\n\n// ---------------------------------------------------------------------------\n// extrude — face 沿向量/高度拉伸(vendored api.js#extrude + extrudeFns.ts#extrude)\n// ---------------------------------------------------------------------------\n\n/**\n * Extrude a face along a vector/height (vendored api.js#extrude + extrudeFns.ts#extrude).\n *\n * @param args - Resolved arguments (face, height or extrusion vector).\n * @returns The extruded solid as a `BrepHandle`.\n */\nexport function extrudeBrep(...args: unknown[]): Result<BrepHandle> {\n const [face, height] = resolveArgs(args, EXTRUDE_PARAMS)\n const kernel = getBrepApi()\n const f = brepHandleOf(face)\n const vec: Vec3 = typeof height === 'number' ? [0, 0, height] : (height as Vec3)\n if (vecLength(vec) < 1e-10) {\n return err(validationError('EXTRUDE_ZERO_VECTOR', 'extrude: extrusion vector has zero length'))\n }\n try {\n return ok(kernel.extrude(f, vec[0], vec[1], vec[2]))\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n return err(kernelError('EXTRUDE_FAILED', `Extrusion operation failed: ${raw}`, e))\n }\n}\n\n// ---------------------------------------------------------------------------\n// revolve — face 绕轴旋转(vendored api.js#revolve;angle 单位弧度,默认 2π)\n// ---------------------------------------------------------------------------\n\n/**\n * Revolve a face around an axis (vendored api.js#revolve; angle in radians, default 2π).\n *\n * @param args - Resolved arguments (face, revolve options).\n * @returns The revolved solid as a `BrepHandle`.\n */\nexport function revolveBrep(...args: unknown[]): Result<BrepHandle> {\n const [face, options] = resolveArgs(args, REVOLVE_PARAMS)\n const kernel = getBrepApi()\n const f = brepHandleOf(face)\n const { at = [0, 0, 0], axis = [0, 0, 1], angle = 2 * Math.PI } = (options ?? {}) as {\n at?: Vec3\n axis?: Vec3\n angle?: number\n }\n try {\n const h = kernel.revolveVec(\n f,\n { x: at[0], y: at[1], z: at[2] },\n { x: axis[0], y: axis[1], z: axis[2] },\n (angle * 180) / Math.PI,\n )\n return ok(h)\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n return err(kernelError('REVOLVE_FAILED', `Revolution operation failed: ${raw}`, e))\n }\n}\n\n// ---------------------------------------------------------------------------\n// sweep — 截面沿脊柱扫掠(vendored sweepFns.ts#sweep)\n// ---------------------------------------------------------------------------\n\n/**\n * Sweep a profile along a spine (vendored sweepFns.ts#sweep).\n *\n * @param args - Resolved arguments (wire, spine, config, shellMode).\n * @returns The swept solid as a `BrepHandle`.\n */\nexport function sweepBrep(...args: unknown[]): Result<BrepHandle> {\n const [wire, spine, config, shellMode] = resolveArgs(args, SWEEP_PARAMS)\n const w = brepHandleOf(wire)\n const sp = brepHandleOf(spine)\n const cfg = (config ?? {}) as { mode?: string; frenet?: boolean; transitionMode?: string }\n if (shellMode === true) {\n return err(\n validationError(\n 'SWEEP_SHELL_MODE_UNSUPPORTED',\n 'sweep shellMode is not supported after selfhosting (cad 面不暴露壳元组 §2.4①)',\n ),\n )\n }\n if (cfg.transitionMode !== undefined && cfg.transitionMode !== 'right') {\n return err(\n validationError(\n 'SWEEP_TRANSITION_UNSUPPORTED',\n `sweep transitionMode '${cfg.transitionMode}' is not supported after selfhosting (only 'right' default)`,\n ),\n )\n }\n try {\n if (cfg.mode === 'simple') {\n return ok(getOcctKernel().simplePipe(w as never, sp as never) as unknown as BrepHandle)\n }\n return ok(getOcctKernel().sweepPipeShell(w as never, sp as never, cfg.frenet === true, false) as unknown as BrepHandle)\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n return err(kernelError('SWEEP_FAILED', `Sweep operation failed: ${raw}`, e))\n }\n}\n\n// ---------------------------------------------------------------------------\n// complexExtrude — wire 沿 normal 挤出(vendored sweepFns.ts#complexExtrude)\n// ---------------------------------------------------------------------------\n\n/**\n * Extrude a wire along a normal (vendored sweepFns.ts#complexExtrude).\n *\n * @param args - Resolved arguments (wire, center, normal, profile).\n * @returns The extruded solid as a `BrepHandle`.\n */\nexport function complexExtrudeBrep(...args: unknown[]): Result<BrepHandle> {\n const [wire, center, normal, profile] = resolveArgs(args, COMPLEX_EXTRUDE_PARAMS)\n const kernel = getBrepApi()\n const w = brepHandleOf(wire)\n const c = (center ?? [0, 0, 0]) as Vec3\n const n = (normal ?? [0, 0, 0]) as Vec3\n\n if (vecLength(n) < 1e-10) {\n return err(validationError('ZERO_LENGTH_EXTRUSION', 'Extrusion vector cannot have zero length'))\n }\n if (profile !== undefined && profile !== null) {\n return err(\n validationError(\n 'COMPLEX_EXTRUDE_LAW_UNSUPPORTED',\n 'complexExtrude ExtrusionProfile scaling law is not supported after selfhosting',\n ),\n )\n }\n const endPoint: Vec3 = [c[0] + n[0], c[1] + n[1], c[2] + n[2]]\n const spine = makeSpineWire(kernel, c, endPoint)\n try {\n const h = getOcctKernel().sweepPipeShell(w as never, spine as never, false, false) as unknown as BrepHandle\n return ok(h)\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n return err(kernelError('SWEEP_FAILED', `complexExtrude sweep failed: ${raw}`, e))\n } finally {\n kernel.release(spine)\n }\n}\n\n// ---------------------------------------------------------------------------\n// twistExtrude — wire 沿螺旋挤出(vendored sweepFns.ts#twistExtrude)\n// ---------------------------------------------------------------------------\n\n/**\n * Extrude a wire along a helical path (vendored sweepFns.ts#twistExtrude).\n *\n * @param args - Resolved arguments (wire, angleDegrees, center, normal, profile).\n * @returns The twisted extrusion as a `BrepHandle`.\n */\nexport function twistExtrudeBrep(...args: unknown[]): Result<BrepHandle> {\n const [wire, angleDegrees, center, normal, profile] = resolveArgs(args, TWIST_EXTRUDE_PARAMS)\n const kernel = getBrepApi()\n const w = brepHandleOf(wire)\n const angle = Number(angleDegrees)\n const c = (center ?? [0, 0, 0]) as Vec3\n const n = (normal ?? [0, 0, 0]) as Vec3\n\n if (Math.abs(angle) < 1e-10) {\n return err(validationError('ZERO_TWIST_ANGLE', 'Twist angle cannot be zero'))\n }\n if (angle < 0) {\n return err(\n validationError(\n 'TWIST_NEGATIVE_ANGLE_UNSUPPORTED',\n 'twistExtrude negative angle (left-handed helix) is not supported after selfhosting (occt-wasm makeHelixWire has no handedness param)',\n ),\n )\n }\n if (vecLength(n) < 1e-10) {\n return err(validationError('ZERO_LENGTH_EXTRUSION', 'Extrusion vector cannot have zero length'))\n }\n if (profile !== undefined && profile !== null) {\n return err(\n validationError(\n 'TWIST_EXTRUDE_LAW_UNSUPPORTED',\n 'twistExtrude ExtrusionProfile scaling law is not supported after selfhosting',\n ),\n )\n }\n const extrusionLength = vecLength(n)\n const pitch = (360.0 / Math.abs(angle)) * extrusionLength\n // vendored 语义:主 spine=直线、auxiliary=helix,sweepPipeShell 传对象参数\n // (occt-wasm 运行时接受 auxiliary 键;d.ts 窄签名用 as never 绕过)\n const endPointTwist: Vec3 = [c[0] + n[0], c[1] + n[1], c[2] + n[2]]\n const spine = makeSpineWire(kernel, c, endPointTwist)\n const axisDir = vecLength(n) > 1e-12 ? [n[0] / vecLength(n), n[1] / vecLength(n), n[2] / vecLength(n)] : [0, 0, 1]\n try {\n const helix = getOcctKernel().makeHelixWire(\n { x: c[0], y: c[1], z: c[2] },\n { x: axisDir[0], y: axisDir[1], z: axisDir[2] },\n pitch,\n extrusionLength,\n 1,\n )\n const h = getOcctKernel().sweepPipeShell(w as never, spine as never, { auxiliary: helix } as never) as unknown as BrepHandle\n getOcctKernel().release(helix as never)\n kernel.release(spine)\n return ok(h)\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n return err(kernelError('SWEEP_FAILED', `twistExtrude sweep failed: ${raw}`, e))\n }\n}\n"]}
1
+ {"version":3,"file":"sweepFns.js","sourceRoot":"","sources":["../../../src/api/brep-mirror/sweepFns.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Self-hosted compat-op implementations — extrude/revolve/sweep family\n * (core-decouple Phase 3, §5.4; G3).\n *\n * @platform occt\n *\n * Semantics mirror brepjs `operations/{api,extrudeFns,sweepFns}.ts`:\n * - `extrudeBrep` — height: number → [0,0,h]; Vec3 → as-is. EXTRUDE_ZERO_VECTOR guard.\n * - `revolveBrep` — options { at, axis, angle(radians, default 2π) }; REVOLUTION_NOT_3D.\n * - `sweepBrep` — config.mode 'simple' → simplePipe; default → sweepPipeShell(frenet).\n * shellMode / law / auxiliarySpine / support / correction configs are not\n * supported after selfhosting (cad 面取手写 api/sweep.ts,shell 元组不暴露 §2.4①).\n * - `complexExtrudeBrep` / `twistExtrudeBrep` — linear / helix spine built on\n * occt-wasm makeLineEdge+makeWire / makeHelixWire, then sweepPipeShell.\n * ExtrusionProfile scaling law is not supported (brepjs buildLawFromProfile\n * has no L1 equivalent); non-undefined profile → LAW_UNSUPPORTED error.\n */\n\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { ok, err, type Result } from '../../result/result'\nimport { kernelError, validationError } from '../../result/errors'\nimport type { FormClass } from '../internal/dual-form-args'\nimport { resolveArgs } from '../internal/dual-form-args'\nimport type { Vec3 } from '../brepjs-compat/types'\nimport { brepHandleOf } from './brepHelpers'\nimport { getOcctKernel } from '../../occt-kernel/occtKernel'\n\nconst EXTRUDE_PARAMS = { name: 'extrude', params: ['face', 'height'], formClass: 'A' as FormClass }\nconst REVOLVE_PARAMS = { name: 'revolve', params: ['face', 'options'], formClass: 'A' as FormClass }\nconst SWEEP_PARAMS = { name: 'sweep', params: ['wire', 'spine', 'config', 'shellMode'], formClass: 'A' as FormClass }\nconst COMPLEX_EXTRUDE_PARAMS = { name: 'complexExtrude', params: ['wire', 'center', 'normal', 'profile'], formClass: 'A' as FormClass }\nconst TWIST_EXTRUDE_PARAMS = { name: 'twistExtrude', params: ['wire', 'angleDegrees', 'center', 'normal', 'profile'], formClass: 'A' as FormClass }\n\nfunction vecLength(v: readonly number[]): number {\n return Math.hypot(v[0], v[1], v[2])\n}\n\n/** 构造直线 spine wire(brepjs makeSpineWire)。 */\nfunction makeSpineWire(kernel: ReturnType<typeof getBrepApi>, start: Vec3, end: Vec3): BrepHandle {\n const e = kernel.makeLineEdge({ x: start[0], y: start[1], z: start[2] }, { x: end[0], y: end[1], z: end[2] })\n const w = kernel.makeWire([e])\n kernel.release(e)\n return w\n}\n\n// ---------------------------------------------------------------------------\n// extrude — face 沿向量/高度拉伸(brepjs api.js#extrude + extrudeFns.ts#extrude)\n// ---------------------------------------------------------------------------\n\n/**\n * Extrude a face along a vector/height (brepjs api.js#extrude + extrudeFns.ts#extrude).\n *\n * @param args - Resolved arguments (face, height or extrusion vector).\n * @returns The extruded solid as a `BrepHandle`.\n */\nexport function extrudeBrep(...args: unknown[]): Result<BrepHandle> {\n const [face, height] = resolveArgs(args, EXTRUDE_PARAMS)\n const kernel = getBrepApi()\n const f = brepHandleOf(face)\n const vec: Vec3 = typeof height === 'number' ? [0, 0, height] : (height as Vec3)\n if (vecLength(vec) < 1e-10) {\n return err(validationError('EXTRUDE_ZERO_VECTOR', 'extrude: extrusion vector has zero length'))\n }\n try {\n return ok(kernel.extrude(f, vec[0], vec[1], vec[2]))\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n return err(kernelError('EXTRUDE_FAILED', `Extrusion operation failed: ${raw}`, e))\n }\n}\n\n// ---------------------------------------------------------------------------\n// revolve — face 绕轴旋转(brepjs api.js#revolve;angle 单位弧度,默认 2π)\n// ---------------------------------------------------------------------------\n\n/**\n * Revolve a face around an axis (brepjs api.js#revolve; angle in radians, default 2π).\n *\n * @param args - Resolved arguments (face, revolve options).\n * @returns The revolved solid as a `BrepHandle`.\n */\nexport function revolveBrep(...args: unknown[]): Result<BrepHandle> {\n const [face, options] = resolveArgs(args, REVOLVE_PARAMS)\n const kernel = getBrepApi()\n const f = brepHandleOf(face)\n const { at = [0, 0, 0], axis = [0, 0, 1], angle = 2 * Math.PI } = (options ?? {}) as {\n at?: Vec3\n axis?: Vec3\n angle?: number\n }\n try {\n const h = kernel.revolveVec(\n f,\n { x: at[0], y: at[1], z: at[2] },\n { x: axis[0], y: axis[1], z: axis[2] },\n (angle * 180) / Math.PI,\n )\n return ok(h)\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n return err(kernelError('REVOLVE_FAILED', `Revolution operation failed: ${raw}`, e))\n }\n}\n\n// ---------------------------------------------------------------------------\n// sweep — 截面沿脊柱扫掠(brepjs sweepFns.ts#sweep)\n// ---------------------------------------------------------------------------\n\n/**\n * Sweep a profile along a spine (brepjs sweepFns.ts#sweep).\n *\n * @param args - Resolved arguments (wire, spine, config, shellMode).\n * @returns The swept solid as a `BrepHandle`.\n */\nexport function sweepBrep(...args: unknown[]): Result<BrepHandle> {\n const [wire, spine, config, shellMode] = resolveArgs(args, SWEEP_PARAMS)\n const w = brepHandleOf(wire)\n const sp = brepHandleOf(spine)\n const cfg = (config ?? {}) as { mode?: string; frenet?: boolean; transitionMode?: string }\n if (shellMode === true) {\n return err(\n validationError(\n 'SWEEP_SHELL_MODE_UNSUPPORTED',\n 'sweep shellMode is not supported after selfhosting (cad 面不暴露壳元组 §2.4①)',\n ),\n )\n }\n if (cfg.transitionMode !== undefined && cfg.transitionMode !== 'right') {\n return err(\n validationError(\n 'SWEEP_TRANSITION_UNSUPPORTED',\n `sweep transitionMode '${cfg.transitionMode}' is not supported after selfhosting (only 'right' default)`,\n ),\n )\n }\n try {\n if (cfg.mode === 'simple') {\n return ok(getOcctKernel().simplePipe(w as never, sp as never) as unknown as BrepHandle)\n }\n return ok(getOcctKernel().sweepPipeShell(w as never, sp as never, cfg.frenet === true, false) as unknown as BrepHandle)\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n return err(kernelError('SWEEP_FAILED', `Sweep operation failed: ${raw}`, e))\n }\n}\n\n// ---------------------------------------------------------------------------\n// complexExtrude — wire 沿 normal 挤出(brepjs sweepFns.ts#complexExtrude)\n// ---------------------------------------------------------------------------\n\n/**\n * Extrude a wire along a normal (brepjs sweepFns.ts#complexExtrude).\n *\n * @param args - Resolved arguments (wire, center, normal, profile).\n * @returns The extruded solid as a `BrepHandle`.\n */\nexport function complexExtrudeBrep(...args: unknown[]): Result<BrepHandle> {\n const [wire, center, normal, profile] = resolveArgs(args, COMPLEX_EXTRUDE_PARAMS)\n const kernel = getBrepApi()\n const w = brepHandleOf(wire)\n const c = (center ?? [0, 0, 0]) as Vec3\n const n = (normal ?? [0, 0, 0]) as Vec3\n\n if (vecLength(n) < 1e-10) {\n return err(validationError('ZERO_LENGTH_EXTRUSION', 'Extrusion vector cannot have zero length'))\n }\n if (profile !== undefined && profile !== null) {\n return err(\n validationError(\n 'COMPLEX_EXTRUDE_LAW_UNSUPPORTED',\n 'complexExtrude ExtrusionProfile scaling law is not supported after selfhosting',\n ),\n )\n }\n const endPoint: Vec3 = [c[0] + n[0], c[1] + n[1], c[2] + n[2]]\n const spine = makeSpineWire(kernel, c, endPoint)\n try {\n const h = getOcctKernel().sweepPipeShell(w as never, spine as never, false, false) as unknown as BrepHandle\n return ok(h)\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n return err(kernelError('SWEEP_FAILED', `complexExtrude sweep failed: ${raw}`, e))\n } finally {\n kernel.release(spine)\n }\n}\n\n// ---------------------------------------------------------------------------\n// twistExtrude — wire 沿螺旋挤出(brepjs sweepFns.ts#twistExtrude)\n// ---------------------------------------------------------------------------\n\n/**\n * Extrude a wire along a helical path (brepjs sweepFns.ts#twistExtrude).\n *\n * @param args - Resolved arguments (wire, angleDegrees, center, normal, profile).\n * @returns The twisted extrusion as a `BrepHandle`.\n */\nexport function twistExtrudeBrep(...args: unknown[]): Result<BrepHandle> {\n const [wire, angleDegrees, center, normal, profile] = resolveArgs(args, TWIST_EXTRUDE_PARAMS)\n const kernel = getBrepApi()\n const w = brepHandleOf(wire)\n const angle = Number(angleDegrees)\n const c = (center ?? [0, 0, 0]) as Vec3\n const n = (normal ?? [0, 0, 0]) as Vec3\n\n if (Math.abs(angle) < 1e-10) {\n return err(validationError('ZERO_TWIST_ANGLE', 'Twist angle cannot be zero'))\n }\n if (angle < 0) {\n return err(\n validationError(\n 'TWIST_NEGATIVE_ANGLE_UNSUPPORTED',\n 'twistExtrude negative angle (left-handed helix) is not supported after selfhosting (occt-wasm makeHelixWire has no handedness param)',\n ),\n )\n }\n if (vecLength(n) < 1e-10) {\n return err(validationError('ZERO_LENGTH_EXTRUSION', 'Extrusion vector cannot have zero length'))\n }\n if (profile !== undefined && profile !== null) {\n return err(\n validationError(\n 'TWIST_EXTRUDE_LAW_UNSUPPORTED',\n 'twistExtrude ExtrusionProfile scaling law is not supported after selfhosting',\n ),\n )\n }\n const extrusionLength = vecLength(n)\n const pitch = (360.0 / Math.abs(angle)) * extrusionLength\n // brepjs 语义:主 spine=直线、auxiliary=helix,sweepPipeShell 传对象参数\n // (occt-wasm 运行时接受 auxiliary 键;d.ts 窄签名用 as never 绕过)\n const endPointTwist: Vec3 = [c[0] + n[0], c[1] + n[1], c[2] + n[2]]\n const spine = makeSpineWire(kernel, c, endPointTwist)\n const axisDir = vecLength(n) > 1e-12 ? [n[0] / vecLength(n), n[1] / vecLength(n), n[2] / vecLength(n)] : [0, 0, 1]\n try {\n const helix = getOcctKernel().makeHelixWire(\n { x: c[0], y: c[1], z: c[2] },\n { x: axisDir[0], y: axisDir[1], z: axisDir[2] },\n pitch,\n extrusionLength,\n 1,\n )\n const h = getOcctKernel().sweepPipeShell(w as never, spine as never, { auxiliary: helix } as never) as unknown as BrepHandle\n getOcctKernel().release(helix as never)\n kernel.release(spine)\n return ok(h)\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n return err(kernelError('SWEEP_FAILED', `twistExtrude sweep failed: ${raw}`, e))\n }\n}\n"]}
@@ -73,7 +73,7 @@ export declare function threadBrep(kernel: BrepEngineApi, options: ThreadOptions
73
73
  import { type Result } from '../../result/result.js';
74
74
  /**
75
75
  * compat-op wrapper: thread(options) → Result<BrepHandle>.
76
- * Converges on core threadBrep (§5.4: vendored compat op and core version merged into one).
76
+ * Converges on core threadBrep (§5.4: brepjs compat op and core version merged into one).
77
77
  * threadBrep internal validation throws are caught as Result err (codes THREAD_INVALID_ARGS / THREAD_FAILED).
78
78
  *
79
79
  * @param args - Resolved arguments (thread options).
@@ -114,7 +114,7 @@ import { validationError, kernelError } from '../../result/errors.js';
114
114
  const THREAD_PARAMS = { name: 'thread', params: ['options'], formClass: 'B1' };
115
115
  /**
116
116
  * compat-op wrapper: thread(options) → Result<BrepHandle>.
117
- * Converges on core threadBrep (§5.4: vendored compat op and core version merged into one).
117
+ * Converges on core threadBrep (§5.4: brepjs compat op and core version merged into one).
118
118
  * threadBrep internal validation throws are caught as Result err (codes THREAD_INVALID_ARGS / THREAD_FAILED).
119
119
  *
120
120
  * @param args - Resolved arguments (thread options).
@@ -1 +1 @@
1
- {"version":3,"file":"threadFns.js","sourceRoot":"","sources":["../../../src/api/brep-mirror/threadFns.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Functional thread operation — builds a helical screw thread.\n *\n * @platform occt — 本文件 import occt-kernel:螺纹用 `loft`\n * (BRepOffsetAPI_ThruSections)构造,loft 是 occt-only(L1 无,engine-method-map\n * `loft` → occt-only)。守卫①要求平台 import 自证身份;调用方 op(screw)声明\n * `engines: ['occt']`(D11)。\n *\n * 适配自 brepjs `src/operations/threadFns.ts`。\n * 保留文件名和核心算法,适配本项目的 occt-wasm API。\n *\n * occt-wasm 的 `BRepOffsetAPI_MakePipeShell` (sweep) 无法可靠地沿螺旋线扫掠截面,\n * 因此螺纹用 loft(`BRepOffsetAPI_ThruSections`)穿过一系列旋转的齿截面构造。\n * 结果是螺旋螺纹的 *ridge* — 外螺纹 fuse 到螺杆,内螺纹 cut 从孔中减去。\n *\n * 与 brepjs 的差异:\n * - brepjs 用 BlueprintSketcher + line() + wire() 构造截面 → 本项目直接用 kernel.makeLineEdge + kernel.makeWire\n * - brepjs 用 loft() 函数 → 本项目直接用 kernel.loft(wires, isSolid, ruled)\n * - brepjs 用 DisposalScope 管理中间句柄 → 本项目手动 kernel.release\n * - brepjs 用 Result 类型 → 本项目抛出异常\n */\n\nimport type { BrepHandle } from '../../brep/engine/types'\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport { getOcctKernel, type ShapeHandle } from '../../occt-kernel/occtKernel'\nimport { getBrepApi } from '../../brep/handle-bridge'\n\n/** 螺纹配置参数。单位 mm,角度由螺距推导。 */\nexport interface ThreadOptions {\n /** 核心半径(外螺纹)或名义孔半径(内螺纹),在螺纹根部 */\n radius: number\n /** 每圈轴向距离(螺距) */\n pitch: number\n /** 螺纹总长(沿轴)。圈数 = height / pitch */\n height: number\n /** 径向螺纹高度(齿顶 - 齿根)。默认 0.6 * pitch(≈ISO 60° V 型) */\n depth?: number\n /** 齿根处轴向半宽。默认 0.42 * pitch */\n toothHalfWidth?: number\n /**\n * flat 顶宽,给出梯形齿而非尖 V 型。\n * 0(默认)= 尖 V(ISO/UN);正值 = 梯形齿(Acme/square)。\n * 必须 < toothHalfWidth。\n */\n crest?: number\n /** 每圈截面数 — 越高越平滑但越慢。默认 20 */\n sectionsPerTurn?: number\n /** 左旋。默认 false(右旋) */\n lefthand?: boolean\n /** 齿尖朝向轴心(内螺纹用 cut 从孔中减去时) */\n inward?: boolean\n}\n\n/**\n * 通过 loft 旋转齿截面构建螺旋螺纹 ridge。\n *\n * @param kernel OCCT 内核\n * @param options 螺纹配置\n * @returns 螺纹 ridge solid(BrepHandle)\n *\n * @example 外螺纹(Ø12 螺杆,2.5mm 螺距):\n * ```ts\n * const ridge = threadBrep(kernel, { radius: 6, pitch: 2.5, height: 7.5 })\n * const rod = kernel.makeCylinder(6.15, 7.5)\n * const result = kernel.fuse(rod, ridge)\n * kernel.release(rod)\n * kernel.release(ridge)\n * ```\n *\n * @example 内螺纹(攻丝 Ø6 孔):\n * ```ts\n * const ridge = threadBrep(kernel, { radius: 3, pitch: 1, height: 6, inward: true })\n * const result = kernel.cut(boredBlock, ridge)\n * kernel.release(ridge)\n * ```\n */\nexport function threadBrep(\n kernel: BrepEngineApi,\n options: ThreadOptions,\n): BrepHandle {\n const {\n radius,\n pitch,\n height,\n depth = 0.6 * pitch,\n toothHalfWidth = 0.42 * pitch,\n crest = 0,\n sectionsPerTurn = 12,\n lefthand = false,\n inward = false,\n } = options\n\n // 参数校验\n if (!(radius > 0)) throw new Error('[threadBrep] radius must be > 0')\n if (!(pitch > 0)) throw new Error('[threadBrep] pitch must be > 0')\n if (!(height > 0)) throw new Error('[threadBrep] height must be > 0')\n if (!(depth > 0)) throw new Error('[threadBrep] depth must be > 0')\n if (crest < 0 || crest >= toothHalfWidth) {\n throw new Error('[threadBrep] crest must be >= 0 and < toothHalfWidth')\n }\n if (sectionsPerTurn < 3) {\n throw new Error('[threadBrep] sectionsPerTurn must be >= 3')\n }\n\n const turns = height / pitch\n const nSec = Math.max(2, Math.round(turns * sectionsPerTurn))\n const sign = lefthand ? -1 : 1\n const apexU = inward ? -depth : depth // 齿顶:外螺纹朝外,内螺纹朝内\n const baseU = inward ? 0.3 : -0.3 // 齿根:略微嵌入配合实体以保证布尔干净\n const a = toothHalfWidth\n\n // 构建截面序列\n const sections: BrepHandle[] = []\n const intermediateEdges: BrepHandle[] = []\n\n for (let i = 0; i <= nSec; i++) {\n const th = (sign * i * 2 * Math.PI) / sectionsPerTurn\n const z = (pitch * Math.abs(th)) / (2 * Math.PI)\n const cx = radius * Math.cos(th)\n const cy = radius * Math.sin(th)\n const rx = Math.cos(th)\n const ry = Math.sin(th)\n\n // 点生成函数:u = 径向偏移,v = 轴向偏移\n const pt = (u: number, v: number) => ({\n x: cx + u * rx,\n y: cy + u * ry,\n z: z + v,\n })\n\n // V 型齿(crest=0)通过单个顶点闭合;梯形齿(crest>0)给出平顶\n const profile = crest > 0\n ? [pt(baseU, -a), pt(apexU, -crest), pt(apexU, crest), pt(baseU, a)]\n : [pt(baseU, -a), pt(apexU, 0), pt(baseU, a)]\n\n // 构建边\n const edges: BrepHandle[] = []\n for (let k = 0; k < profile.length; k++) {\n const edge = kernel.makeLineEdge(profile[k], profile[(k + 1) % profile.length])\n edges.push(edge)\n intermediateEdges.push(edge)\n }\n\n // 构建 wire\n const wire = kernel.makeWire(edges)\n sections.push(wire)\n }\n\n // Loft(occt-only 平台面,D3)。BrepHandle(branded number)与 occt-wasm\n // ShapeHandle 运行时同构,品牌转换只发生在平台边界。\n const thread = getOcctKernel().loft(sections as unknown as ShapeHandle[], true, true)\n\n // 释放中间句柄\n for (const w of sections) kernel.release(w)\n for (const e of intermediateEdges) kernel.release(e)\n\n return thread as unknown as BrepHandle\n}\n\n\n/**\n * compat-op 包装:thread(options) → Result<BrepHandle>。\n * 收敛以 core threadBrep 为准(§5.4:vendored compat op 与 core 版两份收敛为一处)。\n * threadBrep 内部校验抛异常 → 捕获为 Result err(错误码 THREAD_INVALID_ARGS / THREAD_FAILED)。\n */\n\nimport type { FormClass } from '../internal/dual-form-args'\nimport { resolveArgs } from '../internal/dual-form-args'\nimport { ok, err, type Result } from '../../result/result'\nimport { validationError, kernelError } from '../../result/errors'\n\nconst THREAD_PARAMS = { name: 'thread', params: ['options'], formClass: 'B1' as FormClass }\n\n/**\n * compat-op wrapper: thread(options) → Result<BrepHandle>.\n * Converges on core threadBrep (§5.4: vendored compat op and core version merged into one).\n * threadBrep internal validation throws are caught as Result err (codes THREAD_INVALID_ARGS / THREAD_FAILED).\n *\n * @param args - Resolved arguments (thread options).\n * @returns The generated thread solid as a `BrepHandle`.\n */\nexport function threadBrepOp(...args: unknown[]): Result<BrepHandle> {\n const [options] = resolveArgs(args, THREAD_PARAMS)\n const kernel = getBrepApi()\n try {\n const h = threadBrep(kernel, options as ThreadOptions)\n return ok(h)\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n if (raw.startsWith('[threadBrep]')) {\n return err(validationError('THREAD_INVALID_ARGS', raw))\n }\n return err(kernelError('THREAD_FAILED', `Thread generation failed: ${raw}`, e))\n }\n}\n"]}
1
+ {"version":3,"file":"threadFns.js","sourceRoot":"","sources":["../../../src/api/brep-mirror/threadFns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,EAAE,aAAa,EAAoB,MAAM,8BAA8B,CAAA;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AA4BrD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,UAAU,CACxB,MAAqB,EACrB,OAAsB;IAEtB,MAAM,EACJ,MAAM,EACN,KAAK,EACL,MAAM,EACN,KAAK,GAAG,GAAG,GAAG,KAAK,EACnB,cAAc,GAAG,IAAI,GAAG,KAAK,EAC7B,KAAK,GAAG,CAAC,EACT,eAAe,GAAG,EAAE,EACpB,QAAQ,GAAG,KAAK,EAChB,MAAM,GAAG,KAAK,GACf,GAAG,OAAO,CAAA;IAEX,OAAO;IACP,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACrE,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnE,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACrE,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnE,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,cAAc,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IACzE,CAAC;IACD,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAC9D,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,GAAG,KAAK,CAAA;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC,CAAA;IAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA,CAAC,iBAAiB;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA,CAAC,qBAAqB;IACvD,MAAM,CAAC,GAAG,cAAc,CAAA;IAExB,SAAS;IACT,MAAM,QAAQ,GAAiB,EAAE,CAAA;IACjC,MAAM,iBAAiB,GAAiB,EAAE,CAAA;IAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,eAAe,CAAA;QACrD,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;QAChD,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAChC,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAEvB,0BAA0B;QAC1B,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC;YACpC,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE;YACd,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE;YACd,CAAC,EAAE,CAAC,GAAG,CAAC;SACT,CAAC,CAAA;QAEF,yCAAyC;QACzC,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC;YACvB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;QAE/C,MAAM;QACN,MAAM,KAAK,GAAiB,EAAE,CAAA;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;YAC/E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;QAED,UAAU;QACV,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACnC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IAED,+DAA+D;IAC/D,kCAAkC;IAClC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,QAAoC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAErF,SAAS;IACT,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAC3C,KAAK,MAAM,CAAC,IAAI,iBAAiB;QAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAEpD,OAAO,MAA+B,CAAA;AACxC,CAAC;AAUD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,EAAE,EAAE,GAAG,EAAe,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAElE,MAAM,aAAa,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAiB,EAAE,CAAA;AAE3F;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,GAAG,IAAe;IAC7C,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IAClD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,OAAwB,CAAC,CAAA;QACtD,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACtD,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,OAAO,GAAG,CAAC,eAAe,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC,CAAA;QACzD,CAAC;QACD,OAAO,GAAG,CAAC,WAAW,CAAC,eAAe,EAAE,6BAA6B,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IACjF,CAAC;AACH,CAAC","sourcesContent":["/**\n * Functional thread operation — builds a helical screw thread.\n *\n * @platform occt — 本文件 import occt-kernel:螺纹用 `loft`\n * (BRepOffsetAPI_ThruSections)构造,loft 是 occt-only(L1 无,engine-method-map\n * `loft` → occt-only)。守卫①要求平台 import 自证身份;调用方 op(screw)声明\n * `engines: ['occt']`(D11)。\n *\n * 适配自 brepjs `src/operations/threadFns.ts`。\n * 保留文件名和核心算法,适配本项目的 occt-wasm API。\n *\n * occt-wasm 的 `BRepOffsetAPI_MakePipeShell` (sweep) 无法可靠地沿螺旋线扫掠截面,\n * 因此螺纹用 loft(`BRepOffsetAPI_ThruSections`)穿过一系列旋转的齿截面构造。\n * 结果是螺旋螺纹的 *ridge* — 外螺纹 fuse 到螺杆,内螺纹 cut 从孔中减去。\n *\n * 与 brepjs 的差异:\n * - brepjs 用 BlueprintSketcher + line() + wire() 构造截面 → 本项目直接用 kernel.makeLineEdge + kernel.makeWire\n * - brepjs 用 loft() 函数 → 本项目直接用 kernel.loft(wires, isSolid, ruled)\n * - brepjs 用 DisposalScope 管理中间句柄 → 本项目手动 kernel.release\n * - brepjs 用 Result 类型 → 本项目抛出异常\n */\n\nimport type { BrepHandle } from '../../brep/engine/types'\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport { getOcctKernel, type ShapeHandle } from '../../occt-kernel/occtKernel'\nimport { getBrepApi } from '../../brep/handle-bridge'\n\n/** 螺纹配置参数。单位 mm,角度由螺距推导。 */\nexport interface ThreadOptions {\n /** 核心半径(外螺纹)或名义孔半径(内螺纹),在螺纹根部 */\n radius: number\n /** 每圈轴向距离(螺距) */\n pitch: number\n /** 螺纹总长(沿轴)。圈数 = height / pitch */\n height: number\n /** 径向螺纹高度(齿顶 - 齿根)。默认 0.6 * pitch(≈ISO 60° V 型) */\n depth?: number\n /** 齿根处轴向半宽。默认 0.42 * pitch */\n toothHalfWidth?: number\n /**\n * flat 顶宽,给出梯形齿而非尖 V 型。\n * 0(默认)= 尖 V(ISO/UN);正值 = 梯形齿(Acme/square)。\n * 必须 < toothHalfWidth。\n */\n crest?: number\n /** 每圈截面数 — 越高越平滑但越慢。默认 20 */\n sectionsPerTurn?: number\n /** 左旋。默认 false(右旋) */\n lefthand?: boolean\n /** 齿尖朝向轴心(内螺纹用 cut 从孔中减去时) */\n inward?: boolean\n}\n\n/**\n * 通过 loft 旋转齿截面构建螺旋螺纹 ridge。\n *\n * @param kernel OCCT 内核\n * @param options 螺纹配置\n * @returns 螺纹 ridge solid(BrepHandle)\n *\n * @example 外螺纹(Ø12 螺杆,2.5mm 螺距):\n * ```ts\n * const ridge = threadBrep(kernel, { radius: 6, pitch: 2.5, height: 7.5 })\n * const rod = kernel.makeCylinder(6.15, 7.5)\n * const result = kernel.fuse(rod, ridge)\n * kernel.release(rod)\n * kernel.release(ridge)\n * ```\n *\n * @example 内螺纹(攻丝 Ø6 孔):\n * ```ts\n * const ridge = threadBrep(kernel, { radius: 3, pitch: 1, height: 6, inward: true })\n * const result = kernel.cut(boredBlock, ridge)\n * kernel.release(ridge)\n * ```\n */\nexport function threadBrep(\n kernel: BrepEngineApi,\n options: ThreadOptions,\n): BrepHandle {\n const {\n radius,\n pitch,\n height,\n depth = 0.6 * pitch,\n toothHalfWidth = 0.42 * pitch,\n crest = 0,\n sectionsPerTurn = 12,\n lefthand = false,\n inward = false,\n } = options\n\n // 参数校验\n if (!(radius > 0)) throw new Error('[threadBrep] radius must be > 0')\n if (!(pitch > 0)) throw new Error('[threadBrep] pitch must be > 0')\n if (!(height > 0)) throw new Error('[threadBrep] height must be > 0')\n if (!(depth > 0)) throw new Error('[threadBrep] depth must be > 0')\n if (crest < 0 || crest >= toothHalfWidth) {\n throw new Error('[threadBrep] crest must be >= 0 and < toothHalfWidth')\n }\n if (sectionsPerTurn < 3) {\n throw new Error('[threadBrep] sectionsPerTurn must be >= 3')\n }\n\n const turns = height / pitch\n const nSec = Math.max(2, Math.round(turns * sectionsPerTurn))\n const sign = lefthand ? -1 : 1\n const apexU = inward ? -depth : depth // 齿顶:外螺纹朝外,内螺纹朝内\n const baseU = inward ? 0.3 : -0.3 // 齿根:略微嵌入配合实体以保证布尔干净\n const a = toothHalfWidth\n\n // 构建截面序列\n const sections: BrepHandle[] = []\n const intermediateEdges: BrepHandle[] = []\n\n for (let i = 0; i <= nSec; i++) {\n const th = (sign * i * 2 * Math.PI) / sectionsPerTurn\n const z = (pitch * Math.abs(th)) / (2 * Math.PI)\n const cx = radius * Math.cos(th)\n const cy = radius * Math.sin(th)\n const rx = Math.cos(th)\n const ry = Math.sin(th)\n\n // 点生成函数:u = 径向偏移,v = 轴向偏移\n const pt = (u: number, v: number) => ({\n x: cx + u * rx,\n y: cy + u * ry,\n z: z + v,\n })\n\n // V 型齿(crest=0)通过单个顶点闭合;梯形齿(crest>0)给出平顶\n const profile = crest > 0\n ? [pt(baseU, -a), pt(apexU, -crest), pt(apexU, crest), pt(baseU, a)]\n : [pt(baseU, -a), pt(apexU, 0), pt(baseU, a)]\n\n // 构建边\n const edges: BrepHandle[] = []\n for (let k = 0; k < profile.length; k++) {\n const edge = kernel.makeLineEdge(profile[k], profile[(k + 1) % profile.length])\n edges.push(edge)\n intermediateEdges.push(edge)\n }\n\n // 构建 wire\n const wire = kernel.makeWire(edges)\n sections.push(wire)\n }\n\n // Loft(occt-only 平台面,D3)。BrepHandle(branded number)与 occt-wasm\n // ShapeHandle 运行时同构,品牌转换只发生在平台边界。\n const thread = getOcctKernel().loft(sections as unknown as ShapeHandle[], true, true)\n\n // 释放中间句柄\n for (const w of sections) kernel.release(w)\n for (const e of intermediateEdges) kernel.release(e)\n\n return thread as unknown as BrepHandle\n}\n\n\n/**\n * compat-op 包装:thread(options) → Result<BrepHandle>。\n * 收敛以 core threadBrep 为准(§5.4:brepjs compat op 与 core 版两份收敛为一处)。\n * threadBrep 内部校验抛异常 → 捕获为 Result err(错误码 THREAD_INVALID_ARGS / THREAD_FAILED)。\n */\n\nimport type { FormClass } from '../internal/dual-form-args'\nimport { resolveArgs } from '../internal/dual-form-args'\nimport { ok, err, type Result } from '../../result/result'\nimport { validationError, kernelError } from '../../result/errors'\n\nconst THREAD_PARAMS = { name: 'thread', params: ['options'], formClass: 'B1' as FormClass }\n\n/**\n * compat-op wrapper: thread(options) → Result<BrepHandle>.\n * Converges on core threadBrep (§5.4: brepjs compat op and core version merged into one).\n * threadBrep internal validation throws are caught as Result err (codes THREAD_INVALID_ARGS / THREAD_FAILED).\n *\n * @param args - Resolved arguments (thread options).\n * @returns The generated thread solid as a `BrepHandle`.\n */\nexport function threadBrepOp(...args: unknown[]): Result<BrepHandle> {\n const [options] = resolveArgs(args, THREAD_PARAMS)\n const kernel = getBrepApi()\n try {\n const h = threadBrep(kernel, options as ThreadOptions)\n return ok(h)\n } catch (e) {\n const raw = e instanceof Error ? e.message : String(e)\n if (raw.startsWith('[threadBrep]')) {\n return err(validationError('THREAD_INVALID_ARGS', raw))\n }\n return err(kernelError('THREAD_FAILED', `Thread generation failed: ${raw}`, e))\n }\n}\n"]}