@faicad/faijs 0.16.1 → 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,178 @@
1
+ /**
2
+ * Self-hosted compat-op implementations — pattern family
3
+ * (core-decouple Phase 3, §5.4; G4).
4
+ *
5
+ * @platform occt
6
+ *
7
+ * Semantics mirror vendored `operations/patternFns.ts` + `compoundOpsFns.ts`
8
+ * rectangularPattern, on the L1 pattern primitives (occt-primitives:
9
+ * native compound split per replica; gridPattern pre-fused compound).
10
+ * Guards: PATTERN_INVALID_COUNT / PATTERN_ZERO_DIRECTION / PATTERN_ZERO_AXIS.
11
+ */
12
+ import { getBrepApi } from '../../brep/handle-bridge.js';
13
+ import { ok, err } from '../../result/result.js';
14
+ import { validationError } from '../../result/errors.js';
15
+ import { resolveArgs } from '../internal/dual-form-args.js';
16
+ import { brepHandleOf } from './brepHelpers.js';
17
+ const LINEAR_PATTERN_PARAMS = { name: 'linearPattern', params: ['shape', 'direction', 'count', 'spacing'], formClass: 'A' };
18
+ const CIRCULAR_PATTERN_PARAMS = { name: 'circularPattern', params: ['shape', 'axis', 'count', 'fullAngle', 'center'], formClass: 'A' };
19
+ const GRID_PATTERN_PARAMS = { name: 'gridPattern', params: ['shape', 'directionX', 'directionY', 'countX', 'countY', 'spacingX', 'spacingY'], formClass: 'A' };
20
+ const RECT_PATTERN_PARAMS = { name: 'rectangularPattern', params: ['shape', 'options'], formClass: 'A' };
21
+ function vecIsZero(v) {
22
+ return v[0] === 0 && v[1] === 0 && v[2] === 0;
23
+ }
24
+ function vecNormalize(v) {
25
+ const len = Math.hypot(v[0], v[1], v[2]);
26
+ return [v[0] / len, v[1] / len, v[2] / len];
27
+ }
28
+ /** fuse 全部 replicas 并释放中间句柄(vendored fuseAll sameFace 等价)。 */
29
+ function fuseReplicas(kernel, copies) {
30
+ const fused = kernel.fuseAll(copies);
31
+ for (const c of copies)
32
+ kernel.release(c);
33
+ return fused;
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // linearPattern — 沿方向复制(vendored patternFns.ts#linearPattern)
37
+ // ---------------------------------------------------------------------------
38
+ /**
39
+ * Linear pattern — copy a shape along a direction (vendored patternFns.ts#linearPattern).
40
+ *
41
+ * @param args - Resolved arguments (shape, direction, count, spacing).
42
+ * @returns The fused pattern copies as a `BrepHandle`.
43
+ */
44
+ export function linearPatternBrep(...args) {
45
+ const [shape, direction, count, spacing] = resolveArgs(args, LINEAR_PATTERN_PARAMS);
46
+ const kernel = getBrepApi();
47
+ const s = brepHandleOf(shape);
48
+ const n = Number(count);
49
+ if (n < 1) {
50
+ return err(validationError('PATTERN_INVALID_COUNT', 'Pattern count must be at least 1'));
51
+ }
52
+ if (n === 1)
53
+ return ok(s);
54
+ const dir = (direction ?? [0, 0, 0]);
55
+ if (vecIsZero(dir)) {
56
+ return err(validationError('PATTERN_ZERO_DIRECTION', 'Pattern direction cannot be zero'));
57
+ }
58
+ const nn = vecNormalize([dir[0], dir[1], dir[2]]);
59
+ const copies = kernel.linearPattern(s, { x: nn[0], y: nn[1], z: nn[2] }, Number(spacing), n);
60
+ return ok(fuseReplicas(kernel, copies));
61
+ }
62
+ // ---------------------------------------------------------------------------
63
+ // circularPattern — 绕轴环形复制(vendored patternFns.ts#circularPattern)
64
+ // ---------------------------------------------------------------------------
65
+ /**
66
+ * Circular pattern — copy a shape around an axis (vendored patternFns.ts#circularPattern).
67
+ *
68
+ * @param args - Resolved arguments (shape, axis, count, fullAngle, center).
69
+ * @returns The fused pattern copies as a `BrepHandle`.
70
+ */
71
+ export function circularPatternBrep(...args) {
72
+ const [shape, axis, count, fullAngle, center] = resolveArgs(args, CIRCULAR_PATTERN_PARAMS);
73
+ const kernel = getBrepApi();
74
+ const s = brepHandleOf(shape);
75
+ const n = Number(count);
76
+ if (n < 1) {
77
+ return err(validationError('PATTERN_INVALID_COUNT', 'Pattern count must be at least 1'));
78
+ }
79
+ if (n === 1)
80
+ return ok(s);
81
+ const ax = (axis ?? [0, 0, 0]);
82
+ if (vecIsZero(ax)) {
83
+ return err(validationError('PATTERN_ZERO_AXIS', 'Pattern axis cannot be zero'));
84
+ }
85
+ const angleStep = (fullAngle === undefined ? 360 : Number(fullAngle)) / n;
86
+ const c = (center ?? [0, 0, 0]);
87
+ const copies = kernel.circularPattern(s, { x: c[0], y: c[1], z: c[2] }, { x: ax[0], y: ax[1], z: ax[2] }, angleStep, n);
88
+ return ok(fuseReplicas(kernel, copies));
89
+ }
90
+ // ---------------------------------------------------------------------------
91
+ // gridPattern — 二维网格复制(vendored patternFns.ts#gridPattern)
92
+ // ---------------------------------------------------------------------------
93
+ /**
94
+ * Grid pattern — 2D grid copies of a shape (vendored patternFns.ts#gridPattern).
95
+ *
96
+ * @param args - Resolved arguments (shape, directions, counts, spacings).
97
+ * @returns The fused pattern copies as a `BrepHandle`.
98
+ */
99
+ export function gridPatternBrep(...args) {
100
+ const [shape, directionX, directionY, countX, countY, spacingX, spacingY] = resolveArgs(args, GRID_PATTERN_PARAMS);
101
+ const kernel = getBrepApi();
102
+ const s = brepHandleOf(shape);
103
+ const nx = Number(countX);
104
+ const ny = Number(countY);
105
+ if (nx < 1 || ny < 1) {
106
+ return err(validationError('PATTERN_INVALID_COUNT', 'Grid pattern counts must be at least 1'));
107
+ }
108
+ if (nx === 1 && ny === 1)
109
+ return ok(s);
110
+ const dx = (directionX ?? [0, 0, 0]);
111
+ const dy = (directionY ?? [0, 0, 0]);
112
+ if (vecIsZero(dx)) {
113
+ return err(validationError('PATTERN_ZERO_DIRECTION', 'Grid directionX cannot be zero'));
114
+ }
115
+ if (vecIsZero(dy)) {
116
+ return err(validationError('PATTERN_ZERO_DIRECTION', 'Grid directionY cannot be zero'));
117
+ }
118
+ const nx2 = vecNormalize([dx[0], dx[1], dx[2]]);
119
+ const ny2 = vecNormalize([dy[0], dy[1], dy[2]]);
120
+ // core gridPattern 已组合复制并 fuse 成单个 compound/solid
121
+ return ok(kernel.gridPattern(s, { x: nx2[0], y: nx2[1], z: nx2[2] }, { x: ny2[0], y: ny2[1], z: ny2[2] }, Number(spacingX), Number(spacingY), nx, ny));
122
+ }
123
+ // ---------------------------------------------------------------------------
124
+ // rectangularPattern — 双向矩形阵列(vendored compoundOpsFns.ts#rectangularPattern)
125
+ // ---------------------------------------------------------------------------
126
+ /**
127
+ * Rectangular pattern — two-direction rectangular array
128
+ * (vendored compoundOpsFns.ts#rectangularPattern).
129
+ *
130
+ * @param args - Resolved arguments (shape, rectangular pattern options).
131
+ * @returns The fused pattern copies as a `BrepHandle`.
132
+ */
133
+ export function rectangularPatternBrep(...args) {
134
+ const [shape, options] = resolveArgs(args, RECT_PATTERN_PARAMS);
135
+ const kernel = getBrepApi();
136
+ const s = brepHandleOf(shape);
137
+ const { xDir, xCount, xSpacing, yDir, yCount, ySpacing } = (options ?? {});
138
+ const xc = Number(xCount ?? 0);
139
+ const yc = Number(yCount ?? 0);
140
+ const xs = Number(xSpacing ?? 0);
141
+ const ys = Number(ySpacing ?? 0);
142
+ if (xc < 1 || yc < 1) {
143
+ return err(validationError('PATTERN_INVALID_COUNT', 'Pattern counts must be at least 1'));
144
+ }
145
+ if (xc === 1 && yc === 1)
146
+ return ok(s);
147
+ const xd = (xDir ?? [0, 0, 0]);
148
+ const yd = (yDir ?? [0, 0, 0]);
149
+ if (vecIsZero(xd)) {
150
+ return err(validationError('PATTERN_ZERO_DIRECTION', 'X direction cannot be zero'));
151
+ }
152
+ if (vecIsZero(yd)) {
153
+ return err(validationError('PATTERN_ZERO_DIRECTION', 'Y direction cannot be zero'));
154
+ }
155
+ const xNorm = vecNormalize([xd[0], xd[1], xd[2]]);
156
+ const yNorm = vecNormalize([yd[0], yd[1], yd[2]]);
157
+ const copies = [s];
158
+ const owned = [];
159
+ for (let xi = 0; xi < xc; xi++) {
160
+ for (let yi = 0; yi < yc; yi++) {
161
+ if (xi === 0 && yi === 0)
162
+ continue;
163
+ const offset = [
164
+ xNorm[0] * xs * xi + yNorm[0] * ys * yi,
165
+ xNorm[1] * xs * xi + yNorm[1] * ys * yi,
166
+ xNorm[2] * xs * xi + yNorm[2] * ys * yi,
167
+ ];
168
+ const c = kernel.translate(s, offset[0], offset[1], offset[2]);
169
+ copies.push(c);
170
+ owned.push(c);
171
+ }
172
+ }
173
+ const fused = kernel.fuseAll(copies);
174
+ for (const c of owned)
175
+ kernel.release(c);
176
+ return ok(fused);
177
+ }
178
+ //# sourceMappingURL=patternFns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patternFns.js","sourceRoot":"","sources":["../../../src/api/brep-mirror/patternFns.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Self-hosted compat-op implementations — pattern family\n * (core-decouple Phase 3, §5.4; G4).\n *\n * @platform occt\n *\n * Semantics mirror vendored `operations/patternFns.ts` + `compoundOpsFns.ts`\n * rectangularPattern, on the L1 pattern primitives (occt-primitives:\n * native compound split per replica; gridPattern pre-fused compound).\n * Guards: PATTERN_INVALID_COUNT / PATTERN_ZERO_DIRECTION / PATTERN_ZERO_AXIS.\n */\n\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { ok, err, type Result } from '../../result/result'\nimport { validationError } from '../../result/errors'\nimport type { FormClass } from '../internal/dual-form-args'\nimport { resolveArgs } from '../internal/dual-form-args'\nimport type { Vec3 } from '../brepjs-compat/types'\nimport { brepHandleOf } from './brepHelpers'\n\nconst LINEAR_PATTERN_PARAMS = { name: 'linearPattern', params: ['shape', 'direction', 'count', 'spacing'], formClass: 'A' as FormClass }\nconst CIRCULAR_PATTERN_PARAMS = { name: 'circularPattern', params: ['shape', 'axis', 'count', 'fullAngle', 'center'], formClass: 'A' as FormClass }\nconst GRID_PATTERN_PARAMS = { name: 'gridPattern', params: ['shape', 'directionX', 'directionY', 'countX', 'countY', 'spacingX', 'spacingY'], formClass: 'A' as FormClass }\nconst RECT_PATTERN_PARAMS = { name: 'rectangularPattern', params: ['shape', 'options'], formClass: 'A' as FormClass }\n\nfunction vecIsZero(v: readonly number[]): boolean {\n return v[0] === 0 && v[1] === 0 && v[2] === 0\n}\n\nfunction vecNormalize(v: readonly [number, number, number]): [number, number, number] {\n const len = Math.hypot(v[0], v[1], v[2])\n return [v[0] / len, v[1] / len, v[2] / len]\n}\n\n/** fuse 全部 replicas 并释放中间句柄(vendored fuseAll sameFace 等价)。 */\nfunction fuseReplicas(kernel: ReturnType<typeof getBrepApi>, copies: BrepHandle[]): BrepHandle {\n const fused = kernel.fuseAll(copies)\n for (const c of copies) kernel.release(c)\n return fused\n}\n\n// ---------------------------------------------------------------------------\n// linearPattern — 沿方向复制(vendored patternFns.ts#linearPattern)\n// ---------------------------------------------------------------------------\n\n/**\n * Linear pattern — copy a shape along a direction (vendored patternFns.ts#linearPattern).\n *\n * @param args - Resolved arguments (shape, direction, count, spacing).\n * @returns The fused pattern copies as a `BrepHandle`.\n */\nexport function linearPatternBrep(...args: unknown[]): Result<BrepHandle> {\n const [shape, direction, count, spacing] = resolveArgs(args, LINEAR_PATTERN_PARAMS)\n const kernel = getBrepApi()\n const s = brepHandleOf(shape)\n const n = Number(count)\n if (n < 1) {\n return err(validationError('PATTERN_INVALID_COUNT', 'Pattern count must be at least 1'))\n }\n if (n === 1) return ok(s)\n const dir = (direction ?? [0, 0, 0]) as Vec3\n if (vecIsZero(dir)) {\n return err(validationError('PATTERN_ZERO_DIRECTION', 'Pattern direction cannot be zero'))\n }\n const nn = vecNormalize([dir[0], dir[1], dir[2]])\n const copies = kernel.linearPattern(\n s,\n { x: nn[0], y: nn[1], z: nn[2] },\n Number(spacing),\n n,\n )\n return ok(fuseReplicas(kernel, copies))\n}\n\n// ---------------------------------------------------------------------------\n// circularPattern — 绕轴环形复制(vendored patternFns.ts#circularPattern)\n// ---------------------------------------------------------------------------\n\n/**\n * Circular pattern — copy a shape around an axis (vendored patternFns.ts#circularPattern).\n *\n * @param args - Resolved arguments (shape, axis, count, fullAngle, center).\n * @returns The fused pattern copies as a `BrepHandle`.\n */\nexport function circularPatternBrep(...args: unknown[]): Result<BrepHandle> {\n const [shape, axis, count, fullAngle, center] = resolveArgs(args, CIRCULAR_PATTERN_PARAMS)\n const kernel = getBrepApi()\n const s = brepHandleOf(shape)\n const n = Number(count)\n if (n < 1) {\n return err(validationError('PATTERN_INVALID_COUNT', 'Pattern count must be at least 1'))\n }\n if (n === 1) return ok(s)\n const ax = (axis ?? [0, 0, 0]) as Vec3\n if (vecIsZero(ax)) {\n return err(validationError('PATTERN_ZERO_AXIS', 'Pattern axis cannot be zero'))\n }\n const angleStep = (fullAngle === undefined ? 360 : Number(fullAngle)) / n\n const c = (center ?? [0, 0, 0]) as Vec3\n const copies = kernel.circularPattern(\n s,\n { x: c[0], y: c[1], z: c[2] },\n { x: ax[0], y: ax[1], z: ax[2] },\n angleStep,\n n,\n )\n return ok(fuseReplicas(kernel, copies))\n}\n\n// ---------------------------------------------------------------------------\n// gridPattern — 二维网格复制(vendored patternFns.ts#gridPattern)\n// ---------------------------------------------------------------------------\n\n/**\n * Grid pattern — 2D grid copies of a shape (vendored patternFns.ts#gridPattern).\n *\n * @param args - Resolved arguments (shape, directions, counts, spacings).\n * @returns The fused pattern copies as a `BrepHandle`.\n */\nexport function gridPatternBrep(...args: unknown[]): Result<BrepHandle> {\n const [shape, directionX, directionY, countX, countY, spacingX, spacingY] = resolveArgs(args, GRID_PATTERN_PARAMS)\n const kernel = getBrepApi()\n const s = brepHandleOf(shape)\n const nx = Number(countX)\n const ny = Number(countY)\n if (nx < 1 || ny < 1) {\n return err(validationError('PATTERN_INVALID_COUNT', 'Grid pattern counts must be at least 1'))\n }\n if (nx === 1 && ny === 1) return ok(s)\n const dx = (directionX ?? [0, 0, 0]) as Vec3\n const dy = (directionY ?? [0, 0, 0]) as Vec3\n if (vecIsZero(dx)) {\n return err(validationError('PATTERN_ZERO_DIRECTION', 'Grid directionX cannot be zero'))\n }\n if (vecIsZero(dy)) {\n return err(validationError('PATTERN_ZERO_DIRECTION', 'Grid directionY cannot be zero'))\n }\n const nx2 = vecNormalize([dx[0], dx[1], dx[2]])\n const ny2 = vecNormalize([dy[0], dy[1], dy[2]])\n // core gridPattern 已组合复制并 fuse 成单个 compound/solid\n return ok(\n kernel.gridPattern(\n s,\n { x: nx2[0], y: nx2[1], z: nx2[2] },\n { x: ny2[0], y: ny2[1], z: ny2[2] },\n Number(spacingX),\n Number(spacingY),\n nx,\n ny,\n ),\n )\n}\n\n// ---------------------------------------------------------------------------\n// rectangularPattern — 双向矩形阵列(vendored compoundOpsFns.ts#rectangularPattern)\n// ---------------------------------------------------------------------------\n\n/**\n * Rectangular pattern — two-direction rectangular array\n * (vendored compoundOpsFns.ts#rectangularPattern).\n *\n * @param args - Resolved arguments (shape, rectangular pattern options).\n * @returns The fused pattern copies as a `BrepHandle`.\n */\nexport function rectangularPatternBrep(...args: unknown[]): Result<BrepHandle> {\n const [shape, options] = resolveArgs(args, RECT_PATTERN_PARAMS)\n const kernel = getBrepApi()\n const s = brepHandleOf(shape)\n const { xDir, xCount, xSpacing, yDir, yCount, ySpacing } = (options ?? {}) as {\n xDir?: Vec3\n xCount?: number\n xSpacing?: number\n yDir?: Vec3\n yCount?: number\n ySpacing?: number\n }\n const xc = Number(xCount ?? 0)\n const yc = Number(yCount ?? 0)\n const xs = Number(xSpacing ?? 0)\n const ys = Number(ySpacing ?? 0)\n if (xc < 1 || yc < 1) {\n return err(validationError('PATTERN_INVALID_COUNT', 'Pattern counts must be at least 1'))\n }\n if (xc === 1 && yc === 1) return ok(s)\n const xd = (xDir ?? [0, 0, 0]) as Vec3\n const yd = (yDir ?? [0, 0, 0]) as Vec3\n if (vecIsZero(xd)) {\n return err(validationError('PATTERN_ZERO_DIRECTION', 'X direction cannot be zero'))\n }\n if (vecIsZero(yd)) {\n return err(validationError('PATTERN_ZERO_DIRECTION', 'Y direction cannot be zero'))\n }\n const xNorm = vecNormalize([xd[0], xd[1], xd[2]])\n const yNorm = vecNormalize([yd[0], yd[1], yd[2]])\n const copies: BrepHandle[] = [s]\n const owned: BrepHandle[] = []\n for (let xi = 0; xi < xc; xi++) {\n for (let yi = 0; yi < yc; yi++) {\n if (xi === 0 && yi === 0) continue\n const offset: Vec3 = [\n xNorm[0] * xs * xi + yNorm[0] * ys * yi,\n xNorm[1] * xs * xi + yNorm[1] * ys * yi,\n xNorm[2] * xs * xi + yNorm[2] * ys * yi,\n ]\n const c = kernel.translate(s, offset[0], offset[1], offset[2])\n copies.push(c)\n owned.push(c)\n }\n }\n const fused = kernel.fuseAll(copies)\n for (const c of owned) kernel.release(c)\n return ok(fused)\n}\n"]}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Self-hosted compat-op implementations — solid primitives
3
+ * (core-decouple Phase 3, §5.4).
4
+ *
5
+ * @platform occt
6
+ *
7
+ * Brep-shaped implementations for `torus`, `ellipsoid`, `makeBaseBox`.
8
+ * Semantics mirror vendored `topology/primitiveFns.ts` + `solidBuilders.ts`
9
+ * (`makeTorus`/`makeEllipsoid` take at/axis placement) and
10
+ * `sketching/shortcuts.ts` `makeBaseBox` (origin-centered XY rectangle extruded
11
+ * along +Z). Placement is composed from L1 `translate`/`generalTransform`
12
+ * since the L1 `makeTorus`/`makeEllipsoid` signatures carry no location.
13
+ */
14
+ import type { BrepHandle } from '../../brep/engine/types.js';
15
+ import { type Result } from '../../result/result.js';
16
+ /**
17
+ * Create a torus (vendored `torus(majorRadius, minorRadius, {at, axis})`).
18
+ *
19
+ * The L1 `makeTorus(major, minor)` builds the ring on the +Z axis at the
20
+ * origin; placement is composed afterwards (`axis` → rotation, `at` →
21
+ * translation).
22
+ *
23
+ * @param args - Resolved arguments (majorRadius, minorRadius, placement options).
24
+ * @returns The torus as a `BrepHandle`.
25
+ */
26
+ export declare function torusBrep(...args: unknown[]): Result<BrepHandle>;
27
+ /**
28
+ * Create an ellipsoid (vendored `ellipsoid(rx, ry, rz, {at})`).
29
+ *
30
+ * @param args - Resolved arguments (rx, ry, rz, placement options).
31
+ * @returns The ellipsoid as a `BrepHandle`.
32
+ */
33
+ export declare function ellipsoidBrep(...args: unknown[]): Result<BrepHandle>;
34
+ /**
35
+ * Create a base box: origin-centered XY rectangle extruded by `zLength` along
36
+ * +Z (vendored `makeBaseBox(xLength, yLength, zLength)` via the sketcher).
37
+ *
38
+ * @param args - Resolved arguments (xLength, yLength, zLength).
39
+ * @returns The box as a `BrepHandle`.
40
+ */
41
+ export declare function makeBaseBoxBrep(...args: unknown[]): Result<BrepHandle>;
42
+ //# sourceMappingURL=primitiveFns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitiveFns.d.ts","sourceRoot":"","sources":["../../../src/api/brep-mirror/primitiveFns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEzD,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAsB1D;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAkBhE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAapE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAetE"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Self-hosted compat-op implementations — solid primitives
3
+ * (core-decouple Phase 3, §5.4).
4
+ *
5
+ * @platform occt
6
+ *
7
+ * Brep-shaped implementations for `torus`, `ellipsoid`, `makeBaseBox`.
8
+ * Semantics mirror vendored `topology/primitiveFns.ts` + `solidBuilders.ts`
9
+ * (`makeTorus`/`makeEllipsoid` take at/axis placement) and
10
+ * `sketching/shortcuts.ts` `makeBaseBox` (origin-centered XY rectangle extruded
11
+ * along +Z). Placement is composed from L1 `translate`/`generalTransform`
12
+ * since the L1 `makeTorus`/`makeEllipsoid` signatures carry no location.
13
+ */
14
+ import { getBrepApi } from '../../brep/handle-bridge.js';
15
+ import { ok, err } from '../../result/result.js';
16
+ import { kernelError } from '../../result/errors.js';
17
+ import { resolveArgs } from '../internal/dual-form-args.js';
18
+ import { rotationZTo } from './brepHelpers.js';
19
+ const TORUS_PARAMS = { name: 'torus', params: ['majorRadius', 'minorRadius', 'options'], formClass: 'A' };
20
+ const ELLIPSOID_PARAMS = { name: 'ellipsoid', params: ['rx', 'ry', 'rz', 'options'], formClass: 'A' };
21
+ const MAKE_BASE_BOX_PARAMS = {
22
+ name: 'makeBaseBox',
23
+ params: ['xLength', 'yLength', 'zLength'],
24
+ formClass: 'A',
25
+ };
26
+ /** Translate a handle, releasing the intermediate (kernel returns a fresh one). */
27
+ function translated(kernel, h, v) {
28
+ const next = kernel.translate(h, v[0], v[1], v[2]);
29
+ kernel.release(h);
30
+ return next;
31
+ }
32
+ /**
33
+ * Create a torus (vendored `torus(majorRadius, minorRadius, {at, axis})`).
34
+ *
35
+ * The L1 `makeTorus(major, minor)` builds the ring on the +Z axis at the
36
+ * origin; placement is composed afterwards (`axis` → rotation, `at` →
37
+ * translation).
38
+ *
39
+ * @param args - Resolved arguments (majorRadius, minorRadius, placement options).
40
+ * @returns The torus as a `BrepHandle`.
41
+ */
42
+ export function torusBrep(...args) {
43
+ const [majorRadius, minorRadius, options] = resolveArgs(args, TORUS_PARAMS);
44
+ const opts = (options ?? {});
45
+ const kernel = getBrepApi();
46
+ try {
47
+ let h = kernel.makeTorus(majorRadius, minorRadius);
48
+ if (opts.axis && !(opts.axis[0] === 0 && opts.axis[1] === 0 && opts.axis[2] === 1)) {
49
+ const rotated = kernel.generalTransform(h, rotationZTo(opts.axis));
50
+ kernel.release(h);
51
+ h = rotated;
52
+ }
53
+ if (opts.at)
54
+ h = translated(kernel, h, opts.at);
55
+ return ok(h);
56
+ }
57
+ catch (e) {
58
+ return err(kernelError('TORUS_FAILED', `torus: kernel failure: ${e instanceof Error ? e.message : String(e)}`, e));
59
+ }
60
+ }
61
+ /**
62
+ * Create an ellipsoid (vendored `ellipsoid(rx, ry, rz, {at})`).
63
+ *
64
+ * @param args - Resolved arguments (rx, ry, rz, placement options).
65
+ * @returns The ellipsoid as a `BrepHandle`.
66
+ */
67
+ export function ellipsoidBrep(...args) {
68
+ const [rx, ry, rz, options] = resolveArgs(args, ELLIPSOID_PARAMS);
69
+ const opts = (options ?? {});
70
+ const kernel = getBrepApi();
71
+ try {
72
+ let h = kernel.makeEllipsoid(rx, ry, rz);
73
+ if (opts.at)
74
+ h = translated(kernel, h, opts.at);
75
+ return ok(h);
76
+ }
77
+ catch (e) {
78
+ return err(kernelError('ELLIPSOID_FAILED', `ellipsoid: kernel failure: ${e instanceof Error ? e.message : String(e)}`, e));
79
+ }
80
+ }
81
+ /**
82
+ * Create a base box: origin-centered XY rectangle extruded by `zLength` along
83
+ * +Z (vendored `makeBaseBox(xLength, yLength, zLength)` via the sketcher).
84
+ *
85
+ * @param args - Resolved arguments (xLength, yLength, zLength).
86
+ * @returns The box as a `BrepHandle`.
87
+ */
88
+ export function makeBaseBoxBrep(...args) {
89
+ const [xLength, yLength, zLength] = resolveArgs(args, MAKE_BASE_BOX_PARAMS);
90
+ const kernel = getBrepApi();
91
+ try {
92
+ const rect = kernel.makeRectangle(xLength, yLength);
93
+ try {
94
+ return ok(kernel.extrude(rect, 0, 0, zLength));
95
+ }
96
+ finally {
97
+ kernel.release(rect);
98
+ }
99
+ }
100
+ catch (e) {
101
+ return err(kernelError('MAKE_BASE_BOX_FAILED', `makeBaseBox: kernel failure: ${e instanceof Error ? e.message : String(e)}`, e));
102
+ }
103
+ }
104
+ //# sourceMappingURL=primitiveFns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitiveFns.js","sourceRoot":"","sources":["../../../src/api/brep-mirror/primitiveFns.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Self-hosted compat-op implementations — solid primitives\n * (core-decouple Phase 3, §5.4).\n *\n * @platform occt\n *\n * Brep-shaped implementations for `torus`, `ellipsoid`, `makeBaseBox`.\n * Semantics mirror vendored `topology/primitiveFns.ts` + `solidBuilders.ts`\n * (`makeTorus`/`makeEllipsoid` take at/axis placement) and\n * `sketching/shortcuts.ts` `makeBaseBox` (origin-centered XY rectangle extruded\n * along +Z). Placement is composed from L1 `translate`/`generalTransform`\n * since the L1 `makeTorus`/`makeEllipsoid` signatures carry no location.\n */\n\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { ok, err, type Result } from '../../result/result'\nimport { kernelError } from '../../result/errors'\nimport type { FormClass } from '../internal/dual-form-args'\nimport { resolveArgs } from '../internal/dual-form-args'\nimport type { Vec3 } from '../brepjs-compat/types'\nimport { rotationZTo } from './brepHelpers'\n\nconst TORUS_PARAMS = { name: 'torus', params: ['majorRadius', 'minorRadius', 'options'], formClass: 'A' as FormClass }\nconst ELLIPSOID_PARAMS = { name: 'ellipsoid', params: ['rx', 'ry', 'rz', 'options'], formClass: 'A' as FormClass }\nconst MAKE_BASE_BOX_PARAMS = {\n name: 'makeBaseBox',\n params: ['xLength', 'yLength', 'zLength'],\n formClass: 'A' as FormClass,\n}\n\n/** Translate a handle, releasing the intermediate (kernel returns a fresh one). */\nfunction translated(kernel: ReturnType<typeof getBrepApi>, h: BrepHandle, v: Vec3): BrepHandle {\n const next = kernel.translate(h, v[0], v[1], v[2])\n kernel.release(h)\n return next\n}\n\n/**\n * Create a torus (vendored `torus(majorRadius, minorRadius, {at, axis})`).\n *\n * The L1 `makeTorus(major, minor)` builds the ring on the +Z axis at the\n * origin; placement is composed afterwards (`axis` → rotation, `at` →\n * translation).\n *\n * @param args - Resolved arguments (majorRadius, minorRadius, placement options).\n * @returns The torus as a `BrepHandle`.\n */\nexport function torusBrep(...args: unknown[]): Result<BrepHandle> {\n const [majorRadius, minorRadius, options] = resolveArgs(args, TORUS_PARAMS)\n const opts = (options ?? {}) as { at?: Vec3; axis?: Vec3 }\n const kernel = getBrepApi()\n try {\n let h = kernel.makeTorus(majorRadius as number, minorRadius as number)\n if (opts.axis && !(opts.axis[0] === 0 && opts.axis[1] === 0 && opts.axis[2] === 1)) {\n const rotated = kernel.generalTransform(h, rotationZTo(opts.axis))\n kernel.release(h)\n h = rotated\n }\n if (opts.at) h = translated(kernel, h, opts.at)\n return ok(h)\n } catch (e) {\n return err(\n kernelError('TORUS_FAILED', `torus: kernel failure: ${e instanceof Error ? e.message : String(e)}`, e),\n )\n }\n}\n\n/**\n * Create an ellipsoid (vendored `ellipsoid(rx, ry, rz, {at})`).\n *\n * @param args - Resolved arguments (rx, ry, rz, placement options).\n * @returns The ellipsoid as a `BrepHandle`.\n */\nexport function ellipsoidBrep(...args: unknown[]): Result<BrepHandle> {\n const [rx, ry, rz, options] = resolveArgs(args, ELLIPSOID_PARAMS)\n const opts = (options ?? {}) as { at?: Vec3 }\n const kernel = getBrepApi()\n try {\n let h = kernel.makeEllipsoid(rx as number, ry as number, rz as number)\n if (opts.at) h = translated(kernel, h, opts.at)\n return ok(h)\n } catch (e) {\n return err(\n kernelError('ELLIPSOID_FAILED', `ellipsoid: kernel failure: ${e instanceof Error ? e.message : String(e)}`, e),\n )\n }\n}\n\n/**\n * Create a base box: origin-centered XY rectangle extruded by `zLength` along\n * +Z (vendored `makeBaseBox(xLength, yLength, zLength)` via the sketcher).\n *\n * @param args - Resolved arguments (xLength, yLength, zLength).\n * @returns The box as a `BrepHandle`.\n */\nexport function makeBaseBoxBrep(...args: unknown[]): Result<BrepHandle> {\n const [xLength, yLength, zLength] = resolveArgs(args, MAKE_BASE_BOX_PARAMS)\n const kernel = getBrepApi()\n try {\n const rect = kernel.makeRectangle(xLength as number, yLength as number)\n try {\n return ok(kernel.extrude(rect, 0, 0, zLength as number))\n } finally {\n kernel.release(rect)\n }\n } catch (e) {\n return err(\n kernelError('MAKE_BASE_BOX_FAILED', `makeBaseBox: kernel failure: ${e instanceof Error ? e.message : String(e)}`, e),\n )\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Self-hosted compat-op implementation — roof
3
+ * (core-decouple Phase 3, §5.4; G4).
4
+ *
5
+ * @platform occt
6
+ *
7
+ * 迁移自 vendored `operations/roofFns.ts`(含 pure-TS straightSkeleton,
8
+ * 见同目录 straightSkeleton.ts)。适配:
9
+ * - getEdges → kernel.getSubShapes(handle, 'edge')
10
+ * - curveStartPoint → kernel.curvePointAtParam(edge, 0)
11
+ * - isValidSolid → kernel.isSolid(sew 兜底路径的闭合校验近似)
12
+ * - Result/BrepError 用 core 面;输出 Result<BrepHandle>
13
+ * 守卫与错误码保持 vendored:ROOF_FAILED / STRAIGHT_SKELETON_FAILED。
14
+ */
15
+ import type { BrepHandle } from '../../brep/engine/types.js';
16
+ import { type Result } from '../../result/result.js';
17
+ /**
18
+ * Roof — planar wire to straight-skeleton roof solid (vendored roofFns.ts#roof).
19
+ *
20
+ * @param args - Resolved arguments (wire, roof options).
21
+ * @returns The generated roof solid as a `BrepHandle`.
22
+ */
23
+ export declare function roofBrep(...args: unknown[]): Result<BrepHandle>;
24
+ //# sourceMappingURL=roofFns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roofFns.d.ts","sourceRoot":"","sources":["../../../src/api/brep-mirror/roofFns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEzD,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAyK1D;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAiE/D"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Self-hosted compat-op implementation — roof
3
+ * (core-decouple Phase 3, §5.4; G4).
4
+ *
5
+ * @platform occt
6
+ *
7
+ * 迁移自 vendored `operations/roofFns.ts`(含 pure-TS straightSkeleton,
8
+ * 见同目录 straightSkeleton.ts)。适配:
9
+ * - getEdges → kernel.getSubShapes(handle, 'edge')
10
+ * - curveStartPoint → kernel.curvePointAtParam(edge, 0)
11
+ * - isValidSolid → kernel.isSolid(sew 兜底路径的闭合校验近似)
12
+ * - Result/BrepError 用 core 面;输出 Result<BrepHandle>
13
+ * 守卫与错误码保持 vendored:ROOF_FAILED / STRAIGHT_SKELETON_FAILED。
14
+ */
15
+ import { getBrepApi } from '../../brep/handle-bridge.js';
16
+ import { ok, err } from '../../result/result.js';
17
+ import { kernelError, BrepErrorCode } from '../../result/errors.js';
18
+ import { resolveArgs } from '../internal/dual-form-args.js';
19
+ import { brepHandleOf } from './brepHelpers.js';
20
+ import { computeStraightSkeleton } from './straightSkeleton.js';
21
+ const ROOF_PARAMS = { name: 'roof', params: ['shape', 'options'], formClass: 'A' };
22
+ // ---------------------------------------------------------------------------
23
+ // Helpers(照抄 vendored roofFns.ts)
24
+ // ---------------------------------------------------------------------------
25
+ function extractPolygon(kernel, wire) {
26
+ const edges = kernel.getSubShapes(wire, 'edge');
27
+ const pts = edges.map((e) => {
28
+ const pt = kernel.curvePointAtParam(e, 0);
29
+ return { x: pt.x, y: pt.y };
30
+ });
31
+ const first = pts[0];
32
+ const last = pts[pts.length - 1];
33
+ if (pts.length > 1 &&
34
+ first !== undefined &&
35
+ last !== undefined &&
36
+ Math.abs(first.x - last.x) < 1e-10 &&
37
+ Math.abs(first.y - last.y) < 1e-10) {
38
+ pts.pop();
39
+ }
40
+ return pts;
41
+ }
42
+ /** Fan-triangulate a convex polygon into triangles (index triples). */
43
+ function fanTriangulate(count) {
44
+ const tris = [];
45
+ for (let i = 1; i < count - 1; i++) {
46
+ tris.push([0, i, i + 1]);
47
+ }
48
+ return tris;
49
+ }
50
+ /** Signed area cross product for three 2D points (positive = CCW). */
51
+ function cross2d(ax, ay, bx, by, cx, cy) {
52
+ return (bx - ax) * (cy - ay) - (by - ay) * (cx - ax);
53
+ }
54
+ /** Check if point (px,py) is strictly inside triangle (a,b,c). */
55
+ function pointInTriangle(px, py, ax, ay, bx, by, cx, cy) {
56
+ const d1 = cross2d(ax, ay, bx, by, px, py);
57
+ const d2 = cross2d(bx, by, cx, cy, px, py);
58
+ const d3 = cross2d(cx, cy, ax, ay, px, py);
59
+ const hasNeg = d1 < 0 || d2 < 0 || d3 < 0;
60
+ const hasPos = d1 > 0 || d2 > 0 || d3 > 0;
61
+ return !(hasNeg && hasPos);
62
+ }
63
+ /** Ear-clip triangulate a simple polygon(照抄 vendored,含 CW→CCW 归一)。 */
64
+ function earClipTriangulate(poly) {
65
+ const n = poly.length;
66
+ if (n < 3)
67
+ return [];
68
+ if (n === 3)
69
+ return [[0, 1, 2]];
70
+ let area2 = 0;
71
+ for (let i = 0; i < n; i++) {
72
+ const a = poly[i];
73
+ const b = poly[(i + 1) % n];
74
+ if (a && b)
75
+ area2 += a.x * b.y - b.x * a.y;
76
+ }
77
+ if (area2 < 0) {
78
+ const tris = earClipTriangulate([...poly].reverse());
79
+ return tris.map(([a, b, c]) => [n - 1 - a, n - 1 - b, n - 1 - c]);
80
+ }
81
+ const tris = [];
82
+ const idx = poly.map((_, i) => i);
83
+ const isEar = (prev, curr, next) => {
84
+ const a = poly[prev];
85
+ const b = poly[curr];
86
+ const c = poly[next];
87
+ if (!a || !b || !c)
88
+ return false;
89
+ if (cross2d(a.x, a.y, b.x, b.y, c.x, c.y) <= 0)
90
+ return false;
91
+ for (let j = 0; j < n; j++) {
92
+ const p = poly[j];
93
+ if (!p || j === prev || j === curr || j === next)
94
+ continue;
95
+ if (pointInTriangle(p.x, p.y, a.x, a.y, b.x, b.y, c.x, c.y))
96
+ return false;
97
+ }
98
+ return true;
99
+ };
100
+ while (idx.length > 3) {
101
+ let clipped = false;
102
+ for (let i = 0; i < idx.length; i++) {
103
+ const prev = idx[(i - 1 + idx.length) % idx.length];
104
+ const curr = idx[i];
105
+ const next = idx[(i + 1) % idx.length];
106
+ if (prev === undefined || curr === undefined || next === undefined)
107
+ continue;
108
+ if (isEar(prev, curr, next)) {
109
+ tris.push([prev, curr, next]);
110
+ idx.splice(i, 1);
111
+ clipped = true;
112
+ break;
113
+ }
114
+ }
115
+ if (!clipped)
116
+ break;
117
+ }
118
+ if (idx.length === 3) {
119
+ const [a, b, c] = idx;
120
+ if (a !== undefined && b !== undefined && c !== undefined)
121
+ tris.push([a, b, c]);
122
+ }
123
+ return tris;
124
+ }
125
+ /** Convert skeleton faces into 3D triangular kernel faces(照抄 vendored)。 */
126
+ function buildSkeletonTriFaces(skeleton, tanAngle, kernel) {
127
+ const triFaces = [];
128
+ for (const skFace of skeleton.faces) {
129
+ const verts3d = skFace.vertices.map((v, i) => [
130
+ v.x,
131
+ v.y,
132
+ (skFace.heights[i] ?? 0) * tanAngle,
133
+ ]);
134
+ const tris = fanTriangulate(verts3d.length);
135
+ for (const [ai, bi, ci] of tris) {
136
+ const va = verts3d[ai];
137
+ const vb = verts3d[bi];
138
+ const vc = verts3d[ci];
139
+ if (!va || !vb || !vc)
140
+ continue;
141
+ const abx = vb[0] - va[0];
142
+ const aby = vb[1] - va[1];
143
+ const abz = vb[2] - va[2];
144
+ const acx = vc[0] - va[0];
145
+ const acy = vc[1] - va[1];
146
+ const acz = vc[2] - va[2];
147
+ const nx = aby * acz - abz * acy;
148
+ const ny = abz * acx - abx * acz;
149
+ const nz = abx * acy - aby * acx;
150
+ const areaSq = nx * nx + ny * ny + nz * nz;
151
+ if (areaSq < 1e-20)
152
+ continue;
153
+ 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] });
154
+ if (triFace !== null)
155
+ triFaces.push(triFace);
156
+ }
157
+ }
158
+ return triFaces;
159
+ }
160
+ // ---------------------------------------------------------------------------
161
+ // roof — 平面 wire → 直骨架屋顶实体(vendored roofFns.ts#roof)
162
+ // ---------------------------------------------------------------------------
163
+ /**
164
+ * Roof — planar wire to straight-skeleton roof solid (vendored roofFns.ts#roof).
165
+ *
166
+ * @param args - Resolved arguments (wire, roof options).
167
+ * @returns The generated roof solid as a `BrepHandle`.
168
+ */
169
+ export function roofBrep(...args) {
170
+ const [shape, options] = resolveArgs(args, ROOF_PARAMS);
171
+ const kernel = getBrepApi();
172
+ const wire = brepHandleOf(shape);
173
+ const angle = (options?.angle ?? 45) * (Math.PI / 180);
174
+ const tanAngle = Math.tan(angle);
175
+ try {
176
+ const polygon = extractPolygon(kernel, wire);
177
+ if (polygon.length < 3) {
178
+ return err(kernelError(BrepErrorCode.ROOF_FAILED, 'Wire must have at least 3 edges for roof generation'));
179
+ }
180
+ const skeletonResult = computeStraightSkeleton(polygon);
181
+ if (!skeletonResult.ok)
182
+ return skeletonResult;
183
+ const skeleton = skeletonResult.value;
184
+ if (skeleton.faces.length === 0) {
185
+ return err(kernelError(BrepErrorCode.ROOF_FAILED, 'Straight skeleton computation produced no faces'));
186
+ }
187
+ const triFaces = buildSkeletonTriFaces(skeleton, tanAngle, kernel);
188
+ // Bottom face(z=0,ear-clip 支持凹多边形)
189
+ for (const [ai, bi, ci] of earClipTriangulate(polygon)) {
190
+ const pa = polygon[ai];
191
+ const pb = polygon[bi];
192
+ const pc = polygon[ci];
193
+ if (!pa || !pb || !pc)
194
+ continue;
195
+ const va = [pa.x, pa.y, 0];
196
+ const vb = [pb.x, pb.y, 0];
197
+ const vc = [pc.x, pc.y, 0];
198
+ 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] });
199
+ if (triFace !== null)
200
+ triFaces.push(triFace);
201
+ }
202
+ if (triFaces.length === 0) {
203
+ return err(kernelError(BrepErrorCode.ROOF_FAILED, 'No valid triangular faces could be built'));
204
+ }
205
+ try {
206
+ const solid = kernel.sewAndSolidify(triFaces, 1e-6);
207
+ const fixed = kernel.fixShape(solid);
208
+ if (fixed !== solid)
209
+ kernel.release(solid);
210
+ return ok(fixed);
211
+ }
212
+ catch (solidifyErr) {
213
+ try {
214
+ const sewn = kernel.sew(triFaces, 1e-6);
215
+ if (kernel.isSolid(sewn))
216
+ return ok(sewn);
217
+ return err(kernelError(BrepErrorCode.ROOF_FAILED, 'Sew fallback produced invalid solid', solidifyErr));
218
+ }
219
+ catch (sewErr) {
220
+ return err(kernelError(BrepErrorCode.ROOF_FAILED, 'Failed to sew roof faces', sewErr));
221
+ }
222
+ }
223
+ }
224
+ catch (e) {
225
+ const raw = e instanceof Error ? e.message : String(e);
226
+ return err(kernelError(BrepErrorCode.ROOF_FAILED, `Roof generation failed: ${raw}`, e));
227
+ }
228
+ }
229
+ //# sourceMappingURL=roofFns.js.map