@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
@@ -12,6 +12,8 @@ export default {
12
12
  "wedge": {},
13
13
  "screw": {},
14
14
  "sketch": {},
15
+ "wire": {},
16
+ "helix": {},
15
17
  "sdf": {},
16
18
  "translate": {},
17
19
  "rotate_euler": {},
@@ -21,11 +23,25 @@ export default {
21
23
  "chamfer": {},
22
24
  "fillet": {},
23
25
  "knurl": {},
26
+ "shell": {},
27
+ "draft": {},
28
+ "thicken": {},
29
+ "filletVariable": {},
30
+ "splitByPlane": {},
31
+ "sectionByPlane": {},
32
+ "defeature": {},
33
+ "reverseShape": {},
34
+ "unifySameDomain": {},
35
+ "sew": {},
36
+ "sewAndSolidify": {},
37
+ "removeHolesFromFace": {},
24
38
  "union": {},
25
39
  "subtract": {},
26
40
  "intersect": {},
27
41
  "extrude": {},
28
42
  "revolve": {},
43
+ "sweep": {},
44
+ "loft": {},
29
45
  "faceNormal": {},
30
46
  "bboxCenter": {},
31
47
  "bboxMin": {},
@@ -51,12 +67,21 @@ export default {
51
67
  "clone": {},
52
68
  "torus": {},
53
69
  "fuse": {},
70
+ "inspectMassProps": {},
71
+ "area": {},
72
+ "length": {},
73
+ "volume": {},
74
+ "centerOfMass": {},
54
75
  "viewCamera": {},
55
76
  "projectView": {},
56
77
  "projectSheet": {},
78
+ "complexExtrude": {},
79
+ "twistExtrude": {},
80
+ "roof": {},
57
81
  "drill": {},
58
82
  "pocket": {},
59
83
  "boss": {},
84
+ "thread": {},
60
85
  "convexHull": {},
61
86
  "makeBaseBox": {},
62
87
  "ellipsoid": {},
@@ -66,8 +91,11 @@ export default {
66
91
  "offset": {},
67
92
  "heal": {},
68
93
  "simplify": {},
94
+ "isValid": {},
95
+ "isSameShape": {},
69
96
  "autoHeal": {},
70
97
  "fixShape": {},
71
- "healSolid": {}
98
+ "healSolid": {},
99
+ "fixSelfIntersection": {}
72
100
  };
73
101
  //# sourceMappingURL=symbol-table.generated.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"symbol-table.generated.js","sourceRoot":"","sources":["../../src/lang/symbol-table.generated.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAe;IACb,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,EAAE;IACf,cAAc,EAAE,EAAE;IAClB,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,YAAY,EAAE,EAAE;IAChB,YAAY,EAAE,EAAE;IAChB,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,iBAAiB,EAAE,EAAE;IACrB,mBAAmB,EAAE,EAAE;IACvB,cAAc,EAAE,EAAE;IAClB,OAAO,EAAE,EAAE;IACX,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;IACjB,UAAU,EAAE,EAAE;IACd,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,EAAE;IACT,OAAO,EAAE,EAAE;IACX,eAAe,EAAE,EAAE;IACnB,iBAAiB,EAAE,EAAE;IACrB,aAAa,EAAE,EAAE;IACjB,oBAAoB,EAAE,EAAE;IACxB,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,cAAc,EAAE,EAAE;IAClB,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE,EAAE;IACZ,aAAa,EAAE,EAAE;IACjB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;CAChB,CAAA","sourcesContent":["/**\n * symbol-table 生成文件 — 禁手改。\n * 由 scripts/gen-symbol-table.ts 从 api-namespace 的 cad 命名空间生成(键存在性)。\n * keep-syntax P1 后符号表只承载 check() 符号检查(\"函数不存在\"判定);\n * 保留语义由 keep 声明表达,不再有 readonly 标注。\n */\nexport default {\n \"box\": {},\n \"sphere\": {},\n \"cylinder\": {},\n \"cone\": {},\n \"wedge\": {},\n \"screw\": {},\n \"sketch\": {},\n \"sdf\": {},\n \"translate\": {},\n \"rotate_euler\": {},\n \"scale\": {},\n \"scale3d\": {},\n \"engrave\": {},\n \"chamfer\": {},\n \"fillet\": {},\n \"knurl\": {},\n \"union\": {},\n \"subtract\": {},\n \"intersect\": {},\n \"extrude\": {},\n \"revolve\": {},\n \"faceNormal\": {},\n \"bboxCenter\": {},\n \"bboxMin\": {},\n \"bboxMax\": {},\n \"edgeRef\": {},\n \"faceRef\": {},\n \"jointTrajectory\": {},\n \"inverseKinematics\": {},\n \"mechanismDOF\": {},\n \"asset\": {},\n \"import_brep\": {},\n \"import_step\": {},\n \"compound\": {},\n \"place\": {},\n \"cut\": {},\n \"split\": {},\n \"linearPattern\": {},\n \"circularPattern\": {},\n \"gridPattern\": {},\n \"rectangularPattern\": {},\n \"mirrorJoin\": {},\n \"mirror\": {},\n \"clone\": {},\n \"torus\": {},\n \"fuse\": {},\n \"viewCamera\": {},\n \"projectView\": {},\n \"projectSheet\": {},\n \"drill\": {},\n \"pocket\": {},\n \"boss\": {},\n \"convexHull\": {},\n \"makeBaseBox\": {},\n \"ellipsoid\": {},\n \"rotate\": {},\n \"applyMatrix\": {},\n \"locate\": {},\n \"offset\": {},\n \"heal\": {},\n \"simplify\": {},\n \"autoHeal\": {},\n \"fixShape\": {},\n \"healSolid\": {}\n}\n"]}
1
+ {"version":3,"file":"symbol-table.generated.js","sourceRoot":"","sources":["../../src/lang/symbol-table.generated.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAe;IACb,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,EAAE;IACf,cAAc,EAAE,EAAE;IAClB,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,EAAE;IACb,gBAAgB,EAAE,EAAE;IACpB,cAAc,EAAE,EAAE;IAClB,gBAAgB,EAAE,EAAE;IACpB,WAAW,EAAE,EAAE;IACf,cAAc,EAAE,EAAE;IAClB,iBAAiB,EAAE,EAAE;IACrB,KAAK,EAAE,EAAE;IACT,gBAAgB,EAAE,EAAE;IACpB,qBAAqB,EAAE,EAAE;IACzB,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE;IACX,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,EAAE;IAChB,YAAY,EAAE,EAAE;IAChB,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,iBAAiB,EAAE,EAAE;IACrB,mBAAmB,EAAE,EAAE;IACvB,cAAc,EAAE,EAAE;IAClB,OAAO,EAAE,EAAE;IACX,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;IACjB,UAAU,EAAE,EAAE;IACd,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,EAAE;IACT,OAAO,EAAE,EAAE;IACX,eAAe,EAAE,EAAE;IACnB,iBAAiB,EAAE,EAAE;IACrB,aAAa,EAAE,EAAE;IACjB,oBAAoB,EAAE,EAAE;IACxB,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,MAAM,EAAE,EAAE;IACV,kBAAkB,EAAE,EAAE;IACtB,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,cAAc,EAAE,EAAE;IAClB,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,cAAc,EAAE,EAAE;IAClB,gBAAgB,EAAE,EAAE;IACpB,cAAc,EAAE,EAAE;IAClB,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,QAAQ,EAAE,EAAE;IACZ,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;IACjB,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE,EAAE;IACZ,aAAa,EAAE,EAAE;IACjB,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,UAAU,EAAE,EAAE;IACd,SAAS,EAAE,EAAE;IACb,aAAa,EAAE,EAAE;IACjB,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;IACf,qBAAqB,EAAE,EAAE;CAC1B,CAAA","sourcesContent":["/**\n * symbol-table 生成文件 — 禁手改。\n * 由 scripts/gen-symbol-table.ts 从 api-namespace 的 cad 命名空间生成(键存在性)。\n * keep-syntax P1 后符号表只承载 check() 符号检查(\"函数不存在\"判定);\n * 保留语义由 keep 声明表达,不再有 readonly 标注。\n */\nexport default {\n \"box\": {},\n \"sphere\": {},\n \"cylinder\": {},\n \"cone\": {},\n \"wedge\": {},\n \"screw\": {},\n \"sketch\": {},\n \"wire\": {},\n \"helix\": {},\n \"sdf\": {},\n \"translate\": {},\n \"rotate_euler\": {},\n \"scale\": {},\n \"scale3d\": {},\n \"engrave\": {},\n \"chamfer\": {},\n \"fillet\": {},\n \"knurl\": {},\n \"shell\": {},\n \"draft\": {},\n \"thicken\": {},\n \"filletVariable\": {},\n \"splitByPlane\": {},\n \"sectionByPlane\": {},\n \"defeature\": {},\n \"reverseShape\": {},\n \"unifySameDomain\": {},\n \"sew\": {},\n \"sewAndSolidify\": {},\n \"removeHolesFromFace\": {},\n \"union\": {},\n \"subtract\": {},\n \"intersect\": {},\n \"extrude\": {},\n \"revolve\": {},\n \"sweep\": {},\n \"loft\": {},\n \"faceNormal\": {},\n \"bboxCenter\": {},\n \"bboxMin\": {},\n \"bboxMax\": {},\n \"edgeRef\": {},\n \"faceRef\": {},\n \"jointTrajectory\": {},\n \"inverseKinematics\": {},\n \"mechanismDOF\": {},\n \"asset\": {},\n \"import_brep\": {},\n \"import_step\": {},\n \"compound\": {},\n \"place\": {},\n \"cut\": {},\n \"split\": {},\n \"linearPattern\": {},\n \"circularPattern\": {},\n \"gridPattern\": {},\n \"rectangularPattern\": {},\n \"mirrorJoin\": {},\n \"mirror\": {},\n \"clone\": {},\n \"torus\": {},\n \"fuse\": {},\n \"inspectMassProps\": {},\n \"area\": {},\n \"length\": {},\n \"volume\": {},\n \"centerOfMass\": {},\n \"viewCamera\": {},\n \"projectView\": {},\n \"projectSheet\": {},\n \"complexExtrude\": {},\n \"twistExtrude\": {},\n \"roof\": {},\n \"drill\": {},\n \"pocket\": {},\n \"boss\": {},\n \"thread\": {},\n \"convexHull\": {},\n \"makeBaseBox\": {},\n \"ellipsoid\": {},\n \"rotate\": {},\n \"applyMatrix\": {},\n \"locate\": {},\n \"offset\": {},\n \"heal\": {},\n \"simplify\": {},\n \"isValid\": {},\n \"isSameShape\": {},\n \"autoHeal\": {},\n \"fixShape\": {},\n \"healSolid\": {},\n \"fixSelfIntersection\": {}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"highLevelApi.d.ts","sourceRoot":"","sources":["../../src/occt-kernel/highLevelApi.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EAEV,mBAAmB,EACnB,IAAI,EACJ,qBAAqB,EACtB,MAAM,cAAc,CAAA;AAMrB,qEAAqE;AACrE,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,KAAK,EAAE,KAAK,CAAA;IACZ,mFAAmF;IACnF,KAAK,EAAE,WAAW,CAAA;IAClB,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;CACvC;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,WAAW,GAAG,UAAU,GAC9B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAiCjC;AAED,4CAA4C;AAC5C,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,KAAK,EAAE,KAAK,CAAA;IACZ,gDAAgD;IAChD,MAAM,EAAE,mBAAmB,EAAE,CAAA;IAC7B,oEAAoE;IACpE,KAAK,EAAE,WAAW,CAAA;IAClB,sDAAsD;IACtD,cAAc,EAAE,IAAI,CAAA;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,EACxC,MAAM,GAAE,MAAM,GAAG,MAAe,EAChC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAmC3B;AAID,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,iBAAiB,GAC1B,MAAM,CAMR;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAErD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,eAAe,EAAE,GACzB,OAAO,CAAC,WAAW,CAAC,CAGtB;AAID;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,UAAU,CAAC,CAE5D;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAGD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAA"}
1
+ {"version":3,"file":"highLevelApi.d.ts","sourceRoot":"","sources":["../../src/occt-kernel/highLevelApi.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EAEV,mBAAmB,EACnB,IAAI,EACJ,qBAAqB,EACtB,MAAM,cAAc,CAAA;AAMrB,qEAAqE;AACrE,MAAM,WAAW,oBAAoB;IACnC,6CAA6C;IAC7C,KAAK,EAAE,KAAK,CAAA;IACZ,mFAAmF;IACnF,KAAK,EAAE,WAAW,CAAA;IAClB,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;CACvC;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,WAAW,GAAG,UAAU,GAC9B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAiCjC;AAED,4CAA4C;AAC5C,MAAM,WAAW,gBAAgB;IAC/B,+DAA+D;IAC/D,KAAK,EAAE,KAAK,CAAA;IACZ,gDAAgD;IAChD,MAAM,EAAE,mBAAmB,EAAE,CAAA;IAC7B,oEAAoE;IACpE,KAAK,EAAE,WAAW,CAAA;IAClB,sDAAsD;IACtD,cAAc,EAAE,IAAI,CAAA;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,EACxC,MAAM,GAAE,MAAM,GAAG,MAAe,EAChC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAmC3B;AAID,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,iBAAiB,GAC1B,MAAM,CAMR;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAErD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,eAAe,EAAE,GACzB,OAAO,CAAC,WAAW,CAAC,CAKtB;AAID;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,UAAU,CAAC,CAE5D;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAGD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAA"}
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import { initOcctWasm, disposeOcctWasm, importStepToMesh, importBrepToMesh, meshesToStep, releaseShape, importAssemblyFromStep, collectLeafParts, releaseAssemblyTree, computeEffectiveDeflection, } from './occtKernel.js';
11
11
  import { exportStepFromSolids } from '../brep/export/step.js';
12
+ import { createOcctPrimitives } from './occt-primitives.js';
12
13
  /**
13
14
  * High-level: import multi-part mesh + solid from a STEP file byte stream.
14
15
  *
@@ -19,7 +20,7 @@ import { exportStepFromSolids } from '../brep/export/step.js';
19
20
  * @returns an array of per-part import results
20
21
  */
21
22
  export async function importStepMultiPart(bytes) {
22
- const kernel = (await initOcctWasm());
23
+ const kernel = await initOcctWasm();
23
24
  // XCAF 解析 → 装配树
24
25
  const nodes = await importAssemblyFromStep(bytes);
25
26
  const leaves = collectLeafParts(nodes);
@@ -126,8 +127,10 @@ export function releaseSolid(solid) {
126
127
  * @returns STEP file content as ArrayBuffer
127
128
  */
128
129
  export async function exportStepFromSolidsHighLevel(entries) {
129
- const kernel = await ensureOcctKernel();
130
- return exportStepFromSolids(kernel, entries);
130
+ // step.ts consumes the L1 contract — pass the adapter, not the raw kernel
131
+ // (no cross-layer assertion; narrowing plan §Phase 3).
132
+ const primitives = await createOcctPrimitives();
133
+ return exportStepFromSolids(primitives, entries);
131
134
  }
132
135
  // ── 管理函数 ──
133
136
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"highLevelApi.js","sourceRoot":"","sources":["../../src/occt-kernel/highLevelApi.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * OCCT 高层 API — E12.2\n *\n * 宿主不应再直接 import 底层 OCCT kernel 函数(initOcctWasm/importStepToMesh/meshesToStep 等),\n * 而是使用这些高层 API。\n *\n * 高层 API 封装了初始化、导入、导出的完整流程,\n * 返回标准化的 Shape / 拓扑数据 / STEP 字节流。\n */\n\nimport {\n initOcctWasm,\n disposeOcctWasm,\n importStepToMesh,\n importBrepToMesh,\n meshesToStep,\n releaseShape,\n importAssemblyFromStep,\n collectLeafParts,\n releaseAssemblyTree,\n computeEffectiveDeflection,\n} from './occtKernel'\nimport type { Shape } from '../mesh/types'\nimport { exportStepFromSolids } from '../brep/export/step'\nimport type { StepExportEntry } from '../brep/export/step'\nimport type {\n ShapeHandle,\n OcctKernel,\n WasmImportResult,\n WasmTessellatedMesh,\n Mesh,\n MeshDeflectionOptions,\n} from './occtKernel'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n// ── 导入 API ──\n\n/** Result of importing a single part from a multi-part STEP file. */\nexport interface ImportStepPartResult {\n /** The part's mesh (positions + indices). */\n shape: Shape\n /** OCCT solid handle (with location, for later BREP operations or STEP export). */\n solid: ShapeHandle\n /** Part name (from the XCAF label). */\n name: string\n /** Part color [r,g,b] in 0..1, or null when there is no color. */\n color: [number, number, number] | null\n}\n\n/**\n * High-level: import multi-part mesh + solid from a STEP file byte stream.\n *\n * Uses XCAF assembly-tree parsing, keeping each part's mesh and solid independent.\n * Unlike importStep, this does not merge meshes — each part returns its own shape.\n *\n * @param bytes - STEP file byte stream\n * @returns an array of per-part import results\n */\nexport async function importStepMultiPart(\n bytes: ArrayBuffer | Uint8Array,\n): Promise<ImportStepPartResult[]> {\n const kernel = (await initOcctWasm()) as unknown as OcctKernel\n\n // XCAF 解析 → 装配树\n const nodes = await importAssemblyFromStep(bytes)\n const leaves = collectLeafParts(nodes)\n\n const results: ImportStepPartResult[] = []\n for (const leaf of leaves) {\n if (!leaf.shapeHandle) continue\n\n const eff = computeEffectiveDeflection(kernel as unknown as BrepEngineApi, leaf.shapeHandle as unknown as BrepHandle)\n const mesh = kernel.meshShape(leaf.shapeHandle, {\n linearDeflection: eff.linearDeflection,\n angularDeflection: eff.angularDeflection,\n })\n\n results.push({\n shape: {\n positions: mesh.positions,\n indices: mesh.indices,\n },\n solid: leaf.shapeHandle,\n name: leaf.name,\n color: leaf.color,\n })\n }\n\n // 释放装配树中非 leaf 的 shapeHandle(assembly 节点的已由 walkLabel 释放)\n // leaf 的 shapeHandle 由返回结果持有,调用方负责释放\n releaseAssemblyTree(kernel as unknown as BrepEngineApi, nodes.filter(n => n.isAssembly))\n\n return results\n}\n\n/** Result of importing a STEP/BREP file. */\nexport interface ImportStepResult {\n /** The merged mesh (all parts' positions/indices combined). */\n shape: Shape\n /** Each part's mesh (for topology building). */\n meshes: WasmTessellatedMesh[]\n /** OCCT solid handle (for later BREP operations or STEP export). */\n solid: ShapeHandle\n /** Face-group information (for topology building). */\n meshWithGroups: Mesh\n}\n\n/**\n * High-level: import mesh + solid from a STEP/BREP file byte stream.\n *\n * Wraps the full importStepToMesh/importBrepToMesh + mesh merge flow.\n * Hosts no longer need to operate the OCCT kernel directly.\n *\n * @param bytes - STEP/BREP file byte stream\n * @param format - the file format: 'step' | 'brep'\n * @param options - optional mesh deflection options\n * @returns the import result\n */\nexport async function importStep(\n bytes: ArrayBuffer | Uint8Array | string,\n format: 'step' | 'brep' = 'step',\n options?: MeshDeflectionOptions,\n): Promise<ImportStepResult> {\n const result: WasmImportResult = format === 'brep'\n ? await importBrepToMesh(bytes as string, options)\n : await importStepToMesh(bytes as ArrayBuffer | Uint8Array, options)\n\n // 合并所有 mesh 的 positions/indices\n let totalPositions = 0\n let totalIndices = 0\n for (const mesh of result.meshes) {\n totalPositions += mesh.positions.length\n totalIndices += mesh.indices.length\n }\n\n const positions = new Float32Array(totalPositions)\n const indices = new Uint32Array(totalIndices)\n let posOffset = 0\n let idxOffset = 0\n let idxBase = 0\n for (const mesh of result.meshes) {\n positions.set(mesh.positions, posOffset)\n posOffset += mesh.positions.length\n // 需要偏移索引\n for (let i = 0; i < mesh.indices.length; i++) {\n indices[idxOffset + i] = mesh.indices[i] + idxBase\n }\n idxOffset += mesh.indices.length\n idxBase += mesh.positions.length / 3\n }\n\n return {\n shape: { positions, indices },\n meshes: result.meshes,\n solid: result.shapeHandle,\n meshWithGroups: result.meshWithGroups,\n }\n}\n\n// ── 导出 API ──\n\n/** Options for exporting mesh data to a STEP string. */\nexport interface ExportStepOptions {\n /** Sewing tolerance. */\n tolerance?: number\n}\n\n/**\n * High-level: export mesh data as a STEP string.\n *\n * Wraps the full meshesToStep flow. Hosts no longer need to operate the OCCT kernel directly.\n *\n * @param shape - mesh data (positions + indices)\n * @param options - optional export options (sewing tolerance)\n * @returns the STEP file text content\n */\nexport function exportStep(\n shape: Shape,\n options?: ExportStepOptions,\n): string {\n return meshesToStep(\n shape.positions,\n shape.indices,\n options?.tolerance ?? 0.01,\n )\n}\n\n/**\n * High-level: release an OCCT solid handle.\n *\n * Wraps the full releaseShape flow.\n *\n * @param solid - the solid handle to release\n */\nexport function releaseSolid(solid: ShapeHandle): void {\n releaseShape(solid)\n}\n\n/**\n * High-level: multi-solid STEP export (zero fuse).\n *\n * Each entry is exported as an independent entity in the STEP (independent XCAF\n * label / PRODUCT), preserving name and color. Multiple solids are never fused.\n *\n * Wraps the full ensureOcctKernel + exportStepFromSolids flow.\n * Hosts no longer need to operate the OCCT kernel directly.\n *\n * @param entries - parts to export; each becomes its own independent entity\n * @returns STEP file content as ArrayBuffer\n */\nexport async function exportStepFromSolidsHighLevel(\n entries: StepExportEntry[],\n): Promise<ArrayBuffer> {\n const kernel = await ensureOcctKernel()\n return exportStepFromSolids(kernel as unknown as BrepEngineApi, entries)\n}\n\n// ── 管理函数 ──\n\n/**\n * High-level: initialize the OCCT kernel.\n * Returns the cached instance if already initialized.\n *\n * @returns the initialized OCCT kernel\n */\nexport async function ensureOcctKernel(): Promise<OcctKernel> {\n return initOcctWasm() as unknown as Promise<OcctKernel>\n}\n\n/**\n * High-level: dispose the OCCT kernel.\n * Call when unloading the page or releasing WASM memory.\n */\nexport function disposeOcct(): void {\n disposeOcctWasm()\n}\n\n// Re-export 底层类型供高层 API 用户使用\nexport type { OcctKernel, ShapeHandle, WasmTessellatedMesh, Mesh, MeshDeflectionOptions }\n"]}
1
+ {"version":3,"file":"highLevelApi.js","sourceRoot":"","sources":["../../src/occt-kernel/highLevelApi.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * OCCT 高层 API — E12.2\n *\n * 宿主不应再直接 import 底层 OCCT kernel 函数(initOcctWasm/importStepToMesh/meshesToStep 等),\n * 而是使用这些高层 API。\n *\n * 高层 API 封装了初始化、导入、导出的完整流程,\n * 返回标准化的 Shape / 拓扑数据 / STEP 字节流。\n */\n\nimport {\n initOcctWasm,\n disposeOcctWasm,\n importStepToMesh,\n importBrepToMesh,\n meshesToStep,\n releaseShape,\n importAssemblyFromStep,\n collectLeafParts,\n releaseAssemblyTree,\n computeEffectiveDeflection,\n} from './occtKernel'\nimport type { Shape } from '../mesh/types'\nimport { exportStepFromSolids } from '../brep/export/step'\nimport type { StepExportEntry } from '../brep/export/step'\nimport type {\n ShapeHandle,\n OcctKernel,\n WasmImportResult,\n WasmTessellatedMesh,\n Mesh,\n MeshDeflectionOptions,\n} from './occtKernel'\n\nimport { createOcctPrimitives } from './occt-primitives'\n\n// ── 导入 API ──\n\n/** Result of importing a single part from a multi-part STEP file. */\nexport interface ImportStepPartResult {\n /** The part's mesh (positions + indices). */\n shape: Shape\n /** OCCT solid handle (with location, for later BREP operations or STEP export). */\n solid: ShapeHandle\n /** Part name (from the XCAF label). */\n name: string\n /** Part color [r,g,b] in 0..1, or null when there is no color. */\n color: [number, number, number] | null\n}\n\n/**\n * High-level: import multi-part mesh + solid from a STEP file byte stream.\n *\n * Uses XCAF assembly-tree parsing, keeping each part's mesh and solid independent.\n * Unlike importStep, this does not merge meshes — each part returns its own shape.\n *\n * @param bytes - STEP file byte stream\n * @returns an array of per-part import results\n */\nexport async function importStepMultiPart(\n bytes: ArrayBuffer | Uint8Array,\n): Promise<ImportStepPartResult[]> {\n const kernel = await initOcctWasm()\n\n // XCAF 解析 → 装配树\n const nodes = await importAssemblyFromStep(bytes)\n const leaves = collectLeafParts(nodes)\n\n const results: ImportStepPartResult[] = []\n for (const leaf of leaves) {\n if (!leaf.shapeHandle) continue\n\n const eff = computeEffectiveDeflection(kernel, leaf.shapeHandle)\n const mesh = kernel.meshShape(leaf.shapeHandle, {\n linearDeflection: eff.linearDeflection,\n angularDeflection: eff.angularDeflection,\n })\n\n results.push({\n shape: {\n positions: mesh.positions,\n indices: mesh.indices,\n },\n solid: leaf.shapeHandle,\n name: leaf.name,\n color: leaf.color,\n })\n }\n\n // 释放装配树中非 leaf 的 shapeHandle(assembly 节点的已由 walkLabel 释放)\n // leaf 的 shapeHandle 由返回结果持有,调用方负责释放\n releaseAssemblyTree(kernel, nodes.filter(n => n.isAssembly))\n\n return results\n}\n\n/** Result of importing a STEP/BREP file. */\nexport interface ImportStepResult {\n /** The merged mesh (all parts' positions/indices combined). */\n shape: Shape\n /** Each part's mesh (for topology building). */\n meshes: WasmTessellatedMesh[]\n /** OCCT solid handle (for later BREP operations or STEP export). */\n solid: ShapeHandle\n /** Face-group information (for topology building). */\n meshWithGroups: Mesh\n}\n\n/**\n * High-level: import mesh + solid from a STEP/BREP file byte stream.\n *\n * Wraps the full importStepToMesh/importBrepToMesh + mesh merge flow.\n * Hosts no longer need to operate the OCCT kernel directly.\n *\n * @param bytes - STEP/BREP file byte stream\n * @param format - the file format: 'step' | 'brep'\n * @param options - optional mesh deflection options\n * @returns the import result\n */\nexport async function importStep(\n bytes: ArrayBuffer | Uint8Array | string,\n format: 'step' | 'brep' = 'step',\n options?: MeshDeflectionOptions,\n): Promise<ImportStepResult> {\n const result: WasmImportResult = format === 'brep'\n ? await importBrepToMesh(bytes as string, options)\n : await importStepToMesh(bytes as ArrayBuffer | Uint8Array, options)\n\n // 合并所有 mesh 的 positions/indices\n let totalPositions = 0\n let totalIndices = 0\n for (const mesh of result.meshes) {\n totalPositions += mesh.positions.length\n totalIndices += mesh.indices.length\n }\n\n const positions = new Float32Array(totalPositions)\n const indices = new Uint32Array(totalIndices)\n let posOffset = 0\n let idxOffset = 0\n let idxBase = 0\n for (const mesh of result.meshes) {\n positions.set(mesh.positions, posOffset)\n posOffset += mesh.positions.length\n // 需要偏移索引\n for (let i = 0; i < mesh.indices.length; i++) {\n indices[idxOffset + i] = mesh.indices[i] + idxBase\n }\n idxOffset += mesh.indices.length\n idxBase += mesh.positions.length / 3\n }\n\n return {\n shape: { positions, indices },\n meshes: result.meshes,\n solid: result.shapeHandle,\n meshWithGroups: result.meshWithGroups,\n }\n}\n\n// ── 导出 API ──\n\n/** Options for exporting mesh data to a STEP string. */\nexport interface ExportStepOptions {\n /** Sewing tolerance. */\n tolerance?: number\n}\n\n/**\n * High-level: export mesh data as a STEP string.\n *\n * Wraps the full meshesToStep flow. Hosts no longer need to operate the OCCT kernel directly.\n *\n * @param shape - mesh data (positions + indices)\n * @param options - optional export options (sewing tolerance)\n * @returns the STEP file text content\n */\nexport function exportStep(\n shape: Shape,\n options?: ExportStepOptions,\n): string {\n return meshesToStep(\n shape.positions,\n shape.indices,\n options?.tolerance ?? 0.01,\n )\n}\n\n/**\n * High-level: release an OCCT solid handle.\n *\n * Wraps the full releaseShape flow.\n *\n * @param solid - the solid handle to release\n */\nexport function releaseSolid(solid: ShapeHandle): void {\n releaseShape(solid)\n}\n\n/**\n * High-level: multi-solid STEP export (zero fuse).\n *\n * Each entry is exported as an independent entity in the STEP (independent XCAF\n * label / PRODUCT), preserving name and color. Multiple solids are never fused.\n *\n * Wraps the full ensureOcctKernel + exportStepFromSolids flow.\n * Hosts no longer need to operate the OCCT kernel directly.\n *\n * @param entries - parts to export; each becomes its own independent entity\n * @returns STEP file content as ArrayBuffer\n */\nexport async function exportStepFromSolidsHighLevel(\n entries: StepExportEntry[],\n): Promise<ArrayBuffer> {\n // step.ts consumes the L1 contract — pass the adapter, not the raw kernel\n // (no cross-layer assertion; narrowing plan §Phase 3).\n const primitives = await createOcctPrimitives()\n return exportStepFromSolids(primitives, entries)\n}\n\n// ── 管理函数 ──\n\n/**\n * High-level: initialize the OCCT kernel.\n * Returns the cached instance if already initialized.\n *\n * @returns the initialized OCCT kernel\n */\nexport async function ensureOcctKernel(): Promise<OcctKernel> {\n return initOcctWasm() as unknown as Promise<OcctKernel>\n}\n\n/**\n * High-level: dispose the OCCT kernel.\n * Call when unloading the page or releasing WASM memory.\n */\nexport function disposeOcct(): void {\n disposeOcctWasm()\n}\n\n// Re-export 底层类型供高层 API 用户使用\nexport type { OcctKernel, ShapeHandle, WasmTessellatedMesh, Mesh, MeshDeflectionOptions }\n"]}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Pure-TS 3D convex hull (QuickHull).
3
+ *
4
+ * 第一方模块(2026-09-25 core-decouple Phase 2 §5.1):复制自 brepjs
5
+ * `src/kernel/hullGeometry.ts`(同源复制,签名不变;brepjs 包 Phase 5 删除后
6
+ * 仍由本文件承担)。
7
+ *
8
+ * Kernel-agnostic: operates on plain {x,y,z} points and returns triangle
9
+ * indices. Shared by the occt and occt-wasm adapters, which supply their own
10
+ * vertex extraction and BREP reconstruction around it.
11
+ */
12
+ export interface Vec3 {
13
+ readonly x: number;
14
+ readonly y: number;
15
+ readonly z: number;
16
+ }
17
+ /** Result of a QuickHull computation: hull triangle indices and deduplicated points. */
18
+ export interface HullResult {
19
+ readonly faces: ReadonlyArray<readonly [number, number, number]>;
20
+ readonly points: readonly Vec3[];
21
+ }
22
+ /**
23
+ * Compute the 3D convex hull of a point set.
24
+ *
25
+ * @param inputPoints - Input points to build the hull from.
26
+ * @param tolerance - Coincidence tolerance for point deduplication.
27
+ * @returns The hull faces (triangle indices) and deduplicated points.
28
+ * @throws if fewer than 4 non-coincident, non-coplanar points are supplied.
29
+ */
30
+ export declare function quickHull(inputPoints: Vec3[], tolerance: number): HullResult;
31
+ //# sourceMappingURL=hullGeometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hullGeometry.d.ts","sourceRoot":"","sources":["../../src/occt-kernel/hullGeometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wFAAwF;AACxF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjE,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC;CAClC;AAyLD;;;;;;;GAOG;AAEH,wBAAgB,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CAsK5E"}
@@ -0,0 +1,319 @@
1
+ /**
2
+ * Pure-TS 3D convex hull (QuickHull).
3
+ *
4
+ * 第一方模块(2026-09-25 core-decouple Phase 2 §5.1):复制自 brepjs
5
+ * `src/kernel/hullGeometry.ts`(同源复制,签名不变;brepjs 包 Phase 5 删除后
6
+ * 仍由本文件承担)。
7
+ *
8
+ * Kernel-agnostic: operates on plain {x,y,z} points and returns triangle
9
+ * indices. Shared by the occt and occt-wasm adapters, which supply their own
10
+ * vertex extraction and BREP reconstruction around it.
11
+ */
12
+ // ---------------------------------------------------------------------------
13
+ // Vector math helpers
14
+ // ---------------------------------------------------------------------------
15
+ function sub(a, b) {
16
+ return { x: a.x - b.x, y: a.y - b.y, z: a.z - b.z };
17
+ }
18
+ function cross(a, b) {
19
+ return {
20
+ x: a.y * b.z - a.z * b.y,
21
+ y: a.z * b.x - a.x * b.z,
22
+ z: a.x * b.y - a.y * b.x,
23
+ };
24
+ }
25
+ function dot(a, b) {
26
+ return a.x * b.x + a.y * b.y + a.z * b.z;
27
+ }
28
+ function lengthVec(v) {
29
+ return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
30
+ }
31
+ function distSq(a, b) {
32
+ const dx = a.x - b.x;
33
+ const dy = a.y - b.y;
34
+ const dz = a.z - b.z;
35
+ return dx * dx + dy * dy + dz * dz;
36
+ }
37
+ /** Safe array access — throws on out-of-bounds instead of returning undefined. */
38
+ function at(arr, i) {
39
+ const v = arr[i];
40
+ if (v === undefined)
41
+ throw new Error(`Index ${i} out of bounds`);
42
+ return v;
43
+ }
44
+ /** Safe number array access. */
45
+ function atN(arr, i) {
46
+ const v = arr[i];
47
+ if (v === undefined)
48
+ throw new Error(`Index ${i} out of bounds`);
49
+ return v;
50
+ }
51
+ function makeFace(points, a, b, c) {
52
+ const normal = cross(sub(at(points, b), at(points, a)), sub(at(points, c), at(points, a)));
53
+ const len = lengthVec(normal);
54
+ const n = len > 1e-14 ? { x: normal.x / len, y: normal.y / len, z: normal.z / len } : normal;
55
+ return {
56
+ a,
57
+ b,
58
+ c,
59
+ normal: n,
60
+ offset: dot(n, at(points, a)),
61
+ alive: true,
62
+ outsidePoints: [],
63
+ };
64
+ }
65
+ function signedDist(face, point) {
66
+ return dot(face.normal, point) - face.offset;
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Deduplication
70
+ // ---------------------------------------------------------------------------
71
+ function deduplicatePoints(points, tolerance) {
72
+ const tolSq = tolerance * tolerance;
73
+ const result = [];
74
+ for (const p of points) {
75
+ let isDuplicate = false;
76
+ for (const q of result) {
77
+ if (distSq(p, q) < tolSq) {
78
+ isDuplicate = true;
79
+ break;
80
+ }
81
+ }
82
+ if (!isDuplicate)
83
+ result.push(p);
84
+ }
85
+ return result;
86
+ }
87
+ // ---------------------------------------------------------------------------
88
+ // Initial tetrahedron
89
+ // ---------------------------------------------------------------------------
90
+ function findInitialTetrahedron(points) {
91
+ const n = points.length;
92
+ if (n < 4)
93
+ return null;
94
+ // Find two most distant points along each axis, pick the pair with max distance
95
+ let i0 = 0;
96
+ let i1 = 1;
97
+ let maxDist = distSq(at(points, 0), at(points, 1));
98
+ for (let i = 0; i < n; i++) {
99
+ for (let j = i + 1; j < n; j++) {
100
+ const d = distSq(at(points, i), at(points, j));
101
+ if (d > maxDist) {
102
+ maxDist = d;
103
+ i0 = i;
104
+ i1 = j;
105
+ }
106
+ }
107
+ }
108
+ if (maxDist < 1e-20)
109
+ return null;
110
+ // Find point most distant from line i0-i1
111
+ const lineDir = sub(at(points, i1), at(points, i0));
112
+ let i2 = -1;
113
+ let maxLineDist = -1;
114
+ for (let i = 0; i < n; i++) {
115
+ if (i === i0 || i === i1)
116
+ continue;
117
+ const v = sub(at(points, i), at(points, i0));
118
+ const c = cross(lineDir, v);
119
+ const d = dot(c, c);
120
+ if (d > maxLineDist) {
121
+ maxLineDist = d;
122
+ i2 = i;
123
+ }
124
+ }
125
+ if (i2 === -1 || maxLineDist < 1e-20)
126
+ return null;
127
+ // Find point most distant from plane i0-i1-i2
128
+ const planeNormal = cross(sub(at(points, i1), at(points, i0)), sub(at(points, i2), at(points, i0)));
129
+ const planeLen = lengthVec(planeNormal);
130
+ if (planeLen < 1e-14)
131
+ return null;
132
+ const pn = {
133
+ x: planeNormal.x / planeLen,
134
+ y: planeNormal.y / planeLen,
135
+ z: planeNormal.z / planeLen,
136
+ };
137
+ const planeOffset = dot(pn, at(points, i0));
138
+ let i3 = -1;
139
+ let maxPlaneDist = -1;
140
+ for (let i = 0; i < n; i++) {
141
+ if (i === i0 || i === i1 || i === i2)
142
+ continue;
143
+ const d = Math.abs(dot(pn, at(points, i)) - planeOffset);
144
+ if (d > maxPlaneDist) {
145
+ maxPlaneDist = d;
146
+ i3 = i;
147
+ }
148
+ }
149
+ if (i3 === -1 || maxPlaneDist < 1e-14)
150
+ return null;
151
+ // Orient tetrahedron so that i3 is "above" the base triangle
152
+ const sd = dot(pn, at(points, i3)) - planeOffset;
153
+ if (sd > 0) {
154
+ return [i0, i2, i1, i3]; // flip base winding
155
+ }
156
+ return [i0, i1, i2, i3];
157
+ }
158
+ // ---------------------------------------------------------------------------
159
+ // QuickHull
160
+ // ---------------------------------------------------------------------------
161
+ /**
162
+ * Compute the 3D convex hull of a point set.
163
+ *
164
+ * @param inputPoints - Input points to build the hull from.
165
+ * @param tolerance - Coincidence tolerance for point deduplication.
166
+ * @returns The hull faces (triangle indices) and deduplicated points.
167
+ * @throws if fewer than 4 non-coincident, non-coplanar points are supplied.
168
+ */
169
+ // brepjs-patterns-disable: max-function-lines -- cohesive QuickHull main loop; splitting hurts readability
170
+ export function quickHull(inputPoints, tolerance) {
171
+ const points = deduplicatePoints(inputPoints, tolerance);
172
+ if (points.length < 4) {
173
+ throw new Error(points.length === 0
174
+ ? 'No points provided for convex hull'
175
+ : 'Fewer than 4 non-coincident points; cannot form a 3D convex hull');
176
+ }
177
+ const tet = findInitialTetrahedron(points);
178
+ if (tet === null) {
179
+ throw new Error('All points are coplanar; cannot form a 3D convex hull');
180
+ }
181
+ const [t0, t1, t2, t3] = tet;
182
+ // Centroid of initial tetrahedron for ensuring outward normals
183
+ const centroid = {
184
+ x: (at(points, t0).x + at(points, t1).x + at(points, t2).x + at(points, t3).x) / 4,
185
+ y: (at(points, t0).y + at(points, t1).y + at(points, t2).y + at(points, t3).y) / 4,
186
+ z: (at(points, t0).z + at(points, t1).z + at(points, t2).z + at(points, t3).z) / 4,
187
+ };
188
+ // Build initial 4 faces of tetrahedron, ensuring outward normals
189
+ function makeOutwardFace(a, b, c) {
190
+ const face = makeFace(points, a, b, c);
191
+ // If normal points toward centroid, flip the winding
192
+ const faceCenter = {
193
+ x: (at(points, a).x + at(points, b).x + at(points, c).x) / 3,
194
+ y: (at(points, a).y + at(points, b).y + at(points, c).y) / 3,
195
+ z: (at(points, a).z + at(points, b).z + at(points, c).z) / 3,
196
+ };
197
+ const toCentroid = sub(centroid, faceCenter);
198
+ if (dot(face.normal, toCentroid) > 0) {
199
+ // Normal points inward, flip
200
+ return makeFace(points, a, c, b);
201
+ }
202
+ return face;
203
+ }
204
+ const faces = [
205
+ makeOutwardFace(t0, t1, t2),
206
+ makeOutwardFace(t0, t2, t3),
207
+ makeOutwardFace(t0, t3, t1),
208
+ makeOutwardFace(t1, t3, t2),
209
+ ];
210
+ const tetSet = new Set([t0, t1, t2, t3]);
211
+ // Use a small geometric epsilon for "outside" tests, independent of mesh tolerance.
212
+ // Mesh tolerance controls deduplication; hull geometry uses a much tighter epsilon.
213
+ const epsilon = 1e-10;
214
+ // Assign each non-tet point to the first visible face
215
+ for (let i = 0; i < points.length; i++) {
216
+ if (tetSet.has(i))
217
+ continue;
218
+ for (const face of faces) {
219
+ if (signedDist(face, at(points, i)) > epsilon) {
220
+ face.outsidePoints.push(i);
221
+ break;
222
+ }
223
+ }
224
+ }
225
+ for (let iteration = 0; iteration < points.length * 4; iteration++) {
226
+ // Find a face with outside points
227
+ let currentFace = null;
228
+ for (const face of faces) {
229
+ if (face.alive && face.outsidePoints.length > 0) {
230
+ currentFace = face;
231
+ break;
232
+ }
233
+ }
234
+ if (currentFace === null)
235
+ break;
236
+ // Find the furthest point from this face
237
+ let furthestIdx = atN(currentFace.outsidePoints, 0);
238
+ let furthestDist = signedDist(currentFace, at(points, furthestIdx));
239
+ for (let i = 1; i < currentFace.outsidePoints.length; i++) {
240
+ const idx = atN(currentFace.outsidePoints, i);
241
+ const d = signedDist(currentFace, at(points, idx));
242
+ if (d > furthestDist) {
243
+ furthestDist = d;
244
+ furthestIdx = idx;
245
+ }
246
+ }
247
+ // Find all visible faces from this point
248
+ const visibleFaces = [];
249
+ for (const face of faces) {
250
+ if (face.alive && signedDist(face, at(points, furthestIdx)) > epsilon) {
251
+ visibleFaces.push(face);
252
+ }
253
+ }
254
+ // Find horizon edges (edges shared by exactly one visible face)
255
+ const edgeCount = new Map();
256
+ for (const face of visibleFaces) {
257
+ const edges = [
258
+ [face.a, face.b],
259
+ [face.b, face.c],
260
+ [face.c, face.a],
261
+ ];
262
+ for (const [ea, eb] of edges) {
263
+ const key = ea < eb ? `${ea}-${eb}` : `${eb}-${ea}`;
264
+ const entry = edgeCount.get(key);
265
+ if (entry) {
266
+ entry.count++;
267
+ }
268
+ else {
269
+ // Store in the order from the visible face
270
+ edgeCount.set(key, { a: ea, b: eb, count: 1 });
271
+ }
272
+ }
273
+ }
274
+ const horizonEdges = [];
275
+ for (const entry of edgeCount.values()) {
276
+ if (entry.count === 1) {
277
+ // Keep edge in same direction as the visible face; makeFace with apex
278
+ // produces outward normal by winding convention
279
+ horizonEdges.push({ a: entry.a, b: entry.b });
280
+ }
281
+ }
282
+ // Collect orphaned outside points from visible faces
283
+ const orphanedPoints = [];
284
+ for (const face of visibleFaces) {
285
+ for (const idx of face.outsidePoints) {
286
+ if (idx !== furthestIdx) {
287
+ orphanedPoints.push(idx);
288
+ }
289
+ }
290
+ face.alive = false;
291
+ face.outsidePoints = [];
292
+ }
293
+ // Create new faces from horizon edges to the furthest point
294
+ const newFaces = [];
295
+ for (const edge of horizonEdges) {
296
+ const newFaceObj = makeFace(points, edge.a, edge.b, furthestIdx);
297
+ newFaces.push(newFaceObj);
298
+ faces.push(newFaceObj);
299
+ }
300
+ // Reassign orphaned points to new faces
301
+ for (const idx of orphanedPoints) {
302
+ for (const face of newFaces) {
303
+ if (signedDist(face, at(points, idx)) > epsilon) {
304
+ face.outsidePoints.push(idx);
305
+ break;
306
+ }
307
+ }
308
+ }
309
+ }
310
+ // Collect alive faces
311
+ const resultFaces = [];
312
+ for (const face of faces) {
313
+ if (face.alive) {
314
+ resultFaces.push([face.a, face.b, face.c]);
315
+ }
316
+ }
317
+ return { faces: resultFaces, points };
318
+ }
319
+ //# sourceMappingURL=hullGeometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hullGeometry.js","sourceRoot":"","sources":["../../src/occt-kernel/hullGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure-TS 3D convex hull (QuickHull).\n *\n * 第一方模块(2026-09-25 core-decouple Phase 2 §5.1):复制自 brepjs\n * `src/kernel/hullGeometry.ts`(同源复制,签名不变;brepjs 包 Phase 5 删除后\n * 仍由本文件承担)。\n *\n * Kernel-agnostic: operates on plain {x,y,z} points and returns triangle\n * indices. Shared by the occt and occt-wasm adapters, which supply their own\n * vertex extraction and BREP reconstruction around it.\n */\n\nexport interface Vec3 {\n readonly x: number;\n readonly y: number;\n readonly z: number;\n}\n\n/** Result of a QuickHull computation: hull triangle indices and deduplicated points. */\nexport interface HullResult {\n readonly faces: ReadonlyArray<readonly [number, number, number]>;\n readonly points: readonly Vec3[];\n}\n\n// ---------------------------------------------------------------------------\n// Vector math helpers\n// ---------------------------------------------------------------------------\n\nfunction sub(a: Vec3, b: Vec3): Vec3 {\n return { x: a.x - b.x, y: a.y - b.y, z: a.z - b.z };\n}\n\nfunction cross(a: Vec3, b: Vec3): Vec3 {\n return {\n x: a.y * b.z - a.z * b.y,\n y: a.z * b.x - a.x * b.z,\n z: a.x * b.y - a.y * b.x,\n };\n}\n\nfunction dot(a: Vec3, b: Vec3): number {\n return a.x * b.x + a.y * b.y + a.z * b.z;\n}\n\nfunction lengthVec(v: Vec3): number {\n return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z);\n}\n\nfunction distSq(a: Vec3, b: Vec3): number {\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n const dz = a.z - b.z;\n return dx * dx + dy * dy + dz * dz;\n}\n\n/** Safe array access — throws on out-of-bounds instead of returning undefined. */\nfunction at(arr: readonly Vec3[], i: number): Vec3 {\n const v = arr[i];\n if (v === undefined) throw new Error(`Index ${i} out of bounds`);\n return v;\n}\n\n/** Safe number array access. */\nfunction atN(arr: readonly number[], i: number): number {\n const v = arr[i];\n if (v === undefined) throw new Error(`Index ${i} out of bounds`);\n return v;\n}\n\n// ---------------------------------------------------------------------------\n// QuickHull face\n// ---------------------------------------------------------------------------\n\ninterface HullFace {\n readonly a: number; // indices into points array\n readonly b: number;\n readonly c: number;\n readonly normal: Vec3;\n readonly offset: number; // dot(normal, points[a])\n alive: boolean;\n outsidePoints: number[];\n}\n\nfunction makeFace(points: readonly Vec3[], a: number, b: number, c: number): HullFace {\n const normal = cross(sub(at(points, b), at(points, a)), sub(at(points, c), at(points, a)));\n const len = lengthVec(normal);\n const n = len > 1e-14 ? { x: normal.x / len, y: normal.y / len, z: normal.z / len } : normal;\n return {\n a,\n b,\n c,\n normal: n,\n offset: dot(n, at(points, a)),\n alive: true,\n outsidePoints: [],\n };\n}\n\nfunction signedDist(face: HullFace, point: Vec3): number {\n return dot(face.normal, point) - face.offset;\n}\n\n// ---------------------------------------------------------------------------\n// Deduplication\n// ---------------------------------------------------------------------------\n\nfunction deduplicatePoints(points: Vec3[], tolerance: number): Vec3[] {\n const tolSq = tolerance * tolerance;\n const result: Vec3[] = [];\n for (const p of points) {\n let isDuplicate = false;\n for (const q of result) {\n if (distSq(p, q) < tolSq) {\n isDuplicate = true;\n break;\n }\n }\n if (!isDuplicate) result.push(p);\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Initial tetrahedron\n// ---------------------------------------------------------------------------\n\nfunction findInitialTetrahedron(points: readonly Vec3[]): [number, number, number, number] | null {\n const n = points.length;\n if (n < 4) return null;\n\n // Find two most distant points along each axis, pick the pair with max distance\n let i0 = 0;\n let i1 = 1;\n let maxDist = distSq(at(points, 0), at(points, 1));\n\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const d = distSq(at(points, i), at(points, j));\n if (d > maxDist) {\n maxDist = d;\n i0 = i;\n i1 = j;\n }\n }\n }\n\n if (maxDist < 1e-20) return null;\n\n // Find point most distant from line i0-i1\n const lineDir = sub(at(points, i1), at(points, i0));\n let i2 = -1;\n let maxLineDist = -1;\n\n for (let i = 0; i < n; i++) {\n if (i === i0 || i === i1) continue;\n const v = sub(at(points, i), at(points, i0));\n const c = cross(lineDir, v);\n const d = dot(c, c);\n if (d > maxLineDist) {\n maxLineDist = d;\n i2 = i;\n }\n }\n\n if (i2 === -1 || maxLineDist < 1e-20) return null;\n\n // Find point most distant from plane i0-i1-i2\n const planeNormal = cross(\n sub(at(points, i1), at(points, i0)),\n sub(at(points, i2), at(points, i0))\n );\n const planeLen = lengthVec(planeNormal);\n if (planeLen < 1e-14) return null;\n\n const pn = {\n x: planeNormal.x / planeLen,\n y: planeNormal.y / planeLen,\n z: planeNormal.z / planeLen,\n };\n const planeOffset = dot(pn, at(points, i0));\n\n let i3 = -1;\n let maxPlaneDist = -1;\n\n for (let i = 0; i < n; i++) {\n if (i === i0 || i === i1 || i === i2) continue;\n const d = Math.abs(dot(pn, at(points, i)) - planeOffset);\n if (d > maxPlaneDist) {\n maxPlaneDist = d;\n i3 = i;\n }\n }\n\n if (i3 === -1 || maxPlaneDist < 1e-14) return null;\n\n // Orient tetrahedron so that i3 is \"above\" the base triangle\n const sd = dot(pn, at(points, i3)) - planeOffset;\n if (sd > 0) {\n return [i0, i2, i1, i3]; // flip base winding\n }\n return [i0, i1, i2, i3];\n}\n\n// ---------------------------------------------------------------------------\n// QuickHull\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the 3D convex hull of a point set.\n *\n * @param inputPoints - Input points to build the hull from.\n * @param tolerance - Coincidence tolerance for point deduplication.\n * @returns The hull faces (triangle indices) and deduplicated points.\n * @throws if fewer than 4 non-coincident, non-coplanar points are supplied.\n */\n// brepjs-patterns-disable: max-function-lines -- cohesive QuickHull main loop; splitting hurts readability\nexport function quickHull(inputPoints: Vec3[], tolerance: number): HullResult {\n const points = deduplicatePoints(inputPoints, tolerance);\n\n if (points.length < 4) {\n throw new Error(\n points.length === 0\n ? 'No points provided for convex hull'\n : 'Fewer than 4 non-coincident points; cannot form a 3D convex hull'\n );\n }\n\n const tet = findInitialTetrahedron(points);\n if (tet === null) {\n throw new Error('All points are coplanar; cannot form a 3D convex hull');\n }\n\n const [t0, t1, t2, t3] = tet;\n\n // Centroid of initial tetrahedron for ensuring outward normals\n const centroid: Vec3 = {\n x: (at(points, t0).x + at(points, t1).x + at(points, t2).x + at(points, t3).x) / 4,\n y: (at(points, t0).y + at(points, t1).y + at(points, t2).y + at(points, t3).y) / 4,\n z: (at(points, t0).z + at(points, t1).z + at(points, t2).z + at(points, t3).z) / 4,\n };\n\n // Build initial 4 faces of tetrahedron, ensuring outward normals\n function makeOutwardFace(a: number, b: number, c: number): HullFace {\n const face = makeFace(points, a, b, c);\n // If normal points toward centroid, flip the winding\n const faceCenter: Vec3 = {\n x: (at(points, a).x + at(points, b).x + at(points, c).x) / 3,\n y: (at(points, a).y + at(points, b).y + at(points, c).y) / 3,\n z: (at(points, a).z + at(points, b).z + at(points, c).z) / 3,\n };\n const toCentroid = sub(centroid, faceCenter);\n if (dot(face.normal, toCentroid) > 0) {\n // Normal points inward, flip\n return makeFace(points, a, c, b);\n }\n return face;\n }\n\n const faces: HullFace[] = [\n makeOutwardFace(t0, t1, t2),\n makeOutwardFace(t0, t2, t3),\n makeOutwardFace(t0, t3, t1),\n makeOutwardFace(t1, t3, t2),\n ];\n\n const tetSet = new Set([t0, t1, t2, t3]);\n\n // Use a small geometric epsilon for \"outside\" tests, independent of mesh tolerance.\n // Mesh tolerance controls deduplication; hull geometry uses a much tighter epsilon.\n const epsilon = 1e-10;\n\n // Assign each non-tet point to the first visible face\n for (let i = 0; i < points.length; i++) {\n if (tetSet.has(i)) continue;\n for (const face of faces) {\n if (signedDist(face, at(points, i)) > epsilon) {\n face.outsidePoints.push(i);\n break;\n }\n }\n }\n\n for (let iteration = 0; iteration < points.length * 4; iteration++) {\n // Find a face with outside points\n let currentFace: HullFace | null = null;\n for (const face of faces) {\n if (face.alive && face.outsidePoints.length > 0) {\n currentFace = face;\n break;\n }\n }\n if (currentFace === null) break;\n\n // Find the furthest point from this face\n let furthestIdx = atN(currentFace.outsidePoints, 0);\n let furthestDist = signedDist(currentFace, at(points, furthestIdx));\n for (let i = 1; i < currentFace.outsidePoints.length; i++) {\n const idx = atN(currentFace.outsidePoints, i);\n const d = signedDist(currentFace, at(points, idx));\n if (d > furthestDist) {\n furthestDist = d;\n furthestIdx = idx;\n }\n }\n\n // Find all visible faces from this point\n const visibleFaces: HullFace[] = [];\n for (const face of faces) {\n if (face.alive && signedDist(face, at(points, furthestIdx)) > epsilon) {\n visibleFaces.push(face);\n }\n }\n\n // Find horizon edges (edges shared by exactly one visible face)\n const edgeCount = new Map<string, { a: number; b: number; count: number }>();\n for (const face of visibleFaces) {\n const edges: [number, number][] = [\n [face.a, face.b],\n [face.b, face.c],\n [face.c, face.a],\n ];\n for (const [ea, eb] of edges) {\n const key = ea < eb ? `${ea}-${eb}` : `${eb}-${ea}`;\n const entry = edgeCount.get(key);\n if (entry) {\n entry.count++;\n } else {\n // Store in the order from the visible face\n edgeCount.set(key, { a: ea, b: eb, count: 1 });\n }\n }\n }\n\n const horizonEdges: Array<{ a: number; b: number }> = [];\n for (const entry of edgeCount.values()) {\n if (entry.count === 1) {\n // Keep edge in same direction as the visible face; makeFace with apex\n // produces outward normal by winding convention\n horizonEdges.push({ a: entry.a, b: entry.b });\n }\n }\n\n // Collect orphaned outside points from visible faces\n const orphanedPoints: number[] = [];\n for (const face of visibleFaces) {\n for (const idx of face.outsidePoints) {\n if (idx !== furthestIdx) {\n orphanedPoints.push(idx);\n }\n }\n face.alive = false;\n face.outsidePoints = [];\n }\n\n // Create new faces from horizon edges to the furthest point\n const newFaces: HullFace[] = [];\n for (const edge of horizonEdges) {\n const newFaceObj = makeFace(points, edge.a, edge.b, furthestIdx);\n newFaces.push(newFaceObj);\n faces.push(newFaceObj);\n }\n\n // Reassign orphaned points to new faces\n for (const idx of orphanedPoints) {\n for (const face of newFaces) {\n if (signedDist(face, at(points, idx)) > epsilon) {\n face.outsidePoints.push(idx);\n break;\n }\n }\n }\n }\n\n // Collect alive faces\n const resultFaces: Array<readonly [number, number, number]> = [];\n for (const face of faces) {\n if (face.alive) {\n resultFaces.push([face.a, face.b, face.c] as const);\n }\n }\n\n return { faces: resultFaces, points };\n}\n"]}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Convex hull operations for the faijs occt kernel(第一方模块)。
3
+ *
4
+ * 2026-09-25 core-decouple Phase 2 §5.1:最小闭包移植——算法复制自 brepjs
5
+ * `src/kernel/occtWasm/hullOps.ts` + `src/kernel/occtWasm/constructionOps.ts#buildSolidFromFaces`,
6
+ * BREP 重建改为 core 的 occt-wasm 原生直调(`buildTriFace` / `sewAndSolidify` /
7
+ * `fixFaceOrientations` / `release`,occt-wasm index.d.ts 形态——ShapeHandle[]、
8
+ * Vec3 对象),**不 import brepjs**。occt-wasm 无原生 hull(Phase 0 实证),
9
+ * 故不直调原生 hull;QuickHull 由 `./hullGeometry` 承担。
10
+ */
11
+ import type { OcctKernel } from 'occt-wasm';
12
+ import type { BrepHandle } from '../brep/engine/types.js';
13
+ import { type Vec3 } from './hullGeometry.js';
14
+ /**
15
+ * 由点集构造凸包实体(brepjs 原语义:quickHull → 三角面 → 缝合 → 修复朝向 → solid)。
16
+ *
17
+ * @param k - OCCT kernel used for BREP reconstruction.
18
+ * @param points - Input points to build the hull from.
19
+ * @param tolerance - Point coincidence tolerance for QuickHull.
20
+ * @returns The constructed hull solid handle.
21
+ * @throws 点数不足 4 或退化(面 < 4)——与 brepjs 原实现一致。
22
+ */
23
+ export declare function hullFromPoints(k: OcctKernel, points: Vec3[], tolerance: number): BrepHandle;
24
+ //# sourceMappingURL=hullOps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hullOps.d.ts","sourceRoot":"","sources":["../../src/occt-kernel/hullOps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,WAAW,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAa,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAErD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,CAAC,EAAE,UAAU,EACb,MAAM,EAAE,IAAI,EAAE,EACd,SAAS,EAAE,MAAM,GAChB,UAAU,CAyBZ"}