@faicad/faijs 0.16.1 → 0.18.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 (498) 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 +20 -2
  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 +66 -29
  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 +104 -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 +276 -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 +12 -3
  128. package/dist/api/chamfer.d.ts.map +1 -1
  129. package/dist/api/chamfer.js +54 -20
  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 +44 -14
  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 +22 -10
  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 +20 -6
  237. package/dist/api/index.d.ts.map +1 -1
  238. package/dist/api/index.js +30 -13
  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/profile.d.ts +89 -0
  279. package/dist/api/profile.d.ts.map +1 -0
  280. package/dist/api/profile.js +194 -0
  281. package/dist/api/profile.js.map +1 -0
  282. package/dist/api/replicate.d.ts +28 -1
  283. package/dist/api/replicate.d.ts.map +1 -1
  284. package/dist/api/replicate.js +34 -23
  285. package/dist/api/replicate.js.map +1 -1
  286. package/dist/api/result.d.ts +6 -11
  287. package/dist/api/result.d.ts.map +1 -1
  288. package/dist/api/result.js +6 -11
  289. package/dist/api/result.js.map +1 -1
  290. package/dist/api/revolve.d.ts.map +1 -1
  291. package/dist/api/revolve.js +15 -14
  292. package/dist/api/revolve.js.map +1 -1
  293. package/dist/api/screw.d.ts +3 -0
  294. package/dist/api/screw.d.ts.map +1 -1
  295. package/dist/api/screw.js +9 -4
  296. package/dist/api/screw.js.map +1 -1
  297. package/dist/api/sdf.d.ts +1 -1
  298. package/dist/api/section-by-plane.d.ts +42 -0
  299. package/dist/api/section-by-plane.d.ts.map +1 -0
  300. package/dist/api/section-by-plane.js +61 -0
  301. package/dist/api/section-by-plane.js.map +1 -0
  302. package/dist/api/shell.d.ts +45 -0
  303. package/dist/api/shell.d.ts.map +1 -0
  304. package/dist/api/shell.js +73 -0
  305. package/dist/api/shell.js.map +1 -0
  306. package/dist/api/sketch.d.ts +8 -1
  307. package/dist/api/sketch.d.ts.map +1 -1
  308. package/dist/api/sketch.js +12 -7
  309. package/dist/api/sketch.js.map +1 -1
  310. package/dist/api/split-by-plane.d.ts +41 -0
  311. package/dist/api/split-by-plane.d.ts.map +1 -0
  312. package/dist/api/split-by-plane.js +60 -0
  313. package/dist/api/split-by-plane.js.map +1 -0
  314. package/dist/api/split.d.ts +6 -1
  315. package/dist/api/split.d.ts.map +1 -1
  316. package/dist/api/split.js +23 -9
  317. package/dist/api/split.js.map +1 -1
  318. package/dist/api/surface/arg-spec.d.ts +22 -0
  319. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  320. package/dist/api/surface/arg-spec.js +729 -477
  321. package/dist/api/surface/arg-spec.js.map +1 -1
  322. package/dist/api/sweep.d.ts +55 -0
  323. package/dist/api/sweep.d.ts.map +1 -0
  324. package/dist/api/sweep.js +86 -0
  325. package/dist/api/sweep.js.map +1 -0
  326. package/dist/api/thicken.d.ts +36 -0
  327. package/dist/api/thicken.d.ts.map +1 -0
  328. package/dist/api/thicken.js +55 -0
  329. package/dist/api/thicken.js.map +1 -0
  330. package/dist/api/transform.d.ts +8 -0
  331. package/dist/api/transform.d.ts.map +1 -1
  332. package/dist/api/transform.js +15 -4
  333. package/dist/api/transform.js.map +1 -1
  334. package/dist/api/view/cameraFns.d.ts +48 -0
  335. package/dist/api/view/cameraFns.d.ts.map +1 -0
  336. package/dist/api/view/cameraFns.js +75 -0
  337. package/dist/api/view/cameraFns.js.map +1 -0
  338. package/dist/api/view/projectionPlanes.d.ts +25 -0
  339. package/dist/api/view/projectionPlanes.d.ts.map +1 -0
  340. package/dist/api/view/projectionPlanes.js +30 -0
  341. package/dist/api/view/projectionPlanes.js.map +1 -0
  342. package/dist/api/view/view-camera.d.ts +2 -2
  343. package/dist/api/view/view-camera.d.ts.map +1 -1
  344. package/dist/api/view/view-camera.js +3 -3
  345. package/dist/api/view/view-camera.js.map +1 -1
  346. package/dist/api/view/view-projection.d.ts +9 -6
  347. package/dist/api/view/view-projection.d.ts.map +1 -1
  348. package/dist/api/view/view-projection.js +132 -65
  349. package/dist/api/view/view-projection.js.map +1 -1
  350. package/dist/api/wire.d.ts +45 -0
  351. package/dist/api/wire.d.ts.map +1 -0
  352. package/dist/api/wire.js +96 -0
  353. package/dist/api/wire.js.map +1 -0
  354. package/dist/boolean/creased-normals.d.ts +50 -0
  355. package/dist/boolean/creased-normals.d.ts.map +1 -0
  356. package/dist/boolean/creased-normals.js +114 -0
  357. package/dist/boolean/creased-normals.js.map +1 -0
  358. package/dist/boolean/deriveNormals.d.ts +4 -1
  359. package/dist/boolean/deriveNormals.d.ts.map +1 -1
  360. package/dist/boolean/deriveNormals.js +5 -2
  361. package/dist/boolean/deriveNormals.js.map +1 -1
  362. package/dist/brep/brep-ops.d.ts +6 -0
  363. package/dist/brep/brep-ops.d.ts.map +1 -1
  364. package/dist/brep/brep-ops.js +11 -2
  365. package/dist/brep/brep-ops.js.map +1 -1
  366. package/dist/brep/brep-topology.d.ts +4 -0
  367. package/dist/brep/brep-topology.d.ts.map +1 -1
  368. package/dist/brep/brep-topology.js +4 -0
  369. package/dist/brep/brep-topology.js.map +1 -1
  370. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  371. package/dist/brep/engine/adapters/brep-mock.js +79 -59
  372. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  373. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  374. package/dist/brep/engine/adapters/brepkit.js +35 -2
  375. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  376. package/dist/brep/engine/adapters/occt.d.ts +15 -7
  377. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  378. package/dist/brep/engine/adapters/occt.js +64 -167
  379. package/dist/brep/engine/adapters/occt.js.map +1 -1
  380. package/dist/brep/engine/primitives.d.ts +93 -130
  381. package/dist/brep/engine/primitives.d.ts.map +1 -1
  382. package/dist/brep/engine/primitives.js +9 -7
  383. package/dist/brep/engine/primitives.js.map +1 -1
  384. package/dist/brep/engine/types.d.ts +14 -1
  385. package/dist/brep/engine/types.d.ts.map +1 -1
  386. package/dist/brep/engine/types.js +11 -1
  387. package/dist/brep/engine/types.js.map +1 -1
  388. package/dist/brep/export/step.d.ts +3 -0
  389. package/dist/brep/export/step.d.ts.map +1 -1
  390. package/dist/brep/export/step.js +7 -1
  391. package/dist/brep/export/step.js.map +1 -1
  392. package/dist/brep/face-evolution.d.ts +8 -0
  393. package/dist/brep/face-evolution.d.ts.map +1 -1
  394. package/dist/brep/face-evolution.js +15 -3
  395. package/dist/brep/face-evolution.js.map +1 -1
  396. package/dist/brep/handle-bridge.d.ts +20 -2
  397. package/dist/brep/handle-bridge.d.ts.map +1 -1
  398. package/dist/brep/handle-bridge.js +25 -2
  399. package/dist/brep/handle-bridge.js.map +1 -1
  400. package/dist/brepkit-kernel/brepkitKernel.d.ts +25 -5
  401. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  402. package/dist/brepkit-kernel/brepkitKernel.js +782 -218
  403. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  404. package/dist/brepkit-kernel/multi-version-test.d.ts +40 -0
  405. package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -0
  406. package/dist/brepkit-kernel/multi-version-test.js +89 -0
  407. package/dist/brepkit-kernel/multi-version-test.js.map +1 -0
  408. package/dist/cad-runtime/admit-compat-lib.d.ts +6 -1
  409. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  410. package/dist/cad-runtime/admit-compat-lib.js +5 -1
  411. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  412. package/dist/cad-runtime/backend-dispatch.d.ts +9 -3
  413. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  414. package/dist/cad-runtime/backend-dispatch.js +32 -2
  415. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  416. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  417. package/dist/cad-runtime/direct-executor.js +8 -2
  418. package/dist/cad-runtime/direct-executor.js.map +1 -1
  419. package/dist/cad-runtime/runtime.d.ts +3 -0
  420. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  421. package/dist/cad-runtime/runtime.js +3 -1
  422. package/dist/cad-runtime/runtime.js.map +1 -1
  423. package/dist/define-op.d.ts +18 -2
  424. package/dist/define-op.d.ts.map +1 -1
  425. package/dist/define-op.js +29 -1
  426. package/dist/define-op.js.map +1 -1
  427. package/dist/env-agnostic.d.ts +3 -0
  428. package/dist/env-agnostic.d.ts.map +1 -1
  429. package/dist/env-agnostic.js +7 -0
  430. package/dist/env-agnostic.js.map +1 -1
  431. package/dist/index.d.ts.map +1 -1
  432. package/dist/index.js +3 -4
  433. package/dist/index.js.map +1 -1
  434. package/dist/lang/symbol-table.generated.d.ts +29 -1
  435. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  436. package/dist/lang/symbol-table.generated.js +30 -2
  437. package/dist/lang/symbol-table.generated.js.map +1 -1
  438. package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
  439. package/dist/occt-kernel/highLevelApi.js +6 -3
  440. package/dist/occt-kernel/highLevelApi.js.map +1 -1
  441. package/dist/occt-kernel/hullGeometry.d.ts +31 -0
  442. package/dist/occt-kernel/hullGeometry.d.ts.map +1 -0
  443. package/dist/occt-kernel/hullGeometry.js +319 -0
  444. package/dist/occt-kernel/hullGeometry.js.map +1 -0
  445. package/dist/occt-kernel/hullOps.d.ts +24 -0
  446. package/dist/occt-kernel/hullOps.d.ts.map +1 -0
  447. package/dist/occt-kernel/hullOps.js +52 -0
  448. package/dist/occt-kernel/hullOps.js.map +1 -0
  449. package/dist/occt-kernel/occt-primitives.d.ts +14 -0
  450. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -0
  451. package/dist/occt-kernel/occt-primitives.js +351 -0
  452. package/dist/occt-kernel/occt-primitives.js.map +1 -0
  453. package/dist/occt-kernel/occtKernel.d.ts +14 -6
  454. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  455. package/dist/occt-kernel/occtKernel.js +11 -3
  456. package/dist/occt-kernel/occtKernel.js.map +1 -1
  457. package/dist/occt-kernel/topologyExt.js +2 -2
  458. package/dist/occt-kernel/topologyExt.js.map +1 -1
  459. package/dist/primitives/brep-primitives.d.ts +4 -0
  460. package/dist/primitives/brep-primitives.d.ts.map +1 -1
  461. package/dist/primitives/brep-primitives.js +4 -0
  462. package/dist/primitives/brep-primitives.js.map +1 -1
  463. package/dist/result/bug.d.ts +22 -0
  464. package/dist/result/bug.d.ts.map +1 -0
  465. package/dist/result/bug.js +28 -0
  466. package/dist/result/bug.js.map +1 -0
  467. package/dist/result/errors.d.ts +270 -0
  468. package/dist/result/errors.d.ts.map +1 -0
  469. package/dist/result/errors.js +317 -0
  470. package/dist/result/errors.js.map +1 -0
  471. package/dist/result/kernelErrorTranslation.d.ts +21 -0
  472. package/dist/result/kernelErrorTranslation.d.ts.map +1 -0
  473. package/dist/result/kernelErrorTranslation.js +102 -0
  474. package/dist/result/kernelErrorTranslation.js.map +1 -0
  475. package/dist/result/result.d.ts +213 -0
  476. package/dist/result/result.d.ts.map +1 -0
  477. package/dist/result/result.js +336 -0
  478. package/dist/result/result.js.map +1 -0
  479. package/dist/result/vec3.d.ts +12 -0
  480. package/dist/result/vec3.d.ts.map +1 -0
  481. package/dist/result/vec3.js +14 -0
  482. package/dist/result/vec3.js.map +1 -0
  483. package/dist/runtime-state.d.ts +9 -0
  484. package/dist/runtime-state.d.ts.map +1 -1
  485. package/dist/runtime-state.js.map +1 -1
  486. package/dist/sdk.d.ts +3 -1
  487. package/dist/sdk.d.ts.map +1 -1
  488. package/dist/sdk.js +2 -1
  489. package/dist/sdk.js.map +1 -1
  490. package/dist/shape.d.ts +43 -1
  491. package/dist/shape.d.ts.map +1 -1
  492. package/dist/shape.js +57 -1
  493. package/dist/shape.js.map +1 -1
  494. package/dist/topology/naming/geom-hint.js +1 -1
  495. package/dist/topology/naming/geom-hint.js.map +1 -1
  496. package/dist/topology/naming/score.js +1 -1
  497. package/dist/topology/naming/score.js.map +1 -1
  498. package/package.json +6 -16
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joints-kinematics.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/joints-kinematics.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Kinematic joints + IK — core 自有实现(§5.6.3 移植:vendored jointFns + ikFns 逐字对齐)。\n *\n * 移植来源:packages/brepjs/src/operations/{jointFns,ikFns}.ts(纯算法零 kernel 依赖,\n * 仅用 quat 与 assembly-tree;Phase 5 随 brepjs 包删除前已做 parity 对拍)。\n */\nimport { quatFromAxisAngle, quatRotate, quatMultiply } from './quat'\nimport type { AssemblyNode, Vec3 } from './assembly-tree'\nimport { walkAssembly } from './assembly-tree'\n\n/**\n * Drivable kinematic joints — built on the assembly tree. A joint connects a\n * `parent` (reference) body to a `child` (moving) body and carries one or more\n * drivable degrees of freedom (DOF), each clamped to its own range.\n *\n * Single-DOF joints (`revolute`, `prismatic`) are sugar over the Phase-1 mate\n * constraints — a revolute is concentric (axis alignment) plus an angle driver;\n * a prismatic is coincident plus a distance driver. Multi-DOF joints compose\n * several DOFs about a shared anchor: `cylindrical` (rotation + slide on one\n * axis, 2 DOF), `planar` (two in-plane translations + a rotation about the\n * normal, 3 DOF), and `spherical` (three rotations about a pivot, 3 DOF).\n *\n * The `dofs` array is the source of truth; `value`/`min`/`max`/`axis` mirror the\n * primary (first) DOF for single-DOF ergonomics and backward compatibility.\n * `joint.dofs` are the stored degrees of freedom, distinct from\n * `AssemblyNode.rotate` (a static structural transform).\n */\n\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A joint axis: a point on the axis line plus a direction. */\nexport interface JointAxis {\n readonly origin: Vec3;\n readonly direction: Vec3;\n}\n\n/** The kind of kinematic joint: revolute, prismatic, cylindrical, planar, or spherical. */\nexport type JointType = 'revolute' | 'prismatic' | 'cylindrical' | 'planar' | 'spherical';\n\n/**\n * A single drivable degree of freedom. A `rotation` DOF turns about the joint's\n * anchor point along `axis` (degrees); a `translation` DOF slides along `axis`\n * (length units). `value` is always clamped to `[min, max]`.\n */\nexport interface JointDOF {\n readonly kind: 'rotation' | 'translation';\n readonly axis: Vec3;\n readonly min: number;\n readonly max: number;\n readonly value: number;\n}\n\n/**\n * A kinematic joint connecting a parent and child body, with its drivable DOFs.\n */\nexport interface Joint {\n readonly type: JointType;\n /** Reference body (stays put); the child moves relative to it. */\n readonly parent: string;\n readonly child: string;\n /** Primary axis; `origin` is the anchor every rotation DOF pivots about. */\n readonly axis: JointAxis;\n /** Primary-DOF range bounds (mirror of `dofs[0]`). */\n readonly min: number;\n readonly max: number;\n /** Primary-DOF value (mirror of `dofs[0]`), always clamped to `[min, max]`. */\n readonly value: number;\n /** All drivable degrees of freedom, in composition order. */\n readonly dofs: readonly JointDOF[];\n /**\n * Optional fixed transform applied to the child frame *after* the joint\n * motion (`childWorld = parentWorld ∘ jointTransform ∘ offset`). Lets a single\n * joint carry a static link offset (e.g. a Denavit-Hartenberg link geometry)\n * without an extra body. Defaults to identity. See `jointsFromDH`.\n */\n readonly offset?: JointPose;\n}\n\n/** A rigid transform: translation + quaternion rotation `[w, x, y, z]`. */\nexport interface JointPose {\n readonly position: Vec3;\n readonly rotation: [number, number, number, number];\n}\n\n/** Options for single-DOF joints: range bounds and initial value. */\nexport interface JointOptions {\n /** Range lower bound. Default: -180 (revolute) / 0 (prismatic). */\n min?: number;\n /** Range upper bound. Default: 180 (revolute) / 100 (prismatic). */\n max?: number;\n /** Initial value, clamped to the range. Default: 0. */\n value?: number;\n}\n\n/** Per-DOF ranges for a cylindrical joint (rotation about + slide along one axis). */\nexport interface CylindricalOptions {\n /** Rotation DOF (degrees). Default range -180..180. */\n rotation?: JointOptions;\n /**\n * Translation DOF (length). Default range 0..100, matching `prismaticJoint`\n * (both model a slide along an axis). This is deliberately asymmetric with\n * `planarJoint`'s in-plane translations, which default to -100..100 because\n * an unanchored in-plane slide is naturally bidirectional.\n */\n translation?: JointOptions;\n}\n\n/** Per-DOF ranges for a planar joint (two in-plane translations + a rotation). */\nexport interface PlanarOptions {\n /** Translation along the in-plane `uDirection`. Default range -100..100. */\n u?: JointOptions;\n /** Translation along `normal × u`. Default range -100..100. */\n v?: JointOptions;\n /** Rotation about the plane normal (degrees). Default range -180..180. */\n rotation?: JointOptions;\n /**\n * In-plane reference direction for the `u` translation. Projected onto the\n * plane and normalized; defaults to an arbitrary perpendicular of the normal.\n */\n uDirection?: Vec3;\n}\n\n/** Per-DOF ranges for a spherical joint (three rotations about a pivot). */\nexport interface SphericalOptions {\n /** Rotation about local X through the pivot (degrees). Default range -180..180. */\n x?: JointOptions;\n /** Rotation about local Y through the pivot (degrees). Default range -180..180. */\n y?: JointOptions;\n /** Rotation about local Z through the pivot (degrees). Default range -180..180. */\n z?: JointOptions;\n}\n\nconst DEG2RAD = Math.PI / 180;\n\n// ---------------------------------------------------------------------------\n// Construction\n// ---------------------------------------------------------------------------\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction unit(v: Vec3): Vec3 {\n const l = Math.hypot(v[0], v[1], v[2]) || 1;\n return [v[0] / l, v[1] / l, v[2] / l];\n}\n\nfunction cross(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/** A unit vector perpendicular to `v` (for the unspecified-reference case). */\nfunction anyPerpendicular(v: Vec3): Vec3 {\n const ref: Vec3 = Math.abs(v[0]) < 0.9 ? [1, 0, 0] : [0, 1, 0];\n return unit(cross(v, ref));\n}\n\n/** Build one DOF, normalizing an inverted range and clamping the initial value. */\nfunction makeDof(\n kind: JointDOF['kind'],\n axis: Vec3,\n opts: JointOptions,\n defMin: number,\n defMax: number\n): JointDOF {\n // Normalize the range so an inverted (min > max) input can't break the\n // \"value is always within [min, max]\" invariant.\n const a = opts.min ?? defMin;\n const b = opts.max ?? defMax;\n const min = Math.min(a, b);\n const max = Math.max(a, b);\n return { kind, axis: unit(axis), min, max, value: clamp(opts.value ?? 0, min, max) };\n}\n\n/** Assemble a Joint from its DOFs, mirroring the primary DOF into the top level. */\nfunction buildJoint(\n type: JointType,\n parent: string,\n child: string,\n axis: JointAxis,\n dofs: readonly JointDOF[]\n): Joint {\n const primary = dofs[0] ?? { kind: 'rotation', axis: [0, 0, 1], min: 0, max: 0, value: 0 };\n return {\n type,\n parent,\n child,\n axis: { origin: axis.origin, direction: unit(axis.direction) },\n min: primary.min,\n max: primary.max,\n value: primary.value,\n dofs,\n };\n}\n\n/** A revolute (hinge) joint — the child rotates about `axis` by `value` degrees.\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param axis - Joint axis: anchor point and direction.\n * @param opts - Optional range bounds and initial value.\n * @returns The newly created revolute joint.\n */\nexport function revoluteJoint(\n parent: string,\n child: string,\n axis: JointAxis,\n opts: JointOptions = {}\n): Joint {\n return buildJoint('revolute', parent, child, axis, [\n makeDof('rotation', axis.direction, opts, -180, 180),\n ]);\n}\n\n/**\n * A prismatic (slider) joint — the child translates along `axis` by `value`\n * units. Only `axis.direction` is used; `axis.origin` is ignored (a pure\n * translation has no anchor point), unlike a revolute joint which rotates about\n * the axis line through `origin`.\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param axis - Slide axis; only `direction` is used.\n * @param opts - Optional range bounds and initial value.\n * @returns The newly created prismatic joint.\n */\nexport function prismaticJoint(\n parent: string,\n child: string,\n axis: JointAxis,\n opts: JointOptions = {}\n): Joint {\n return buildJoint('prismatic', parent, child, axis, [\n makeDof('translation', axis.direction, opts, 0, 100),\n ]);\n}\n\n/**\n * A cylindrical joint — the child both rotates about and slides along a single\n * `axis` (2 DOF). DOF order: `[rotation, translation]`. The two motions share\n * the axis, so they commute; rotation pivots about `axis.origin`.\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param axis - Joint axis: anchor point and direction.\n * @param opts - Optional per-DOF ranges and initial values.\n * @returns The newly created cylindrical joint.\n */\nexport function cylindricalJoint(\n parent: string,\n child: string,\n axis: JointAxis,\n opts: CylindricalOptions = {}\n): Joint {\n return buildJoint('cylindrical', parent, child, axis, [\n makeDof('rotation', axis.direction, opts.rotation ?? {}, -180, 180),\n makeDof('translation', axis.direction, opts.translation ?? {}, 0, 100),\n ]);\n}\n\n/**\n * A planar joint — the child translates within a plane and rotates about its\n * normal (3 DOF). `plane.direction` is the normal; `plane.origin` the rotation\n * anchor. DOF order: `[u-translation, v-translation, rotation]`, where the\n * translations are applied in the plane frame (independent of the rotation).\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param plane - Plane definition; `direction` is the normal, `origin` the anchor.\n * @param opts - Optional per-DOF ranges, initial values, and in-plane axes.\n * @returns The newly created planar joint.\n */\nexport function planarJoint(\n parent: string,\n child: string,\n plane: JointAxis,\n opts: PlanarOptions = {}\n): Joint {\n const normal = unit(plane.direction);\n // Project a requested u-direction onto the plane; fall back to an arbitrary\n // in-plane axis. v completes a right-handed in-plane basis.\n let u: Vec3;\n if (opts.uDirection) {\n const d = opts.uDirection;\n const proj = d[0] * normal[0] + d[1] * normal[1] + d[2] * normal[2];\n const inPlane: Vec3 = [\n d[0] - proj * normal[0],\n d[1] - proj * normal[1],\n d[2] - proj * normal[2],\n ];\n u =\n Math.hypot(inPlane[0], inPlane[1], inPlane[2]) < 1e-9\n ? anyPerpendicular(normal)\n : unit(inPlane);\n } else {\n u = anyPerpendicular(normal);\n }\n const v = unit(cross(normal, u));\n return buildJoint('planar', parent, child, { origin: plane.origin, direction: normal }, [\n makeDof('translation', u, opts.u ?? {}, -100, 100),\n makeDof('translation', v, opts.v ?? {}, -100, 100),\n makeDof('rotation', normal, opts.rotation ?? {}, -180, 180),\n ]);\n}\n\n/**\n * A spherical (ball) joint — the child rotates freely about a pivot point\n * (3 DOF). DOF order: `[x, y, z]` rotations about the local axes through\n * `pivot`, composed as `Rx · Ry · Rz`.\n * @param parent - Name of the reference (parent) body.\n * @param child - Name of the body moved by the joint.\n * @param pivot - Pivot point all rotations pass through.\n * @param opts - Optional per-axis ranges and initial values.\n * @returns The newly created spherical joint.\n */\nexport function sphericalJoint(\n parent: string,\n child: string,\n pivot: Vec3,\n opts: SphericalOptions = {}\n): Joint {\n return buildJoint('spherical', parent, child, { origin: pivot, direction: [0, 0, 1] }, [\n makeDof('rotation', [1, 0, 0], opts.x ?? {}, -180, 180),\n makeDof('rotation', [0, 1, 0], opts.y ?? {}, -180, 180),\n makeDof('rotation', [0, 0, 1], opts.z ?? {}, -180, 180),\n ]);\n}\n\n/**\n * Return a copy of `joint` with per-DOF values set (each clamped to its range).\n * Values are positional, matching `joint.dofs`; omitted entries keep their\n * stored value. The primary mirror (`value`) is kept in sync with `dofs[0]`.\n * @param joint - The joint to update.\n * @param values - Positional per-DOF values; omitted entries keep their value.\n * @returns A new joint with the values set.\n */\nexport function setJointValues(joint: Joint, values: readonly number[]): Joint {\n const dofs = joint.dofs.map((d, i) => {\n const v = values[i];\n return v === undefined ? d : { ...d, value: clamp(v, d.min, d.max) };\n });\n const primary = dofs[0];\n return primary ? { ...joint, dofs, value: primary.value } : { ...joint, dofs };\n}\n\n/** Return a copy of `joint` with its primary DOF set (clamped to range).\n * @param joint - The joint to update.\n * @param value - New primary-DOF value.\n * @returns A new joint with the primary value set.\n */\nexport function setJointValue(joint: Joint, value: number): Joint {\n return setJointValues(joint, [value]);\n}\n\n// ---------------------------------------------------------------------------\n// Kinematics\n// ---------------------------------------------------------------------------\n\n/** The local rigid transform contributed by a single DOF at `value`. */\nfunction dofPose(origin: Vec3, dof: JointDOF, value: number): JointPose {\n if (dof.kind === 'translation') {\n // `origin` is intentionally unused: a pure translation has no pivot.\n return {\n position: [dof.axis[0] * value, dof.axis[1] * value, dof.axis[2] * value],\n rotation: [1, 0, 0, 0],\n };\n }\n // Rotation about the axis line through `origin`: p ↦ R·p + (origin − R·origin).\n const rotation = quatFromAxisAngle(dof.axis, value * DEG2RAD);\n const ro = quatRotate(rotation, origin);\n return { position: [origin[0] - ro[0], origin[1] - ro[1], origin[2] - ro[2]], rotation };\n}\n\n/**\n * The child's local rigid transform (relative to the parent) for given DOF\n * values. Defaults to each DOF's stored value. A single `number` overrides only\n * the primary DOF (single-DOF ergonomics); an array overrides positionally,\n * with omitted entries keeping their stored value. Each value is clamped to its\n * DOF range.\n *\n * DOFs are folded in array order via frame composition. For same-anchor\n * rotations (e.g. spherical) this composes to a single rotation about the pivot;\n * for a cylindrical axis the rotation and slide commute.\n * @param joint - The joint to evaluate.\n * @param value - Primary-DOF override (number) or positional per-DOF overrides.\n * @returns The child's local pose relative to the parent.\n */\nexport function jointTransform(\n joint: Joint,\n value: number | readonly number[] = joint.value\n): JointPose {\n const overrides = Array.isArray(value) ? (value as readonly number[]) : undefined;\n const primary = overrides ? undefined : (value as number);\n const origin = joint.axis.origin;\n\n let pose = IDENTITY_POSE;\n for (let i = 0; i < joint.dofs.length; i++) {\n const dof = joint.dofs[i];\n if (!dof) continue;\n const raw = overrides\n ? (overrides[i] ?? dof.value)\n : i === 0\n ? (primary ?? dof.value)\n : dof.value;\n pose = composePose(pose, dofPose(origin, dof, clamp(raw, dof.min, dof.max)));\n }\n return pose;\n}\n\n// ---------------------------------------------------------------------------\n// Assembly integration\n// ---------------------------------------------------------------------------\n\n/** Attach a joint to an assembly node. Returns a new node (immutable).\n * @param assembly - The assembly node to attach the joint to.\n * @param joint - The joint to attach.\n * @returns A new node with the joint added.\n */\nexport function addJoint(assembly: AssemblyNode, joint: Joint): AssemblyNode {\n const existing = (assembly.joints ?? []) as readonly Joint[];\n return { ...assembly, joints: [...existing, joint] };\n}\n\n// ---------------------------------------------------------------------------\n// Forward kinematics\n// ---------------------------------------------------------------------------\n\nconst IDENTITY_POSE: JointPose = { position: [0, 0, 0], rotation: [1, 0, 0, 0] };\n\n/** Compose two poses: the result applies `b` in `a`'s frame (`a ∘ b`). */\nfunction composePose(a: JointPose, b: JointPose): JointPose {\n const rb = quatRotate(a.rotation, b.position);\n return {\n position: [a.position[0] + rb[0], a.position[1] + rb[1], a.position[2] + rb[2]],\n rotation: quatMultiply(a.rotation, b.rotation),\n };\n}\n\n/** Collect every joint attached anywhere in the assembly tree. */\nfunction collectJoints(assembly: AssemblyNode): Joint[] {\n const joints: Joint[] = [];\n walkAssembly(assembly, (node) => {\n if (node.joints) joints.push(...(node.joints as readonly Joint[]));\n });\n return joints;\n}\n\n/**\n * Forward kinematics: set joint values and propagate world poses down the\n * kinematic chain. Each joint's axis is interpreted in its **parent's** frame,\n * so a child's world pose is `parentWorld ∘ jointTransform(joint, value)`.\n *\n * Bodies not driven by a joint (chain roots) start at the origin. `jointValues`\n * overrides a joint's stored value, keyed by the **child** node name; omitted\n * joints use `joint.value`. Resolution is topological (reuses the Phase-0\n * ordering), so chains of any depth compose. Returns a world pose for every node.\n * @param assembly - The assembly to solve.\n * @param jointValues - Optional value overrides keyed by child node name.\n * @returns A world pose for every node in the assembly.\n */\nexport function forwardKinematics(\n assembly: AssemblyNode,\n jointValues: Readonly<Record<string, number | readonly number[]>> = {}\n): Map<string, JointPose> {\n // Single pass: gather joints and node names together.\n const joints: Joint[] = [];\n const names = new Set<string>();\n walkAssembly(assembly, (node) => {\n names.add(node.name);\n if (node.joints) joints.push(...(node.joints as readonly Joint[]));\n });\n const byChild = new Map<string, Joint>();\n for (const j of joints) {\n byChild.set(j.child, j);\n names.add(j.parent);\n names.add(j.child);\n }\n\n const poses = new Map<string, JointPose>();\n // Roots: any node not driven by a joint sits at the origin.\n for (const name of names) if (!byChild.has(name)) poses.set(name, IDENTITY_POSE);\n\n // Propagate down the joint graph: a joint resolves once its parent is placed.\n const pending = [...joints];\n let progress = true;\n while (progress && pending.length > 0) {\n progress = false;\n for (let i = pending.length - 1; i >= 0; i--) {\n const j = pending[i];\n if (!j) continue;\n const parentPose = poses.get(j.parent);\n if (!parentPose) continue; // parent not placed yet — defer\n pending.splice(i, 1);\n progress = true;\n if (poses.has(j.child)) continue; // already placed (duplicate/cycle) — skip\n const value = jointValues[j.child] ?? j.value;\n const local = j.offset\n ? composePose(jointTransform(j, value), j.offset)\n : jointTransform(j, value);\n poses.set(j.child, composePose(parentPose, local));\n }\n }\n // A joint whose parent never resolved (cycle/dangling) still gets an entry so\n // the map covers every node.\n for (const j of pending) if (!poses.has(j.child)) poses.set(j.child, IDENTITY_POSE);\n\n return poses;\n}\n\n/**\n * Open-chain mobility — the number of independent degrees of freedom, summing\n * each joint's DOF count (revolute/prismatic 1, cylindrical 2, planar/spherical\n * 3). For a serial chain this equals the total DOF. (Closed-loop\n * Grübler/Kutzbach analysis is future work.)\n * @param assembly - The assembly to analyze.\n * @returns Total number of independent degrees of freedom.\n */\nexport function mechanismDOF(assembly: AssemblyNode): number {\n return collectJoints(assembly).reduce((sum, j) => sum + j.dofs.length, 0);\n}\n\n/**\n * Inverse kinematics and motion trajectories for joint chains.\n *\n * `inverseKinematics` solves for the joint values that place an end-effector at\n * a target pose, using a damped-least-squares (Levenberg-Marquardt) update over\n * a numerically-differentiated Jacobian. Differentiating through\n * `forwardKinematics` keeps the solver agnostic to joint type — revolute,\n * prismatic, and the multi-DOF cylindrical/planar/spherical joints all\n * contribute their `dofs` uniformly — and respects each DOF's range by clamping\n * every iterate.\n *\n * `jointTrajectory` samples a straight-line path in joint space between two\n * configurations, returning the posed assembly (via forward kinematics) at each\n * step — the building block for animation and reachable-workspace sweeps.\n */\n\n\ntype Quat = readonly [number, number, number, number];\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A target for the end-effector: a world position, optionally an orientation. */\nexport interface IKTarget {\n readonly position: Vec3;\n /** Target orientation `[w, x, y, z]`. Omit for position-only IK. */\n readonly rotation?: Quat;\n}\n\n/** Options for the inverse-kinematics solver (iterations, tolerance, damping, seed). */\nexport interface IKOptions {\n /** Maximum solver iterations. Default 200. */\n maxIterations?: number;\n /** Convergence threshold on the residual norm. Default 1e-5. */\n tolerance?: number;\n /** Damping factor λ for the least-squares step. Default 0.05. */\n damping?: number;\n /** Initial joint values, keyed by child node (number or per-DOF array). */\n seed?: Readonly<Record<string, number | readonly number[]>>;\n /** Local point on the end-effector node to drive to the target. Default origin. */\n tip?: Vec3;\n}\n\n/** Outcome of an inverse-kinematics solve: values, convergence, and residual. */\nexport interface IKResult {\n /** Solved joint values, keyed by child node, one entry per DOF. */\n readonly values: Record<string, number[]>;\n readonly converged: boolean;\n readonly iterations: number;\n /** Final residual norm (position, plus orientation when targeted). */\n readonly error: number;\n}\n\n// ---------------------------------------------------------------------------\n// Small vector / quaternion helpers\n// ---------------------------------------------------------------------------\n\nconst IK_IDENTITY_POSE: JointPose = { position: [0, 0, 0], rotation: [1, 0, 0, 0] };\n\nfunction applyPose(pose: JointPose, p: Vec3): Vec3 {\n const r = quatRotate(pose.rotation, p);\n return [r[0] + pose.position[0], r[1] + pose.position[1], r[2] + pose.position[2]];\n}\n\nfunction quatConjugate(q: Quat): Quat {\n return [q[0], -q[1], -q[2], -q[3]];\n}\n\n/**\n * The rotation vector (axis · angle) taking orientation `from` to `to`, i.e. the\n * angular error that drives `from` toward `to`. Returns the zero vector when the\n * orientations coincide.\n */\nfunction rotationError(from: Quat, to: Quat): Vec3 {\n const d = quatMultiply(to, quatConjugate(from));\n let [w, x, y, z] = d;\n const norm = Math.hypot(w, x, y, z) || 1;\n w /= norm;\n x /= norm;\n y /= norm;\n z /= norm;\n if (w < 0) {\n // Shortest path: q and -q represent the same rotation.\n w = -w;\n x = -x;\n y = -y;\n z = -z;\n }\n const s = Math.hypot(x, y, z);\n if (s < 1e-12) return [0, 0, 0];\n const angle = 2 * Math.atan2(s, w);\n const k = angle / s;\n return [x * k, y * k, z * k];\n}\n\n// ---------------------------------------------------------------------------\n// Chain extraction\n// ---------------------------------------------------------------------------\n\n/** Joints from the root down to `endEffector`, in root→leaf order. */\nfunction chainTo(assembly: AssemblyNode, endEffector: string): Joint[] {\n const joints: Joint[] = [];\n walkAssembly(assembly, (n) => {\n if (n.joints) joints.push(...(n.joints as readonly Joint[]));\n });\n const byChild = new Map<string, Joint>();\n for (const j of joints) byChild.set(j.child, j);\n\n const chain: Joint[] = [];\n const seen = new Set<string>();\n let cur: string | undefined = endEffector;\n while (cur && byChild.has(cur) && !seen.has(cur)) {\n seen.add(cur);\n const j = byChild.get(cur);\n if (!j) break;\n chain.push(j);\n cur = j.parent;\n }\n return chain.reverse();\n}\n\n// ---------------------------------------------------------------------------\n// Linear algebra (small dense systems, Float64Array to avoid index-undefined)\n// ---------------------------------------------------------------------------\n\n/** Read a Float64Array element as a definite number (dense matrices are full). */\nfunction el(a: Float64Array, i: number): number {\n return a[i] ?? 0;\n}\n\n/** Solve `A x = b` for an `n×n` system by Gauss-Jordan with partial pivoting. */\nfunction solveLinear(A: Float64Array, b: Float64Array, n: number): Float64Array | null {\n const w = n + 1;\n const M = new Float64Array(n * w);\n for (let r = 0; r < n; r++) {\n for (let c = 0; c < n; c++) M[r * w + c] = el(A, r * n + c);\n M[r * w + n] = el(b, r);\n }\n for (let col = 0; col < n; col++) {\n let piv = col;\n for (let r = col + 1; r < n; r++) {\n if (Math.abs(el(M, r * w + col)) > Math.abs(el(M, piv * w + col))) piv = r;\n }\n if (Math.abs(el(M, piv * w + col)) < 1e-12) return null;\n if (piv !== col) {\n for (let k = col; k < w; k++) {\n const tmp = el(M, col * w + k);\n M[col * w + k] = el(M, piv * w + k);\n M[piv * w + k] = tmp;\n }\n }\n const d = el(M, col * w + col);\n for (let k = col; k < w; k++) M[col * w + k] = el(M, col * w + k) / d;\n for (let r = 0; r < n; r++) {\n if (r === col) continue;\n const f = el(M, r * w + col);\n if (f === 0) continue;\n for (let k = col; k < w; k++) M[r * w + k] = el(M, r * w + k) - f * el(M, col * w + k);\n }\n }\n const x = new Float64Array(n);\n for (let r = 0; r < n; r++) x[r] = el(M, r * w + n);\n return x;\n}\n\n// ---------------------------------------------------------------------------\n// Inverse kinematics\n// ---------------------------------------------------------------------------\n\ninterface FlatChain {\n /** Joint segments in root→leaf order, each owning `count` consecutive DOFs. */\n readonly segments: ReadonlyArray<{ child: string; count: number }>;\n /** Current parameter vector (one entry per DOF). */\n readonly q: Float64Array;\n /** Per-DOF lower and upper bounds. */\n readonly lo: Float64Array;\n readonly hi: Float64Array;\n}\n\n/** Flatten a chain's DOFs into a parameter vector with bounds, applying the seed. */\nfunction flattenChain(\n chain: readonly Joint[],\n seed?: Readonly<Record<string, number | readonly number[]>>\n): FlatChain {\n const segments: Array<{ child: string; count: number }> = [];\n const q: number[] = [];\n const lo: number[] = [];\n const hi: number[] = [];\n for (const j of chain) {\n const s = seed?.[j.child];\n segments.push({ child: j.child, count: j.dofs.length });\n j.dofs.forEach((dof, i) => {\n const seeded = Array.isArray(s) ? s[i] : i === 0 ? (s as number | undefined) : undefined;\n const v = seeded ?? dof.value;\n q.push(Math.min(dof.max, Math.max(dof.min, v)));\n lo.push(dof.min);\n hi.push(dof.max);\n });\n }\n return {\n segments,\n q: Float64Array.from(q),\n lo: Float64Array.from(lo),\n hi: Float64Array.from(hi),\n };\n}\n\n/** Slice a parameter vector back into per-joint value arrays keyed by child. */\nfunction overridesOf(segments: FlatChain['segments'], q: Float64Array): Record<string, number[]> {\n const out: Record<string, number[]> = {};\n let i = 0;\n for (const seg of segments) {\n const vals: number[] = [];\n for (let k = 0; k < seg.count; k++) vals.push(el(q, i++));\n out[seg.child] = vals;\n }\n return out;\n}\n\n/** Residual twist `e` (target − current) for a pose; returns its norm. */\nfunction residualTwist(\n out: Float64Array,\n pose: JointPose,\n target: IKTarget,\n tip: Vec3,\n m: number\n): number {\n const pos = applyPose(pose, tip);\n out[0] = target.position[0] - pos[0];\n out[1] = target.position[1] - pos[1];\n out[2] = target.position[2] - pos[2];\n if (m === 6 && target.rotation) {\n const r = rotationError(pose.rotation, target.rotation);\n out[3] = r[0];\n out[4] = r[1];\n out[5] = r[2];\n }\n let s = 0;\n for (let i = 0; i < m; i++) s += el(out, i) ** 2;\n return Math.sqrt(s);\n}\n\n/**\n * Finite-difference Jacobian: column `j` is the end-effector twist from δq[j].\n * The probe steps *inward* from a bound — `forwardKinematics` clamps each DOF to\n * its range, so a forward `+eps` at the upper limit would yield a zero column and\n * trap the solver at the ceiling. Stepping `-eps` there (and dividing by the\n * signed step) keeps every column a true one-sided derivative.\n */\nfunction fillJacobian(\n J: Float64Array,\n q: Float64Array,\n n: number,\n m: number,\n lo: Float64Array,\n hi: Float64Array,\n base: JointPose,\n tip: Vec3,\n eps: number,\n tipPose: (s: Float64Array) => JointPose\n): void {\n const basePos = applyPose(base, tip);\n for (let j = 0; j < n; j++) {\n const saved = el(q, j);\n // Step away from whichever bound we're against so the perturbation isn't\n // clamped to a no-op; default forward.\n const h = saved + eps > el(hi, j) && saved - eps >= el(lo, j) ? -eps : eps;\n q[j] = saved + h;\n const p2 = tipPose(q);\n q[j] = saved;\n const pos2 = applyPose(p2, tip);\n J[j] = (pos2[0] - basePos[0]) / h;\n J[n + j] = (pos2[1] - basePos[1]) / h;\n J[2 * n + j] = (pos2[2] - basePos[2]) / h;\n if (m === 6) {\n const dr = rotationError(base.rotation, p2.rotation);\n J[3 * n + j] = dr[0] / h;\n J[4 * n + j] = dr[1] / h;\n J[5 * n + j] = dr[2] / h;\n }\n }\n}\n\n/** One damped-least-squares step: `Δq = Jᵀ(JJᵀ + λ²I)⁻¹ e`. */\nfunction dlsStep(\n J: Float64Array,\n e: Float64Array,\n n: number,\n m: number,\n lambda: number\n): Float64Array | null {\n const A = new Float64Array(m * m);\n const lam2 = lambda * lambda;\n for (let r = 0; r < m; r++) {\n for (let c = 0; c < m; c++) {\n let s = 0;\n for (let k = 0; k < n; k++) s += el(J, r * n + k) * el(J, c * n + k);\n A[r * m + c] = s + (r === c ? lam2 : 0);\n }\n }\n const y = solveLinear(A, e, m);\n if (!y) return null;\n const dq = new Float64Array(n);\n for (let j = 0; j < n; j++) {\n let v = 0;\n for (let r = 0; r < m; r++) v += el(J, r * n + j) * el(y, r);\n dq[j] = v;\n }\n return dq;\n}\n\n/**\n * Solve for the joint values that place `endEffector` (offset by `tip`) at\n * `target`, by damped-least-squares descent on a numerical Jacobian. Joint\n * ranges are honored: every iterate is clamped to each DOF's `[min, max]`.\n *\n * Returns the solved per-DOF values keyed by child node (ready to pass to\n * `forwardKinematics`), whether it converged, the iteration count, and the final\n * residual norm. An end-effector with no driving joints, or an unreachable\n * target, returns `converged: false` with the best configuration found.\n * @param assembly - The assembly containing the kinematic chain.\n * @param endEffector - Name of the end-effector node.\n * @param target - Target world pose for the end-effector.\n * @param options - Optional solver settings (iterations, tolerance, damping, seed, tip).\n * @returns The solved joint values and convergence diagnostics.\n */\nexport function inverseKinematics(\n assembly: AssemblyNode,\n endEffector: string,\n target: IKTarget,\n options: IKOptions = {}\n): IKResult {\n const maxIterations = options.maxIterations ?? 200;\n const tolerance = options.tolerance ?? 1e-5;\n const lambda = options.damping ?? 0.05;\n const tip: Vec3 = options.tip ?? [0, 0, 0];\n const m = target.rotation !== undefined ? 6 : 3;\n const eps = 1e-6;\n\n const { segments, q, lo, hi } = flattenChain(chainTo(assembly, endEffector), options.seed);\n const n = q.length;\n\n const tipPose = (state: Float64Array): JointPose =>\n forwardKinematics(assembly, overridesOf(segments, state)).get(endEffector) ?? IK_IDENTITY_POSE;\n\n const e = new Float64Array(m);\n const J = new Float64Array(m * n);\n\n let pose = tipPose(q);\n let err = residualTwist(e, pose, target, tip, m);\n let iter = 0;\n\n for (; iter < maxIterations && n > 0 && err > tolerance; iter++) {\n fillJacobian(J, q, n, m, lo, hi, pose, tip, eps, tipPose);\n const dq = dlsStep(J, e, n, m, lambda);\n if (!dq) break;\n for (let j = 0; j < n; j++) {\n const next = el(q, j) + el(dq, j);\n q[j] = Math.min(el(hi, j), Math.max(el(lo, j), next));\n }\n pose = tipPose(q);\n err = residualTwist(e, pose, target, tip, m);\n }\n\n return {\n values: overridesOf(segments, q),\n converged: err <= tolerance,\n iterations: iter,\n error: err,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Trajectories\n// ---------------------------------------------------------------------------\n\n/** One sample of a joint-space trajectory: parameter, values, and world poses. */\nexport interface TrajectorySample {\n /** Normalized path parameter in `[0, 1]`. */\n readonly t: number;\n /** Interpolated joint values at this step, keyed by child node. */\n readonly values: Record<string, number[]>;\n /** Forward-kinematics world poses for every node at this step. */\n readonly poses: Map<string, JointPose>;\n}\n\n/** Resolve a value spec (number, array, or absent) to a per-DOF array. */\nfunction valuesOf(joint: Joint, spec: number | readonly number[] | undefined): number[] {\n return joint.dofs.map((dof, i) => {\n const raw = Array.isArray(spec) ? spec[i] : i === 0 ? (spec as number | undefined) : undefined;\n const v = raw ?? dof.value;\n return Math.min(dof.max, Math.max(dof.min, v));\n });\n}\n\n/**\n * Sample a straight-line path in joint space from `from` to `to` over `steps`\n * segments, yielding `steps + 1` samples (inclusive of both endpoints). Each\n * sample carries the interpolated per-DOF values (clamped to range) and the\n * forward-kinematics poses of every node. Joints absent from `from`/`to` hold\n * their stored value at both ends.\n * @param assembly - The assembly to pose at each sample.\n * @param from - Starting joint values keyed by child node name.\n * @param to - Ending joint values keyed by child node name.\n * @param steps - Number of path segments (samples are `steps + 1`).\n * @returns The trajectory samples with interpolated values and poses.\n */\nexport function jointTrajectory(\n assembly: AssemblyNode,\n from: Readonly<Record<string, number | readonly number[]>>,\n to: Readonly<Record<string, number | readonly number[]>>,\n steps: number\n): TrajectorySample[] {\n const joints: Joint[] = [];\n walkAssembly(assembly, (n) => {\n if (n.joints) joints.push(...(n.joints as readonly Joint[]));\n });\n\n const ends = joints.map((j) => ({\n child: j.child,\n a: valuesOf(j, from[j.child]),\n b: valuesOf(j, to[j.child]),\n }));\n\n const count = Math.max(1, Math.floor(steps));\n const samples: TrajectorySample[] = [];\n for (let s = 0; s <= count; s++) {\n const t = s / count;\n const values: Record<string, number[]> = {};\n for (const end of ends) {\n values[end.child] = end.a.map((a, i) => a + ((end.b[i] ?? a) - a) * t);\n }\n samples.push({ t, values, poses: forwardKinematics(assembly, values) });\n }\n return samples;\n}\n"]}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Quaternion helpers for rigid rotations, shared by the constraint solver and
3
+ * the joint/kinematics layer. Scalar-first convention: `[w, x, y, z]`.
4
+ *
5
+ * Layer 0 (utils): no internal imports — `Vec3` is declared locally.
6
+ * @module
7
+ */
8
+ export type Vec3 = readonly [number, number, number];
9
+ /** A quaternion in scalar-first `[w, x, y, z]` convention. */
10
+ export type Quat = readonly [number, number, number, number];
11
+ /** Rotate vector `v` by quaternion `q`.
12
+ * @param q - The rotation quaternion `[w, x, y, z]`.
13
+ * @param v - The vector to rotate.
14
+ * @returns The rotated vector.
15
+ */
16
+ export declare function quatRotate(q: Quat, v: Vec3): [number, number, number];
17
+ /** Quaternion for a rotation of `angle` radians about (unit-normalized) `axis`.
18
+ * @param axis - Rotation axis (normalized internally).
19
+ * @param angle - Rotation angle in radians.
20
+ * @returns The rotation quaternion `[w, x, y, z]`.
21
+ */
22
+ export declare function quatFromAxisAngle(axis: Vec3, angle: number): [number, number, number, number];
23
+ /** Shortest-arc quaternion rotating unit vector `from` onto unit vector `to`.
24
+ * @param from - Starting direction (normalized internally).
25
+ * @param to - Target direction (normalized internally).
26
+ * @returns The shortest-arc rotation quaternion `[w, x, y, z]`.
27
+ */
28
+ export declare function quatFromTo(from: Vec3, to: Vec3): [number, number, number, number];
29
+ /** Hamilton product `a ⊗ b` — the rotation that applies `b` first, then `a`.
30
+ * @param a - Left quaternion of the product.
31
+ * @param b - Right quaternion of the product.
32
+ * @returns The product quaternion `[w, x, y, z]`.
33
+ */
34
+ export declare function quatMultiply(a: Quat, b: Quat): [number, number, number, number];
35
+ //# sourceMappingURL=quat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quat.d.ts","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/quat.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACrD,8DAA8D;AAC9D,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAwB7D;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAUrE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAK7F;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CASjF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAS/E"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Quaternion helpers for rigid rotations, shared by the constraint solver and
3
+ * the joint/kinematics layer. Scalar-first convention: `[w, x, y, z]`.
4
+ *
5
+ * Layer 0 (utils): no internal imports — `Vec3` is declared locally.
6
+ * @module
7
+ */
8
+ function dot(a, b) {
9
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
10
+ }
11
+ function cross(a, b) {
12
+ 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]];
13
+ }
14
+ function normalize(a) {
15
+ const l = Math.hypot(a[0], a[1], a[2]) || 1;
16
+ return [a[0] / l, a[1] / l, a[2] / l];
17
+ }
18
+ /** A unit vector perpendicular to `v` (for the 180°/parallel degenerate cases). */
19
+ function anyPerpendicular(v) {
20
+ const ref = Math.abs(v[0]) < 0.9 ? [1, 0, 0] : [0, 1, 0];
21
+ return normalize(cross(v, ref));
22
+ }
23
+ // Returns are mutable tuples (readonly inputs) so callers that store rotations
24
+ // in mutable tuple fields can use them without readonly-assignment friction.
25
+ /** Rotate vector `v` by quaternion `q`.
26
+ * @param q - The rotation quaternion `[w, x, y, z]`.
27
+ * @param v - The vector to rotate.
28
+ * @returns The rotated vector.
29
+ */
30
+ export function quatRotate(q, v) {
31
+ const [w, x, y, z] = q;
32
+ const tx = 2 * (y * v[2] - z * v[1]);
33
+ const ty = 2 * (z * v[0] - x * v[2]);
34
+ const tz = 2 * (x * v[1] - y * v[0]);
35
+ return [
36
+ v[0] + w * tx + (y * tz - z * ty),
37
+ v[1] + w * ty + (z * tx - x * tz),
38
+ v[2] + w * tz + (x * ty - y * tx),
39
+ ];
40
+ }
41
+ /** Quaternion for a rotation of `angle` radians about (unit-normalized) `axis`.
42
+ * @param axis - Rotation axis (normalized internally).
43
+ * @param angle - Rotation angle in radians.
44
+ * @returns The rotation quaternion `[w, x, y, z]`.
45
+ */
46
+ export function quatFromAxisAngle(axis, angle) {
47
+ const h = angle / 2;
48
+ const s = Math.sin(h);
49
+ const u = normalize(axis);
50
+ return [Math.cos(h), u[0] * s, u[1] * s, u[2] * s];
51
+ }
52
+ /** Shortest-arc quaternion rotating unit vector `from` onto unit vector `to`.
53
+ * @param from - Starting direction (normalized internally).
54
+ * @param to - Target direction (normalized internally).
55
+ * @returns The shortest-arc rotation quaternion `[w, x, y, z]`.
56
+ */
57
+ export function quatFromTo(from, to) {
58
+ const a = normalize(from);
59
+ const b = normalize(to);
60
+ const d = dot(a, b);
61
+ if (d >= 1 - 1e-9)
62
+ return [1, 0, 0, 0];
63
+ if (d <= -1 + 1e-9)
64
+ return quatFromAxisAngle(anyPerpendicular(a), Math.PI);
65
+ const c = cross(a, b);
66
+ const len = Math.hypot(1 + d, c[0], c[1], c[2]) || 1;
67
+ return [(1 + d) / len, c[0] / len, c[1] / len, c[2] / len];
68
+ }
69
+ /** Hamilton product `a ⊗ b` — the rotation that applies `b` first, then `a`.
70
+ * @param a - Left quaternion of the product.
71
+ * @param b - Right quaternion of the product.
72
+ * @returns The product quaternion `[w, x, y, z]`.
73
+ */
74
+ export function quatMultiply(a, b) {
75
+ const [aw, ax, ay, az] = a;
76
+ const [bw, bx, by, bz] = b;
77
+ return [
78
+ aw * bw - ax * bx - ay * by - az * bz,
79
+ aw * bx + ax * bw + ay * bz - az * by,
80
+ aw * by - ax * bz + ay * bw + az * bx,
81
+ aw * bz + ax * by - ay * bx + az * bw,
82
+ ];
83
+ }
84
+ //# sourceMappingURL=quat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quat.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/quat.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,SAAS,GAAG,CAAC,CAAO,EAAE,CAAO;IAC3B,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,KAAK,CAAC,CAAO,EAAE,CAAO;IAC7B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,SAAS,CAAC,CAAO;IACxB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5C,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,mFAAmF;AACnF,SAAS,gBAAgB,CAAC,CAAO;IAC/B,MAAM,GAAG,GAAS,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,+EAA+E;AAC/E,6EAA6E;AAE7E;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,CAAO,EAAE,CAAO;IACzC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,OAAO;QACL,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;KAClC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAU,EAAE,KAAa;IACzD,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IACpB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAU,EAAE,EAAQ;IAC7C,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IACxB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI;QAAE,OAAO,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrD,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,CAAO,EAAE,CAAO;IAC3C,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO;QACL,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;QACrC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;QACrC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;QACrC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;KACtC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Quaternion helpers for rigid rotations, shared by the constraint solver and\n * the joint/kinematics layer. Scalar-first convention: `[w, x, y, z]`.\n *\n * Layer 0 (utils): no internal imports — `Vec3` is declared locally.\n * @module\n */\n\nexport type Vec3 = readonly [number, number, number];\n/** A quaternion in scalar-first `[w, x, y, z]` convention. */\nexport type Quat = readonly [number, number, number, number];\n\nfunction dot(a: Vec3, b: Vec3): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nfunction cross(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\nfunction normalize(a: Vec3): Vec3 {\n const l = Math.hypot(a[0], a[1], a[2]) || 1;\n return [a[0] / l, a[1] / l, a[2] / l];\n}\n\n/** A unit vector perpendicular to `v` (for the 180°/parallel degenerate cases). */\nfunction anyPerpendicular(v: Vec3): Vec3 {\n const ref: Vec3 = Math.abs(v[0]) < 0.9 ? [1, 0, 0] : [0, 1, 0];\n return normalize(cross(v, ref));\n}\n\n// Returns are mutable tuples (readonly inputs) so callers that store rotations\n// in mutable tuple fields can use them without readonly-assignment friction.\n\n/** Rotate vector `v` by quaternion `q`.\n * @param q - The rotation quaternion `[w, x, y, z]`.\n * @param v - The vector to rotate.\n * @returns The rotated vector.\n */\nexport function quatRotate(q: Quat, v: Vec3): [number, number, number] {\n const [w, x, y, z] = q;\n const tx = 2 * (y * v[2] - z * v[1]);\n const ty = 2 * (z * v[0] - x * v[2]);\n const tz = 2 * (x * v[1] - y * v[0]);\n return [\n v[0] + w * tx + (y * tz - z * ty),\n v[1] + w * ty + (z * tx - x * tz),\n v[2] + w * tz + (x * ty - y * tx),\n ];\n}\n\n/** Quaternion for a rotation of `angle` radians about (unit-normalized) `axis`.\n * @param axis - Rotation axis (normalized internally).\n * @param angle - Rotation angle in radians.\n * @returns The rotation quaternion `[w, x, y, z]`.\n */\nexport function quatFromAxisAngle(axis: Vec3, angle: number): [number, number, number, number] {\n const h = angle / 2;\n const s = Math.sin(h);\n const u = normalize(axis);\n return [Math.cos(h), u[0] * s, u[1] * s, u[2] * s];\n}\n\n/** Shortest-arc quaternion rotating unit vector `from` onto unit vector `to`.\n * @param from - Starting direction (normalized internally).\n * @param to - Target direction (normalized internally).\n * @returns The shortest-arc rotation quaternion `[w, x, y, z]`.\n */\nexport function quatFromTo(from: Vec3, to: Vec3): [number, number, number, number] {\n const a = normalize(from);\n const b = normalize(to);\n const d = dot(a, b);\n if (d >= 1 - 1e-9) return [1, 0, 0, 0];\n if (d <= -1 + 1e-9) return quatFromAxisAngle(anyPerpendicular(a), Math.PI);\n const c = cross(a, b);\n const len = Math.hypot(1 + d, c[0], c[1], c[2]) || 1;\n return [(1 + d) / len, c[0] / len, c[1] / len, c[2] / len];\n}\n\n/** Hamilton product `a ⊗ b` — the rotation that applies `b` first, then `a`.\n * @param a - Left quaternion of the product.\n * @param b - Right quaternion of the product.\n * @returns The product quaternion `[w, x, y, z]`.\n */\nexport function quatMultiply(a: Quat, b: Quat): [number, number, number, number] {\n const [aw, ax, ay, az] = a;\n const [bw, bx, by, bz] = b;\n return [\n aw * bw - ax * bx - ay * by - az * bz,\n aw * bx + ax * bw + ay * bz - az * by,\n aw * by - ax * bz + ay * bw + az * bx,\n aw * bz + ax * by - ay * bx + az * bw,\n ];\n}\n"]}
@@ -57,4 +57,37 @@ export interface GlobalSolveResult {
57
57
  /** 残差超阈值(>1e-6·scale)的约束逐条写入(折中可见)。 */
58
58
  warnings?: string[];
59
59
  }
