@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,124 @@
1
+ /**
2
+ * Pure vector operations on Vec3 tuples.
3
+ *
4
+ * 第一方模块(2026-09-25 core-decouple Phase 1):复制自 brepjs
5
+ * `src/core/vecOps.ts`(同源复制,签名不变);import 来源改为 compat 面
6
+ * 第一方 `types.ts`。
7
+ */
8
+ import type { Vec3 } from './types.js';
9
+ /** Add two 3D vectors component-wise.
10
+ *
11
+ * @param a - First vector.
12
+ * @param b - Second vector.
13
+ * @returns The component-wise sum `a + b`.
14
+ */
15
+ export declare function vecAdd(a: Vec3, b: Vec3): Vec3;
16
+ /** Subtract vector `b` from vector `a` component-wise.
17
+ *
18
+ * @param a - Vector to subtract from.
19
+ * @param b - Vector to subtract.
20
+ * @returns The component-wise difference `a - b`.
21
+ */
22
+ export declare function vecSub(a: Vec3, b: Vec3): Vec3;
23
+ /** Multiply each component of a 3D vector by a scalar.
24
+ *
25
+ * @param v - Vector to scale.
26
+ * @param s - Scalar multiplier.
27
+ * @returns The scaled vector.
28
+ */
29
+ export declare function vecScale(v: Vec3, s: number): Vec3;
30
+ /** Negate all components of a 3D vector.
31
+ *
32
+ * @param v - Vector to negate.
33
+ * @returns The negated vector `-v`.
34
+ */
35
+ export declare function vecNegate(v: Vec3): Vec3;
36
+ /** Compute the dot product of two 3D vectors.
37
+ *
38
+ * @param a - First vector.
39
+ * @param b - Second vector.
40
+ * @returns The scalar dot product `a · b`.
41
+ */
42
+ export declare function vecDot(a: Vec3, b: Vec3): number;
43
+ /** Compute the cross product of two 3D vectors.
44
+ *
45
+ * @param a - First vector.
46
+ * @param b - Second vector.
47
+ * @returns The cross product `a × b`.
48
+ */
49
+ export declare function vecCross(a: Vec3, b: Vec3): Vec3;
50
+ /** Compute the Euclidean length of a 3D vector.
51
+ *
52
+ * @param v - Vector to measure.
53
+ * @returns The Euclidean length of `v`.
54
+ */
55
+ export declare function vecLength(v: Vec3): number;
56
+ /** Compute the squared length of a 3D vector (avoids a sqrt).
57
+ *
58
+ * @param v - Vector to measure.
59
+ * @returns The squared Euclidean length of `v`.
60
+ */
61
+ export declare function vecLengthSq(v: Vec3): number;
62
+ /** Compute the Euclidean distance between two 3D points.
63
+ *
64
+ * @param a - First point.
65
+ * @param b - Second point.
66
+ * @returns The distance `|a - b|`.
67
+ */
68
+ export declare function vecDistance(a: Vec3, b: Vec3): number;
69
+ /** Return a unit-length vector in the same direction, or `[0,0,0]` for near-zero input.
70
+ *
71
+ * @param v - Vector to normalize.
72
+ * @returns A unit-length vector in the same direction, or `[0,0,0]`.
73
+ */
74
+ export declare function vecNormalize(v: Vec3): Vec3;
75
+ /**
76
+ * Test whether two 3D vectors are approximately equal.
77
+ *
78
+ * @param a - First vector.
79
+ * @param b - Second vector.
80
+ * @param tolerance - Per-component absolute tolerance.
81
+ * @returns True if the vectors are approximately equal.
82
+ * @default tolerance `1e-5`
83
+ */
84
+ export declare function vecEquals(a: Vec3, b: Vec3, tolerance?: number): boolean;
85
+ /**
86
+ * Test whether a 3D vector is approximately zero-length.
87
+ *
88
+ * @param v - Vector to test.
89
+ * @param tolerance - Length threshold below which the vector is considered zero.
90
+ * @returns True if the vector is approximately zero-length.
91
+ * @default tolerance `1e-10`
92
+ */
93
+ export declare function vecIsZero(v: Vec3, tolerance?: number): boolean;
94
+ /**
95
+ * Compute the unsigned angle between two 3D vectors in **radians**.
96
+ *
97
+ * @param a - First vector.
98
+ * @param b - Second vector.
99
+ * @returns Angle in `[0, PI]`, or `0` if either vector is zero-length.
100
+ */
101
+ export declare function vecAngle(a: Vec3, b: Vec3): number;
102
+ /** Project vector onto plane defined by its normal
103
+ *
104
+ * @param v - Vector to project.
105
+ * @param planeOrigin - A point on the plane.
106
+ * @param planeNormal - Plane normal (need not be unit length).
107
+ * @returns The projection of `v` onto the plane.
108
+ */
109
+ export declare function vecProjectToPlane(v: Vec3, planeOrigin: Vec3, planeNormal: Vec3): Vec3;
110
+ /** Rotate vector around an axis by angle (radians)
111
+ *
112
+ * @param v - Vector to rotate.
113
+ * @param axis - Rotation axis (need not be unit length).
114
+ * @param angleRad - Rotation angle in radians.
115
+ * @returns The rotated vector.
116
+ */
117
+ export declare function vecRotate(v: Vec3, axis: Vec3, angleRad: number): Vec3;
118
+ /** Format a Vec3 as a human-readable string rounded to 3 decimal places.
119
+ *
120
+ * @param v - Vector to format.
121
+ * @returns A human-readable representation of `v`.
122
+ */
123
+ export declare function vecRepr(v: Vec3): string;
124
+ //# sourceMappingURL=vecOps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vecOps.d.ts","sourceRoot":"","sources":["../../../src/api/brepjs-compat/vecOps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAMpC;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAEvC;AAMD;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAE/C;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAE/C;AAMD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAE3C;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAEpD;AAMD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAI1C;AAMD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,SAAO,GAAG,OAAO,CAMrE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,SAAQ,GAAG,OAAO,CAE7D;AAMD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAOjD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,GAAG,IAAI,CAMrF;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAYrE;AAQD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAEvC"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Pure vector operations on Vec3 tuples.
3
+ *
4
+ * 第一方模块(2026-09-25 core-decouple Phase 1):复制自 brepjs
5
+ * `src/core/vecOps.ts`(同源复制,签名不变);import 来源改为 compat 面
6
+ * 第一方 `types.ts`。
7
+ */
8
+ // ---------------------------------------------------------------------------
9
+ // Arithmetic
10
+ // ---------------------------------------------------------------------------
11
+ /** Add two 3D vectors component-wise.
12
+ *
13
+ * @param a - First vector.
14
+ * @param b - Second vector.
15
+ * @returns The component-wise sum `a + b`.
16
+ */
17
+ export function vecAdd(a, b) {
18
+ return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];
19
+ }
20
+ /** Subtract vector `b` from vector `a` component-wise.
21
+ *
22
+ * @param a - Vector to subtract from.
23
+ * @param b - Vector to subtract.
24
+ * @returns The component-wise difference `a - b`.
25
+ */
26
+ export function vecSub(a, b) {
27
+ return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
28
+ }
29
+ /** Multiply each component of a 3D vector by a scalar.
30
+ *
31
+ * @param v - Vector to scale.
32
+ * @param s - Scalar multiplier.
33
+ * @returns The scaled vector.
34
+ */
35
+ export function vecScale(v, s) {
36
+ return [v[0] * s, v[1] * s, v[2] * s];
37
+ }
38
+ /** Negate all components of a 3D vector.
39
+ *
40
+ * @param v - Vector to negate.
41
+ * @returns The negated vector `-v`.
42
+ */
43
+ export function vecNegate(v) {
44
+ return [-v[0], -v[1], -v[2]];
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // Products
48
+ // ---------------------------------------------------------------------------
49
+ /** Compute the dot product of two 3D vectors.
50
+ *
51
+ * @param a - First vector.
52
+ * @param b - Second vector.
53
+ * @returns The scalar dot product `a · b`.
54
+ */
55
+ export function vecDot(a, b) {
56
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
57
+ }
58
+ /** Compute the cross product of two 3D vectors.
59
+ *
60
+ * @param a - First vector.
61
+ * @param b - Second vector.
62
+ * @returns The cross product `a × b`.
63
+ */
64
+ export function vecCross(a, b) {
65
+ return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
66
+ }
67
+ // ---------------------------------------------------------------------------
68
+ // Length / distance
69
+ // ---------------------------------------------------------------------------
70
+ /** Compute the Euclidean length of a 3D vector.
71
+ *
72
+ * @param v - Vector to measure.
73
+ * @returns The Euclidean length of `v`.
74
+ */
75
+ export function vecLength(v) {
76
+ return Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
77
+ }
78
+ /** Compute the squared length of a 3D vector (avoids a sqrt).
79
+ *
80
+ * @param v - Vector to measure.
81
+ * @returns The squared Euclidean length of `v`.
82
+ */
83
+ export function vecLengthSq(v) {
84
+ return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
85
+ }
86
+ /** Compute the Euclidean distance between two 3D points.
87
+ *
88
+ * @param a - First point.
89
+ * @param b - Second point.
90
+ * @returns The distance `|a - b|`.
91
+ */
92
+ export function vecDistance(a, b) {
93
+ return vecLength(vecSub(a, b));
94
+ }
95
+ // ---------------------------------------------------------------------------
96
+ // Normalization
97
+ // ---------------------------------------------------------------------------
98
+ /** Return a unit-length vector in the same direction, or `[0,0,0]` for near-zero input.
99
+ *
100
+ * @param v - Vector to normalize.
101
+ * @returns A unit-length vector in the same direction, or `[0,0,0]`.
102
+ */
103
+ export function vecNormalize(v) {
104
+ const len = vecLength(v);
105
+ if (len < 1e-10)
106
+ return [0, 0, 0];
107
+ return [v[0] / len, v[1] / len, v[2] / len];
108
+ }
109
+ // ---------------------------------------------------------------------------
110
+ // Comparison
111
+ // ---------------------------------------------------------------------------
112
+ /**
113
+ * Test whether two 3D vectors are approximately equal.
114
+ *
115
+ * @param a - First vector.
116
+ * @param b - Second vector.
117
+ * @param tolerance - Per-component absolute tolerance.
118
+ * @returns True if the vectors are approximately equal.
119
+ * @default tolerance `1e-5`
120
+ */
121
+ export function vecEquals(a, b, tolerance = 1e-5) {
122
+ return (Math.abs(a[0] - b[0]) < tolerance &&
123
+ Math.abs(a[1] - b[1]) < tolerance &&
124
+ Math.abs(a[2] - b[2]) < tolerance);
125
+ }
126
+ /**
127
+ * Test whether a 3D vector is approximately zero-length.
128
+ *
129
+ * @param v - Vector to test.
130
+ * @param tolerance - Length threshold below which the vector is considered zero.
131
+ * @returns True if the vector is approximately zero-length.
132
+ * @default tolerance `1e-10`
133
+ */
134
+ export function vecIsZero(v, tolerance = 1e-10) {
135
+ return vecLengthSq(v) < tolerance * tolerance;
136
+ }
137
+ // ---------------------------------------------------------------------------
138
+ // Geometry
139
+ // ---------------------------------------------------------------------------
140
+ /**
141
+ * Compute the unsigned angle between two 3D vectors in **radians**.
142
+ *
143
+ * @param a - First vector.
144
+ * @param b - Second vector.
145
+ * @returns Angle in `[0, PI]`, or `0` if either vector is zero-length.
146
+ */
147
+ export function vecAngle(a, b) {
148
+ const dot = vecDot(a, b);
149
+ const lenA = vecLength(a);
150
+ const lenB = vecLength(b);
151
+ if (lenA < 1e-10 || lenB < 1e-10)
152
+ return 0;
153
+ const cosAngle = Math.max(-1, Math.min(1, dot / (lenA * lenB)));
154
+ return Math.acos(cosAngle);
155
+ }
156
+ /** Project vector onto plane defined by its normal
157
+ *
158
+ * @param v - Vector to project.
159
+ * @param planeOrigin - A point on the plane.
160
+ * @param planeNormal - Plane normal (need not be unit length).
161
+ * @returns The projection of `v` onto the plane.
162
+ */
163
+ export function vecProjectToPlane(v, planeOrigin, planeNormal) {
164
+ const relative = vecSub(v, planeOrigin);
165
+ const normalLen = vecLengthSq(planeNormal);
166
+ if (normalLen < 1e-20)
167
+ return v;
168
+ const projection = vecScale(planeNormal, vecDot(relative, planeNormal) / normalLen);
169
+ return vecSub(v, projection);
170
+ }
171
+ /** Rotate vector around an axis by angle (radians)
172
+ *
173
+ * @param v - Vector to rotate.
174
+ * @param axis - Rotation axis (need not be unit length).
175
+ * @param angleRad - Rotation angle in radians.
176
+ * @returns The rotated vector.
177
+ */
178
+ export function vecRotate(v, axis, angleRad) {
179
+ const n = vecNormalize(axis);
180
+ const cos = Math.cos(angleRad);
181
+ const sin = Math.sin(angleRad);
182
+ const dot = vecDot(v, n);
183
+ const cross = vecCross(n, v);
184
+ return [
185
+ v[0] * cos + cross[0] * sin + n[0] * dot * (1 - cos),
186
+ v[1] * cos + cross[1] * sin + n[1] * dot * (1 - cos),
187
+ v[2] * cos + cross[2] * sin + n[2] * dot * (1 - cos),
188
+ ];
189
+ }
190
+ // ---------------------------------------------------------------------------
191
+ // Formatting
192
+ // ---------------------------------------------------------------------------
193
+ const round3 = (v) => Math.round(v * 1000) / 1000;
194
+ /** Format a Vec3 as a human-readable string rounded to 3 decimal places.
195
+ *
196
+ * @param v - Vector to format.
197
+ * @returns A human-readable representation of `v`.
198
+ */
199
+ export function vecRepr(v) {
200
+ return `x: ${round3(v[0])}, y: ${round3(v[1])}, z: ${round3(v[2])}`;
201
+ }
202
+ //# sourceMappingURL=vecOps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vecOps.js","sourceRoot":"","sources":["../../../src/api/brepjs-compat/vecOps.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure vector operations on Vec3 tuples.\n *\n * 第一方模块(2026-09-25 core-decouple Phase 1):复制自 brepjs\n * `src/core/vecOps.ts`(同源复制,签名不变);import 来源改为 compat 面\n * 第一方 `types.ts`。\n */\n\nimport type { Vec3 } from './types';\n\n// ---------------------------------------------------------------------------\n// Arithmetic\n// ---------------------------------------------------------------------------\n\n/** Add two 3D vectors component-wise.\n *\n * @param a - First vector.\n * @param b - Second vector.\n * @returns The component-wise sum `a + b`.\n */\nexport function vecAdd(a: Vec3, b: Vec3): Vec3 {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];\n}\n\n/** Subtract vector `b` from vector `a` component-wise.\n *\n * @param a - Vector to subtract from.\n * @param b - Vector to subtract.\n * @returns The component-wise difference `a - b`.\n */\nexport function vecSub(a: Vec3, b: Vec3): Vec3 {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n}\n\n/** Multiply each component of a 3D vector by a scalar.\n *\n * @param v - Vector to scale.\n * @param s - Scalar multiplier.\n * @returns The scaled vector.\n */\nexport function vecScale(v: Vec3, s: number): Vec3 {\n return [v[0] * s, v[1] * s, v[2] * s];\n}\n\n/** Negate all components of a 3D vector.\n *\n * @param v - Vector to negate.\n * @returns The negated vector `-v`.\n */\nexport function vecNegate(v: Vec3): Vec3 {\n return [-v[0], -v[1], -v[2]];\n}\n\n// ---------------------------------------------------------------------------\n// Products\n// ---------------------------------------------------------------------------\n\n/** Compute the dot product of two 3D vectors.\n *\n * @param a - First vector.\n * @param b - Second vector.\n * @returns The scalar dot product `a · b`.\n */\nexport function vecDot(a: Vec3, b: Vec3): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\n/** Compute the cross product of two 3D vectors.\n *\n * @param a - First vector.\n * @param b - Second vector.\n * @returns The cross product `a × b`.\n */\nexport function vecCross(a: Vec3, b: Vec3): Vec3 {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\n\n// ---------------------------------------------------------------------------\n// Length / distance\n// ---------------------------------------------------------------------------\n\n/** Compute the Euclidean length of a 3D vector.\n *\n * @param v - Vector to measure.\n * @returns The Euclidean length of `v`.\n */\nexport function vecLength(v: Vec3): number {\n return Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n}\n\n/** Compute the squared length of a 3D vector (avoids a sqrt).\n *\n * @param v - Vector to measure.\n * @returns The squared Euclidean length of `v`.\n */\nexport function vecLengthSq(v: Vec3): number {\n return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];\n}\n\n/** Compute the Euclidean distance between two 3D points.\n *\n * @param a - First point.\n * @param b - Second point.\n * @returns The distance `|a - b|`.\n */\nexport function vecDistance(a: Vec3, b: Vec3): number {\n return vecLength(vecSub(a, b));\n}\n\n// ---------------------------------------------------------------------------\n// Normalization\n// ---------------------------------------------------------------------------\n\n/** Return a unit-length vector in the same direction, or `[0,0,0]` for near-zero input.\n *\n * @param v - Vector to normalize.\n * @returns A unit-length vector in the same direction, or `[0,0,0]`.\n */\nexport function vecNormalize(v: Vec3): Vec3 {\n const len = vecLength(v);\n if (len < 1e-10) return [0, 0, 0];\n return [v[0] / len, v[1] / len, v[2] / len];\n}\n\n// ---------------------------------------------------------------------------\n// Comparison\n// ---------------------------------------------------------------------------\n\n/**\n * Test whether two 3D vectors are approximately equal.\n *\n * @param a - First vector.\n * @param b - Second vector.\n * @param tolerance - Per-component absolute tolerance.\n * @returns True if the vectors are approximately equal.\n * @default tolerance `1e-5`\n */\nexport function vecEquals(a: Vec3, b: Vec3, tolerance = 1e-5): boolean {\n return (\n Math.abs(a[0] - b[0]) < tolerance &&\n Math.abs(a[1] - b[1]) < tolerance &&\n Math.abs(a[2] - b[2]) < tolerance\n );\n}\n\n/**\n * Test whether a 3D vector is approximately zero-length.\n *\n * @param v - Vector to test.\n * @param tolerance - Length threshold below which the vector is considered zero.\n * @returns True if the vector is approximately zero-length.\n * @default tolerance `1e-10`\n */\nexport function vecIsZero(v: Vec3, tolerance = 1e-10): boolean {\n return vecLengthSq(v) < tolerance * tolerance;\n}\n\n// ---------------------------------------------------------------------------\n// Geometry\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the unsigned angle between two 3D vectors in **radians**.\n *\n * @param a - First vector.\n * @param b - Second vector.\n * @returns Angle in `[0, PI]`, or `0` if either vector is zero-length.\n */\nexport function vecAngle(a: Vec3, b: Vec3): number {\n const dot = vecDot(a, b);\n const lenA = vecLength(a);\n const lenB = vecLength(b);\n if (lenA < 1e-10 || lenB < 1e-10) return 0;\n const cosAngle = Math.max(-1, Math.min(1, dot / (lenA * lenB)));\n return Math.acos(cosAngle);\n}\n\n/** Project vector onto plane defined by its normal\n *\n * @param v - Vector to project.\n * @param planeOrigin - A point on the plane.\n * @param planeNormal - Plane normal (need not be unit length).\n * @returns The projection of `v` onto the plane.\n */\nexport function vecProjectToPlane(v: Vec3, planeOrigin: Vec3, planeNormal: Vec3): Vec3 {\n const relative = vecSub(v, planeOrigin);\n const normalLen = vecLengthSq(planeNormal);\n if (normalLen < 1e-20) return v;\n const projection = vecScale(planeNormal, vecDot(relative, planeNormal) / normalLen);\n return vecSub(v, projection);\n}\n\n/** Rotate vector around an axis by angle (radians)\n *\n * @param v - Vector to rotate.\n * @param axis - Rotation axis (need not be unit length).\n * @param angleRad - Rotation angle in radians.\n * @returns The rotated vector.\n */\nexport function vecRotate(v: Vec3, axis: Vec3, angleRad: number): Vec3 {\n const n = vecNormalize(axis);\n const cos = Math.cos(angleRad);\n const sin = Math.sin(angleRad);\n const dot = vecDot(v, n);\n const cross = vecCross(n, v);\n\n return [\n v[0] * cos + cross[0] * sin + n[0] * dot * (1 - cos),\n v[1] * cos + cross[1] * sin + n[1] * dot * (1 - cos),\n v[2] * cos + cross[2] * sin + n[2] * dot * (1 - cos),\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Formatting\n// ---------------------------------------------------------------------------\n\nconst round3 = (v: number): number => Math.round(v * 1000) / 1000;\n\n/** Format a Vec3 as a human-readable string rounded to 3 decimal places.\n *\n * @param v - Vector to format.\n * @returns A human-readable representation of `v`.\n */\nexport function vecRepr(v: Vec3): string {\n return `x: ${round3(v[0])}, y: ${round3(v[1])}, z: ${round3(v[2])}`;\n}\n"]}
@@ -1,6 +1,11 @@
1
1
  /**
2
2
  * stdlib chamfer — chamfer 倒角库函数(BREP-only,directEdit 能力)
3
3
  *
4
+ * 平台分层(narrowing plan Phase 5,D11):**平台 op(occt)**——`equal` 类型走
5
+ * `chamferWithRoleTable`(→ face-evolution.ts 的 `chamferWithHistory`,occt-only,
6
+ * D3 原生面),故整个 chamfer op 声明 `engines: ['occt']`;distanceAngle /
7
+ * twoDistances 分支的 `chamferDistAngle` 是 L1 方法(brepkit 可跑),但 op 的
8
+ * 引擎身份按最弱环节声明(D11:平台 op 非目标引擎下执行前报错)。
4
9
  *
5
10
  * 与 drill/engrave 的差异:没有 mesh 实现(defineOp({ brep })),输入非 BREP
6
11
  * 时由 dispatchPath 抛 E_MESH_UNSUPPORTED;mode='brep' 且引擎缺 directEdit 能力
@@ -1 +1 @@
1
- {"version":3,"file":"chamfer.d.ts","sourceRoot":"","sources":["../../src/api/chamfer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAM1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,KAAK,EAAe,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAQxE;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAuCzE;AAyCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,iBAAiB,EACtB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAgBxC;AAgGD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO;;CAUlB,CAAA"}
1
+ {"version":3,"file":"chamfer.d.ts","sourceRoot":"","sources":["../../src/api/chamfer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAO1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,KAAK,EAAe,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAQxE;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAuCzE;AAyCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,iBAAiB,EACtB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAgBxC;AAgGD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO;;CAUlB,CAAA"}
@@ -1,6 +1,11 @@
1
1
  /**
2
2
  * stdlib chamfer — chamfer 倒角库函数(BREP-only,directEdit 能力)
3
3
  *
4
+ * 平台分层(narrowing plan Phase 5,D11):**平台 op(occt)**——`equal` 类型走
5
+ * `chamferWithRoleTable`(→ face-evolution.ts 的 `chamferWithHistory`,occt-only,
6
+ * D3 原生面),故整个 chamfer op 声明 `engines: ['occt']`;distanceAngle /
7
+ * twoDistances 分支的 `chamferDistAngle` 是 L1 方法(brepkit 可跑),但 op 的
8
+ * 引擎身份按最弱环节声明(D11:平台 op 非目标引擎下执行前报错)。
4
9
  *
5
10
  * 与 drill/engrave 的差异:没有 mesh 实现(defineOp({ brep })),输入非 BREP
6
11
  * 时由 dispatchPath 抛 E_MESH_UNSUPPORTED;mode='brep' 且引擎缺 directEdit 能力
@@ -14,7 +19,8 @@
14
19
  */
15
20
  import { solidToShape } from '../brep/brep-ops.js';
16
21
  import { chamferWithRoleTable, identityEvolution } from '../brep/face-evolution.js';
17
- import { getBackends, getCurrentStmt } from '../runtime-state.js';
22
+ import { getBrepApi } from '../brep/handle-bridge.js';
23
+ import { getCurrentStmt } from '../runtime-state.js';
18
24
  import { fromBrep, brepOf, inputRoleTable } from '../shape.js';
19
25
  import { defineOp } from '../sdk.js';
20
26
  import { resolveTopoRef, facesForQualifier, TopoRefError } from '../topology/naming/index.js';
@@ -162,9 +168,8 @@ function chamferTwoDistances(kernel, edges, startCtx, solid, width1, width2) {
162
168
  }
163
169
  /** BREP-only 主入口(§3.6 flow)。 */
164
170
  function chamferBrep(input, params) {
165
- const kernel = getBackends().kernel.brep;
166
- if (!kernel)
167
- throw new Error('[stdlib/chamfer] no BREP kernel');
171
+ // L1 面:chamferDistAngle/枚举/命名(D12)。equal 分支经 face-evolution 走 occt 平台面。
172
+ const kernel = getBrepApi();
168
173
  const solid = brepOf(input);
169
174
  if (!solid)
170
175
  throw new Error('[stdlib/chamfer] E_CHAMFER_NO_BREP: input is not BREP');
@@ -225,10 +230,10 @@ function chamferBrep(input, params) {
225
230
  * const p = await cad.chamfer(part0, { edges: [{ kind:'edge', faces:[{ origin:'box', role:'box:top' }, { origin:'box', role:'box:front' }], hint:{ kind:'edge' } }], type:'equal', width:1 })
226
231
  */
227
232
  export const chamfer = defineOp({
228
- // Phase 2:能力声明精确到内核方法(替代族级 directEdit)——brepkit 无
229
- // chamfer/chamferDistAngle(chamferWithHistory 亦未导出),静态判定执行前报错,
230
- // 不落入"声明过宽 → 静默通过判定后死在运行时"的红线。
231
- capabilities: ['chamfer', 'chamferDistAngle'],
233
+ // 平台 op(D11):equal 路径依赖 occt-only chamferWithHistory(face-evolution.ts,
234
+ // D3)→ engines 声明;brepkit 无 chamfer 能力,
235
+ // 平台身份判定在执行前报错,替代旧的能力名拦截。
236
+ engines: ['occt'],
232
237
  brep(input, params) {
233
238
  assertChamferParams(params);
234
239
  return chamferBrep(input, params);
@@ -1 +1 @@
1
- {"version":3,"file":"chamfer.js","sourceRoot":"","sources":["../../src/api/chamfer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib chamfer — chamfer 倒角库函数(BREP-only,directEdit 能力)\n *\n *\n * 与 drill/engrave 的差异:没有 mesh 实现(defineOp({ brep })),输入非 BREP\n * 时由 dispatchPath 抛 E_MESH_UNSUPPORTED;mode='brep' 且引擎缺 directEdit 能力\n * → E_BREP_UNSUPPORTED(backend-dispatch.ts 单点判定)。\n *\n * 类型:\n * - equal(对称):kernel.chamfer(solid, edges, width)\n * - distanceAngle:kernel.chamferDistAngle(solid, edges, width, angle)\n * - twoDistances(双距):逐边按 §3.5 换算(width1,width2 + β → dF, θ),\n * per-edge 调 kernel.chamferDistAngle;凹棱(β ≥ 180°)→ E_CHAMFER_REFLEX_EDGE。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { chamferWithRoleTable, identityEvolution } from '../brep/face-evolution'\nimport { getBackends, getCurrentStmt } from '../runtime-state'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { EdgeTopoRef, ResolutionContext } from '../topology/naming'\nimport { resolveTopoRef, facesForQualifier, TopoRefError } from '../topology/naming'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { buildEdgeResolutionContext, buildEdgeContextFromSolid } from './topo-resolve'\nimport { angleBetweenNormals, materialDihedralFromNormalAngle, chamferAngleFromDistances } from './chamfer-math'\n\n// ── 参数自校验(stdlib 被直接 import 时的防御层)──\n\n/**\n * Validate chamfer parameters: `edges` must be a non-empty array of EdgeTopoRef,\n * each with kind key \"edge\" and a two-entry faces pair.\n * @param params the raw chamfer operation parameters.\n */\nexport function assertChamferParams(params: Record<string, unknown>): void {\n const edges = params.edges\n if (!Array.isArray(edges) || edges.length === 0) {\n throw new Error('E_CHAMFER_NO_EDGES: chamfer requires at least one edge')\n }\n for (const e of edges) {\n if (!e || typeof e !== 'object' || (e as { kind?: unknown }).kind !== 'edge') {\n throw new Error('E_CHAMFER_BAD_EDGE_REF: every edge entry must be an EdgeTopoRef with kind:\"edge\"')\n }\n const faces = (e as { faces?: unknown }).faces\n if (!Array.isArray(faces) || faces.length !== 2) {\n throw new Error('E_CHAMFER_BAD_EDGE_REF: EdgeTopoRef.faces must be a two-entry RoleQualifier pair')\n }\n }\n const type = params.type\n if (type !== 'equal' && type !== 'twoDistances' && type !== 'distanceAngle') {\n throw new Error('E_CHAMFER_BAD_TYPE: type must be equal | twoDistances | distanceAngle')\n }\n if (type === 'equal' || type === 'distanceAngle') {\n const width = params.width\n if (typeof width !== 'number' || !Number.isFinite(width) || width <= 0) {\n throw new Error('E_CHAMFER_BAD_WIDTH: chamfer.width must be a positive number')\n }\n if (type === 'distanceAngle') {\n const angle = params.angle\n if (typeof angle !== 'number' || !Number.isFinite(angle) || angle <= 0 || angle >= 90) {\n throw new Error('E_CHAMFER_BAD_ANGLE: chamfer.angle must be in (0, 90) degrees')\n }\n }\n } else {\n const w1 = params.width1\n const w2 = params.width2\n if (typeof w1 !== 'number' || !Number.isFinite(w1) || w1 <= 0) {\n throw new Error('E_CHAMFER_BAD_WIDTH: chamfer.width1 must be a positive number')\n }\n if (typeof w2 !== 'number' || !Number.isFinite(w2) || w2 <= 0) {\n throw new Error('E_CHAMFER_BAD_WIDTH: chamfer.width2 must be a positive number')\n }\n }\n}\n\n// ── §3.5 几何换算 ──\n\n/** 面中心外法向(与 captureFaceHint 同口径)。 */\nfunction faceMidNormal(kernel: BrepEngineApi, face: BrepHandle): [number, number, number] {\n const uv = kernel.uvBounds(face)\n const n = kernel.surfaceNormal(face, (uv.uMin + uv.uMax) / 2, (uv.vMin + uv.vMax) / 2)\n return [n.x, n.y, n.z]\n}\n\nfunction dot3(a: readonly number[], b: readonly number[]): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n}\n\nfunction radToDeg(rad: number): number {\n return (rad * 180) / Math.PI\n}\n\n/** 复刻 occt-wasm 的双层枚举(config.rs:517-527):返回内核选用的参考面在\n * `faceHandles`(getSubShapes(solid,'face'))数组中的下标(0 起);找不到 → null。 */\nfunction refFaceIndex(kernel: BrepEngineApi, faceHandles: BrepHandle[], edge: BrepHandle): number | null {\n for (let fi = 0; fi < faceHandles.length; fi++) {\n for (const fe of kernel.getSubShapes(faceHandles[fi], 'edge')) {\n if (kernel.isSame(fe, edge)) return fi\n }\n }\n return null\n}\n\n/** 两邻面 outer-normal 夹角 → β(材料侧二面角,弧度)。 */\nfunction materialDihedralRad(kernel: BrepEngineApi, ctx: ResolutionContext, a: number, b: number): number {\n const ha = ctx.faces[a - 1]?.handle\n const hb = ctx.faces[b - 1]?.handle\n if (ha === undefined || hb === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `chamfer: adjacent face ${a}/${b} has no live handle`)\n }\n const gamma = angleBetweenNormals(dot3(faceMidNormal(kernel, ha), faceMidNormal(kernel, hb)))\n return materialDihedralFromNormalAngle(gamma)\n}\n\n/**\n * twoDistances 单边换算:width1/width2 + β(§3.5)→ (dF, θ) 供一次 chamferDistAngle。\n * 参考面由内核自选(refOrdinal 的面);width1 对应 faces[0] 侧、width2 对应 faces[1] 侧。\n *\n * @param kernel the OCCT kernel.\n * @param ctx the edge resolution context (faces with live handles).\n * @param refAOrdinal resolved ordinal of `EdgeTopoRef.faces[0]` (1-based).\n * @param refBOrdinal resolved ordinal of `EdgeTopoRef.faces[1]` (1-based).\n * @param refOrdinal the kernel reference face ordinal (1-based; the F in §3.5).\n * @param width1 the `width1` argument.\n * @param width2 the `width2` argument.\n * @returns { dF, angleDeg } for a single `kernel.chamferDistAngle` call.\n */\nexport function twoDistParams(\n kernel: BrepEngineApi,\n ctx: ResolutionContext,\n refAOrdinal: number,\n refBOrdinal: number,\n refOrdinal: number,\n width1: number,\n width2: number,\n): { distance: number; angleDeg: number } {\n const betaRad = materialDihedralRad(kernel, ctx, refAOrdinal, refBOrdinal)\n // dF/dO:§3.5 —— 内核参考面 == faces[0] → width1,== faces[1] → width2。\n let dF: number\n let dO: number\n if (refOrdinal === refAOrdinal) {\n dF = width1\n dO = width2\n } else if (refOrdinal === refBOrdinal) {\n dF = width2\n dO = width1\n } else {\n throw new Error(`E_CHAMFER_EDGE_MISMATCH: kernel ref face ordinal ${refOrdinal} not in [${refAOrdinal}, ${refBOrdinal}]`)\n }\n const angleRad = chamferAngleFromDistances(dF, dO, betaRad)\n return { distance: dF, angleDeg: radToDeg(angleRad) }\n}\n\n/** 解析一条 EdgeTopoRef → (ordinal, handle);失败抛命名层 TopoRefError。 */\nfunction resolveEdge(ctx: ResolutionContext, ref: EdgeTopoRef): { ordinal: number; handle: BrepHandle } {\n const r = resolveTopoRef(ref, ctx)\n if (r.handle === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `chamfer: edge resolved without handle (${ref.faces[0].role}/${ref.faces[1].role})`)\n }\n return { ordinal: r.ordinal, handle: r.handle as BrepHandle }\n}\n\n/** twoDistances 逐边构建(§3.6 V1):每条边一次 chamferDistAngle。 */\nfunction chamferTwoDistances(\n kernel: BrepEngineApi,\n edges: EdgeTopoRef[],\n startCtx: ResolutionContext,\n solid: BrepHandle,\n width1: number,\n width2: number,\n): BrepHandle {\n let resultSolid = solid\n for (const ref of edges) {\n const ctx = resultSolid === solid ? startCtx : buildEdgeContextFromSolid(kernel, resultSolid, startCtx.roleTable)\n const entity = resolveEdge(ctx, ref)\n const faces = resultSolid === solid ? startCtx.faces : ctx.faces\n const idx = refFaceIndex(kernel, faces.map((f) => f.handle).filter((h): h is BrepHandle => h !== undefined), entity.handle)\n if (idx === null) {\n throw new Error('E_CHAMFER_EDGE_MISMATCH: kernel cannot locate ref face (bug)')\n }\n const a = facesForQualifier(ref.faces[0], ctx)[0]\n const b = facesForQualifier(ref.faces[1], ctx)[0]\n const refOrdinal = idx + 1\n const p = twoDistParams(kernel, ctx, a?.ordinal ?? -1, b?.ordinal ?? -1, refOrdinal, width1, width2)\n resultSolid = kernel.chamferDistAngle(resultSolid, [entity.handle], p.distance, p.angleDeg)\n }\n return resultSolid\n}\n\n/** BREP-only 主入口(§3.6 flow)。 */\nfunction chamferBrep(input: Shape, params: Record<string, unknown>): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/chamfer] no BREP kernel')\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('[stdlib/chamfer] E_CHAMFER_NO_BREP: input is not BREP')\n\n const edges = (params.edges as unknown as EdgeTopoRef[] | undefined) ?? []\n const type = params.type as string\n const ctx = buildEdgeResolutionContext(kernel, input as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', 'input has no edge naming context')\n\n // 输入 roleTable + outStmt(与 boolean.ts / fillet.ts 同构)。Phase 1.6:origin=StmtId。\n const inputTable = inputRoleTable(input) as ReadonlyMap<unknown, unknown> | undefined\n const outStmt = String(getCurrentStmt()?.id ?? '')\n\n let resultSolid: BrepHandle\n let faceEvolution: Map<number, number[]> | undefined\n let roleTable: ReadonlyMap<unknown, unknown> | undefined\n\n switch (type) {\n case 'equal': {\n // P5:改走 chamferWithHistory + roleTable 传播(§3.2 末段)\n const edgeHandles = edges.map((e) => resolveEdge(ctx, e).handle)\n const r = chamferWithRoleTable(\n kernel,\n solid,\n edgeHandles,\n params.width as number,\n inputTable ?? new Map(),\n outStmt,\n )\n resultSolid = r.result\n faceEvolution = r.faceEvolution\n roleTable = r.roleTable\n break\n }\n case 'distanceAngle':\n resultSolid = kernel.chamferDistAngle(solid, edges.map((e) => resolveEdge(ctx, e).handle), params.width as number, params.angle as number)\n // chamferDistAngle 无 WithHistory 版本——用恒等面演化 + 原表\n faceEvolution = identityEvolution(kernel, resultSolid)\n roleTable = inputTable\n break\n case 'twoDistances':\n resultSolid = chamferTwoDistances(kernel, edges, ctx, solid, params.width1 as number, params.width2 as number)\n faceEvolution = identityEvolution(kernel, resultSolid)\n roleTable = inputTable\n break\n default:\n throw new Error('E_CHAMFER_BAD_TYPE')\n }\n\n return fromBrep(\n solidToShape(kernel, resultSolid),\n faceEvolution ? { solid: resultSolid, faceEvolution, roleTable } : { solid: resultSolid, roleTable },\n )\n}\n\n/**\n * 在几何体上倒角(等距 / 双距 / 距角)。仅 BREP 可用。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name chamfer\n * @note 倒角是 BREP-only:非 BREP 输入抛 E_MESH_UNSUPPORTED。参考面由内核自选,`width1` 沿 faces[0] 侧、`width2` 沿 faces[1] 侧。\n * @returns Shape 倒角后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.edges - 参与倒角的边(EdgeTopoRef[],条目为相邻两面的 role 线路)。type:EdgeTopoRef[] required:true\n * @param params.type - 倒角类型(equal | twoDistances | distanceAngle)。type:string required:true\n * @param params.width - type=equal: 倒角宽度(mm)。type:number 默认 1\n * @param params.width1 - type=twoDistances: 沿 faces[0] 侧距离(mm)。type:number\n * @param params.width2 - type=twoDistances: 沿 faces[1] 侧距离(mm)。type:number\n * @param params.angle - type=distanceAngle: 与参考面夹角(度,(0,90))。type:number\n * @example\n * const p = await cad.chamfer(part0, { edges: [{ kind:'edge', faces:[{ origin:'box', role:'box:top' }, { origin:'box', role:'box:front' }], hint:{ kind:'edge' } }], type:'equal', width:1 })\n */\nexport const chamfer = defineOp({\n // Phase 2:能力声明精确到内核方法(替代族级 directEdit)——brepkit 无\n // chamfer/chamferDistAngle(chamferWithHistory 亦未导出),静态判定执行前报错,\n // 不落入\"声明过宽 → 静默通过判定后死在运行时\"的红线。\n capabilities: ['chamfer', 'chamferDistAngle'],\n brep(input: Shape, params: Record<string, unknown>) {\n assertChamferParams(params)\n return chamferBrep(input, params)\n },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
1
+ {"version":3,"file":"chamfer.js","sourceRoot":"","sources":["../../src/api/chamfer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib chamfer — chamfer 倒角库函数(BREP-only,directEdit 能力)\n *\n * 平台分层(narrowing plan Phase 5,D11):**平台 op(occt)**——`equal` 类型走\n * `chamferWithRoleTable`(→ face-evolution.ts 的 `chamferWithHistory`,occt-only,\n * D3 原生面),故整个 chamfer op 声明 `engines: ['occt']`;distanceAngle /\n * twoDistances 分支的 `chamferDistAngle` 是 L1 方法(brepkit 可跑),但 op 的\n * 引擎身份按最弱环节声明(D11:平台 op 非目标引擎下执行前报错)。\n *\n * 与 drill/engrave 的差异:没有 mesh 实现(defineOp({ brep })),输入非 BREP\n * 时由 dispatchPath 抛 E_MESH_UNSUPPORTED;mode='brep' 且引擎缺 directEdit 能力\n * → E_BREP_UNSUPPORTED(backend-dispatch.ts 单点判定)。\n *\n * 类型:\n * - equal(对称):kernel.chamfer(solid, edges, width)\n * - distanceAngle:kernel.chamferDistAngle(solid, edges, width, angle)\n * - twoDistances(双距):逐边按 §3.5 换算(width1,width2 + β → dF, θ),\n * per-edge 调 kernel.chamferDistAngle;凹棱(β ≥ 180°)→ E_CHAMFER_REFLEX_EDGE。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { solidToShape } from '../brep/brep-ops'\nimport { chamferWithRoleTable, identityEvolution } from '../brep/face-evolution'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { getCurrentStmt } from '../runtime-state'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { EdgeTopoRef, ResolutionContext } from '../topology/naming'\nimport { resolveTopoRef, facesForQualifier, TopoRefError } from '../topology/naming'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { buildEdgeResolutionContext, buildEdgeContextFromSolid } from './topo-resolve'\nimport { angleBetweenNormals, materialDihedralFromNormalAngle, chamferAngleFromDistances } from './chamfer-math'\n\n// ── 参数自校验(stdlib 被直接 import 时的防御层)──\n\n/**\n * Validate chamfer parameters: `edges` must be a non-empty array of EdgeTopoRef,\n * each with kind key \"edge\" and a two-entry faces pair.\n * @param params the raw chamfer operation parameters.\n */\nexport function assertChamferParams(params: Record<string, unknown>): void {\n const edges = params.edges\n if (!Array.isArray(edges) || edges.length === 0) {\n throw new Error('E_CHAMFER_NO_EDGES: chamfer requires at least one edge')\n }\n for (const e of edges) {\n if (!e || typeof e !== 'object' || (e as { kind?: unknown }).kind !== 'edge') {\n throw new Error('E_CHAMFER_BAD_EDGE_REF: every edge entry must be an EdgeTopoRef with kind:\"edge\"')\n }\n const faces = (e as { faces?: unknown }).faces\n if (!Array.isArray(faces) || faces.length !== 2) {\n throw new Error('E_CHAMFER_BAD_EDGE_REF: EdgeTopoRef.faces must be a two-entry RoleQualifier pair')\n }\n }\n const type = params.type\n if (type !== 'equal' && type !== 'twoDistances' && type !== 'distanceAngle') {\n throw new Error('E_CHAMFER_BAD_TYPE: type must be equal | twoDistances | distanceAngle')\n }\n if (type === 'equal' || type === 'distanceAngle') {\n const width = params.width\n if (typeof width !== 'number' || !Number.isFinite(width) || width <= 0) {\n throw new Error('E_CHAMFER_BAD_WIDTH: chamfer.width must be a positive number')\n }\n if (type === 'distanceAngle') {\n const angle = params.angle\n if (typeof angle !== 'number' || !Number.isFinite(angle) || angle <= 0 || angle >= 90) {\n throw new Error('E_CHAMFER_BAD_ANGLE: chamfer.angle must be in (0, 90) degrees')\n }\n }\n } else {\n const w1 = params.width1\n const w2 = params.width2\n if (typeof w1 !== 'number' || !Number.isFinite(w1) || w1 <= 0) {\n throw new Error('E_CHAMFER_BAD_WIDTH: chamfer.width1 must be a positive number')\n }\n if (typeof w2 !== 'number' || !Number.isFinite(w2) || w2 <= 0) {\n throw new Error('E_CHAMFER_BAD_WIDTH: chamfer.width2 must be a positive number')\n }\n }\n}\n\n// ── §3.5 几何换算 ──\n\n/** 面中心外法向(与 captureFaceHint 同口径)。 */\nfunction faceMidNormal(kernel: BrepEngineApi, face: BrepHandle): [number, number, number] {\n const uv = kernel.uvBounds(face)\n const n = kernel.surfaceNormal(face, (uv.uMin + uv.uMax) / 2, (uv.vMin + uv.vMax) / 2)\n return [n.x, n.y, n.z]\n}\n\nfunction dot3(a: readonly number[], b: readonly number[]): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n}\n\nfunction radToDeg(rad: number): number {\n return (rad * 180) / Math.PI\n}\n\n/** 复刻 occt-wasm 的双层枚举(config.rs:517-527):返回内核选用的参考面在\n * `faceHandles`(getSubShapes(solid,'face'))数组中的下标(0 起);找不到 → null。 */\nfunction refFaceIndex(kernel: BrepEngineApi, faceHandles: BrepHandle[], edge: BrepHandle): number | null {\n for (let fi = 0; fi < faceHandles.length; fi++) {\n for (const fe of kernel.getSubShapes(faceHandles[fi], 'edge')) {\n if (kernel.isSame(fe, edge)) return fi\n }\n }\n return null\n}\n\n/** 两邻面 outer-normal 夹角 → β(材料侧二面角,弧度)。 */\nfunction materialDihedralRad(kernel: BrepEngineApi, ctx: ResolutionContext, a: number, b: number): number {\n const ha = ctx.faces[a - 1]?.handle\n const hb = ctx.faces[b - 1]?.handle\n if (ha === undefined || hb === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `chamfer: adjacent face ${a}/${b} has no live handle`)\n }\n const gamma = angleBetweenNormals(dot3(faceMidNormal(kernel, ha), faceMidNormal(kernel, hb)))\n return materialDihedralFromNormalAngle(gamma)\n}\n\n/**\n * twoDistances 单边换算:width1/width2 + β(§3.5)→ (dF, θ) 供一次 chamferDistAngle。\n * 参考面由内核自选(refOrdinal 的面);width1 对应 faces[0] 侧、width2 对应 faces[1] 侧。\n *\n * @param kernel the OCCT kernel.\n * @param ctx the edge resolution context (faces with live handles).\n * @param refAOrdinal resolved ordinal of `EdgeTopoRef.faces[0]` (1-based).\n * @param refBOrdinal resolved ordinal of `EdgeTopoRef.faces[1]` (1-based).\n * @param refOrdinal the kernel reference face ordinal (1-based; the F in §3.5).\n * @param width1 the `width1` argument.\n * @param width2 the `width2` argument.\n * @returns { dF, angleDeg } for a single `kernel.chamferDistAngle` call.\n */\nexport function twoDistParams(\n kernel: BrepEngineApi,\n ctx: ResolutionContext,\n refAOrdinal: number,\n refBOrdinal: number,\n refOrdinal: number,\n width1: number,\n width2: number,\n): { distance: number; angleDeg: number } {\n const betaRad = materialDihedralRad(kernel, ctx, refAOrdinal, refBOrdinal)\n // dF/dO:§3.5 —— 内核参考面 == faces[0] → width1,== faces[1] → width2。\n let dF: number\n let dO: number\n if (refOrdinal === refAOrdinal) {\n dF = width1\n dO = width2\n } else if (refOrdinal === refBOrdinal) {\n dF = width2\n dO = width1\n } else {\n throw new Error(`E_CHAMFER_EDGE_MISMATCH: kernel ref face ordinal ${refOrdinal} not in [${refAOrdinal}, ${refBOrdinal}]`)\n }\n const angleRad = chamferAngleFromDistances(dF, dO, betaRad)\n return { distance: dF, angleDeg: radToDeg(angleRad) }\n}\n\n/** 解析一条 EdgeTopoRef → (ordinal, handle);失败抛命名层 TopoRefError。 */\nfunction resolveEdge(ctx: ResolutionContext, ref: EdgeTopoRef): { ordinal: number; handle: BrepHandle } {\n const r = resolveTopoRef(ref, ctx)\n if (r.handle === undefined) {\n throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', `chamfer: edge resolved without handle (${ref.faces[0].role}/${ref.faces[1].role})`)\n }\n return { ordinal: r.ordinal, handle: r.handle as BrepHandle }\n}\n\n/** twoDistances 逐边构建(§3.6 V1):每条边一次 chamferDistAngle。 */\nfunction chamferTwoDistances(\n kernel: BrepEngineApi,\n edges: EdgeTopoRef[],\n startCtx: ResolutionContext,\n solid: BrepHandle,\n width1: number,\n width2: number,\n): BrepHandle {\n let resultSolid = solid\n for (const ref of edges) {\n const ctx = resultSolid === solid ? startCtx : buildEdgeContextFromSolid(kernel, resultSolid, startCtx.roleTable)\n const entity = resolveEdge(ctx, ref)\n const faces = resultSolid === solid ? startCtx.faces : ctx.faces\n const idx = refFaceIndex(kernel, faces.map((f) => f.handle).filter((h): h is BrepHandle => h !== undefined), entity.handle)\n if (idx === null) {\n throw new Error('E_CHAMFER_EDGE_MISMATCH: kernel cannot locate ref face (bug)')\n }\n const a = facesForQualifier(ref.faces[0], ctx)[0]\n const b = facesForQualifier(ref.faces[1], ctx)[0]\n const refOrdinal = idx + 1\n const p = twoDistParams(kernel, ctx, a?.ordinal ?? -1, b?.ordinal ?? -1, refOrdinal, width1, width2)\n resultSolid = kernel.chamferDistAngle(resultSolid, [entity.handle], p.distance, p.angleDeg)\n }\n return resultSolid\n}\n\n/** BREP-only 主入口(§3.6 flow)。 */\nfunction chamferBrep(input: Shape, params: Record<string, unknown>): Shape {\n // L1 面:chamferDistAngle/枚举/命名(D12)。equal 分支经 face-evolution 走 occt 平台面。\n const kernel = getBrepApi()\n const solid = brepOf(input) as BrepHandle | undefined\n if (!solid) throw new Error('[stdlib/chamfer] E_CHAMFER_NO_BREP: input is not BREP')\n\n const edges = (params.edges as unknown as EdgeTopoRef[] | undefined) ?? []\n const type = params.type as string\n const ctx = buildEdgeResolutionContext(kernel, input as object)\n if (!ctx) throw new TopoRefError('E_TOPO_NOT_FOUND', 'edge', 'input has no edge naming context')\n\n // 输入 roleTable + outStmt(与 boolean.ts / fillet.ts 同构)。Phase 1.6:origin=StmtId。\n const inputTable = inputRoleTable(input) as ReadonlyMap<unknown, unknown> | undefined\n const outStmt = String(getCurrentStmt()?.id ?? '')\n\n let resultSolid: BrepHandle\n let faceEvolution: Map<number, number[]> | undefined\n let roleTable: ReadonlyMap<unknown, unknown> | undefined\n\n switch (type) {\n case 'equal': {\n // P5:改走 chamferWithHistory + roleTable 传播(§3.2 末段)\n const edgeHandles = edges.map((e) => resolveEdge(ctx, e).handle)\n const r = chamferWithRoleTable(\n kernel,\n solid,\n edgeHandles,\n params.width as number,\n inputTable ?? new Map(),\n outStmt,\n )\n resultSolid = r.result\n faceEvolution = r.faceEvolution\n roleTable = r.roleTable\n break\n }\n case 'distanceAngle':\n resultSolid = kernel.chamferDistAngle(solid, edges.map((e) => resolveEdge(ctx, e).handle), params.width as number, params.angle as number)\n // chamferDistAngle 无 WithHistory 版本——用恒等面演化 + 原表\n faceEvolution = identityEvolution(kernel, resultSolid)\n roleTable = inputTable\n break\n case 'twoDistances':\n resultSolid = chamferTwoDistances(kernel, edges, ctx, solid, params.width1 as number, params.width2 as number)\n faceEvolution = identityEvolution(kernel, resultSolid)\n roleTable = inputTable\n break\n default:\n throw new Error('E_CHAMFER_BAD_TYPE')\n }\n\n return fromBrep(\n solidToShape(kernel, resultSolid),\n faceEvolution ? { solid: resultSolid, faceEvolution, roleTable } : { solid: resultSolid, roleTable },\n )\n}\n\n/**\n * 在几何体上倒角(等距 / 双距 / 距角)。仅 BREP 可用。\n * @group 特征\n * @inputs 1\n * @async true\n * @qual ok\n * @name chamfer\n * @note 倒角是 BREP-only:非 BREP 输入抛 E_MESH_UNSUPPORTED。参考面由内核自选,`width1` 沿 faces[0] 侧、`width2` 沿 faces[1] 侧。\n * @returns Shape 倒角后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.edges - 参与倒角的边(EdgeTopoRef[],条目为相邻两面的 role 线路)。type:EdgeTopoRef[] required:true\n * @param params.type - 倒角类型(equal | twoDistances | distanceAngle)。type:string required:true\n * @param params.width - type=equal: 倒角宽度(mm)。type:number 默认 1\n * @param params.width1 - type=twoDistances: 沿 faces[0] 侧距离(mm)。type:number\n * @param params.width2 - type=twoDistances: 沿 faces[1] 侧距离(mm)。type:number\n * @param params.angle - type=distanceAngle: 与参考面夹角(度,(0,90))。type:number\n * @example\n * const p = await cad.chamfer(part0, { edges: [{ kind:'edge', faces:[{ origin:'box', role:'box:top' }, { origin:'box', role:'box:front' }], hint:{ kind:'edge' } }], type:'equal', width:1 })\n */\nexport const chamfer = defineOp({\n // 平台 op(D11):equal 路径依赖 occt-only chamferWithHistory(face-evolution.ts,\n // D3)→ engines 声明;brepkit 无 chamfer 能力,\n // 平台身份判定在执行前报错,替代旧的能力名拦截。\n engines: ['occt'],\n brep(input: Shape, params: Record<string, unknown>) {\n assertChamferParams(params)\n return chamferBrep(input, params)\n },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"compound-geom.d.ts","sourceRoot":"","sources":["../../src/api/compound-geom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAoC,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AAiB/E;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,GAAG,aAAa,CAAC,GAAG,KAAK,CAWxE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,CAwBjG"}
1
+ {"version":3,"file":"compound-geom.d.ts","sourceRoot":"","sources":["../../src/api/compound-geom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAoC,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AAkB/E;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,GAAG,aAAa,CAAC,GAAG,KAAK,CAWxE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,CA0BjG"}
@@ -17,6 +17,7 @@
17
17
  */
18
18
  import { isCompoundLike, brepOf, fromBrep } from '../shape.js';
19
19
  import { getBackends, BrepUnsupportedError } from '../runtime-state.js';
20
+ import { getBrepApi } from '../brep/handle-bridge.js';
20
21
  import { solidToShape } from '../brep/brep-ops.js';
21
22
  /** 把任意成员(Shape 或结构 compound)展平为若干子 mesh。 */
22
23
  function collectSubMeshes(s) {
@@ -65,8 +66,13 @@ export function mergeMeshes(members) {
65
66
  */
66
67
  export function compound(params) {
67
68
  const members = params.members ?? [];
68
- const { config, kernel: kernels } = getBackends();
69
- const kernel = kernels.brep;
69
+ const { config } = getBackends();
70
+ // D12 中立取核;引擎未初始化(纯 mesh 场景)→ null 容忍走 mesh 路径。
71
+ let kernel = null;
72
+ try {
73
+ kernel = getBrepApi();
74
+ }
75
+ catch { /* no engine -> mesh path */ }
70
76
  // 结构 compound 是结构壳(无 OCCT 句柄):不在 BREP 链上 → 视为无句柄成员。
71
77
  const handles = members.map((m) => (isCompoundLike(m) ? undefined : brepOf(m)));
72
78
  const allBrep = !!kernel && handles.every((h) => h !== undefined);
@@ -1 +1 @@
1
- {"version":3,"file":"compound-geom.js","sourceRoot":"","sources":["../../src/api/compound-geom.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib compound — 平台几何复合体 op(H11 / 方案 §4.2)\n *\n *\n * 与编辑器 `cad.group`(`api/compound.ts`)的区别:\n * - `group` 是 ../3d_editor 的「结构分组」op:产出 `{kind:'compound', children}`\n * 结构壳(无 OCCT 句柄),意义是层级/画布结构,不可变换、不可导出为实体。\n * - 本 op 是 faijs **平台**几何 op:把多个成员聚成一个**几何复合体**\n * (OCCT `TopoDS_Compound`,持句柄),可被放置、导出、作为后续 op 的输入。\n *\n * 路径:\n * - brep 路径:`kernel.makeCompound(handles)`(收任意 BrepHandle,含非实体)\n * → `solidToShape` 三角化 → `fromBrep` 登记句柄。\n * - mesh 路径:合并成员 mesh(结构 compound 子节点展平;纯线框无面成员不贡献网格)。\n *\n * 成员不 keep:复合体是单一几何输出,成员作为子形被吸入,不单独作为终端显示。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { isCompoundLike, brepOf, fromBrep, type CompoundShape } from '../shape'\nimport { getBackends, BrepUnsupportedError } from '../runtime-state'\nimport { solidToShape } from '../brep/brep-ops'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/** 把任意成员(Shape 或结构 compound)展平为若干子 mesh。 */\nfunction collectSubMeshes(s: Shape | CompoundShape): Shape[] {\n if (isCompoundLike(s)) {\n const out: Shape[] = []\n for (const c of s.children) out.push(...collectSubMeshes(c))\n return out\n }\n if (s.positions && s.indices) return [s]\n return []\n}\n\n/**\n * mesh 路径:合并成员 mesh(展平结构 compound 子节点)。\n *\n * @param members - 待合并的成员(结构 compound 递归展平)。\n * @returns 合并后的单一 mesh Shape。\n */\nexport function mergeMeshes(members: Array<Shape | CompoundShape>): Shape {\n const positions: number[] = []\n const indices: number[] = []\n for (const m of members) {\n for (const sub of collectSubMeshes(m)) {\n const base = positions.length / 3\n positions.push(...sub.positions)\n for (let i = 0; i < sub.indices.length; i++) indices.push(sub.indices[i] + base)\n }\n }\n return { positions: new Float32Array(positions), indices: new Uint32Array(indices) }\n}\n\n/**\n * `cad.compound({ members, name? })` → 几何复合体 Shape(持 OCCT 句柄)。\n *\n * @group 结构\n * @inputs 1\n * @qual ok\n * @name compound\n * @param params.members - 成员数组(Shape 或结构 compound;编译产物 ctx.<var> 引用)。type:Shape[]\n * @param params.name - 可选名称。type:string\n * @note 成员经 `params.members` 传入,不是位置参数。与编辑器 `cad.group` 的区别:本 op 产出**几何**复合体(持 OCCT 句柄,可放置/导出),`group` 是结构壳(无句柄)。平台侧不要用 `group`。\n * @returns Shape 几何复合体(brep 路径持句柄,可变换/可导出)。\n * @example\n * const c = cad.compound({ members: [part0, part1] })\n */\nexport function compound(params: { members?: Array<Shape | CompoundShape>; name?: string }): Shape {\n const members = params.members ?? []\n const { config, kernel: kernels } = getBackends()\n const kernel = kernels.brep as BrepEngineApi | null\n\n // 结构 compound 是结构壳(无 OCCT 句柄):不在 BREP 链上 → 视为无句柄成员。\n const handles = members.map((m) => (isCompoundLike(m) ? undefined : brepOf(m)))\n const allBrep = !!kernel && handles.every((h) => h !== undefined)\n\n if (config.mode === 'brep' && !allBrep) {\n throw new BrepUnsupportedError(\n 'E_BREP_UNSUPPORTED: compound members are not all on the BREP chain',\n )\n }\n\n // brep 路径:合并为 TopoDS_Compound 并登记句柄\n if (allBrep && config.mode !== 'mesh') {\n const compoundHandle = kernel!.makeCompound(handles as BrepHandle[])\n const mesh = solidToShape(kernel!, compoundHandle)\n return fromBrep(mesh, { solid: compoundHandle })\n }\n\n // mesh 路径:合并成员 mesh\n return mergeMeshes(members)\n}\n"]}
1
+ {"version":3,"file":"compound-geom.js","sourceRoot":"","sources":["../../src/api/compound-geom.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib compound — 平台几何复合体 op(H11 / 方案 §4.2)\n *\n *\n * 与编辑器 `cad.group`(`api/compound.ts`)的区别:\n * - `group` 是 ../3d_editor 的「结构分组」op:产出 `{kind:'compound', children}`\n * 结构壳(无 OCCT 句柄),意义是层级/画布结构,不可变换、不可导出为实体。\n * - 本 op 是 faijs **平台**几何 op:把多个成员聚成一个**几何复合体**\n * (OCCT `TopoDS_Compound`,持句柄),可被放置、导出、作为后续 op 的输入。\n *\n * 路径:\n * - brep 路径:`kernel.makeCompound(handles)`(收任意 BrepHandle,含非实体)\n * → `solidToShape` 三角化 → `fromBrep` 登记句柄。\n * - mesh 路径:合并成员 mesh(结构 compound 子节点展平;纯线框无面成员不贡献网格)。\n *\n * 成员不 keep:复合体是单一几何输出,成员作为子形被吸入,不单独作为终端显示。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { isCompoundLike, brepOf, fromBrep, type CompoundShape } from '../shape'\nimport { getBackends, BrepUnsupportedError } from '../runtime-state'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { solidToShape } from '../brep/brep-ops'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\n\n/** 把任意成员(Shape 或结构 compound)展平为若干子 mesh。 */\nfunction collectSubMeshes(s: Shape | CompoundShape): Shape[] {\n if (isCompoundLike(s)) {\n const out: Shape[] = []\n for (const c of s.children) out.push(...collectSubMeshes(c))\n return out\n }\n if (s.positions && s.indices) return [s]\n return []\n}\n\n/**\n * mesh 路径:合并成员 mesh(展平结构 compound 子节点)。\n *\n * @param members - 待合并的成员(结构 compound 递归展平)。\n * @returns 合并后的单一 mesh Shape。\n */\nexport function mergeMeshes(members: Array<Shape | CompoundShape>): Shape {\n const positions: number[] = []\n const indices: number[] = []\n for (const m of members) {\n for (const sub of collectSubMeshes(m)) {\n const base = positions.length / 3\n positions.push(...sub.positions)\n for (let i = 0; i < sub.indices.length; i++) indices.push(sub.indices[i] + base)\n }\n }\n return { positions: new Float32Array(positions), indices: new Uint32Array(indices) }\n}\n\n/**\n * `cad.compound({ members, name? })` → 几何复合体 Shape(持 OCCT 句柄)。\n *\n * @group 结构\n * @inputs 1\n * @qual ok\n * @name compound\n * @param params.members - 成员数组(Shape 或结构 compound;编译产物 ctx.<var> 引用)。type:Shape[]\n * @param params.name - 可选名称。type:string\n * @note 成员经 `params.members` 传入,不是位置参数。与编辑器 `cad.group` 的区别:本 op 产出**几何**复合体(持 OCCT 句柄,可放置/导出),`group` 是结构壳(无句柄)。平台侧不要用 `group`。\n * @returns Shape 几何复合体(brep 路径持句柄,可变换/可导出)。\n * @example\n * const c = cad.compound({ members: [part0, part1] })\n */\nexport function compound(params: { members?: Array<Shape | CompoundShape>; name?: string }): Shape {\n const members = params.members ?? []\n const { config } = getBackends()\n // D12 中立取核;引擎未初始化(纯 mesh 场景)→ null 容忍走 mesh 路径。\n let kernel: BrepEngineApi | null = null\n try { kernel = getBrepApi() } catch { /* no engine -> mesh path */ }\n\n // 结构 compound 是结构壳(无 OCCT 句柄):不在 BREP 链上 → 视为无句柄成员。\n const handles = members.map((m) => (isCompoundLike(m) ? undefined : brepOf(m)))\n const allBrep = !!kernel && handles.every((h) => h !== undefined)\n\n if (config.mode === 'brep' && !allBrep) {\n throw new BrepUnsupportedError(\n 'E_BREP_UNSUPPORTED: compound members are not all on the BREP chain',\n )\n }\n\n // brep 路径:合并为 TopoDS_Compound 并登记句柄\n if (allBrep && config.mode !== 'mesh') {\n const compoundHandle = kernel!.makeCompound(handles as BrepHandle[])\n const mesh = solidToShape(kernel!, compoundHandle)\n return fromBrep(mesh, { solid: compoundHandle })\n }\n\n // mesh 路径:合并成员 mesh\n return mergeMeshes(members)\n}\n"]}