@faicad/faijs 0.32.2 → 0.33.1

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 (195) hide show
  1. package/dist/api/api-namespace.js +3 -3
  2. package/dist/api/api-namespace.js.map +1 -1
  3. package/dist/api/assembly/index.d.ts +1 -0
  4. package/dist/api/assembly/index.d.ts.map +1 -1
  5. package/dist/api/assembly/index.js +1 -0
  6. package/dist/api/assembly/index.js.map +1 -1
  7. package/dist/api/assembly/lower.d.ts.map +1 -1
  8. package/dist/api/assembly/lower.js +7 -0
  9. package/dist/api/assembly/lower.js.map +1 -1
  10. package/dist/api/assembly/normalize.d.ts.map +1 -1
  11. package/dist/api/assembly/normalize.js +2 -1
  12. package/dist/api/assembly/normalize.js.map +1 -1
  13. package/dist/api/assembly/solve-tree.d.ts +46 -0
  14. package/dist/api/assembly/solve-tree.d.ts.map +1 -0
  15. package/dist/api/assembly/solve-tree.js +135 -0
  16. package/dist/api/assembly/solve-tree.js.map +1 -0
  17. package/dist/api/assembly/solve.d.ts +7 -0
  18. package/dist/api/assembly/solve.d.ts.map +1 -1
  19. package/dist/api/assembly/solve.js.map +1 -1
  20. package/dist/api/assembly/solvers/assembly-tree.d.ts +4 -0
  21. package/dist/api/assembly/solvers/assembly-tree.d.ts.map +1 -1
  22. package/dist/api/assembly/solvers/assembly-tree.js +1 -0
  23. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  24. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  25. package/dist/api/assembly/solvers/global-solver.js +210 -3
  26. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  27. package/dist/api/assembly/solvers/types.d.ts +8 -0
  28. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  29. package/dist/api/assembly/solvers/types.js.map +1 -1
  30. package/dist/api/assembly/types.d.ts +32 -1
  31. package/dist/api/assembly/types.d.ts.map +1 -1
  32. package/dist/api/assembly/types.js.map +1 -1
  33. package/dist/api/assembly/validate.d.ts +2 -2
  34. package/dist/api/assembly/validate.d.ts.map +1 -1
  35. package/dist/api/assembly/validate.js +24 -2
  36. package/dist/api/assembly/validate.js.map +1 -1
  37. package/dist/api/cadquery-selectors/edge.js +1 -1
  38. package/dist/api/cadquery-selectors/edge.js.map +1 -1
  39. package/dist/api/cadquery-selectors/entity.d.ts +29 -20
  40. package/dist/api/cadquery-selectors/entity.d.ts.map +1 -1
  41. package/dist/api/cadquery-selectors/entity.js +26 -20
  42. package/dist/api/cadquery-selectors/entity.js.map +1 -1
  43. package/dist/api/cadquery-selectors/face.d.ts +4 -2
  44. package/dist/api/cadquery-selectors/face.d.ts.map +1 -1
  45. package/dist/api/cadquery-selectors/face.js +8 -7
  46. package/dist/api/cadquery-selectors/face.js.map +1 -1
  47. package/dist/api/cadquery-selectors/resolve.d.ts +7 -6
  48. package/dist/api/cadquery-selectors/resolve.d.ts.map +1 -1
  49. package/dist/api/cadquery-selectors/resolve.js +13 -11
  50. package/dist/api/cadquery-selectors/resolve.js.map +1 -1
  51. package/dist/api/chamfer.js +1 -1
  52. package/dist/api/chamfer.js.map +1 -1
  53. package/dist/api/draft.js +1 -1
  54. package/dist/api/draft.js.map +1 -1
  55. package/dist/api/edge-ref.js +2 -2
  56. package/dist/api/edge-ref.js.map +1 -1
  57. package/dist/api/engrave.js +1 -1
  58. package/dist/api/engrave.js.map +1 -1
  59. package/dist/api/export-3mf.js +1 -1
  60. package/dist/api/export-3mf.js.map +1 -1
  61. package/dist/api/export-brep.js +1 -1
  62. package/dist/api/export-brep.js.map +1 -1
  63. package/dist/api/export-step.d.ts +12 -13
  64. package/dist/api/export-step.d.ts.map +1 -1
  65. package/dist/api/export-step.js +19 -17
  66. package/dist/api/export-step.js.map +1 -1
  67. package/dist/api/extrude.js +3 -3
  68. package/dist/api/extrude.js.map +1 -1
  69. package/dist/api/face-ref.js +2 -2
  70. package/dist/api/face-ref.js.map +1 -1
  71. package/dist/api/feature-repair.js +2 -2
  72. package/dist/api/feature-repair.js.map +1 -1
  73. package/dist/api/fillet-variable.js +1 -1
  74. package/dist/api/fillet-variable.js.map +1 -1
  75. package/dist/api/fillet.js +1 -1
  76. package/dist/api/fillet.js.map +1 -1
  77. package/dist/api/geom.js +1 -1
  78. package/dist/api/geom.js.map +1 -1
  79. package/dist/api/import-step.d.ts.map +1 -1
  80. package/dist/api/import-step.js +4 -2
  81. package/dist/api/import-step.js.map +1 -1
  82. package/dist/api/pattern.js +1 -1
  83. package/dist/api/pattern.js.map +1 -1
  84. package/dist/api/place.js +1 -1
  85. package/dist/api/place.js.map +1 -1
  86. package/dist/api/punch-hole.js +1 -1
  87. package/dist/api/punch-hole.js.map +1 -1
  88. package/dist/api/replicate.js +1 -1
  89. package/dist/api/replicate.js.map +1 -1
  90. package/dist/api/revolve.js +1 -1
  91. package/dist/api/revolve.js.map +1 -1
  92. package/dist/api/section-by-plane.js +1 -1
  93. package/dist/api/section-by-plane.js.map +1 -1
  94. package/dist/api/shell.js +1 -1
  95. package/dist/api/shell.js.map +1 -1
  96. package/dist/api/sketch-on-face.js +1 -1
  97. package/dist/api/sketch-on-face.js.map +1 -1
  98. package/dist/api/split-by-plane.js +1 -1
  99. package/dist/api/split-by-plane.js.map +1 -1
  100. package/dist/api/split.js +1 -1
  101. package/dist/api/split.js.map +1 -1
  102. package/dist/api/thicken.js +1 -1
  103. package/dist/api/thicken.js.map +1 -1
  104. package/dist/api/topo-resolve.js +4 -4
  105. package/dist/api/topo-resolve.js.map +1 -1
  106. package/dist/api/transform.js +1 -1
  107. package/dist/api/transform.js.map +1 -1
  108. package/dist/api/view/view-projection.d.ts +8 -0
  109. package/dist/api/view/view-projection.d.ts.map +1 -1
  110. package/dist/api/view/view-projection.js +73 -2
  111. package/dist/api/view/view-projection.js.map +1 -1
  112. package/dist/boolean/cross-section.d.ts.map +1 -1
  113. package/dist/boolean/cross-section.js +3 -1
  114. package/dist/boolean/cross-section.js.map +1 -1
  115. package/dist/brep/brep-ops.d.ts +26 -0
  116. package/dist/brep/brep-ops.d.ts.map +1 -1
  117. package/dist/brep/brep-ops.js +45 -0
  118. package/dist/brep/brep-ops.js.map +1 -1
  119. package/dist/brep/brep-topology.js +1 -1
  120. package/dist/brep/brep-topology.js.map +1 -1
  121. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  122. package/dist/brep/engine/adapters/brep-mock.js +2 -0
  123. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  124. package/dist/brep/engine/primitives.d.ts +17 -0
  125. package/dist/brep/engine/primitives.d.ts.map +1 -1
  126. package/dist/brep/engine/primitives.js.map +1 -1
  127. package/dist/brep/export/export-model.d.ts.map +1 -1
  128. package/dist/brep/export/export-model.js +36 -11
  129. package/dist/brep/export/export-model.js.map +1 -1
  130. package/dist/brep/export/step-flat.d.ts +35 -0
  131. package/dist/brep/export/step-flat.d.ts.map +1 -0
  132. package/dist/brep/export/step-flat.js +94 -0
  133. package/dist/brep/export/step-flat.js.map +1 -0
  134. package/dist/brep/export/step.d.ts.map +1 -1
  135. package/dist/brep/export/step.js +42 -21
  136. package/dist/brep/export/step.js.map +1 -1
  137. package/dist/brep/handle-bridge.d.ts +4 -4
  138. package/dist/brep/handle-bridge.js +4 -4
  139. package/dist/brep/handle-bridge.js.map +1 -1
  140. package/dist/brep/svg/svg-to-solid.d.ts +3 -17
  141. package/dist/brep/svg/svg-to-solid.d.ts.map +1 -1
  142. package/dist/brep/svg/svg-to-solid.js +16 -317
  143. package/dist/brep/svg/svg-to-solid.js.map +1 -1
  144. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  145. package/dist/brepkit-kernel/brepkitKernel.js +10 -0
  146. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  147. package/dist/brepkit-kernel/brepkitWasm.d.ts +1 -1
  148. package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
  149. package/dist/brepkit-kernel/brepkitWasm.js +7 -6
  150. package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
  151. package/dist/brepkit-kernel/multi-version-test.d.ts +7 -7
  152. package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -1
  153. package/dist/brepkit-kernel/multi-version-test.js +10 -10
  154. package/dist/brepkit-kernel/multi-version-test.js.map +1 -1
  155. package/dist/cad-runtime/direct-executor.js +2 -2
  156. package/dist/cad-runtime/direct-executor.js.map +1 -1
  157. package/dist/cad-runtime/runtime.js +5 -5
  158. package/dist/cad-runtime/runtime.js.map +1 -1
  159. package/dist/geometry2d/curve2d.js +42 -1
  160. package/dist/geometry2d/curve2d.js.map +1 -1
  161. package/dist/math3d/Box3.js.map +1 -1
  162. package/dist/math3d/Euler.js.map +1 -1
  163. package/dist/math3d/Mat4.js.map +1 -1
  164. package/dist/math3d/Plane.js.map +1 -1
  165. package/dist/math3d/Quat.js.map +1 -1
  166. package/dist/math3d/Vec2.js.map +1 -1
  167. package/dist/math3d/Vec3.js.map +1 -1
  168. package/dist/math3d/index.js.map +1 -1
  169. package/dist/mesh/meshdata/contour.d.ts +34 -0
  170. package/dist/mesh/meshdata/contour.d.ts.map +1 -0
  171. package/dist/mesh/meshdata/contour.js +39 -0
  172. package/dist/mesh/meshdata/contour.js.map +1 -0
  173. package/dist/mesh/meshdata/extrude.d.ts +25 -0
  174. package/dist/mesh/meshdata/extrude.d.ts.map +1 -0
  175. package/dist/mesh/meshdata/extrude.js +198 -0
  176. package/dist/mesh/meshdata/extrude.js.map +1 -0
  177. package/dist/mesh/meshdata/index.js.map +1 -1
  178. package/dist/mesh/meshdata/ops.js.map +1 -1
  179. package/dist/mesh/meshdata/parametric.js.map +1 -1
  180. package/dist/mesh/meshdata/weld.js.map +1 -1
  181. package/dist/node-host/cli.d.ts.map +1 -1
  182. package/dist/node-host/cli.js +3 -2
  183. package/dist/node-host/cli.js.map +1 -1
  184. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  185. package/dist/occt-kernel/occt-primitives.js +2 -0
  186. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  187. package/dist/primitives/svg/svg-path.d.ts +192 -0
  188. package/dist/primitives/svg/svg-path.d.ts.map +1 -0
  189. package/dist/primitives/svg/svg-path.js +776 -0
  190. package/dist/primitives/svg/svg-path.js.map +1 -0
  191. package/dist/third-party/earcut.d.ts +19 -0
  192. package/dist/third-party/earcut.d.ts.map +1 -0
  193. package/dist/third-party/earcut.js +575 -0
  194. package/dist/third-party/earcut.js.map +1 -0
  195. package/package.json +22 -3
