@faicad/faijs 0.32.3 → 0.33.2
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.
- package/dist/api/api-namespace.js +3 -3
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/assembly/index.d.ts +1 -0
- package/dist/api/assembly/index.d.ts.map +1 -1
- package/dist/api/assembly/index.js +1 -0
- package/dist/api/assembly/index.js.map +1 -1
- package/dist/api/assembly/lower.d.ts.map +1 -1
- package/dist/api/assembly/lower.js +7 -0
- package/dist/api/assembly/lower.js.map +1 -1
- package/dist/api/assembly/normalize.d.ts.map +1 -1
- package/dist/api/assembly/normalize.js +2 -1
- package/dist/api/assembly/normalize.js.map +1 -1
- package/dist/api/assembly/solve-tree.d.ts +46 -0
- package/dist/api/assembly/solve-tree.d.ts.map +1 -0
- package/dist/api/assembly/solve-tree.js +135 -0
- package/dist/api/assembly/solve-tree.js.map +1 -0
- package/dist/api/assembly/solve.d.ts +7 -0
- package/dist/api/assembly/solve.d.ts.map +1 -1
- package/dist/api/assembly/solve.js.map +1 -1
- package/dist/api/assembly/solvers/assembly-tree.d.ts +4 -0
- package/dist/api/assembly/solvers/assembly-tree.d.ts.map +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js +1 -0
- package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
- package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
- package/dist/api/assembly/solvers/global-solver.js +210 -3
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/types.d.ts +8 -0
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/assembly/types.d.ts +32 -1
- package/dist/api/assembly/types.d.ts.map +1 -1
- package/dist/api/assembly/types.js.map +1 -1
- package/dist/api/assembly/validate.d.ts +2 -2
- package/dist/api/assembly/validate.d.ts.map +1 -1
- package/dist/api/assembly/validate.js +24 -2
- package/dist/api/assembly/validate.js.map +1 -1
- package/dist/api/cadquery-selectors/edge.js +1 -1
- package/dist/api/cadquery-selectors/edge.js.map +1 -1
- package/dist/api/cadquery-selectors/entity.d.ts +29 -20
- package/dist/api/cadquery-selectors/entity.d.ts.map +1 -1
- package/dist/api/cadquery-selectors/entity.js +26 -20
- package/dist/api/cadquery-selectors/entity.js.map +1 -1
- package/dist/api/cadquery-selectors/face.d.ts +4 -2
- package/dist/api/cadquery-selectors/face.d.ts.map +1 -1
- package/dist/api/cadquery-selectors/face.js +8 -7
- package/dist/api/cadquery-selectors/face.js.map +1 -1
- package/dist/api/cadquery-selectors/resolve.d.ts +7 -6
- package/dist/api/cadquery-selectors/resolve.d.ts.map +1 -1
- package/dist/api/cadquery-selectors/resolve.js +13 -11
- package/dist/api/cadquery-selectors/resolve.js.map +1 -1
- package/dist/api/chamfer.js +1 -1
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/draft.js +1 -1
- package/dist/api/draft.js.map +1 -1
- package/dist/api/edge-ref.js +2 -2
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/engrave.js +1 -1
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/export-3mf.js +1 -1
- package/dist/api/export-3mf.js.map +1 -1
- package/dist/api/export-brep.js +1 -1
- package/dist/api/export-brep.js.map +1 -1
- package/dist/api/export-step.d.ts +12 -13
- package/dist/api/export-step.d.ts.map +1 -1
- package/dist/api/export-step.js +19 -17
- package/dist/api/export-step.js.map +1 -1
- package/dist/api/extrude.js +3 -3
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.js +2 -2
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/feature-repair.js +2 -2
- package/dist/api/feature-repair.js.map +1 -1
- package/dist/api/fillet-variable.js +1 -1
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.js +1 -1
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/geom.js +1 -1
- package/dist/api/geom.js.map +1 -1
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +4 -2
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/pattern.js +1 -1
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/place.js +1 -1
- package/dist/api/place.js.map +1 -1
- package/dist/api/punch-hole.js +1 -1
- package/dist/api/punch-hole.js.map +1 -1
- package/dist/api/replicate.js +1 -1
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/revolve.js +1 -1
- package/dist/api/revolve.js.map +1 -1
- package/dist/api/section-by-plane.js +1 -1
- package/dist/api/section-by-plane.js.map +1 -1
- package/dist/api/shell.js +1 -1
- package/dist/api/shell.js.map +1 -1
- package/dist/api/sketch-on-face.js +1 -1
- package/dist/api/sketch-on-face.js.map +1 -1
- package/dist/api/split-by-plane.js +1 -1
- package/dist/api/split-by-plane.js.map +1 -1
- package/dist/api/split.js +1 -1
- package/dist/api/split.js.map +1 -1
- package/dist/api/thicken.js +1 -1
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/topo-resolve.js +4 -4
- package/dist/api/topo-resolve.js.map +1 -1
- package/dist/api/transform.js +1 -1
- package/dist/api/transform.js.map +1 -1
- package/dist/api/view/view-projection.d.ts +8 -0
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +73 -2
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/boolean/cross-section.d.ts.map +1 -1
- package/dist/boolean/cross-section.js +3 -1
- package/dist/boolean/cross-section.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +26 -0
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +45 -0
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.js +1 -1
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +2 -0
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +17 -0
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +36 -11
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/export/step-flat.d.ts +35 -0
- package/dist/brep/export/step-flat.d.ts.map +1 -0
- package/dist/brep/export/step-flat.js +94 -0
- package/dist/brep/export/step-flat.js.map +1 -0
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +42 -21
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +4 -4
- package/dist/brep/handle-bridge.js +4 -4
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brep/svg/svg-to-solid.d.ts +3 -17
- package/dist/brep/svg/svg-to-solid.d.ts.map +1 -1
- package/dist/brep/svg/svg-to-solid.js +16 -317
- package/dist/brep/svg/svg-to-solid.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +10 -0
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.d.ts +1 -1
- package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.js +7 -6
- package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
- package/dist/brepkit-kernel/multi-version-test.d.ts +7 -7
- package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -1
- package/dist/brepkit-kernel/multi-version-test.js +10 -10
- package/dist/brepkit-kernel/multi-version-test.js.map +1 -1
- package/dist/cad-runtime/direct-executor.js +2 -2
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/runtime.js +5 -5
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/geometry2d/curve2d.js +42 -1
- package/dist/geometry2d/curve2d.js.map +1 -1
- package/dist/math3d/Box3.js.map +1 -1
- package/dist/math3d/Euler.js.map +1 -1
- package/dist/math3d/Mat4.js.map +1 -1
- package/dist/math3d/Plane.js.map +1 -1
- package/dist/math3d/Quat.js.map +1 -1
- package/dist/math3d/Vec2.js.map +1 -1
- package/dist/math3d/Vec3.js.map +1 -1
- package/dist/math3d/index.js.map +1 -1
- package/dist/mesh/meshdata/contour.d.ts +34 -0
- package/dist/mesh/meshdata/contour.d.ts.map +1 -0
- package/dist/mesh/meshdata/contour.js +39 -0
- package/dist/mesh/meshdata/contour.js.map +1 -0
- package/dist/mesh/meshdata/extrude.d.ts +25 -0
- package/dist/mesh/meshdata/extrude.d.ts.map +1 -0
- package/dist/mesh/meshdata/extrude.js +198 -0
- package/dist/mesh/meshdata/extrude.js.map +1 -0
- package/dist/mesh/meshdata/index.js.map +1 -1
- package/dist/mesh/meshdata/ops.js.map +1 -1
- package/dist/mesh/meshdata/parametric.js.map +1 -1
- package/dist/mesh/meshdata/weld.js.map +1 -1
- package/dist/node-host/cli.d.ts +9 -0
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +34 -9
- package/dist/node-host/cli.js.map +1 -1
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +2 -0
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/primitives/svg/svg-path.d.ts +192 -0
- package/dist/primitives/svg/svg-path.d.ts.map +1 -0
- package/dist/primitives/svg/svg-path.js +776 -0
- package/dist/primitives/svg/svg-path.js.map +1 -0
- package/dist/third-party/earcut.d.ts +19 -0
- package/dist/third-party/earcut.d.ts.map +1 -0
- package/dist/third-party/earcut.js +575 -0
- package/dist/third-party/earcut.js.map +1 -0
- package/package.json +10 -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;
|
|
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":"AAAA;;;;;;;;;;;GAWG;
|
|
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;
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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"}
|