@faicad/faijs 0.33.2 → 0.35.8
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.d.ts +14 -14
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +40 -14
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/appearance.d.ts +47 -6
- package/dist/api/appearance.d.ts.map +1 -1
- package/dist/api/appearance.js.map +1 -1
- package/dist/api/assembly/entities.js +14 -4
- package/dist/api/assembly/entities.js.map +1 -1
- package/dist/api/assembly/solve-tree.d.ts +1 -0
- package/dist/api/assembly/solve-tree.d.ts.map +1 -1
- package/dist/api/assembly/solve-tree.js +42 -17
- package/dist/api/assembly/solve-tree.js.map +1 -1
- package/dist/api/assembly/solve.d.ts +1 -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/global-solver.d.ts.map +1 -1
- package/dist/api/assembly/solvers/global-solver.js +130 -23
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/pose-from-delta.d.ts +9 -0
- package/dist/api/assembly/solvers/pose-from-delta.d.ts.map +1 -1
- package/dist/api/assembly/solvers/pose-from-delta.js +23 -0
- package/dist/api/assembly/solvers/pose-from-delta.js.map +1 -1
- package/dist/api/assembly/solvers/types.d.ts +20 -2
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/chamfer.d.ts +7 -4
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +57 -13
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/draft.d.ts +7 -4
- package/dist/api/draft.d.ts.map +1 -1
- package/dist/api/draft.js +11 -6
- package/dist/api/draft.js.map +1 -1
- package/dist/api/edge-ref.d.ts +4 -4
- package/dist/api/edge-ref.js +4 -4
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/extrude.d.ts +10 -6
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +54 -26
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.d.ts +4 -4
- package/dist/api/face-ref.js +4 -4
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/feature-repair.d.ts +6 -3
- package/dist/api/feature-repair.d.ts.map +1 -1
- package/dist/api/feature-repair.js +12 -7
- package/dist/api/feature-repair.js.map +1 -1
- package/dist/api/fillet-variable.d.ts +6 -2
- package/dist/api/fillet-variable.d.ts.map +1 -1
- package/dist/api/fillet-variable.js +24 -6
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +7 -4
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +92 -12
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/script-face-manifest.js +1 -1
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/topology.js +1 -1
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/helix.d.ts +13 -13
- package/dist/api/helix.d.ts.map +1 -1
- package/dist/api/helix.js +19 -24
- package/dist/api/helix.js.map +1 -1
- package/dist/api/import-brep.d.ts +10 -18
- package/dist/api/import-brep.d.ts.map +1 -1
- package/dist/api/import-brep.js +17 -25
- package/dist/api/import-brep.js.map +1 -1
- package/dist/api/import-step.d.ts +10 -15
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +24 -29
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/index.js +2 -2
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/export-members.js.map +1 -1
- package/dist/api/loft-advanced.d.ts +4 -0
- package/dist/api/loft-advanced.d.ts.map +1 -1
- package/dist/api/loft-advanced.js +4 -0
- package/dist/api/loft-advanced.js.map +1 -1
- package/dist/api/loft.d.ts +5 -3
- package/dist/api/loft.d.ts.map +1 -1
- package/dist/api/loft.js +5 -3
- package/dist/api/loft.js.map +1 -1
- package/dist/api/meta.d.ts +42 -6
- package/dist/api/meta.d.ts.map +1 -1
- package/dist/api/meta.js.map +1 -1
- package/dist/api/primitives.d.ts +3 -2
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +3 -2
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/punch-hole.d.ts +5 -2
- package/dist/api/punch-hole.d.ts.map +1 -1
- package/dist/api/punch-hole.js +4 -1
- package/dist/api/punch-hole.js.map +1 -1
- package/dist/api/replicate.d.ts +4 -5
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +4 -5
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/selectors-to-refs.d.ts +83 -0
- package/dist/api/selectors-to-refs.d.ts.map +1 -0
- package/dist/api/selectors-to-refs.js +211 -0
- package/dist/api/selectors-to-refs.js.map +1 -0
- package/dist/api/shell.d.ts +17 -8
- package/dist/api/shell.d.ts.map +1 -1
- package/dist/api/shell.js +45 -15
- package/dist/api/shell.js.map +1 -1
- package/dist/api/sketch-on-face.d.ts +12 -6
- package/dist/api/sketch-on-face.d.ts.map +1 -1
- package/dist/api/sketch-on-face.js +31 -4
- package/dist/api/sketch-on-face.js.map +1 -1
- package/dist/api/sketch-on-plane.d.ts +3 -0
- package/dist/api/sketch-on-plane.d.ts.map +1 -1
- package/dist/api/sketch-on-plane.js +3 -0
- package/dist/api/sketch-on-plane.js.map +1 -1
- package/dist/api/sketch-on-surface.d.ts +4 -1
- package/dist/api/sketch-on-surface.d.ts.map +1 -1
- package/dist/api/sketch-on-surface.js +4 -1
- package/dist/api/sketch-on-surface.js.map +1 -1
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +5 -6
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/topo-resolve.d.ts.map +1 -1
- package/dist/api/topo-resolve.js +24 -5
- package/dist/api/topo-resolve.js.map +1 -1
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +9 -2
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/brep/brep-chain.js +2 -2
- package/dist/brep/brep-chain.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +1 -1
- package/dist/brep/brep-ops.js +1 -1
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +45 -0
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +87 -3
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js +1 -1
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/registry.d.ts +33 -7
- package/dist/brep/engine/registry.d.ts.map +1 -1
- package/dist/brep/engine/registry.js +47 -16
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +14 -15
- package/dist/brep/handle-bridge.d.ts.map +1 -1
- package/dist/brep/handle-bridge.js +35 -15
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brep/primitives-brep.js +2 -2
- package/dist/brep/primitives-brep.js.map +1 -1
- package/dist/brep/text/text-to-solid.d.ts +40 -3
- package/dist/brep/text/text-to-solid.d.ts.map +1 -1
- package/dist/brep/text/text-to-solid.js +104 -24
- package/dist/brep/text/text-to-solid.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +2 -2
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +328 -38
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.d.ts +3 -1
- package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.js +13 -9
- package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
- package/dist/brepkit-kernel/multi-version-test.d.ts +2 -2
- package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -1
- package/dist/brepkit-kernel/multi-version-test.js +6 -6
- package/dist/brepkit-kernel/multi-version-test.js.map +1 -1
- package/dist/browser.d.ts +2 -3
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +1 -2
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +9 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +11 -1
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.d.ts +16 -11
- package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.js +16 -8
- package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts +62 -5
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +617 -42
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/interp/closure.d.ts +3 -2
- package/dist/cad-runtime/interp/closure.d.ts.map +1 -1
- package/dist/cad-runtime/interp/closure.js.map +1 -1
- package/dist/cad-runtime/interp/env.d.ts +9 -6
- package/dist/cad-runtime/interp/env.d.ts.map +1 -1
- package/dist/cad-runtime/interp/env.js +4 -2
- package/dist/cad-runtime/interp/env.js.map +1 -1
- package/dist/cad-runtime/lib-decl.d.ts +121 -0
- package/dist/cad-runtime/lib-decl.d.ts.map +1 -0
- package/dist/cad-runtime/lib-decl.js +100 -0
- package/dist/cad-runtime/lib-decl.js.map +1 -0
- package/dist/cad-runtime/ports.d.ts +12 -0
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +59 -5
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +252 -20
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/extra/browser.d.ts +9 -0
- package/dist/extra/browser.d.ts.map +1 -0
- package/dist/extra/browser.js +9 -0
- package/dist/extra/browser.js.map +1 -0
- package/dist/extra/editor-ops.d.ts +22 -0
- package/dist/extra/editor-ops.d.ts.map +1 -0
- package/dist/extra/editor-ops.js +21 -0
- package/dist/extra/editor-ops.js.map +1 -0
- package/dist/extra/extras/svg-extrude.d.ts +45 -0
- package/dist/extra/extras/svg-extrude.d.ts.map +1 -0
- package/dist/extra/extras/svg-extrude.js +110 -0
- package/dist/extra/extras/svg-extrude.js.map +1 -0
- package/dist/extra/extras/text-cjk.d.ts +36 -0
- package/dist/extra/extras/text-cjk.d.ts.map +1 -0
- package/dist/extra/extras/text-cjk.js +86 -0
- package/dist/extra/extras/text-cjk.js.map +1 -0
- package/dist/extra/extras/text-geometry.d.ts +69 -0
- package/dist/extra/extras/text-geometry.d.ts.map +1 -0
- package/dist/extra/extras/text-geometry.js +188 -0
- package/dist/extra/extras/text-geometry.js.map +1 -0
- package/dist/extra/index.d.ts +40 -0
- package/dist/extra/index.d.ts.map +1 -0
- package/dist/extra/index.js +40 -0
- package/dist/extra/index.js.map +1 -0
- package/dist/extra/mesh/drill-hole/DrillHoleCore.d.ts +94 -0
- package/dist/extra/mesh/drill-hole/DrillHoleCore.d.ts.map +1 -0
- package/dist/extra/mesh/drill-hole/DrillHoleCore.js +282 -0
- package/dist/extra/mesh/drill-hole/DrillHoleCore.js.map +1 -0
- package/dist/extra/mesh/drill-hole/drill-types.d.ts +34 -0
- package/dist/extra/mesh/drill-hole/drill-types.d.ts.map +1 -0
- package/dist/extra/mesh/drill-hole/drill-types.js +7 -0
- package/dist/extra/mesh/drill-hole/drill-types.js.map +1 -0
- package/dist/extra/mesh/engrave-decoration.d.ts +42 -0
- package/dist/extra/mesh/engrave-decoration.d.ts.map +1 -0
- package/dist/extra/mesh/engrave-decoration.js +39 -0
- package/dist/extra/mesh/engrave-decoration.js.map +1 -0
- package/dist/extra/mesh/fai_drill.d.ts +21 -0
- package/dist/extra/mesh/fai_drill.d.ts.map +1 -0
- package/dist/extra/mesh/fai_drill.js +89 -0
- package/dist/extra/mesh/fai_drill.js.map +1 -0
- package/dist/extra/mesh/fai_extrude.d.ts +24 -0
- package/dist/extra/mesh/fai_extrude.d.ts.map +1 -0
- package/dist/extra/mesh/fai_extrude.js +42 -0
- package/dist/extra/mesh/fai_extrude.js.map +1 -0
- package/dist/extra/mesh/fai_split.d.ts +164 -0
- package/dist/extra/mesh/fai_split.d.ts.map +1 -0
- package/dist/extra/mesh/fai_split.js +269 -0
- package/dist/extra/mesh/fai_split.js.map +1 -0
- package/dist/extra/mesh/primitives.d.ts +29 -0
- package/dist/extra/mesh/primitives.d.ts.map +1 -0
- package/dist/extra/mesh/primitives.js +41 -0
- package/dist/extra/mesh/primitives.js.map +1 -0
- package/dist/extra/op-names.d.ts +37 -0
- package/dist/extra/op-names.d.ts.map +1 -0
- package/dist/extra/op-names.js +46 -0
- package/dist/extra/op-names.js.map +1 -0
- package/dist/extra/ops/compound.d.ts +140 -0
- package/dist/extra/ops/compound.d.ts.map +1 -0
- package/dist/extra/ops/compound.js +167 -0
- package/dist/extra/ops/compound.js.map +1 -0
- package/dist/extra/ops/copy.d.ts +40 -0
- package/dist/extra/ops/copy.d.ts.map +1 -0
- package/dist/extra/ops/copy.js +83 -0
- package/dist/extra/ops/copy.js.map +1 -0
- package/dist/extra/ops/fai_drill.d.ts +51 -0
- package/dist/extra/ops/fai_drill.d.ts.map +1 -0
- package/dist/extra/ops/fai_drill.js +233 -0
- package/dist/extra/ops/fai_drill.js.map +1 -0
- package/dist/extra/ops/fai_extrude.d.ts +36 -0
- package/dist/extra/ops/fai_extrude.d.ts.map +1 -0
- package/dist/extra/ops/fai_extrude.js +84 -0
- package/dist/extra/ops/fai_extrude.js.map +1 -0
- package/dist/extra/ops/fai_split.d.ts +46 -0
- package/dist/extra/ops/fai_split.d.ts.map +1 -0
- package/dist/extra/ops/fai_split.js +235 -0
- package/dist/extra/ops/fai_split.js.map +1 -0
- package/dist/extra/ops/load.d.ts +49 -0
- package/dist/extra/ops/load.d.ts.map +1 -0
- package/dist/extra/ops/load.js +423 -0
- package/dist/extra/ops/load.js.map +1 -0
- package/dist/extra/ops/svg-extrude.d.ts +32 -0
- package/dist/extra/ops/svg-extrude.d.ts.map +1 -0
- package/dist/extra/ops/svg-extrude.js +74 -0
- package/dist/extra/ops/svg-extrude.js.map +1 -0
- package/dist/extra/ops/text.d.ts +34 -0
- package/dist/extra/ops/text.d.ts.map +1 -0
- package/dist/extra/ops/text.js +100 -0
- package/dist/extra/ops/text.js.map +1 -0
- package/dist/geometry2d/bridge/lift-on-plane.d.ts +8 -5
- package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -1
- package/dist/geometry2d/bridge/lift-on-plane.js +8 -5
- package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/lang/symbol-table.d.ts +3 -3
- package/dist/lang/symbol-table.generated.d.ts +10 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +10 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/lang/symbol-table.js +3 -3
- package/dist/lang/symbol-table.js.map +1 -1
- package/dist/math3d/index.d.ts +1 -1
- package/dist/math3d/index.js +1 -1
- package/dist/math3d/index.js.map +1 -1
- package/dist/mesh/engrave.d.ts +2 -3
- package/dist/mesh/engrave.d.ts.map +1 -1
- package/dist/mesh/engrave.js +4 -11
- package/dist/mesh/engrave.js.map +1 -1
- package/dist/mesh/index.d.ts +0 -2
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +0 -2
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/primitives.d.ts +7 -5
- package/dist/mesh/primitives.d.ts.map +1 -1
- package/dist/mesh/primitives.js +16 -9
- package/dist/mesh/primitives.js.map +1 -1
- package/dist/mesh/types.d.ts +4 -3
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- package/dist/node-host/cli.d.ts +11 -4
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +53 -28
- package/dist/node-host/cli.js.map +1 -1
- package/dist/node-host/execute-script.d.ts.map +1 -1
- package/dist/node-host/execute-script.js +3 -4
- package/dist/node-host/execute-script.js.map +1 -1
- package/dist/node-host/lib-package-json.d.ts +36 -0
- package/dist/node-host/lib-package-json.d.ts.map +1 -0
- package/dist/node-host/lib-package-json.js +73 -0
- package/dist/node-host/lib-package-json.js.map +1 -0
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +41 -0
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts +1 -1
- package/dist/occt-kernel/occtKernel.js +1 -1
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/primitives/brep-primitives.d.ts.map +1 -1
- package/dist/primitives/brep-primitives.js +39 -12
- package/dist/primitives/brep-primitives.js.map +1 -1
- package/dist/runtime-state.d.ts +28 -1
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +14 -1
- package/dist/runtime-state.js.map +1 -1
- package/dist/sdk.d.ts +2 -2
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +11 -2
- package/dist/sdk.js.map +1 -1
- package/dist/sketch/bspline.d.ts +58 -0
- package/dist/sketch/bspline.d.ts.map +1 -0
- package/dist/sketch/bspline.js +104 -0
- package/dist/sketch/bspline.js.map +1 -0
- package/dist/sketch/canonical.d.ts +239 -0
- package/dist/sketch/canonical.d.ts.map +1 -0
- package/dist/sketch/canonical.js +17 -0
- package/dist/sketch/canonical.js.map +1 -0
- package/dist/sketch/contour.d.ts +43 -0
- package/dist/sketch/contour.d.ts.map +1 -0
- package/dist/sketch/contour.js +202 -0
- package/dist/sketch/contour.js.map +1 -0
- package/dist/sketch/dim-spec.d.ts +32 -0
- package/dist/sketch/dim-spec.d.ts.map +1 -0
- package/dist/sketch/dim-spec.js +112 -0
- package/dist/sketch/dim-spec.js.map +1 -0
- package/dist/sketch/faces.d.ts +45 -0
- package/dist/sketch/faces.d.ts.map +1 -0
- package/dist/sketch/faces.js +108 -0
- package/dist/sketch/faces.js.map +1 -0
- package/dist/sketch/fcstd-types.d.ts +194 -0
- package/dist/sketch/fcstd-types.d.ts.map +1 -0
- package/dist/sketch/fcstd-types.js +67 -0
- package/dist/sketch/fcstd-types.js.map +1 -0
- package/dist/sketch/index.d.ts +46 -0
- package/dist/sketch/index.d.ts.map +1 -0
- package/dist/sketch/index.js +39 -0
- package/dist/sketch/index.js.map +1 -0
- package/dist/sketch/node.d.ts +14 -0
- package/dist/sketch/node.d.ts.map +1 -0
- package/dist/sketch/node.js +43 -0
- package/dist/sketch/node.js.map +1 -0
- package/dist/sketch/op.d.ts +111 -0
- package/dist/sketch/op.d.ts.map +1 -0
- package/dist/sketch/op.js +185 -0
- package/dist/sketch/op.js.map +1 -0
- package/dist/sketch/planegcs-backend.d.ts +69 -0
- package/dist/sketch/planegcs-backend.d.ts.map +1 -0
- package/dist/sketch/planegcs-backend.js +812 -0
- package/dist/sketch/planegcs-backend.js.map +1 -0
- package/dist/sketch/project.d.ts +176 -0
- package/dist/sketch/project.d.ts.map +1 -0
- package/dist/sketch/project.js +656 -0
- package/dist/sketch/project.js.map +1 -0
- package/dist/sketch/shapes.d.ts +370 -0
- package/dist/sketch/shapes.d.ts.map +1 -0
- package/dist/sketch/shapes.js +959 -0
- package/dist/sketch/shapes.js.map +1 -0
- package/dist/sketch/solve.d.ts +21 -0
- package/dist/sketch/solve.d.ts.map +1 -0
- package/dist/sketch/solve.js +144 -0
- package/dist/sketch/solve.js.map +1 -0
- package/dist/sketch/solver-loader.d.ts +47 -0
- package/dist/sketch/solver-loader.d.ts.map +1 -0
- package/dist/sketch/solver-loader.js +77 -0
- package/dist/sketch/solver-loader.js.map +1 -0
- package/dist/sketch/solver.d.ts +63 -0
- package/dist/sketch/solver.d.ts.map +1 -0
- package/dist/sketch/solver.js +28 -0
- package/dist/sketch/solver.js.map +1 -0
- package/dist/sketch/verify.d.ts +53 -0
- package/dist/sketch/verify.d.ts.map +1 -0
- package/dist/sketch/verify.js +71 -0
- package/dist/sketch/verify.js.map +1 -0
- package/dist/topology/naming/geom-hint.d.ts +12 -0
- package/dist/topology/naming/geom-hint.d.ts.map +1 -1
- package/dist/topology/naming/geom-hint.js +1 -1
- package/dist/topology/naming/geom-hint.js.map +1 -1
- package/dist/topology/naming/lineage.d.ts +1 -0
- package/dist/topology/naming/lineage.d.ts.map +1 -1
- package/dist/topology/naming/lineage.js +37 -1
- package/dist/topology/naming/lineage.js.map +1 -1
- package/dist/topology/naming/resolve-face.d.ts +13 -2
- package/dist/topology/naming/resolve-face.d.ts.map +1 -1
- package/dist/topology/naming/resolve-face.js +18 -2
- package/dist/topology/naming/resolve-face.js.map +1 -1
- package/dist/weapp.d.ts +1 -1
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +1 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +43 -11
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M3.2 — SketchSolver interface (D5) with the planegcs WASM backend.
|
|
3
|
+
*
|
|
4
|
+
* faijs depends only on this interface; the WASM implementation is swappable
|
|
5
|
+
* (前文 B R2/R3). Input: parsed sketch geometry + constraints (M3.1 types).
|
|
6
|
+
* Output: solved geometry or a structured failure — the caller (M3.5) decides
|
|
7
|
+
* between solution and initial-value fallback (D2).
|
|
8
|
+
*/
|
|
9
|
+
import type { Result } from '../api/result.js';
|
|
10
|
+
import type { FcstdSketchGeom, FcstdSketchCon } from './fcstd-types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Result of one solver run: the solved geometry plus convergence status and
|
|
13
|
+
* diagnostics for the caller's L0/L1/L2 decision (D2).
|
|
14
|
+
*/
|
|
15
|
+
export interface FcstdSolveOutcome {
|
|
16
|
+
/** geometry after solve, same order/index as input */
|
|
17
|
+
geoms: FcstdSketchGeom[];
|
|
18
|
+
/** true when the solver reports Success with no conflicts */
|
|
19
|
+
converged: boolean;
|
|
20
|
+
/** diagnostics when not converged */
|
|
21
|
+
reason?: 'conflicting' | 'redundant' | 'failed' | 'unsupported-constraint';
|
|
22
|
+
/** constraint indices the solver flagged */
|
|
23
|
+
problemConstraints: number[];
|
|
24
|
+
/** constraint indices dropped because their GCS shape could not be pushed */
|
|
25
|
+
droppedConstraints: number[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* One pre-projected external geometry segment passed to the solver as fixed
|
|
29
|
+
* (immutable) geometry.
|
|
30
|
+
*/
|
|
31
|
+
export interface ExternalFixedSeg {
|
|
32
|
+
/** negative geoId in link order: -3, -4, ... (GeoEnum.RefExt downward) */
|
|
33
|
+
geoId: number;
|
|
34
|
+
/** the projected sketch-local 2D polyline (immutable to the solver) */
|
|
35
|
+
polyline: [number, number][];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Solver abstraction (D5): faijs depends only on this interface; the WASM
|
|
39
|
+
* implementation is swappable.
|
|
40
|
+
*/
|
|
41
|
+
export interface SketchSolver {
|
|
42
|
+
/**
|
|
43
|
+
* Solve constraints against the given geometry. The input geometry's stored
|
|
44
|
+
* coordinates are used as the initial guess (D2 — they are FreeCAD's last
|
|
45
|
+
* solution and the ideal starting point).
|
|
46
|
+
*
|
|
47
|
+
* `external` carries pre-projected fixed geometry (M6.3): immutable 2D
|
|
48
|
+
* polylines that constraints may reference by negative geoId. When a
|
|
49
|
+
* constraint references an external geoId not present here, the solver
|
|
50
|
+
* drops that constraint (recorded in droppedConstraints).
|
|
51
|
+
*/
|
|
52
|
+
solve(geoms: FcstdSketchGeom[], constraints: FcstdSketchCon[], external?: ExternalFixedSeg[]): Promise<Result<FcstdSolveOutcome, never>>;
|
|
53
|
+
}
|
|
54
|
+
/** Constraint types the planegcs backend can express (P0 set, plan §7 M3.4). */
|
|
55
|
+
export declare const SUPPORTED_CONSTRAINT_TYPES: Set<number>;
|
|
56
|
+
/**
|
|
57
|
+
* Check whether every constraint in a sketch is expressible by the backend.
|
|
58
|
+
*
|
|
59
|
+
* @param constraints - the parsed sketch constraints.
|
|
60
|
+
* @returns true when every constraint's type is in SUPPORTED_CONSTRAINT_TYPES.
|
|
61
|
+
*/
|
|
62
|
+
export declare function allConstraintsSupported(constraints: FcstdSketchCon[]): boolean;
|
|
63
|
+
//# sourceMappingURL=solver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solver.d.ts","sourceRoot":"","sources":["../../src/sketch/solver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAExE;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,MAAM,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,wBAAwB,CAAC;IAC3E,4CAA4C;IAC5C,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,6EAA6E;IAC7E,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;;OASG;IACH,KAAK,CACH,KAAK,EAAE,eAAe,EAAE,EACxB,WAAW,EAAE,cAAc,EAAE,EAC7B,QAAQ,CAAC,EAAE,gBAAgB,EAAE,GAC5B,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC;CAC9C;AAED,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,aAgBrC,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,OAAO,CAE9E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Constraint types the planegcs backend can express (P0 set, plan §7 M3.4). */
|
|
2
|
+
export const SUPPORTED_CONSTRAINT_TYPES = new Set([
|
|
3
|
+
1, // Coincident
|
|
4
|
+
2, // Horizontal
|
|
5
|
+
3, // Vertical
|
|
6
|
+
4, // Parallel
|
|
7
|
+
5, // Tangent
|
|
8
|
+
6, // Distance
|
|
9
|
+
7, // DistanceX
|
|
10
|
+
8, // DistanceY
|
|
11
|
+
9, // Angle
|
|
12
|
+
10, // Perpendicular
|
|
13
|
+
11, // Radius
|
|
14
|
+
12, // Equal
|
|
15
|
+
13, // PointOnObject
|
|
16
|
+
14, // Symmetric
|
|
17
|
+
18, // Diameter
|
|
18
|
+
]);
|
|
19
|
+
/**
|
|
20
|
+
* Check whether every constraint in a sketch is expressible by the backend.
|
|
21
|
+
*
|
|
22
|
+
* @param constraints - the parsed sketch constraints.
|
|
23
|
+
* @returns true when every constraint's type is in SUPPORTED_CONSTRAINT_TYPES.
|
|
24
|
+
*/
|
|
25
|
+
export function allConstraintsSupported(constraints) {
|
|
26
|
+
return constraints.every((c) => SUPPORTED_CONSTRAINT_TYPES.has(c.type));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=solver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solver.js","sourceRoot":"","sources":["../../src/sketch/solver.ts"],"names":[],"mappings":"AA6DA,gFAAgF;AAChF,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAS;IACxD,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,aAAa;IAChB,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,WAAW;IACd,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,QAAQ;IACX,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,WAAW;CAChB,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,WAA6B;IACnE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1E,CAAC","sourcesContent":["/**\n * M3.2 — SketchSolver interface (D5) with the planegcs WASM backend.\n *\n * faijs depends only on this interface; the WASM implementation is swappable\n * (前文 B R2/R3). Input: parsed sketch geometry + constraints (M3.1 types).\n * Output: solved geometry or a structured failure — the caller (M3.5) decides\n * between solution and initial-value fallback (D2).\n */\nimport type { Result } from '../api/result';\nimport type { FcstdSketchGeom, FcstdSketchCon } from './fcstd-types.js';\n\n/**\n * Result of one solver run: the solved geometry plus convergence status and\n * diagnostics for the caller's L0/L1/L2 decision (D2).\n */\nexport interface FcstdSolveOutcome {\n /** geometry after solve, same order/index as input */\n geoms: FcstdSketchGeom[];\n /** true when the solver reports Success with no conflicts */\n converged: boolean;\n /** diagnostics when not converged */\n reason?: 'conflicting' | 'redundant' | 'failed' | 'unsupported-constraint';\n /** constraint indices the solver flagged */\n problemConstraints: number[];\n /** constraint indices dropped because their GCS shape could not be pushed */\n droppedConstraints: number[];\n}\n\n/**\n * One pre-projected external geometry segment passed to the solver as fixed\n * (immutable) geometry.\n */\nexport interface ExternalFixedSeg {\n /** negative geoId in link order: -3, -4, ... (GeoEnum.RefExt downward) */\n geoId: number;\n /** the projected sketch-local 2D polyline (immutable to the solver) */\n polyline: [number, number][];\n}\n\n/**\n * Solver abstraction (D5): faijs depends only on this interface; the WASM\n * implementation is swappable.\n */\nexport interface SketchSolver {\n /**\n * Solve constraints against the given geometry. The input geometry's stored\n * coordinates are used as the initial guess (D2 — they are FreeCAD's last\n * solution and the ideal starting point).\n *\n * `external` carries pre-projected fixed geometry (M6.3): immutable 2D\n * polylines that constraints may reference by negative geoId. When a\n * constraint references an external geoId not present here, the solver\n * drops that constraint (recorded in droppedConstraints).\n */\n solve(\n geoms: FcstdSketchGeom[],\n constraints: FcstdSketchCon[],\n external?: ExternalFixedSeg[],\n ): Promise<Result<FcstdSolveOutcome, never>>;\n}\n\n/** Constraint types the planegcs backend can express (P0 set, plan §7 M3.4). */\nexport const SUPPORTED_CONSTRAINT_TYPES = new Set<number>([\n 1, // Coincident\n 2, // Horizontal\n 3, // Vertical\n 4, // Parallel\n 5, // Tangent\n 6, // Distance\n 7, // DistanceX\n 8, // DistanceY\n 9, // Angle\n 10, // Perpendicular\n 11, // Radius\n 12, // Equal\n 13, // PointOnObject\n 14, // Symmetric\n 18, // Diameter\n]);\n\n/**\n * Check whether every constraint in a sketch is expressible by the backend.\n *\n * @param constraints - the parsed sketch constraints.\n * @returns true when every constraint's type is in SUPPORTED_CONSTRAINT_TYPES.\n */\nexport function allConstraintsSupported(constraints: FcstdSketchCon[]): boolean {\n return constraints.every((c) => SUPPORTED_CONSTRAINT_TYPES.has(c.type));\n}\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M3.5 — solved-vs-stored comparison (D2/V2).
|
|
3
|
+
*
|
|
4
|
+
* The on-disk coordinates ARE FreeCAD's last solution, so a correct pipeline
|
|
5
|
+
* re-derives (nearly) the same geometry. maxPointDistance is the V2 metric;
|
|
6
|
+
* its tolerance T1 is calibrated from the sample-set distribution, not
|
|
7
|
+
* pre-set (plan §8).
|
|
8
|
+
*/
|
|
9
|
+
import type { FcstdSketchGeom } from './fcstd-types.js';
|
|
10
|
+
import type { FcstdSolveOutcome } from './solver.js';
|
|
11
|
+
/**
|
|
12
|
+
* P4: exported for testability — anchor points used by maxPointDistance.
|
|
13
|
+
*
|
|
14
|
+
* @param g - the sketch geometry element (point/line/circle/arc/ellipse/bspline).
|
|
15
|
+
* @returns the element's comparison anchor points (center/endpoints as applicable).
|
|
16
|
+
*/
|
|
17
|
+
export declare function anchorPoints(g: FcstdSketchGeom): {
|
|
18
|
+
x: number;
|
|
19
|
+
y: number;
|
|
20
|
+
}[];
|
|
21
|
+
/**
|
|
22
|
+
* Maximum anchor-point distance between two geometry lists (same indexing).
|
|
23
|
+
*
|
|
24
|
+
* @param a - first geometry list (e.g. the solver result).
|
|
25
|
+
* @param b - second geometry list (e.g. the stored geometry).
|
|
26
|
+
* @returns the maximum Euclidean distance between corresponding anchor points
|
|
27
|
+
* (0 when the lists have no comparable points).
|
|
28
|
+
*/
|
|
29
|
+
export declare function maxPointDistance(a: FcstdSketchGeom[], b: FcstdSketchGeom[]): number;
|
|
30
|
+
/**
|
|
31
|
+
* Three-level downgrade verdict (D3) for one sketch.
|
|
32
|
+
*/
|
|
33
|
+
export interface SketchVerdict {
|
|
34
|
+
/** solved quality level: L0 = solved & matches, L1 = flagged, L2 = baked */
|
|
35
|
+
level: 'L0' | 'L1' | 'L2';
|
|
36
|
+
/** human-readable reason for a non-L0 verdict */
|
|
37
|
+
reason?: string;
|
|
38
|
+
/** max anchor distance between re-solved and stored geometry */
|
|
39
|
+
maxDelta?: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Three-level downgrade (D3). L0 = solved & matches stored (delta <= T1).
|
|
43
|
+
* L1 = solver result kept but flagged, stored coords used instead.
|
|
44
|
+
* L2 = baked (unsupported geometry/constraints, external geometry).
|
|
45
|
+
*
|
|
46
|
+
* @param outcome - the solver result, or undefined when none was produced.
|
|
47
|
+
* @param stored - the on-disk (stored) geometry to compare against.
|
|
48
|
+
* @param t1 - the calibrated distance tolerance for the L0/L1 split.
|
|
49
|
+
* @param preBlocked - pre-solve downgrade reason; when set the sketch is L2.
|
|
50
|
+
* @returns the classification verdict for the sketch.
|
|
51
|
+
*/
|
|
52
|
+
export declare function classifySketch(outcome: FcstdSolveOutcome | undefined, stored: FcstdSketchGeom[], t1: number, preBlocked?: string): SketchVerdict;
|
|
53
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/sketch/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,eAAe,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAgB3E;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,MAAM,CAanF;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,MAAM,EAAE,eAAe,EAAE,EACzB,EAAE,EAAE,MAAM,EACV,UAAU,CAAC,EAAE,MAAM,GAClB,aAAa,CASf"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* P4: exported for testability — anchor points used by maxPointDistance.
|
|
3
|
+
*
|
|
4
|
+
* @param g - the sketch geometry element (point/line/circle/arc/ellipse/bspline).
|
|
5
|
+
* @returns the element's comparison anchor points (center/endpoints as applicable).
|
|
6
|
+
*/
|
|
7
|
+
export function anchorPoints(g) {
|
|
8
|
+
switch (g.kind) {
|
|
9
|
+
case 'point':
|
|
10
|
+
return [{ x: g.x, y: g.y }];
|
|
11
|
+
case 'line':
|
|
12
|
+
return [{ x: g.x1, y: g.y1 }, { x: g.x2, y: g.y2 }];
|
|
13
|
+
case 'circle':
|
|
14
|
+
return [{ x: g.cx, y: g.cy }];
|
|
15
|
+
case 'arc':
|
|
16
|
+
return [{ x: g.cx, y: g.cy }, { x: g.x1, y: g.y1 }, { x: g.x2, y: g.y2 }];
|
|
17
|
+
case 'ellipse':
|
|
18
|
+
return [{ x: g.cx, y: g.cy }];
|
|
19
|
+
case 'bspline':
|
|
20
|
+
// P4: spline anchors are its exact endpoints (poles move with them)
|
|
21
|
+
return [{ x: g.x1, y: g.y1 }, { x: g.x2, y: g.y2 }];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Maximum anchor-point distance between two geometry lists (same indexing).
|
|
26
|
+
*
|
|
27
|
+
* @param a - first geometry list (e.g. the solver result).
|
|
28
|
+
* @param b - second geometry list (e.g. the stored geometry).
|
|
29
|
+
* @returns the maximum Euclidean distance between corresponding anchor points
|
|
30
|
+
* (0 when the lists have no comparable points).
|
|
31
|
+
*/
|
|
32
|
+
export function maxPointDistance(a, b) {
|
|
33
|
+
let max = 0;
|
|
34
|
+
const n = Math.min(a.length, b.length);
|
|
35
|
+
for (let i = 0; i < n; i++) {
|
|
36
|
+
const pa = anchorPoints(a[i]);
|
|
37
|
+
const pb = anchorPoints(b[i]);
|
|
38
|
+
const m = Math.min(pa.length, pb.length);
|
|
39
|
+
for (let k = 0; k < m; k++) {
|
|
40
|
+
const d = Math.hypot(pa[k].x - pb[k].x, pa[k].y - pb[k].y);
|
|
41
|
+
if (Number.isFinite(d) && d > max)
|
|
42
|
+
max = d;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return max;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Three-level downgrade (D3). L0 = solved & matches stored (delta <= T1).
|
|
49
|
+
* L1 = solver result kept but flagged, stored coords used instead.
|
|
50
|
+
* L2 = baked (unsupported geometry/constraints, external geometry).
|
|
51
|
+
*
|
|
52
|
+
* @param outcome - the solver result, or undefined when none was produced.
|
|
53
|
+
* @param stored - the on-disk (stored) geometry to compare against.
|
|
54
|
+
* @param t1 - the calibrated distance tolerance for the L0/L1 split.
|
|
55
|
+
* @param preBlocked - pre-solve downgrade reason; when set the sketch is L2.
|
|
56
|
+
* @returns the classification verdict for the sketch.
|
|
57
|
+
*/
|
|
58
|
+
export function classifySketch(outcome, stored, t1, preBlocked) {
|
|
59
|
+
if (preBlocked)
|
|
60
|
+
return { level: 'L2', reason: preBlocked };
|
|
61
|
+
if (!outcome)
|
|
62
|
+
return { level: 'L2', reason: 'no-solver-result' };
|
|
63
|
+
if (!outcome.converged) {
|
|
64
|
+
return { level: 'L1', reason: outcome.reason ?? 'solve-failed' };
|
|
65
|
+
}
|
|
66
|
+
const maxDelta = maxPointDistance(outcome.geoms, stored);
|
|
67
|
+
if (maxDelta <= t1)
|
|
68
|
+
return { level: 'L0', maxDelta };
|
|
69
|
+
return { level: 'L1', reason: 'delta-exceeds-t1', maxDelta };
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/sketch/verify.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M3.5 — solved-vs-stored comparison (D2/V2).\n *\n * The on-disk coordinates ARE FreeCAD's last solution, so a correct pipeline\n * re-derives (nearly) the same geometry. maxPointDistance is the V2 metric;\n * its tolerance T1 is calibrated from the sample-set distribution, not\n * pre-set (plan §8).\n */\nimport type { FcstdSketchGeom } from './fcstd-types.js';\nimport type { FcstdSolveOutcome } from './solver.js';\n\n/**\n * P4: exported for testability — anchor points used by maxPointDistance.\n *\n * @param g - the sketch geometry element (point/line/circle/arc/ellipse/bspline).\n * @returns the element's comparison anchor points (center/endpoints as applicable).\n */\nexport function anchorPoints(g: FcstdSketchGeom): { x: number; y: number }[] {\n switch (g.kind) {\n case 'point':\n return [{ x: g.x, y: g.y }];\n case 'line':\n return [{ x: g.x1, y: g.y1 }, { x: g.x2, y: g.y2 }];\n case 'circle':\n return [{ x: g.cx, y: g.cy }];\n case 'arc':\n return [{ x: g.cx, y: g.cy }, { x: g.x1, y: g.y1 }, { x: g.x2, y: g.y2 }];\n case 'ellipse':\n return [{ x: g.cx, y: g.cy }];\n case 'bspline':\n // P4: spline anchors are its exact endpoints (poles move with them)\n return [{ x: g.x1, y: g.y1 }, { x: g.x2, y: g.y2 }];\n }\n}\n\n/**\n * Maximum anchor-point distance between two geometry lists (same indexing).\n *\n * @param a - first geometry list (e.g. the solver result).\n * @param b - second geometry list (e.g. the stored geometry).\n * @returns the maximum Euclidean distance between corresponding anchor points\n * (0 when the lists have no comparable points).\n */\nexport function maxPointDistance(a: FcstdSketchGeom[], b: FcstdSketchGeom[]): number {\n let max = 0;\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i++) {\n const pa = anchorPoints(a[i]!);\n const pb = anchorPoints(b[i]!);\n const m = Math.min(pa.length, pb.length);\n for (let k = 0; k < m; k++) {\n const d = Math.hypot(pa[k]!.x - pb[k]!.x, pa[k]!.y - pb[k]!.y);\n if (Number.isFinite(d) && d > max) max = d;\n }\n }\n return max;\n}\n\n/**\n * Three-level downgrade verdict (D3) for one sketch.\n */\nexport interface SketchVerdict {\n /** solved quality level: L0 = solved & matches, L1 = flagged, L2 = baked */\n level: 'L0' | 'L1' | 'L2';\n /** human-readable reason for a non-L0 verdict */\n reason?: string;\n /** max anchor distance between re-solved and stored geometry */\n maxDelta?: number;\n}\n\n/**\n * Three-level downgrade (D3). L0 = solved & matches stored (delta <= T1).\n * L1 = solver result kept but flagged, stored coords used instead.\n * L2 = baked (unsupported geometry/constraints, external geometry).\n *\n * @param outcome - the solver result, or undefined when none was produced.\n * @param stored - the on-disk (stored) geometry to compare against.\n * @param t1 - the calibrated distance tolerance for the L0/L1 split.\n * @param preBlocked - pre-solve downgrade reason; when set the sketch is L2.\n * @returns the classification verdict for the sketch.\n */\nexport function classifySketch(\n outcome: FcstdSolveOutcome | undefined,\n stored: FcstdSketchGeom[],\n t1: number,\n preBlocked?: string,\n): SketchVerdict {\n if (preBlocked) return { level: 'L2', reason: preBlocked };\n if (!outcome) return { level: 'L2', reason: 'no-solver-result' };\n if (!outcome.converged) {\n return { level: 'L1', reason: outcome.reason ?? 'solve-failed' };\n }\n const maxDelta = maxPointDistance(outcome.geoms, stored);\n if (maxDelta <= t1) return { level: 'L0', maxDelta };\n return { level: 'L1', reason: 'delta-exceeds-t1', maxDelta };\n}\n"]}
|
|
@@ -11,6 +11,18 @@
|
|
|
11
11
|
import type { BrepEngineApi } from '../../brep/engine/primitives.js';
|
|
12
12
|
import type { BrepHandle } from '../../brep/engine/types.js';
|
|
13
13
|
import type { FaceHint, EdgeHint, AxisHint } from './types.js';
|
|
14
|
+
/**
|
|
15
|
+
* BREP 现场圆柱面 → 轴 hint(P0 装配前置)。
|
|
16
|
+
*
|
|
17
|
+
* 算法与 occt-kernel/topologyExt.ts getSurfaceParams 的 cylinder 分支同源:
|
|
18
|
+
* direction = normalize(S(u,v+1) − S(u,v))(V 向即轴向);origin = P − R·外法向
|
|
19
|
+
*(surfaceNormal 含朝向,reversed 面先取反修正)。
|
|
20
|
+
*
|
|
21
|
+
* @param kernel - the OCCT kernel.
|
|
22
|
+
* @param face - the cylindrical face handle.
|
|
23
|
+
* @returns the axis hint, or undefined when the axis cannot be derived.
|
|
24
|
+
*/
|
|
25
|
+
export declare function captureCylinderFaceAxis(kernel: BrepEngineApi, face: BrepHandle): AxisHint | undefined;
|
|
14
26
|
/**
|
|
15
27
|
* BREP 现场面 → FaceHint。
|
|
16
28
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geom-hint.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/geom-hint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"geom-hint.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/geom-hint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAS3D;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAqBrG;AAgDD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,CAgBjF;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IACjC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CAC1F,GAAG,QAAQ,CAiBX;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IACjC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CAC1F,GAAG,QAAQ,CAeX;AAED;;;;;;;;;;GAUG;AACH;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAkB7F;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,CAmBjF"}
|
|
@@ -26,7 +26,7 @@ function normalizedAxis(v) {
|
|
|
26
26
|
* @param face - the cylindrical face handle.
|
|
27
27
|
* @returns the axis hint, or undefined when the axis cannot be derived.
|
|
28
28
|
*/
|
|
29
|
-
function captureCylinderFaceAxis(kernel, face) {
|
|
29
|
+
export function captureCylinderFaceAxis(kernel, face) {
|
|
30
30
|
try {
|
|
31
31
|
const uv = kernel.uvBounds(face);
|
|
32
32
|
const p0 = kernel.pointOnSurface(face, uv.uMin, uv.vMin);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geom-hint.js","sourceRoot":"","sources":["../../../src/topology/naming/geom-hint.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * geom-hint.ts — 几何 hint 捕获(§3.1)\n *\n * 两路:\n * - `captureFaceHint(kernel, faceHandle)`:BREP 现场面 → FaceHint(assignRoles 用)。\n * - `faceRowToHint(row)`:面行/FaceRow → FaceHint(primitive/mesh 命名槽快照用)。\n *\n * hint 字段与 SelectorRuntime 的 FaceRow(surfaceType/area/center/normal)同源\n * (§2.2),保证 BREP 现场与面行快照两条打分路径口径一致。\n */\n\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport type { FaceHint, EdgeHint, AxisHint } from './types'\n\n/** 归一化向量(axis 采集内部用;零向量返回 null,调用方放弃采集)。 */\nfunction normalizedAxis(v: [number, number, number]): [number, number, number] | null {\n const len = Math.hypot(v[0], v[1], v[2])\n if (len < 1e-12 || !Number.isFinite(len)) return null\n return [v[0] / len, v[1] / len, v[2] / len]\n}\n\n/**\n * BREP 现场圆柱面 → 轴 hint(P0 装配前置)。\n *\n * 算法与 occt-kernel/topologyExt.ts getSurfaceParams 的 cylinder 分支同源:\n * direction = normalize(S(u,v+1) − S(u,v))(V 向即轴向);origin = P − R·外法向\n *(surfaceNormal 含朝向,reversed 面先取反修正)。\n *\n * @param kernel - the OCCT kernel.\n * @param face - the cylindrical face handle.\n * @returns the axis hint, or undefined when the axis cannot be derived.\n */\nfunction captureCylinderFaceAxis(kernel: BrepEngineApi, face: BrepHandle): AxisHint | undefined {\n try {\n const uv = kernel.uvBounds(face)\n const p0 = kernel.pointOnSurface(face, uv.uMin, uv.vMin)\n const p1 = kernel.pointOnSurface(face, uv.uMin, uv.vMin + 1)\n const direction = normalizedAxis([p1.x - p0.x, p1.y - p0.y, p1.z - p0.z])\n const cyl = kernel.getFaceCylinderData(face)\n if (!direction || !cyl) return undefined\n let sn = kernel.surfaceNormal(face, uv.uMin, uv.vMin)\n if (kernel.shapeOrientation(face) === 'reversed') {\n sn = { x: -sn.x, y: -sn.y, z: -sn.z }\n }\n const origin: [number, number, number] = [\n p0.x - cyl.radius * sn.x,\n p0.y - cyl.radius * sn.y,\n p0.z - cyl.radius * sn.z,\n ]\n return { origin, direction }\n } catch {\n return undefined\n }\n}\n\n/**\n * BREP 现场圆边 → 轴 hint(origin = 圆心,direction = 所在平面法向;P0 装配前置)。\n *\n * 用曲线上三个不同参数的采样点做外接圆圆心(三点定圆,精确、无弧长近似),\n * 法向取 (p1−p0)×(p2−p0) 归一化。只用 curvePointAtParam/curveParameters 等既有\n * 公开内核 API(与 getCurveParams 的 circle 分支同一能力面),不新增内核方法。\n *\n * @param kernel - the OCCT kernel.\n * @param edge - the circular edge handle.\n * @returns the axis hint, or undefined when sampling fails.\n */\nfunction captureCircleEdgeAxis(kernel: BrepEngineApi, edge: BrepHandle): AxisHint | undefined {\n try {\n const { first, last } = kernel.curveParameters(edge)\n if (!Number.isFinite(first) || !Number.isFinite(last)) return undefined\n const d = (last - first) / 3\n const pa = kernel.curvePointAtParam(edge, first)\n const pb = kernel.curvePointAtParam(edge, first + d)\n const pc = kernel.curvePointAtParam(edge, first + 2 * d)\n const e1: [number, number, number] = [pb.x - pa.x, pb.y - pa.y, pb.z - pa.z]\n const e2: [number, number, number] = [pc.x - pa.x, pc.y - pa.y, pc.z - pa.z]\n // 三点外接圆:解 o = a + α·e1 + β·e2,满足 |o−a| = |o−b| = |o−c|\n const e11 = e1[0] * e1[0] + e1[1] * e1[1] + e1[2] * e1[2]\n const e22 = e2[0] * e2[0] + e2[1] * e2[1] + e2[2] * e2[2]\n const e12 = e1[0] * e2[0] + e1[1] * e2[1] + e1[2] * e2[2]\n const denom = e11 * e22 - e12 * e12\n if (Math.abs(denom) < 1e-18) return undefined\n const alpha = (e11 * e22 - e22 * e12) / (2 * denom)\n const beta = (e22 * e11 - e11 * e12) / (2 * denom)\n const origin: [number, number, number] = [\n pa.x + alpha * e1[0] + beta * e2[0],\n pa.y + alpha * e1[1] + beta * e2[1],\n pa.z + alpha * e1[2] + beta * e2[2],\n ]\n const direction = normalizedAxis([\n e1[1] * e2[2] - e1[2] * e2[1],\n e1[2] * e2[0] - e1[0] * e2[2],\n e1[0] * e2[1] - e1[1] * e2[0],\n ])\n if (!direction) return undefined\n return { origin, direction }\n } catch {\n return undefined\n }\n}\n\n/**\n * BREP 现场面 → FaceHint。\n *\n * 面积在 occt-wasm 无公开 API(queryBatch 仅测试用),故现场路径不填 area——\n * 打分器对缺失 area 不扣分(scorerArea 双 undefined 跳过)。\n *\n * @param kernel - the OCCT kernel.\n * @param face - the face handle to snapshot.\n * @returns the captured FaceHint.\n */\nexport function captureFaceHint(kernel: BrepEngineApi, face: BrepHandle): FaceHint {\n const surfaceType = kernel.surfaceType(face)\n const uv = kernel.uvBounds(face)\n const u = (uv.uMin + uv.uMax) / 2\n const v = (uv.vMin + uv.vMax) / 2\n const normal = kernel.surfaceNormal(face, u, v)\n const center = kernel.surfaceCenterOfMass(face)\n // P0 装配前置:圆柱面采集轴 hint(其余面类型缺省——平面用 center+normal 即可)\n const axis = surfaceType === 'cylinder' ? captureCylinderFaceAxis(kernel, face) : undefined\n return {\n kind: 'face',\n surfaceType,\n normal: [normal.x, normal.y, normal.z],\n center: [center.x, center.y, center.z],\n ...(axis ? { axis } : {}),\n }\n}\n\n/**\n * 面行 → FaceHint(mesh/primitive 命名槽快照路径;§3.6 setTopology 注入用)。\n * 面行的 surfaceType/normal/center/area 与 BREP 现场同口径(§1.1 事实)。\n *\n * @param row - a FaceRow (or shape-compatible object) from the selector manifest.\n * @returns the FaceHint derived from the row.\n */\nexport function faceRowToHint(row: {\n surfaceType?: string\n normal?: readonly number[] | null\n center?: readonly number[] | null\n area?: number\n axis?: { origin?: readonly number[] | null; direction?: readonly number[] | null } | null\n}): FaceHint {\n const hint: FaceHint = {\n kind: 'face',\n ...(row.surfaceType !== undefined ? { surfaceType: row.surfaceType } : {}),\n ...(row.normal && row.normal.length === 3 ? { normal: [row.normal[0], row.normal[1], row.normal[2]] as [number, number, number] } : {}),\n ...(row.center && row.center.length === 3 ? { center: [row.center[0], row.center[1], row.center[2]] as [number, number, number] } : {}),\n ...(row.area !== undefined && Number.isFinite(row.area) ? { area: row.area } : {}),\n ...(row.axis?.origin && row.axis.origin.length === 3 && row.axis.direction && row.axis.direction.length === 3\n ? {\n axis: {\n origin: [row.axis.origin[0], row.axis.origin[1], row.axis.origin[2]] as [number, number, number],\n direction: [row.axis.direction[0], row.axis.direction[1], row.axis.direction[2]] as [number, number, number],\n },\n }\n : {}),\n }\n return hint\n}\n\n/**\n * 边行 → EdgeHint(mesh/primitive 命名槽快照路径;§3.7 edgeNaming 用)。\n * EdgeRow.center 与 EdgeHint.midpoint 同口径(§3.7:边 midpoint 与 EdgeRow.center\n * 同口径,geom-hint.ts 统一采集)。\n *\n * @param row - an EdgeRow (or shape-compatible object) from the selector manifest.\n * @returns the EdgeHint derived from the row.\n */\nexport function edgeRowToHint(row: {\n length?: number\n center?: readonly number[] | null\n axis?: { origin?: readonly number[] | null; direction?: readonly number[] | null } | null\n}): EdgeHint {\n const hint: EdgeHint = {\n kind: 'edge',\n ...(row.length !== undefined && Number.isFinite(row.length) ? { length: row.length } : {}),\n ...(row.center && row.center.length === 3 ? { midpoint: [row.center[0], row.center[1], row.center[2]] as [number, number, number] } : {}),\n ...(row.axis?.origin && row.axis.origin.length === 3 && row.axis.direction && row.axis.direction.length === 3\n ? {\n axis: {\n origin: [row.axis.origin[0], row.axis.origin[1], row.axis.origin[2]] as [number, number, number],\n direction: [row.axis.direction[0], row.axis.direction[1], row.axis.direction[2]] as [number, number, number],\n },\n }\n : {}),\n }\n return hint\n}\n\n/**\n * BREP 现场边 → EdgeHint。\n *\n * hint 是「并列裁决者」而非身份本身(§1.2),只在两邻面多公共边时用于打分。\n * length 用 `kernel.curveLength(edge)`;midpoint 取曲线参数中点的点坐标\n * (与 face 的 curvePointAtParam 同口径;屏蔽封闭/退化边的采样退化)。\n *\n * @param kernel - the OCCT kernel.\n * @param edge - the edge handle to snapshot.\n * @returns the captured EdgeHint.\n */\n/**\n * BREP 现场边 → 轴 hint(装配约束的边实体来源;P0 前置)。\n *\n * 直边:origin = 曲线起点,direction = 起点切向;\n * 圆边:origin = 圆心(三点定圆),direction = 所在平面法向;\n * 其它曲线类型 → undefined(不静默造轴)。\n *\n * @param kernel - the OCCT kernel.\n * @param edge - the edge handle.\n * @returns the axis hint, or undefined for unsupported curves / sampling failure.\n */\nexport function captureEdgeAxis(kernel: BrepEngineApi, edge: BrepHandle): AxisHint | undefined {\n try {\n const curveType = kernel.curveType(edge)\n if (curveType === 'line') {\n const { first } = kernel.curveParameters(edge)\n const origin = kernel.curvePointAtParam(edge, first)\n const tangent = kernel.curveTangent(edge, first)\n const direction = normalizedAxis([tangent.x, tangent.y, tangent.z])\n if (Number.isFinite(origin.x) && Number.isFinite(origin.y) && Number.isFinite(origin.z) && direction) {\n return { origin: [origin.x, origin.y, origin.z], direction }\n }\n } else if (curveType === 'circle') {\n return captureCircleEdgeAxis(kernel, edge)\n }\n } catch {\n // 曲线类型读取失败 → 无 axis hint(调用方按缺省处理,不静默造轴)\n }\n return undefined\n}\n\n/**\n * 采集棱边 hint(长度 / 中点 / 轴)。\n *\n * P0 装配前置:直边(起点 + 切向)与圆边(圆心 + 所在平面法向)产出 axis hint;\n * 退化或非线/圆曲线不产出 axis(调用方按缺省处理,不静默造轴)。\n *\n * @param kernel - the BREP engine API.\n * @param edge - the edge handle.\n * @returns the captured edge hint.\n */\nexport function captureEdgeHint(kernel: BrepEngineApi, edge: BrepHandle): EdgeHint {\n const length = kernel.curveLength(edge)\n const hint: { kind: 'edge'; length?: number; midpoint?: [number, number, number]; axis?: AxisHint } = { kind: 'edge' }\n if (Number.isFinite(length) && length > 0) hint.length = length\n try {\n const { first, last } = kernel.curveParameters(edge)\n if (Number.isFinite(first) && Number.isFinite(last)) {\n const mid = kernel.curvePointAtParam(edge, (first + last) / 2)\n if (Number.isFinite(mid.x) && Number.isFinite(mid.y) && Number.isFinite(mid.z)) {\n hint.midpoint = [mid.x, mid.y, mid.z]\n }\n }\n } catch {\n // 退化边(如长度 0)读曲线参数失败 → 只留 length,不发散\n }\n // P0 装配前置:直边(起点+切向)/ 圆边(圆心+法向)采集轴 hint\n const axis = captureEdgeAxis(kernel, edge)\n if (axis) hint.axis = axis\n return hint\n}\n"]}
|
|
1
|
+
{"version":3,"file":"geom-hint.js","sourceRoot":"","sources":["../../../src/topology/naming/geom-hint.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * geom-hint.ts — 几何 hint 捕获(§3.1)\n *\n * 两路:\n * - `captureFaceHint(kernel, faceHandle)`:BREP 现场面 → FaceHint(assignRoles 用)。\n * - `faceRowToHint(row)`:面行/FaceRow → FaceHint(primitive/mesh 命名槽快照用)。\n *\n * hint 字段与 SelectorRuntime 的 FaceRow(surfaceType/area/center/normal)同源\n * (§2.2),保证 BREP 现场与面行快照两条打分路径口径一致。\n */\n\nimport type { BrepEngineApi } from '../../brep/engine/primitives'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport type { FaceHint, EdgeHint, AxisHint } from './types'\n\n/** 归一化向量(axis 采集内部用;零向量返回 null,调用方放弃采集)。 */\nfunction normalizedAxis(v: [number, number, number]): [number, number, number] | null {\n const len = Math.hypot(v[0], v[1], v[2])\n if (len < 1e-12 || !Number.isFinite(len)) return null\n return [v[0] / len, v[1] / len, v[2] / len]\n}\n\n/**\n * BREP 现场圆柱面 → 轴 hint(P0 装配前置)。\n *\n * 算法与 occt-kernel/topologyExt.ts getSurfaceParams 的 cylinder 分支同源:\n * direction = normalize(S(u,v+1) − S(u,v))(V 向即轴向);origin = P − R·外法向\n *(surfaceNormal 含朝向,reversed 面先取反修正)。\n *\n * @param kernel - the OCCT kernel.\n * @param face - the cylindrical face handle.\n * @returns the axis hint, or undefined when the axis cannot be derived.\n */\nexport function captureCylinderFaceAxis(kernel: BrepEngineApi, face: BrepHandle): AxisHint | undefined {\n try {\n const uv = kernel.uvBounds(face)\n const p0 = kernel.pointOnSurface(face, uv.uMin, uv.vMin)\n const p1 = kernel.pointOnSurface(face, uv.uMin, uv.vMin + 1)\n const direction = normalizedAxis([p1.x - p0.x, p1.y - p0.y, p1.z - p0.z])\n const cyl = kernel.getFaceCylinderData(face)\n if (!direction || !cyl) return undefined\n let sn = kernel.surfaceNormal(face, uv.uMin, uv.vMin)\n if (kernel.shapeOrientation(face) === 'reversed') {\n sn = { x: -sn.x, y: -sn.y, z: -sn.z }\n }\n const origin: [number, number, number] = [\n p0.x - cyl.radius * sn.x,\n p0.y - cyl.radius * sn.y,\n p0.z - cyl.radius * sn.z,\n ]\n return { origin, direction }\n } catch {\n return undefined\n }\n}\n\n/**\n * BREP 现场圆边 → 轴 hint(origin = 圆心,direction = 所在平面法向;P0 装配前置)。\n *\n * 用曲线上三个不同参数的采样点做外接圆圆心(三点定圆,精确、无弧长近似),\n * 法向取 (p1−p0)×(p2−p0) 归一化。只用 curvePointAtParam/curveParameters 等既有\n * 公开内核 API(与 getCurveParams 的 circle 分支同一能力面),不新增内核方法。\n *\n * @param kernel - the OCCT kernel.\n * @param edge - the circular edge handle.\n * @returns the axis hint, or undefined when sampling fails.\n */\nfunction captureCircleEdgeAxis(kernel: BrepEngineApi, edge: BrepHandle): AxisHint | undefined {\n try {\n const { first, last } = kernel.curveParameters(edge)\n if (!Number.isFinite(first) || !Number.isFinite(last)) return undefined\n const d = (last - first) / 3\n const pa = kernel.curvePointAtParam(edge, first)\n const pb = kernel.curvePointAtParam(edge, first + d)\n const pc = kernel.curvePointAtParam(edge, first + 2 * d)\n const e1: [number, number, number] = [pb.x - pa.x, pb.y - pa.y, pb.z - pa.z]\n const e2: [number, number, number] = [pc.x - pa.x, pc.y - pa.y, pc.z - pa.z]\n // 三点外接圆:解 o = a + α·e1 + β·e2,满足 |o−a| = |o−b| = |o−c|\n const e11 = e1[0] * e1[0] + e1[1] * e1[1] + e1[2] * e1[2]\n const e22 = e2[0] * e2[0] + e2[1] * e2[1] + e2[2] * e2[2]\n const e12 = e1[0] * e2[0] + e1[1] * e2[1] + e1[2] * e2[2]\n const denom = e11 * e22 - e12 * e12\n if (Math.abs(denom) < 1e-18) return undefined\n const alpha = (e11 * e22 - e22 * e12) / (2 * denom)\n const beta = (e22 * e11 - e11 * e12) / (2 * denom)\n const origin: [number, number, number] = [\n pa.x + alpha * e1[0] + beta * e2[0],\n pa.y + alpha * e1[1] + beta * e2[1],\n pa.z + alpha * e1[2] + beta * e2[2],\n ]\n const direction = normalizedAxis([\n e1[1] * e2[2] - e1[2] * e2[1],\n e1[2] * e2[0] - e1[0] * e2[2],\n e1[0] * e2[1] - e1[1] * e2[0],\n ])\n if (!direction) return undefined\n return { origin, direction }\n } catch {\n return undefined\n }\n}\n\n/**\n * BREP 现场面 → FaceHint。\n *\n * 面积在 occt-wasm 无公开 API(queryBatch 仅测试用),故现场路径不填 area——\n * 打分器对缺失 area 不扣分(scorerArea 双 undefined 跳过)。\n *\n * @param kernel - the OCCT kernel.\n * @param face - the face handle to snapshot.\n * @returns the captured FaceHint.\n */\nexport function captureFaceHint(kernel: BrepEngineApi, face: BrepHandle): FaceHint {\n const surfaceType = kernel.surfaceType(face)\n const uv = kernel.uvBounds(face)\n const u = (uv.uMin + uv.uMax) / 2\n const v = (uv.vMin + uv.vMax) / 2\n const normal = kernel.surfaceNormal(face, u, v)\n const center = kernel.surfaceCenterOfMass(face)\n // P0 装配前置:圆柱面采集轴 hint(其余面类型缺省——平面用 center+normal 即可)\n const axis = surfaceType === 'cylinder' ? captureCylinderFaceAxis(kernel, face) : undefined\n return {\n kind: 'face',\n surfaceType,\n normal: [normal.x, normal.y, normal.z],\n center: [center.x, center.y, center.z],\n ...(axis ? { axis } : {}),\n }\n}\n\n/**\n * 面行 → FaceHint(mesh/primitive 命名槽快照路径;§3.6 setTopology 注入用)。\n * 面行的 surfaceType/normal/center/area 与 BREP 现场同口径(§1.1 事实)。\n *\n * @param row - a FaceRow (or shape-compatible object) from the selector manifest.\n * @returns the FaceHint derived from the row.\n */\nexport function faceRowToHint(row: {\n surfaceType?: string\n normal?: readonly number[] | null\n center?: readonly number[] | null\n area?: number\n axis?: { origin?: readonly number[] | null; direction?: readonly number[] | null } | null\n}): FaceHint {\n const hint: FaceHint = {\n kind: 'face',\n ...(row.surfaceType !== undefined ? { surfaceType: row.surfaceType } : {}),\n ...(row.normal && row.normal.length === 3 ? { normal: [row.normal[0], row.normal[1], row.normal[2]] as [number, number, number] } : {}),\n ...(row.center && row.center.length === 3 ? { center: [row.center[0], row.center[1], row.center[2]] as [number, number, number] } : {}),\n ...(row.area !== undefined && Number.isFinite(row.area) ? { area: row.area } : {}),\n ...(row.axis?.origin && row.axis.origin.length === 3 && row.axis.direction && row.axis.direction.length === 3\n ? {\n axis: {\n origin: [row.axis.origin[0], row.axis.origin[1], row.axis.origin[2]] as [number, number, number],\n direction: [row.axis.direction[0], row.axis.direction[1], row.axis.direction[2]] as [number, number, number],\n },\n }\n : {}),\n }\n return hint\n}\n\n/**\n * 边行 → EdgeHint(mesh/primitive 命名槽快照路径;§3.7 edgeNaming 用)。\n * EdgeRow.center 与 EdgeHint.midpoint 同口径(§3.7:边 midpoint 与 EdgeRow.center\n * 同口径,geom-hint.ts 统一采集)。\n *\n * @param row - an EdgeRow (or shape-compatible object) from the selector manifest.\n * @returns the EdgeHint derived from the row.\n */\nexport function edgeRowToHint(row: {\n length?: number\n center?: readonly number[] | null\n axis?: { origin?: readonly number[] | null; direction?: readonly number[] | null } | null\n}): EdgeHint {\n const hint: EdgeHint = {\n kind: 'edge',\n ...(row.length !== undefined && Number.isFinite(row.length) ? { length: row.length } : {}),\n ...(row.center && row.center.length === 3 ? { midpoint: [row.center[0], row.center[1], row.center[2]] as [number, number, number] } : {}),\n ...(row.axis?.origin && row.axis.origin.length === 3 && row.axis.direction && row.axis.direction.length === 3\n ? {\n axis: {\n origin: [row.axis.origin[0], row.axis.origin[1], row.axis.origin[2]] as [number, number, number],\n direction: [row.axis.direction[0], row.axis.direction[1], row.axis.direction[2]] as [number, number, number],\n },\n }\n : {}),\n }\n return hint\n}\n\n/**\n * BREP 现场边 → EdgeHint。\n *\n * hint 是「并列裁决者」而非身份本身(§1.2),只在两邻面多公共边时用于打分。\n * length 用 `kernel.curveLength(edge)`;midpoint 取曲线参数中点的点坐标\n * (与 face 的 curvePointAtParam 同口径;屏蔽封闭/退化边的采样退化)。\n *\n * @param kernel - the OCCT kernel.\n * @param edge - the edge handle to snapshot.\n * @returns the captured EdgeHint.\n */\n/**\n * BREP 现场边 → 轴 hint(装配约束的边实体来源;P0 前置)。\n *\n * 直边:origin = 曲线起点,direction = 起点切向;\n * 圆边:origin = 圆心(三点定圆),direction = 所在平面法向;\n * 其它曲线类型 → undefined(不静默造轴)。\n *\n * @param kernel - the OCCT kernel.\n * @param edge - the edge handle.\n * @returns the axis hint, or undefined for unsupported curves / sampling failure.\n */\nexport function captureEdgeAxis(kernel: BrepEngineApi, edge: BrepHandle): AxisHint | undefined {\n try {\n const curveType = kernel.curveType(edge)\n if (curveType === 'line') {\n const { first } = kernel.curveParameters(edge)\n const origin = kernel.curvePointAtParam(edge, first)\n const tangent = kernel.curveTangent(edge, first)\n const direction = normalizedAxis([tangent.x, tangent.y, tangent.z])\n if (Number.isFinite(origin.x) && Number.isFinite(origin.y) && Number.isFinite(origin.z) && direction) {\n return { origin: [origin.x, origin.y, origin.z], direction }\n }\n } else if (curveType === 'circle') {\n return captureCircleEdgeAxis(kernel, edge)\n }\n } catch {\n // 曲线类型读取失败 → 无 axis hint(调用方按缺省处理,不静默造轴)\n }\n return undefined\n}\n\n/**\n * 采集棱边 hint(长度 / 中点 / 轴)。\n *\n * P0 装配前置:直边(起点 + 切向)与圆边(圆心 + 所在平面法向)产出 axis hint;\n * 退化或非线/圆曲线不产出 axis(调用方按缺省处理,不静默造轴)。\n *\n * @param kernel - the BREP engine API.\n * @param edge - the edge handle.\n * @returns the captured edge hint.\n */\nexport function captureEdgeHint(kernel: BrepEngineApi, edge: BrepHandle): EdgeHint {\n const length = kernel.curveLength(edge)\n const hint: { kind: 'edge'; length?: number; midpoint?: [number, number, number]; axis?: AxisHint } = { kind: 'edge' }\n if (Number.isFinite(length) && length > 0) hint.length = length\n try {\n const { first, last } = kernel.curveParameters(edge)\n if (Number.isFinite(first) && Number.isFinite(last)) {\n const mid = kernel.curvePointAtParam(edge, (first + last) / 2)\n if (Number.isFinite(mid.x) && Number.isFinite(mid.y) && Number.isFinite(mid.z)) {\n hint.midpoint = [mid.x, mid.y, mid.z]\n }\n }\n } catch {\n // 退化边(如长度 0)读曲线参数失败 → 只留 length,不发散\n }\n // P0 装配前置:直边(起点+切向)/ 圆边(圆心+法向)采集轴 hint\n const axis = captureEdgeAxis(kernel, edge)\n if (axis) hint.axis = axis\n return hint\n}\n"]}
|
|
@@ -351,6 +351,7 @@ export declare class LineageGraph {
|
|
|
351
351
|
* 执行期共用的血缘图实例。
|
|
352
352
|
*
|
|
353
353
|
* 唯一性由约束 C1(禁止并发多 runtime)保证;测试请自建 `new LineageGraph()`。
|
|
354
|
+
* **跨 faijs 实例共享**(globalThis),见 `sharedLineageGraph`。
|
|
354
355
|
*/
|
|
355
356
|
export declare const runtimeLineage: LineageGraph;
|
|
356
357
|
//# sourceMappingURL=lineage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lineage.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/lineage.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"lineage.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/lineage.ts"],"names":[],"mappings":"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"}
|
|
@@ -397,10 +397,46 @@ function sameIdentity(a, b) {
|
|
|
397
397
|
sameNames(a.outputs, b.outputs) &&
|
|
398
398
|
provenanceEquals(a.provenance, b.provenance));
|
|
399
399
|
}
|
|
400
|
+
/**
|
|
401
|
+
* globalThis 上的血缘图共享键与版本(见 `sharedLineageGraph`)。
|
|
402
|
+
*/
|
|
403
|
+
const LINEAGE_KEY = '__FAICAD_FAIJS_LINEAGE__';
|
|
404
|
+
const LINEAGE_VERSION = 1;
|
|
405
|
+
/**
|
|
406
|
+
* 取(或建)挂在 globalThis 上的血缘图。
|
|
407
|
+
*
|
|
408
|
+
* **为什么必须挂 globalThis**:宿主 bundle 与第三方库(如 animation)可能各打一份
|
|
409
|
+
* faijs 代码(node_modules 里 animation 内嵌一份、宿主一份)。模块级单例会让
|
|
410
|
+
* 「建命名的一方」与「解析的一方」看到两张不同的表——求解侧 `roleTable` 恒空,
|
|
411
|
+
* exact 路径永不命中,只剩几何兜底;而 brepkit 的 `uvBounds` 对平面返回 ±1e6
|
|
412
|
+
* 哨兵,`surfaceCenterOfMass` 退化成参数原点求值,非居中模型上兜底全拒 →
|
|
413
|
+
* `topo ref (face) not found in the current shape`(2026-10-16 装配选面 bug 实锤)。
|
|
414
|
+
*
|
|
415
|
+
* 与 `runtime-state.ts` 的 `getRuntimeState()` 同一机制——那边早就是 globalThis
|
|
416
|
+
* (注释原话"让两份 faijs 代码共享同一份状态……构建期去重是主手段,这里是兜底"),
|
|
417
|
+
* 血缘图是漏补的那一块。版本不符直接抛错,不静默错乱(与 N1/N2/N3 同精神:
|
|
418
|
+
* 宁可在执行期就炸)。
|
|
419
|
+
*
|
|
420
|
+
* @returns the shared lineage graph singleton.
|
|
421
|
+
*/
|
|
422
|
+
function sharedLineageGraph() {
|
|
423
|
+
const g = globalThis;
|
|
424
|
+
const existing = g[LINEAGE_KEY];
|
|
425
|
+
if (existing) {
|
|
426
|
+
if (existing.version !== LINEAGE_VERSION) {
|
|
427
|
+
throw new Error(`[faijs] lineage version mismatch: loaded=${existing.version}, expected=${LINEAGE_VERSION}`);
|
|
428
|
+
}
|
|
429
|
+
return existing.graph;
|
|
430
|
+
}
|
|
431
|
+
const created = { version: LINEAGE_VERSION, graph: new LineageGraph() };
|
|
432
|
+
g[LINEAGE_KEY] = created;
|
|
433
|
+
return created.graph;
|
|
434
|
+
}
|
|
400
435
|
/**
|
|
401
436
|
* 执行期共用的血缘图实例。
|
|
402
437
|
*
|
|
403
438
|
* 唯一性由约束 C1(禁止并发多 runtime)保证;测试请自建 `new LineageGraph()`。
|
|
439
|
+
* **跨 faijs 实例共享**(globalThis),见 `sharedLineageGraph`。
|
|
404
440
|
*/
|
|
405
|
-
export const runtimeLineage =
|
|
441
|
+
export const runtimeLineage = sharedLineageGraph();
|
|
406
442
|
//# sourceMappingURL=lineage.js.map
|