@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,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* op-names — the editor-owned op name lists (single source).
|
|
3
|
+
*
|
|
4
|
+
* 2026-10-13 merge: these names now live in core (`packages/core/src/extra/`).
|
|
5
|
+
* `createApiNamespace()` carries the complete cad surface (platform + sketch
|
|
6
|
+
* + extra ops). The lists serve two consumers:
|
|
7
|
+
*
|
|
8
|
+
* 1. the cad-namespace membership guards (all ops are in `createApiNamespace`),
|
|
9
|
+
* and
|
|
10
|
+
* 2. the symbol table (gen-symbol-table discovers each op from the explicit
|
|
11
|
+
* keys in `createApiNamespace()`; no separate `registerEditorSymbols()`
|
|
12
|
+
* call is needed).
|
|
13
|
+
*
|
|
14
|
+
* `EDITOR_OPS` is the editor-owned op group (plan §4.2 A) and `CREATOR_OPS` the
|
|
15
|
+
* svg / 3D-text creator group (plan §4.2 B). The split is not cosmetic: the A
|
|
16
|
+
* group is lightweight (no heavy deps), so the weapp worker can mount it via
|
|
17
|
+
* the `@faicad/faijs/extra/editor-ops` entry while the B group — which carries
|
|
18
|
+
* the opentype.js / SVG / text-geometry chain — stays off the end-side bundle.
|
|
19
|
+
*/
|
|
20
|
+
/** A group (plan §4.2): editor-owned ops, three basic API only. */
|
|
21
|
+
export declare const EDITOR_OPS: readonly ["fai_drill", "fai_extrude", "fai_split", "group", "assembly", "copy", "load"];
|
|
22
|
+
/** B group (plan §4.2): svg / 3D-text creators; carry the non-basic three chain. */
|
|
23
|
+
export declare const CREATOR_OPS: readonly ["text", "svgExtrude"];
|
|
24
|
+
/** Every op name the editor ops group carries, in assembly order. */
|
|
25
|
+
export declare const ALL_EDITOR_OPS: readonly ["fai_drill", "fai_extrude", "fai_split", "group", "assembly", "copy", "load", "text", "svgExtrude"];
|
|
26
|
+
/** Name of an editor-owned op (`cad.<name>`). */
|
|
27
|
+
export type EditorOpName = (typeof EDITOR_OPS)[number];
|
|
28
|
+
/** Name of a creator op (`cad.<name>`). */
|
|
29
|
+
export type CreatorOpName = (typeof CREATOR_OPS)[number];
|
|
30
|
+
/**
|
|
31
|
+
* Membership test for the editor-owned op list (A group).
|
|
32
|
+
*
|
|
33
|
+
* @param name - the `cad.<name>` candidate to test.
|
|
34
|
+
* @returns true when the name is one of `EDITOR_OPS`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isEditorOp(name: string): name is EditorOpName;
|
|
37
|
+
//# sourceMappingURL=op-names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"op-names.d.ts","sourceRoot":"","sources":["../../src/extra/op-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,mEAAmE;AACnE,eAAO,MAAM,UAAU,yFAQb,CAAA;AAEV,oFAAoF;AACpF,eAAO,MAAM,WAAW,iCAGd,CAAA;AAEV,qEAAqE;AACrE,eAAO,MAAM,cAAc,+GAA2C,CAAA;AAEtE,iDAAiD;AACjD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;AAEtD,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,YAAY,CAE7D"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* op-names — the editor-owned op name lists (single source).
|
|
3
|
+
*
|
|
4
|
+
* 2026-10-13 merge: these names now live in core (`packages/core/src/extra/`).
|
|
5
|
+
* `createApiNamespace()` carries the complete cad surface (platform + sketch
|
|
6
|
+
* + extra ops). The lists serve two consumers:
|
|
7
|
+
*
|
|
8
|
+
* 1. the cad-namespace membership guards (all ops are in `createApiNamespace`),
|
|
9
|
+
* and
|
|
10
|
+
* 2. the symbol table (gen-symbol-table discovers each op from the explicit
|
|
11
|
+
* keys in `createApiNamespace()`; no separate `registerEditorSymbols()`
|
|
12
|
+
* call is needed).
|
|
13
|
+
*
|
|
14
|
+
* `EDITOR_OPS` is the editor-owned op group (plan §4.2 A) and `CREATOR_OPS` the
|
|
15
|
+
* svg / 3D-text creator group (plan §4.2 B). The split is not cosmetic: the A
|
|
16
|
+
* group is lightweight (no heavy deps), so the weapp worker can mount it via
|
|
17
|
+
* the `@faicad/faijs/extra/editor-ops` entry while the B group — which carries
|
|
18
|
+
* the opentype.js / SVG / text-geometry chain — stays off the end-side bundle.
|
|
19
|
+
*/
|
|
20
|
+
/** A group (plan §4.2): editor-owned ops, three basic API only. */
|
|
21
|
+
export const EDITOR_OPS = [
|
|
22
|
+
'fai_drill',
|
|
23
|
+
'fai_extrude',
|
|
24
|
+
'fai_split',
|
|
25
|
+
'group',
|
|
26
|
+
'assembly',
|
|
27
|
+
'copy',
|
|
28
|
+
'load',
|
|
29
|
+
];
|
|
30
|
+
/** B group (plan §4.2): svg / 3D-text creators; carry the non-basic three chain. */
|
|
31
|
+
export const CREATOR_OPS = [
|
|
32
|
+
'text',
|
|
33
|
+
'svgExtrude',
|
|
34
|
+
];
|
|
35
|
+
/** Every op name the editor ops group carries, in assembly order. */
|
|
36
|
+
export const ALL_EDITOR_OPS = [...EDITOR_OPS, ...CREATOR_OPS];
|
|
37
|
+
/**
|
|
38
|
+
* Membership test for the editor-owned op list (A group).
|
|
39
|
+
*
|
|
40
|
+
* @param name - the `cad.<name>` candidate to test.
|
|
41
|
+
* @returns true when the name is one of `EDITOR_OPS`.
|
|
42
|
+
*/
|
|
43
|
+
export function isEditorOp(name) {
|
|
44
|
+
return EDITOR_OPS.includes(name);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=op-names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"op-names.js","sourceRoot":"","sources":["../../src/extra/op-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,mEAAmE;AACnE,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,WAAW;IACX,aAAa;IACb,WAAW;IACX,OAAO;IACP,UAAU;IACV,MAAM;IACN,MAAM;CACE,CAAA;AAEV,oFAAoF;AACpF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM;IACN,YAAY;CACJ,CAAA;AAEV,qEAAqE;AACrE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,WAAW,CAAU,CAAA;AAQtE;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAQ,UAAgC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AACzD,CAAC","sourcesContent":["/**\n * op-names — the editor-owned op name lists (single source).\n *\n * 2026-10-13 merge: these names now live in core (`packages/core/src/extra/`).\n * `createApiNamespace()` carries the complete cad surface (platform + sketch\n * + extra ops). The lists serve two consumers:\n *\n * 1. the cad-namespace membership guards (all ops are in `createApiNamespace`),\n * and\n * 2. the symbol table (gen-symbol-table discovers each op from the explicit\n * keys in `createApiNamespace()`; no separate `registerEditorSymbols()`\n * call is needed).\n *\n * `EDITOR_OPS` is the editor-owned op group (plan §4.2 A) and `CREATOR_OPS` the\n * svg / 3D-text creator group (plan §4.2 B). The split is not cosmetic: the A\n * group is lightweight (no heavy deps), so the weapp worker can mount it via\n * the `@faicad/faijs/extra/editor-ops` entry while the B group — which carries\n * the opentype.js / SVG / text-geometry chain — stays off the end-side bundle.\n */\n\n/** A group (plan §4.2): editor-owned ops, three basic API only. */\nexport const EDITOR_OPS = [\n 'fai_drill',\n 'fai_extrude',\n 'fai_split',\n 'group',\n 'assembly',\n 'copy',\n 'load',\n] as const\n\n/** B group (plan §4.2): svg / 3D-text creators; carry the non-basic three chain. */\nexport const CREATOR_OPS = [\n 'text',\n 'svgExtrude',\n] as const\n\n/** Every op name the editor ops group carries, in assembly order. */\nexport const ALL_EDITOR_OPS = [...EDITOR_OPS, ...CREATOR_OPS] as const\n\n/** Name of an editor-owned op (`cad.<name>`). */\nexport type EditorOpName = (typeof EDITOR_OPS)[number]\n\n/** Name of a creator op (`cad.<name>`). */\nexport type CreatorOpName = (typeof CREATOR_OPS)[number]\n\n/**\n * Membership test for the editor-owned op list (A group).\n *\n * @param name - the `cad.<name>` candidate to test.\n * @returns true when the name is one of `EDITOR_OPS`.\n */\nexport function isEditorOp(name: string): name is EditorOpName {\n return (EDITOR_OPS as readonly string[]).includes(name)\n}\n"]}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* faijs-extra compound — group/assembly 库函数(compound Shape + AssemblyBehavior)
|
|
3
|
+
*
|
|
4
|
+
*
|
|
5
|
+
* 从 src/ops/assemble.ts 迁出并改写为 op 形态:
|
|
6
|
+
* - `group(params)` → compound Shape(kind='compound',children 为成员 Shape 引用)
|
|
7
|
+
* - `assembly(params)` → compound Shape + AssemblyBehavior(约束列表 + solve 方法)
|
|
8
|
+
* - 装配求解(P1 起)委派 api/assembly/(chain-solver 内核):
|
|
9
|
+
* do_assemble/solve 触发求解 → 引擎应用
|
|
10
|
+
* (mesh 顶点烘焙 + BREP 刚体变换 + 下游传播)。
|
|
11
|
+
* P2-f5:旧装配算法与自有四元数实现已删除,求解全链路走 api/assembly。
|
|
12
|
+
*
|
|
13
|
+
* compound 自身无独立 mesh——几何由 children 承载,意义是结构(层级)。
|
|
14
|
+
* do_assemble 编译为 `await ctx.<asm>.do_assemble()`:调用 compound 的求解方法,
|
|
15
|
+
* 对约束定位的成员施加装配变换(mesh 顶点烘焙 + BREP 刚体变换 + 下游传播)。
|
|
16
|
+
*/
|
|
17
|
+
import type { Shape } from '../../mesh/types.js';
|
|
18
|
+
import { type CompoundShape } from '../../shape.js';
|
|
19
|
+
import { type AssemblyTransform } from '../../runtime-state.js';
|
|
20
|
+
import { type AssemblySolveResult } from '../../api/assembly/solve.js';
|
|
21
|
+
import { type JointSpec } from '../../api/assembly/joints.js';
|
|
22
|
+
import type { AssemblyConstraint } from '../../api/assembly/types.js';
|
|
23
|
+
import type { SolverStyle } from '../../api/assembly/solvers/types.js';
|
|
24
|
+
/** Parameters for the `group` op function: an optional name and ordered members. */
|
|
25
|
+
export interface GroupParams {
|
|
26
|
+
name?: string;
|
|
27
|
+
/** Compound members: read-only references, never mutated by group/assembly. */
|
|
28
|
+
members?: Shape[];
|
|
29
|
+
memberNames?: string[];
|
|
30
|
+
}
|
|
31
|
+
/** Parameters for the `assembly` op function: group params plus assembly constraints. */
|
|
32
|
+
export interface AssemblyParams extends GroupParams {
|
|
33
|
+
constraints?: AssemblyConstraint[];
|
|
34
|
+
/** P3:运动副声明(可选;parent/child 必须是 members 里的名字)。 */
|
|
35
|
+
joints?: JointSpec[];
|
|
36
|
+
/** P3:驱动值覆盖(键 = child 成员名;值 = 主 DOF 数值或多 DOF 数组)。 */
|
|
37
|
+
drive?: Record<string, number | number[]>;
|
|
38
|
+
/** cq-compat:成员颜色(sRGB 0..1),导出 STEP 时写入 XCAF。 */
|
|
39
|
+
memberColors?: Record<string, [number, number, number]>;
|
|
40
|
+
/** P1:求解风格。'chain'(默认,链式拓扑解析)| 'global'(CadQuery 兼容全局最小二乘)。 */
|
|
41
|
+
solver?: SolverStyle;
|
|
42
|
+
}
|
|
43
|
+
export type { AssemblyConstraint, FaceMateConstraint, FaceMateFace, EntityRef, FaceRef, EdgeRef, MateConstraint, AlignConstraint, CoincidentConstraint, ConcentricConstraint, DistanceConstraint, AngleConstraint, ParallelConstraint, PerpendicularConstraint, FixedConstraint, FixedPointConstraint, FixedAxisConstraint, FixedRotationConstraint, StructuralConstraint, AssemblyVec3, } from '../../api/assembly/types.js';
|
|
44
|
+
export type { AssemblySolveResult } from '../../api/assembly/solve.js';
|
|
45
|
+
export { applyTransform } from '../../mesh/rigid-transform.js';
|
|
46
|
+
/** Behavior attached to an assembly compound: its members, constraints, and solver. */
|
|
47
|
+
export interface AssemblyBehavior {
|
|
48
|
+
/**
|
|
49
|
+
* F3:声明来源判别符(`group` → 'group',`assembly` → 'assembly')。
|
|
50
|
+
* `ExecutionResult.assemblies` 只收 'assembly'——group 无约束/关节,进装配声明面
|
|
51
|
+
* 会让消费方(animation 宿主)对空约束集求解并撞欠定诊断。历史 behavior 无此字段
|
|
52
|
+
* (旧持久化 compound)→ 视为非 assembly 声明。
|
|
53
|
+
*/
|
|
54
|
+
kind?: 'group' | 'assembly';
|
|
55
|
+
name?: string;
|
|
56
|
+
memberNames: string[];
|
|
57
|
+
constraints: AssemblyConstraint[];
|
|
58
|
+
/** P3:运动副声明(无 joints 时为空数组)。 */
|
|
59
|
+
joints?: JointSpec[];
|
|
60
|
+
/** P3:驱动值覆盖(键 = child 成员名;缺省 undefined = 用 joint 存储值)。 */
|
|
61
|
+
drive?: Record<string, number | number[]>;
|
|
62
|
+
/** cq-compat:成员颜色(sRGB 0..1)。 */
|
|
63
|
+
memberColors?: Record<string, [number, number, number]>;
|
|
64
|
+
/** P1:求解风格。 */
|
|
65
|
+
solver?: SolverStyle;
|
|
66
|
+
/** 只求解(P6):返回"成员下标 → 变换"列表。不改写入参、不传播;可重复调用(幂等)。 */
|
|
67
|
+
solve(): AssemblyTransform[];
|
|
68
|
+
/** 只求解并带诊断量(P1):transforms + dof/converged/unsupported(方案 P1⑤);P3 增 kinematics/warnings。 */
|
|
69
|
+
solveDetailed(): AssemblySolveResult;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* F3:装配声明的**宿主消费形态**(`ExecutionResult.assemblies` 的元素,2026-10-15)。
|
|
73
|
+
*
|
|
74
|
+
* = AssemblyBehavior 的声明字段(去掉 solve/solveDetailed 方法)+ CompoundShape 引用。
|
|
75
|
+
* 存在的理由:约束/关节声明此前只活在 compound 的 behavior 槽里,而 `getSlot` 未公开
|
|
76
|
+
* 导出——宿主持不到声明,只能在 outputs 里逆结构。本类型把声明面提到 ExecutionResult
|
|
77
|
+
* 一级字段,宿主据此在**自己的侧**做纯求解(禁烘焙:不调 asm.solve()/do_assemble(),
|
|
78
|
+
* 不触发 applyPendingAssemblyTransforms),位姿只以 transform 数据在宿主侧流动。
|
|
79
|
+
*/
|
|
80
|
+
export interface AssemblyDecl {
|
|
81
|
+
/** 装配名(cad.assembly 的 name 参数;未给则 undefined)。 */
|
|
82
|
+
name?: string;
|
|
83
|
+
/** 成员变量名(声明序,与 compound children 同序)。 */
|
|
84
|
+
memberNames: string[];
|
|
85
|
+
/** 约束声明(原样携带,未经求解)。 */
|
|
86
|
+
constraints: AssemblyConstraint[];
|
|
87
|
+
/** 运动副声明(无 joints 时为空数组)。 */
|
|
88
|
+
joints: JointSpec[];
|
|
89
|
+
/** 求解风格('chain' 缺省 | 'global')。 */
|
|
90
|
+
solver?: SolverStyle;
|
|
91
|
+
/** 装配 compound 本体(成员 Shape 经其 children 取用;也出现在 outputs 里)。 */
|
|
92
|
+
compound: CompoundShape;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* `cad.group({ name, members })` → compound Shape。
|
|
96
|
+
* members 是成员 Shape(编译产物 ctx.<var> 引用),成员名经 keep() 反查。
|
|
97
|
+
*
|
|
98
|
+
* 函数体 keep 声明(keep-syntax 设计 §2.5):group 保留其成员且可见(R6)。
|
|
99
|
+
*/
|
|
100
|
+
/**
|
|
101
|
+
* 分组:零约束,保持当前布局。结构语句,无几何输出,成员用变量名引用。
|
|
102
|
+
* @group 结构
|
|
103
|
+
* @inputs 1
|
|
104
|
+
* @async false
|
|
105
|
+
* @qual ok
|
|
106
|
+
* @name group
|
|
107
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(无几何输出,服务于编辑器画布与时间线),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**。**平台侧需要几何复合体请用 `cad.compound`**(内核 `makeCompound`,持 OCCT 句柄,可变换/可导出)。
|
|
108
|
+
* @returns CompoundShape 复合几何(kind='compound',children 为成员 Shape 引用)。
|
|
109
|
+
* @param params.name - 组名。type:string
|
|
110
|
+
* @param params.members - 成员(编译产物 ctx.<var> 引用;结构语句里是裸变量引用,非字符串数组)。type:Shape[]
|
|
111
|
+
* @note members 在 .fai.js 里是裸变量引用(编译为 ctx.<var>),字符串数组形态的成员名经 keep() 反查兼容历史 IR。
|
|
112
|
+
* @example
|
|
113
|
+
* const part0 = cad.box(30, 20, 10, { centered: true })
|
|
114
|
+
* cad.group({ name: '底板组', members: [part0] })
|
|
115
|
+
*/
|
|
116
|
+
export declare function group(params: GroupParams): CompoundShape;
|
|
117
|
+
/**
|
|
118
|
+
* 装配:成员 + 约束。结构语句,无几何输出,成员用变量名引用、实体用 EntityRef / 拓扑引用。
|
|
119
|
+
* 求解内核复用 chain-solver solveConstraints(链式拓扑调度 / DOF / converged /
|
|
120
|
+
* unsupported 诊断);输出为 per-member 终态变换(每成员一条,恒等位姿不输出)。
|
|
121
|
+
* @group 结构
|
|
122
|
+
* @inputs 1
|
|
123
|
+
* @async false
|
|
124
|
+
* @qual warn
|
|
125
|
+
* @name assembly
|
|
126
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(成员以编辑器结构语句形态声明,服务于画布与时间线),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。
|
|
127
|
+
* @returns CompoundShape + AssemblyBehavior(含 do_assemble / solve 方法)。
|
|
128
|
+
* @note 约束类型(a=参考、b=从动,移动 b 去贴合 a):`mate` 面对面贴合(法向反向+面中心重合,遗留 face_mate 的新名,求解降级为 concentric + 轴编码);`align` 同向对齐(法向同向+面中心重合);`coincident` 共面/共点/共线(保留面内 2 个平移 DOF);`concentric` 轴重合(孔轴配合,圆柱/圆锥面需 hint.axis,直边/圆边需 EdgeHint.axis);`distance` 定距(mm,带 value);`angle` 夹角(deg,带 value);`parallel`/`perpendicular` 平行/垂直(angle 0°/90° 语法糖);`fixed` 锚定部件(地基);`fixedPoint`/`fixedAxis`/`fixedRotation` 世界锚定 unary(把成员子实体钉到世界字面点/方向、锁朝向,平移其余 DOF 仍自由,仅 `solver:'global'` 支持);`face_mate` 为遗留别名(规范化为 mate,新代码不再使用)。
|
|
129
|
+
* @note EntityRef 四种形态:`{ part, face: { topoRef } | { surfaceType?, center, normal } }`、`{ part, edge: { topoRef } | { axis: { origin, direction } } }`、`{ part, point: [x,y,z] }`、`{ part, faceIndex }`(1 起,仅调试简写)。
|
|
130
|
+
* @note 不收敛(实体类型不匹配/环/参考不可达)→ 抛错并带 unsupported 明细;成员名为空串 → 求解前抛错;mesh 快照缺 axis 的圆柱/圆锥面作轴实体 → E_TOPO_NOT_FOUND(绝不静默降级)。`mate`(中心重合)与 `coincident`(只共面)是两种不同语义,不互相映射。
|
|
131
|
+
* @note 早期文档/示例曾用 `fixedPartId`/`movingPartId`/`faceRowIndex`/`faceId`/`invalid`——这些键在代码中不存在。真实契约是 `fixedPartName`/`movingPartName` + `fixedFace`/`movingFace`(遗留 face_mate)。`faceId` 字段随 §6.2 移除,不再写入。
|
|
132
|
+
* @param params.name - 装配名。type:string
|
|
133
|
+
* @param params.members - 成员(裸变量引用)。type:Shape[]
|
|
134
|
+
* @param params.constraints - 约束数组(遗留 face_mate 形态或上述新形态 { type, a, b })。type:AssemblyConstraint[]
|
|
135
|
+
* @example
|
|
136
|
+
* let asm1 = cad.assembly({ name: '主轴组件', members: [part0, part1, part2], constraints: [ { type: 'fixed', part: 'part0' }, { type: 'mate', a: { part: 'part0', face: { topoRef: { kind: 'face', origin: 'part0', role: 'box:top', hint: { kind: 'face', surfaceType: 'plane' } } } }, b: { part: 'part1', face: { topoRef: { kind: 'face', origin: 'part1', role: 'box:bottom', hint: { kind: 'face', surfaceType: 'plane' } } } } }, { type: 'concentric', a: { part: 'part1', face: { topoRef: { kind: 'face', origin: 'part1', role: '', hint: { kind: 'face', surfaceType: 'cylinder' } } } }, b: { part: 'part2', face: { topoRef: { kind: 'face', origin: 'part2', role: 'cylinder:lateral', hint: { kind: 'face', surfaceType: 'cylinder' } } } } } ] })
|
|
137
|
+
* asm1.solve()
|
|
138
|
+
*/
|
|
139
|
+
export declare function assembly(params: AssemblyParams): CompoundShape;
|
|
140
|
+
//# sourceMappingURL=compound.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compound.d.ts","sourceRoot":"","sources":["../../../src/extra/ops/compound.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* faijs-extra compound — group/assembly 库函数(compound Shape + AssemblyBehavior)
|
|
3
|
+
*
|
|
4
|
+
*
|
|
5
|
+
* 从 src/ops/assemble.ts 迁出并改写为 op 形态:
|
|
6
|
+
* - `group(params)` → compound Shape(kind='compound',children 为成员 Shape 引用)
|
|
7
|
+
* - `assembly(params)` → compound Shape + AssemblyBehavior(约束列表 + solve 方法)
|
|
8
|
+
* - 装配求解(P1 起)委派 api/assembly/(chain-solver 内核):
|
|
9
|
+
* do_assemble/solve 触发求解 → 引擎应用
|
|
10
|
+
* (mesh 顶点烘焙 + BREP 刚体变换 + 下游传播)。
|
|
11
|
+
* P2-f5:旧装配算法与自有四元数实现已删除,求解全链路走 api/assembly。
|
|
12
|
+
*
|
|
13
|
+
* compound 自身无独立 mesh——几何由 children 承载,意义是结构(层级)。
|
|
14
|
+
* do_assemble 编译为 `await ctx.<asm>.do_assemble()`:调用 compound 的求解方法,
|
|
15
|
+
* 对约束定位的成员施加装配变换(mesh 顶点烘焙 + BREP 刚体变换 + 下游传播)。
|
|
16
|
+
*/
|
|
17
|
+
import { compound as makeCompound, ensureSlot } from '../../shape.js';
|
|
18
|
+
import { keep, nameOf, setPendingAssemblyTransforms, setPendingAssemblyKinematics } from '../../runtime-state.js';
|
|
19
|
+
import { solveAssemblyAndKinematics } from '../../api/assembly/solve.js';
|
|
20
|
+
import { validateConstraints } from '../../api/assembly/validate.js';
|
|
21
|
+
import { buildKinematicTree } from '../../api/assembly/joints.js';
|
|
22
|
+
// ── 求解器 ──
|
|
23
|
+
// P2-f5:旧装配算法与自有四元数实现已整体删除——旋转计算一律走
|
|
24
|
+
// brepjs utils/quaternion.ts,输出经 api/assembly/pose.ts fromBrepjsQuat 重排。
|
|
25
|
+
// (utils/quaternion.ts 已内化为第一方代码,函数名保留历史来源标识。)
|
|
26
|
+
// 应用变换(mesh 顶点烘焙)下沉到引擎侧 src/mesh/rigid-transform.ts(E-b:
|
|
27
|
+
// 引擎不得 import api/compound;公共 API 经本 re-export 保持)。
|
|
28
|
+
export { applyTransform } from '../../mesh/rigid-transform.js';
|
|
29
|
+
/**
|
|
30
|
+
* 纯求解(P6:求解 ≠ 传播):委派 api/assembly/solveAssembly(P1 起)。
|
|
31
|
+
* 不修改任何输入、不触碰引擎状态——引擎负责应用变换并让下游失效重算(F2)。
|
|
32
|
+
*
|
|
33
|
+
* 约束形态(方案 §5):
|
|
34
|
+
* - 遗留 face_mate:规范化为 mate 后降级为 chain-solver concentric + 轴编码求解(§3.7.2);
|
|
35
|
+
* - 新形态 mate/align/coincident/concentric/distance/angle/parallel/perpendicular/fixed;
|
|
36
|
+
* - 面参数 `{ topoRef }` 执行期解析(BREP 现场/mesh 行快照),旧 `{ center, normal }`
|
|
37
|
+
* 快照直接使用(兼容已持久化的历史脚本);
|
|
38
|
+
* - 输出为 per-member 终态(L6 修复),锚定成员不输出变换。
|
|
39
|
+
*/
|
|
40
|
+
function solveTransforms(members, behavior) {
|
|
41
|
+
return solveAssemblyAndKinematics(members, behavior.memberNames, behavior.constraints, behavior.joints ?? [], behavior.drive, { solver: behavior.solver, name: behavior.name }).transforms;
|
|
42
|
+
}
|
|
43
|
+
// ── group / assembly 库函数 ──
|
|
44
|
+
/**
|
|
45
|
+
* 成员名推导:显式 memberNames 兼容旧手工构造 IR;否则经 keep() 反查
|
|
46
|
+
* (P3 起经 keep()/nameOfShapes 反查成员名——库不再访问执行上下文,F1)。
|
|
47
|
+
*/
|
|
48
|
+
function memberNamesOf(params, members) {
|
|
49
|
+
if (Array.isArray(params.memberNames) && params.memberNames.length > 0) {
|
|
50
|
+
return params.memberNames;
|
|
51
|
+
}
|
|
52
|
+
return members.map((m) => {
|
|
53
|
+
// 兼容字符串形态的 members(历史 IR 直传 partName):字符串本身就是名字
|
|
54
|
+
if (typeof m === 'string')
|
|
55
|
+
return m;
|
|
56
|
+
return String(nameOf(m) ?? '');
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* `cad.group({ name, members })` → compound Shape。
|
|
61
|
+
* members 是成员 Shape(编译产物 ctx.<var> 引用),成员名经 keep() 反查。
|
|
62
|
+
*
|
|
63
|
+
* 函数体 keep 声明(keep-syntax 设计 §2.5):group 保留其成员且可见(R6)。
|
|
64
|
+
*/
|
|
65
|
+
/**
|
|
66
|
+
* 分组:零约束,保持当前布局。结构语句,无几何输出,成员用变量名引用。
|
|
67
|
+
* @group 结构
|
|
68
|
+
* @inputs 1
|
|
69
|
+
* @async false
|
|
70
|
+
* @qual ok
|
|
71
|
+
* @name group
|
|
72
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(无几何输出,服务于编辑器画布与时间线),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**。**平台侧需要几何复合体请用 `cad.compound`**(内核 `makeCompound`,持 OCCT 句柄,可变换/可导出)。
|
|
73
|
+
* @returns CompoundShape 复合几何(kind='compound',children 为成员 Shape 引用)。
|
|
74
|
+
* @param params.name - 组名。type:string
|
|
75
|
+
* @param params.members - 成员(编译产物 ctx.<var> 引用;结构语句里是裸变量引用,非字符串数组)。type:Shape[]
|
|
76
|
+
* @note members 在 .fai.js 里是裸变量引用(编译为 ctx.<var>),字符串数组形态的成员名经 keep() 反查兼容历史 IR。
|
|
77
|
+
* @example
|
|
78
|
+
* const part0 = cad.box(30, 20, 10, { centered: true })
|
|
79
|
+
* cad.group({ name: '底板组', members: [part0] })
|
|
80
|
+
*/
|
|
81
|
+
export function group(params) {
|
|
82
|
+
const members = params.members ?? [];
|
|
83
|
+
if (members.length > 0)
|
|
84
|
+
keep(...members);
|
|
85
|
+
const memberNames = memberNamesOf(params, members);
|
|
86
|
+
const c = makeCompound(members);
|
|
87
|
+
// 挂最小 behavior(memberNames 供 ExecutionResult.compounds 结构输出;group 无约束)
|
|
88
|
+
ensureSlot(c).behavior = {
|
|
89
|
+
kind: 'group',
|
|
90
|
+
memberNames,
|
|
91
|
+
constraints: [],
|
|
92
|
+
joints: [],
|
|
93
|
+
solve: () => [],
|
|
94
|
+
solveDetailed: () => ({ transforms: [], dof: 0, converged: true, unsupported: [] }),
|
|
95
|
+
};
|
|
96
|
+
return c;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 装配:成员 + 约束。结构语句,无几何输出,成员用变量名引用、实体用 EntityRef / 拓扑引用。
|
|
100
|
+
* 求解内核复用 chain-solver solveConstraints(链式拓扑调度 / DOF / converged /
|
|
101
|
+
* unsupported 诊断);输出为 per-member 终态变换(每成员一条,恒等位姿不输出)。
|
|
102
|
+
* @group 结构
|
|
103
|
+
* @inputs 1
|
|
104
|
+
* @async false
|
|
105
|
+
* @qual warn
|
|
106
|
+
* @name assembly
|
|
107
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(成员以编辑器结构语句形态声明,服务于画布与时间线),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。
|
|
108
|
+
* @returns CompoundShape + AssemblyBehavior(含 do_assemble / solve 方法)。
|
|
109
|
+
* @note 约束类型(a=参考、b=从动,移动 b 去贴合 a):`mate` 面对面贴合(法向反向+面中心重合,遗留 face_mate 的新名,求解降级为 concentric + 轴编码);`align` 同向对齐(法向同向+面中心重合);`coincident` 共面/共点/共线(保留面内 2 个平移 DOF);`concentric` 轴重合(孔轴配合,圆柱/圆锥面需 hint.axis,直边/圆边需 EdgeHint.axis);`distance` 定距(mm,带 value);`angle` 夹角(deg,带 value);`parallel`/`perpendicular` 平行/垂直(angle 0°/90° 语法糖);`fixed` 锚定部件(地基);`fixedPoint`/`fixedAxis`/`fixedRotation` 世界锚定 unary(把成员子实体钉到世界字面点/方向、锁朝向,平移其余 DOF 仍自由,仅 `solver:'global'` 支持);`face_mate` 为遗留别名(规范化为 mate,新代码不再使用)。
|
|
110
|
+
* @note EntityRef 四种形态:`{ part, face: { topoRef } | { surfaceType?, center, normal } }`、`{ part, edge: { topoRef } | { axis: { origin, direction } } }`、`{ part, point: [x,y,z] }`、`{ part, faceIndex }`(1 起,仅调试简写)。
|
|
111
|
+
* @note 不收敛(实体类型不匹配/环/参考不可达)→ 抛错并带 unsupported 明细;成员名为空串 → 求解前抛错;mesh 快照缺 axis 的圆柱/圆锥面作轴实体 → E_TOPO_NOT_FOUND(绝不静默降级)。`mate`(中心重合)与 `coincident`(只共面)是两种不同语义,不互相映射。
|
|
112
|
+
* @note 早期文档/示例曾用 `fixedPartId`/`movingPartId`/`faceRowIndex`/`faceId`/`invalid`——这些键在代码中不存在。真实契约是 `fixedPartName`/`movingPartName` + `fixedFace`/`movingFace`(遗留 face_mate)。`faceId` 字段随 §6.2 移除,不再写入。
|
|
113
|
+
* @param params.name - 装配名。type:string
|
|
114
|
+
* @param params.members - 成员(裸变量引用)。type:Shape[]
|
|
115
|
+
* @param params.constraints - 约束数组(遗留 face_mate 形态或上述新形态 { type, a, b })。type:AssemblyConstraint[]
|
|
116
|
+
* @example
|
|
117
|
+
* let asm1 = cad.assembly({ name: '主轴组件', members: [part0, part1, part2], constraints: [ { type: 'fixed', part: 'part0' }, { type: 'mate', a: { part: 'part0', face: { topoRef: { kind: 'face', origin: 'part0', role: 'box:top', hint: { kind: 'face', surfaceType: 'plane' } } } }, b: { part: 'part1', face: { topoRef: { kind: 'face', origin: 'part1', role: 'box:bottom', hint: { kind: 'face', surfaceType: 'plane' } } } } }, { type: 'concentric', a: { part: 'part1', face: { topoRef: { kind: 'face', origin: 'part1', role: '', hint: { kind: 'face', surfaceType: 'cylinder' } } } }, b: { part: 'part2', face: { topoRef: { kind: 'face', origin: 'part2', role: 'cylinder:lateral', hint: { kind: 'face', surfaceType: 'cylinder' } } } } } ] })
|
|
118
|
+
* asm1.solve()
|
|
119
|
+
*/
|
|
120
|
+
export function assembly(params) {
|
|
121
|
+
const members = params.members ?? [];
|
|
122
|
+
const constraints = params.constraints ?? [];
|
|
123
|
+
const joints = params.joints ?? [];
|
|
124
|
+
const drive = params.drive;
|
|
125
|
+
// P2-f1:约束参数运行期校验(keep() 之前,fail-fast;规则见 api/assembly/validate.ts V1–V6)
|
|
126
|
+
const memberNames = memberNamesOf(params, members);
|
|
127
|
+
validateConstraints(constraints, memberNames);
|
|
128
|
+
// P3:运动副构造期 fail-fast——parent/child ∈ members、child 唯一驱动、多 DOF 类型
|
|
129
|
+
// 在 assembly() 构造时暴露(buildJoint/buildKinematicTree 复用同一份校验实现)
|
|
130
|
+
if (joints.length > 0)
|
|
131
|
+
buildKinematicTree(memberNames, joints);
|
|
132
|
+
if (members.length > 0)
|
|
133
|
+
keep(...members);
|
|
134
|
+
const c = makeCompound(members);
|
|
135
|
+
const behavior = {
|
|
136
|
+
kind: 'assembly',
|
|
137
|
+
name: params.name,
|
|
138
|
+
memberNames,
|
|
139
|
+
constraints,
|
|
140
|
+
joints,
|
|
141
|
+
drive,
|
|
142
|
+
memberColors: params.memberColors,
|
|
143
|
+
solver: params.solver,
|
|
144
|
+
solve: () => solveTransforms(members, behavior),
|
|
145
|
+
solveDetailed: () => solveAssemblyAndKinematics(members, behavior.memberNames, behavior.constraints, behavior.joints ?? [], behavior.drive, { solver: behavior.solver, name: behavior.name }),
|
|
146
|
+
};
|
|
147
|
+
ensureSlot(c).behavior = behavior;
|
|
148
|
+
// solve / do_assemble 完全同义(方案 §5.5 D2:solve 为新名,do_assemble 保留为别名)
|
|
149
|
+
const solveAndRegister = () => {
|
|
150
|
+
// P6:只求解并登记待应用变换;应用与下游失效由引擎做(F2:库不查询/修改 DAG)
|
|
151
|
+
// P3:约束 + 运动副在库侧一次合并(solveAssemblyAndKinematics),transforms 与
|
|
152
|
+
// kinematics 一起登记(禁止引擎侧两次求解/两次登记)
|
|
153
|
+
const result = behavior.solveDetailed();
|
|
154
|
+
if (result.transforms.length > 0)
|
|
155
|
+
setPendingAssemblyTransforms(c, result.transforms);
|
|
156
|
+
if (result.kinematics)
|
|
157
|
+
setPendingAssemblyKinematics(c, result.kinematics);
|
|
158
|
+
};
|
|
159
|
+
c.do_assemble = solveAndRegister;
|
|
160
|
+
c.solve = solveAndRegister;
|
|
161
|
+
c.add_constraint = () => {
|
|
162
|
+
// Phase 1 semantics: constraints are read from the assembly statement's args.constraints;
|
|
163
|
+
// add_constraint is intentionally a no-op (kept for ABI uniformity).
|
|
164
|
+
};
|
|
165
|
+
return c;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=compound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compound.js","sourceRoot":"","sources":["../../../src/extra/ops/compound.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * faijs-extra compound — group/assembly 库函数(compound Shape + AssemblyBehavior)\n *\n *\n * 从 src/ops/assemble.ts 迁出并改写为 op 形态:\n * - `group(params)` → compound Shape(kind='compound',children 为成员 Shape 引用)\n * - `assembly(params)` → compound Shape + AssemblyBehavior(约束列表 + solve 方法)\n * - 装配求解(P1 起)委派 api/assembly/(chain-solver 内核):\n * do_assemble/solve 触发求解 → 引擎应用\n * (mesh 顶点烘焙 + BREP 刚体变换 + 下游传播)。\n * P2-f5:旧装配算法与自有四元数实现已删除,求解全链路走 api/assembly。\n *\n * compound 自身无独立 mesh——几何由 children 承载,意义是结构(层级)。\n * do_assemble 编译为 `await ctx.<asm>.do_assemble()`:调用 compound 的求解方法,\n * 对约束定位的成员施加装配变换(mesh 顶点烘焙 + BREP 刚体变换 + 下游传播)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { compound as makeCompound, ensureSlot, type CompoundShape } from '../../shape'\nimport { keep, nameOf, setPendingAssemblyTransforms, setPendingAssemblyKinematics, type AssemblyTransform } from '../../runtime-state'\nimport { solveAssemblyAndKinematics, type AssemblySolveResult } from '../../api/assembly/solve'\nimport { validateConstraints } from '../../api/assembly/validate'\nimport { buildKinematicTree, type JointSpec } from '../../api/assembly/joints'\nimport type { AssemblyConstraint } from '../../api/assembly/types'\nimport type { SolverStyle } from '../../api/assembly/solvers/types'\n\n// ── 参数类型(keep-syntax 设计 §2.5:成员保留由函数体 keep() 显式声明,不再靠类型标注) ──\n\n/** Parameters for the `group` op function: an optional name and ordered members. */\nexport interface GroupParams {\n name?: string\n /** Compound members: read-only references, never mutated by group/assembly. */\n members?: Shape[]\n memberNames?: string[]\n}\n\n/** Parameters for the `assembly` op function: group params plus assembly constraints. */\nexport interface AssemblyParams extends GroupParams {\n constraints?: AssemblyConstraint[]\n /** P3:运动副声明(可选;parent/child 必须是 members 里的名字)。 */\n joints?: JointSpec[]\n /** P3:驱动值覆盖(键 = child 成员名;值 = 主 DOF 数值或多 DOF 数组)。 */\n drive?: Record<string, number | number[]>\n /** cq-compat:成员颜色(sRGB 0..1),导出 STEP 时写入 XCAF。 */\n memberColors?: Record<string, [number, number, number]>\n /** P1:求解风格。'chain'(默认,链式拓扑解析)| 'global'(CadQuery 兼容全局最小二乘)。 */\n solver?: SolverStyle\n}\n\n// ── 约束类型(P1 起定义收口在 api/assembly/types,此处 re-export 保持既有导出面) ──\n\nexport type {\n AssemblyConstraint,\n FaceMateConstraint,\n FaceMateFace,\n EntityRef,\n FaceRef,\n EdgeRef,\n MateConstraint,\n AlignConstraint,\n CoincidentConstraint,\n ConcentricConstraint,\n DistanceConstraint,\n AngleConstraint,\n ParallelConstraint,\n PerpendicularConstraint,\n FixedConstraint,\n FixedPointConstraint,\n FixedAxisConstraint,\n FixedRotationConstraint,\n StructuralConstraint,\n AssemblyVec3,\n} from '../../api/assembly/types'\nexport type { AssemblySolveResult } from '../../api/assembly/solve'\n\n// ── 求解器 ──\n// P2-f5:旧装配算法与自有四元数实现已整体删除——旋转计算一律走\n// brepjs utils/quaternion.ts,输出经 api/assembly/pose.ts fromBrepjsQuat 重排。\n// (utils/quaternion.ts 已内化为第一方代码,函数名保留历史来源标识。)\n\n// 应用变换(mesh 顶点烘焙)下沉到引擎侧 src/mesh/rigid-transform.ts(E-b:\n// 引擎不得 import api/compound;公共 API 经本 re-export 保持)。\nexport { applyTransform } from '../../mesh/rigid-transform'\n\n// ── AssemblyBehavior ──\n\n/** Behavior attached to an assembly compound: its members, constraints, and solver. */\nexport interface AssemblyBehavior {\n /**\n * F3:声明来源判别符(`group` → 'group',`assembly` → 'assembly')。\n * `ExecutionResult.assemblies` 只收 'assembly'——group 无约束/关节,进装配声明面\n * 会让消费方(animation 宿主)对空约束集求解并撞欠定诊断。历史 behavior 无此字段\n * (旧持久化 compound)→ 视为非 assembly 声明。\n */\n kind?: 'group' | 'assembly'\n name?: string\n memberNames: string[]\n constraints: AssemblyConstraint[]\n /** P3:运动副声明(无 joints 时为空数组)。 */\n joints?: JointSpec[]\n /** P3:驱动值覆盖(键 = child 成员名;缺省 undefined = 用 joint 存储值)。 */\n drive?: Record<string, number | number[]>\n /** cq-compat:成员颜色(sRGB 0..1)。 */\n memberColors?: Record<string, [number, number, number]>\n /** P1:求解风格。 */\n solver?: SolverStyle\n /** 只求解(P6):返回\"成员下标 → 变换\"列表。不改写入参、不传播;可重复调用(幂等)。 */\n solve(): AssemblyTransform[]\n /** 只求解并带诊断量(P1):transforms + dof/converged/unsupported(方案 P1⑤);P3 增 kinematics/warnings。 */\n solveDetailed(): AssemblySolveResult\n}\n\n/**\n * F3:装配声明的**宿主消费形态**(`ExecutionResult.assemblies` 的元素,2026-10-15)。\n *\n * = AssemblyBehavior 的声明字段(去掉 solve/solveDetailed 方法)+ CompoundShape 引用。\n * 存在的理由:约束/关节声明此前只活在 compound 的 behavior 槽里,而 `getSlot` 未公开\n * 导出——宿主持不到声明,只能在 outputs 里逆结构。本类型把声明面提到 ExecutionResult\n * 一级字段,宿主据此在**自己的侧**做纯求解(禁烘焙:不调 asm.solve()/do_assemble(),\n * 不触发 applyPendingAssemblyTransforms),位姿只以 transform 数据在宿主侧流动。\n */\nexport interface AssemblyDecl {\n /** 装配名(cad.assembly 的 name 参数;未给则 undefined)。 */\n name?: string\n /** 成员变量名(声明序,与 compound children 同序)。 */\n memberNames: string[]\n /** 约束声明(原样携带,未经求解)。 */\n constraints: AssemblyConstraint[]\n /** 运动副声明(无 joints 时为空数组)。 */\n joints: JointSpec[]\n /** 求解风格('chain' 缺省 | 'global')。 */\n solver?: SolverStyle\n /** 装配 compound 本体(成员 Shape 经其 children 取用;也出现在 outputs 里)。 */\n compound: CompoundShape\n}\n\n/**\n * 纯求解(P6:求解 ≠ 传播):委派 api/assembly/solveAssembly(P1 起)。\n * 不修改任何输入、不触碰引擎状态——引擎负责应用变换并让下游失效重算(F2)。\n *\n * 约束形态(方案 §5):\n * - 遗留 face_mate:规范化为 mate 后降级为 chain-solver concentric + 轴编码求解(§3.7.2);\n * - 新形态 mate/align/coincident/concentric/distance/angle/parallel/perpendicular/fixed;\n * - 面参数 `{ topoRef }` 执行期解析(BREP 现场/mesh 行快照),旧 `{ center, normal }`\n * 快照直接使用(兼容已持久化的历史脚本);\n * - 输出为 per-member 终态(L6 修复),锚定成员不输出变换。\n */\nfunction solveTransforms(members: Shape[], behavior: AssemblyBehavior): AssemblyTransform[] {\n return solveAssemblyAndKinematics(\n members,\n behavior.memberNames,\n behavior.constraints,\n behavior.joints ?? [],\n behavior.drive,\n { solver: behavior.solver, name: behavior.name },\n ).transforms\n}\n\n// ── group / assembly 库函数 ──\n\n/**\n * 成员名推导:显式 memberNames 兼容旧手工构造 IR;否则经 keep() 反查\n * (P3 起经 keep()/nameOfShapes 反查成员名——库不再访问执行上下文,F1)。\n */\nfunction memberNamesOf(params: { memberNames?: unknown }, members: Shape[]): string[] {\n if (Array.isArray(params.memberNames) && params.memberNames.length > 0) {\n return params.memberNames as string[]\n }\n return members.map((m) => {\n // 兼容字符串形态的 members(历史 IR 直传 partName):字符串本身就是名字\n if (typeof m === 'string') return m\n return String(nameOf(m) ?? '')\n })\n}\n\n/**\n * `cad.group({ name, members })` → compound Shape。\n * members 是成员 Shape(编译产物 ctx.<var> 引用),成员名经 keep() 反查。\n *\n * 函数体 keep 声明(keep-syntax 设计 §2.5):group 保留其成员且可见(R6)。\n */\n/**\n * 分组:零约束,保持当前布局。结构语句,无几何输出,成员用变量名引用。\n * @group 结构\n * @inputs 1\n * @async false\n * @qual ok\n * @name group\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(无几何输出,服务于编辑器画布与时间线),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**。**平台侧需要几何复合体请用 `cad.compound`**(内核 `makeCompound`,持 OCCT 句柄,可变换/可导出)。\n * @returns CompoundShape 复合几何(kind='compound',children 为成员 Shape 引用)。\n * @param params.name - 组名。type:string\n * @param params.members - 成员(编译产物 ctx.<var> 引用;结构语句里是裸变量引用,非字符串数组)。type:Shape[]\n * @note members 在 .fai.js 里是裸变量引用(编译为 ctx.<var>),字符串数组形态的成员名经 keep() 反查兼容历史 IR。\n * @example\n * const part0 = cad.box(30, 20, 10, { centered: true })\n * cad.group({ name: '底板组', members: [part0] })\n */\nexport function group(params: GroupParams): CompoundShape {\n const members = (params.members as Shape[] | undefined) ?? []\n if (members.length > 0) keep(...members)\n const memberNames = memberNamesOf(params, members)\n const c = makeCompound(members)\n // 挂最小 behavior(memberNames 供 ExecutionResult.compounds 结构输出;group 无约束)\n ensureSlot(c).behavior = {\n kind: 'group',\n memberNames,\n constraints: [],\n joints: [],\n solve: () => [],\n solveDetailed: () => ({ transforms: [], dof: 0, converged: true, unsupported: [] }),\n }\n return c\n}\n\n/**\n * 装配:成员 + 约束。结构语句,无几何输出,成员用变量名引用、实体用 EntityRef / 拓扑引用。\n * 求解内核复用 chain-solver solveConstraints(链式拓扑调度 / DOF / converged /\n * unsupported 诊断);输出为 per-member 终态变换(每成员一条,恒等位姿不输出)。\n * @group 结构\n * @inputs 1\n * @async false\n * @qual warn\n * @name assembly\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(成员以编辑器结构语句形态声明,服务于画布与时间线),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns CompoundShape + AssemblyBehavior(含 do_assemble / solve 方法)。\n * @note 约束类型(a=参考、b=从动,移动 b 去贴合 a):`mate` 面对面贴合(法向反向+面中心重合,遗留 face_mate 的新名,求解降级为 concentric + 轴编码);`align` 同向对齐(法向同向+面中心重合);`coincident` 共面/共点/共线(保留面内 2 个平移 DOF);`concentric` 轴重合(孔轴配合,圆柱/圆锥面需 hint.axis,直边/圆边需 EdgeHint.axis);`distance` 定距(mm,带 value);`angle` 夹角(deg,带 value);`parallel`/`perpendicular` 平行/垂直(angle 0°/90° 语法糖);`fixed` 锚定部件(地基);`fixedPoint`/`fixedAxis`/`fixedRotation` 世界锚定 unary(把成员子实体钉到世界字面点/方向、锁朝向,平移其余 DOF 仍自由,仅 `solver:'global'` 支持);`face_mate` 为遗留别名(规范化为 mate,新代码不再使用)。\n * @note EntityRef 四种形态:`{ part, face: { topoRef } | { surfaceType?, center, normal } }`、`{ part, edge: { topoRef } | { axis: { origin, direction } } }`、`{ part, point: [x,y,z] }`、`{ part, faceIndex }`(1 起,仅调试简写)。\n * @note 不收敛(实体类型不匹配/环/参考不可达)→ 抛错并带 unsupported 明细;成员名为空串 → 求解前抛错;mesh 快照缺 axis 的圆柱/圆锥面作轴实体 → E_TOPO_NOT_FOUND(绝不静默降级)。`mate`(中心重合)与 `coincident`(只共面)是两种不同语义,不互相映射。\n * @note 早期文档/示例曾用 `fixedPartId`/`movingPartId`/`faceRowIndex`/`faceId`/`invalid`——这些键在代码中不存在。真实契约是 `fixedPartName`/`movingPartName` + `fixedFace`/`movingFace`(遗留 face_mate)。`faceId` 字段随 §6.2 移除,不再写入。\n * @param params.name - 装配名。type:string\n * @param params.members - 成员(裸变量引用)。type:Shape[]\n * @param params.constraints - 约束数组(遗留 face_mate 形态或上述新形态 { type, a, b })。type:AssemblyConstraint[]\n * @example\n * let asm1 = cad.assembly({ name: '主轴组件', members: [part0, part1, part2], constraints: [ { type: 'fixed', part: 'part0' }, { type: 'mate', a: { part: 'part0', face: { topoRef: { kind: 'face', origin: 'part0', role: 'box:top', hint: { kind: 'face', surfaceType: 'plane' } } } }, b: { part: 'part1', face: { topoRef: { kind: 'face', origin: 'part1', role: 'box:bottom', hint: { kind: 'face', surfaceType: 'plane' } } } } }, { type: 'concentric', a: { part: 'part1', face: { topoRef: { kind: 'face', origin: 'part1', role: '', hint: { kind: 'face', surfaceType: 'cylinder' } } } }, b: { part: 'part2', face: { topoRef: { kind: 'face', origin: 'part2', role: 'cylinder:lateral', hint: { kind: 'face', surfaceType: 'cylinder' } } } } } ] })\n * asm1.solve()\n */\nexport function assembly(params: AssemblyParams): CompoundShape {\n const members = (params.members as Shape[] | undefined) ?? []\n const constraints = (params.constraints as AssemblyConstraint[] | undefined) ?? []\n const joints = (params.joints as JointSpec[] | undefined) ?? []\n const drive = params.drive as Record<string, number | number[]> | undefined\n\n // P2-f1:约束参数运行期校验(keep() 之前,fail-fast;规则见 api/assembly/validate.ts V1–V6)\n const memberNames = memberNamesOf(params, members)\n validateConstraints(constraints, memberNames)\n // P3:运动副构造期 fail-fast——parent/child ∈ members、child 唯一驱动、多 DOF 类型\n // 在 assembly() 构造时暴露(buildJoint/buildKinematicTree 复用同一份校验实现)\n if (joints.length > 0) buildKinematicTree(memberNames, joints)\n\n if (members.length > 0) keep(...members)\n const c = makeCompound(members)\n const behavior: AssemblyBehavior = {\n kind: 'assembly',\n name: params.name as string | undefined,\n memberNames,\n constraints,\n joints,\n drive,\n memberColors: params.memberColors,\n solver: params.solver,\n solve: () => solveTransforms(members, behavior),\n solveDetailed: () =>\n solveAssemblyAndKinematics(\n members,\n behavior.memberNames,\n behavior.constraints,\n behavior.joints ?? [],\n behavior.drive,\n { solver: behavior.solver, name: behavior.name },\n ),\n }\n ensureSlot(c).behavior = behavior\n // solve / do_assemble 完全同义(方案 §5.5 D2:solve 为新名,do_assemble 保留为别名)\n const solveAndRegister = (): void => {\n // P6:只求解并登记待应用变换;应用与下游失效由引擎做(F2:库不查询/修改 DAG)\n // P3:约束 + 运动副在库侧一次合并(solveAssemblyAndKinematics),transforms 与\n // kinematics 一起登记(禁止引擎侧两次求解/两次登记)\n const result = behavior.solveDetailed()\n if (result.transforms.length > 0) setPendingAssemblyTransforms(c, result.transforms)\n if (result.kinematics) setPendingAssemblyKinematics(c, result.kinematics)\n }\n ;(c as CompoundShape & { do_assemble?: () => void }).do_assemble = solveAndRegister\n ;(c as CompoundShape & { solve?: () => void }).solve = solveAndRegister\n // 统一成员调用 ABI:add_constraint 是 no-op(现状语义:约束由 assembly 语句 args.constraints 读取,\n // 编译产物机械发射 `ctx.<asm>.add_constraint({...})`,调用此方法不崩)\n ;(c as CompoundShape & { add_constraint?: () => void }).add_constraint = () => {\n // Phase 1 semantics: constraints are read from the assembly statement's args.constraints;\n // add_constraint is intentionally a no-op (kept for ABI uniformity).\n }\n return c\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* faijs-extra copy — 深拷贝几何(方案 B:独立新对象,源不变)
|
|
3
|
+
*
|
|
4
|
+
*
|
|
5
|
+
* copy 是"共享读取"(克隆出新对象,源不变),与 drill/transform 的"独占改写"本质不同:
|
|
6
|
+
* - **copy 不消费其源**(从消费方排除,与 group/assembly 同级)
|
|
7
|
+
* - copy 输出是独立新对象 → 归"新名"类(allocate-id.ts 不保名)
|
|
8
|
+
* - **源显示**(part0=box; part1=copy(part0) → 画布显示 box 和副本两份)
|
|
9
|
+
*
|
|
10
|
+
* 双链路:
|
|
11
|
+
* - mesh 路径:深拷贝 positions/indices 到新数组
|
|
12
|
+
* - BREP 路径:kernel.copy(inputSolid) → solidToShape → fromBrep 登记
|
|
13
|
+
*/
|
|
14
|
+
import type { Shape } from '../../mesh/types.js';
|
|
15
|
+
/**
|
|
16
|
+
* `cad.copy(input)` → 深拷贝 Shape。
|
|
17
|
+
*
|
|
18
|
+
* 函数体 keep 声明(keep-syntax 设计 §2.5):copy 保留其源(可见)——
|
|
19
|
+
* keep(input) 使源变量保持终端(画布显示 box 和副本两份)。
|
|
20
|
+
*
|
|
21
|
+
* mesh 路径:positions/indices 复制到新数组(改副本不影响源)。
|
|
22
|
+
* BREP 路径:kernel.copy 产出独立 ShapeHandle。
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* 深拷贝几何为独立新对象(源不变,源与副本都显示)。
|
|
26
|
+
* @group 特征
|
|
27
|
+
* @inputs 1
|
|
28
|
+
* @async false
|
|
29
|
+
* @qual ok
|
|
30
|
+
* @name copy
|
|
31
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(语义含编辑器画布显示——源与副本各显示一份),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。
|
|
32
|
+
* @param input - 源几何。type:Shape required:true
|
|
33
|
+
* @returns Shape 源几何的深拷贝。copy 不消费其源(画布显示 box 和副本两份),改副本不影响源。
|
|
34
|
+
* @example
|
|
35
|
+
* const part1 = cad.copy(part0)
|
|
36
|
+
*/
|
|
37
|
+
export declare const copy: ((input: Shape) => Promise<Shape>) & {
|
|
38
|
+
__faijs__dualOp?: import("../../define-op.js").DualOpMeta;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=copy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../../src/extra/ops/copy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAmC7C;;;;;;;;GAQG;AACH;;;;;;;;;;;;IAYI;AACJ,eAAO,MAAM,IAAI;;CAkBf,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* faijs-extra copy — 深拷贝几何(方案 B:独立新对象,源不变)
|
|
3
|
+
*
|
|
4
|
+
*
|
|
5
|
+
* copy 是"共享读取"(克隆出新对象,源不变),与 drill/transform 的"独占改写"本质不同:
|
|
6
|
+
* - **copy 不消费其源**(从消费方排除,与 group/assembly 同级)
|
|
7
|
+
* - copy 输出是独立新对象 → 归"新名"类(allocate-id.ts 不保名)
|
|
8
|
+
* - **源显示**(part0=box; part1=copy(part0) → 画布显示 box 和副本两份)
|
|
9
|
+
*
|
|
10
|
+
* 双链路:
|
|
11
|
+
* - mesh 路径:深拷贝 positions/indices 到新数组
|
|
12
|
+
* - BREP 路径:kernel.copy(inputSolid) → solidToShape → fromBrep 登记
|
|
13
|
+
*/
|
|
14
|
+
import { solidToShape } from '../../brep/brep-ops.js';
|
|
15
|
+
import { identityEvolution, identityHashEvolution } from '../../brep/face-evolution.js';
|
|
16
|
+
import { getBrepApi } from '../../brep/handle-bridge.js';
|
|
17
|
+
import { keep } from '../../runtime-state.js';
|
|
18
|
+
import { fromBrep, brepOf, inputRoleTable } from '../../shape.js';
|
|
19
|
+
import { propagateAllOrigins } from '../../topology/naming/roles.js';
|
|
20
|
+
import { defineOp } from '../../sdk.js';
|
|
21
|
+
/** BREP 路径:kernel.copy 深拷贝实体 + 恒等面演化 + 恒等 roleTable 传播 + fromBrep 一次登记。 */
|
|
22
|
+
function copyBrep(input) {
|
|
23
|
+
const kernel = getBrepApi();
|
|
24
|
+
const inputSolid = brepOf(input);
|
|
25
|
+
if (inputSolid === undefined)
|
|
26
|
+
throw new Error('[extra/copy] input is not BREP');
|
|
27
|
+
const copiedSolid = kernel.copy(inputSolid);
|
|
28
|
+
// §2.4/§3.3:copy 面 1:1 保留——hash 恒等传播 roleTable(所有 origin)
|
|
29
|
+
const inputTable = inputRoleTable(input);
|
|
30
|
+
let roleTable;
|
|
31
|
+
if (inputTable && inputTable.size > 0) {
|
|
32
|
+
roleTable = propagateAllOrigins(inputTable, identityHashEvolution(kernel, inputSolid, copiedSolid));
|
|
33
|
+
}
|
|
34
|
+
return fromBrep(solidToShape(kernel, copiedSolid), {
|
|
35
|
+
solid: copiedSolid,
|
|
36
|
+
// copy 不改变拓扑,面 ordinal 不变
|
|
37
|
+
faceEvolution: identityEvolution(kernel, copiedSolid),
|
|
38
|
+
roleTable,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* `cad.copy(input)` → 深拷贝 Shape。
|
|
43
|
+
*
|
|
44
|
+
* 函数体 keep 声明(keep-syntax 设计 §2.5):copy 保留其源(可见)——
|
|
45
|
+
* keep(input) 使源变量保持终端(画布显示 box 和副本两份)。
|
|
46
|
+
*
|
|
47
|
+
* mesh 路径:positions/indices 复制到新数组(改副本不影响源)。
|
|
48
|
+
* BREP 路径:kernel.copy 产出独立 ShapeHandle。
|
|
49
|
+
*/
|
|
50
|
+
/**
|
|
51
|
+
* 深拷贝几何为独立新对象(源不变,源与副本都显示)。
|
|
52
|
+
* @group 特征
|
|
53
|
+
* @inputs 1
|
|
54
|
+
* @async false
|
|
55
|
+
* @qual ok
|
|
56
|
+
* @name copy
|
|
57
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(语义含编辑器画布显示——源与副本各显示一份),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。
|
|
58
|
+
* @param input - 源几何。type:Shape required:true
|
|
59
|
+
* @returns Shape 源几何的深拷贝。copy 不消费其源(画布显示 box 和副本两份),改副本不影响源。
|
|
60
|
+
* @example
|
|
61
|
+
* const part1 = cad.copy(part0)
|
|
62
|
+
*/
|
|
63
|
+
export const copy = defineOp({
|
|
64
|
+
mesh: (input) => {
|
|
65
|
+
if (!input)
|
|
66
|
+
throw new Error('[extra/copy] no input geometry');
|
|
67
|
+
keep(input);
|
|
68
|
+
// mesh 路径:深拷贝到新 TypedArray(改副本不影响源)
|
|
69
|
+
return {
|
|
70
|
+
positions: new Float32Array(input.positions),
|
|
71
|
+
indices: new Uint32Array(input.indices),
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
brep: (input) => {
|
|
75
|
+
if (!input)
|
|
76
|
+
throw new Error('[extra/copy] no input geometry');
|
|
77
|
+
keep(input);
|
|
78
|
+
return copyBrep(input);
|
|
79
|
+
},
|
|
80
|
+
naming: { kind: 'identity' },
|
|
81
|
+
paramDims: {},
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/extra/ops/copy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAGjE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAGpC,2EAA2E;AAC3E,SAAS,QAAQ,CAAC,KAAY;IAC5B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAA2B,CAAA;IAC1D,IAAI,UAAU,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IAE/E,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAE3C,0DAA0D;IAC1D,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAA0B,CAAA;IACjE,IAAI,SAAgC,CAAA;IACpC,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACtC,SAAS,GAAG,mBAAmB,CAAC,UAAU,EAAE,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAA;IACrG,CAAC;IAED,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE;QACjD,KAAK,EAAE,WAAW;QAClB,0BAA0B;QAC1B,aAAa,EAAE,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC;QACrD,SAAS;KACV,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH;;;;;;;;;;;;IAYI;AACJ,MAAM,CAAC,MAAM,IAAI,GAAG,QAAQ,CAAC;IAC3B,IAAI,EAAE,CAAC,KAAY,EAAE,EAAE;QACrB,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QAC7D,IAAI,CAAC,KAAK,CAAC,CAAA;QACX,oCAAoC;QACpC,OAAO;YACL,SAAS,EAAE,IAAI,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC;YAC5C,OAAO,EAAE,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;SACxC,CAAA;IACH,CAAC;IACD,IAAI,EAAE,CAAC,KAAY,EAAE,EAAE;QACrB,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QAC7D,IAAI,CAAC,KAAK,CAAC,CAAA;QACX,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC;IACD,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAgB;IAE1C,SAAS,EAAE,EAAE;CACd,CAAC,CAAA","sourcesContent":["/**\n * faijs-extra copy — 深拷贝几何(方案 B:独立新对象,源不变)\n *\n *\n * copy 是\"共享读取\"(克隆出新对象,源不变),与 drill/transform 的\"独占改写\"本质不同:\n * - **copy 不消费其源**(从消费方排除,与 group/assembly 同级)\n * - copy 输出是独立新对象 → 归\"新名\"类(allocate-id.ts 不保名)\n * - **源显示**(part0=box; part1=copy(part0) → 画布显示 box 和副本两份)\n *\n * 双链路:\n * - mesh 路径:深拷贝 positions/indices 到新数组\n * - BREP 路径:kernel.copy(inputSolid) → solidToShape → fromBrep 登记\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { solidToShape } from '../../brep/brep-ops'\nimport { identityEvolution, identityHashEvolution } from '../../brep/face-evolution'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport { keep } from '../../runtime-state'\nimport { fromBrep, brepOf, inputRoleTable } from '../../shape'\nimport { propagateAllOrigins } from '../../topology/naming/roles'\nimport type { RoleTable } from '../../topology/naming/types'\nimport type { Provenance } from '../../topology/naming/lineage'\nimport { defineOp } from '../../sdk'\nimport type { BrepHandle } from '../../brep/engine/types'\n\n/** BREP 路径:kernel.copy 深拷贝实体 + 恒等面演化 + 恒等 roleTable 传播 + fromBrep 一次登记。 */\nfunction copyBrep(input: Shape): Shape {\n const kernel = getBrepApi()\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (inputSolid === undefined) throw new Error('[extra/copy] input is not BREP')\n\n const copiedSolid = kernel.copy(inputSolid)\n\n // §2.4/§3.3:copy 面 1:1 保留——hash 恒等传播 roleTable(所有 origin)\n const inputTable = inputRoleTable(input) as RoleTable | undefined\n let roleTable: RoleTable | undefined\n if (inputTable && inputTable.size > 0) {\n roleTable = propagateAllOrigins(inputTable, identityHashEvolution(kernel, inputSolid, copiedSolid))\n }\n\n return fromBrep(solidToShape(kernel, copiedSolid), {\n solid: copiedSolid,\n // copy 不改变拓扑,面 ordinal 不变\n faceEvolution: identityEvolution(kernel, copiedSolid),\n roleTable,\n })\n}\n\n/**\n * `cad.copy(input)` → 深拷贝 Shape。\n *\n * 函数体 keep 声明(keep-syntax 设计 §2.5):copy 保留其源(可见)——\n * keep(input) 使源变量保持终端(画布显示 box 和副本两份)。\n *\n * mesh 路径:positions/indices 复制到新数组(改副本不影响源)。\n * BREP 路径:kernel.copy 产出独立 ShapeHandle。\n */\n/**\n * 深拷贝几何为独立新对象(源不变,源与副本都显示)。\n * @group 特征\n * @inputs 1\n * @async false\n * @qual ok\n * @name copy\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(语义含编辑器画布显示——源与副本各显示一份),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @param input - 源几何。type:Shape required:true\n * @returns Shape 源几何的深拷贝。copy 不消费其源(画布显示 box 和副本两份),改副本不影响源。\n * @example\n * const part1 = cad.copy(part0)\n */\nexport const copy = defineOp({\n mesh: (input: Shape) => {\n if (!input) throw new Error('[extra/copy] no input geometry')\n keep(input)\n // mesh 路径:深拷贝到新 TypedArray(改副本不影响源)\n return {\n positions: new Float32Array(input.positions),\n indices: new Uint32Array(input.indices),\n }\n },\n brep: (input: Shape) => {\n if (!input) throw new Error('[extra/copy] no input geometry')\n keep(input)\n return copyBrep(input)\n },\n naming: { kind: 'identity' } as Provenance,\n\n paramDims: {},\n})\n"]}
|