@@ -1 +1 @@
1
- {"version":3,"file":"assembly-tree.d.ts","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/assembly-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAEhD,oCAAoC;AACpC,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAMrD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CACtC;AAED,qEAAqE;AACrE,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAShG;AAMD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,YAAY,CAEhF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CAMjF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,YAAY,CAQd;AAMD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAOnF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,EACpD,KAAK,SAAI,GACR,IAAI,CAKN;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAMrD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,KAAK,EAAE,CAMzD"}
1
+ {"version":3,"file":"assembly-tree.d.ts","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/assembly-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAElD,oCAAoC;AACpC,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAMrD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,4FAA4F;IAC5F,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACtD;AAED,qEAAqE;AACrE,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACpC;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,YAAY,CAUhG;AAMD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,YAAY,CAEhF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CAMjF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,YAAY,CAQd;AAMD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAOnF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,EACpD,KAAK,SAAI,GACR,IAAI,CAKN;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAMrD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,KAAK,EAAE,CAMzD"}
@@ -27,6 +27,7 @@ export function createAssemblyNode(name, options = {}) {
27
27
  ...(options.translate !== undefined ? { translate: options.translate } : {}),
28
28
  ...(options.rotate !== undefined ? { rotate: options.rotate } : {}),
29
29
  ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),
30
+ ...(options.constraints !== undefined ? { constraints: options.constraints } : {}),
30
31
  };
31
32
  }
32
33
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"assembly-tree.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/assembly-tree.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Assembly tree — core 自有实现(§5.6 移植:brepjs assemblyFns 逐字对齐,纯数据结构)。\n *\n * An assembly is a tree of nodes. Each node has an optional shape,\n * a local transform (translation + rotation), optional metadata,\n * and child nodes. This is a pure data structure with no kernel calls.\n *\n * Usage:\n * const asm = createAssemblyNode('root')\n * |> addChild(_, createAssemblyNode('part-a', { shape: boxShape, translate: [10, 0, 0] }))\n * |> addChild(_, createAssemblyNode('part-b', { shape: cylShape }));\n */\n\nimport type { Shape } from '../../../mesh/types'\n\n/** 3D vector(core 本地别名,§5.6 移植)。 */\nexport type Vec3 = readonly [number, number, number];\n\n// ---------------------------------------------------------------------------\n// Assembly types\n// ---------------------------------------------------------------------------\n\n/**\n * A node in an assembly tree: optional shape, local transform, metadata, and children.\n */\nexport interface AssemblyNode {\n readonly name: string;\n readonly shape?: Shape;\n readonly translate?: Vec3;\n readonly rotate?: { angle: number; axis?: Vec3 };\n readonly metadata?: Readonly<Record<string, unknown>>;\n readonly children: ReadonlyArray<AssemblyNode>;\n readonly mates?: readonly unknown[];\n /** Drivable kinematic joints (see jointFns). Typed loosely to avoid a cycle. */\n readonly joints?: readonly unknown[];\n}\n\n/** Optional properties for creating or updating an assembly node. */\nexport interface AssemblyNodeOptions {\n shape?: Shape;\n translate?: Vec3;\n rotate?: { angle: number; axis?: Vec3 };\n metadata?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Constructors\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new assembly node.\n * @param name - Name of the node.\n * @param options - Optional shape, transform, and metadata.\n * @returns The newly created assembly node.\n */\nexport function createAssemblyNode(name: string, options: AssemblyNodeOptions = {}): AssemblyNode {\n return {\n name,\n children: [],\n ...(options.shape !== undefined ? { shape: options.shape } : {}),\n ...(options.translate !== undefined ? { translate: options.translate } : {}),\n ...(options.rotate !== undefined ? { rotate: options.rotate } : {}),\n ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Immutable tree operations\n// ---------------------------------------------------------------------------\n\n/**\n * Add a child node. Returns a new parent node.\n * @param parent - The parent node to extend.\n * @param child - The child node to append.\n * @returns A new parent node with the child added.\n */\nexport function addChild(parent: AssemblyNode, child: AssemblyNode): AssemblyNode {\n return { ...parent, children: [...parent.children, child] };\n}\n\n/**\n * Remove a child by name (first match). Returns a new parent node.\n * @param parent - The parent node to modify.\n * @param childName - Name of the child to remove.\n * @returns A new parent node with the child removed.\n */\nexport function removeChild(parent: AssemblyNode, childName: string): AssemblyNode {\n const idx = parent.children.findIndex((c) => c.name === childName);\n if (idx === -1) return parent;\n const children = [...parent.children];\n children.splice(idx, 1);\n return { ...parent, children };\n}\n\n/**\n * Update a node's properties. Returns a new node.\n * @param node - The node to update.\n * @param updates - Partial options to apply.\n * @returns A new node with the updates applied.\n */\nexport function updateNode(\n node: AssemblyNode,\n updates: Partial<AssemblyNodeOptions>\n): AssemblyNode {\n return {\n ...node,\n ...(updates.shape !== undefined ? { shape: updates.shape } : {}),\n ...(updates.translate !== undefined ? { translate: updates.translate } : {}),\n ...(updates.rotate !== undefined ? { rotate: updates.rotate } : {}),\n ...(updates.metadata !== undefined ? { metadata: updates.metadata } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Traversal\n// ---------------------------------------------------------------------------\n\n/**\n * Find a node by name (depth-first). Returns undefined if not found.\n * @param root - Root of the subtree to search.\n * @param name - Name of the node to find.\n * @returns The first matching node, or undefined.\n */\nexport function findNode(root: AssemblyNode, name: string): AssemblyNode | undefined {\n if (root.name === name) return root;\n for (const child of root.children) {\n const found = findNode(child, name);\n if (found) return found;\n }\n return undefined;\n}\n\n/**\n * Walk the tree depth-first, calling visitor for each node.\n * @param root - Root node to walk from.\n * @param visitor - Callback invoked with each node and its depth.\n * @param depth - Starting depth (used internally for recursion).\n * @returns Nothing.\n */\nexport function walkAssembly(\n root: AssemblyNode,\n visitor: (node: AssemblyNode, depth: number) => void,\n depth = 0\n): void {\n visitor(root, depth);\n for (const child of root.children) {\n walkAssembly(child, visitor, depth + 1);\n }\n}\n\n/**\n * Count all nodes in the tree.\n * @param root - Root node to count from.\n * @returns Total number of nodes including the root.\n */\nexport function countNodes(root: AssemblyNode): number {\n let count = 1;\n for (const child of root.children) {\n count += countNodes(child);\n }\n return count;\n}\n\n/**\n * Collect all shapes in the tree (depth-first).\n * @param root - Root node to collect from.\n * @returns All shapes found on nodes in the tree.\n */\nexport function collectShapes(root: AssemblyNode): Shape[] {\n const shapes: Shape[] = [];\n walkAssembly(root, (node) => {\n if (node.shape) shapes.push(node.shape);\n });\n return shapes;\n}\n"]}
1
+ {"version":3,"file":"assembly-tree.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/assembly-tree.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Assembly tree — core 自有实现(§5.6 移植:brepjs assemblyFns 逐字对齐,纯数据结构)。\n *\n * An assembly is a tree of nodes. Each node has an optional shape,\n * a local transform (translation + rotation), optional metadata,\n * and child nodes. This is a pure data structure with no kernel calls.\n *\n * Usage:\n * const asm = createAssemblyNode('root')\n * |> addChild(_, createAssemblyNode('part-a', { shape: boxShape, translate: [10, 0, 0] }))\n * |> addChild(_, createAssemblyNode('part-b', { shape: cylShape }));\n */\n\nimport type { Shape } from '../../../mesh/types'\nimport type { AssemblyConstraint } from '../types'\n\n/** 3D vector(core 本地别名,§5.6 移植)。 */\nexport type Vec3 = readonly [number, number, number];\n\n// ---------------------------------------------------------------------------\n// Assembly types\n// ---------------------------------------------------------------------------\n\n/**\n * A node in an assembly tree: optional shape, local transform, metadata, and children.\n */\nexport interface AssemblyNode {\n readonly name: string;\n readonly shape?: Shape;\n readonly translate?: Vec3;\n readonly rotate?: { angle: number; axis?: Vec3 };\n readonly metadata?: Readonly<Record<string, unknown>>;\n readonly children: ReadonlyArray<AssemblyNode>;\n readonly mates?: readonly unknown[];\n /** Drivable kinematic joints (see jointFns). Typed loosely to avoid a cycle. */\n readonly joints?: readonly unknown[];\n /** P4: constraints local to this node (part names use qualified names relative to root). */\n readonly constraints?: readonly AssemblyConstraint[];\n}\n\n/** Optional properties for creating or updating an assembly node. */\nexport interface AssemblyNodeOptions {\n shape?: Shape;\n translate?: Vec3;\n rotate?: { angle: number; axis?: Vec3 };\n metadata?: Record<string, unknown>;\n constraints?: AssemblyConstraint[];\n}\n\n// ---------------------------------------------------------------------------\n// Constructors\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new assembly node.\n * @param name - Name of the node.\n * @param options - Optional shape, transform, and metadata.\n * @returns The newly created assembly node.\n */\nexport function createAssemblyNode(name: string, options: AssemblyNodeOptions = {}): AssemblyNode {\n return {\n name,\n children: [],\n ...(options.shape !== undefined ? { shape: options.shape } : {}),\n ...(options.translate !== undefined ? { translate: options.translate } : {}),\n ...(options.rotate !== undefined ? { rotate: options.rotate } : {}),\n ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),\n ...(options.constraints !== undefined ? { constraints: options.constraints } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Immutable tree operations\n// ---------------------------------------------------------------------------\n\n/**\n * Add a child node. Returns a new parent node.\n * @param parent - The parent node to extend.\n * @param child - The child node to append.\n * @returns A new parent node with the child added.\n */\nexport function addChild(parent: AssemblyNode, child: AssemblyNode): AssemblyNode {\n return { ...parent, children: [...parent.children, child] };\n}\n\n/**\n * Remove a child by name (first match). Returns a new parent node.\n * @param parent - The parent node to modify.\n * @param childName - Name of the child to remove.\n * @returns A new parent node with the child removed.\n */\nexport function removeChild(parent: AssemblyNode, childName: string): AssemblyNode {\n const idx = parent.children.findIndex((c) => c.name === childName);\n if (idx === -1) return parent;\n const children = [...parent.children];\n children.splice(idx, 1);\n return { ...parent, children };\n}\n\n/**\n * Update a node's properties. Returns a new node.\n * @param node - The node to update.\n * @param updates - Partial options to apply.\n * @returns A new node with the updates applied.\n */\nexport function updateNode(\n node: AssemblyNode,\n updates: Partial<AssemblyNodeOptions>\n): AssemblyNode {\n return {\n ...node,\n ...(updates.shape !== undefined ? { shape: updates.shape } : {}),\n ...(updates.translate !== undefined ? { translate: updates.translate } : {}),\n ...(updates.rotate !== undefined ? { rotate: updates.rotate } : {}),\n ...(updates.metadata !== undefined ? { metadata: updates.metadata } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Traversal\n// ---------------------------------------------------------------------------\n\n/**\n * Find a node by name (depth-first). Returns undefined if not found.\n * @param root - Root of the subtree to search.\n * @param name - Name of the node to find.\n * @returns The first matching node, or undefined.\n */\nexport function findNode(root: AssemblyNode, name: string): AssemblyNode | undefined {\n if (root.name === name) return root;\n for (const child of root.children) {\n const found = findNode(child, name);\n if (found) return found;\n }\n return undefined;\n}\n\n/**\n * Walk the tree depth-first, calling visitor for each node.\n * @param root - Root node to walk from.\n * @param visitor - Callback invoked with each node and its depth.\n * @param depth - Starting depth (used internally for recursion).\n * @returns Nothing.\n */\nexport function walkAssembly(\n root: AssemblyNode,\n visitor: (node: AssemblyNode, depth: number) => void,\n depth = 0\n): void {\n visitor(root, depth);\n for (const child of root.children) {\n walkAssembly(child, visitor, depth + 1);\n }\n}\n\n/**\n * Count all nodes in the tree.\n * @param root - Root node to count from.\n * @returns Total number of nodes including the root.\n */\nexport function countNodes(root: AssemblyNode): number {\n let count = 1;\n for (const child of root.children) {\n count += countNodes(child);\n }\n return count;\n}\n\n/**\n * Collect all shapes in the tree (depth-first).\n * @param root - Root node to collect from.\n * @returns All shapes found on nodes in the tree.\n */\nexport function collectShapes(root: AssemblyNode): Shape[] {\n const shapes: Shape[] = [];\n walkAssembly(root, (node) => {\n if (node.shape) shapes.push(node.shape);\n });\n return shapes;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"global-solver.d.ts","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/global-solver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAIhD,OAAO,KAAK,EAAE,kBAAkB,EAAa,MAAM,UAAU,CAAA;AAQ7D,OAAO,EAAE,KAAK,YAAY,EAAqB,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAA;AA8HtF;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,KAAK,EAAE,EAChB,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,EAAE,kBAAkB,EAAE,EACjC,IAAI,CAAC,EAAE,YAAY,GAClB,iBAAiB,CAoQnB"}
1
+ {"version":3,"file":"global-solver.d.ts","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/global-solver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAIhD,OAAO,KAAK,EAAE,kBAAkB,EAAa,MAAM,UAAU,CAAA;AAQ7D,OAAO,EAAE,KAAK,YAAY,EAAqB,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAA;AA8PtF;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,KAAK,EAAE,EAChB,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,EAAE,kBAAkB,EAAE,EACjC,IAAI,CAAC,EAAE,YAAY,GAClB,iBAAiB,CA6UnB"}
@@ -118,6 +118,140 @@ function termResidual(t, sa, sb, scale) {
118
118
  }
119
119
  }
