@faicad/faijs 0.29.3 → 0.30.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (614) hide show
  1. package/NOTICE +6 -5
  2. package/dist/api/api-namespace.d.ts +1 -1
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +53 -1
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/appearance.d.ts +136 -0
  7. package/dist/api/appearance.d.ts.map +1 -0
  8. package/dist/api/appearance.js +228 -0
  9. package/dist/api/appearance.js.map +1 -0
  10. package/dist/api/assembly/entities.d.ts +1 -1
  11. package/dist/api/assembly/entities.js +1 -1
  12. package/dist/api/assembly/entities.js.map +1 -1
  13. package/dist/api/assembly/index.d.ts +1 -1
  14. package/dist/api/assembly/index.js +1 -1
  15. package/dist/api/assembly/index.js.map +1 -1
  16. package/dist/api/assembly/joints.d.ts +33 -15
  17. package/dist/api/assembly/joints.d.ts.map +1 -1
  18. package/dist/api/assembly/joints.js +31 -13
  19. package/dist/api/assembly/joints.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.js +1 -1
  22. package/dist/api/assembly/preview.js.map +1 -1
  23. package/dist/api/assembly/solve.d.ts +1 -1
  24. package/dist/api/assembly/solve.js +1 -1
  25. package/dist/api/assembly/solve.js.map +1 -1
  26. package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.js +1 -1
  28. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  29. package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
  30. package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
  31. package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
  32. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  33. package/dist/api/assembly/solvers/global-solver.js +3 -4
  34. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  35. package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
  36. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
  37. package/dist/api/assembly/solvers/linalg.d.ts +2 -2
  38. package/dist/api/assembly/solvers/linalg.js +2 -2
  39. package/dist/api/assembly/solvers/linalg.js.map +1 -1
  40. package/dist/api/assembly/solvers/types.d.ts +2 -5
  41. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  42. package/dist/api/assembly/solvers/types.js +1 -4
  43. package/dist/api/assembly/solvers/types.js.map +1 -1
  44. package/dist/api/boolean.d.ts.map +1 -1
  45. package/dist/api/boolean.js +7 -6
  46. package/dist/api/boolean.js.map +1 -1
  47. package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
  48. package/dist/api/brep-mirror/booleanFns.js +5 -5
  49. package/dist/api/brep-mirror/booleanFns.js.map +1 -1
  50. package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
  51. package/dist/api/brep-mirror/compoundFns.js +4 -4
  52. package/dist/api/brep-mirror/compoundFns.js.map +1 -1
  53. package/dist/api/brep-mirror/healingFns.d.ts +4 -4
  54. package/dist/api/brep-mirror/healingFns.js +4 -4
  55. package/dist/api/brep-mirror/healingFns.js.map +1 -1
  56. package/dist/api/brep-mirror/hullFns.d.ts +2 -2
  57. package/dist/api/brep-mirror/hullFns.js +2 -2
  58. package/dist/api/brep-mirror/hullFns.js.map +1 -1
  59. package/dist/api/brep-mirror/patternFns.d.ts +5 -5
  60. package/dist/api/brep-mirror/patternFns.js +10 -10
  61. package/dist/api/brep-mirror/patternFns.js.map +1 -1
  62. package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
  63. package/dist/api/brep-mirror/primitiveFns.js +4 -4
  64. package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
  65. package/dist/api/brep-mirror/roofFns.d.ts +3 -3
  66. package/dist/api/brep-mirror/roofFns.js +7 -7
  67. package/dist/api/brep-mirror/roofFns.js.map +1 -1
  68. package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
  69. package/dist/api/brep-mirror/sweepFns.js +14 -14
  70. package/dist/api/brep-mirror/sweepFns.js.map +1 -1
  71. package/dist/api/brep-mirror/threadFns.d.ts +1 -1
  72. package/dist/api/brep-mirror/threadFns.js +1 -1
  73. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  74. package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
  75. package/dist/api/brep-mirror/topologyFns.js +8 -8
  76. package/dist/api/brep-mirror/topologyFns.js.map +1 -1
  77. package/dist/api/brep-operations/booleanFns.d.ts +40 -0
  78. package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
  79. package/dist/api/brep-operations/booleanFns.js +104 -0
  80. package/dist/api/brep-operations/booleanFns.js.map +1 -0
  81. package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
  82. package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
  83. package/dist/api/brep-operations/brepHelpers.js +131 -0
  84. package/dist/api/brep-operations/brepHelpers.js.map +1 -0
  85. package/dist/api/brep-operations/compoundFns.d.ts +46 -0
  86. package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
  87. package/dist/api/brep-operations/compoundFns.js +299 -0
  88. package/dist/api/brep-operations/compoundFns.js.map +1 -0
  89. package/dist/api/brep-operations/healingFns.d.ts +78 -0
  90. package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
  91. package/dist/api/brep-operations/healingFns.js +294 -0
  92. package/dist/api/brep-operations/healingFns.js.map +1 -0
  93. package/dist/api/brep-operations/hullFns.d.ts +20 -0
  94. package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
  95. package/dist/api/brep-operations/hullFns.js +46 -0
  96. package/dist/api/brep-operations/hullFns.js.map +1 -0
  97. package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
  98. package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
  99. package/dist/api/brep-operations/joinery-brep.js +463 -0
  100. package/dist/api/brep-operations/joinery-brep.js.map +1 -0
  101. package/dist/api/brep-operations/patternFns.d.ts +43 -0
  102. package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
  103. package/dist/api/brep-operations/patternFns.js +178 -0
  104. package/dist/api/brep-operations/patternFns.js.map +1 -0
  105. package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
  106. package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
  107. package/dist/api/brep-operations/primitiveFns.js +104 -0
  108. package/dist/api/brep-operations/primitiveFns.js.map +1 -0
  109. package/dist/api/brep-operations/roofFns.d.ts +24 -0
  110. package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
  111. package/dist/api/brep-operations/roofFns.js +229 -0
  112. package/dist/api/brep-operations/roofFns.js.map +1 -0
  113. package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
  114. package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
  115. package/dist/api/brep-operations/straightSkeleton.js +431 -0
  116. package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
  117. package/dist/api/brep-operations/sweepFns.d.ts +60 -0
  118. package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
  119. package/dist/api/brep-operations/sweepFns.js +323 -0
  120. package/dist/api/brep-operations/sweepFns.js.map +1 -0
  121. package/dist/api/brep-operations/threadFns.d.ts +83 -0
  122. package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
  123. package/dist/api/brep-operations/threadFns.js +138 -0
  124. package/dist/api/brep-operations/threadFns.js.map +1 -0
  125. package/dist/api/brep-operations/topologyFns.d.ts +90 -0
  126. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
  127. package/dist/api/brep-operations/topologyFns.js +276 -0
  128. package/dist/api/brep-operations/topologyFns.js.map +1 -0
  129. package/dist/api/brep-topology.d.ts +1 -1
  130. package/dist/api/brep-topology.d.ts.map +1 -1
  131. package/dist/api/brep-topology.js +1 -1
  132. package/dist/api/brep-topology.js.map +1 -1
  133. package/dist/api/brepjs-compat/index.d.ts +1 -1
  134. package/dist/api/brepjs-compat/index.js +3 -3
  135. package/dist/api/brepjs-compat/index.js.map +1 -1
  136. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
  137. package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
  138. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
  139. package/dist/api/curve-sketch/index.d.ts +235 -0
  140. package/dist/api/curve-sketch/index.d.ts.map +1 -0
  141. package/dist/api/curve-sketch/index.js +487 -0
  142. package/dist/api/curve-sketch/index.js.map +1 -0
  143. package/dist/api/engrave.d.ts.map +1 -1
  144. package/dist/api/engrave.js +3 -2
  145. package/dist/api/engrave.js.map +1 -1
  146. package/dist/api/export-brep.d.ts +41 -0
  147. package/dist/api/export-brep.d.ts.map +1 -0
  148. package/dist/api/export-brep.js +58 -0
  149. package/dist/api/export-brep.js.map +1 -0
  150. package/dist/api/export-stl.d.ts +50 -0
  151. package/dist/api/export-stl.d.ts.map +1 -0
  152. package/dist/api/export-stl.js +99 -0
  153. package/dist/api/export-stl.js.map +1 -0
  154. package/dist/api/extrude.d.ts +8 -11
  155. package/dist/api/extrude.d.ts.map +1 -1
  156. package/dist/api/extrude.js +11 -14
  157. package/dist/api/extrude.js.map +1 -1
  158. package/dist/api/fillet-variable.d.ts +2 -2
  159. package/dist/api/fillet-variable.js +2 -2
  160. package/dist/api/fillet-variable.js.map +1 -1
  161. package/dist/api/fillet.d.ts +2 -4
  162. package/dist/api/fillet.d.ts.map +1 -1
  163. package/dist/api/fillet.js +2 -4
  164. package/dist/api/fillet.js.map +1 -1
  165. package/dist/api/generated/2d.d.ts +4 -0
  166. package/dist/api/generated/2d.d.ts.map +1 -1
  167. package/dist/api/generated/2d.js +4 -0
  168. package/dist/api/generated/2d.js.map +1 -1
  169. package/dist/api/generated/core.d.ts +4 -0
  170. package/dist/api/generated/core.d.ts.map +1 -1
  171. package/dist/api/generated/core.js +4 -0
  172. package/dist/api/generated/core.js.map +1 -1
  173. package/dist/api/generated/gear.d.ts +4 -0
  174. package/dist/api/generated/gear.d.ts.map +1 -1
  175. package/dist/api/generated/gear.js +4 -0
  176. package/dist/api/generated/gear.js.map +1 -1
  177. package/dist/api/generated/io.d.ts +4 -0
  178. package/dist/api/generated/io.d.ts.map +1 -1
  179. package/dist/api/generated/io.js +4 -0
  180. package/dist/api/generated/io.js.map +1 -1
  181. package/dist/api/generated/kernel.d.ts +4 -0
  182. package/dist/api/generated/kernel.d.ts.map +1 -1
  183. package/dist/api/generated/kernel.js +4 -0
  184. package/dist/api/generated/kernel.js.map +1 -1
  185. package/dist/api/generated/measurement.d.ts +21 -21
  186. package/dist/api/generated/measurement.d.ts.map +1 -1
  187. package/dist/api/generated/measurement.js +25 -21
  188. package/dist/api/generated/measurement.js.map +1 -1
  189. package/dist/api/generated/ns.d.ts +4 -0
  190. package/dist/api/generated/ns.d.ts.map +1 -1
  191. package/dist/api/generated/ns.js +4 -0
  192. package/dist/api/generated/ns.js.map +1 -1
  193. package/dist/api/generated/operations.d.ts +32 -32
  194. package/dist/api/generated/operations.d.ts.map +1 -1
  195. package/dist/api/generated/operations.js +52 -48
  196. package/dist/api/generated/operations.js.map +1 -1
  197. package/dist/api/generated/projection.d.ts +4 -0
  198. package/dist/api/generated/projection.d.ts.map +1 -1
  199. package/dist/api/generated/projection.js +4 -0
  200. package/dist/api/generated/projection.js.map +1 -1
  201. package/dist/api/generated/query.d.ts +4 -0
  202. package/dist/api/generated/query.d.ts.map +1 -1
  203. package/dist/api/generated/query.js +4 -0
  204. package/dist/api/generated/query.js.map +1 -1
  205. package/dist/api/generated/sketching.d.ts +2 -2
  206. package/dist/api/generated/sketching.d.ts.map +1 -1
  207. package/dist/api/generated/sketching.js +7 -3
  208. package/dist/api/generated/sketching.js.map +1 -1
  209. package/dist/api/generated/text.d.ts +4 -0
  210. package/dist/api/generated/text.d.ts.map +1 -1
  211. package/dist/api/generated/text.js +4 -0
  212. package/dist/api/generated/text.js.map +1 -1
  213. package/dist/api/generated/topology.d.ts +45 -45
  214. package/dist/api/generated/topology.d.ts.map +1 -1
  215. package/dist/api/generated/topology.js +67 -63
  216. package/dist/api/generated/topology.js.map +1 -1
  217. package/dist/api/generated/view.d.ts +4 -0
  218. package/dist/api/generated/view.d.ts.map +1 -1
  219. package/dist/api/generated/view.js +4 -0
  220. package/dist/api/generated/view.js.map +1 -1
  221. package/dist/api/geom-types/constants.d.ts +11 -0
  222. package/dist/api/geom-types/constants.d.ts.map +1 -0
  223. package/dist/api/geom-types/constants.js +11 -0
  224. package/dist/api/geom-types/constants.js.map +1 -0
  225. package/dist/api/geom-types/index.d.ts +21 -0
  226. package/dist/api/geom-types/index.d.ts.map +1 -0
  227. package/dist/api/geom-types/index.js +22 -0
  228. package/dist/api/geom-types/index.js.map +1 -0
  229. package/dist/api/geom-types/planeOps.d.ts +98 -0
  230. package/dist/api/geom-types/planeOps.d.ts.map +1 -0
  231. package/dist/api/geom-types/planeOps.js +170 -0
  232. package/dist/api/geom-types/planeOps.js.map +1 -0
  233. package/dist/api/geom-types/planeTypes.d.ts +24 -0
  234. package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
  235. package/dist/api/geom-types/planeTypes.js +8 -0
  236. package/dist/api/geom-types/planeTypes.js.map +1 -0
  237. package/dist/api/geom-types/types.d.ts +64 -0
  238. package/dist/api/geom-types/types.d.ts.map +1 -0
  239. package/dist/api/geom-types/types.js +48 -0
  240. package/dist/api/geom-types/types.js.map +1 -0
  241. package/dist/api/geom-types/vecOps.d.ts +124 -0
  242. package/dist/api/geom-types/vecOps.d.ts.map +1 -0
  243. package/dist/api/geom-types/vecOps.js +202 -0
  244. package/dist/api/geom-types/vecOps.js.map +1 -0
  245. package/dist/api/geom.d.ts.map +1 -1
  246. package/dist/api/geom.js +6 -5
  247. package/dist/api/geom.js.map +1 -1
  248. package/dist/api/half-space.d.ts +56 -0
  249. package/dist/api/half-space.d.ts.map +1 -0
  250. package/dist/api/half-space.js +82 -0
  251. package/dist/api/half-space.js.map +1 -0
  252. package/dist/api/helix.d.ts +10 -1
  253. package/dist/api/helix.d.ts.map +1 -1
  254. package/dist/api/helix.js +19 -3
  255. package/dist/api/helix.js.map +1 -1
  256. package/dist/api/import-step.d.ts.map +1 -1
  257. package/dist/api/import-step.js +28 -0
  258. package/dist/api/import-step.js.map +1 -1
  259. package/dist/api/index.d.ts +19 -6
  260. package/dist/api/index.d.ts.map +1 -1
  261. package/dist/api/index.js +31 -8
  262. package/dist/api/index.js.map +1 -1
  263. package/dist/api/internal/compat-op.d.ts +4 -30
  264. package/dist/api/internal/compat-op.d.ts.map +1 -1
  265. package/dist/api/internal/compat-op.js +10 -42
  266. package/dist/api/internal/compat-op.js.map +1 -1
  267. package/dist/api/internal/compat-projection.d.ts +5 -5
  268. package/dist/api/internal/compat-projection.js +5 -5
  269. package/dist/api/internal/compat-projection.js.map +1 -1
  270. package/dist/api/internal/dual-form-args.d.ts +0 -2
  271. package/dist/api/internal/dual-form-args.d.ts.map +1 -1
  272. package/dist/api/internal/dual-form-args.js +1 -3
  273. package/dist/api/internal/dual-form-args.js.map +1 -1
  274. package/dist/api/internal/l3-bridge.d.ts +5 -37
  275. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  276. package/dist/api/internal/l3-bridge.js +7 -76
  277. package/dist/api/internal/l3-bridge.js.map +1 -1
  278. package/dist/api/internal/profile-wire.d.ts +1 -1
  279. package/dist/api/internal/profile-wire.js +1 -1
  280. package/dist/api/internal/profile-wire.js.map +1 -1
  281. package/dist/api/internal/result-unwrap.d.ts +4 -6
  282. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  283. package/dist/api/internal/result-unwrap.js +4 -6
  284. package/dist/api/internal/result-unwrap.js.map +1 -1
  285. package/dist/api/knurl.d.ts.map +1 -1
  286. package/dist/api/knurl.js +5 -3
  287. package/dist/api/knurl.js.map +1 -1
  288. package/dist/api/loft.d.ts +2 -2
  289. package/dist/api/loft.d.ts.map +1 -1
  290. package/dist/api/loft.js +2 -2
  291. package/dist/api/loft.js.map +1 -1
  292. package/dist/api/measurement/index.d.ts +3 -3
  293. package/dist/api/measurement/index.js +3 -3
  294. package/dist/api/measurement/index.js.map +1 -1
  295. package/dist/api/meta.d.ts +91 -0
  296. package/dist/api/meta.d.ts.map +1 -0
  297. package/dist/api/meta.js +97 -0
  298. package/dist/api/meta.js.map +1 -0
  299. package/dist/api/offset2d.d.ts +49 -0
  300. package/dist/api/offset2d.d.ts.map +1 -0
  301. package/dist/api/offset2d.js +86 -0
  302. package/dist/api/offset2d.js.map +1 -0
  303. package/dist/api/pattern.js +3 -3
  304. package/dist/api/pattern.js.map +1 -1
  305. package/dist/api/primitives.d.ts.map +1 -1
  306. package/dist/api/primitives.js +124 -8
  307. package/dist/api/primitives.js.map +1 -1
  308. package/dist/api/replicate.d.ts +2 -2
  309. package/dist/api/replicate.d.ts.map +1 -1
  310. package/dist/api/replicate.js +12 -12
  311. package/dist/api/replicate.js.map +1 -1
  312. package/dist/api/result.d.ts +1 -1
  313. package/dist/api/result.js +1 -1
  314. package/dist/api/result.js.map +1 -1
  315. package/dist/api/revolve.d.ts +2 -2
  316. package/dist/api/revolve.js +3 -3
  317. package/dist/api/revolve.js.map +1 -1
  318. package/dist/api/screw.d.ts +1 -1
  319. package/dist/api/screw.d.ts.map +1 -1
  320. package/dist/api/screw.js +5 -4
  321. package/dist/api/screw.js.map +1 -1
  322. package/dist/api/sdf.d.ts.map +1 -1
  323. package/dist/api/sdf.js +3 -2
  324. package/dist/api/sdf.js.map +1 -1
  325. package/dist/api/shape-type/index.d.ts +141 -0
  326. package/dist/api/shape-type/index.d.ts.map +1 -0
  327. package/dist/api/shape-type/index.js +182 -0
  328. package/dist/api/shape-type/index.js.map +1 -0
  329. package/dist/api/shell.d.ts +2 -2
  330. package/dist/api/shell.js +2 -2
  331. package/dist/api/shell.js.map +1 -1
  332. package/dist/api/solid-from-faces.d.ts +45 -0
  333. package/dist/api/solid-from-faces.d.ts.map +1 -0
  334. package/dist/api/solid-from-faces.js +72 -0
  335. package/dist/api/solid-from-faces.js.map +1 -0
  336. package/dist/api/solid-offset/index.d.ts +67 -0
  337. package/dist/api/solid-offset/index.d.ts.map +1 -0
  338. package/dist/api/solid-offset/index.js +132 -0
  339. package/dist/api/solid-offset/index.js.map +1 -0
  340. package/dist/api/surface/arg-spec.d.ts +35 -33
  341. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  342. package/dist/api/surface/arg-spec.js +222 -224
  343. package/dist/api/surface/arg-spec.js.map +1 -1
  344. package/dist/api/surface-face/index.d.ts +104 -0
  345. package/dist/api/surface-face/index.d.ts.map +1 -0
  346. package/dist/api/surface-face/index.js +217 -0
  347. package/dist/api/surface-face/index.js.map +1 -0
  348. package/dist/api/surface.d.ts +44 -0
  349. package/dist/api/surface.d.ts.map +1 -0
  350. package/dist/api/surface.js +66 -0
  351. package/dist/api/surface.js.map +1 -0
  352. package/dist/api/sweep.d.ts +59 -9
  353. package/dist/api/sweep.d.ts.map +1 -1
  354. package/dist/api/sweep.js +11 -6
  355. package/dist/api/sweep.js.map +1 -1
  356. package/dist/api/thicken.d.ts +1 -1
  357. package/dist/api/thicken.js +1 -1
  358. package/dist/api/thicken.js.map +1 -1
  359. package/dist/api/transform.d.ts +5 -5
  360. package/dist/api/transform.d.ts.map +1 -1
  361. package/dist/api/transform.js +11 -10
  362. package/dist/api/transform.js.map +1 -1
  363. package/dist/api/view/cameraFns.d.ts +1 -1
  364. package/dist/api/view/cameraFns.d.ts.map +1 -1
  365. package/dist/api/view/cameraFns.js +1 -1
  366. package/dist/api/view/cameraFns.js.map +1 -1
  367. package/dist/api/view/index.d.ts +0 -2
  368. package/dist/api/view/index.d.ts.map +1 -1
  369. package/dist/api/view/index.js +0 -2
  370. package/dist/api/view/index.js.map +1 -1
  371. package/dist/api/view/projectionPlanes.d.ts +1 -1
  372. package/dist/api/view/projectionPlanes.d.ts.map +1 -1
  373. package/dist/api/view/projectionPlanes.js.map +1 -1
  374. package/dist/api/view/view-camera.d.ts +7 -9
  375. package/dist/api/view/view-camera.d.ts.map +1 -1
  376. package/dist/api/view/view-camera.js +4 -6
  377. package/dist/api/view/view-camera.js.map +1 -1
  378. package/dist/api/view/view-projection.d.ts +0 -2
  379. package/dist/api/view/view-projection.d.ts.map +1 -1
  380. package/dist/api/view/view-projection.js +0 -2
  381. package/dist/api/view/view-projection.js.map +1 -1
  382. package/dist/api/view/view-sheet.d.ts +0 -2
  383. package/dist/api/view/view-sheet.d.ts.map +1 -1
  384. package/dist/api/view/view-sheet.js +0 -2
  385. package/dist/api/view/view-sheet.js.map +1 -1
  386. package/dist/api/view-export/index.d.ts +97 -0
  387. package/dist/api/view-export/index.d.ts.map +1 -0
  388. package/dist/api/view-export/index.js +118 -0
  389. package/dist/api/view-export/index.js.map +1 -0
  390. package/dist/brep/brep-ops.d.ts +89 -1
  391. package/dist/brep/brep-ops.d.ts.map +1 -1
  392. package/dist/brep/brep-ops.js +204 -13
  393. package/dist/brep/brep-ops.js.map +1 -1
  394. package/dist/brep/brep-topology.d.ts +20 -0
  395. package/dist/brep/brep-topology.d.ts.map +1 -1
  396. package/dist/brep/brep-topology.js +46 -0
  397. package/dist/brep/brep-topology.js.map +1 -1
  398. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  399. package/dist/brep/engine/adapters/occt.js +8 -8
  400. package/dist/brep/engine/adapters/occt.js.map +1 -1
  401. package/dist/brep/engine/primitives.d.ts +2 -3
  402. package/dist/brep/engine/primitives.d.ts.map +1 -1
  403. package/dist/brep/engine/primitives.js +1 -2
  404. package/dist/brep/engine/primitives.js.map +1 -1
  405. package/dist/brep/engine/registry.d.ts +1 -1
  406. package/dist/brep/engine/registry.js +1 -1
  407. package/dist/brep/engine/registry.js.map +1 -1
  408. package/dist/brep/engine/types.d.ts +2 -2
  409. package/dist/brep/engine/types.js.map +1 -1
  410. package/dist/brep/export/export-model.d.ts +40 -0
  411. package/dist/brep/export/export-model.d.ts.map +1 -1
  412. package/dist/brep/export/export-model.js +268 -25
  413. package/dist/brep/export/export-model.js.map +1 -1
  414. package/dist/brep/export/step-meta-header.d.ts +102 -0
  415. package/dist/brep/export/step-meta-header.d.ts.map +1 -0
  416. package/dist/brep/export/step-meta-header.js +225 -0
  417. package/dist/brep/export/step-meta-header.js.map +1 -0
  418. package/dist/brep/export/step.d.ts +5 -1
  419. package/dist/brep/export/step.d.ts.map +1 -1
  420. package/dist/brep/export/step.js +11 -2
  421. package/dist/brep/export/step.js.map +1 -1
  422. package/dist/brep/handle-bridge.d.ts +2 -2
  423. package/dist/brep/handle-bridge.js +2 -2
  424. package/dist/brep/handle-bridge.js.map +1 -1
  425. package/dist/brep/index.d.ts +6 -3
  426. package/dist/brep/index.d.ts.map +1 -1
  427. package/dist/brep/index.js +6 -3
  428. package/dist/brep/index.js.map +1 -1
  429. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  430. package/dist/brepkit-kernel/brepkitKernel.js +2 -2
  431. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  432. package/dist/browser.d.ts +2 -2
  433. package/dist/browser.d.ts.map +1 -1
  434. package/dist/browser.js +5 -4
  435. package/dist/browser.js.map +1 -1
  436. package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
  437. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  438. package/dist/cad-runtime/admit-compat-lib.js +3 -9
  439. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  440. package/dist/cad-runtime/backend-dispatch.js +12 -3
  441. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  442. package/dist/cad-runtime/direct-executor.d.ts +6 -3
  443. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  444. package/dist/cad-runtime/direct-executor.js +31 -9
  445. package/dist/cad-runtime/direct-executor.js.map +1 -1
  446. package/dist/cad-runtime/interp/env.d.ts +1 -1
  447. package/dist/cad-runtime/interp/env.js.map +1 -1
  448. package/dist/cad-runtime/lib-id.d.ts +0 -2
  449. package/dist/cad-runtime/lib-id.d.ts.map +1 -1
  450. package/dist/cad-runtime/lib-id.js +0 -2
  451. package/dist/cad-runtime/lib-id.js.map +1 -1
  452. package/dist/cad-runtime/live-shapes.d.ts +3 -5
  453. package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
  454. package/dist/cad-runtime/live-shapes.js +8 -10
  455. package/dist/cad-runtime/live-shapes.js.map +1 -1
  456. package/dist/cad-runtime/ports.d.ts +3 -3
  457. package/dist/cad-runtime/ports.js.map +1 -1
  458. package/dist/cad-runtime/runtime.d.ts +21 -7
  459. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  460. package/dist/cad-runtime/runtime.js +45 -6
  461. package/dist/cad-runtime/runtime.js.map +1 -1
  462. package/dist/define-op.d.ts +4 -3
  463. package/dist/define-op.d.ts.map +1 -1
  464. package/dist/define-op.js +65 -3
  465. package/dist/define-op.js.map +1 -1
  466. package/dist/geometry2d/bridge/plane.d.ts +1 -1
  467. package/dist/geometry2d/bridge/plane.js +1 -1
  468. package/dist/geometry2d/bridge/plane.js.map +1 -1
  469. package/dist/geometry2d/curve2d.d.ts +1 -1
  470. package/dist/geometry2d/curve2d.js +1 -1
  471. package/dist/geometry2d/curve2d.js.map +1 -1
  472. package/dist/index.d.ts +1 -1
  473. package/dist/index.d.ts.map +1 -1
  474. package/dist/index.js +10 -4
  475. package/dist/index.js.map +1 -1
  476. package/dist/io/fai-zip/container-read.d.ts +16 -0
  477. package/dist/io/fai-zip/container-read.d.ts.map +1 -1
  478. package/dist/io/fai-zip/container-read.js +22 -0
  479. package/dist/io/fai-zip/container-read.js.map +1 -1
  480. package/dist/io/fai-zip/index.d.ts +1 -1
  481. package/dist/io/fai-zip/index.d.ts.map +1 -1
  482. package/dist/io/fai-zip/index.js +1 -1
  483. package/dist/io/fai-zip/index.js.map +1 -1
  484. package/dist/lang/code-to-args.d.ts.map +1 -1
  485. package/dist/lang/code-to-args.js +10 -1
  486. package/dist/lang/code-to-args.js.map +1 -1
  487. package/dist/lang/determinism-scanner.d.ts.map +1 -1
  488. package/dist/lang/determinism-scanner.js +22 -9
  489. package/dist/lang/determinism-scanner.js.map +1 -1
  490. package/dist/lang/metadata-extractor.d.ts +27 -6
  491. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  492. package/dist/lang/metadata-extractor.js +90 -29
  493. package/dist/lang/metadata-extractor.js.map +1 -1
  494. package/dist/lang/parse-error.d.ts +4 -0
  495. package/dist/lang/parse-error.d.ts.map +1 -1
  496. package/dist/lang/parse-error.js.map +1 -1
  497. package/dist/lang/security-scanner.d.ts +27 -2
  498. package/dist/lang/security-scanner.d.ts.map +1 -1
  499. package/dist/lang/security-scanner.js +29 -2
  500. package/dist/lang/security-scanner.js.map +1 -1
  501. package/dist/lang/source-edit.d.ts +2 -2
  502. package/dist/lang/source-edit.js.map +1 -1
  503. package/dist/lang/symbol-table.generated.d.ts +36 -0
  504. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  505. package/dist/lang/symbol-table.generated.js +36 -0
  506. package/dist/lang/symbol-table.generated.js.map +1 -1
  507. package/dist/lang/types.d.ts +5 -6
  508. package/dist/lang/types.d.ts.map +1 -1
  509. package/dist/lang/types.js.map +1 -1
  510. package/dist/mesh/import-model.d.ts +94 -0
  511. package/dist/mesh/import-model.d.ts.map +1 -0
  512. package/dist/mesh/import-model.js +15 -0
  513. package/dist/mesh/import-model.js.map +1 -0
  514. package/dist/mesh/index.d.ts +19 -58
  515. package/dist/mesh/index.d.ts.map +1 -1
  516. package/dist/mesh/index.js +19 -70
  517. package/dist/mesh/index.js.map +1 -1
  518. package/dist/mesh/io.d.ts +39 -16
  519. package/dist/mesh/io.d.ts.map +1 -1
  520. package/dist/mesh/io.js +151 -22
  521. package/dist/mesh/io.js.map +1 -1
  522. package/dist/mesh/primitives.d.ts.map +1 -1
  523. package/dist/mesh/primitives.js +42 -7
  524. package/dist/mesh/primitives.js.map +1 -1
  525. package/dist/mesh/threemf-bambu.d.ts +12 -1
  526. package/dist/mesh/threemf-bambu.d.ts.map +1 -1
  527. package/dist/mesh/threemf-bambu.js +68 -16
  528. package/dist/mesh/threemf-bambu.js.map +1 -1
  529. package/dist/mesh/threemf-loader.d.ts +37 -1
  530. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  531. package/dist/mesh/threemf-loader.js +205 -14
  532. package/dist/mesh/threemf-loader.js.map +1 -1
  533. package/dist/mesh/transform.d.ts +1 -1
  534. package/dist/mesh/transform.js +1 -1
  535. package/dist/mesh/transform.js.map +1 -1
  536. package/dist/mesh/types.d.ts +43 -5
  537. package/dist/mesh/types.d.ts.map +1 -1
  538. package/dist/mesh/types.js.map +1 -1
  539. package/dist/node-host/cli.d.ts +49 -1
  540. package/dist/node-host/cli.d.ts.map +1 -1
  541. package/dist/node-host/cli.js +125 -19
  542. package/dist/node-host/cli.js.map +1 -1
  543. package/dist/node-host/execute-script.d.ts +55 -0
  544. package/dist/node-host/execute-script.d.ts.map +1 -0
  545. package/dist/node-host/execute-script.js +46 -0
  546. package/dist/node-host/execute-script.js.map +1 -0
  547. package/dist/node.d.ts +2 -0
  548. package/dist/node.d.ts.map +1 -1
  549. package/dist/node.js +3 -0
  550. package/dist/node.js.map +1 -1
  551. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
  552. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
  553. package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
  554. package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
  555. package/dist/occt-kernel/highLevelApi.d.ts +4 -1
  556. package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
  557. package/dist/occt-kernel/highLevelApi.js +4 -2
  558. package/dist/occt-kernel/highLevelApi.js.map +1 -1
  559. package/dist/occt-kernel/hullGeometry.d.ts +2 -2
  560. package/dist/occt-kernel/hullGeometry.js +2 -3
  561. package/dist/occt-kernel/hullGeometry.js.map +1 -1
  562. package/dist/occt-kernel/hullOps.d.ts +3 -3
  563. package/dist/occt-kernel/hullOps.js +4 -4
  564. package/dist/occt-kernel/hullOps.js.map +1 -1
  565. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  566. package/dist/occt-kernel/occt-primitives.js +32 -5
  567. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  568. package/dist/occt-kernel/occtKernel.d.ts +1 -1
  569. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  570. package/dist/occt-kernel/occtKernel.js +19 -1
  571. package/dist/occt-kernel/occtKernel.js.map +1 -1
  572. package/dist/occt-kernel/stepMetaParser.d.ts +44 -0
  573. package/dist/occt-kernel/stepMetaParser.d.ts.map +1 -0
  574. package/dist/occt-kernel/stepMetaParser.js +166 -0
  575. package/dist/occt-kernel/stepMetaParser.js.map +1 -0
  576. package/dist/occt-scan/recognize.d.ts +58 -0
  577. package/dist/occt-scan/recognize.d.ts.map +1 -0
  578. package/dist/occt-scan/recognize.js +216 -0
  579. package/dist/occt-scan/recognize.js.map +1 -0
  580. package/dist/primitives/brep-primitives.js +7 -7
  581. package/dist/primitives/brep-primitives.js.map +1 -1
  582. package/dist/result/bug.d.ts +1 -1
  583. package/dist/result/bug.js +1 -1
  584. package/dist/result/bug.js.map +1 -1
  585. package/dist/result/errors.d.ts +2 -2
  586. package/dist/result/errors.d.ts.map +1 -1
  587. package/dist/result/errors.js +1 -1
  588. package/dist/result/errors.js.map +1 -1
  589. package/dist/result/vec3.d.ts +1 -1
  590. package/dist/result/vec3.js +1 -1
  591. package/dist/result/vec3.js.map +1 -1
  592. package/dist/runtime-state.d.ts +16 -0
  593. package/dist/runtime-state.d.ts.map +1 -1
  594. package/dist/runtime-state.js +27 -0
  595. package/dist/runtime-state.js.map +1 -1
  596. package/dist/script-globals.d.ts +24 -0
  597. package/dist/script-globals.d.ts.map +1 -0
  598. package/dist/script-globals.js +24 -0
  599. package/dist/script-globals.js.map +1 -0
  600. package/dist/shape.d.ts +35 -3
  601. package/dist/shape.d.ts.map +1 -1
  602. package/dist/shape.js +44 -2
  603. package/dist/shape.js.map +1 -1
  604. package/dist/step/stepMetaParser.d.ts +55 -0
  605. package/dist/step/stepMetaParser.d.ts.map +1 -0
  606. package/dist/step/stepMetaParser.js +177 -0
  607. package/dist/step/stepMetaParser.js.map +1 -0
  608. package/dist/topology/naming/lineage.d.ts +3 -2
  609. package/dist/topology/naming/lineage.d.ts.map +1 -1
  610. package/dist/topology/naming/lineage.js.map +1 -1
  611. package/dist/weapp.d.ts +1 -1
  612. package/dist/weapp.js +1 -1
  613. package/dist/weapp.js.map +1 -1
  614. package/package.json +9 -11
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roofFns.js","sourceRoot":"","sources":["../../../src/api/brep-operations/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"]}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Pure TypeScript straight skeleton algorithm for simple polygons.
3
+ * No kernel dependency — operates on 2D point arrays.
4
+ */
5
+ import type { Result } from '../../result/result.js';
6
+ /** A 2D polygon point used as skeleton input. */
7
+ export interface SkPoint2D {
8
+ readonly x: number;
9
+ readonly y: number;
10
+ }
11
+ /** A skeleton node: 2D position plus elevation height. */
12
+ export interface SkeletonNode {
13
+ readonly x: number;
14
+ readonly y: number;
15
+ readonly height: number;
16
+ }
17
+ /** A skeleton face: its vertex loop with the matching per-vertex heights. */
18
+ export interface SkeletonFace {
19
+ readonly vertices: SkPoint2D[];
20
+ readonly heights: number[];
21
+ }
22
+ /** A complete straight skeleton: nodes and faces. */
23
+ export interface StraightSkeleton {
24
+ readonly nodes: SkeletonNode[];
25
+ readonly faces: SkeletonFace[];
26
+ }
27
+ /**
28
+ * Compute the straight skeleton of a simple polygon.
29
+ * The polygon vertices must define a simple (non-self-intersecting) polygon.
30
+ * They will be reordered to CCW if necessary.
31
+ *
32
+ * @param polygon - The input polygon vertices.
33
+ * @returns The computed straight skeleton.
34
+ */
35
+ export declare function computeStraightSkeleton(polygon: SkPoint2D[]): Result<StraightSkeleton>;
36
+ //# sourceMappingURL=straightSkeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"straightSkeleton.d.ts","sourceRoot":"","sources":["../../../src/api/brep-operations/straightSkeleton.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAQjD,iDAAiD;AACjD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0DAA0D;AAC1D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;CAChC;AAiRD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAgBtF"}
@@ -0,0 +1,431 @@
1
+ /**
2
+ * Pure TypeScript straight skeleton algorithm for simple polygons.
3
+ * No kernel dependency — operates on 2D point arrays.
4
+ */
5
+ import { ok, err } from '../../result/result.js';
6
+ import { computationError, BrepErrorCode } from '../../result/errors.js';
7
+ // ---------------------------------------------------------------------------
8
+ // Geometry helpers
9
+ // ---------------------------------------------------------------------------
10
+ const EPS = 1e-10;
11
+ function cross2(ax, ay, bx, by) {
12
+ return ax * by - ay * bx;
13
+ }
14
+ function dot2(ax, ay, bx, by) {
15
+ return ax * bx + ay * by;
16
+ }
17
+ function len2(x, y) {
18
+ return Math.sqrt(x * x + y * y);
19
+ }
20
+ /** Safe polygon access with modular index. */
21
+ function polyAt(poly, i) {
22
+ const idx = ((i % poly.length) + poly.length) % poly.length;
23
+ const p = poly[idx];
24
+ if (!p)
25
+ throw new Error(`Invalid polygon index ${i} for length ${poly.length}`);
26
+ return p;
27
+ }
28
+ /** Ensure polygon is in CCW order. Returns a new array if reversed. */
29
+ function ensureCCW(poly) {
30
+ let area = 0;
31
+ for (let i = 0; i < poly.length; i++) {
32
+ const cur = polyAt(poly, i);
33
+ const nxt = polyAt(poly, i + 1);
34
+ area += cur.x * nxt.y - nxt.x * cur.y;
35
+ }
36
+ if (area < 0)
37
+ return [...poly].reverse();
38
+ return poly;
39
+ }
40
+ /** Compute unit bisector direction pointing inward for vertex at index i. */
41
+ function bisector(poly, i) {
42
+ const prev = polyAt(poly, i - 1);
43
+ const cur = polyAt(poly, i);
44
+ const next = polyAt(poly, i + 1);
45
+ const e1x = cur.x - prev.x;
46
+ const e1y = cur.y - prev.y;
47
+ const e1l = len2(e1x, e1y);
48
+ const e2x = next.x - cur.x;
49
+ const e2y = next.y - cur.y;
50
+ const e2l = len2(e2x, e2y);
51
+ if (e1l < EPS || e2l < EPS)
52
+ return { dx: 0, dy: 0 };
53
+ const n1x = -e1y / e1l;
54
+ const n1y = e1x / e1l;
55
+ const n2x = -e2y / e2l;
56
+ const n2y = e2x / e2l;
57
+ let bx = n1x + n2x;
58
+ let by = n1y + n2y;
59
+ const bl = len2(bx, by);
60
+ if (bl < EPS) {
61
+ return { dx: n1x, dy: n1y };
62
+ }
63
+ bx /= bl;
64
+ by /= bl;
65
+ const cosHalf = dot2(bx, by, n1x, n1y);
66
+ const speed = Math.abs(cosHalf) > EPS ? 1.0 / cosHalf : 1.0;
67
+ return { dx: bx * speed, dy: by * speed };
68
+ }
69
+ /** Is a LAV node reflex based on current LAV positions? */
70
+ function isLavNodeReflex(node) {
71
+ if (!node.prev || !node.next)
72
+ return false;
73
+ return (cross2(node.x - node.prev.x, node.y - node.prev.y, node.next.x - node.x, node.next.y - node.y) <
74
+ -EPS);
75
+ }
76
+ function createLav(poly) {
77
+ const nodes = poly.map((p, i) => {
78
+ const b = bisector(poly, i);
79
+ return {
80
+ x: p.x,
81
+ y: p.y,
82
+ bx: b.dx,
83
+ by: b.dy,
84
+ origIdx: i,
85
+ prev: null,
86
+ next: null,
87
+ active: true,
88
+ };
89
+ });
90
+ for (let i = 0; i < nodes.length; i++) {
91
+ const node = nodes[i];
92
+ const prevNode = nodes[(i - 1 + nodes.length) % nodes.length];
93
+ const nextNode = nodes[(i + 1) % nodes.length];
94
+ if (node && prevNode && nextNode) {
95
+ node.prev = prevNode;
96
+ node.next = nextNode;
97
+ }
98
+ }
99
+ return nodes;
100
+ }
101
+ /** Deactivate a chain of nodes starting from `start`. */
102
+ function deactivateNodes(start, count) {
103
+ let cur = start;
104
+ for (let i = 0; i < count; i++) {
105
+ if (!cur)
106
+ break;
107
+ cur.active = false;
108
+ cur = cur.next;
109
+ }
110
+ }
111
+ /** Count active nodes reachable from a starting node. */
112
+ function lavSize(start) {
113
+ let count = 1;
114
+ let cur = start.next;
115
+ while (cur !== start) {
116
+ count++;
117
+ cur = cur.next;
118
+ if (count > 10000)
119
+ break;
120
+ }
121
+ return count;
122
+ }
123
+ /** Time at which two moving bisectors from nodeA and nodeB intersect. */
124
+ function bisectorIntersectTime(a, b) {
125
+ const ddx = a.bx - b.bx;
126
+ const ddy = a.by - b.by;
127
+ const dxp = b.x - a.x;
128
+ const dyp = b.y - a.y;
129
+ if (Math.abs(ddx) < EPS && Math.abs(ddy) < EPS)
130
+ return null;
131
+ let t;
132
+ if (Math.abs(ddx) > Math.abs(ddy)) {
133
+ t = dxp / ddx;
134
+ }
135
+ else {
136
+ t = dyp / ddy;
137
+ }
138
+ if (t < EPS)
139
+ return null;
140
+ // Verify the other equation
141
+ const otherDd = Math.abs(ddx) > Math.abs(ddy) ? ddy : ddx;
142
+ const otherDp = Math.abs(ddx) > Math.abs(ddy) ? dyp : dxp;
143
+ if (Math.abs(otherDd) > EPS) {
144
+ const t2 = otherDp / otherDd;
145
+ if (Math.abs(t - t2) > 1e-4 * Math.max(1, Math.abs(t)))
146
+ return null;
147
+ }
148
+ return t;
149
+ }
150
+ /** Compute ray-segment intersection time for split events. */
151
+ function raySplitTime(node, eA, eB) {
152
+ const edx = eB.x - eA.x;
153
+ const edy = eB.y - eA.y;
154
+ const el = len2(edx, edy);
155
+ if (el < EPS)
156
+ return null;
157
+ const enx = -edy / el;
158
+ const eny = edx / el;
159
+ const d0 = (node.x - eA.x) * enx + (node.y - eA.y) * eny;
160
+ const relBx = node.bx - (eA.bx + eB.bx) / 2;
161
+ const relBy = node.by - (eA.by + eB.by) / 2;
162
+ const dRate = relBx * enx + relBy * eny;
163
+ if (Math.abs(dRate) < EPS)
164
+ return null;
165
+ const t = -d0 / dRate;
166
+ if (t < EPS)
167
+ return null;
168
+ const px = node.x + t * node.bx;
169
+ const py = node.y + t * node.by;
170
+ const ax = eA.x + t * eA.bx;
171
+ const ay = eA.y + t * eA.by;
172
+ const bxx = eB.x + t * eB.bx;
173
+ const byy = eB.y + t * eB.by;
174
+ const segDx = bxx - ax;
175
+ const segDy = byy - ay;
176
+ const segL = len2(segDx, segDy);
177
+ if (segL < EPS)
178
+ return t;
179
+ const s = dot2(px - ax, py - ay, segDx, segDy) / (segL * segL);
180
+ if (s < -0.01 || s > 1.01)
181
+ return null;
182
+ return t;
183
+ }
184
+ function computeEvents(lavNodes) {
185
+ const events = [];
186
+ for (const node of lavNodes) {
187
+ if (!node.active || !node.next)
188
+ continue;
189
+ const t = bisectorIntersectTime(node, node.next);
190
+ if (t !== null && t > EPS) {
191
+ const x = node.x + t * node.bx;
192
+ const y = node.y + t * node.by;
193
+ events.push({ time: t, x, y, nodeA: node, nodeB: node.next, type: 'edge' });
194
+ }
195
+ if (isLavNodeReflex(node)) {
196
+ let cur = node.next.next;
197
+ let count = 0;
198
+ while (cur !== node.prev && cur !== node && count < 1000) {
199
+ const st = raySplitTime(node, cur, cur.next);
200
+ if (st !== null && st > EPS) {
201
+ const x = node.x + st * node.bx;
202
+ const y = node.y + st * node.by;
203
+ events.push({ time: st, x, y, nodeA: node, nodeB: cur, type: 'split' });
204
+ }
205
+ cur = cur.next;
206
+ count++;
207
+ }
208
+ }
209
+ }
210
+ events.sort((a, b) => a.time - b.time);
211
+ return events;
212
+ }
213
+ // ---------------------------------------------------------------------------
214
+ // Main algorithm
215
+ // ---------------------------------------------------------------------------
216
+ /**
217
+ * Compute the straight skeleton of a simple polygon.
218
+ * The polygon vertices must define a simple (non-self-intersecting) polygon.
219
+ * They will be reordered to CCW if necessary.
220
+ *
221
+ * @param polygon - The input polygon vertices.
222
+ * @returns The computed straight skeleton.
223
+ */
224
+ export function computeStraightSkeleton(polygon) {
225
+ if (polygon.length < 3) {
226
+ return ok({ nodes: [], faces: [] });
227
+ }
228
+ try {
229
+ return ok(computeStraightSkeletonImpl(polygon));
230
+ }
231
+ catch (e) {
232
+ return err(computationError(BrepErrorCode.STRAIGHT_SKELETON_FAILED, e instanceof Error ? e.message : String(e), e));
233
+ }
234
+ }
235
+ /** Internal implementation — may throw on degenerate polygon indices. */
236
+ function computeStraightSkeletonImpl(polygon) {
237
+ const poly = ensureCCW(polygon);
238
+ const n = poly.length;
239
+ const skeletonNodes = [];
240
+ const vertexToSkelNodes = Array.from({ length: n }, () => []);
241
+ const lavNodes = createLav(poly);
242
+ let iterations = 0;
243
+ const maxIter = n * n * 2;
244
+ while (iterations < maxIter) {
245
+ iterations++;
246
+ const activeStart = lavNodes.find((nd) => nd.active);
247
+ if (!activeStart)
248
+ break;
249
+ const sz = lavSize(activeStart);
250
+ if (sz <= 3) {
251
+ if (sz === 3) {
252
+ const a = activeStart;
253
+ const b = a.next;
254
+ const c = b.next;
255
+ const t = bisectorIntersectTime(a, b);
256
+ const time = t !== null && t > EPS ? t : 0;
257
+ const mx = (a.x + b.x + c.x) / 3 + (time * (a.bx + b.bx + c.bx)) / 3;
258
+ const my = (a.y + b.y + c.y) / 3 + (time * (a.by + b.by + c.by)) / 3;
259
+ const nodeIdx = skeletonNodes.length;
260
+ skeletonNodes.push({ x: mx, y: my, height: time });
261
+ const aNodes = vertexToSkelNodes[a.origIdx];
262
+ const bNodes = vertexToSkelNodes[b.origIdx];
263
+ const cNodes = vertexToSkelNodes[c.origIdx];
264
+ if (aNodes)
265
+ aNodes.push(nodeIdx);
266
+ if (bNodes)
267
+ bNodes.push(nodeIdx);
268
+ if (cNodes)
269
+ cNodes.push(nodeIdx);
270
+ a.active = false;
271
+ b.active = false;
272
+ c.active = false;
273
+ }
274
+ else {
275
+ deactivateNodes(activeStart, sz);
276
+ }
277
+ continue;
278
+ }
279
+ const activeNodes = lavNodes.filter((nd) => nd.active);
280
+ const events = computeEvents(activeNodes);
281
+ if (events.length === 0) {
282
+ for (const nd of activeNodes) {
283
+ nd.active = false;
284
+ }
285
+ break;
286
+ }
287
+ const ev = events[0];
288
+ if (!ev)
289
+ break;
290
+ if (ev.type === 'edge') {
291
+ const a = ev.nodeA;
292
+ const b = ev.nodeB;
293
+ if (!a.active || !b.active)
294
+ continue;
295
+ const nodeIdx = skeletonNodes.length;
296
+ skeletonNodes.push({ x: ev.x, y: ev.y, height: ev.time });
297
+ const aNodes = vertexToSkelNodes[a.origIdx];
298
+ const bNodes = vertexToSkelNodes[b.origIdx];
299
+ if (aNodes)
300
+ aNodes.push(nodeIdx);
301
+ if (bNodes)
302
+ bNodes.push(nodeIdx);
303
+ a.x = ev.x;
304
+ a.y = ev.y;
305
+ a.next = b.next;
306
+ b.next.prev = a;
307
+ b.active = false;
308
+ const lavPoly = [];
309
+ let cur = a;
310
+ do {
311
+ lavPoly.push({ x: cur.x, y: cur.y });
312
+ cur = cur.next;
313
+ } while (cur !== a);
314
+ const bDir = bisector(lavPoly, 0);
315
+ a.bx = bDir.dx;
316
+ a.by = bDir.dy;
317
+ }
318
+ else {
319
+ // Split event: reflex vertex `a` reaches opposite edge (nodeB, nodeB.next)
320
+ // Must split the LAV into two independent sub-LAVs
321
+ const a = ev.nodeA;
322
+ const b = ev.nodeB; // start of the opposite edge
323
+ if (!a.active || !b.active)
324
+ continue;
325
+ const nodeIdx = skeletonNodes.length;
326
+ skeletonNodes.push({ x: ev.x, y: ev.y, height: ev.time });
327
+ const aNodes = vertexToSkelNodes[a.origIdx];
328
+ if (aNodes)
329
+ aNodes.push(nodeIdx);
330
+ const bNodes = vertexToSkelNodes[b.origIdx];
331
+ if (bNodes)
332
+ bNodes.push(nodeIdx);
333
+ // Create a copy of `a` at the split point for the second sub-LAV
334
+ const aCopy = {
335
+ x: ev.x,
336
+ y: ev.y,
337
+ bx: 0,
338
+ by: 0,
339
+ origIdx: a.origIdx,
340
+ prev: null,
341
+ next: null,
342
+ active: true,
343
+ };
344
+ lavNodes.push(aCopy);
345
+ // Move `a` to the split point
346
+ a.x = ev.x;
347
+ a.y = ev.y;
348
+ // Rewire: LAV 1 runs a -> b.next -> ... -> a.prev -> a
349
+ // Rewire: LAV 2 runs aCopy -> a.next -> ... -> b -> aCopy
350
+ const aNext = a.next;
351
+ const bNext = b.next;
352
+ // LAV 1: a connects to b.next on the forward side
353
+ a.next = bNext;
354
+ bNext.prev = a;
355
+ // LAV 2: aCopy connects to a's old next on the forward side, b on the back
356
+ aCopy.next = aNext;
357
+ aNext.prev = aCopy;
358
+ aCopy.prev = b;
359
+ b.next = aCopy;
360
+ // Recompute bisectors for both split-point nodes
361
+ const buildLavPoly = (start) => {
362
+ const poly = [];
363
+ let c = start;
364
+ do {
365
+ poly.push({ x: c.x, y: c.y });
366
+ c = c.next;
367
+ } while (c !== start);
368
+ return poly;
369
+ };
370
+ const lav1Poly = buildLavPoly(a);
371
+ const bDir1 = bisector(lav1Poly, 0);
372
+ a.bx = bDir1.dx;
373
+ a.by = bDir1.dy;
374
+ const lav2Poly = buildLavPoly(aCopy);
375
+ const bDir2 = bisector(lav2Poly, 0);
376
+ aCopy.bx = bDir2.dx;
377
+ aCopy.by = bDir2.dy;
378
+ }
379
+ }
380
+ // Build faces: one face per original edge
381
+ const faces = [];
382
+ for (let i = 0; i < n; i++) {
383
+ const j = (i + 1) % n;
384
+ const pi = polyAt(poly, i);
385
+ const pj = polyAt(poly, j);
386
+ const faceVerts = [pi, pj];
387
+ const faceHeights = [0, 0];
388
+ const jNodes = vertexToSkelNodes[j];
389
+ const iNodes = vertexToSkelNodes[i];
390
+ if (jNodes) {
391
+ for (const ni of jNodes) {
392
+ const sn = skeletonNodes[ni];
393
+ if (sn) {
394
+ faceVerts.push({ x: sn.x, y: sn.y });
395
+ faceHeights.push(sn.height);
396
+ }
397
+ }
398
+ }
399
+ if (iNodes) {
400
+ for (let k = iNodes.length - 1; k >= 0; k--) {
401
+ const idx = iNodes[k];
402
+ if (idx === undefined)
403
+ continue;
404
+ const sn = skeletonNodes[idx];
405
+ if (!sn)
406
+ continue;
407
+ const lastVert = faceVerts[faceVerts.length - 1];
408
+ if (!lastVert)
409
+ continue;
410
+ const dist = len2(sn.x - lastVert.x, sn.y - lastVert.y);
411
+ if (dist > EPS) {
412
+ faceVerts.push({ x: sn.x, y: sn.y });
413
+ faceHeights.push(sn.height);
414
+ }
415
+ }
416
+ }
417
+ if (faceVerts.length >= 3) {
418
+ faces.push({ vertices: faceVerts, heights: faceHeights });
419
+ }
420
+ }
421
+ // Deduplicate skeleton nodes
422
+ const uniqueNodes = [];
423
+ for (const sn of skeletonNodes) {
424
+ const exists = uniqueNodes.some((un) => Math.abs(un.x - sn.x) < 0.01 && Math.abs(un.y - sn.y) < 0.01);
425
+ if (!exists) {
426
+ uniqueNodes.push(sn);
427
+ }
428
+ }
429
+ return { nodes: uniqueNodes, faces };
430
+ }
431
+ //# sourceMappingURL=straightSkeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"straightSkeleton.js","sourceRoot":"","sources":["../../../src/api/brep-operations/straightSkeleton.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure TypeScript straight skeleton algorithm for simple polygons.\n * No kernel dependency — operates on 2D point arrays.\n */\n\nimport type { Result } from '../../result/result'\nimport { ok, err } from '../../result/result'\nimport { computationError, BrepErrorCode } from '../../result/errors'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A 2D polygon point used as skeleton input. */\nexport interface SkPoint2D {\n readonly x: number;\n readonly y: number;\n}\n\n/** A skeleton node: 2D position plus elevation height. */\nexport interface SkeletonNode {\n readonly x: number;\n readonly y: number;\n readonly height: number;\n}\n\n/** A skeleton face: its vertex loop with the matching per-vertex heights. */\nexport interface SkeletonFace {\n readonly vertices: SkPoint2D[];\n readonly heights: number[];\n}\n\n/** A complete straight skeleton: nodes and faces. */\nexport interface StraightSkeleton {\n readonly nodes: SkeletonNode[];\n readonly faces: SkeletonFace[];\n}\n\n// ---------------------------------------------------------------------------\n// Geometry helpers\n// ---------------------------------------------------------------------------\n\nconst EPS = 1e-10;\n\nfunction cross2(ax: number, ay: number, bx: number, by: number): number {\n return ax * by - ay * bx;\n}\n\nfunction dot2(ax: number, ay: number, bx: number, by: number): number {\n return ax * bx + ay * by;\n}\n\nfunction len2(x: number, y: number): number {\n return Math.sqrt(x * x + y * y);\n}\n\n/** Safe polygon access with modular index. */\nfunction polyAt(poly: SkPoint2D[], i: number): SkPoint2D {\n const idx = ((i % poly.length) + poly.length) % poly.length;\n const p = poly[idx];\n if (!p) throw new Error(`Invalid polygon index ${i} for length ${poly.length}`);\n return p;\n}\n\n/** Ensure polygon is in CCW order. Returns a new array if reversed. */\nfunction ensureCCW(poly: SkPoint2D[]): SkPoint2D[] {\n let area = 0;\n for (let i = 0; i < poly.length; i++) {\n const cur = polyAt(poly, i);\n const nxt = polyAt(poly, i + 1);\n area += cur.x * nxt.y - nxt.x * cur.y;\n }\n if (area < 0) return [...poly].reverse();\n return poly;\n}\n\n/** Compute unit bisector direction pointing inward for vertex at index i. */\nfunction bisector(poly: SkPoint2D[], i: number): { dx: number; dy: number } {\n const prev = polyAt(poly, i - 1);\n const cur = polyAt(poly, i);\n const next = polyAt(poly, i + 1);\n\n const e1x = cur.x - prev.x;\n const e1y = cur.y - prev.y;\n const e1l = len2(e1x, e1y);\n const e2x = next.x - cur.x;\n const e2y = next.y - cur.y;\n const e2l = len2(e2x, e2y);\n\n if (e1l < EPS || e2l < EPS) return { dx: 0, dy: 0 };\n\n const n1x = -e1y / e1l;\n const n1y = e1x / e1l;\n const n2x = -e2y / e2l;\n const n2y = e2x / e2l;\n\n let bx = n1x + n2x;\n let by = n1y + n2y;\n const bl = len2(bx, by);\n\n if (bl < EPS) {\n return { dx: n1x, dy: n1y };\n }\n\n bx /= bl;\n by /= bl;\n\n const cosHalf = dot2(bx, by, n1x, n1y);\n const speed = Math.abs(cosHalf) > EPS ? 1.0 / cosHalf : 1.0;\n\n return { dx: bx * speed, dy: by * speed };\n}\n\n// ---------------------------------------------------------------------------\n// LAV (List of Active Vertices)\n// ---------------------------------------------------------------------------\n\ninterface LavNode {\n x: number;\n y: number;\n bx: number;\n by: number;\n origIdx: number;\n prev: LavNode | null;\n next: LavNode | null;\n active: boolean;\n}\n\n/** Is a LAV node reflex based on current LAV positions? */\nfunction isLavNodeReflex(node: LavNode): boolean {\n if (!node.prev || !node.next) return false;\n return (\n cross2(node.x - node.prev.x, node.y - node.prev.y, node.next.x - node.x, node.next.y - node.y) <\n -EPS\n );\n}\n\nfunction createLav(poly: SkPoint2D[]): LavNode[] {\n const nodes: LavNode[] = poly.map((p, i) => {\n const b = bisector(poly, i);\n return {\n x: p.x,\n y: p.y,\n bx: b.dx,\n by: b.dy,\n origIdx: i,\n prev: null,\n next: null,\n active: true,\n };\n });\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const prevNode = nodes[(i - 1 + nodes.length) % nodes.length];\n const nextNode = nodes[(i + 1) % nodes.length];\n if (node && prevNode && nextNode) {\n node.prev = prevNode;\n node.next = nextNode;\n }\n }\n\n return nodes;\n}\n\n/** Deactivate a chain of nodes starting from `start`. */\nfunction deactivateNodes(start: LavNode | null, count: number): void {\n let cur = start;\n for (let i = 0; i < count; i++) {\n if (!cur) break;\n cur.active = false;\n cur = cur.next;\n }\n}\n\n/** Count active nodes reachable from a starting node. */\nfunction lavSize(start: LavNode): number {\n let count = 1;\n \n let cur = start.next!;\n while (cur !== start) {\n count++;\n \n cur = cur.next!;\n if (count > 10000) break;\n }\n return count;\n}\n\n// ---------------------------------------------------------------------------\n// Event computation\n// ---------------------------------------------------------------------------\n\ninterface SkEvent {\n time: number;\n x: number;\n y: number;\n nodeA: LavNode;\n nodeB: LavNode;\n type: 'edge' | 'split';\n}\n\n/** Time at which two moving bisectors from nodeA and nodeB intersect. */\nfunction bisectorIntersectTime(a: LavNode, b: LavNode): number | null {\n const ddx = a.bx - b.bx;\n const ddy = a.by - b.by;\n const dxp = b.x - a.x;\n const dyp = b.y - a.y;\n\n if (Math.abs(ddx) < EPS && Math.abs(ddy) < EPS) return null;\n\n let t: number;\n if (Math.abs(ddx) > Math.abs(ddy)) {\n t = dxp / ddx;\n } else {\n t = dyp / ddy;\n }\n\n if (t < EPS) return null;\n\n // Verify the other equation\n const otherDd = Math.abs(ddx) > Math.abs(ddy) ? ddy : ddx;\n const otherDp = Math.abs(ddx) > Math.abs(ddy) ? dyp : dxp;\n if (Math.abs(otherDd) > EPS) {\n const t2 = otherDp / otherDd;\n if (Math.abs(t - t2) > 1e-4 * Math.max(1, Math.abs(t))) return null;\n }\n\n return t;\n}\n\n/** Compute ray-segment intersection time for split events. */\nfunction raySplitTime(node: LavNode, eA: LavNode, eB: LavNode): number | null {\n const edx = eB.x - eA.x;\n const edy = eB.y - eA.y;\n const el = len2(edx, edy);\n if (el < EPS) return null;\n\n const enx = -edy / el;\n const eny = edx / el;\n\n const d0 = (node.x - eA.x) * enx + (node.y - eA.y) * eny;\n const relBx = node.bx - (eA.bx + eB.bx) / 2;\n const relBy = node.by - (eA.by + eB.by) / 2;\n const dRate = relBx * enx + relBy * eny;\n\n if (Math.abs(dRate) < EPS) return null;\n\n const t = -d0 / dRate;\n if (t < EPS) return null;\n\n const px = node.x + t * node.bx;\n const py = node.y + t * node.by;\n const ax = eA.x + t * eA.bx;\n const ay = eA.y + t * eA.by;\n const bxx = eB.x + t * eB.bx;\n const byy = eB.y + t * eB.by;\n\n const segDx = bxx - ax;\n const segDy = byy - ay;\n const segL = len2(segDx, segDy);\n if (segL < EPS) return t;\n\n const s = dot2(px - ax, py - ay, segDx, segDy) / (segL * segL);\n if (s < -0.01 || s > 1.01) return null;\n\n return t;\n}\n\nfunction computeEvents(lavNodes: LavNode[]): SkEvent[] {\n const events: SkEvent[] = [];\n\n for (const node of lavNodes) {\n if (!node.active || !node.next) continue;\n\n const t = bisectorIntersectTime(node, node.next);\n if (t !== null && t > EPS) {\n const x = node.x + t * node.bx;\n const y = node.y + t * node.by;\n events.push({ time: t, x, y, nodeA: node, nodeB: node.next, type: 'edge' });\n }\n\n if (isLavNodeReflex(node)) {\n \n let cur = node.next.next!;\n let count = 0;\n while (cur !== node.prev && cur !== node && count < 1000) {\n \n const st = raySplitTime(node, cur, cur.next!);\n if (st !== null && st > EPS) {\n const x = node.x + st * node.bx;\n const y = node.y + st * node.by;\n events.push({ time: st, x, y, nodeA: node, nodeB: cur, type: 'split' });\n }\n \n cur = cur.next!;\n count++;\n }\n }\n }\n\n events.sort((a, b) => a.time - b.time);\n return events;\n}\n\n// ---------------------------------------------------------------------------\n// Main algorithm\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the straight skeleton of a simple polygon.\n * The polygon vertices must define a simple (non-self-intersecting) polygon.\n * They will be reordered to CCW if necessary.\n *\n * @param polygon - The input polygon vertices.\n * @returns The computed straight skeleton.\n */\nexport function computeStraightSkeleton(polygon: SkPoint2D[]): Result<StraightSkeleton> {\n if (polygon.length < 3) {\n return ok({ nodes: [], faces: [] });\n }\n\n try {\n return ok(computeStraightSkeletonImpl(polygon));\n } catch (e: unknown) {\n return err(\n computationError(\n BrepErrorCode.STRAIGHT_SKELETON_FAILED,\n e instanceof Error ? e.message : String(e),\n e\n )\n );\n }\n}\n\n/** Internal implementation — may throw on degenerate polygon indices. */\nfunction computeStraightSkeletonImpl(polygon: SkPoint2D[]): StraightSkeleton {\n const poly = ensureCCW(polygon);\n const n = poly.length;\n\n const skeletonNodes: SkeletonNode[] = [];\n const vertexToSkelNodes: number[][] = Array.from({ length: n }, () => []);\n\n const lavNodes = createLav(poly);\n let iterations = 0;\n const maxIter = n * n * 2;\n\n while (iterations < maxIter) {\n iterations++;\n\n const activeStart = lavNodes.find((nd) => nd.active);\n if (!activeStart) break;\n\n const sz = lavSize(activeStart);\n if (sz <= 3) {\n if (sz === 3) {\n const a = activeStart;\n \n const b = a.next!;\n \n const c = b.next!;\n\n const t = bisectorIntersectTime(a, b);\n const time = t !== null && t > EPS ? t : 0;\n const mx = (a.x + b.x + c.x) / 3 + (time * (a.bx + b.bx + c.bx)) / 3;\n const my = (a.y + b.y + c.y) / 3 + (time * (a.by + b.by + c.by)) / 3;\n\n const nodeIdx = skeletonNodes.length;\n skeletonNodes.push({ x: mx, y: my, height: time });\n\n const aNodes = vertexToSkelNodes[a.origIdx];\n const bNodes = vertexToSkelNodes[b.origIdx];\n const cNodes = vertexToSkelNodes[c.origIdx];\n if (aNodes) aNodes.push(nodeIdx);\n if (bNodes) bNodes.push(nodeIdx);\n if (cNodes) cNodes.push(nodeIdx);\n\n a.active = false;\n b.active = false;\n c.active = false;\n } else {\n deactivateNodes(activeStart, sz);\n }\n continue;\n }\n\n const activeNodes = lavNodes.filter((nd) => nd.active);\n const events = computeEvents(activeNodes);\n\n if (events.length === 0) {\n for (const nd of activeNodes) {\n nd.active = false;\n }\n break;\n }\n\n const ev = events[0];\n if (!ev) break;\n\n if (ev.type === 'edge') {\n const a = ev.nodeA;\n const b = ev.nodeB;\n\n if (!a.active || !b.active) continue;\n\n const nodeIdx = skeletonNodes.length;\n skeletonNodes.push({ x: ev.x, y: ev.y, height: ev.time });\n\n const aNodes = vertexToSkelNodes[a.origIdx];\n const bNodes = vertexToSkelNodes[b.origIdx];\n if (aNodes) aNodes.push(nodeIdx);\n if (bNodes) bNodes.push(nodeIdx);\n\n a.x = ev.x;\n a.y = ev.y;\n\n a.next = b.next;\n \n b.next!.prev = a;\n b.active = false;\n\n const lavPoly: SkPoint2D[] = [];\n let cur = a;\n do {\n lavPoly.push({ x: cur.x, y: cur.y });\n \n cur = cur.next!;\n } while (cur !== a);\n\n const bDir = bisector(lavPoly, 0);\n a.bx = bDir.dx;\n a.by = bDir.dy;\n } else {\n // Split event: reflex vertex `a` reaches opposite edge (nodeB, nodeB.next)\n // Must split the LAV into two independent sub-LAVs\n const a = ev.nodeA;\n const b = ev.nodeB; // start of the opposite edge\n if (!a.active || !b.active) continue;\n\n const nodeIdx = skeletonNodes.length;\n skeletonNodes.push({ x: ev.x, y: ev.y, height: ev.time });\n const aNodes = vertexToSkelNodes[a.origIdx];\n if (aNodes) aNodes.push(nodeIdx);\n const bNodes = vertexToSkelNodes[b.origIdx];\n if (bNodes) bNodes.push(nodeIdx);\n\n // Create a copy of `a` at the split point for the second sub-LAV\n const aCopy: LavNode = {\n x: ev.x,\n y: ev.y,\n bx: 0,\n by: 0,\n origIdx: a.origIdx,\n prev: null,\n next: null,\n active: true,\n };\n lavNodes.push(aCopy);\n\n // Move `a` to the split point\n a.x = ev.x;\n a.y = ev.y;\n\n // Rewire: LAV 1 runs a -> b.next -> ... -> a.prev -> a\n // Rewire: LAV 2 runs aCopy -> a.next -> ... -> b -> aCopy\n \n const aNext = a.next!;\n \n const bNext = b.next!;\n\n // LAV 1: a connects to b.next on the forward side\n a.next = bNext;\n bNext.prev = a;\n\n // LAV 2: aCopy connects to a's old next on the forward side, b on the back\n aCopy.next = aNext;\n aNext.prev = aCopy;\n aCopy.prev = b;\n b.next = aCopy;\n\n // Recompute bisectors for both split-point nodes\n const buildLavPoly = (start: LavNode): SkPoint2D[] => {\n const poly: SkPoint2D[] = [];\n let c = start;\n do {\n poly.push({ x: c.x, y: c.y });\n \n c = c.next!;\n } while (c !== start);\n return poly;\n };\n\n const lav1Poly = buildLavPoly(a);\n const bDir1 = bisector(lav1Poly, 0);\n a.bx = bDir1.dx;\n a.by = bDir1.dy;\n\n const lav2Poly = buildLavPoly(aCopy);\n const bDir2 = bisector(lav2Poly, 0);\n aCopy.bx = bDir2.dx;\n aCopy.by = bDir2.dy;\n }\n }\n\n // Build faces: one face per original edge\n const faces: SkeletonFace[] = [];\n\n for (let i = 0; i < n; i++) {\n const j = (i + 1) % n;\n const pi = polyAt(poly, i);\n const pj = polyAt(poly, j);\n const faceVerts: SkPoint2D[] = [pi, pj];\n const faceHeights: number[] = [0, 0];\n\n const jNodes = vertexToSkelNodes[j];\n const iNodes = vertexToSkelNodes[i];\n\n if (jNodes) {\n for (const ni of jNodes) {\n const sn = skeletonNodes[ni];\n if (sn) {\n faceVerts.push({ x: sn.x, y: sn.y });\n faceHeights.push(sn.height);\n }\n }\n }\n\n if (iNodes) {\n for (let k = iNodes.length - 1; k >= 0; k--) {\n const idx = iNodes[k];\n if (idx === undefined) continue;\n const sn = skeletonNodes[idx];\n if (!sn) continue;\n const lastVert = faceVerts[faceVerts.length - 1];\n if (!lastVert) continue;\n const dist = len2(sn.x - lastVert.x, sn.y - lastVert.y);\n if (dist > EPS) {\n faceVerts.push({ x: sn.x, y: sn.y });\n faceHeights.push(sn.height);\n }\n }\n }\n\n if (faceVerts.length >= 3) {\n faces.push({ vertices: faceVerts, heights: faceHeights });\n }\n }\n\n // Deduplicate skeleton nodes\n const uniqueNodes: SkeletonNode[] = [];\n for (const sn of skeletonNodes) {\n const exists = uniqueNodes.some(\n (un) => Math.abs(un.x - sn.x) < 0.01 && Math.abs(un.y - sn.y) < 0.01\n );\n if (!exists) {\n uniqueNodes.push(sn);\n }\n }\n\n return { nodes: uniqueNodes, faces };\n}\n"]}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Self-hosted compat-op implementations — extrude/revolve/sweep family
3
+ * (core-decouple Phase 3, §5.4; G3).
4
+ *
5
+ * @platform occt
6
+ *
7
+ * Semantics mirror brepjs `operations/{api,extrudeFns,sweepFns}.ts`:
8
+ * - `extrudeBrep` — height: number → [0,0,h]; Vec3 → as-is. EXTRUDE_ZERO_VECTOR guard.
9
+ * - `revolveBrep` — options { at, axis, angle(radians, default 2π) }; REVOLUTION_NOT_3D.
10
+ * - `sweepBrep` — config.mode 'simple' → simplePipe; default → sweepPipeShell(frenet).
11
+ * shellMode / law / auxiliarySpine / support / correction configs are not
12
+ * supported after core migration (cad 面取手写 api/sweep.ts,shell 元组不暴露 §2.4①).
13
+ * - `complexExtrudeBrep` / `twistExtrudeBrep` — linear / helix spine built on
14
+ * occt-wasm makeLineEdge+makeWire / makeHelixWire, then sweepPipeShell.
15
+ * ExtrusionProfile scaling law is not supported (brepjs buildLawFromProfile
16
+ * has no L1 equivalent); non-undefined profile → LAW_UNSUPPORTED error.
17
+ */
18
+ import type { BrepHandle } from '../../brep/engine/types.js';
19
+ import { type Result } from '../../result/result.js';
20
+ /**
21
+ * Extrude a face along a vector/height (brepjs api.js#extrude + extrudeFns.ts#extrude).
22
+ *
23
+ * @param args - Resolved arguments (face, height or extrusion vector).
24
+ * @returns The extruded solid as a `BrepHandle`.
25
+ */
26
+ export declare function extrudeBrep(...args: unknown[]): Result<BrepHandle>;
27
+ /**
28
+ * Revolve a face around an axis (brepjs api.js#revolve; angle in radians, default 2π).
29
+ *
30
+ * @param args - Resolved arguments (face, revolve options).
31
+ * @returns The revolved solid as a `BrepHandle`.
32
+ */
33
+ export declare function revolveBrep(...args: unknown[]): Result<BrepHandle>;
34
+ /**
35
+ * Sweep a profile along a spine (brepjs sweepFns.ts#sweep).
36
+ *
37
+ * 两条路径(S3):
38
+ * - 无 sweepFull 专有字段 → 旧路径(`mode:'simple'` → `simplePipe`;否则 `sweepPipeShell`);
39
+ * - 给出任一 sweepFull 字段 → occt 原生 `sweepFull`(完整控制面:朝向模式 / 转角过渡 /
40
+ * 引导线关系 / 支持面 / 逼近预算 / 缩放律)。`mode:'simple'` 与 sweepFull 字段互斥。
41
+ *
42
+ * @param args - Resolved arguments (wire, spine, config, shellMode).
43
+ * @returns The swept solid as a `BrepHandle`.
44
+ */
45
+ export declare function sweepBrep(...args: unknown[]): Result<BrepHandle>;
46
+ /**
47
+ * Extrude a wire along a normal (brepjs sweepFns.ts#complexExtrude).
48
+ *
49
+ * @param args - Resolved arguments (wire, center, normal, profile).
50
+ * @returns The extruded solid as a `BrepHandle`.
51
+ */
52
+ export declare function complexExtrudeBrep(...args: unknown[]): Result<BrepHandle>;
53
+ /**
54
+ * Extrude a wire along a helical path (brepjs sweepFns.ts#twistExtrude).
55
+ *
56
+ * @param args - Resolved arguments (wire, angleDegrees, center, normal, profile).
57
+ * @returns The twisted extrusion as a `BrepHandle`.
58
+ */
59
+ export declare function twistExtrudeBrep(...args: unknown[]): Result<BrepHandle>;
60
+ //# sourceMappingURL=sweepFns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sweepFns.d.ts","sourceRoot":"","sources":["../../../src/api/brep-operations/sweepFns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEzD,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAA;AA8B1D;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAclE;AAMD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAqBlE;AAgID;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CA4ChE;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CA6BzE;AAMD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAqDvE"}