@faicad/faijs 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/LICENSE +4 -5
  2. package/NOTICE +5 -6
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +19 -1
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/assembly/entities.d.ts +1 -1
  7. package/dist/api/assembly/entities.d.ts.map +1 -1
  8. package/dist/api/assembly/entities.js.map +1 -1
  9. package/dist/api/assembly/joints.d.ts +2 -2
  10. package/dist/api/assembly/joints.d.ts.map +1 -1
  11. package/dist/api/assembly/joints.js +2 -2
  12. package/dist/api/assembly/joints.js.map +1 -1
  13. package/dist/api/assembly/lower.d.ts +1 -1
  14. package/dist/api/assembly/lower.d.ts.map +1 -1
  15. package/dist/api/assembly/lower.js.map +1 -1
  16. package/dist/api/assembly/pose.d.ts +3 -3
  17. package/dist/api/assembly/pose.d.ts.map +1 -1
  18. package/dist/api/assembly/pose.js +1 -1
  19. package/dist/api/assembly/pose.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.d.ts.map +1 -1
  22. package/dist/api/assembly/preview.js +1 -1
  23. package/dist/api/assembly/preview.js.map +1 -1
  24. package/dist/api/assembly/solve.d.ts.map +1 -1
  25. package/dist/api/assembly/solve.js +3 -3
  26. package/dist/api/assembly/solve.js.map +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.d.ts +98 -0
  28. package/dist/api/assembly/solvers/assembly-tree.d.ts.map +1 -0
  29. package/dist/api/assembly/solvers/assembly-tree.js +130 -0
  30. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -0
  31. package/dist/api/assembly/solvers/chain-solver.d.ts +27 -0
  32. package/dist/api/assembly/solvers/chain-solver.d.ts.map +1 -0
  33. package/dist/api/assembly/solvers/chain-solver.js +330 -0
  34. package/dist/api/assembly/solvers/chain-solver.js.map +1 -0
  35. package/dist/api/assembly/solvers/global-solver.js +2 -2
  36. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  37. package/dist/api/assembly/solvers/joints-kinematics.d.ts +308 -0
  38. package/dist/api/assembly/solvers/joints-kinematics.d.ts.map +1 -0
  39. package/dist/api/assembly/solvers/joints-kinematics.js +643 -0
  40. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -0
  41. package/dist/api/assembly/solvers/quat.d.ts +35 -0
  42. package/dist/api/assembly/solvers/quat.d.ts.map +1 -0
  43. package/dist/api/assembly/solvers/quat.js +84 -0
  44. package/dist/api/assembly/solvers/quat.js.map +1 -0
  45. package/dist/api/assembly/solvers/types.d.ts +33 -0
  46. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  47. package/dist/api/assembly/solvers/types.js.map +1 -1
  48. package/dist/api/boolean.d.ts.map +1 -1
  49. package/dist/api/boolean.js +3 -4
  50. package/dist/api/boolean.js.map +1 -1
  51. package/dist/api/brep-mirror/booleanFns.d.ts +40 -0
  52. package/dist/api/brep-mirror/booleanFns.d.ts.map +1 -0
  53. package/dist/api/brep-mirror/booleanFns.js +99 -0
  54. package/dist/api/brep-mirror/booleanFns.js.map +1 -0
  55. package/dist/api/brep-mirror/brepHelpers.d.ts +55 -0
  56. package/dist/api/brep-mirror/brepHelpers.d.ts.map +1 -0
  57. package/dist/api/brep-mirror/brepHelpers.js +131 -0
  58. package/dist/api/brep-mirror/brepHelpers.js.map +1 -0
  59. package/dist/api/brep-mirror/compoundFns.d.ts +47 -0
  60. package/dist/api/brep-mirror/compoundFns.d.ts.map +1 -0
  61. package/dist/api/brep-mirror/compoundFns.js +300 -0
  62. package/dist/api/brep-mirror/compoundFns.js.map +1 -0
  63. package/dist/api/brep-mirror/healingFns.d.ts +78 -0
  64. package/dist/api/brep-mirror/healingFns.d.ts.map +1 -0
  65. package/dist/api/brep-mirror/healingFns.js +294 -0
  66. package/dist/api/brep-mirror/healingFns.js.map +1 -0
  67. package/dist/api/brep-mirror/hullFns.d.ts +20 -0
  68. package/dist/api/brep-mirror/hullFns.d.ts.map +1 -0
  69. package/dist/api/brep-mirror/hullFns.js +46 -0
  70. package/dist/api/brep-mirror/hullFns.js.map +1 -0
  71. package/dist/api/brep-mirror/patternFns.d.ts +43 -0
  72. package/dist/api/brep-mirror/patternFns.d.ts.map +1 -0
  73. package/dist/api/brep-mirror/patternFns.js +178 -0
  74. package/dist/api/brep-mirror/patternFns.js.map +1 -0
  75. package/dist/api/brep-mirror/primitiveFns.d.ts +42 -0
  76. package/dist/api/brep-mirror/primitiveFns.d.ts.map +1 -0
  77. package/dist/api/brep-mirror/primitiveFns.js +104 -0
  78. package/dist/api/brep-mirror/primitiveFns.js.map +1 -0
  79. package/dist/api/brep-mirror/roofFns.d.ts +24 -0
  80. package/dist/api/brep-mirror/roofFns.d.ts.map +1 -0
  81. package/dist/api/brep-mirror/roofFns.js +229 -0
  82. package/dist/api/brep-mirror/roofFns.js.map +1 -0
  83. package/dist/api/brep-mirror/straightSkeleton.d.ts +36 -0
  84. package/dist/api/brep-mirror/straightSkeleton.d.ts.map +1 -0
  85. package/dist/api/brep-mirror/straightSkeleton.js +443 -0
  86. package/dist/api/brep-mirror/straightSkeleton.js.map +1 -0
  87. package/dist/api/brep-mirror/sweepFns.d.ts +55 -0
  88. package/dist/api/brep-mirror/sweepFns.d.ts.map +1 -0
  89. package/dist/api/brep-mirror/sweepFns.js +200 -0
  90. package/dist/api/brep-mirror/sweepFns.js.map +1 -0
  91. package/dist/api/brep-mirror/threadFns.d.ts +15 -0
  92. package/dist/api/brep-mirror/threadFns.d.ts.map +1 -1
  93. package/dist/api/brep-mirror/threadFns.js +37 -2
  94. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  95. package/dist/api/brep-mirror/topologyFns.d.ts +74 -0
  96. package/dist/api/brep-mirror/topologyFns.d.ts.map +1 -0
  97. package/dist/api/brep-mirror/topologyFns.js +273 -0
  98. package/dist/api/brep-mirror/topologyFns.js.map +1 -0
  99. package/dist/api/brep-topology.d.ts +190 -0
  100. package/dist/api/brep-topology.d.ts.map +1 -0
  101. package/dist/api/brep-topology.js +337 -0
  102. package/dist/api/brep-topology.js.map +1 -0
  103. package/dist/api/brepjs-compat/constants.d.ts +11 -0
  104. package/dist/api/brepjs-compat/constants.d.ts.map +1 -0
  105. package/dist/api/brepjs-compat/constants.js +11 -0
  106. package/dist/api/brepjs-compat/constants.js.map +1 -0
  107. package/dist/api/brepjs-compat/index.d.ts +19 -232
  108. package/dist/api/brepjs-compat/index.d.ts.map +1 -1
  109. package/dist/api/brepjs-compat/index.js +19 -286
  110. package/dist/api/brepjs-compat/index.js.map +1 -1
  111. package/dist/api/brepjs-compat/planeOps.d.ts +98 -0
  112. package/dist/api/brepjs-compat/planeOps.d.ts.map +1 -0
  113. package/dist/api/brepjs-compat/planeOps.js +170 -0
  114. package/dist/api/brepjs-compat/planeOps.js.map +1 -0
  115. package/dist/api/brepjs-compat/planeTypes.d.ts +24 -0
  116. package/dist/api/brepjs-compat/planeTypes.d.ts.map +1 -0
  117. package/dist/api/brepjs-compat/planeTypes.js +8 -0
  118. package/dist/api/brepjs-compat/planeTypes.js.map +1 -0
  119. package/dist/api/brepjs-compat/types.d.ts +64 -0
  120. package/dist/api/brepjs-compat/types.d.ts.map +1 -0
  121. package/dist/api/brepjs-compat/types.js +48 -0
  122. package/dist/api/brepjs-compat/types.js.map +1 -0
  123. package/dist/api/brepjs-compat/vecOps.d.ts +124 -0
  124. package/dist/api/brepjs-compat/vecOps.d.ts.map +1 -0
  125. package/dist/api/brepjs-compat/vecOps.js +202 -0
  126. package/dist/api/brepjs-compat/vecOps.js.map +1 -0
  127. package/dist/api/chamfer.d.ts +5 -0
  128. package/dist/api/chamfer.d.ts.map +1 -1
  129. package/dist/api/chamfer.js +13 -8
  130. package/dist/api/chamfer.js.map +1 -1
  131. package/dist/api/compound-geom.d.ts.map +1 -1
  132. package/dist/api/compound-geom.js +8 -2
  133. package/dist/api/compound-geom.js.map +1 -1
  134. package/dist/api/draft.d.ts +69 -0
  135. package/dist/api/draft.d.ts.map +1 -0
  136. package/dist/api/draft.js +109 -0
  137. package/dist/api/draft.js.map +1 -0
  138. package/dist/api/edge-ref.d.ts.map +1 -1
  139. package/dist/api/edge-ref.js +2 -2
  140. package/dist/api/edge-ref.js.map +1 -1
  141. package/dist/api/engrave.d.ts.map +1 -1
  142. package/dist/api/engrave.js +2 -3
  143. package/dist/api/engrave.js.map +1 -1
  144. package/dist/api/extrude.d.ts.map +1 -1
  145. package/dist/api/extrude.js +28 -13
  146. package/dist/api/extrude.js.map +1 -1
  147. package/dist/api/face-ref.d.ts.map +1 -1
  148. package/dist/api/face-ref.js +2 -2
  149. package/dist/api/face-ref.js.map +1 -1
  150. package/dist/api/feature-repair.d.ts +137 -0
  151. package/dist/api/feature-repair.d.ts.map +1 -0
  152. package/dist/api/feature-repair.js +221 -0
  153. package/dist/api/feature-repair.js.map +1 -0
  154. package/dist/api/fillet-variable.d.ts +35 -0
  155. package/dist/api/fillet-variable.d.ts.map +1 -0
  156. package/dist/api/fillet-variable.js +71 -0
  157. package/dist/api/fillet-variable.js.map +1 -0
  158. package/dist/api/fillet.d.ts +3 -0
  159. package/dist/api/fillet.d.ts.map +1 -1
  160. package/dist/api/fillet.js +7 -4
  161. package/dist/api/fillet.js.map +1 -1
  162. package/dist/api/generated/2d.d.ts +1 -13
  163. package/dist/api/generated/2d.d.ts.map +1 -1
  164. package/dist/api/generated/2d.js +6 -1
  165. package/dist/api/generated/2d.js.map +1 -1
  166. package/dist/api/generated/brepjs/index.d.ts +298 -298
  167. package/dist/api/generated/brepjs/index.d.ts.map +1 -1
  168. package/dist/api/generated/brepjs/index.js +183 -183
  169. package/dist/api/generated/brepjs/index.js.map +1 -1
  170. package/dist/api/generated/core.d.ts +3 -123
  171. package/dist/api/generated/core.d.ts.map +1 -1
  172. package/dist/api/generated/core.js +2 -81
  173. package/dist/api/generated/core.js.map +1 -1
  174. package/dist/api/generated/gear.d.ts +1 -15
  175. package/dist/api/generated/gear.d.ts.map +1 -1
  176. package/dist/api/generated/gear.js +6 -3
  177. package/dist/api/generated/gear.js.map +1 -1
  178. package/dist/api/generated/io.d.ts +1 -13
  179. package/dist/api/generated/io.d.ts.map +1 -1
  180. package/dist/api/generated/io.js +6 -1
  181. package/dist/api/generated/io.js.map +1 -1
  182. package/dist/api/generated/kernel.d.ts +1 -39
  183. package/dist/api/generated/kernel.d.ts.map +1 -1
  184. package/dist/api/generated/kernel.js +6 -4
  185. package/dist/api/generated/kernel.js.map +1 -1
  186. package/dist/api/generated/measurement.d.ts +53 -97
  187. package/dist/api/generated/measurement.d.ts.map +1 -1
  188. package/dist/api/generated/measurement.js +48 -143
  189. package/dist/api/generated/measurement.js.map +1 -1
  190. package/dist/api/generated/ns.d.ts +1 -10
  191. package/dist/api/generated/ns.d.ts.map +1 -1
  192. package/dist/api/generated/ns.js +2 -10
  193. package/dist/api/generated/ns.js.map +1 -1
  194. package/dist/api/generated/operations.d.ts +65 -110
  195. package/dist/api/generated/operations.d.ts.map +1 -1
  196. package/dist/api/generated/operations.js +132 -80
  197. package/dist/api/generated/operations.js.map +1 -1
  198. package/dist/api/generated/projection.d.ts +1 -8
  199. package/dist/api/generated/projection.d.ts.map +1 -1
  200. package/dist/api/generated/projection.js +6 -4
  201. package/dist/api/generated/projection.js.map +1 -1
  202. package/dist/api/generated/query.d.ts +1 -9
  203. package/dist/api/generated/query.d.ts.map +1 -1
  204. package/dist/api/generated/query.js +6 -1
  205. package/dist/api/generated/query.js.map +1 -1
  206. package/dist/api/generated/script-face-manifest.d.ts +2 -0
  207. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  208. package/dist/api/generated/script-face-manifest.js +34 -22
  209. package/dist/api/generated/script-face-manifest.js.map +1 -1
  210. package/dist/api/generated/script-face.d.ts +52 -27
  211. package/dist/api/generated/script-face.d.ts.map +1 -1
  212. package/dist/api/generated/script-face.js +18 -4
  213. package/dist/api/generated/script-face.js.map +1 -1
  214. package/dist/api/generated/sketching.d.ts +4 -7
  215. package/dist/api/generated/sketching.d.ts.map +1 -1
  216. package/dist/api/generated/sketching.js +10 -8
  217. package/dist/api/generated/sketching.js.map +1 -1
  218. package/dist/api/generated/text.d.ts +1 -6
  219. package/dist/api/generated/text.d.ts.map +1 -1
  220. package/dist/api/generated/text.js +6 -3
  221. package/dist/api/generated/text.js.map +1 -1
  222. package/dist/api/generated/topology.d.ts +77 -175
  223. package/dist/api/generated/topology.d.ts.map +1 -1
  224. package/dist/api/generated/topology.js +172 -131
  225. package/dist/api/generated/topology.js.map +1 -1
  226. package/dist/api/geom.d.ts.map +1 -1
  227. package/dist/api/geom.js +2 -2
  228. package/dist/api/geom.js.map +1 -1
  229. package/dist/api/helix.d.ts +51 -0
  230. package/dist/api/helix.d.ts.map +1 -0
  231. package/dist/api/helix.js +63 -0
  232. package/dist/api/helix.js.map +1 -0
  233. package/dist/api/import-step.d.ts.map +1 -1
  234. package/dist/api/import-step.js +6 -2
  235. package/dist/api/import-step.js.map +1 -1
  236. package/dist/api/index.d.ts +18 -5
  237. package/dist/api/index.d.ts.map +1 -1
  238. package/dist/api/index.js +29 -12
  239. package/dist/api/index.js.map +1 -1
  240. package/dist/api/internal/compat-op.d.ts +10 -0
  241. package/dist/api/internal/compat-op.d.ts.map +1 -1
  242. package/dist/api/internal/compat-op.js +9 -3
  243. package/dist/api/internal/compat-op.js.map +1 -1
  244. package/dist/api/internal/compat-projection.d.ts +4 -4
  245. package/dist/api/internal/compat-projection.js +7 -7
  246. package/dist/api/internal/compat-projection.js.map +1 -1
  247. package/dist/api/internal/l3-bridge.d.ts +75 -42
  248. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  249. package/dist/api/internal/l3-bridge.js +105 -50
  250. package/dist/api/internal/l3-bridge.js.map +1 -1
  251. package/dist/api/internal/profile-wire.d.ts +31 -0
  252. package/dist/api/internal/profile-wire.d.ts.map +1 -0
  253. package/dist/api/internal/profile-wire.js +37 -0
  254. package/dist/api/internal/profile-wire.js.map +1 -0
  255. package/dist/api/internal/replica-role-table.js +2 -2
  256. package/dist/api/internal/replica-role-table.js.map +1 -1
  257. package/dist/api/loft.d.ts +66 -0
  258. package/dist/api/loft.d.ts.map +1 -0
  259. package/dist/api/loft.js +111 -0
  260. package/dist/api/loft.js.map +1 -0
  261. package/dist/api/measurement/index.d.ts +51 -0
  262. package/dist/api/measurement/index.d.ts.map +1 -0
  263. package/dist/api/measurement/index.js +71 -0
  264. package/dist/api/measurement/index.js.map +1 -0
  265. package/dist/api/occt-kernel-bridge.d.ts +5 -8
  266. package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
  267. package/dist/api/occt-kernel-bridge.js +18 -14
  268. package/dist/api/occt-kernel-bridge.js.map +1 -1
  269. package/dist/api/pattern.d.ts.map +1 -1
  270. package/dist/api/pattern.js +3 -4
  271. package/dist/api/pattern.js.map +1 -1
  272. package/dist/api/place.d.ts.map +1 -1
  273. package/dist/api/place.js +2 -4
  274. package/dist/api/place.js.map +1 -1
  275. package/dist/api/primitives.d.ts.map +1 -1
  276. package/dist/api/primitives.js +3 -4
  277. package/dist/api/primitives.js.map +1 -1
  278. package/dist/api/replicate.d.ts +28 -1
  279. package/dist/api/replicate.d.ts.map +1 -1
  280. package/dist/api/replicate.js +29 -19
  281. package/dist/api/replicate.js.map +1 -1
  282. package/dist/api/result.d.ts +6 -11
  283. package/dist/api/result.d.ts.map +1 -1
  284. package/dist/api/result.js +6 -11
  285. package/dist/api/result.js.map +1 -1
  286. package/dist/api/revolve.d.ts.map +1 -1
  287. package/dist/api/revolve.js +15 -14
  288. package/dist/api/revolve.js.map +1 -1
  289. package/dist/api/screw.d.ts +3 -0
  290. package/dist/api/screw.d.ts.map +1 -1
  291. package/dist/api/screw.js +9 -4
  292. package/dist/api/screw.js.map +1 -1
  293. package/dist/api/sdf.d.ts +1 -1
  294. package/dist/api/section-by-plane.d.ts +42 -0
  295. package/dist/api/section-by-plane.d.ts.map +1 -0
  296. package/dist/api/section-by-plane.js +61 -0
  297. package/dist/api/section-by-plane.js.map +1 -0
  298. package/dist/api/shell.d.ts +45 -0
  299. package/dist/api/shell.d.ts.map +1 -0
  300. package/dist/api/shell.js +73 -0
  301. package/dist/api/shell.js.map +1 -0
  302. package/dist/api/sketch.d.ts +8 -1
  303. package/dist/api/sketch.d.ts.map +1 -1
  304. package/dist/api/sketch.js +12 -7
  305. package/dist/api/sketch.js.map +1 -1
  306. package/dist/api/split-by-plane.d.ts +41 -0
  307. package/dist/api/split-by-plane.d.ts.map +1 -0
  308. package/dist/api/split-by-plane.js +60 -0
  309. package/dist/api/split-by-plane.js.map +1 -0
  310. package/dist/api/split.d.ts +6 -1
  311. package/dist/api/split.d.ts.map +1 -1
  312. package/dist/api/split.js +23 -9
  313. package/dist/api/split.js.map +1 -1
  314. package/dist/api/surface/arg-spec.d.ts +22 -0
  315. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  316. package/dist/api/surface/arg-spec.js +723 -476
  317. package/dist/api/surface/arg-spec.js.map +1 -1
  318. package/dist/api/sweep.d.ts +55 -0
  319. package/dist/api/sweep.d.ts.map +1 -0
  320. package/dist/api/sweep.js +86 -0
  321. package/dist/api/sweep.js.map +1 -0
  322. package/dist/api/thicken.d.ts +36 -0
  323. package/dist/api/thicken.d.ts.map +1 -0
  324. package/dist/api/thicken.js +55 -0
  325. package/dist/api/thicken.js.map +1 -0
  326. package/dist/api/transform.d.ts +8 -0
  327. package/dist/api/transform.d.ts.map +1 -1
  328. package/dist/api/transform.js +15 -4
  329. package/dist/api/transform.js.map +1 -1
  330. package/dist/api/view/cameraFns.d.ts +48 -0
  331. package/dist/api/view/cameraFns.d.ts.map +1 -0
  332. package/dist/api/view/cameraFns.js +75 -0
  333. package/dist/api/view/cameraFns.js.map +1 -0
  334. package/dist/api/view/projectionPlanes.d.ts +25 -0
  335. package/dist/api/view/projectionPlanes.d.ts.map +1 -0
  336. package/dist/api/view/projectionPlanes.js +30 -0
  337. package/dist/api/view/projectionPlanes.js.map +1 -0
  338. package/dist/api/view/view-camera.d.ts +2 -2
  339. package/dist/api/view/view-camera.d.ts.map +1 -1
  340. package/dist/api/view/view-camera.js +3 -3
  341. package/dist/api/view/view-camera.js.map +1 -1
  342. package/dist/api/view/view-projection.d.ts +9 -6
  343. package/dist/api/view/view-projection.d.ts.map +1 -1
  344. package/dist/api/view/view-projection.js +132 -65
  345. package/dist/api/view/view-projection.js.map +1 -1
  346. package/dist/api/wire.d.ts +45 -0
  347. package/dist/api/wire.d.ts.map +1 -0
  348. package/dist/api/wire.js +96 -0
  349. package/dist/api/wire.js.map +1 -0
  350. package/dist/boolean/creased-normals.d.ts +50 -0
  351. package/dist/boolean/creased-normals.d.ts.map +1 -0
  352. package/dist/boolean/creased-normals.js +114 -0
  353. package/dist/boolean/creased-normals.js.map +1 -0
  354. package/dist/boolean/deriveNormals.d.ts +4 -1
  355. package/dist/boolean/deriveNormals.d.ts.map +1 -1
  356. package/dist/boolean/deriveNormals.js +5 -2
  357. package/dist/boolean/deriveNormals.js.map +1 -1
  358. package/dist/brep/brep-ops.d.ts +6 -0
  359. package/dist/brep/brep-ops.d.ts.map +1 -1
  360. package/dist/brep/brep-ops.js +11 -2
  361. package/dist/brep/brep-ops.js.map +1 -1
  362. package/dist/brep/brep-topology.d.ts +4 -0
  363. package/dist/brep/brep-topology.d.ts.map +1 -1
  364. package/dist/brep/brep-topology.js +4 -0
  365. package/dist/brep/brep-topology.js.map +1 -1
  366. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  367. package/dist/brep/engine/adapters/brep-mock.js +79 -59
  368. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  369. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  370. package/dist/brep/engine/adapters/brepkit.js +7 -1
  371. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  372. package/dist/brep/engine/adapters/occt.d.ts +15 -7
  373. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  374. package/dist/brep/engine/adapters/occt.js +52 -167
  375. package/dist/brep/engine/adapters/occt.js.map +1 -1
  376. package/dist/brep/engine/primitives.d.ts +93 -130
  377. package/dist/brep/engine/primitives.d.ts.map +1 -1
  378. package/dist/brep/engine/primitives.js +9 -7
  379. package/dist/brep/engine/primitives.js.map +1 -1
  380. package/dist/brep/engine/types.d.ts +14 -1
  381. package/dist/brep/engine/types.d.ts.map +1 -1
  382. package/dist/brep/engine/types.js +11 -1
  383. package/dist/brep/engine/types.js.map +1 -1
  384. package/dist/brep/export/step.d.ts +3 -0
  385. package/dist/brep/export/step.d.ts.map +1 -1
  386. package/dist/brep/export/step.js +7 -1
  387. package/dist/brep/export/step.js.map +1 -1
  388. package/dist/brep/face-evolution.d.ts +8 -0
  389. package/dist/brep/face-evolution.d.ts.map +1 -1
  390. package/dist/brep/face-evolution.js +15 -3
  391. package/dist/brep/face-evolution.js.map +1 -1
  392. package/dist/brep/handle-bridge.d.ts +20 -2
  393. package/dist/brep/handle-bridge.d.ts.map +1 -1
  394. package/dist/brep/handle-bridge.js +25 -2
  395. package/dist/brep/handle-bridge.js.map +1 -1
  396. package/dist/brepkit-kernel/brepkitKernel.d.ts +25 -5
  397. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  398. package/dist/brepkit-kernel/brepkitKernel.js +336 -144
  399. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  400. package/dist/cad-runtime/admit-compat-lib.d.ts +6 -1
  401. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  402. package/dist/cad-runtime/admit-compat-lib.js +5 -1
  403. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  404. package/dist/cad-runtime/backend-dispatch.d.ts +9 -3
  405. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  406. package/dist/cad-runtime/backend-dispatch.js +32 -2
  407. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  408. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  409. package/dist/cad-runtime/direct-executor.js +8 -2
  410. package/dist/cad-runtime/direct-executor.js.map +1 -1
  411. package/dist/cad-runtime/runtime.d.ts +3 -0
  412. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  413. package/dist/cad-runtime/runtime.js +3 -1
  414. package/dist/cad-runtime/runtime.js.map +1 -1
  415. package/dist/define-op.d.ts +18 -2
  416. package/dist/define-op.d.ts.map +1 -1
  417. package/dist/define-op.js +29 -1
  418. package/dist/define-op.js.map +1 -1
  419. package/dist/env-agnostic.d.ts +3 -0
  420. package/dist/env-agnostic.d.ts.map +1 -1
  421. package/dist/env-agnostic.js +7 -0
  422. package/dist/env-agnostic.js.map +1 -1
  423. package/dist/index.d.ts.map +1 -1
  424. package/dist/index.js +3 -4
  425. package/dist/index.js.map +1 -1
  426. package/dist/lang/symbol-table.generated.d.ts +28 -0
  427. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  428. package/dist/lang/symbol-table.generated.js +29 -1
  429. package/dist/lang/symbol-table.generated.js.map +1 -1
  430. package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
  431. package/dist/occt-kernel/highLevelApi.js +6 -3
  432. package/dist/occt-kernel/highLevelApi.js.map +1 -1
  433. package/dist/occt-kernel/hullGeometry.d.ts +31 -0
  434. package/dist/occt-kernel/hullGeometry.d.ts.map +1 -0
  435. package/dist/occt-kernel/hullGeometry.js +319 -0
  436. package/dist/occt-kernel/hullGeometry.js.map +1 -0
  437. package/dist/occt-kernel/hullOps.d.ts +24 -0
  438. package/dist/occt-kernel/hullOps.d.ts.map +1 -0
  439. package/dist/occt-kernel/hullOps.js +52 -0
  440. package/dist/occt-kernel/hullOps.js.map +1 -0
  441. package/dist/occt-kernel/occt-primitives.d.ts +14 -0
  442. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -0
  443. package/dist/occt-kernel/occt-primitives.js +351 -0
  444. package/dist/occt-kernel/occt-primitives.js.map +1 -0
  445. package/dist/occt-kernel/occtKernel.d.ts +14 -6
  446. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  447. package/dist/occt-kernel/occtKernel.js +11 -3
  448. package/dist/occt-kernel/occtKernel.js.map +1 -1
  449. package/dist/occt-kernel/topologyExt.js +2 -2
  450. package/dist/occt-kernel/topologyExt.js.map +1 -1
  451. package/dist/primitives/brep-primitives.d.ts +4 -0
  452. package/dist/primitives/brep-primitives.d.ts.map +1 -1
  453. package/dist/primitives/brep-primitives.js +4 -0
  454. package/dist/primitives/brep-primitives.js.map +1 -1
  455. package/dist/result/bug.d.ts +22 -0
  456. package/dist/result/bug.d.ts.map +1 -0
  457. package/dist/result/bug.js +28 -0
  458. package/dist/result/bug.js.map +1 -0
  459. package/dist/result/errors.d.ts +270 -0
  460. package/dist/result/errors.d.ts.map +1 -0
  461. package/dist/result/errors.js +317 -0
  462. package/dist/result/errors.js.map +1 -0
  463. package/dist/result/kernelErrorTranslation.d.ts +21 -0
  464. package/dist/result/kernelErrorTranslation.d.ts.map +1 -0
  465. package/dist/result/kernelErrorTranslation.js +102 -0
  466. package/dist/result/kernelErrorTranslation.js.map +1 -0
  467. package/dist/result/result.d.ts +213 -0
  468. package/dist/result/result.d.ts.map +1 -0
  469. package/dist/result/result.js +336 -0
  470. package/dist/result/result.js.map +1 -0
  471. package/dist/result/vec3.d.ts +12 -0
  472. package/dist/result/vec3.d.ts.map +1 -0
  473. package/dist/result/vec3.js +14 -0
  474. package/dist/result/vec3.js.map +1 -0
  475. package/dist/runtime-state.d.ts +9 -0
  476. package/dist/runtime-state.d.ts.map +1 -1
  477. package/dist/runtime-state.js.map +1 -1
  478. package/dist/sdk.d.ts +3 -1
  479. package/dist/sdk.d.ts.map +1 -1
  480. package/dist/sdk.js +2 -1
  481. package/dist/sdk.js.map +1 -1
  482. package/dist/shape.d.ts +43 -1
  483. package/dist/shape.d.ts.map +1 -1
  484. package/dist/shape.js +57 -1
  485. package/dist/shape.js.map +1 -1
  486. package/dist/topology/naming/geom-hint.js +1 -1
  487. package/dist/topology/naming/geom-hint.js.map +1 -1
  488. package/dist/topology/naming/score.js +1 -1
  489. package/dist/topology/naming/score.js.map +1 -1
  490. package/package.json +6 -16