120
120
  }
121
+ /** 单条代价项的残差维数(与 termResidual 的分支表一一对应;诊断参考)。 */
122
+ function residualDim(t) {
123
+ switch (t.fn) {
124
+ case 'point':
125
+ return Math.abs(t.val) < 1e-12 ? 3 : 1;
126
+ case 'axis':
127
+ return Math.abs(t.val) < 1e-12 || Math.abs(t.val - Math.PI) < 1e-12 ? 3 : 1;
128
+ case 'point_in_plane':
129
+ return 1;
130
+ case 'point_on_line':
131
+ return Math.abs(t.val) < 1e-12 ? 3 : 1;
132
+ }
133
+ }
134
+ void residualDim; // P7/D1-1:诊断参考表(秩判定走列归一特征值,见下)
135
+ /**
136
+ * 对称 n×n 矩阵的特征值(循环 Jacobi 旋转)。
137
+ *
138
+ * @returns 特征值数组(无序);扫掠不收敛返回 null(调用方走保守 fallback)。
139
+ */
140
+ function symEigenvalues(A, n) {
141
+ const a = A.slice();
142
+ for (let sweep = 0; sweep < 60; sweep++) {
143
+ let off = 0;
144
+ for (let p = 0; p < n; p++) {
145
+ for (let q = p + 1; q < n; q++)
146
+ off += a[p * n + q] * a[p * n + q];
147
+ }
148
+ if (off <= 1e-30 * Math.max(1, Math.abs(a[0])))
149
+ break;
150
+ for (let p = 0; p < n - 1; p++) {
151
+ for (let q = p + 1; q < n; q++) {
152
+ const apq = a[p * n + q];
153
+ if (Math.abs(apq) < 1e-300)
154
+ continue;
155
+ // Numerical Recipes 经典公式(θ=0 时 t=1,即 45° 旋转;sign(0)=0 的变体是错的)
156
+ const theta = (a[q * n + q] - a[p * n + p]) / (2 * apq);
157
+ const t = theta >= 0 ? 1 / (theta + Math.sqrt(1 + theta * theta)) : 1 / (theta - Math.sqrt(1 + theta * theta));
158
+ const c = 1 / Math.sqrt(t * t + 1);
159
+ const s = t * c;
160
+ for (let k = 0; k < n; k++) {
161
+ const akp = a[k * n + p];
162
+ const akq = a[k * n + q];
163
+ a[k * n + p] = c * akp - s * akq;
164
+ a[k * n + q] = s * akp + c * akq;
165
+ }
166
+ for (let k = 0; k < n; k++) {
167
+ const apk = a[p * n + k];
168
+ const aqk = a[q * n + k];
169
+ a[p * n + k] = c * apk - s * aqk;
170
+ a[q * n + k] = s * apk + c * aqk;
171
+ }
172
+ }
173
+ }
174
+ if (sweep === 59)
175
+ return null;
176
+ }
177
+ const out = [];
178
+ for (let i = 0; i < n; i++)
179
+ out.push(a[i * n + i]);
180
+ return out;
181
+ }
182
+ /**
183
+ * P7/D1-2:收敛后的欠定自由度诊断。
184
+ *
185
+ * 关键细节一:LM 的残差行含 PENALTY 正则行(1e-8·x)——正则化不是约束,却让 JᵀJ
186
+ * 技术上满秩;秩判定必须剔除 penalty 行。
187
+ *
188
+ * 关键细节二(为何要列归一):`computeScale` 只收集 fixedPoint 的 marker 点,
189
+ * unary 场景(fixedAxis-only + 单点 fixedPoint)scale 可能退化到 1e-6,T 块
190
+ * (1/scale² ~1e12)与 R 块(~1)的特征值量级悬殊,全局阈值会把 R 块整列误杀。
191
+ * 做法是对 J 做列范数归一(J·D⁻¹,D = diag(列范数);可逆对角重参数化保秩不变),
192
+ * 再对归一后的 JᵀJ 做特征分解,rank = #{λ > λmax·1e-8},dof = n − rank。
193
+ * 欠定方向在归一后是精确零列(零特征值),与 λmax 差无穷量级,阈值余量充足。
194
+ * 零范数列(约束完全摸不到的方向)直接计入自由。
195
+ *
196
+ * @returns 剩余自由度(0 = 适定);特征分解不收敛时保守报 0(不阻塞消费方)。
197
+ */
198
+ function computeUnderdeterminedDof(terms, scale, n, x, stateOf) {
199
+ if (n === 0)
200
+ return 0;
201
+ // 仅约束残差(剔除 penalty 正则行)
202
+ const residualC = (xx) => {
203
+ const r = [];
204
+ for (const t of terms) {
205
+ const e = termResidual(t, stateOf(xx, t.ia), stateOf(xx, t.ib), scale);
206
+ for (const v of e)
207
+ r.push(v);
208
+ }
209
+ return r;
210
+ };
211
+ const m = residualC(x).length;
212
+ if (m === 0)
213
+ return n; // 无任何约束:全部自由
214
+ const J = new Array(m * n).fill(0);
215
+ for (let col = 0; col < n; col++) {
216
+ const h = col % 6 < 3 ? 1e-7 * scale : 1e-7;
217
+ const xp = x.slice();
218
+ xp[col] += h;
219
+ const xm = x.slice();
220
+ xm[col] -= h;
221
+ const rp = residualC(xp);
222
+ const rm = residualC(xm);
223
+ for (let row = 0; row < m; row++)
224
+ J[row * n + col] = (rp[row] - rm[row]) / (2 * h);
225
+ }
226
+ // 列范数归一(欠定方向 → 精确零列;可逆对角缩放保秩)
227
+ const norms = new Array(n).fill(0);
228
+ let freeCols = 0;
229
+ for (let col = 0; col < n; col++) {
230
+ let s = 0;
231
+ for (let row = 0; row < m; row++)
232
+ s += J[row * n + col] * J[row * n + col];
233
+ norms[col] = Math.sqrt(s);
234
+ if (!(norms[col] > 1e-12))
235
+ freeCols++; // 约束完全摸不到的列 → 直接自由
236
+ }
237
+ if (freeCols === n)
238
+ return n;
239
+ const Jn = J.slice();
240
+ for (let col = 0; col < n; col++) {
241
+ const d = norms[col] > 1e-12 ? norms[col] : 1; // 零列归一因子取 1(已被计为自由)
242
+ for (let row = 0; row < m; row++)
243
+ Jn[row * n + col] /= d;
244
+ }
245
+ const JtJ = ata(Jn, m, n);
246
+ const eig = symEigenvalues(JtJ, n);
247
+ if (!eig)
248
+ return 0; // 保守 fallback(适定假设,不阻塞)
249
+ const lambdaMax = Math.max(...eig.map(Math.abs));
250
+ if (!(lambdaMax > 1e-300))
251
+ return freeCols + n; // 理论不可达;防御
252
+ const rank = eig.filter((v) => Math.abs(v) > lambdaMax * 1e-8).length;
253
+ return Math.max(0, n - rank);
254
+ }
121
255
  /**
122
256
  * 纯 TS global 求解器入口。
123
257
  *
@@ -169,6 +303,67 @@ export function solveGlobal(members, memberNames, constraints, opts) {
169
303
  lockedSet.add(idx);
170
304
  return;
171
305
  }
306
+ // 世界锚定 unary(fixedPoint/fixedAxis/fixedRotation):入 unarySet 但**不**入
307
+ // lockedSet——只靠代价项约束,不冻结整件(CQ unary 语义,见 solver.py fixed_*_cost)。
308
+ if (c.type === 'fixedPoint') {
309
+ register(c.a.part);
310
+ unarySet.add(c.a.part);
311
+ const ia = memberNames.indexOf(c.a.part);
312
+ if (ia < 0) {
313
+ unsupported.push(`constraint references unknown part: ${c.a.part}`);
314
+ return;
315
+ }
316
+ const mA = resolveMarker(c.a, env);
317
+ scalePts.push(markerPoint(mA, [0, 0, 0], [0, 0, 0]));
318
+ terms.push({
319
+ cid, fn: 'point', ia, ma: mA, ib: -1,
320
+ mb: { type: 'point', p: [c.world[0], c.world[1], c.world[2]] },
321
+ val: 0, scaleFlag: true,
322
+ });
323
+ return;
324
+ }
325
+ if (c.type === 'fixedAxis') {
326
+ register(c.a.part);
327
+ unarySet.add(c.a.part);
328
+ const ia = memberNames.indexOf(c.a.part);
329
+ if (ia < 0) {
330
+ unsupported.push(`constraint references unknown part: ${c.a.part}`);
331
+ return;
332
+ }
333
+ const len = Math.hypot(c.worldDir[0], c.worldDir[1], c.worldDir[2]);
334
+ if (!(len > 1e-12)) {
335
+ unsupported.push('fixedAxis requires a non-zero worldDir');
336
+ return;
337
+ }
338
+ const mA = resolveMarker(c.a, env);
339
+ terms.push({
340
+ cid, fn: 'axis', ia, ma: mA, ib: -1,
341
+ mb: { type: 'axis', origin: [0, 0, 0], dir: vnormalize([c.worldDir[0], c.worldDir[1], c.worldDir[2]]) },
342
+ val: 0, scaleFlag: false,
343
+ });
344
+ return;
345
+ }
346
+ if (c.type === 'fixedRotation') {
347
+ register(c.part);
348
+ unarySet.add(c.part);
349
+ const ia = memberNames.indexOf(c.part);
350
+ if (ia < 0) {
351
+ unsupported.push(`constraint references unknown part: ${c.part}`);
352
+ return;
353
+ }
354
+ // 成员本地 X/Y/Z 轴分别钉到世界 X/Y/Z(恒等朝向);平移保持自由
355
+ const axes = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];
356
+ for (const ax of axes) {
357
+ terms.push({
358
+ cid, fn: 'axis', ia,
359
+ ma: { type: 'axis', origin: [0, 0, 0], dir: ax },
360
+ ib: -1,
361
+ mb: { type: 'axis', origin: [0, 0, 0], dir: [ax[0], ax[1], ax[2]] },
362
+ val: 0, scaleFlag: false,
363
+ });
364
+ }
365
+ return;
366
+ }
172
367
  const ia = memberNames.indexOf(c.a.part);
173
368
  const ib = memberNames.indexOf(c.b.part);
174
369
  if (ia < 0 || ib < 0) {
@@ -244,9 +439,14 @@ export function solveGlobal(members, memberNames, constraints, opts) {
244
439
  }
245
440
  }
246
441
  if (lockedSet.size === 0 && order.length > 0) {
247
- const idx = memberNames.indexOf(order[0]);
248
- if (idx >= 0)
249
- lockedSet.add(idx);
442
+ // 兜底锚定不得选「世界锚定 unary」成员——锁死它会让其 anchor 代价无法满足
443
+ // (全 unary 场景:无 binary 参考可锚,宁可全部自由交 LM 求解,也不误锁)。
444
+ const candidate = order.find((p) => !unarySet.has(p));
445
+ if (candidate !== undefined) {
446
+ const idx = memberNames.indexOf(candidate);
447
+ if (idx >= 0)
448
+ lockedSet.add(idx);
449
+ }
250
450
  }
251
451
  // ── scale = 所有 marker 点的包围盒对角长(CQ B5;marker 近似几何 bbox) ──
252
452
  const scale = computeScale(scalePts);
@@ -267,6 +467,9 @@ export function solveGlobal(members, memberNames, constraints, opts) {
267
467
  x[6 * k + 5] = R_INIT;
268
468
  }
269
469
  const stateOf = (xx, i) => {
470
+ // 世界哨兵 i = -1:identity(世界系 marker 已存字面坐标,不再施加成员变换)
471
+ if (i < 0)
472
+ return { T: [0, 0, 0], R: [0, 0, 0] };
270
473
  if (lockedSet.has(i))
271
474
  return { T: [0, 0, 0], R: [0, 0, 0] };
272
475
  const k = blockMap.get(i);
@@ -377,9 +580,13 @@ export function solveGlobal(members, memberNames, constraints, opts) {
377
580
  if (r > RESIDUAL_WARN * scale)
378
581
  warnings.push(`constraint #${cid} residual=${r.toExponential(3)} (> ${RESIDUAL_WARN * scale})`);
379
582
  });
583
+ // P7/D1-2:欠定自由度诊断(剔除 penalty 正则行后按 JᵀJc 特征值秩判定)
584
+ const underdeterminedDof = computeUnderdeterminedDof(terms, scale, n, x, stateOf);
380
585
  return {
381
586
  transforms,
382
587
  dof: 0,
588
+ // P7/D1-3:旧 `dof` 字段语义不变(unsupported 合计的占位),欠定信息走新字段。
589
+ underdetermined: underdeterminedDof > 0 ? { dof: underdeterminedDof } : undefined,
383
590
  converged: true,
384
591
  unsupported,
385
592
  residuals,
@@ -1 +1 @@
1
- {"version":3,"file":"global-solver.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/global-solver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/assembly/solvers/global-solver — 纯 TS global 装配求解器(P1)\n *\n * 复刻 CadQuery `cadquery/occ_impl/solver.py` 的**语义**(全局 NLP、模长参数化旋转、\n * 9 类代价、Axis 缺省反平行、Plane=Axis(π)+Point(0)、包围盒对角长缩放),\n * 以 Levenberg-Marquardt 替代 IPOPT,**零原生/WASM 依赖**(裁定 1–6)。\n *\n * 关键裁定(写进代码,不在别处手算):\n * - 裁定 1/2:faijs Shape 不携带 placement → 初值 T0=R0=0,world 系==本地系;\n * 两侧 marker 经 `resolveFaceGeometryOfRef`/`resolveSolverEntity` 直接取本地系,无不对称。\n * - 裁定 3:残差取 CQ 代价的「平方前内层量」(非对代价开方)。\n * - 裁定 4:线性求解自实现(linalg.ts)。\n * - 裁定 5:旋转 pivot 恒 [0,0,0](CQ 的 Rotate(v,R)+T 绕世界原点)。\n * - 裁定 6:锚定用 CQ B4(assembly.py:455-490):Fixed / name==self.name 锁定;\n * 否则第一个不在 unary 里的 binary object;否则实体 0。锁定成员冻结为 identity。\n *\n * 失败模式(§4.6):唯一抛错路径 = 约束类型无法映射为代价;其余以 warnings 透明化,\n * 不抛错(LM 终止即 converged=true)。\n */\n\nimport type { Shape } from '../../../mesh/types'\nimport type { BrepEngineApi } from '../../../brep/engine/primitives'\nimport { getBrepApi } from '../../../brep/handle-bridge'\nimport type { AssemblyTransform } from '../../../runtime-state'\nimport type { AssemblyConstraint, EntityRef } from '../types'\nimport { normalizeConstraint } from '../normalize'\nimport { poseToAssemblyTransform, type SolverPose } from '../pose'\nimport {\n resolveFaceGeometryOfRef,\n resolveSolverEntity,\n type EntityResolutionEnv,\n} from '../entities'\nimport { type SolveOptions, type GlobalMarker, type GlobalSolveResult } from './types'\nimport {\n type Vec3,\n vadd,\n vsub,\n vdot,\n vscale,\n vnormalize,\n vsumsqr,\n ata,\n atb,\n solveDampedNormal,\n} from './linalg'\nimport { rotateByR, quatFromR } from './pose-from-delta'\n\nconst DEG2RAD = Math.PI / 180\nconst R_INIT = 1e-2 // B3\nconst LM_LAMBDA0 = 1e-3\nconst LM_MAXITER = 2000\nconst LM_TOL_OBJ = 1e-12\nconst LM_TOL_STEP = 1e-10\nconst PENALTY = 1e-16 // B1,等价 sqrt = 1e-8\nconst RESIDUAL_WARN = 1e-6 // §4.6 阈值系数\n\ntype CostFn = 'point' | 'axis' | 'point_in_plane' | 'point_on_line'\n\ninterface CostTerm {\n cid: number\n fn: CostFn\n /** 点侧成员下标(point_in_plane/point_on_line 的点;axis 的 dir 侧)。 */\n ia: number\n ma: GlobalMarker\n /** 平面/线侧成员下标(point_in_plane/point_on_line 的平面/线;axis 的 dir 侧)。 */\n ib: number\n mb: GlobalMarker\n /** point=距离(mm);axis=夹角(rad);point_in_plane/point_on_line=val。 */\n val: number\n /** 是否除以 scale(CQ scaling 字典:point 类 true,axis 类 false)。 */\n scaleFlag: boolean\n}\n\n/** 把一条 EntityRef 解析为本地系 GlobalMarker(无坐标系不对称)。 */\nfunction resolveMarker(ref: EntityRef, env: EntityResolutionEnv): GlobalMarker {\n if ('point' in ref) {\n return { type: 'point', p: [ref.point[0], ref.point[1], ref.point[2]] }\n }\n if ('face' in ref) {\n const geom = resolveFaceGeometryOfRef(ref, env)\n const normal = vnormalize([geom.normal[0], geom.normal[1], geom.normal[2]])\n return {\n type: 'plane',\n center: [geom.center[0], geom.center[1], geom.center[2]],\n normal,\n }\n }\n // edge / faceIndex → 走 resolveSolverEntity(统一抽取)\n const se = resolveSolverEntity(ref, env)\n if (se.type === 'axis') {\n return {\n type: 'axis',\n origin: [se.origin[0], se.origin[1], se.origin[2]],\n // `direction` is optional in the brepjs SolverEntity type but always present for the\n // axis branch produced by resolveSolverEntity (cylinder/cone face, or edge axis snapshot).\n dir: vnormalize([se.direction![0], se.direction![1], se.direction![2]]),\n }\n }\n if (se.type === 'plane') {\n return {\n type: 'plane',\n center: [se.origin[0], se.origin[1], se.origin[2]],\n // `normal` is optional in the brepjs SolverEntity type but always present for the plane branch.\n normal: vnormalize([se.normal![0], se.normal![1], se.normal![2]]),\n }\n }\n return { type: 'point', p: [se.origin[0], se.origin[1], se.origin[2]] }\n}\n\nfunction markerPoint(m: GlobalMarker, R: Vec3, T: Vec3): Vec3 {\n const base = m.type === 'point' ? m.p : m.type === 'axis' ? m.origin : m.center\n return vadd(rotateByR(base, R), T)\n}\nfunction markerDir(m: GlobalMarker, R: Vec3): Vec3 {\n // point markers never reach here (axis cost / plane normal / line direction only);\n // narrow to axis/plane and fall back to the point for type-completeness.\n const base = m.type === 'axis' ? m.dir : m.type === 'plane' ? m.normal : m.p\n return rotateByR(base, R)\n}\n\n/** 计算单条代价项的残差向量(平方前内层量,裁定 3)。 */\nfunction termResidual(t: CostTerm, sa: { T: Vec3; R: Vec3 }, sb: { T: Vec3; R: Vec3 }, scale: number): number[] {\n const inv = t.scaleFlag ? 1 / scale : 1\n switch (t.fn) {\n case 'point': {\n const pa = markerPoint(t.ma, sa.R, sa.T)\n const pb = markerPoint(t.mb, sb.R, sb.T)\n const d = vscale(vsub(pa, pb), inv)\n if (Math.abs(t.val) < 1e-12) return d // 3-vec,val=0\n return [vsumsqr(d) - (t.val / scale) ** 2] // 1-vec,val≠0\n }\n case 'axis': {\n const d1 = markerDir(t.ma, sa.R)\n const d2 = markerDir(t.mb, sb.R)\n if (Math.abs(t.val) < 1e-12) return vsub(d1, d2) // 3-vec,val=0\n if (Math.abs(t.val - Math.PI) < 1e-12) return vadd(d1, d2) // 3-vec,val=π\n return [vdot(d1, d2) - Math.cos(t.val)] // 1-vec,其他\n }\n case 'point_in_plane': {\n const p1 = markerPoint(t.ma, sa.R, sa.T) // 点\n const n = markerDir(t.mb, sb.R) // 平面法向\n let c = markerPoint(t.mb, sb.R, sb.T) // 平面上一点\n if (Math.abs(t.val) > 1e-12) c = vadd(c, vscale(n, t.val)) // 沿法向平移 val(CQ m2_pnt 偏移)\n const d = vdot(n, vsub(c, p1)) * inv\n return [d] // 1-vec\n }\n case 'point_on_line': {\n const p1 = markerPoint(t.ma, sa.R, sa.T) // 点\n const o = markerPoint(t.mb, sb.R, sb.T) // 线上一点\n const dln = markerDir(t.mb, sb.R) // 线方向\n const delta = vsub(p1, o)\n const perp = vscale(vsub(delta, vscale(dln, vdot(delta, dln))), inv)\n if (Math.abs(t.val) < 1e-12) return perp // 3-vec,val=0\n return [vsumsqr(perp) - t.val] // 1-vec,val≠0(注意 val 不缩放)\n }\n }\n}\n\n/**\n * 纯 TS global 求解器入口。\n *\n * @param members - member shapes(与 memberNames 对齐)。\n * @param memberNames - 成员变量名(约束以名引用,空名会抛错)。\n * @param constraints - 规范化前的原始约束。\n * @param opts - 求解选项(solver 已在外层判定为 'global',此处 name 用于 B4 锚定)。\n * @returns 与 `AssemblySolveResult` 对齐的结果。\n */\nexport function solveGlobal(\n members: Shape[],\n memberNames: string[],\n constraints: AssemblyConstraint[],\n opts?: SolveOptions,\n): GlobalSolveResult {\n memberNames.forEach((name, i) => {\n if (!name) {\n throw new Error(`[assembly:global] member at index ${i} has an empty name`)\n }\n })\n\n const memberMap = new Map<string, Shape>()\n members.forEach((m, i) => {\n const name = memberNames[i]\n if (name && !memberMap.has(name)) memberMap.set(name, m)\n })\n\n let kernel: BrepEngineApi | null = null\n try {\n kernel = getBrepApi()\n } catch {\n /* mesh/primitive 行快照路径:快照引用仍可解 */\n }\n const env: EntityResolutionEnv = { kernel, memberOf: (p: string) => memberMap.get(p) }\n\n // ── 建立代价项、锁定集、尺度点 ──\n const terms: CostTerm[] = []\n const unsupported: string[] = []\n const lockedSet = new Set<number>()\n const order: string[] = []\n const binaryOrder: string[] = []\n const unarySet = new Set<string>()\n const scalePts: Vec3[] = []\n\n constraints.forEach((raw, cid) => {\n const c = normalizeConstraint(raw)\n const register = (p: string) => {\n if (!order.includes(p)) order.push(p)\n }\n if (c.type === 'fixed') {\n register(c.part)\n unarySet.add(c.part)\n const idx = memberNames.indexOf(c.part)\n if (idx >= 0) lockedSet.add(idx)\n return\n }\n const ia = memberNames.indexOf(c.a.part)\n const ib = memberNames.indexOf(c.b.part)\n if (ia < 0 || ib < 0) {\n unsupported.push(`constraint references unknown part: ${ia < 0 ? c.a.part : c.b.part}`)\n return\n }\n if (!binaryOrder.includes(c.a.part)) binaryOrder.push(c.a.part)\n register(c.a.part)\n register(c.b.part)\n if (c.a.part === opts?.name) lockedSet.add(ia)\n if (c.b.part === opts?.name) lockedSet.add(ib)\n\n const mA = resolveMarker(c.a, env)\n const mB = resolveMarker(c.b, env)\n scalePts.push(markerPoint(mA, [0, 0, 0], [0, 0, 0]))\n scalePts.push(markerPoint(mB, [0, 0, 0], [0, 0, 0]))\n\n switch (c.type) {\n case 'mate':\n case 'align': {\n if (mA.type !== 'plane' || mB.type !== 'plane') {\n unsupported.push(`${c.type} requires plane entities on both sides`)\n return\n }\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: c.type === 'mate' ? Math.PI : 0, scaleFlag: false })\n terms.push({ cid, fn: 'point', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: true })\n break\n }\n case 'coincident': {\n pushCoincident(terms, cid, ia, mA, ib, mB)\n break\n }\n case 'concentric': {\n if (mA.type !== 'axis' || mB.type !== 'axis') {\n unsupported.push('concentric requires axis entities on both sides')\n return\n }\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: false })\n terms.push({ cid, fn: 'point_on_line', ia, ma: { type: 'point', p: mA.origin }, ib, mb: mB, val: 0, scaleFlag: true })\n break\n }\n case 'distance': {\n pushDistance(terms, cid, ia, mA, ib, mB, c.value, unsupported)\n break\n }\n case 'angle': {\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: c.value * DEG2RAD, scaleFlag: false })\n break\n }\n case 'parallel': {\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: false })\n break\n }\n case 'perpendicular': {\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: Math.PI / 2, scaleFlag: false })\n break\n }\n default:\n unsupported.push(`unsupported constraint type: ${(c as { type?: string }).type}`)\n }\n })\n\n // ── B4 锚定 ──\n if (lockedSet.size === 0) {\n for (const b of binaryOrder) {\n if (!unarySet.has(b)) {\n const idx = memberNames.indexOf(b)\n if (idx >= 0) {\n lockedSet.add(idx)\n break\n }\n }\n }\n }\n if (lockedSet.size === 0 && order.length > 0) {\n const idx = memberNames.indexOf(order[0])\n if (idx >= 0) lockedSet.add(idx)\n }\n\n // ── scale = 所有 marker 点的包围盒对角长(CQ B5;marker 近似几何 bbox) ──\n const scale = computeScale(scalePts)\n\n // ── 自由成员与变量 ──\n const freeIdx: number[] = []\n const blockMap = new Map<number, number>()\n memberNames.forEach((_, i) => {\n if (!lockedSet.has(i)) {\n blockMap.set(i, freeIdx.length)\n freeIdx.push(i)\n }\n })\n const n = freeIdx.length * 6\n const x = new Array(n).fill(0)\n for (let k = 0; k < freeIdx.length; k++) {\n x[6 * k + 3] = R_INIT\n x[6 * k + 4] = R_INIT\n x[6 * k + 5] = R_INIT\n }\n\n const stateOf = (xx: number[], i: number): { T: Vec3; R: Vec3 } => {\n if (lockedSet.has(i)) return { T: [0, 0, 0], R: [0, 0, 0] }\n const k = blockMap.get(i)!\n return {\n T: [xx[6 * k], xx[6 * k + 1], xx[6 * k + 2]],\n R: [xx[6 * k + 3], xx[6 * k + 4], xx[6 * k + 5]],\n }\n }\n\n const residual = (xx: number[]): number[] => {\n const r: number[] = []\n for (const t of terms) {\n const e = termResidual(t, stateOf(xx, t.ia), stateOf(xx, t.ib), scale)\n for (const v of e) r.push(v)\n }\n // penalty 1e-16(B1):sqrt 后 1e-8,T/scale 缩小、R 直接\n for (let k = 0; k < freeIdx.length; k++) {\n r.push(PENALTY ** 0.5 * (xx[6 * k] / scale))\n r.push(PENALTY ** 0.5 * (xx[6 * k + 1] / scale))\n r.push(PENALTY ** 0.5 * (xx[6 * k + 2] / scale))\n r.push(PENALTY ** 0.5 * xx[6 * k + 3])\n r.push(PENALTY ** 0.5 * xx[6 * k + 4])\n r.push(PENALTY ** 0.5 * xx[6 * k + 5])\n }\n return r\n }\n\n // ── LM 迭代 ──\n let lambda = LM_LAMBDA0\n let current = residual(x)\n let obj = 0.5 * dot(current, current)\n\n for (let iter = 0; iter < LM_MAXITER; iter++) {\n const m = current.length\n const J = new Array(m * n).fill(0)\n for (let col = 0; col < n; col++) {\n const h = col % 6 < 3 ? 1e-7 * scale : 1e-7\n const xp = x.slice()\n const xm = x.slice()\n xp[col] += h\n xm[col] -= h\n const rp = residual(xp)\n const rm = residual(xm)\n for (let row = 0; row < m; row++) J[row * n + col] = (rp[row] - rm[row]) / (2 * h)\n }\n const JtJ = ata(J, m, n)\n const Jtr = atb(J, current, m, n)\n\n // 梯度范数收敛(与步长早停互补,避免 λ 放大时误判收敛)\n if (maxAbs(Jtr) < 1e-8) {\n break\n }\n\n const negJtr = Jtr.map((v) => -v)\n const objBefore = obj\n let improved = false\n let acceptedStep: number[] | null = null\n for (let attempt = 0; attempt < 12 && !improved; attempt++) {\n const step = solveDampedNormal(JtJ, negJtr, n, lambda)\n if (!step) break\n const xTry = x.slice()\n for (let j = 0; j < n; j++) xTry[j] += step[j]\n const rTry = residual(xTry)\n const objTry = 0.5 * dot(rTry, rTry)\n if (objTry <= obj) {\n for (let j = 0; j < n; j++) x[j] = xTry[j]\n current = rTry\n obj = objTry\n improved = true\n acceptedStep = step\n lambda = Math.max(lambda / 3, 1e-15)\n } else {\n lambda *= 2\n }\n }\n if (!improved) break\n\n // 步长收敛仅在信任域健康(λ 小)时认定——λ 大时的微小步长只是阻尼,非真收敛\n if (acceptedStep && maxAbs(acceptedStep) < LM_TOL_STEP && lambda < 1e-2) {\n break\n }\n if (Math.abs(objBefore - obj) < LM_TOL_OBJ * Math.max(1, Math.abs(objBefore))) {\n break\n }\n }\n\n // ── 组装结果 ──\n const transforms: AssemblyTransform[] = []\n for (let k = 0; k < freeIdx.length; k++) {\n const i = freeIdx[k]\n const T: Vec3 = [x[6 * k], x[6 * k + 1], x[6 * k + 2]]\n const R: Vec3 = [x[6 * k + 3], x[6 * k + 4], x[6 * k + 5]]\n const pose: SolverPose = { position: T, rotation: quatFromR(R[0], R[1], R[2]) }\n transforms.push(poseToAssemblyTransform(pose, [0, 0, 0], i))\n }\n\n // 逐约束残差(诊断)\n const residuals: number[] = []\n const warnings: string[] = []\n const byCid = new Map<number, number>()\n for (const t of terms) {\n const e = termResidual(t, stateOf(x, t.ia), stateOf(x, t.ib), scale)\n const s = e.reduce((acc, v) => acc + v * v, 0)\n byCid.set(t.cid, (byCid.get(t.cid) ?? 0) + s)\n }\n constraints.forEach((_, cid) => {\n const r = byCid.get(cid) ?? 0\n residuals.push(r)\n if (r > RESIDUAL_WARN * scale) warnings.push(`constraint #${cid} residual=${r.toExponential(3)} (> ${RESIDUAL_WARN * scale})`)\n })\n\n return {\n transforms,\n dof: 0,\n converged: true,\n unsupported,\n residuals,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n}\n\nfunction pushCoincident(terms: CostTerm[], cid: number, ia: number, mA: GlobalMarker, ib: number, mB: GlobalMarker): void {\n if (mA.type === 'point' && mB.type === 'point') {\n terms.push({ cid, fn: 'point', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: true })\n } else if (mA.type === 'plane' && mB.type === 'point') {\n terms.push({ cid, fn: 'point_in_plane', ia: ib, ma: mB, ib: ia, mb: mA, val: 0, scaleFlag: true })\n } else if (mA.type === 'point' && mB.type === 'plane') {\n terms.push({ cid, fn: 'point_in_plane', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: true })\n } else if (mA.type === 'axis' && mB.type === 'axis') {\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: false })\n terms.push({ cid, fn: 'point_on_line', ia, ma: { type: 'point', p: mA.origin }, ib, mb: mB, val: 0, scaleFlag: true })\n } else if (mA.type === 'axis' && mB.type === 'point') {\n terms.push({ cid, fn: 'point_on_line', ia: ib, ma: mB, ib, mb: mA, val: 0, scaleFlag: true })\n } else if (mA.type === 'point' && mB.type === 'axis') {\n terms.push({ cid, fn: 'point_on_line', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: true })\n } else {\n // 两面 coincident:按 align 语义(平行 + 中心重合)\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: false })\n terms.push({ cid, fn: 'point', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: true })\n }\n}\n\nfunction pushDistance(\n terms: CostTerm[],\n cid: number,\n ia: number,\n mA: GlobalMarker,\n ib: number,\n mB: GlobalMarker,\n val: number,\n unsupported: string[],\n): void {\n if (mA.type === 'point' && mB.type === 'point') {\n terms.push({ cid, fn: 'point', ia, ma: mA, ib, mb: mB, val, scaleFlag: true })\n } else if (mA.type === 'plane' && mB.type === 'point') {\n terms.push({ cid, fn: 'point_in_plane', ia: ib, ma: mB, ib: ia, mb: mA, val, scaleFlag: true })\n } else if (mA.type === 'point' && mB.type === 'plane') {\n terms.push({ cid, fn: 'point_in_plane', ia, ma: mA, ib, mb: mB, val, scaleFlag: true })\n } else if (mA.type === 'axis' && mB.type === 'axis') {\n terms.push({ cid, fn: 'point_on_line', ia, ma: { type: 'point', p: mA.origin }, ib, mb: mB, val, scaleFlag: true })\n } else {\n unsupported.push(`distance requires point-point / plane-point / axis-axis entities, got ${mA.type}-${mB.type}`)\n }\n}\n\nfunction computeScale(pts: Vec3[]): number {\n if (pts.length === 0) return 1\n const min: Vec3 = [Infinity, Infinity, Infinity]\n const max: Vec3 = [-Infinity, -Infinity, -Infinity]\n for (const p of pts) {\n for (let i = 0; i < 3; i++) {\n if (p[i] < min[i]) min[i] = p[i]\n if (p[i] > max[i]) max[i] = p[i]\n }\n }\n const diag = Math.hypot(max[0] - min[0], max[1] - min[1], max[2] - min[2])\n return Math.max(diag, 1e-6)\n}\n\nfunction dot(a: number[], b: number[]): number {\n let s = 0\n for (let i = 0; i < a.length; i++) s += a[i] * b[i]\n return s\n}\nfunction maxAbs(a: number[]): number {\n let m = 0\n for (const v of a) m = Math.max(m, Math.abs(v))\n return m\n}\n"]}
1
+ {"version":3,"file":"global-solver.js","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/global-solver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * api/assembly/solvers/global-solver — 纯 TS global 装配求解器(P1)\n *\n * 复刻 CadQuery `cadquery/occ_impl/solver.py` 的**语义**(全局 NLP、模长参数化旋转、\n * 9 类代价、Axis 缺省反平行、Plane=Axis(π)+Point(0)、包围盒对角长缩放),\n * 以 Levenberg-Marquardt 替代 IPOPT,**零原生/WASM 依赖**(裁定 1–6)。\n *\n * 关键裁定(写进代码,不在别处手算):\n * - 裁定 1/2:faijs Shape 不携带 placement → 初值 T0=R0=0,world 系==本地系;\n * 两侧 marker 经 `resolveFaceGeometryOfRef`/`resolveSolverEntity` 直接取本地系,无不对称。\n * - 裁定 3:残差取 CQ 代价的「平方前内层量」(非对代价开方)。\n * - 裁定 4:线性求解自实现(linalg.ts)。\n * - 裁定 5:旋转 pivot 恒 [0,0,0](CQ 的 Rotate(v,R)+T 绕世界原点)。\n * - 裁定 6:锚定用 CQ B4(assembly.py:455-490):Fixed / name==self.name 锁定;\n * 否则第一个不在 unary 里的 binary object;否则实体 0。锁定成员冻结为 identity。\n *\n * 失败模式(§4.6):唯一抛错路径 = 约束类型无法映射为代价;其余以 warnings 透明化,\n * 不抛错(LM 终止即 converged=true)。\n */\n\nimport type { Shape } from '../../../mesh/types'\nimport type { BrepEngineApi } from '../../../brep/engine/primitives'\nimport { getBrepApi } from '../../../brep/handle-bridge'\nimport type { AssemblyTransform } from '../../../runtime-state'\nimport type { AssemblyConstraint, EntityRef } from '../types'\nimport { normalizeConstraint } from '../normalize'\nimport { poseToAssemblyTransform, type SolverPose } from '../pose'\nimport {\n resolveFaceGeometryOfRef,\n resolveSolverEntity,\n type EntityResolutionEnv,\n} from '../entities'\nimport { type SolveOptions, type GlobalMarker, type GlobalSolveResult } from './types'\nimport {\n type Vec3,\n vadd,\n vsub,\n vdot,\n vscale,\n vnormalize,\n vsumsqr,\n ata,\n atb,\n solveDampedNormal,\n} from './linalg'\nimport { rotateByR, quatFromR } from './pose-from-delta'\n\nconst DEG2RAD = Math.PI / 180\nconst R_INIT = 1e-2 // B3\nconst LM_LAMBDA0 = 1e-3\nconst LM_MAXITER = 2000\nconst LM_TOL_OBJ = 1e-12\nconst LM_TOL_STEP = 1e-10\nconst PENALTY = 1e-16 // B1,等价 sqrt = 1e-8\nconst RESIDUAL_WARN = 1e-6 // §4.6 阈值系数\n\ntype CostFn = 'point' | 'axis' | 'point_in_plane' | 'point_on_line'\n\ninterface CostTerm {\n cid: number\n fn: CostFn\n /** 点侧成员下标(point_in_plane/point_on_line 的点;axis 的 dir 侧)。 */\n ia: number\n ma: GlobalMarker\n /** 平面/线侧成员下标(point_in_plane/point_on_line 的平面/线;axis 的 dir 侧)。 */\n ib: number\n mb: GlobalMarker\n /** point=距离(mm);axis=夹角(rad);point_in_plane/point_on_line=val。 */\n val: number\n /** 是否除以 scale(CQ scaling 字典:point 类 true,axis 类 false)。 */\n scaleFlag: boolean\n}\n\n/** 把一条 EntityRef 解析为本地系 GlobalMarker(无坐标系不对称)。 */\nfunction resolveMarker(ref: EntityRef, env: EntityResolutionEnv): GlobalMarker {\n if ('point' in ref) {\n return { type: 'point', p: [ref.point[0], ref.point[1], ref.point[2]] }\n }\n if ('face' in ref) {\n const geom = resolveFaceGeometryOfRef(ref, env)\n const normal = vnormalize([geom.normal[0], geom.normal[1], geom.normal[2]])\n return {\n type: 'plane',\n center: [geom.center[0], geom.center[1], geom.center[2]],\n normal,\n }\n }\n // edge / faceIndex → 走 resolveSolverEntity(统一抽取)\n const se = resolveSolverEntity(ref, env)\n if (se.type === 'axis') {\n return {\n type: 'axis',\n origin: [se.origin[0], se.origin[1], se.origin[2]],\n // `direction` is optional in the brepjs SolverEntity type but always present for the\n // axis branch produced by resolveSolverEntity (cylinder/cone face, or edge axis snapshot).\n dir: vnormalize([se.direction![0], se.direction![1], se.direction![2]]),\n }\n }\n if (se.type === 'plane') {\n return {\n type: 'plane',\n center: [se.origin[0], se.origin[1], se.origin[2]],\n // `normal` is optional in the brepjs SolverEntity type but always present for the plane branch.\n normal: vnormalize([se.normal![0], se.normal![1], se.normal![2]]),\n }\n }\n return { type: 'point', p: [se.origin[0], se.origin[1], se.origin[2]] }\n}\n\nfunction markerPoint(m: GlobalMarker, R: Vec3, T: Vec3): Vec3 {\n const base = m.type === 'point' ? m.p : m.type === 'axis' ? m.origin : m.center\n return vadd(rotateByR(base, R), T)\n}\nfunction markerDir(m: GlobalMarker, R: Vec3): Vec3 {\n // point markers never reach here (axis cost / plane normal / line direction only);\n // narrow to axis/plane and fall back to the point for type-completeness.\n const base = m.type === 'axis' ? m.dir : m.type === 'plane' ? m.normal : m.p\n return rotateByR(base, R)\n}\n\n/** 计算单条代价项的残差向量(平方前内层量,裁定 3)。 */\nfunction termResidual(t: CostTerm, sa: { T: Vec3; R: Vec3 }, sb: { T: Vec3; R: Vec3 }, scale: number): number[] {\n const inv = t.scaleFlag ? 1 / scale : 1\n switch (t.fn) {\n case 'point': {\n const pa = markerPoint(t.ma, sa.R, sa.T)\n const pb = markerPoint(t.mb, sb.R, sb.T)\n const d = vscale(vsub(pa, pb), inv)\n if (Math.abs(t.val) < 1e-12) return d // 3-vec,val=0\n return [vsumsqr(d) - (t.val / scale) ** 2] // 1-vec,val≠0\n }\n case 'axis': {\n const d1 = markerDir(t.ma, sa.R)\n const d2 = markerDir(t.mb, sb.R)\n if (Math.abs(t.val) < 1e-12) return vsub(d1, d2) // 3-vec,val=0\n if (Math.abs(t.val - Math.PI) < 1e-12) return vadd(d1, d2) // 3-vec,val=π\n return [vdot(d1, d2) - Math.cos(t.val)] // 1-vec,其他\n }\n case 'point_in_plane': {\n const p1 = markerPoint(t.ma, sa.R, sa.T) // 点\n const n = markerDir(t.mb, sb.R) // 平面法向\n let c = markerPoint(t.mb, sb.R, sb.T) // 平面上一点\n if (Math.abs(t.val) > 1e-12) c = vadd(c, vscale(n, t.val)) // 沿法向平移 val(CQ m2_pnt 偏移)\n const d = vdot(n, vsub(c, p1)) * inv\n return [d] // 1-vec\n }\n case 'point_on_line': {\n const p1 = markerPoint(t.ma, sa.R, sa.T) // 点\n const o = markerPoint(t.mb, sb.R, sb.T) // 线上一点\n const dln = markerDir(t.mb, sb.R) // 线方向\n const delta = vsub(p1, o)\n const perp = vscale(vsub(delta, vscale(dln, vdot(delta, dln))), inv)\n if (Math.abs(t.val) < 1e-12) return perp // 3-vec,val=0\n return [vsumsqr(perp) - t.val] // 1-vec,val≠0(注意 val 不缩放)\n }\n }\n}\n\n/** 单条代价项的残差维数(与 termResidual 的分支表一一对应;诊断参考)。 */\nfunction residualDim(t: CostTerm): number {\n switch (t.fn) {\n case 'point':\n return Math.abs(t.val) < 1e-12 ? 3 : 1\n case 'axis':\n return Math.abs(t.val) < 1e-12 || Math.abs(t.val - Math.PI) < 1e-12 ? 3 : 1\n case 'point_in_plane':\n return 1\n case 'point_on_line':\n return Math.abs(t.val) < 1e-12 ? 3 : 1\n }\n}\nvoid residualDim // P7/D1-1:诊断参考表(秩判定走列归一特征值,见下)\n\n/**\n * 对称 n×n 矩阵的特征值(循环 Jacobi 旋转)。\n *\n * @returns 特征值数组(无序);扫掠不收敛返回 null(调用方走保守 fallback)。\n */\nfunction symEigenvalues(A: number[], n: number): number[] | null {\n const a = A.slice()\n for (let sweep = 0; sweep < 60; sweep++) {\n let off = 0\n for (let p = 0; p < n; p++) {\n for (let q = p + 1; q < n; q++) off += a[p * n + q] * a[p * n + q]\n }\n if (off <= 1e-30 * Math.max(1, Math.abs(a[0]))) break\n for (let p = 0; p < n - 1; p++) {\n for (let q = p + 1; q < n; q++) {\n const apq = a[p * n + q]\n if (Math.abs(apq) < 1e-300) continue\n // Numerical Recipes 经典公式(θ=0 时 t=1,即 45° 旋转;sign(0)=0 的变体是错的)\n const theta = (a[q * n + q] - a[p * n + p]) / (2 * apq)\n const t = theta >= 0 ? 1 / (theta + Math.sqrt(1 + theta * theta)) : 1 / (theta - Math.sqrt(1 + theta * theta))\n const c = 1 / Math.sqrt(t * t + 1)\n const s = t * c\n for (let k = 0; k < n; k++) {\n const akp = a[k * n + p]\n const akq = a[k * n + q]\n a[k * n + p] = c * akp - s * akq\n a[k * n + q] = s * akp + c * akq\n }\n for (let k = 0; k < n; k++) {\n const apk = a[p * n + k]\n const aqk = a[q * n + k]\n a[p * n + k] = c * apk - s * aqk\n a[q * n + k] = s * apk + c * aqk\n }\n }\n }\n if (sweep === 59) return null\n }\n const out: number[] = []\n for (let i = 0; i < n; i++) out.push(a[i * n + i])\n return out\n}\n\n/**\n * P7/D1-2:收敛后的欠定自由度诊断。\n *\n * 关键细节一:LM 的残差行含 PENALTY 正则行(1e-8·x)——正则化不是约束,却让 JᵀJ\n * 技术上满秩;秩判定必须剔除 penalty 行。\n *\n * 关键细节二(为何要列归一):`computeScale` 只收集 fixedPoint 的 marker 点,\n * unary 场景(fixedAxis-only + 单点 fixedPoint)scale 可能退化到 1e-6,T 块\n * (1/scale² ~1e12)与 R 块(~1)的特征值量级悬殊,全局阈值会把 R 块整列误杀。\n * 做法是对 J 做列范数归一(J·D⁻¹,D = diag(列范数);可逆对角重参数化保秩不变),\n * 再对归一后的 JᵀJ 做特征分解,rank = #{λ > λmax·1e-8},dof = n − rank。\n * 欠定方向在归一后是精确零列(零特征值),与 λmax 差无穷量级,阈值余量充足。\n * 零范数列(约束完全摸不到的方向)直接计入自由。\n *\n * @returns 剩余自由度(0 = 适定);特征分解不收敛时保守报 0(不阻塞消费方)。\n */\nfunction computeUnderdeterminedDof(\n terms: CostTerm[],\n scale: number,\n n: number,\n x: number[],\n stateOf: (xx: number[], i: number) => { T: Vec3; R: Vec3 },\n): number {\n if (n === 0) return 0\n // 仅约束残差(剔除 penalty 正则行)\n const residualC = (xx: number[]): number[] => {\n const r: number[] = []\n for (const t of terms) {\n const e = termResidual(t, stateOf(xx, t.ia), stateOf(xx, t.ib), scale)\n for (const v of e) r.push(v)\n }\n return r\n }\n const m = residualC(x).length\n if (m === 0) return n // 无任何约束:全部自由\n const J: number[] = new Array(m * n).fill(0)\n for (let col = 0; col < n; col++) {\n const h = col % 6 < 3 ? 1e-7 * scale : 1e-7\n const xp = x.slice()\n xp[col] += h\n const xm = x.slice()\n xm[col] -= h\n const rp = residualC(xp)\n const rm = residualC(xm)\n for (let row = 0; row < m; row++) J[row * n + col] = (rp[row] - rm[row]) / (2 * h)\n }\n // 列范数归一(欠定方向 → 精确零列;可逆对角缩放保秩)\n const norms = new Array<number>(n).fill(0)\n let freeCols = 0\n for (let col = 0; col < n; col++) {\n let s = 0\n for (let row = 0; row < m; row++) s += J[row * n + col] * J[row * n + col]\n norms[col] = Math.sqrt(s)\n if (!(norms[col] > 1e-12)) freeCols++ // 约束完全摸不到的列 → 直接自由\n }\n if (freeCols === n) return n\n const Jn: number[] = J.slice()\n for (let col = 0; col < n; col++) {\n const d = norms[col] > 1e-12 ? norms[col] : 1 // 零列归一因子取 1(已被计为自由)\n for (let row = 0; row < m; row++) Jn[row * n + col] /= d\n }\n const JtJ = ata(Jn, m, n)\n const eig = symEigenvalues(JtJ, n)\n if (!eig) return 0 // 保守 fallback(适定假设,不阻塞)\n const lambdaMax = Math.max(...eig.map(Math.abs))\n if (!(lambdaMax > 1e-300)) return freeCols + n // 理论不可达;防御\n const rank = eig.filter((v) => Math.abs(v) > lambdaMax * 1e-8).length\n return Math.max(0, n - rank)\n}\n\n/**\n * 纯 TS global 求解器入口。\n *\n * @param members - member shapes(与 memberNames 对齐)。\n * @param memberNames - 成员变量名(约束以名引用,空名会抛错)。\n * @param constraints - 规范化前的原始约束。\n * @param opts - 求解选项(solver 已在外层判定为 'global',此处 name 用于 B4 锚定)。\n * @returns 与 `AssemblySolveResult` 对齐的结果。\n */\nexport function solveGlobal(\n members: Shape[],\n memberNames: string[],\n constraints: AssemblyConstraint[],\n opts?: SolveOptions,\n): GlobalSolveResult {\n memberNames.forEach((name, i) => {\n if (!name) {\n throw new Error(`[assembly:global] member at index ${i} has an empty name`)\n }\n })\n\n const memberMap = new Map<string, Shape>()\n members.forEach((m, i) => {\n const name = memberNames[i]\n if (name && !memberMap.has(name)) memberMap.set(name, m)\n })\n\n let kernel: BrepEngineApi | null = null\n try {\n kernel = getBrepApi()\n } catch {\n /* mesh/primitive 行快照路径:快照引用仍可解 */\n }\n const env: EntityResolutionEnv = { kernel, memberOf: (p: string) => memberMap.get(p) }\n\n // ── 建立代价项、锁定集、尺度点 ──\n const terms: CostTerm[] = []\n const unsupported: string[] = []\n const lockedSet = new Set<number>()\n const order: string[] = []\n const binaryOrder: string[] = []\n const unarySet = new Set<string>()\n const scalePts: Vec3[] = []\n\n constraints.forEach((raw, cid) => {\n const c = normalizeConstraint(raw)\n const register = (p: string) => {\n if (!order.includes(p)) order.push(p)\n }\n if (c.type === 'fixed') {\n register(c.part)\n unarySet.add(c.part)\n const idx = memberNames.indexOf(c.part)\n if (idx >= 0) lockedSet.add(idx)\n return\n }\n // 世界锚定 unary(fixedPoint/fixedAxis/fixedRotation):入 unarySet 但**不**入\n // lockedSet——只靠代价项约束,不冻结整件(CQ unary 语义,见 solver.py fixed_*_cost)。\n if (c.type === 'fixedPoint') {\n register(c.a.part)\n unarySet.add(c.a.part)\n const ia = memberNames.indexOf(c.a.part)\n if (ia < 0) {\n unsupported.push(`constraint references unknown part: ${c.a.part}`)\n return\n }\n const mA = resolveMarker(c.a, env)\n scalePts.push(markerPoint(mA, [0, 0, 0], [0, 0, 0]))\n terms.push({\n cid, fn: 'point', ia, ma: mA, ib: -1,\n mb: { type: 'point', p: [c.world[0], c.world[1], c.world[2]] },\n val: 0, scaleFlag: true,\n })\n return\n }\n if (c.type === 'fixedAxis') {\n register(c.a.part)\n unarySet.add(c.a.part)\n const ia = memberNames.indexOf(c.a.part)\n if (ia < 0) {\n unsupported.push(`constraint references unknown part: ${c.a.part}`)\n return\n }\n const len = Math.hypot(c.worldDir[0], c.worldDir[1], c.worldDir[2])\n if (!(len > 1e-12)) {\n unsupported.push('fixedAxis requires a non-zero worldDir')\n return\n }\n const mA = resolveMarker(c.a, env)\n terms.push({\n cid, fn: 'axis', ia, ma: mA, ib: -1,\n mb: { type: 'axis', origin: [0, 0, 0], dir: vnormalize([c.worldDir[0], c.worldDir[1], c.worldDir[2]]) },\n val: 0, scaleFlag: false,\n })\n return\n }\n if (c.type === 'fixedRotation') {\n register(c.part)\n unarySet.add(c.part)\n const ia = memberNames.indexOf(c.part)\n if (ia < 0) {\n unsupported.push(`constraint references unknown part: ${c.part}`)\n return\n }\n // 成员本地 X/Y/Z 轴分别钉到世界 X/Y/Z(恒等朝向);平移保持自由\n const axes: Vec3[] = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]\n for (const ax of axes) {\n terms.push({\n cid, fn: 'axis', ia,\n ma: { type: 'axis', origin: [0, 0, 0], dir: ax },\n ib: -1,\n mb: { type: 'axis', origin: [0, 0, 0], dir: [ax[0], ax[1], ax[2]] },\n val: 0, scaleFlag: false,\n })\n }\n return\n }\n const ia = memberNames.indexOf(c.a.part)\n const ib = memberNames.indexOf(c.b.part)\n if (ia < 0 || ib < 0) {\n unsupported.push(`constraint references unknown part: ${ia < 0 ? c.a.part : c.b.part}`)\n return\n }\n if (!binaryOrder.includes(c.a.part)) binaryOrder.push(c.a.part)\n register(c.a.part)\n register(c.b.part)\n if (c.a.part === opts?.name) lockedSet.add(ia)\n if (c.b.part === opts?.name) lockedSet.add(ib)\n\n const mA = resolveMarker(c.a, env)\n const mB = resolveMarker(c.b, env)\n scalePts.push(markerPoint(mA, [0, 0, 0], [0, 0, 0]))\n scalePts.push(markerPoint(mB, [0, 0, 0], [0, 0, 0]))\n\n switch (c.type) {\n case 'mate':\n case 'align': {\n if (mA.type !== 'plane' || mB.type !== 'plane') {\n unsupported.push(`${c.type} requires plane entities on both sides`)\n return\n }\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: c.type === 'mate' ? Math.PI : 0, scaleFlag: false })\n terms.push({ cid, fn: 'point', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: true })\n break\n }\n case 'coincident': {\n pushCoincident(terms, cid, ia, mA, ib, mB)\n break\n }\n case 'concentric': {\n if (mA.type !== 'axis' || mB.type !== 'axis') {\n unsupported.push('concentric requires axis entities on both sides')\n return\n }\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: false })\n terms.push({ cid, fn: 'point_on_line', ia, ma: { type: 'point', p: mA.origin }, ib, mb: mB, val: 0, scaleFlag: true })\n break\n }\n case 'distance': {\n pushDistance(terms, cid, ia, mA, ib, mB, c.value, unsupported)\n break\n }\n case 'angle': {\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: c.value * DEG2RAD, scaleFlag: false })\n break\n }\n case 'parallel': {\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: false })\n break\n }\n case 'perpendicular': {\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: Math.PI / 2, scaleFlag: false })\n break\n }\n default:\n unsupported.push(`unsupported constraint type: ${(c as { type?: string }).type}`)\n }\n })\n\n // ── B4 锚定 ──\n if (lockedSet.size === 0) {\n for (const b of binaryOrder) {\n if (!unarySet.has(b)) {\n const idx = memberNames.indexOf(b)\n if (idx >= 0) {\n lockedSet.add(idx)\n break\n }\n }\n }\n }\n if (lockedSet.size === 0 && order.length > 0) {\n // 兜底锚定不得选「世界锚定 unary」成员——锁死它会让其 anchor 代价无法满足\n // (全 unary 场景:无 binary 参考可锚,宁可全部自由交 LM 求解,也不误锁)。\n const candidate = order.find((p) => !unarySet.has(p))\n if (candidate !== undefined) {\n const idx = memberNames.indexOf(candidate)\n if (idx >= 0) lockedSet.add(idx)\n }\n }\n\n // ── scale = 所有 marker 点的包围盒对角长(CQ B5;marker 近似几何 bbox) ──\n const scale = computeScale(scalePts)\n\n // ── 自由成员与变量 ──\n const freeIdx: number[] = []\n const blockMap = new Map<number, number>()\n memberNames.forEach((_, i) => {\n if (!lockedSet.has(i)) {\n blockMap.set(i, freeIdx.length)\n freeIdx.push(i)\n }\n })\n const n = freeIdx.length * 6\n const x = new Array(n).fill(0)\n for (let k = 0; k < freeIdx.length; k++) {\n x[6 * k + 3] = R_INIT\n x[6 * k + 4] = R_INIT\n x[6 * k + 5] = R_INIT\n }\n\n const stateOf = (xx: number[], i: number): { T: Vec3; R: Vec3 } => {\n // 世界哨兵 i = -1:identity(世界系 marker 已存字面坐标,不再施加成员变换)\n if (i < 0) return { T: [0, 0, 0], R: [0, 0, 0] }\n if (lockedSet.has(i)) return { T: [0, 0, 0], R: [0, 0, 0] }\n const k = blockMap.get(i)!\n return {\n T: [xx[6 * k], xx[6 * k + 1], xx[6 * k + 2]],\n R: [xx[6 * k + 3], xx[6 * k + 4], xx[6 * k + 5]],\n }\n }\n\n const residual = (xx: number[]): number[] => {\n const r: number[] = []\n for (const t of terms) {\n const e = termResidual(t, stateOf(xx, t.ia), stateOf(xx, t.ib), scale)\n for (const v of e) r.push(v)\n }\n // penalty 1e-16(B1):sqrt 后 1e-8,T/scale 缩小、R 直接\n for (let k = 0; k < freeIdx.length; k++) {\n r.push(PENALTY ** 0.5 * (xx[6 * k] / scale))\n r.push(PENALTY ** 0.5 * (xx[6 * k + 1] / scale))\n r.push(PENALTY ** 0.5 * (xx[6 * k + 2] / scale))\n r.push(PENALTY ** 0.5 * xx[6 * k + 3])\n r.push(PENALTY ** 0.5 * xx[6 * k + 4])\n r.push(PENALTY ** 0.5 * xx[6 * k + 5])\n }\n return r\n }\n\n // ── LM 迭代 ──\n let lambda = LM_LAMBDA0\n let current = residual(x)\n let obj = 0.5 * dot(current, current)\n\n for (let iter = 0; iter < LM_MAXITER; iter++) {\n const m = current.length\n const J = new Array(m * n).fill(0)\n for (let col = 0; col < n; col++) {\n const h = col % 6 < 3 ? 1e-7 * scale : 1e-7\n const xp = x.slice()\n const xm = x.slice()\n xp[col] += h\n xm[col] -= h\n const rp = residual(xp)\n const rm = residual(xm)\n for (let row = 0; row < m; row++) J[row * n + col] = (rp[row] - rm[row]) / (2 * h)\n }\n const JtJ = ata(J, m, n)\n const Jtr = atb(J, current, m, n)\n\n // 梯度范数收敛(与步长早停互补,避免 λ 放大时误判收敛)\n if (maxAbs(Jtr) < 1e-8) {\n break\n }\n\n const negJtr = Jtr.map((v) => -v)\n const objBefore = obj\n let improved = false\n let acceptedStep: number[] | null = null\n for (let attempt = 0; attempt < 12 && !improved; attempt++) {\n const step = solveDampedNormal(JtJ, negJtr, n, lambda)\n if (!step) break\n const xTry = x.slice()\n for (let j = 0; j < n; j++) xTry[j] += step[j]\n const rTry = residual(xTry)\n const objTry = 0.5 * dot(rTry, rTry)\n if (objTry <= obj) {\n for (let j = 0; j < n; j++) x[j] = xTry[j]\n current = rTry\n obj = objTry\n improved = true\n acceptedStep = step\n lambda = Math.max(lambda / 3, 1e-15)\n } else {\n lambda *= 2\n }\n }\n if (!improved) break\n\n // 步长收敛仅在信任域健康(λ 小)时认定——λ 大时的微小步长只是阻尼,非真收敛\n if (acceptedStep && maxAbs(acceptedStep) < LM_TOL_STEP && lambda < 1e-2) {\n break\n }\n if (Math.abs(objBefore - obj) < LM_TOL_OBJ * Math.max(1, Math.abs(objBefore))) {\n break\n }\n }\n\n // ── 组装结果 ──\n const transforms: AssemblyTransform[] = []\n for (let k = 0; k < freeIdx.length; k++) {\n const i = freeIdx[k]\n const T: Vec3 = [x[6 * k], x[6 * k + 1], x[6 * k + 2]]\n const R: Vec3 = [x[6 * k + 3], x[6 * k + 4], x[6 * k + 5]]\n const pose: SolverPose = { position: T, rotation: quatFromR(R[0], R[1], R[2]) }\n transforms.push(poseToAssemblyTransform(pose, [0, 0, 0], i))\n }\n\n // 逐约束残差(诊断)\n const residuals: number[] = []\n const warnings: string[] = []\n const byCid = new Map<number, number>()\n for (const t of terms) {\n const e = termResidual(t, stateOf(x, t.ia), stateOf(x, t.ib), scale)\n const s = e.reduce((acc, v) => acc + v * v, 0)\n byCid.set(t.cid, (byCid.get(t.cid) ?? 0) + s)\n }\n constraints.forEach((_, cid) => {\n const r = byCid.get(cid) ?? 0\n residuals.push(r)\n if (r > RESIDUAL_WARN * scale) warnings.push(`constraint #${cid} residual=${r.toExponential(3)} (> ${RESIDUAL_WARN * scale})`)\n })\n\n // P7/D1-2:欠定自由度诊断(剔除 penalty 正则行后按 JᵀJc 特征值秩判定)\n const underdeterminedDof = computeUnderdeterminedDof(terms, scale, n, x, stateOf)\n\n return {\n transforms,\n dof: 0,\n // P7/D1-3:旧 `dof` 字段语义不变(unsupported 合计的占位),欠定信息走新字段。\n underdetermined: underdeterminedDof > 0 ? { dof: underdeterminedDof } : undefined,\n converged: true,\n unsupported,\n residuals,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n}\n\nfunction pushCoincident(terms: CostTerm[], cid: number, ia: number, mA: GlobalMarker, ib: number, mB: GlobalMarker): void {\n if (mA.type === 'point' && mB.type === 'point') {\n terms.push({ cid, fn: 'point', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: true })\n } else if (mA.type === 'plane' && mB.type === 'point') {\n terms.push({ cid, fn: 'point_in_plane', ia: ib, ma: mB, ib: ia, mb: mA, val: 0, scaleFlag: true })\n } else if (mA.type === 'point' && mB.type === 'plane') {\n terms.push({ cid, fn: 'point_in_plane', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: true })\n } else if (mA.type === 'axis' && mB.type === 'axis') {\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: false })\n terms.push({ cid, fn: 'point_on_line', ia, ma: { type: 'point', p: mA.origin }, ib, mb: mB, val: 0, scaleFlag: true })\n } else if (mA.type === 'axis' && mB.type === 'point') {\n terms.push({ cid, fn: 'point_on_line', ia: ib, ma: mB, ib, mb: mA, val: 0, scaleFlag: true })\n } else if (mA.type === 'point' && mB.type === 'axis') {\n terms.push({ cid, fn: 'point_on_line', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: true })\n } else {\n // 两面 coincident:按 align 语义(平行 + 中心重合)\n terms.push({ cid, fn: 'axis', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: false })\n terms.push({ cid, fn: 'point', ia, ma: mA, ib, mb: mB, val: 0, scaleFlag: true })\n }\n}\n\nfunction pushDistance(\n terms: CostTerm[],\n cid: number,\n ia: number,\n mA: GlobalMarker,\n ib: number,\n mB: GlobalMarker,\n val: number,\n unsupported: string[],\n): void {\n if (mA.type === 'point' && mB.type === 'point') {\n terms.push({ cid, fn: 'point', ia, ma: mA, ib, mb: mB, val, scaleFlag: true })\n } else if (mA.type === 'plane' && mB.type === 'point') {\n terms.push({ cid, fn: 'point_in_plane', ia: ib, ma: mB, ib: ia, mb: mA, val, scaleFlag: true })\n } else if (mA.type === 'point' && mB.type === 'plane') {\n terms.push({ cid, fn: 'point_in_plane', ia, ma: mA, ib, mb: mB, val, scaleFlag: true })\n } else if (mA.type === 'axis' && mB.type === 'axis') {\n terms.push({ cid, fn: 'point_on_line', ia, ma: { type: 'point', p: mA.origin }, ib, mb: mB, val, scaleFlag: true })\n } else {\n unsupported.push(`distance requires point-point / plane-point / axis-axis entities, got ${mA.type}-${mB.type}`)\n }\n}\n\nfunction computeScale(pts: Vec3[]): number {\n if (pts.length === 0) return 1\n const min: Vec3 = [Infinity, Infinity, Infinity]\n const max: Vec3 = [-Infinity, -Infinity, -Infinity]\n for (const p of pts) {\n for (let i = 0; i < 3; i++) {\n if (p[i] < min[i]) min[i] = p[i]\n if (p[i] > max[i]) max[i] = p[i]\n }\n }\n const diag = Math.hypot(max[0] - min[0], max[1] - min[1], max[2] - min[2])\n return Math.max(diag, 1e-6)\n}\n\nfunction dot(a: number[], b: number[]): number {\n let s = 0\n for (let i = 0; i < a.length; i++) s += a[i] * b[i]\n return s\n}\nfunction maxAbs(a: number[]): number {\n let m = 0\n for (const v of a) m = Math.max(m, Math.abs(v))\n return m\n}\n"]}
@@ -45,6 +45,14 @@ export interface GlobalSolveResult {
45
45
  transforms: AssemblyTransform[];
46
46
  /** 恒 0(数值求解不做 DOF 分析,保留字段避免 undefined)。 */
47
47
  dof: number;
48
+ /**
49
+ * P7/D1-3:欠定自由度诊断(仅 global 路径)。dof > 0 = 约束集欠定,终态位姿
50
+ * 依赖优化器轨迹、无唯一「正确解」——判等方应走规范判等通道而非逐位比对。
51
+ * dof === 0 时字段缺省(undefined)。
52
+ */
53
+ underdetermined?: {
54
+ dof: number;
55
+ };
48
56
  /** LM 终止即 true(无论残差大小;裁定 4.6)。 */
49
57
  converged: boolean;
50
58
  /** 仅约束类型无法映射为代价时填充。 */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,4DAA4D;AAC5D,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
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/api/assembly/solvers/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,4DAA4D;AAC5D,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;;;;OAIG;IACH,eAAe,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACjC,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"}