60
+ /** 3D vector(chain 求解器本地别名,与 quat.ts 同构)。 */
61
+ export type SolverVec3 = readonly [number, number, number];
62
+ /** A geometric entity (plane, axis, or point) referenced by a chain-solver constraint. */
63
+ export interface SolverEntity {
64
+ type: 'plane' | 'axis' | 'point';
65
+ origin: SolverVec3;
66
+ normal?: SolverVec3;
67
+ direction?: SolverVec3;
68
+ }
69
+ /** A chain-solver constraint between two entities, with an optional scalar value. */
70
+ export interface SolverConstraint {
71
+ type: 'coincident' | 'concentric' | 'distance' | 'angle' | 'fixed';
72
+ entityA?: {
73
+ node: string;
74
+ entity: SolverEntity;
75
+ };
76
+ entityB?: {
77
+ node: string;
78
+ entity: SolverEntity;
79
+ };
80
+ value?: number;
81
+ }
82
+ /** Result of the chain solver: per-node transforms, DOF count, and convergence. */
83
+ export interface SolverResult {
84
+ transforms: Map<string, {
85
+ position: SolverVec3;
86
+ rotation: [number, number, number, number];
87
+ }>;
88
+ dof: number;
89
+ converged: boolean;
90
+ /** Constraint types that were passed in but not solved (not yet implemented). */
91
+ unsupported: string[];
92
+ }
60
93
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,0EAA0E;AAC1E,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAA;AAE5C;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,wBAAwB;IACxB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACjF;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAA;AAEzF,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,UAAU,EAAE,iBAAiB,EAAE,CAAA;IAC/B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAA;IAClB,uBAAuB;IACvB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,0EAA0E;AAC1E,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAA;AAE5C;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,wBAAwB;IACxB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACjF;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAA;AAEzF,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,UAAU,EAAE,iBAAiB,EAAE,CAAA;IAC/B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAA;IAClB,uBAAuB;IACvB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAKD,6CAA6C;AAC7C,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAE1D,0FAA0F;AAC1F,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;IAChC,MAAM,EAAE,UAAU,CAAA;IAClB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,SAAS,CAAC,EAAE,UAAU,CAAA;CACvB;AAED,qFAAqF;AACrF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAA;IAClE,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAA;IAChD,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE,CAAA;IAChD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,mFAAmF;AACnF,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAA;IAC7F,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,OAAO,CAAA;IAClB,iFAAiF;IACjF,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG","sourcesContent":["/**\n * api/assembly/solvers/types — 纯 TS global 求解器的类型与契约(P1)\n *\n * 设计依据:`docs/plans/2026-09-08-assembly-dual-solver.md`(B1–B10、裁定 1–6)\n * 与 `docs/plans/2026-09-17-assembly-global-solver-plan.md`。\n *\n * 本模块是 pure-type / 轻量数据层,不依赖任何 vendored 或运行时单例,\n * 供 solve.ts、global-solver.ts、compound.ts 共享。\n */\n\nimport type { AssemblyTransform } from '../../../runtime-state'\n\n/** 求解风格:'chain'(vendored brepjs 解析链式,默认)/ 'global'(CadQuery 兼容全局最小二乘)。 */\nexport type SolverStyle = 'chain' | 'global'\n\n/**\n * 求解选项(P1):透传自 `cad.assembly({ solver })` / `AssemblyBehavior.solver`。\n * `name` 用于 B4 锚定(assembly.py:465 `name == self.name` 锁定)→ 从 behavior.name 注入。\n */\nexport interface SolveOptions {\n /** 默认 'chain',向后零兼容。 */\n solver?: SolverStyle\n /** 装配名(B4 锚定用;cq-compat 的 buildAssembly 注入)。 */\n name?: string\n}\n\n/**\n * global 求解器内部的本地系标记(local-frame marker)。\n *\n * 与 CQ solver.py 的 marker 同义:\n * - point:装配实体的局部坐标点;\n * - axis:轴上一点 + 单位方向(边/圆柱面法线);\n * - plane:面中心 + 单位法向(face_mate / align / angle 用)。\n *\n * 所有坐标取自成员 Shape 的本地系(faijs Shape 不携带 placement → 本地系 == 建模系)。\n */\nexport type GlobalMarker =\n | { type: 'point'; p: [number, number, number] }\n | { type: 'axis'; origin: [number, number, number]; dir: [number, number, number] }\n | { type: 'plane'; center: [number, number, number]; normal: [number, number, number] }\n\n/** global 求解结果(与 `AssemblySolveResult` 对齐的字段集,但新增 residuals)。 */\nexport interface GlobalSolveResult {\n /** 每个被定位成员一条终态变换(pivot 恒 [0,0,0];恒等位姿不输出)。 */\n transforms: AssemblyTransform[]\n /** 恒 0(数值求解不做 DOF 分析,保留字段避免 undefined)。 */\n dof: number\n /** LM 终止即 true(无论残差大小;裁定 4.6)。 */\n converged: boolean\n /** 仅约束类型无法映射为代价时填充。 */\n unsupported: string[]\n /** 逐约束最终残差(诊断,满足「绝不静默」)。 */\n residuals: number[]\n /** 残差超阈值(>1e-6·scale)的约束逐条写入(折中可见)。 */\n warnings?: string[]\n}\n\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG","sourcesContent":["/**\n * api/assembly/solvers/types — 纯 TS global 求解器的类型与契约(P1)\n *\n * 设计依据:`docs/plans/2026-09-08-assembly-dual-solver.md`(B1–B10、裁定 1–6)\n * 与 `docs/plans/2026-09-17-assembly-global-solver-plan.md`。\n *\n * 本模块是 pure-type / 轻量数据层,不依赖任何 vendored 或运行时单例,\n * 供 solve.ts、global-solver.ts、compound.ts 共享。\n */\n\nimport type { AssemblyTransform } from '../../../runtime-state'\n\n/** 求解风格:'chain'(vendored brepjs 解析链式,默认)/ 'global'(CadQuery 兼容全局最小二乘)。 */\nexport type SolverStyle = 'chain' | 'global'\n\n/**\n * 求解选项(P1):透传自 `cad.assembly({ solver })` / `AssemblyBehavior.solver`。\n * `name` 用于 B4 锚定(assembly.py:465 `name == self.name` 锁定)→ 从 behavior.name 注入。\n */\nexport interface SolveOptions {\n /** 默认 'chain',向后零兼容。 */\n solver?: SolverStyle\n /** 装配名(B4 锚定用;cq-compat 的 buildAssembly 注入)。 */\n name?: string\n}\n\n/**\n * global 求解器内部的本地系标记(local-frame marker)。\n *\n * 与 CQ solver.py 的 marker 同义:\n * - point:装配实体的局部坐标点;\n * - axis:轴上一点 + 单位方向(边/圆柱面法线);\n * - plane:面中心 + 单位法向(face_mate / align / angle 用)。\n *\n * 所有坐标取自成员 Shape 的本地系(faijs Shape 不携带 placement → 本地系 == 建模系)。\n */\nexport type GlobalMarker =\n | { type: 'point'; p: [number, number, number] }\n | { type: 'axis'; origin: [number, number, number]; dir: [number, number, number] }\n | { type: 'plane'; center: [number, number, number]; normal: [number, number, number] }\n\n/** global 求解结果(与 `AssemblySolveResult` 对齐的字段集,但新增 residuals)。 */\nexport interface GlobalSolveResult {\n /** 每个被定位成员一条终态变换(pivot 恒 [0,0,0];恒等位姿不输出)。 */\n transforms: AssemblyTransform[]\n /** 恒 0(数值求解不做 DOF 分析,保留字段避免 undefined)。 */\n dof: number\n /** LM 终止即 true(无论残差大小;裁定 4.6)。 */\n converged: boolean\n /** 仅约束类型无法映射为代价时填充。 */\n unsupported: string[]\n /** 逐约束最终残差(诊断,满足「绝不静默」)。 */\n residuals: number[]\n /** 残差超阈值(>1e-6·scale)的约束逐条写入(折中可见)。 */\n warnings?: string[]\n}\n\n\n// ── §5.6.1:chain 求解器类型迁入(原 vendored kernel/solverAdapter.ts,Phase 5 随包删除) ──\n\n/** 3D vector(chain 求解器本地别名,与 quat.ts 同构)。 */\nexport type SolverVec3 = readonly [number, number, number]\n\n/** A geometric entity (plane, axis, or point) referenced by a chain-solver constraint. */\nexport interface SolverEntity {\n type: 'plane' | 'axis' | 'point'\n origin: SolverVec3\n normal?: SolverVec3\n direction?: SolverVec3\n}\n\n/** A chain-solver constraint between two entities, with an optional scalar value. */\nexport interface SolverConstraint {\n type: 'coincident' | 'concentric' | 'distance' | 'angle' | 'fixed'\n entityA?: { node: string; entity: SolverEntity }\n entityB?: { node: string; entity: SolverEntity }\n value?: number\n}\n\n/** Result of the chain solver: per-node transforms, DOF count, and convergence. */\nexport interface SolverResult {\n transforms: Map<string, { position: SolverVec3; rotation: [number, number, number, number] }>\n dof: number\n converged: boolean\n /** Constraint types that were passed in but not solved (not yet implemented). */\n unsupported: string[]\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"boolean.d.ts","sourceRoot":"","sources":["../../src/api/boolean.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAuH1C;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,KAAK;;CAehB,CAAA;AAEF;;;;;;;;;;;;;;;IAeI;AACJ,eAAO,MAAM,GAAG;;CAWd,CAAA;AAEF;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,QAAQ;;CAYnB,CAAA;AAEF;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,SAAS;;CAepB,CAAA"}
1
+ {"version":3,"file":"boolean.d.ts","sourceRoot":"","sources":["../../src/api/boolean.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AA+J1C;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,KAAK;;CAehB,CAAA;AAEF;;;;;;;;;;;;;;;IAeI;AACJ,eAAO,MAAM,GAAG;;CAWd,CAAA;AAEF;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,QAAQ;;CAYnB,CAAA;AAEF;;;;;;;;;;;IAWI;AACJ,eAAO,MAAM,SAAS;;CAgBpB,CAAA"}
@@ -10,17 +10,32 @@
10
10
  import { cad } from '../mesh/index.js';
11
11
  import { solidToShape } from '../brep/brep-ops.js';
12
12
  import { booleanWithRoleTable, } from '../brep/face-evolution.js';
13
- import { getBackends, getCurrentStmt, keepHidden, nameOf } from '../runtime-state.js';
13
+ import { getCurrentStmt, getBackends, keepHidden, nameOf } from '../runtime-state.js';
14
+ import { getBrepApi } from '../brep/handle-bridge.js';
14
15
  import { fromBrep, brepOf, inputRoleTable } from '../shape.js';
15
16
  import { reconcileBrepInputs } from './reconcile.js';
16
17
  import { OpError } from './internal/result-unwrap.js';
17
18
  import { defineOp } from '../sdk.js';
19
+ import { engineCapabilitySet } from '../cad-runtime/backend-dispatch.js';
18
20
  // ── 共享内部实现 ──
19
- /** BREP 路径:fuse/cut/common(*WithHistory 封装,收集面演化 + roleTable 合流 §3.4)。 */
21
+ /**
22
+ * BREP 路径:fuse/cut/intersect。
23
+ *
24
+ * 静态双轨(无运行时 try-catch 回退——按引擎**声明**的能力集在执行前定轨):
25
+ * - 引擎声明了对应 `*WithHistory`(occt 三员全有)→ `booleanWithRoleTable`:
26
+ * 一次内核调用同时产出结果 + 面演化(faceEvolution)+ roleTable 合流(§3.4)。
27
+ * - 引擎只声明了裸布尔方法(brepkit:声明了 `intersect` 但**没有** `intersectWithHistory`)
28
+ * → 走 L1 裸 `kernel[op](a,b)`:几何正确,但**不产生面演化、不传播 roleTable**。
29
+ * 这是如实降级——绝不用「恒等映射」伪造一张把输入面 hash 指到结果面 hash 的演化表
30
+ * (结果实体的面 hash 与输入根本不同,恒等映射是假身份)。
31
+ *
32
+ * `intersect` 因此不再声明 `capabilities: ['intersectWithHistory']`(中立 op):
33
+ * brepkit 上由本函数静态落到裸 `intersect`;occt 上仍走 `intersectWithHistory`。
34
+ * fuse/cut 保留各自 `*WithHistory` 能力声明——dispatchPath 的 gate 保证它们到达本函数时
35
+ * 引擎必已声明对应历史方法,故下方 `useHistory` 对 fuse/cut 恒为 true。
36
+ */
20
37
  function booleanBrep(inputs, operation) {
21
- const kernel = getBackends().kernel.brep;
22
- if (!kernel)
23
- throw new Error('[stdlib/boolean] no OCCT kernel');
38
+ const kernel = getBrepApi();
24
39
  const inputSolids = inputs.map((s) => brepOf(s));
25
40
  if (inputSolids.some((s) => !s)) {
26
41
  // V-C8 (C6): a non-solid import (wire/face/shell via cad.import_brep) has
@@ -37,31 +52,52 @@ function booleanBrep(inputs, operation) {
37
52
  let roleTable;
38
53
  // 链式布尔:每步 target(累积结果)与下一个 tool 合流
39
54
  const op = operation === 'union' ? 'fuse' : operation === 'subtract' ? 'cut' : 'intersect';
55
+ // 静态定轨:当前引擎是否声明了本 op 的面演化核函数(读的是同一声明源 dispatchPath 用的
56
+ // 能力集,不是运行时探测)。fuse/cut 因 gate 保证此处恒 true;intersect 在 occt true、
57
+ // brepkit/mock false(后者走 L1 裸 `kernel[op]`,该方法是 BrepEngineApi 必需成员,必存在)。
58
+ const historyCap = op === 'fuse' ? 'fuseWithHistory' : op === 'cut' ? 'cutWithHistory' : 'intersectWithHistory';
59
+ const useHistory = engineCapabilitySet(getBackends().config.brepCapabilities).has(historyCap);
40
60
  // 首个输入作为 target 起点
41
61
  resultSolid = inputSolids[0];
42
- roleTable = inputRoleTable(inputs[0]);
62
+ roleTable = useHistory
63
+ ? inputRoleTable(inputs[0])
64
+ : undefined;
43
65
  for (let i = 1; i < inputSolids.length; i++) {
44
66
  const prev = resultSolid;
45
- const prevTable = roleTable;
46
- const toolTable = inputRoleTable(inputs[i]);
47
- // Phase 1.6:新 origin = 本次语句的 StmtId(不再是 LHS 变量名——PartName 会被
48
- // 改名/复用,StmtId 全局唯一)。
49
- const outStmt = String(getCurrentStmt()?.id ?? '');
50
- // §3.4:一次内核调用,A/B 拆流各自传播后合表(缝面 origin=本次语句 StmtId)
51
- // V-C8:内核裸错误(如 "boolean operation failed")在此包一层——带上 op 名、
52
- // 两个输入的变量名与 cause,满足「显式暴露、不吞细节」。
53
- let r;
54
- try {
55
- r = booleanWithRoleTable(kernel, op, prev, inputSolids[i], prevTable ?? new Map(), toolTable ?? new Map(), outStmt);
67
+ const tool = inputSolids[i];
68
+ if (useHistory) {
69
+ // §3.4:一次内核调用,A/B 拆流各自传播后合表(缝面 origin=本次语句 StmtId)
70
+ // V-C8:内核裸错误在此包一层——带上 op 名、两个输入的变量名与 cause。
71
+ const prevTable = roleTable;
72
+ const toolTable = inputRoleTable(inputs[i]);
73
+ // Phase 1.6:新 origin = 本次语句的 StmtId。
74
+ const outStmt = String(getCurrentStmt()?.id ?? '');
75
+ let r;
76
+ try {
77
+ r = booleanWithRoleTable(kernel, op, prev, tool, prevTable ?? new Map(), toolTable ?? new Map(), outStmt);
78
+ }
79
+ catch (cause) {
80
+ const msg = cause instanceof Error ? cause.message : String(cause);
81
+ throw new OpError(`boolean/${operation}`, 'E_OP_FAILED', `[stdlib/boolean] ${operation}: kernel ${op} failed for inputs ` +
82
+ `${nameOf(inputs[0]) ?? 'input[0]'} × ${nameOf(inputs[i]) ?? `input[${i}]`} — ${msg}`, { cause });
83
+ }
84
+ resultSolid = r.result;
85
+ lastEvolution = r.faceEvolution;
86
+ roleTable = r.roleTable;
56
87
  }
57
- catch (cause) {
58
- const msg = cause instanceof Error ? cause.message : String(cause);
59
- throw new OpError(`boolean/${operation}`, 'E_OP_FAILED', `[stdlib/boolean] ${operation}: kernel ${op} failed for inputs ` +
60
- `${nameOf(inputs[0]) ?? 'input[0]'} × ${nameOf(inputs[i]) ?? `input[${i}]`} — ${msg}`, { cause });
88
+ else {
89
+ // 裸布尔降级路径:几何正确,但无面演化、无 roleTable 传播(如实降级,不伪造映射)。
90
+ try {
91
+ resultSolid = kernel[op](prev, tool);
92
+ }
93
+ catch (cause) {
94
+ const msg = cause instanceof Error ? cause.message : String(cause);
95
+ throw new OpError(`boolean/${operation}`, 'E_OP_FAILED', `[stdlib/boolean] ${operation}: kernel ${op} failed for inputs ` +
96
+ `${nameOf(inputs[0]) ?? 'input[0]'} × ${nameOf(inputs[i]) ?? `input[${i}]`} — ${msg}`, { cause });
97
+ }
98
+ lastEvolution = undefined;
99
+ roleTable = undefined;
61
100
  }
62
- resultSolid = r.result;
63
- lastEvolution = r.faceEvolution;
64
- roleTable = r.roleTable;
65
101
  if (i > 1)
66
102
  kernel.release(prev);
67
103
  }
@@ -200,11 +236,12 @@ export const intersect = defineOp({
200
236
  keepHidden(...shapes);
201
237
  return booleanBrep(shapes, 'intersect');
202
238
  },
203
- // 逐核函数声明(Phase 0.2):intersect 需要内核的 intersectWithHistory。
204
- // ⚠️ 这正是族级布尔 `'evolution'` 会多报能力的活例:brepkit 声明过
205
- // `evolution: true` 但**没有** intersectWithHistory → 旧声明下 intersect
206
- // 通过静态判定、死在运行时;现在 brepkit 下静态报 lacks capability 'intersectWithHistory'。
207
- capabilities: ['intersectWithHistory'],
239
+ // 不声明 `capabilities: ['intersectWithHistory']`(中立 op):
240
+ // brepkit 声明了裸 `intersect` 但没有 `intersectWithHistory`——若硬声明历史能力,
241
+ // brepkit brep 模式会在执行前静态报 `lacks capability 'intersectWithHistory'`。
242
+ // 现由 booleanBrep 按引擎声明的能力集静态分派:occt(声明 intersectWithHistory)
243
+ // 走历史路径保留面演化/naming;brepkit(只声明裸 intersect)走 L1 裸 `kernel.intersect`,
244
+ // 几何正确但无面演化(如实降级,不伪造恒等映射)。
208
245
  naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
209
246
  });
210
247
  //# sourceMappingURL=boolean.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"boolean.js","sourceRoot":"","sources":["../../src/api/boolean.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib boolean — 布尔库函数(union/subtract/intersect,多输入)\n *\n *\n * dispatchPath 静态判定 brep/mesh,BREP 路径用 *WithHistory 收集面演化。\n *\n * 阶段 1:拆为三个薄函数 union/subtract/intersect + 兼容 boolean 导出(过渡)。\n * 阶段 3 将删除 boolean 兼容导出。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { solidToShape } from '../brep/brep-ops'\nimport {\n booleanWithRoleTable,\n} from '../brep/face-evolution'\nimport { getBackends, getCurrentStmt, keepHidden, nameOf } from '../runtime-state'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\nimport { reconcileBrepInputs } from './reconcile'\nimport { OpError } from './internal/result-unwrap'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\ntype BooleanOperation = 'union' | 'subtract' | 'intersect'\n\n// ── 共享内部实现 ──\n\n/** BREP 路径:fuse/cut/common(*WithHistory 封装,收集面演化 + roleTable 合流 §3.4)。 */\nfunction booleanBrep(inputs: Shape[], operation: BooleanOperation): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/boolean] no OCCT kernel')\n\n const inputSolids = inputs.map((s) => brepOf(s) as BrepHandle | undefined)\n if (inputSolids.some((s) => !s)) {\n // V-C8 (C6): a non-solid import (wire/face/shell via cad.import_brep) has\n // no OCCT handle yet — booleans must fail HERE with an explicit, op-named\n // error, not with OCCT's raw \"boolean operation failed\" (or silently).\n const offenders = inputs\n .map((s, i) => (inputSolids[i] ? undefined : nameOf(s) ?? `input[${i}]`))\n .filter((x): x is string => x !== undefined)\n throw new OpError(\n `boolean/${operation}`,\n 'E_BREP_UNSUPPORTED',\n `[stdlib/boolean] ${operation}: input is not on the BREP chain (no OCCT handle) — ` +\n `non-solid geometry (wire/face/shell) cannot take part in a boolean. offenders: ${offenders.join(', ')}`,\n )\n }\n\n let resultSolid: BrepHandle\n let lastEvolution: Map<number, number[]> | undefined\n let roleTable: ReadonlyMap<unknown, unknown> | undefined\n\n // 链式布尔:每步 target(累积结果)与下一个 tool 合流\n const op: 'fuse' | 'cut' | 'intersect' =\n operation === 'union' ? 'fuse' : operation === 'subtract' ? 'cut' : 'intersect'\n\n // 首个输入作为 target 起点\n resultSolid = inputSolids[0]!\n roleTable = inputRoleTable(inputs[0]) as ReadonlyMap<unknown, unknown> | undefined\n\n for (let i = 1; i < inputSolids.length; i++) {\n const prev = resultSolid\n const prevTable = roleTable\n const toolTable = inputRoleTable(inputs[i]) as ReadonlyMap<unknown, unknown> | undefined\n // Phase 1.6:新 origin = 本次语句的 StmtId(不再是 LHS 变量名——PartName 会被\n // 改名/复用,StmtId 全局唯一)。\n const outStmt = String(getCurrentStmt()?.id ?? '')\n\n // §3.4:一次内核调用,A/B 拆流各自传播后合表(缝面 origin=本次语句 StmtId)\n // V-C8:内核裸错误(如 \"boolean operation failed\")在此包一层——带上 op 名、\n // 两个输入的变量名与 cause,满足「显式暴露、不吞细节」。\n let r: ReturnType<typeof booleanWithRoleTable>\n try {\n r = booleanWithRoleTable(\n kernel,\n op,\n prev,\n inputSolids[i]!,\n prevTable ?? new Map(),\n toolTable ?? new Map(),\n outStmt,\n )\n } catch (cause) {\n const msg = cause instanceof Error ? cause.message : String(cause)\n throw new OpError(\n `boolean/${operation}`,\n 'E_OP_FAILED',\n `[stdlib/boolean] ${operation}: kernel ${op} failed for inputs ` +\n `${nameOf(inputs[0]!) ?? 'input[0]'} × ${nameOf(inputs[i]!) ?? `input[${i}]`} — ${msg}`,\n { cause },\n )\n }\n resultSolid = r.result\n lastEvolution = r.faceEvolution\n roleTable = r.roleTable\n if (i > 1) kernel.release(prev)\n }\n\n return fromBrep(\n solidToShape(kernel, resultSolid),\n lastEvolution ? { solid: resultSolid, faceEvolution: lastEvolution, roleTable } : { solid: resultSolid, roleTable },\n )\n}\n\n/** mesh 路径:manifold-3d mesh-CSG。 */\nasync function booleanMesh(inputs: Shape[], operation: BooleanOperation): Promise<Shape> {\n if (inputs.length < 2) {\n if (inputs.length === 1) return inputs[0]\n throw new Error('[stdlib/boolean] boolean needs at least 1 input')\n }\n if (operation === 'union') return cad.union(inputs[0], inputs[1], ...inputs.slice(2))\n if (operation === 'subtract') {\n let result = await cad.subtract(inputs[0], inputs[1])\n for (let i = 2; i < inputs.length; i++) result = await cad.subtract(result, inputs[i])\n return result\n }\n let result = await cad.intersect(inputs[0], inputs[1])\n for (let i = 2; i < inputs.length; i++) result = await cad.intersect(result, inputs[i])\n return result\n}\n\n// ── 三个薄导出(多输入 variadic,defineOp 声明双路径 + 逐核函数 face-evolution 能力) ──\n// 函数体 keep 声明(keep-syntax 设计 §2.5):union/subtract/intersect 保留其\n// 输入且隐藏(R5:3d_editor 现状)——keepHidden 使源变量保持终端但 canvas\n// 不渲染,只有布尔结果正常显示。混合/断链时刻:BREP 侧输入先归约为合法\n// 2-manifold 网格(reconcileBrepInputs),mesh 侧原样透传。\n\n/**\n * 布尔并集:合并所有输入几何(≥2 个输入)。\n * @group 特征\n * @inputs 2\n * @async true\n * @qual ok\n * @name union\n * @param shapes - 参与运算的几何(变量引用,≥2 个)。type:Shape[] required:true\n * @returns Shape 所有输入的并集。函数名即操作,输入全是变量引用,可用 `cad.union(a, b, c)` 多输入。\n * @example\n * const a = await cad.union(part0, part1)\n */\nexport const union = defineOp({\n mesh: (...shapes: Shape[]) => {\n if (shapes.length > 0) keepHidden(...shapes)\n return booleanMesh(reconcileBrepInputs(shapes), 'union')\n },\n brep: (...shapes: Shape[]) => {\n if (shapes.length > 0) keepHidden(...shapes)\n return booleanBrep(shapes, 'union')\n },\n // 逐核函数声明(Phase 0.2):union 需要内核的 fuseWithHistory。\n // 不再声明族级 'evolution'——族级名会让 brepkit(无 intersectWithHistory)等\n // 部分实现的内核静默通过静态判定,再死在运行时(红线违规)。\n capabilities: ['fuseWithHistory'],\n schema: { shapes: 'Shape*' },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * Boolean cut (subtract): remove `tool` from `base`. Same semantics as\n * {@link subtract} but with the brepjs-compatible `(base, tool, options?)` signature.\n * Overrides the generated projection (compatOp) to do roleTable propagation\n * (Phase 3: L2 requires wall:<i> to survive cut).\n * @group 特征\n * @inputs 2\n * @async true\n * @qual ok\n * @name cut\n * @param base - the target shape. type:Shape required:true\n * @param tool - the shape to subtract. type:Shape required:true\n * @returns Shape base minus tool.\n * @example\n * const b = await cad.cut(part0, part1)\n */\nexport const cut = defineOp({\n mesh: (base: Shape, tool: Shape) => {\n keepHidden(base, tool)\n return booleanMesh(reconcileBrepInputs([base, tool]), 'subtract')\n },\n brep: (base: Shape, tool: Shape) => {\n keepHidden(base, tool)\n return booleanBrep([base, tool], 'subtract')\n },\n capabilities: ['cutWithHistory'],\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 布尔差集:第一个为主体,减去其余输入。\n * @group 特征\n * @inputs 2\n * @async true\n * @qual ok\n * @name subtract\n * @param shapes - 参与运算的几何(变量引用,第一个为主体)。type:Shape[] required:true\n * @returns Shape part0 减 part1 的差集(第一个为主体)。\n * @example\n * const b = await cad.subtract(part0, part1)\n */\nexport const subtract = defineOp({\n mesh: (...shapes: Shape[]) => {\n if (shapes.length > 0) keepHidden(...shapes)\n return booleanMesh(reconcileBrepInputs(shapes), 'subtract')\n },\n brep: (...shapes: Shape[]) => {\n if (shapes.length > 0) keepHidden(...shapes)\n return booleanBrep(shapes, 'subtract')\n },\n // 逐核函数声明(Phase 0.2):subtract 需要内核的 cutWithHistory。\n capabilities: ['cutWithHistory'],\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 布尔交集:所有输入的重叠部分。\n * @group 特征\n * @inputs 2\n * @async true\n * @qual ok\n * @name intersect\n * @param shapes - 参与运算的几何(变量引用)。type:Shape[] required:true\n * @returns Shape 所有输入的交集。\n * @example\n * const c = await cad.intersect(part0, part1)\n */\nexport const intersect = defineOp({\n mesh: (...shapes: Shape[]) => {\n if (shapes.length > 0) keepHidden(...shapes)\n return booleanMesh(reconcileBrepInputs(shapes), 'intersect')\n },\n brep: (...shapes: Shape[]) => {\n if (shapes.length > 0) keepHidden(...shapes)\n return booleanBrep(shapes, 'intersect')\n },\n // 逐核函数声明(Phase 0.2):intersect 需要内核的 intersectWithHistory。\n // ⚠️ 这正是族级布尔 `'evolution'` 会多报能力的活例:brepkit 声明过\n // `evolution: true` 但**没有** intersectWithHistory → 旧声明下 intersect\n // 通过静态判定、死在运行时;现在 brepkit 下静态报 lacks capability 'intersectWithHistory'。\n capabilities: ['intersectWithHistory'],\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
1
+ {"version":3,"file":"boolean.js","sourceRoot":"","sources":["../../src/api/boolean.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib boolean — 布尔库函数(union/subtract/intersect,多输入)\n *\n *\n * dispatchPath 静态判定 brep/mesh,BREP 路径用 *WithHistory 收集面演化。\n *\n * 阶段 1:拆为三个薄函数 union/subtract/intersect + 兼容 boolean 导出(过渡)。\n * 阶段 3 将删除 boolean 兼容导出。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { solidToShape } from '../brep/brep-ops'\nimport {\n booleanWithRoleTable,\n} from '../brep/face-evolution'\nimport { getCurrentStmt, getBackends, keepHidden, nameOf } from '../runtime-state'\nimport { getBrepApi } from '../brep/handle-bridge'\nimport { fromBrep, brepOf, inputRoleTable } from '../shape'\nimport { reconcileBrepInputs } from './reconcile'\nimport { OpError } from './internal/result-unwrap'\nimport { defineOp } from '../sdk'\nimport { engineCapabilitySet } from '../cad-runtime/backend-dispatch'\nimport type { Provenance } from '../topology/naming/lineage'\nimport type { BrepHandle } from '../brep/engine/types'\n\ntype BooleanOperation = 'union' | 'subtract' | 'intersect'\n\n// ── 共享内部实现 ──\n\n/**\n * BREP 路径:fuse/cut/intersect。\n *\n * 静态双轨(无运行时 try-catch 回退——按引擎**声明**的能力集在执行前定轨):\n * - 引擎声明了对应 `*WithHistory`(occt 三员全有)→ `booleanWithRoleTable`:\n * 一次内核调用同时产出结果 + 面演化(faceEvolution)+ roleTable 合流(§3.4)。\n * - 引擎只声明了裸布尔方法(brepkit:声明了 `intersect` 但**没有** `intersectWithHistory`)\n * → 走 L1 裸 `kernel[op](a,b)`:几何正确,但**不产生面演化、不传播 roleTable**。\n * 这是如实降级——绝不用「恒等映射」伪造一张把输入面 hash 指到结果面 hash 的演化表\n * (结果实体的面 hash 与输入根本不同,恒等映射是假身份)。\n *\n * `intersect` 因此不再声明 `capabilities: ['intersectWithHistory']`(中立 op):\n * brepkit 上由本函数静态落到裸 `intersect`;occt 上仍走 `intersectWithHistory`。\n * fuse/cut 保留各自 `*WithHistory` 能力声明——dispatchPath 的 gate 保证它们到达本函数时\n * 引擎必已声明对应历史方法,故下方 `useHistory` 对 fuse/cut 恒为 true。\n */\nfunction booleanBrep(inputs: Shape[], operation: BooleanOperation): Shape {\n const kernel = getBrepApi()\n\n const inputSolids = inputs.map((s) => brepOf(s) as BrepHandle | undefined)\n if (inputSolids.some((s) => !s)) {\n // V-C8 (C6): a non-solid import (wire/face/shell via cad.import_brep) has\n // no OCCT handle yet — booleans must fail HERE with an explicit, op-named\n // error, not with OCCT's raw \"boolean operation failed\" (or silently).\n const offenders = inputs\n .map((s, i) => (inputSolids[i] ? undefined : nameOf(s) ?? `input[${i}]`))\n .filter((x): x is string => x !== undefined)\n throw new OpError(\n `boolean/${operation}`,\n 'E_BREP_UNSUPPORTED',\n `[stdlib/boolean] ${operation}: input is not on the BREP chain (no OCCT handle) — ` +\n `non-solid geometry (wire/face/shell) cannot take part in a boolean. offenders: ${offenders.join(', ')}`,\n )\n }\n\n let resultSolid: BrepHandle\n let lastEvolution: Map<number, number[]> | undefined\n let roleTable: ReadonlyMap<unknown, unknown> | undefined\n\n // 链式布尔:每步 target(累积结果)与下一个 tool 合流\n const op: 'fuse' | 'cut' | 'intersect' =\n operation === 'union' ? 'fuse' : operation === 'subtract' ? 'cut' : 'intersect'\n\n // 静态定轨:当前引擎是否声明了本 op 的面演化核函数(读的是同一声明源 dispatchPath 用的\n // 能力集,不是运行时探测)。fuse/cut 因 gate 保证此处恒 true;intersect 在 occt true、\n // brepkit/mock false(后者走 L1 裸 `kernel[op]`,该方法是 BrepEngineApi 必需成员,必存在)。\n const historyCap = op === 'fuse' ? 'fuseWithHistory' : op === 'cut' ? 'cutWithHistory' : 'intersectWithHistory'\n const useHistory = engineCapabilitySet(getBackends().config.brepCapabilities).has(historyCap)\n\n // 首个输入作为 target 起点\n resultSolid = inputSolids[0]!\n roleTable = useHistory\n ? (inputRoleTable(inputs[0]) as ReadonlyMap<unknown, unknown> | undefined)\n : undefined\n\n for (let i = 1; i < inputSolids.length; i++) {\n const prev = resultSolid\n const tool = inputSolids[i]!\n\n if (useHistory) {\n // §3.4:一次内核调用,A/B 拆流各自传播后合表(缝面 origin=本次语句 StmtId)\n // V-C8:内核裸错误在此包一层——带上 op 名、两个输入的变量名与 cause。\n const prevTable = roleTable\n const toolTable = inputRoleTable(inputs[i]) as ReadonlyMap<unknown, unknown> | undefined\n // Phase 1.6:新 origin = 本次语句的 StmtId。\n const outStmt = String(getCurrentStmt()?.id ?? '')\n let r: ReturnType<typeof booleanWithRoleTable>\n try {\n r = booleanWithRoleTable(\n kernel,\n op,\n prev,\n tool,\n prevTable ?? new Map(),\n toolTable ?? new Map(),\n outStmt,\n )\n } catch (cause) {\n const msg = cause instanceof Error ? cause.message : String(cause)\n throw new OpError(\n `boolean/${operation}`,\n 'E_OP_FAILED',\n `[stdlib/boolean] ${operation}: kernel ${op} failed for inputs ` +\n `${nameOf(inputs[0]!) ?? 'input[0]'} × ${nameOf(inputs[i]!) ?? `input[${i}]`} — ${msg}`,\n { cause },\n )\n }\n resultSolid = r.result\n lastEvolution = r.faceEvolution\n roleTable = r.roleTable\n } else {\n // 裸布尔降级路径:几何正确,但无面演化、无 roleTable 传播(如实降级,不伪造映射)。\n try {\n resultSolid = kernel[op](prev, tool)\n } catch (cause) {\n const msg = cause instanceof Error ? cause.message : String(cause)\n throw new OpError(\n `boolean/${operation}`,\n 'E_OP_FAILED',\n `[stdlib/boolean] ${operation}: kernel ${op} failed for inputs ` +\n `${nameOf(inputs[0]!) ?? 'input[0]'} × ${nameOf(inputs[i]!) ?? `input[${i}]`} — ${msg}`,\n { cause },\n )\n }\n lastEvolution = undefined\n roleTable = undefined\n }\n if (i > 1) kernel.release(prev)\n }\n\n return fromBrep(\n solidToShape(kernel, resultSolid),\n lastEvolution ? { solid: resultSolid, faceEvolution: lastEvolution, roleTable } : { solid: resultSolid, roleTable },\n )\n}\n\n/** mesh 路径:manifold-3d mesh-CSG。 */\nasync function booleanMesh(inputs: Shape[], operation: BooleanOperation): Promise<Shape> {\n if (inputs.length < 2) {\n if (inputs.length === 1) return inputs[0]\n throw new Error('[stdlib/boolean] boolean needs at least 1 input')\n }\n if (operation === 'union') return cad.union(inputs[0], inputs[1], ...inputs.slice(2))\n if (operation === 'subtract') {\n let result = await cad.subtract(inputs[0], inputs[1])\n for (let i = 2; i < inputs.length; i++) result = await cad.subtract(result, inputs[i])\n return result\n }\n let result = await cad.intersect(inputs[0], inputs[1])\n for (let i = 2; i < inputs.length; i++) result = await cad.intersect(result, inputs[i])\n return result\n}\n\n// ── 三个薄导出(多输入 variadic,defineOp 声明双路径 + 逐核函数 face-evolution 能力) ──\n// 函数体 keep 声明(keep-syntax 设计 §2.5):union/subtract/intersect 保留其\n// 输入且隐藏(R5:3d_editor 现状)——keepHidden 使源变量保持终端但 canvas\n// 不渲染,只有布尔结果正常显示。混合/断链时刻:BREP 侧输入先归约为合法\n// 2-manifold 网格(reconcileBrepInputs),mesh 侧原样透传。\n\n/**\n * 布尔并集:合并所有输入几何(≥2 个输入)。\n * @group 特征\n * @inputs 2\n * @async true\n * @qual ok\n * @name union\n * @param shapes - 参与运算的几何(变量引用,≥2 个)。type:Shape[] required:true\n * @returns Shape 所有输入的并集。函数名即操作,输入全是变量引用,可用 `cad.union(a, b, c)` 多输入。\n * @example\n * const a = await cad.union(part0, part1)\n */\nexport const union = defineOp({\n mesh: (...shapes: Shape[]) => {\n if (shapes.length > 0) keepHidden(...shapes)\n return booleanMesh(reconcileBrepInputs(shapes), 'union')\n },\n brep: (...shapes: Shape[]) => {\n if (shapes.length > 0) keepHidden(...shapes)\n return booleanBrep(shapes, 'union')\n },\n // 逐核函数声明(Phase 0.2):union 需要内核的 fuseWithHistory。\n // 不再声明族级 'evolution'——族级名会让 brepkit(无 intersectWithHistory)等\n // 部分实现的内核静默通过静态判定,再死在运行时(红线违规)。\n capabilities: ['fuseWithHistory'],\n schema: { shapes: 'Shape*' },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * Boolean cut (subtract): remove `tool` from `base`. Same semantics as\n * {@link subtract} but with the brepjs-compatible `(base, tool, options?)` signature.\n * Overrides the generated projection (compatOp) to do roleTable propagation\n * (Phase 3: L2 requires wall:<i> to survive cut).\n * @group 特征\n * @inputs 2\n * @async true\n * @qual ok\n * @name cut\n * @param base - the target shape. type:Shape required:true\n * @param tool - the shape to subtract. type:Shape required:true\n * @returns Shape base minus tool.\n * @example\n * const b = await cad.cut(part0, part1)\n */\nexport const cut = defineOp({\n mesh: (base: Shape, tool: Shape) => {\n keepHidden(base, tool)\n return booleanMesh(reconcileBrepInputs([base, tool]), 'subtract')\n },\n brep: (base: Shape, tool: Shape) => {\n keepHidden(base, tool)\n return booleanBrep([base, tool], 'subtract')\n },\n capabilities: ['cutWithHistory'],\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 布尔差集:第一个为主体,减去其余输入。\n * @group 特征\n * @inputs 2\n * @async true\n * @qual ok\n * @name subtract\n * @param shapes - 参与运算的几何(变量引用,第一个为主体)。type:Shape[] required:true\n * @returns Shape part0 减 part1 的差集(第一个为主体)。\n * @example\n * const b = await cad.subtract(part0, part1)\n */\nexport const subtract = defineOp({\n mesh: (...shapes: Shape[]) => {\n if (shapes.length > 0) keepHidden(...shapes)\n return booleanMesh(reconcileBrepInputs(shapes), 'subtract')\n },\n brep: (...shapes: Shape[]) => {\n if (shapes.length > 0) keepHidden(...shapes)\n return booleanBrep(shapes, 'subtract')\n },\n // 逐核函数声明(Phase 0.2):subtract 需要内核的 cutWithHistory。\n capabilities: ['cutWithHistory'],\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 布尔交集:所有输入的重叠部分。\n * @group 特征\n * @inputs 2\n * @async true\n * @qual ok\n * @name intersect\n * @param shapes - 参与运算的几何(变量引用)。type:Shape[] required:true\n * @returns Shape 所有输入的交集。\n * @example\n * const c = await cad.intersect(part0, part1)\n */\nexport const intersect = defineOp({\n mesh: (...shapes: Shape[]) => {\n if (shapes.length > 0) keepHidden(...shapes)\n return booleanMesh(reconcileBrepInputs(shapes), 'intersect')\n },\n brep: (...shapes: Shape[]) => {\n if (shapes.length > 0) keepHidden(...shapes)\n return booleanBrep(shapes, 'intersect')\n },\n // 不声明 `capabilities: ['intersectWithHistory']`(中立 op):\n // brepkit 声明了裸 `intersect` 但没有 `intersectWithHistory`——若硬声明历史能力,\n // brepkit brep 模式会在执行前静态报 `lacks capability 'intersectWithHistory'`。\n // 现由 booleanBrep 按引擎声明的能力集静态分派:occt(声明 intersectWithHistory)\n // 走历史路径保留面演化/naming;brepkit(只声明裸 intersect)走 L1 裸 `kernel.intersect`,\n // 几何正确但无面演化(如实降级,不伪造恒等映射)。\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}