@@ -0,0 +1 @@
1
+ {"version":3,"file":"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"]}
@@ -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-mirror/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,443 @@
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
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list: prev/next non-null after construction
115
+ let cur = start.next;
116
+ while (cur !== start) {
117
+ count++;
118
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list traversal
119
+ cur = cur.next;
120
+ if (count > 10000)
121
+ break;
122
+ }
123
+ return count;
124
+ }
125
+ /** Time at which two moving bisectors from nodeA and nodeB intersect. */
126
+ function bisectorIntersectTime(a, b) {
127
+ const ddx = a.bx - b.bx;
128
+ const ddy = a.by - b.by;
129
+ const dxp = b.x - a.x;
130
+ const dyp = b.y - a.y;
131
+ if (Math.abs(ddx) < EPS && Math.abs(ddy) < EPS)
132
+ return null;
133
+ let t;
134
+ if (Math.abs(ddx) > Math.abs(ddy)) {
135
+ t = dxp / ddx;
136
+ }
137
+ else {
138
+ t = dyp / ddy;
139
+ }
140
+ if (t < EPS)
141
+ return null;
142
+ // Verify the other equation
143
+ const otherDd = Math.abs(ddx) > Math.abs(ddy) ? ddy : ddx;
144
+ const otherDp = Math.abs(ddx) > Math.abs(ddy) ? dyp : dxp;
145
+ if (Math.abs(otherDd) > EPS) {
146
+ const t2 = otherDp / otherDd;
147
+ if (Math.abs(t - t2) > 1e-4 * Math.max(1, Math.abs(t)))
148
+ return null;
149
+ }
150
+ return t;
151
+ }
152
+ /** Compute ray-segment intersection time for split events. */
153
+ function raySplitTime(node, eA, eB) {
154
+ const edx = eB.x - eA.x;
155
+ const edy = eB.y - eA.y;
156
+ const el = len2(edx, edy);
157
+ if (el < EPS)
158
+ return null;
159
+ const enx = -edy / el;
160
+ const eny = edx / el;
161
+ const d0 = (node.x - eA.x) * enx + (node.y - eA.y) * eny;
162
+ const relBx = node.bx - (eA.bx + eB.bx) / 2;
163
+ const relBy = node.by - (eA.by + eB.by) / 2;
164
+ const dRate = relBx * enx + relBy * eny;
165
+ if (Math.abs(dRate) < EPS)
166
+ return null;
167
+ const t = -d0 / dRate;
168
+ if (t < EPS)
169
+ return null;
170
+ const px = node.x + t * node.bx;
171
+ const py = node.y + t * node.by;
172
+ const ax = eA.x + t * eA.bx;
173
+ const ay = eA.y + t * eA.by;
174
+ const bxx = eB.x + t * eB.bx;
175
+ const byy = eB.y + t * eB.by;
176
+ const segDx = bxx - ax;
177
+ const segDy = byy - ay;
178
+ const segL = len2(segDx, segDy);
179
+ if (segL < EPS)
180
+ return t;
181
+ const s = dot2(px - ax, py - ay, segDx, segDy) / (segL * segL);
182
+ if (s < -0.01 || s > 1.01)
183
+ return null;
184
+ return t;
185
+ }
186
+ function computeEvents(lavNodes) {
187
+ const events = [];
188
+ for (const node of lavNodes) {
189
+ if (!node.active || !node.next)
190
+ continue;
191
+ const t = bisectorIntersectTime(node, node.next);
192
+ if (t !== null && t > EPS) {
193
+ const x = node.x + t * node.bx;
194
+ const y = node.y + t * node.by;
195
+ events.push({ time: t, x, y, nodeA: node, nodeB: node.next, type: 'edge' });
196
+ }
197
+ if (isLavNodeReflex(node)) {
198
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list traversal
199
+ let cur = node.next.next;
200
+ let count = 0;
201
+ while (cur !== node.prev && cur !== node && count < 1000) {
202
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list traversal
203
+ const st = raySplitTime(node, cur, cur.next);
204
+ if (st !== null && st > EPS) {
205
+ const x = node.x + st * node.bx;
206
+ const y = node.y + st * node.by;
207
+ events.push({ time: st, x, y, nodeA: node, nodeB: cur, type: 'split' });
208
+ }
209
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list traversal
210
+ cur = cur.next;
211
+ count++;
212
+ }
213
+ }
214
+ }
215
+ events.sort((a, b) => a.time - b.time);
216
+ return events;
217
+ }
218
+ // ---------------------------------------------------------------------------
219
+ // Main algorithm
220
+ // ---------------------------------------------------------------------------
221
+ /**
222
+ * Compute the straight skeleton of a simple polygon.
223
+ * The polygon vertices must define a simple (non-self-intersecting) polygon.
224
+ * They will be reordered to CCW if necessary.
225
+ *
226
+ * @param polygon - The input polygon vertices.
227
+ * @returns The computed straight skeleton.
228
+ */
229
+ export function computeStraightSkeleton(polygon) {
230
+ if (polygon.length < 3) {
231
+ return ok({ nodes: [], faces: [] });
232
+ }
233
+ try {
234
+ return ok(computeStraightSkeletonImpl(polygon));
235
+ }
236
+ catch (e) {
237
+ return err(computationError(BrepErrorCode.STRAIGHT_SKELETON_FAILED, e instanceof Error ? e.message : String(e), e));
238
+ }
239
+ }
240
+ /** Internal implementation — may throw on degenerate polygon indices. */
241
+ function computeStraightSkeletonImpl(polygon) {
242
+ const poly = ensureCCW(polygon);
243
+ const n = poly.length;
244
+ const skeletonNodes = [];
245
+ const vertexToSkelNodes = Array.from({ length: n }, () => []);
246
+ const lavNodes = createLav(poly);
247
+ let iterations = 0;
248
+ const maxIter = n * n * 2;
249
+ while (iterations < maxIter) {
250
+ iterations++;
251
+ const activeStart = lavNodes.find((nd) => nd.active);
252
+ if (!activeStart)
253
+ break;
254
+ const sz = lavSize(activeStart);
255
+ if (sz <= 3) {
256
+ if (sz === 3) {
257
+ const a = activeStart;
258
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list: 3-node LAV guaranteed non-null
259
+ const b = a.next;
260
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list: 3-node LAV guaranteed non-null
261
+ const c = b.next;
262
+ const t = bisectorIntersectTime(a, b);
263
+ const time = t !== null && t > EPS ? t : 0;
264
+ const mx = (a.x + b.x + c.x) / 3 + (time * (a.bx + b.bx + c.bx)) / 3;
265
+ const my = (a.y + b.y + c.y) / 3 + (time * (a.by + b.by + c.by)) / 3;
266
+ const nodeIdx = skeletonNodes.length;
267
+ skeletonNodes.push({ x: mx, y: my, height: time });
268
+ const aNodes = vertexToSkelNodes[a.origIdx];
269
+ const bNodes = vertexToSkelNodes[b.origIdx];
270
+ const cNodes = vertexToSkelNodes[c.origIdx];
271
+ if (aNodes)
272
+ aNodes.push(nodeIdx);
273
+ if (bNodes)
274
+ bNodes.push(nodeIdx);
275
+ if (cNodes)
276
+ cNodes.push(nodeIdx);
277
+ a.active = false;
278
+ b.active = false;
279
+ c.active = false;
280
+ }
281
+ else {
282
+ deactivateNodes(activeStart, sz);
283
+ }
284
+ continue;
285
+ }
286
+ const activeNodes = lavNodes.filter((nd) => nd.active);
287
+ const events = computeEvents(activeNodes);
288
+ if (events.length === 0) {
289
+ for (const nd of activeNodes) {
290
+ nd.active = false;
291
+ }
292
+ break;
293
+ }
294
+ const ev = events[0];
295
+ if (!ev)
296
+ break;
297
+ if (ev.type === 'edge') {
298
+ const a = ev.nodeA;
299
+ const b = ev.nodeB;
300
+ if (!a.active || !b.active)
301
+ continue;
302
+ const nodeIdx = skeletonNodes.length;
303
+ skeletonNodes.push({ x: ev.x, y: ev.y, height: ev.time });
304
+ const aNodes = vertexToSkelNodes[a.origIdx];
305
+ const bNodes = vertexToSkelNodes[b.origIdx];
306
+ if (aNodes)
307
+ aNodes.push(nodeIdx);
308
+ if (bNodes)
309
+ bNodes.push(nodeIdx);
310
+ a.x = ev.x;
311
+ a.y = ev.y;
312
+ a.next = b.next;
313
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list: b.next non-null in active LAV
314
+ b.next.prev = a;
315
+ b.active = false;
316
+ const lavPoly = [];
317
+ let cur = a;
318
+ do {
319
+ lavPoly.push({ x: cur.x, y: cur.y });
320
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list traversal
321
+ cur = cur.next;
322
+ } while (cur !== a);
323
+ const bDir = bisector(lavPoly, 0);
324
+ a.bx = bDir.dx;
325
+ a.by = bDir.dy;
326
+ }
327
+ else {
328
+ // Split event: reflex vertex `a` reaches opposite edge (nodeB, nodeB.next)
329
+ // Must split the LAV into two independent sub-LAVs
330
+ const a = ev.nodeA;
331
+ const b = ev.nodeB; // start of the opposite edge
332
+ if (!a.active || !b.active)
333
+ continue;
334
+ const nodeIdx = skeletonNodes.length;
335
+ skeletonNodes.push({ x: ev.x, y: ev.y, height: ev.time });
336
+ const aNodes = vertexToSkelNodes[a.origIdx];
337
+ if (aNodes)
338
+ aNodes.push(nodeIdx);
339
+ const bNodes = vertexToSkelNodes[b.origIdx];
340
+ if (bNodes)
341
+ bNodes.push(nodeIdx);
342
+ // Create a copy of `a` at the split point for the second sub-LAV
343
+ const aCopy = {
344
+ x: ev.x,
345
+ y: ev.y,
346
+ bx: 0,
347
+ by: 0,
348
+ origIdx: a.origIdx,
349
+ prev: null,
350
+ next: null,
351
+ active: true,
352
+ };
353
+ lavNodes.push(aCopy);
354
+ // Move `a` to the split point
355
+ a.x = ev.x;
356
+ a.y = ev.y;
357
+ // Rewire: LAV 1 runs a -> b.next -> ... -> a.prev -> a
358
+ // Rewire: LAV 2 runs aCopy -> a.next -> ... -> b -> aCopy
359
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list: active nodes have non-null prev/next
360
+ const aNext = a.next;
361
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list: active nodes have non-null prev/next
362
+ const bNext = b.next;
363
+ // LAV 1: a connects to b.next on the forward side
364
+ a.next = bNext;
365
+ bNext.prev = a;
366
+ // LAV 2: aCopy connects to a's old next on the forward side, b on the back
367
+ aCopy.next = aNext;
368
+ aNext.prev = aCopy;
369
+ aCopy.prev = b;
370
+ b.next = aCopy;
371
+ // Recompute bisectors for both split-point nodes
372
+ const buildLavPoly = (start) => {
373
+ const poly = [];
374
+ let c = start;
375
+ do {
376
+ poly.push({ x: c.x, y: c.y });
377
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list traversal
378
+ c = c.next;
379
+ } while (c !== start);
380
+ return poly;
381
+ };
382
+ const lav1Poly = buildLavPoly(a);
383
+ const bDir1 = bisector(lav1Poly, 0);
384
+ a.bx = bDir1.dx;
385
+ a.by = bDir1.dy;
386
+ const lav2Poly = buildLavPoly(aCopy);
387
+ const bDir2 = bisector(lav2Poly, 0);
388
+ aCopy.bx = bDir2.dx;
389
+ aCopy.by = bDir2.dy;
390
+ }
391
+ }
392
+ // Build faces: one face per original edge
393
+ const faces = [];
394
+ for (let i = 0; i < n; i++) {
395
+ const j = (i + 1) % n;
396
+ const pi = polyAt(poly, i);
397
+ const pj = polyAt(poly, j);
398
+ const faceVerts = [pi, pj];
399
+ const faceHeights = [0, 0];
400
+ const jNodes = vertexToSkelNodes[j];
401
+ const iNodes = vertexToSkelNodes[i];
402
+ if (jNodes) {
403
+ for (const ni of jNodes) {
404
+ const sn = skeletonNodes[ni];
405
+ if (sn) {
406
+ faceVerts.push({ x: sn.x, y: sn.y });
407
+ faceHeights.push(sn.height);
408
+ }
409
+ }
410
+ }
411
+ if (iNodes) {
412
+ for (let k = iNodes.length - 1; k >= 0; k--) {
413
+ const idx = iNodes[k];
414
+ if (idx === undefined)
415
+ continue;
416
+ const sn = skeletonNodes[idx];
417
+ if (!sn)
418
+ continue;
419
+ const lastVert = faceVerts[faceVerts.length - 1];
420
+ if (!lastVert)
421
+ continue;
422
+ const dist = len2(sn.x - lastVert.x, sn.y - lastVert.y);
423
+ if (dist > EPS) {
424
+ faceVerts.push({ x: sn.x, y: sn.y });
425
+ faceHeights.push(sn.height);
426
+ }
427
+ }
428
+ }
429
+ if (faceVerts.length >= 3) {
430
+ faces.push({ vertices: faceVerts, heights: faceHeights });
431
+ }
432
+ }
433
+ // Deduplicate skeleton nodes
434
+ const uniqueNodes = [];
435
+ for (const sn of skeletonNodes) {
436
+ const exists = uniqueNodes.some((un) => Math.abs(un.x - sn.x) < 0.01 && Math.abs(un.y - sn.y) < 0.01);
437
+ if (!exists) {
438
+ uniqueNodes.push(sn);
439
+ }
440
+ }
441
+ return { nodes: uniqueNodes, faces };
442
+ }
443
+ //# sourceMappingURL=straightSkeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"straightSkeleton.js","sourceRoot":"","sources":["../../../src/api/brep-mirror/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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list: prev/next non-null after construction\n let cur = start.next!;\n while (cur !== start) {\n count++;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list traversal\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list traversal\n let cur = node.next.next!;\n let count = 0;\n while (cur !== node.prev && cur !== node && count < 1000) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list traversal\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list traversal\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list: 3-node LAV guaranteed non-null\n const b = a.next!;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list: 3-node LAV guaranteed non-null\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list: b.next non-null in active LAV\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list traversal\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list: active nodes have non-null prev/next\n const aNext = a.next!;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list: active nodes have non-null prev/next\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 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- circular linked list traversal\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,55 @@
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 vendored `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 selfhosting (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 (vendored 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 (vendored 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 (vendored 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 (vendored sweepFns.ts#sweep).
36
+ *
37
+ * @param args - Resolved arguments (wire, spine, config, shellMode).
38
+ * @returns The swept solid as a `BrepHandle`.
39
+ */
40
+ export declare function sweepBrep(...args: unknown[]): Result<BrepHandle>;
41
+ /**
42
+ * Extrude a wire along a normal (vendored sweepFns.ts#complexExtrude).
43
+ *
44
+ * @param args - Resolved arguments (wire, center, normal, profile).
45
+ * @returns The extruded solid as a `BrepHandle`.
46
+ */
47
+ export declare function complexExtrudeBrep(...args: unknown[]): Result<BrepHandle>;
48
+ /**
49
+ * Extrude a wire along a helical path (vendored sweepFns.ts#twistExtrude).
50
+ *
51
+ * @param args - Resolved arguments (wire, angleDegrees, center, normal, profile).
52
+ * @returns The twisted extrusion as a `BrepHandle`.
53
+ */
54
+ export declare function twistExtrudeBrep(...args: unknown[]): Result<BrepHandle>;
55
+ //# sourceMappingURL=sweepFns.d.ts.map