@faicad/faijs 0.13.1 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +30 -4
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/boolean.d.ts +19 -0
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +51 -10
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +8 -7
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/compound-geom.d.ts +45 -0
- package/dist/api/compound-geom.d.ts.map +1 -0
- package/dist/api/compound-geom.js +85 -0
- package/dist/api/compound-geom.js.map +1 -0
- package/dist/api/compound.d.ts +2 -0
- package/dist/api/compound.d.ts.map +1 -1
- package/dist/api/compound.js +2 -0
- package/dist/api/compound.js.map +1 -1
- package/dist/api/copy.d.ts +1 -0
- package/dist/api/copy.d.ts.map +1 -1
- package/dist/api/copy.js +4 -2
- package/dist/api/copy.js.map +1 -1
- package/dist/api/edge-ref.d.ts +3 -2
- package/dist/api/edge-ref.d.ts.map +1 -1
- package/dist/api/edge-ref.js +10 -6
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +1 -0
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +131 -3
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.d.ts.map +1 -1
- package/dist/api/face-ref.js +7 -4
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/fai_drill.d.ts +1 -1
- package/dist/api/fai_drill.d.ts.map +1 -1
- package/dist/api/fai_drill.js +31 -18
- package/dist/api/fai_drill.js.map +1 -1
- package/dist/api/fai_extrude.d.ts +1 -1
- package/dist/api/fai_extrude.d.ts.map +1 -1
- package/dist/api/fai_extrude.js +2 -1
- package/dist/api/fai_extrude.js.map +1 -1
- package/dist/api/fai_split.d.ts +1 -1
- package/dist/api/fai_split.d.ts.map +1 -1
- package/dist/api/fai_split.js +2 -1
- package/dist/api/fai_split.js.map +1 -1
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +6 -5
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/operations.js +16 -16
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
- package/dist/api/generated/script-face-manifest.js +0 -1
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +1 -4
- package/dist/api/generated/script-face.d.ts.map +1 -1
- package/dist/api/generated/script-face.js +2 -3
- package/dist/api/generated/script-face.js.map +1 -1
- package/dist/api/generated/sketching.js +1 -1
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/topology.d.ts +0 -48
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +20 -62
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/import-brep.d.ts +36 -0
- package/dist/api/import-brep.d.ts.map +1 -0
- package/dist/api/import-brep.js +72 -0
- package/dist/api/import-brep.js.map +1 -0
- package/dist/api/import-step.d.ts +28 -0
- package/dist/api/import-step.d.ts.map +1 -0
- package/dist/api/import-step.js +57 -0
- package/dist/api/import-step.js.map +1 -0
- package/dist/api/index.d.ts +7 -2
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +19 -5
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +2 -0
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +10 -2
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/knurl.d.ts.map +1 -1
- package/dist/api/knurl.js +1 -0
- package/dist/api/knurl.js.map +1 -1
- package/dist/api/load.d.ts +3 -1
- package/dist/api/load.d.ts.map +1 -1
- package/dist/api/load.js +3 -1
- package/dist/api/load.js.map +1 -1
- package/dist/api/pattern.d.ts +32 -0
- package/dist/api/pattern.d.ts.map +1 -0
- package/dist/api/pattern.js +121 -0
- package/dist/api/pattern.js.map +1 -0
- package/dist/api/place.d.ts +35 -0
- package/dist/api/place.d.ts.map +1 -0
- package/dist/api/place.js +113 -0
- package/dist/api/place.js.map +1 -0
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +10 -3
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/screw.d.ts.map +1 -1
- package/dist/api/screw.js +1 -0
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts.map +1 -1
- package/dist/api/sdf.js +1 -0
- package/dist/api/sdf.js.map +1 -1
- package/dist/api/sketch.d.ts.map +1 -1
- package/dist/api/sketch.js +1 -0
- package/dist/api/sketch.js.map +1 -1
- package/dist/api/split.d.ts +31 -0
- package/dist/api/split.d.ts.map +1 -0
- package/dist/api/split.js +96 -0
- package/dist/api/split.js.map +1 -0
- package/dist/api/surface/arg-spec.d.ts +9 -0
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +49 -30
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/svgExtrude.d.ts.map +1 -1
- package/dist/api/svgExtrude.js +1 -0
- package/dist/api/svgExtrude.js.map +1 -1
- package/dist/api/text.d.ts.map +1 -1
- package/dist/api/text.js +1 -0
- package/dist/api/text.js.map +1 -1
- package/dist/api/topo-resolve.d.ts.map +1 -1
- package/dist/api/topo-resolve.js +65 -3
- package/dist/api/topo-resolve.js.map +1 -1
- package/dist/api/transform.d.ts +4 -0
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +44 -12
- package/dist/api/transform.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +34 -1
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +62 -22
- 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 +8 -0
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +6 -1
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +24 -1
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +17 -0
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/types.d.ts +49 -6
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +6 -1
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/face-evolution.d.ts +78 -8
- package/dist/brep/face-evolution.d.ts.map +1 -1
- package/dist/brep/face-evolution.js +130 -17
- package/dist/brep/face-evolution.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +27 -1
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/browser.d.ts +0 -2
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +2 -2
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +19 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +21 -1
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +44 -3
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +46 -3
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.d.ts +2 -0
- package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.js +9 -1
- package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +14 -4
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/module-registry.d.ts +3 -1
- package/dist/cad-runtime/module-registry.d.ts.map +1 -1
- package/dist/cad-runtime/module-registry.js +13 -1
- package/dist/cad-runtime/module-registry.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +7 -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-concurrent-error.d.ts +38 -0
- package/dist/cad-runtime/runtime-concurrent-error.d.ts.map +1 -0
- package/dist/cad-runtime/runtime-concurrent-error.js +43 -0
- package/dist/cad-runtime/runtime-concurrent-error.js.map +1 -0
- package/dist/cad-runtime/runtime.d.ts +54 -2
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +186 -10
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +22 -0
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +82 -12
- package/dist/define-op.js.map +1 -1
- package/dist/fcstd/attachment.d.ts +72 -0
- package/dist/fcstd/attachment.d.ts.map +1 -0
- package/dist/fcstd/attachment.js +93 -0
- package/dist/fcstd/attachment.js.map +1 -0
- package/dist/fcstd/build-fai-zip.d.ts +11 -0
- package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
- package/dist/fcstd/build-fai-zip.js +21 -8
- package/dist/fcstd/build-fai-zip.js.map +1 -1
- package/dist/fcstd/cli.d.ts +3 -0
- package/dist/fcstd/cli.d.ts.map +1 -0
- package/dist/fcstd/cli.js +37 -0
- package/dist/fcstd/cli.js.map +1 -0
- package/dist/fcstd/codegen.d.ts +23 -1
- package/dist/fcstd/codegen.d.ts.map +1 -1
- package/dist/fcstd/codegen.js +159 -48
- package/dist/fcstd/codegen.js.map +1 -1
- package/dist/fcstd/container.d.ts +16 -1
- package/dist/fcstd/container.d.ts.map +1 -1
- package/dist/fcstd/container.js +12 -1
- package/dist/fcstd/container.js.map +1 -1
- package/dist/fcstd/contour.d.ts +9 -1
- package/dist/fcstd/contour.d.ts.map +1 -1
- package/dist/fcstd/contour.js +28 -18
- package/dist/fcstd/contour.js.map +1 -1
- package/dist/fcstd/convert.d.ts +31 -2
- package/dist/fcstd/convert.d.ts.map +1 -1
- package/dist/fcstd/convert.js +73 -22
- package/dist/fcstd/convert.js.map +1 -1
- package/dist/fcstd/document.d.ts +8 -1
- package/dist/fcstd/document.d.ts.map +1 -1
- package/dist/fcstd/document.js +4 -1
- package/dist/fcstd/document.js.map +1 -1
- package/dist/fcstd/expressions.d.ts +14 -1
- package/dist/fcstd/expressions.d.ts.map +1 -1
- package/dist/fcstd/expressions.js +11 -1
- package/dist/fcstd/expressions.js.map +1 -1
- package/dist/fcstd/external-geo.d.ts +27 -2
- package/dist/fcstd/external-geo.d.ts.map +1 -1
- package/dist/fcstd/external-geo.js +23 -2
- package/dist/fcstd/external-geo.js.map +1 -1
- package/dist/fcstd/feature-translate.d.ts +85 -3
- package/dist/fcstd/feature-translate.d.ts.map +1 -1
- package/dist/fcstd/feature-translate.js +189 -9
- package/dist/fcstd/feature-translate.js.map +1 -1
- package/dist/fcstd/index.d.ts +23 -0
- package/dist/fcstd/index.d.ts.map +1 -0
- package/dist/fcstd/index.js +19 -0
- package/dist/fcstd/index.js.map +1 -0
- package/dist/fcstd/placement.d.ts +49 -6
- package/dist/fcstd/placement.d.ts.map +1 -1
- package/dist/fcstd/placement.js +46 -6
- package/dist/fcstd/placement.js.map +1 -1
- package/dist/fcstd/planegcs-backend.d.ts +16 -1
- package/dist/fcstd/planegcs-backend.d.ts.map +1 -1
- package/dist/fcstd/planegcs-backend.js +16 -1
- package/dist/fcstd/planegcs-backend.js.map +1 -1
- package/dist/fcstd/sketch-parse.d.ts +43 -0
- package/dist/fcstd/sketch-parse.d.ts.map +1 -1
- package/dist/fcstd/sketch-parse.js +26 -0
- package/dist/fcstd/sketch-parse.js.map +1 -1
- package/dist/fcstd/sketch-solver.d.ts +20 -2
- package/dist/fcstd/sketch-solver.d.ts.map +1 -1
- package/dist/fcstd/sketch-solver.js +6 -1
- package/dist/fcstd/sketch-solver.js.map +1 -1
- package/dist/fcstd/sketch-verify.d.ts +19 -1
- package/dist/fcstd/sketch-verify.d.ts.map +1 -1
- package/dist/fcstd/sketch-verify.js +14 -1
- package/dist/fcstd/sketch-verify.js.map +1 -1
- package/dist/fcstd/structural-types.d.ts +83 -0
- package/dist/fcstd/structural-types.d.ts.map +1 -0
- package/dist/fcstd/structural-types.js +116 -0
- package/dist/fcstd/structural-types.js.map +1 -0
- package/dist/fcstd/unpack.d.ts +21 -2
- package/dist/fcstd/unpack.d.ts.map +1 -1
- package/dist/fcstd/unpack.js +11 -2
- package/dist/fcstd/unpack.js.map +1 -1
- package/dist/fcstd-convert.d.ts +30 -0
- package/dist/fcstd-convert.d.ts.map +1 -0
- package/dist/fcstd-convert.js +27 -0
- package/dist/fcstd-convert.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lang/determinism-scanner.d.ts +62 -0
- package/dist/lang/determinism-scanner.d.ts.map +1 -0
- package/dist/lang/determinism-scanner.js +619 -0
- package/dist/lang/determinism-scanner.js.map +1 -0
- package/dist/lang/symbol-table.generated.d.ts +7 -3
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +7 -3
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +3 -2
- package/dist/mesh/index.js.map +1 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +56 -2
- package/dist/node-host/cli.js.map +1 -1
- package/dist/runtime-state.d.ts +18 -6
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +9 -1
- package/dist/runtime-state.js.map +1 -1
- package/dist/shape.d.ts +15 -0
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +26 -3
- package/dist/shape.js.map +1 -1
- package/dist/topology/naming/build-naming.d.ts +14 -30
- package/dist/topology/naming/build-naming.d.ts.map +1 -1
- package/dist/topology/naming/build-naming.js +21 -54
- package/dist/topology/naming/build-naming.js.map +1 -1
- package/dist/topology/naming/capture-topo-ref.d.ts.map +1 -1
- package/dist/topology/naming/capture-topo-ref.js +5 -0
- package/dist/topology/naming/capture-topo-ref.js.map +1 -1
- package/dist/topology/naming/index.d.ts +3 -0
- package/dist/topology/naming/index.d.ts.map +1 -1
- package/dist/topology/naming/index.js +3 -0
- package/dist/topology/naming/index.js.map +1 -1
- package/dist/topology/naming/lineage-resolve.d.ts +80 -0
- package/dist/topology/naming/lineage-resolve.d.ts.map +1 -0
- package/dist/topology/naming/lineage-resolve.js +120 -0
- package/dist/topology/naming/lineage-resolve.js.map +1 -0
- package/dist/topology/naming/lineage.d.ts +349 -0
- package/dist/topology/naming/lineage.d.ts.map +1 -0
- package/dist/topology/naming/lineage.js +398 -0
- package/dist/topology/naming/lineage.js.map +1 -0
- package/dist/topology/naming/migrate.d.ts +41 -0
- package/dist/topology/naming/migrate.d.ts.map +1 -0
- package/dist/topology/naming/migrate.js +88 -0
- package/dist/topology/naming/migrate.js.map +1 -0
- package/dist/topology/naming/role-name.d.ts +176 -0
- package/dist/topology/naming/role-name.d.ts.map +1 -0
- package/dist/topology/naming/role-name.js +344 -0
- package/dist/topology/naming/role-name.js.map +1 -0
- package/dist/topology/naming/roles.d.ts +20 -22
- package/dist/topology/naming/roles.d.ts.map +1 -1
- package/dist/topology/naming/roles.js +51 -49
- package/dist/topology/naming/roles.js.map +1 -1
- package/dist/topology/naming/types.d.ts +65 -18
- package/dist/topology/naming/types.d.ts.map +1 -1
- package/dist/topology/naming/types.js.map +1 -1
- package/dist/weapp.d.ts +22 -0
- package/dist/weapp.d.ts.map +1 -0
- package/dist/weapp.js +23 -0
- package/dist/weapp.js.map +1 -0
- package/package.json +18 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svgExtrude.d.ts","sourceRoot":"","sources":["../../src/api/svgExtrude.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"svgExtrude.d.ts","sourceRoot":"","sources":["../../src/api/svgExtrude.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAc1C;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAK5E;AAeD;;;;;;;;;;;;;;IAcI;AACJ,eAAO,MAAM,UAAU;;CAoBrB,CAAA"}
|
package/dist/api/svgExtrude.js
CHANGED
|
@@ -69,5 +69,6 @@ export const svgExtrude = defineOp({
|
|
|
69
69
|
const svgText = await resolveSvgArg(params.svg, { assets: getBackends().assets });
|
|
70
70
|
return svgExtrudeBrep(params, svgText);
|
|
71
71
|
},
|
|
72
|
+
naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } },
|
|
72
73
|
});
|
|
73
74
|
//# sourceMappingURL=svgExtrude.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svgExtrude.js","sourceRoot":"","sources":["../../src/api/svgExtrude.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"svgExtrude.js","sourceRoot":"","sources":["../../src/api/svgExtrude.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAG/C;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA+B;IACpE,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC3F,CAAC;IACD,oBAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAA;AACxD,CAAC;AAED,oEAAoE;AACpE,SAAS,cAAc,CAAC,MAA+B,EAAE,OAAe;IACtE,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAA4B,CAAA;IAChE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IAElE,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;QAC9C,KAAK,EAAE,MAAM,CAAC,KAAe;QAC7B,cAAc,EAAG,MAAM,CAAC,cAAqC,IAAI,EAAE;KACpE,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;AAC5E,CAAC;AAED;;;;;;;;;;;;;;IAcI;AACJ,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;IACjC,IAAI,EAAE,KAAK,EAAE,MAA+B,EAAE,EAAE;QAC9C,sBAAsB,CAAC,MAAM,CAAC,CAAA;QAC9B,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,MAAmC,EAAE,CAAC,CAAA;QAC9G,uCAAuC;QACvC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;QACpE,OAAO,GAAG,CAAC,UAAU,CAAC;YACpB,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,MAAM,CAAC,KAAe;YAC7B,cAAc,EAAG,MAAM,CAAC,cAAqC,IAAI,EAAE;YACnE,YAAY;YACZ,aAAa;SACd,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,EAAE,KAAK,EAAE,MAA+B,EAAE,EAAE;QAC9C,sBAAsB,CAAC,MAAM,CAAC,CAAA;QAC9B,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,MAAmC,EAAE,CAAC,CAAA;QAC9G,OAAO,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACxC,CAAC;IACD,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,EAAgB;CACtF,CAAC,CAAA","sourcesContent":["/**\n * stdlib svgExtrude — SVG 挤出创建库函数(creator 函数,无输入)\n *\n *\n * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '../mesh/types'\nimport type { AssetResolver } from '../cad-runtime/ports'\nimport { cad } from '../mesh'\nimport { parseSvgNaturalSize } from '../primitives/parse-svg-size'\nimport { svgToSolid } from '../brep/svg/svg-to-solid'\nimport { solidToShape } from '../brep/brep-ops'\nimport { resolveSvgArg } from './internal/svg-asset-resolver'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { assertPositiveNumber } from './assert'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/**\n * Validate svgExtrude parameters: `svg` is required and `depth` must be a\n * positive number.\n * @param params - the raw svgExtrude operation parameters.\n */\nexport function assertSvgExtrudeParams(params: Record<string, unknown>): void {\n if (params.svg === undefined || params.svg === null || params.svg === '') {\n throw new Error(`[stdlib/svgExtrude] svg is required, got ${JSON.stringify(params.svg)}`)\n }\n assertPositiveNumber(params.depth, 'svgExtrude.depth')\n}\n\n/** BREP 路径:SVG path 解析 → OCCT wire/face → extrude + fromBrep 登记。 */\nfunction svgExtrudeBrep(params: Record<string, unknown>, svgText: string): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/svgExtrude] no OCCT kernel')\n\n const solidHandle = svgToSolid(kernel, svgText, {\n depth: params.depth as number,\n targetLongSide: (params.targetLongSide as number | undefined) ?? 20,\n })\n\n return fromBrep(solidToShape(kernel, solidHandle), { solid: solidHandle })\n}\n\n/**\n * 从二维 SVG 轮廓挤出零件(拓扑操作)。\n * @group 创建\n * @inputs 0\n * @async true\n * @qual warn\n * @name svgExtrude\n * @note SVG 是外部资产,应优先用资产引用(`cad.asset(key)` 经 CallRefIR)而非整份 XML 内联拷贝。自然尺寸(viewBox)与缩放已显式成参数(mesh/BREP 两条路径都解析 viewBox 并传递 naturalWidth/naturalHeight),尺寸语义不再依赖两套实现各自推导。\n * @returns Shape SVG 挤出几何,生成独立零件。\n * @param params.svg - SVG 内容:资产 key(推荐)或整份 SVG 文本(兼容)。type:string required:true\n * @param params.depth - 挤出深度(mm)。type:number required:true\n * @param params.targetLongSide - 长边目标尺寸(mm)。type:number 默认 20\n * @example\n * const s = await cad.svgExtrude({ svg: 'logo.svg', depth: 5, targetLongSide: 20 })\n */\nexport const svgExtrude = defineOp({\n mesh: async (params: Record<string, unknown>) => {\n assertSvgExtrudeParams(params)\n const svgText = await resolveSvgArg(params.svg, { assets: getBackends().assets as AssetResolver | undefined })\n // mesh 路径:与 BREP 路径一致,内部解析 SVG 自然尺寸后缩放\n const { naturalWidth, naturalHeight } = parseSvgNaturalSize(svgText)\n return cad.svgExtrude({\n svg: svgText,\n depth: params.depth as number,\n targetLongSide: (params.targetLongSide as number | undefined) ?? 20,\n naturalWidth,\n naturalHeight,\n })\n },\n brep: async (params: Record<string, unknown>) => {\n assertSvgExtrudeParams(params)\n const svgText = await resolveSvgArg(params.svg, { assets: getBackends().assets as AssetResolver | undefined })\n return svgExtrudeBrep(params, svgText)\n },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } } as Provenance,\n})\n"]}
|
package/dist/api/text.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/api/text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/api/text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAc1C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAMtE;AAmDD;;;;;;;;;;;;;;;;IAgBI;AACJ,eAAO,MAAM,IAAI;;CAYf,CAAA"}
|
package/dist/api/text.js
CHANGED
package/dist/api/text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/api/text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/api/text.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib text — 文字创建库函数(text)\n *\n *\n * dispatchPath 静态判定 brep/mesh,产物经 solid()/fromBrep() 构造器创建。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { solidToShape } from '../brep/brep-ops'\nimport { textToSolid } from '../brep/text/text-to-solid'\nimport { ensureDefaultFont } from '../brep/text/fontRegistry'\nimport { getSolidBoundingBox } from '../brep/brep-utils'\nimport { containsCjk, loadSystemCjkFont } from '../primitives/text/cjk'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep } from '../shape'\nimport { defineOp } from '../sdk'\nimport type { Provenance } from '../topology/naming/lineage'\nimport { assertPositiveNumber } from './assert'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/**\n * Validate text parameters: `text` must be a non-empty string, and `size` and\n * `depth` must be positive numbers.\n * @param params - the raw text operation parameters.\n */\nexport function assertTextParams(params: Record<string, unknown>): void {\n if (typeof params.text !== 'string' || params.text.trim() === '') {\n throw new Error(`[stdlib/text] text must be a non-empty string, got ${JSON.stringify(params.text)}`)\n }\n assertPositiveNumber(params.size, 'text.size')\n assertPositiveNumber(params.depth, 'text.depth')\n}\n\n/**\n * BREP 路径:opentype.js → OCCT wire/face → extrude → center + fromBrep 登记。\n *\n * 与 mesh 路径一样,当文本包含 CJK 字符但没有 CJK 字体时,\n * 将 CJK 字符替换为 '?' 以实现优雅降级。\n */\nasync function textBrep(params: Record<string, unknown>): Promise<Shape> {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/text] no OCCT kernel')\n\n await ensureDefaultFont()\n\n const text = params.text as string\n const size = params.size as number\n const depth = params.depth as number\n\n // 如果文本包含 CJK 字符,检查是否有 CJK 字体\n let renderText = text\n if (containsCjk(text)) {\n const cjkResult = await loadSystemCjkFont()\n if (!cjkResult) {\n // 无 CJK 字体:将 CJK 字符替换为 '?' 以实现优雅降级\n renderText = text.replace(/[\\u4E00-\\u9FFF\\u3400-\\u4DBF\\u2F800-\\u2FA1F\\u3000-\\u303F\\uFF00-\\uFFEF]/g, '?')\n }\n }\n\n // 将文字转换为 OCCT solid\n const rawSolid = textToSolid(kernel, renderText, {\n fontSize: size,\n depth,\n })\n\n // Center the solid to match mesh path behavior:\n // X/Z centered at origin, Y bottom aligned to 0\n const bbox = getSolidBoundingBox(kernel, rawSolid)\n const cx = (bbox.min[0] + bbox.max[0]) / 2\n const cz = (bbox.min[2] + bbox.max[2]) / 2\n const centeredSolid = kernel.translate(rawSolid, -cx, -bbox.min[1], -cz)\n kernel.release(rawSolid)\n\n return fromBrep(solidToShape(kernel, centeredSolid), { solid: centeredSolid })\n}\n\n/** 兼容两种调用形态:`cad.text({ text, size, depth })`(创建类)与\n * `cad.text(part0, { text, size, depth })`(历史 fixture 带输入参数,输入被忽略)。 */\nfunction textParamsOf(inputOrParams: unknown, maybeParams?: Record<string, unknown>): Record<string, unknown> {\n return (maybeParams ?? inputOrParams ?? {}) as Record<string, unknown>\n}\n\n/**\n * 生成文字零件(文字轮廓挤出,X/Z 居中、Y 底部对齐原点)。\n * @group 创建\n * @inputs 0\n * @async true\n * @qual warn\n * @name text\n * @returns Shape 文字几何,生成独立零件。\n * @param maybeParams - 兼容形态的补充参数(正常不传)。type:Record<string, unknown> required:false\n * @param inputOrParams.text - 要生成的文字。type:string required:true\n * @param inputOrParams.size - 字号(mm)。type:number required:true\n * @param inputOrParams.depth - 挤出深度(mm)。type:number required:true\n * @param inputOrParams.font - 字体。type:string 默认 默认字体\n * @note font 语义未定(当前只有默认字体),⚠️ 暂不要传。兼容 `cad.text(part0, {...})` 带输入形态(输入被忽略),正常写 `cad.text({...})` 即可。\n * @example\n * const t = await cad.text({ text: 'Hello', size: 20, depth: 5 })\n */\nexport const text = defineOp({\n mesh: async (inputOrParams: unknown, maybeParams?: Record<string, unknown>) => {\n const params = textParamsOf(inputOrParams, maybeParams)\n assertTextParams(params)\n return cad.text({ text: params.text as string, size: params.size as number, depth: params.depth as number })\n },\n brep: async (inputOrParams: unknown, maybeParams?: Record<string, unknown>) => {\n const params = textParamsOf(inputOrParams, maybeParams)\n assertTextParams(params)\n return textBrep(params)\n },\n naming: { kind: 'construct', newFaces: { via: 'explicit', vocab: [] } } as Provenance,\n})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topo-resolve.d.ts","sourceRoot":"","sources":["../../src/api/topo-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"topo-resolve.d.ts","sourceRoot":"","sources":["../../src/api/topo-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAG1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAKtD,OAAO,EAML,KAAK,WAAW,EAChB,KAAK,iBAAiB,EAEtB,KAAK,QAAQ,EAEb,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAA;AAE3B,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,8CAA8C;IAC9C,IAAI,CAAC,EAAE,QAAQ,CAAA;CAChB;AA2CD;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,aAAa,GAAG,IAAI,EAC5B,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,iBAAiB,GAAG,SAAS,CAsB/B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,iBAAiB,GAAG,SAAS,CA0C/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,UAAU,EACjB,SAAS,CAAC,EAAE,SAAS,GACpB,iBAAiB,CAyBnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,GAAG,IAAI,EAC5B,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,WAAW,GACf,oBAAoB,CAoDtB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,WAAW,CAE1D"}
|
package/dist/api/topo-resolve.js
CHANGED
|
@@ -13,8 +13,51 @@
|
|
|
13
13
|
* 任何一步定不了案 → 抛 TopoRefError(三态错误码),绝不静默拿序号硬取。
|
|
14
14
|
*/
|
|
15
15
|
import { getSlot } from '../shape.js';
|
|
16
|
+
import { nameOf } from '../runtime-state.js';
|
|
16
17
|
import { HASH_UPPER_BOUND } from '../brep/face-evolution.js';
|
|
18
|
+
import { runtimeLineage } from '../topology/naming/lineage.js';
|
|
19
|
+
import { resolveViaLineage } from '../topology/naming/lineage-resolve.js';
|
|
20
|
+
import { asStmtId } from '../identity.js';
|
|
17
21
|
import { resolveTopoRef, captureFaceHint, captureEdgeHint, faceRowToHint, TopoRefError, } from '../topology/naming/index.js';
|
|
22
|
+
/**
|
|
23
|
+
* roleTable miss 时沿血缘回走重算(1.10 前置③:缓存降级)。
|
|
24
|
+
*
|
|
25
|
+
* 「产物上的 roleTable 不再是身份的唯一来源」的落点:精确解析读不到
|
|
26
|
+
* `roleTable[origin][role]` 时,按血缘 DAG 从 origin 语句回走推进到当前 part,
|
|
27
|
+
* 产出该 role 的 hash 集合并**回填缓存**——miss 可恢复,不再是无名错误。
|
|
28
|
+
* 回走失败(链断 / 无演化)返回 undefined,调用方落到几何兜底(既有三态语义不变)。
|
|
29
|
+
*
|
|
30
|
+
* @param ref - the face TopoRef being resolved.
|
|
31
|
+
* @param shape - the live part shape being resolved against.
|
|
32
|
+
* @param kernel - the OCCT kernel (hash 换算需要;null 时回走不可用).
|
|
33
|
+
* @returns the recomputed hash list, or undefined when lineage re-walk cannot produce one.
|
|
34
|
+
*/
|
|
35
|
+
function recomputeViaLineage(ref, shape, kernel) {
|
|
36
|
+
if (!kernel)
|
|
37
|
+
return undefined;
|
|
38
|
+
const part = nameOf(shape);
|
|
39
|
+
if (!part)
|
|
40
|
+
return undefined;
|
|
41
|
+
const result = resolveViaLineage(runtimeLineage, asStmtId(ref.origin), ref.role, part, {
|
|
42
|
+
// 回走链上的中间产物句柄:优先血缘图旁挂(本仓 op 执行时记录),
|
|
43
|
+
// 兜底读 runtime 全局 nameOf 反查(slot.solid)。
|
|
44
|
+
brepOf: (p) => {
|
|
45
|
+
const stmt = runtimeLineage.stmtOf(p);
|
|
46
|
+
const h = stmt ? runtimeLineage.outputHandleOf(stmt) : undefined;
|
|
47
|
+
if (h !== undefined)
|
|
48
|
+
return h;
|
|
49
|
+
return undefined;
|
|
50
|
+
},
|
|
51
|
+
faceHashes: (handle) => Array.from(kernel.subShapeHashes(handle, 'face', HASH_UPPER_BOUND)),
|
|
52
|
+
roleTableOf: (p) => {
|
|
53
|
+
const stmt = runtimeLineage.stmtOf(p);
|
|
54
|
+
return stmt ? runtimeLineage.outputTableOf(stmt) : undefined;
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
if (!('hashes' in result))
|
|
58
|
+
return undefined;
|
|
59
|
+
return result.hashes;
|
|
60
|
+
}
|
|
18
61
|
/**
|
|
19
62
|
* 从活 Shape 的组装槽构建 ResolutionContext(BREAK 或 mesh/primitive 两条路)。
|
|
20
63
|
*
|
|
@@ -33,7 +76,9 @@ export function buildShapeResolutionContext(kernel, shape) {
|
|
|
33
76
|
const slot = getSlot(shape);
|
|
34
77
|
if (!slot)
|
|
35
78
|
return undefined;
|
|
36
|
-
|
|
79
|
+
// 1.10 前置③:roleTable 权威落点在血缘图旁挂(part 键),slot 缓存字段已删。
|
|
80
|
+
const part = nameOf(shape);
|
|
81
|
+
const roleTable = (part ? runtimeLineage.tableOfPart(part) : undefined);
|
|
37
82
|
const solid = slot.solid;
|
|
38
83
|
if (kernel && solid) {
|
|
39
84
|
const handles = kernel.getSubShapes(solid, 'face');
|
|
@@ -70,7 +115,9 @@ export function buildEdgeResolutionContext(kernel, shape) {
|
|
|
70
115
|
const slot = getSlot(shape);
|
|
71
116
|
if (!slot)
|
|
72
117
|
return undefined;
|
|
73
|
-
|
|
118
|
+
// 1.10 前置③:roleTable 权威落点在血缘图旁挂(part 键),slot 缓存字段已删。
|
|
119
|
+
const edgePart = nameOf(shape);
|
|
120
|
+
const roleTable = (edgePart ? runtimeLineage.tableOfPart(edgePart) : undefined);
|
|
74
121
|
const solid = slot.solid;
|
|
75
122
|
if (!solid)
|
|
76
123
|
return undefined;
|
|
@@ -154,10 +201,25 @@ export function buildEdgeContextFromSolid(kernel, solid, roleTable) {
|
|
|
154
201
|
* @returns the current face geometry (center/normal/surfaceType).
|
|
155
202
|
*/
|
|
156
203
|
export function resolveFaceGeometry(kernel, shape, ref) {
|
|
157
|
-
|
|
204
|
+
// 1.10 前置③:roleTable 是解析缓存。origin/role 条目 miss 时先沿血缘回走
|
|
205
|
+
// 重算并回填(miss 可恢复),再进解析——不再是"缓存 miss = 无名"。
|
|
206
|
+
let ctx = buildShapeResolutionContext(kernel, shape);
|
|
158
207
|
if (!ctx) {
|
|
159
208
|
throw new TopoRefError('E_TOPO_NOT_FOUND', 'face', `no naming context on input shape (origin=${ref.origin}, role=${ref.role})`);
|
|
160
209
|
}
|
|
210
|
+
// 1.10 前置③:roleTable 是解析缓存。origin/role 条目 miss 时先沿血缘回走
|
|
211
|
+
// 重算并回填(miss 可恢复),再进解析——不再是"缓存 miss = 无名"。
|
|
212
|
+
if (ctx.roleTable && kernel) {
|
|
213
|
+
const entry0 = ctx.roleTable.get(ref.origin)?.get(ref.role);
|
|
214
|
+
if (entry0 === undefined) {
|
|
215
|
+
const recomputed = recomputeViaLineage(ref, shape, kernel);
|
|
216
|
+
if (recomputed) {
|
|
217
|
+
const merged = new Map(ctx.roleTable);
|
|
218
|
+
merged.set(ref.origin, new Map([...(ctx.roleTable.get(ref.origin) ?? new Map()), [ref.role, recomputed]]));
|
|
219
|
+
ctx = { ...ctx, roleTable: merged };
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
161
223
|
const entity = resolveTopoRef(ref, ctx);
|
|
162
224
|
const entry = ctx.faces[entity.ordinal - 1];
|
|
163
225
|
if (!entry) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topo-resolve.js","sourceRoot":"","sources":["../../src/api/topo-resolve.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * topo-resolve — 运行期 TopoRef 解析(装配/钻孔等面引用 op 共享,§6.2)\n *\n * 与 core/topology/naming 的分工:\n * - naming(core)负责纯解析:给 ReactsContext + FaceTopoRef → ordinal/handle;\n * - 本模块(stdlib)是「活 Shape → React块(ResolutionContext)」的引擎胶水:\n * 从 Shape 身份槽读出运行期数据(BREP 活句柄 + RoleTable,或 setTopology 注入的\n * 面 hint 快照),并把解析结果还原成求解需要的几何(center/normal/surfaceType)。\n *\n * 这样 drill(面 → 法向)与 compound/assembly(约束固定/移动面 → 几何)共用同一\n * 条「TopoRef 执行期派生」通道,且不动 core 的纯 naming 层职责。\n *\n * 任何一步定不了案 → 抛 TopoRefError(三态错误码),绝不静默拿序号硬取。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { getSlot } from '../shape'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\nimport { HASH_UPPER_BOUND } from '../brep/face-evolution'\nimport {\n resolveTopoRef,\n captureFaceHint,\n captureEdgeHint,\n faceRowToHint,\n TopoRefError,\n type FaceTopoRef,\n type ResolutionContext,\n type FaceHint,\n type AxisHint,\n type EdgeCandidateEntry,\n type RoleTable,\n} from '../topology/naming'\n\n/** 求解面需要的当前几何(执行期派生):与旧契约 fixedFace/movingFace 的 surfaceType/center/normal 同形。 */\nexport interface ResolvedFaceGeometry {\n surfaceType?: string\n center: [number, number, number]\n normal: [number, number, number]\n /** 圆柱/回转面的轴(装配轴约束用;平面/球面缺省,mesh 行快照由宿主注入)。 */\n axis?: AxisHint\n}\n\n/**\n * 从活 Shape 的组装槽构建 ResolutionContext(BREAK 或 mesh/primitive 两条路)。\n *\n * - BREAK:`slot.solid` + `slot.roleTable` → 内核现场句柄 + hash(exact 路径);\n * - mesh/primitive:`slot.faceHints`(setTopology 注入时提炼写入)→ 行快照(geometric 路径)。\n *\n * 无命名槽 → undefined(调用方按 not-found 抛错)。\n *\n * @param kernel - the OCCT kernel (null on the mesh/primitive path).\n * @param shape - the live input shape whose naming slot is read.\n * @returns the resolution context (live BREP or hint rows), or undefined when the shape has no naming slot.\n */\nexport function buildShapeResolutionContext(\n kernel: BrepEngineApi | null,\n shape: object | undefined,\n): ResolutionContext | undefined {\n if (!shape) return undefined\n const slot = getSlot(shape)\n if (!slot) return undefined\n const roleTable = slot.roleTable as RoleTable | undefined\n\n const solid = slot.solid as BrepHandle | undefined\n if (kernel && solid) {\n const handles = kernel.getSubShapes(solid, 'face')\n const hashes = Array.from(kernel.subShapeHashes(solid, 'face', HASH_UPPER_BOUND))\n const faces = handles.map((handle, i) => ({ ordinal: i + 1, hash: hashes[i] ?? 0, handle }))\n return { kernel, faces, roleTable }\n }\n\n const hints = slot.faceHints as FaceHint[] | undefined\n if (Array.isArray(hints) && hints.length > 0) {\n const faces = hints.map((row, i) => ({ ordinal: i + 1, row }))\n return { kernel: null, faces, roleTable }\n }\n return undefined\n}\n\n/**\n * 为 BREP 现场构建带边候选与邻接表的 ResolutionContext(edge TopoRef 解析用)。\n *\n * 与 `buildBrepResolutionContext` 的面候选同源(同一枚举序),并补充:\n * - `edges`:边候选表(ordinal 1 起,含活句柄 + length/midpoint hint);\n * - `faceEdgeAdjacency` / `edgeFaceAdjacency`:邻接表(edge lineage 解析用,M3)。\n *\n * 只支持 BREP 现场(edge lineage 需要 face→edge 邻接);mesh/primitive 路径\n * 没有邻接能力(build-mesh-topology.ts:262,§5.3)→ 返回 undefined,调用方\n * 按 E_TOPO_NOT_FOUND 处理。\n *\n * @param kernel - the OCCT kernel.\n * @param shape - the live input shape whose naming slot is read.\n * @returns the edge-enabled resolution context, or undefined when the shape has\n * no BREP naming slot.\n */\nexport function buildEdgeResolutionContext(\n kernel: BrepEngineApi,\n shape: object | undefined,\n): ResolutionContext | undefined {\n if (!shape) return undefined\n const slot = getSlot(shape)\n if (!slot) return undefined\n const roleTable = slot.roleTable as RoleTable | undefined\n const solid = slot.solid as BrepHandle | undefined\n if (!solid) return undefined\n\n const faceHandles = kernel.getSubShapes(solid, 'face')\n const faceHashes = Array.from(kernel.subShapeHashes(solid, 'face', HASH_UPPER_BOUND))\n const faces = faceHandles.map((handle, i) => ({ ordinal: i + 1, hash: faceHashes[i] ?? 0, handle }))\n\n const edgeHandles = kernel.getSubShapes(solid, 'edge')\n const edges: EdgeCandidateEntry[] = edgeHandles.map((handle, i) => ({\n ordinal: i + 1,\n handle,\n hint: captureEdgeHint(kernel, handle),\n }))\n const liveEdges = edges.filter((e): e is EdgeCandidateEntry & { handle: BrepHandle } => e.handle !== undefined)\n\n // face → 邻接 edges(ordinal 1 起)。mesh 无 face→edge 邻接,这里 BREP 现场直取。\n const faceHandlesArr = faceHandles.map((h, hi) => ({ handle: h, ordinal: hi + 1 }))\n\n const faceEdgeAdjacency = faceHandlesArr.map(({ handle }) => {\n const sub = kernel.getSubShapes(handle, 'edge')\n return sub\n .map((eh) => liveEdges.find((e) => kernel.isSame(eh, e.handle))?.ordinal)\n .filter((v): v is number => v !== undefined)\n })\n const edgeFaceAdjacency = liveEdges.map(({ handle }) => {\n const adj: number[] = []\n for (const f of faceHandlesArr) {\n if (kernel.getSubShapes(f.handle, 'edge').some((fe) => kernel.isSame(fe, handle))) {\n adj.push(f.ordinal)\n }\n }\n return adj\n })\n\n return { kernel, faces, edges, roleTable, faceEdgeAdjacency, edgeFaceAdjacency }\n}\n\n/**\n * 从 BREP 现场句柄建带边候选/邻接的 ResolutionContext(twoDistances 逐边重建用)。\n *\n * 与 `buildEdgeResolutionContext` 相同,但直接接收 live solid 句柄而非 Shape 槽——\n * 用于真机逐边构建后,输入已从上一次结果演化,Shape 槽里的 roleTable/hash 不再\n * 与当前句柄对应(§3.6 逐边构建,后续边要重新 resolve)。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the live BREP solid handle.\n * @param roleTable - optional role table to carry over (not used for strict matching).\n * @returns the edge-enabled resolution context (faces/edges/adjacency live from `solid`).\n */\nexport function buildEdgeContextFromSolid(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n roleTable?: RoleTable,\n): ResolutionContext {\n const faceHandles = kernel.getSubShapes(solid, 'face')\n const faces = faceHandles.map((handle, i) => ({ ordinal: i + 1, hash: undefined, handle }))\n const edgeHandles = kernel.getSubShapes(solid, 'edge')\n const edges: EdgeCandidateEntry[] = edgeHandles.map((handle, i) => ({\n ordinal: i + 1,\n handle,\n hint: captureEdgeHint(kernel, handle),\n }))\n const liveEdges = edges.filter((e): e is EdgeCandidateEntry & { handle: BrepHandle } => e.handle !== undefined)\n const faceHandlesArr = faceHandles.map((h, hi) => ({ handle: h, ordinal: hi + 1 }))\n const faceEdgeAdjacency = faceHandlesArr.map(({ handle }) => {\n const sub = kernel.getSubShapes(handle, 'edge')\n return sub\n .map((eh) => liveEdges.find((e) => kernel.isSame(eh, e.handle))?.ordinal)\n .filter((v): v is number => v !== undefined)\n })\n const edgeFaceAdjacency = liveEdges.map(({ handle }) => {\n const adj: number[] = []\n for (const f of faceHandlesArr) {\n if (kernel.getSubShapes(f.handle, 'edge').some((fe) => kernel.isSame(fe, handle))) adj.push(f.ordinal)\n }\n return adj\n })\n return { kernel, faces, edges, roleTable, faceEdgeAdjacency, edgeFaceAdjacency }\n}\n\n/**\n * 解析一个 face TopoRef 到「当前几何」,并从解析出的候选面派生求解几何。\n *\n * 结果与命名行的 surfaceType/center/normal 同口径(BREAK 现场 captureFaceHint /\n * mesh 行快照),保证两侧派生值一致。\n *\n * @param kernel - the OCCT kernel (can be null on the mesh/primitive path).\n * @param shape - the live input shape whose naming slot is being resolved.\n * @param ref - the FaceTopoRef captured earlier.\n * @returns the current face geometry (center/normal/surfaceType).\n */\nexport function resolveFaceGeometry(\n kernel: BrepEngineApi | null,\n shape: Shape,\n ref: FaceTopoRef,\n): ResolvedFaceGeometry {\n const ctx = buildShapeResolutionContext(kernel, shape)\n if (!ctx) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `no naming context on input shape (origin=${ref.origin}, role=${ref.role})`,\n )\n }\n const entity = resolveTopoRef(ref, ctx)\n const entry = ctx.faces[entity.ordinal - 1]\n if (!entry) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `resolved ordinal ${entity.ordinal} has no candidate in context (origin=${ref.origin}, role=${ref.role})`,\n )\n }\n // BREAK 现场:capture 出当前法向/中心(圆柱面含轴)\n if (entry.handle && ctx.kernel) {\n const hint = captureFaceHint(ctx.kernel, entry.handle)\n return {\n surfaceType: hint.surfaceType,\n center: hint.center ?? [0, 0, 0],\n normal: hint.normal ?? [0, 0, 1],\n ...(hint.axis ? { axis: hint.axis } : {}),\n }\n }\n // mesh/行快照:直接用行几何(axis 由宿主行注入,缺省 undefined)\n const ext = entry.row\n const hint = ext ? faceRowToHint(ext) : undefined\n return {\n surfaceType: hint?.surfaceType,\n center: hint?.center ?? [0, 0, 0],\n normal: hint?.normal ?? [0, 0, 1],\n ...(hint?.axis ? { axis: hint.axis } : {}),\n }\n}\n\n/**\n * FaceMateConstraint 面的等价重载:face 参数对象(`{topoRef}` 或旧快照)的守卫。\n *\n * @param v - the value to test.\n * @returns true when the value is a FaceTopoRef (kind === 'face').\n */\nexport function isFaceTopoRef(v: unknown): v is FaceTopoRef {\n return !!v && typeof v === 'object' && (v as { kind?: unknown }).kind === 'face'\n}"]}
|
|
1
|
+
{"version":3,"file":"topo-resolve.js","sourceRoot":"","sources":["../../src/api/topo-resolve.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * topo-resolve — 运行期 TopoRef 解析(装配/钻孔等面引用 op 共享,§6.2)\n *\n * 与 core/topology/naming 的分工:\n * - naming(core)负责纯解析:给 ReactsContext + FaceTopoRef → ordinal/handle;\n * - 本模块(stdlib)是「活 Shape → React块(ResolutionContext)」的引擎胶水:\n * 从 Shape 身份槽读出运行期数据(BREP 活句柄 + RoleTable,或 setTopology 注入的\n * 面 hint 快照),并把解析结果还原成求解需要的几何(center/normal/surfaceType)。\n *\n * 这样 drill(面 → 法向)与 compound/assembly(约束固定/移动面 → 几何)共用同一\n * 条「TopoRef 执行期派生」通道,且不动 core 的纯 naming 层职责。\n *\n * 任何一步定不了案 → 抛 TopoRefError(三态错误码),绝不静默拿序号硬取。\n */\n\nimport type { Shape } from '../mesh/types'\nimport { getSlot } from '../shape'\nimport { nameOf } from '../runtime-state'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\nimport type { BrepHandle } from '../brep/engine/types'\nimport { HASH_UPPER_BOUND } from '../brep/face-evolution'\nimport { runtimeLineage } from '../topology/naming/lineage'\nimport { resolveViaLineage } from '../topology/naming/lineage-resolve'\nimport { asStmtId } from '../identity'\nimport {\n resolveTopoRef,\n captureFaceHint,\n captureEdgeHint,\n faceRowToHint,\n TopoRefError,\n type FaceTopoRef,\n type ResolutionContext,\n type FaceHint,\n type AxisHint,\n type EdgeCandidateEntry,\n type RoleTable,\n} from '../topology/naming'\n\n/** 求解面需要的当前几何(执行期派生):与旧契约 fixedFace/movingFace 的 surfaceType/center/normal 同形。 */\nexport interface ResolvedFaceGeometry {\n surfaceType?: string\n center: [number, number, number]\n normal: [number, number, number]\n /** 圆柱/回转面的轴(装配轴约束用;平面/球面缺省,mesh 行快照由宿主注入)。 */\n axis?: AxisHint\n}\n\n/**\n * roleTable miss 时沿血缘回走重算(1.10 前置③:缓存降级)。\n *\n * 「产物上的 roleTable 不再是身份的唯一来源」的落点:精确解析读不到\n * `roleTable[origin][role]` 时,按血缘 DAG 从 origin 语句回走推进到当前 part,\n * 产出该 role 的 hash 集合并**回填缓存**——miss 可恢复,不再是无名错误。\n * 回走失败(链断 / 无演化)返回 undefined,调用方落到几何兜底(既有三态语义不变)。\n *\n * @param ref - the face TopoRef being resolved.\n * @param shape - the live part shape being resolved against.\n * @param kernel - the OCCT kernel (hash 换算需要;null 时回走不可用).\n * @returns the recomputed hash list, or undefined when lineage re-walk cannot produce one.\n */\nfunction recomputeViaLineage(\n ref: FaceTopoRef,\n shape: object,\n kernel: BrepEngineApi | null,\n): readonly number[] | undefined {\n if (!kernel) return undefined\n const part = nameOf(shape)\n if (!part) return undefined\n const result = resolveViaLineage(runtimeLineage, asStmtId(ref.origin), ref.role, part, {\n // 回走链上的中间产物句柄:优先血缘图旁挂(本仓 op 执行时记录),\n // 兜底读 runtime 全局 nameOf 反查(slot.solid)。\n brepOf: (p) => {\n const stmt = runtimeLineage.stmtOf(p)\n const h = stmt ? runtimeLineage.outputHandleOf(stmt) : undefined\n if (h !== undefined) return h\n return undefined\n },\n faceHashes: (handle) =>\n Array.from(kernel.subShapeHashes(handle as BrepHandle, 'face', HASH_UPPER_BOUND)),\n roleTableOf: (p) => {\n const stmt = runtimeLineage.stmtOf(p)\n return stmt ? runtimeLineage.outputTableOf(stmt) : undefined\n },\n })\n if (!('hashes' in result)) return undefined\n return result.hashes\n}\n\n/**\n * 从活 Shape 的组装槽构建 ResolutionContext(BREAK 或 mesh/primitive 两条路)。\n *\n * - BREAK:`slot.solid` + `slot.roleTable` → 内核现场句柄 + hash(exact 路径);\n * - mesh/primitive:`slot.faceHints`(setTopology 注入时提炼写入)→ 行快照(geometric 路径)。\n *\n * 无命名槽 → undefined(调用方按 not-found 抛错)。\n *\n * @param kernel - the OCCT kernel (null on the mesh/primitive path).\n * @param shape - the live input shape whose naming slot is read.\n * @returns the resolution context (live BREP or hint rows), or undefined when the shape has no naming slot.\n */\nexport function buildShapeResolutionContext(\n kernel: BrepEngineApi | null,\n shape: object | undefined,\n): ResolutionContext | undefined {\n if (!shape) return undefined\n const slot = getSlot(shape)\n if (!slot) return undefined\n // 1.10 前置③:roleTable 权威落点在血缘图旁挂(part 键),slot 缓存字段已删。\n const part = nameOf(shape)\n const roleTable = (part ? runtimeLineage.tableOfPart(part) : undefined) as RoleTable | undefined\n\n const solid = slot.solid as BrepHandle | undefined\n if (kernel && solid) {\n const handles = kernel.getSubShapes(solid, 'face')\n const hashes = Array.from(kernel.subShapeHashes(solid, 'face', HASH_UPPER_BOUND))\n const faces = handles.map((handle, i) => ({ ordinal: i + 1, hash: hashes[i] ?? 0, handle }))\n return { kernel, faces, roleTable }\n }\n\n const hints = slot.faceHints as FaceHint[] | undefined\n if (Array.isArray(hints) && hints.length > 0) {\n const faces = hints.map((row, i) => ({ ordinal: i + 1, row }))\n return { kernel: null, faces, roleTable }\n }\n return undefined\n}\n\n/**\n * 为 BREP 现场构建带边候选与邻接表的 ResolutionContext(edge TopoRef 解析用)。\n *\n * 与 `buildBrepResolutionContext` 的面候选同源(同一枚举序),并补充:\n * - `edges`:边候选表(ordinal 1 起,含活句柄 + length/midpoint hint);\n * - `faceEdgeAdjacency` / `edgeFaceAdjacency`:邻接表(edge lineage 解析用,M3)。\n *\n * 只支持 BREP 现场(edge lineage 需要 face→edge 邻接);mesh/primitive 路径\n * 没有邻接能力(build-mesh-topology.ts:262,§5.3)→ 返回 undefined,调用方\n * 按 E_TOPO_NOT_FOUND 处理。\n *\n * @param kernel - the OCCT kernel.\n * @param shape - the live input shape whose naming slot is read.\n * @returns the edge-enabled resolution context, or undefined when the shape has\n * no BREP naming slot.\n */\nexport function buildEdgeResolutionContext(\n kernel: BrepEngineApi,\n shape: object | undefined,\n): ResolutionContext | undefined {\n if (!shape) return undefined\n const slot = getSlot(shape)\n if (!slot) return undefined\n // 1.10 前置③:roleTable 权威落点在血缘图旁挂(part 键),slot 缓存字段已删。\n const edgePart = nameOf(shape)\n const roleTable = (edgePart ? runtimeLineage.tableOfPart(edgePart) : undefined) as RoleTable | undefined\n const solid = slot.solid as BrepHandle | undefined\n if (!solid) return undefined\n\n const faceHandles = kernel.getSubShapes(solid, 'face')\n const faceHashes = Array.from(kernel.subShapeHashes(solid, 'face', HASH_UPPER_BOUND))\n const faces = faceHandles.map((handle, i) => ({ ordinal: i + 1, hash: faceHashes[i] ?? 0, handle }))\n\n const edgeHandles = kernel.getSubShapes(solid, 'edge')\n const edges: EdgeCandidateEntry[] = edgeHandles.map((handle, i) => ({\n ordinal: i + 1,\n handle,\n hint: captureEdgeHint(kernel, handle),\n }))\n const liveEdges = edges.filter((e): e is EdgeCandidateEntry & { handle: BrepHandle } => e.handle !== undefined)\n\n // face → 邻接 edges(ordinal 1 起)。mesh 无 face→edge 邻接,这里 BREP 现场直取。\n const faceHandlesArr = faceHandles.map((h, hi) => ({ handle: h, ordinal: hi + 1 }))\n\n const faceEdgeAdjacency = faceHandlesArr.map(({ handle }) => {\n const sub = kernel.getSubShapes(handle, 'edge')\n return sub\n .map((eh) => liveEdges.find((e) => kernel.isSame(eh, e.handle))?.ordinal)\n .filter((v): v is number => v !== undefined)\n })\n const edgeFaceAdjacency = liveEdges.map(({ handle }) => {\n const adj: number[] = []\n for (const f of faceHandlesArr) {\n if (kernel.getSubShapes(f.handle, 'edge').some((fe) => kernel.isSame(fe, handle))) {\n adj.push(f.ordinal)\n }\n }\n return adj\n })\n\n return { kernel, faces, edges, roleTable, faceEdgeAdjacency, edgeFaceAdjacency }\n}\n\n/**\n * 从 BREP 现场句柄建带边候选/邻接的 ResolutionContext(twoDistances 逐边重建用)。\n *\n * 与 `buildEdgeResolutionContext` 相同,但直接接收 live solid 句柄而非 Shape 槽——\n * 用于真机逐边构建后,输入已从上一次结果演化,Shape 槽里的 roleTable/hash 不再\n * 与当前句柄对应(§3.6 逐边构建,后续边要重新 resolve)。\n *\n * @param kernel - the OCCT kernel.\n * @param solid - the live BREP solid handle.\n * @param roleTable - optional role table to carry over (not used for strict matching).\n * @returns the edge-enabled resolution context (faces/edges/adjacency live from `solid`).\n */\nexport function buildEdgeContextFromSolid(\n kernel: BrepEngineApi,\n solid: BrepHandle,\n roleTable?: RoleTable,\n): ResolutionContext {\n const faceHandles = kernel.getSubShapes(solid, 'face')\n const faces = faceHandles.map((handle, i) => ({ ordinal: i + 1, hash: undefined, handle }))\n const edgeHandles = kernel.getSubShapes(solid, 'edge')\n const edges: EdgeCandidateEntry[] = edgeHandles.map((handle, i) => ({\n ordinal: i + 1,\n handle,\n hint: captureEdgeHint(kernel, handle),\n }))\n const liveEdges = edges.filter((e): e is EdgeCandidateEntry & { handle: BrepHandle } => e.handle !== undefined)\n const faceHandlesArr = faceHandles.map((h, hi) => ({ handle: h, ordinal: hi + 1 }))\n const faceEdgeAdjacency = faceHandlesArr.map(({ handle }) => {\n const sub = kernel.getSubShapes(handle, 'edge')\n return sub\n .map((eh) => liveEdges.find((e) => kernel.isSame(eh, e.handle))?.ordinal)\n .filter((v): v is number => v !== undefined)\n })\n const edgeFaceAdjacency = liveEdges.map(({ handle }) => {\n const adj: number[] = []\n for (const f of faceHandlesArr) {\n if (kernel.getSubShapes(f.handle, 'edge').some((fe) => kernel.isSame(fe, handle))) adj.push(f.ordinal)\n }\n return adj\n })\n return { kernel, faces, edges, roleTable, faceEdgeAdjacency, edgeFaceAdjacency }\n}\n\n/**\n * 解析一个 face TopoRef 到「当前几何」,并从解析出的候选面派生求解几何。\n *\n * 结果与命名行的 surfaceType/center/normal 同口径(BREAK 现场 captureFaceHint /\n * mesh 行快照),保证两侧派生值一致。\n *\n * @param kernel - the OCCT kernel (can be null on the mesh/primitive path).\n * @param shape - the live input shape whose naming slot is being resolved.\n * @param ref - the FaceTopoRef captured earlier.\n * @returns the current face geometry (center/normal/surfaceType).\n */\nexport function resolveFaceGeometry(\n kernel: BrepEngineApi | null,\n shape: Shape,\n ref: FaceTopoRef,\n): ResolvedFaceGeometry {\n // 1.10 前置③:roleTable 是解析缓存。origin/role 条目 miss 时先沿血缘回走\n // 重算并回填(miss 可恢复),再进解析——不再是\"缓存 miss = 无名\"。\n let ctx = buildShapeResolutionContext(kernel, shape)\n if (!ctx) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `no naming context on input shape (origin=${ref.origin}, role=${ref.role})`,\n )\n }\n // 1.10 前置③:roleTable 是解析缓存。origin/role 条目 miss 时先沿血缘回走\n // 重算并回填(miss 可恢复),再进解析——不再是\"缓存 miss = 无名\"。\n if (ctx.roleTable && kernel) {\n const entry0 = ctx.roleTable.get(ref.origin)?.get(ref.role)\n if (entry0 === undefined) {\n const recomputed = recomputeViaLineage(ref, shape, kernel)\n if (recomputed) {\n const merged = new Map(ctx.roleTable as ReadonlyMap<string, ReadonlyMap<string, readonly number[]>>)\n merged.set(ref.origin, new Map([...(ctx.roleTable.get(ref.origin) ?? new Map()), [ref.role, recomputed]]))\n ctx = { ...ctx, roleTable: merged as unknown as typeof ctx.roleTable }\n }\n }\n }\n const entity = resolveTopoRef(ref, ctx)\n const entry = ctx.faces[entity.ordinal - 1]\n if (!entry) {\n throw new TopoRefError(\n 'E_TOPO_NOT_FOUND',\n 'face',\n `resolved ordinal ${entity.ordinal} has no candidate in context (origin=${ref.origin}, role=${ref.role})`,\n )\n }\n // BREAK 现场:capture 出当前法向/中心(圆柱面含轴)\n if (entry.handle && ctx.kernel) {\n const hint = captureFaceHint(ctx.kernel, entry.handle)\n return {\n surfaceType: hint.surfaceType,\n center: hint.center ?? [0, 0, 0],\n normal: hint.normal ?? [0, 0, 1],\n ...(hint.axis ? { axis: hint.axis } : {}),\n }\n }\n // mesh/行快照:直接用行几何(axis 由宿主行注入,缺省 undefined)\n const ext = entry.row\n const hint = ext ? faceRowToHint(ext) : undefined\n return {\n surfaceType: hint?.surfaceType,\n center: hint?.center ?? [0, 0, 0],\n normal: hint?.normal ?? [0, 0, 1],\n ...(hint?.axis ? { axis: hint.axis } : {}),\n }\n}\n\n/**\n * FaceMateConstraint 面的等价重载:face 参数对象(`{topoRef}` 或旧快照)的守卫。\n *\n * @param v - the value to test.\n * @returns true when the value is a FaceTopoRef (kind === 'face').\n */\nexport function isFaceTopoRef(v: unknown): v is FaceTopoRef {\n return !!v && typeof v === 'object' && (v as { kind?: unknown }).kind === 'face'\n}"]}
|
package/dist/api/transform.d.ts
CHANGED
|
@@ -40,6 +40,7 @@ export declare function assertScale3dParams(params: Record<string, unknown>): vo
|
|
|
40
40
|
* @async false
|
|
41
41
|
* @qual ok
|
|
42
42
|
* @name translate
|
|
43
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。
|
|
43
44
|
* @returns Shape 平移后的几何,装配的相对位置靠成员的变换语句表达。
|
|
44
45
|
* @param input - 目标几何。type:Shape required:true
|
|
45
46
|
* @param params.offset - 平移向量(mm)。type:[x,y,z] required:true
|
|
@@ -56,6 +57,7 @@ export declare const translate: ((input: Shape, params: Record<string, unknown>)
|
|
|
56
57
|
* @async false
|
|
57
58
|
* @qual ok
|
|
58
59
|
* @name rotate_euler
|
|
60
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。
|
|
59
61
|
* @returns Shape 旋转后的几何。
|
|
60
62
|
* @param input - 目标几何。type:Shape required:true
|
|
61
63
|
* @param params.anglesDeg - 欧拉角(度,XYZ 顺序)。type:[x,y,z] required:true
|
|
@@ -75,6 +77,7 @@ export declare const rotate_euler: ((input: Shape, params: Record<string, unknow
|
|
|
75
77
|
* @async false
|
|
76
78
|
* @qual ok
|
|
77
79
|
* @name scale
|
|
80
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。
|
|
78
81
|
* @returns Shape 缩放后的几何。
|
|
79
82
|
* @param input - 目标几何。type:Shape required:true
|
|
80
83
|
* @param params.factor - 等比缩放系数(> 0)。type:number required:true
|
|
@@ -94,6 +97,7 @@ export declare const scale: ((input: Shape, params: Record<string, unknown>) =>
|
|
|
94
97
|
* @async false
|
|
95
98
|
* @qual ok
|
|
96
99
|
* @name scale3d
|
|
100
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。
|
|
97
101
|
* @returns Shape 缩放后的几何。
|
|
98
102
|
* @param input - 目标几何。type:Shape required:true
|
|
99
103
|
* @param params.factor - 三轴缩放系数(均 > 0)。type:[x,y,z] required:true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/api/transform.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAQ,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/api/transform.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAQ,MAAM,eAAe,CAAA;AAoBhD,oDAAoD;AAEpD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAKxE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQvE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQzE;AA+DD;;;;;;;;;;;;;IAaI;AACJ,eAAO,MAAM,SAAS;;CAgBpB,CAAA;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,YAAY;;CAevB,CAAA;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,KAAK;;CAkBhB,CAAA;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO;;CAkBlB,CAAA"}
|
package/dist/api/transform.js
CHANGED
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
* BREP 路径用 brepOf(input) 取输入实体、fromBrep 登记输出实体。
|
|
7
7
|
*/
|
|
8
8
|
import { cad } from '../mesh/index.js';
|
|
9
|
-
import {
|
|
10
|
-
import { identityEvolution, identityHashEvolution } from '../brep/face-evolution.js';
|
|
9
|
+
import { rotateBrep, scaleBrep, solidToShape } from '../brep/brep-ops.js';
|
|
10
|
+
import { identityEvolution, identityHashEvolution, scaleWithHashEvolution, translateWithHashEvolution, } from '../brep/face-evolution.js';
|
|
11
11
|
import { getBackends } from '../runtime-state.js';
|
|
12
|
-
import { fromBrep, brepOf,
|
|
12
|
+
import { fromBrep, brepOf, inputRoleTable } from '../shape.js';
|
|
13
13
|
import { propagateAllOrigins } from '../topology/naming/roles.js';
|
|
14
14
|
import { defineOp } from '../sdk.js';
|
|
15
15
|
import { assertVec3, assertPositiveNumber } from './assert.js';
|
|
@@ -59,7 +59,18 @@ export function assertScale3dParams(params) {
|
|
|
59
59
|
}
|
|
60
60
|
assertVec3(params.factor, 'scale3d.factor');
|
|
61
61
|
}
|
|
62
|
-
/**
|
|
62
|
+
/**
|
|
63
|
+
* BREP 路径:变换 solid + 面演化 + roleTable 传播 + 三角化 + fromBrep 登记。
|
|
64
|
+
*
|
|
65
|
+
* Phase 0.3:优先走内核**权威**面演化(`translateWithHistory` / `scaleWithHistory`);
|
|
66
|
+
* 内核无法单次表达的(`rotate_euler` 任意欧拉+pivot、`scale3d` 非等比)退回
|
|
67
|
+
* `identityHashEvolution`,其"面枚举序号在变换后保持"的假设由
|
|
68
|
+
* `brep/face-evolution.ordering.test.ts` 实测钉住。
|
|
69
|
+
* @param op - the transform operation name.
|
|
70
|
+
* @param input - the input geometry.
|
|
71
|
+
* @param params - the operation parameters.
|
|
72
|
+
* @returns the transformed Shape.
|
|
73
|
+
*/
|
|
63
74
|
function transformBrep(op, input, params) {
|
|
64
75
|
const kernel = getBackends().kernel.brep;
|
|
65
76
|
if (!kernel)
|
|
@@ -68,21 +79,34 @@ function transformBrep(op, input, params) {
|
|
|
68
79
|
if (!inputSolid)
|
|
69
80
|
throw new Error('[stdlib/transform] input is not BREP');
|
|
70
81
|
let resultSolid;
|
|
82
|
+
let hashEvolution;
|
|
71
83
|
if (op === 'translate') {
|
|
72
|
-
|
|
84
|
+
// 权威映射:内核 translateWithHistory(1:1 全覆盖,实测见 evolution-bindings.test.ts)
|
|
85
|
+
const r = translateWithHashEvolution(kernel, inputSolid, params.offset);
|
|
86
|
+
resultSolid = r.result;
|
|
87
|
+
hashEvolution = r.evolution;
|
|
73
88
|
}
|
|
74
|
-
else if (op === '
|
|
75
|
-
|
|
89
|
+
else if (op === 'scale') {
|
|
90
|
+
// 权威映射:内核 scaleWithHistory(仅均匀 —— assertScaleParams 已保证 factor 是 number)
|
|
91
|
+
const r = scaleWithHashEvolution(kernel, inputSolid, params.center ?? [0, 0, 0], params.factor);
|
|
92
|
+
resultSolid = r.result;
|
|
93
|
+
hashEvolution = r.evolution;
|
|
76
94
|
}
|
|
77
95
|
else {
|
|
78
|
-
//
|
|
79
|
-
|
|
96
|
+
// rotate_euler(任意欧拉角+pivot)/ scale3d(非等比):内核无单次 WithHistory 可表达
|
|
97
|
+
if (op === 'rotate_euler') {
|
|
98
|
+
resultSolid = rotateBrep(kernel, inputSolid, params.anglesDeg, params.pivot);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
resultSolid = scaleBrep(kernel, inputSolid, params.factor, params.center);
|
|
102
|
+
}
|
|
103
|
+
hashEvolution = identityHashEvolution(kernel, inputSolid, resultSolid);
|
|
80
104
|
}
|
|
81
|
-
// §2.4/§3.3:刚体变换面 1:1
|
|
82
|
-
const inputTable =
|
|
105
|
+
// §2.4/§3.3:刚体变换面 1:1 保留 —— 沿演化传播 roleTable(所有 origin)
|
|
106
|
+
const inputTable = inputRoleTable(input);
|
|
83
107
|
let roleTable;
|
|
84
108
|
if (inputTable && inputTable.size > 0) {
|
|
85
|
-
roleTable = propagateAllOrigins(inputTable,
|
|
109
|
+
roleTable = propagateAllOrigins(inputTable, hashEvolution);
|
|
86
110
|
}
|
|
87
111
|
return fromBrep(solidToShape(kernel, resultSolid), {
|
|
88
112
|
solid: resultSolid,
|
|
@@ -98,6 +122,7 @@ function transformBrep(op, input, params) {
|
|
|
98
122
|
* @async false
|
|
99
123
|
* @qual ok
|
|
100
124
|
* @name translate
|
|
125
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。
|
|
101
126
|
* @returns Shape 平移后的几何,装配的相对位置靠成员的变换语句表达。
|
|
102
127
|
* @param input - 目标几何。type:Shape required:true
|
|
103
128
|
* @param params.offset - 平移向量(mm)。type:[x,y,z] required:true
|
|
@@ -121,6 +146,7 @@ export const translate = defineOp({
|
|
|
121
146
|
// D11: `translate(p, 10, 0, 0)` == `translate(p, { offset: [10, 0, 0] })`;
|
|
122
147
|
// `offset` is a vec3 slot sitting after the single leading Shape argument.
|
|
123
148
|
slotMap: { keys: ['offset'], vec3Keys: ['offset'], shapeArity: 1 },
|
|
149
|
+
naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
|
|
124
150
|
});
|
|
125
151
|
/**
|
|
126
152
|
* 绕轴旋转几何体。anglesDeg 为欧拉角(度,XYZ 顺序)。
|
|
@@ -129,6 +155,7 @@ export const translate = defineOp({
|
|
|
129
155
|
* @async false
|
|
130
156
|
* @qual ok
|
|
131
157
|
* @name rotate_euler
|
|
158
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。
|
|
132
159
|
* @returns Shape 旋转后的几何。
|
|
133
160
|
* @param input - 目标几何。type:Shape required:true
|
|
134
161
|
* @param params.anglesDeg - 欧拉角(度,XYZ 顺序)。type:[x,y,z] required:true
|
|
@@ -153,6 +180,7 @@ export const rotate_euler = defineOp({
|
|
|
153
180
|
},
|
|
154
181
|
// D11: `rotate_euler(p, 0, 0, 45)` == `rotate_euler(p, { anglesDeg: [0, 0, 45] })`.
|
|
155
182
|
slotMap: { keys: ['anglesDeg'], vec3Keys: ['anglesDeg'], shapeArity: 1 },
|
|
183
|
+
naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
|
|
156
184
|
});
|
|
157
185
|
/**
|
|
158
186
|
* 等比缩放几何体(brepjs 契约,§4.6 裁决 2)。factor 只收 number;不动点默认
|
|
@@ -162,6 +190,7 @@ export const rotate_euler = defineOp({
|
|
|
162
190
|
* @async false
|
|
163
191
|
* @qual ok
|
|
164
192
|
* @name scale
|
|
193
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。
|
|
165
194
|
* @returns Shape 缩放后的几何。
|
|
166
195
|
* @param input - 目标几何。type:Shape required:true
|
|
167
196
|
* @param params.factor - 等比缩放系数(> 0)。type:number required:true
|
|
@@ -189,6 +218,7 @@ export const scale = defineOp({
|
|
|
189
218
|
// D11(§4.6):`scale(p, 2)` == `scale(p, { factor: 2 })`(标量槽);尾参 options
|
|
190
219
|
// ({center})经 dual-form-args 尾参合并并入。
|
|
191
220
|
slotMap: { keys: ['factor'], shapeArity: 1 },
|
|
221
|
+
naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
|
|
192
222
|
});
|
|
193
223
|
/**
|
|
194
224
|
* 非等比缩放几何体(faijs 语义,§1.4.4 裁决 2)。factor 定死 vec3 — 等比缩放请用
|
|
@@ -198,6 +228,7 @@ export const scale = defineOp({
|
|
|
198
228
|
* @async false
|
|
199
229
|
* @qual ok
|
|
200
230
|
* @name scale3d
|
|
231
|
+
* @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。
|
|
201
232
|
* @returns Shape 缩放后的几何。
|
|
202
233
|
* @param input - 目标几何。type:Shape required:true
|
|
203
234
|
* @param params.factor - 三轴缩放系数(均 > 0)。type:[x,y,z] required:true
|
|
@@ -225,5 +256,6 @@ export const scale3d = defineOp({
|
|
|
225
256
|
// D11(裁决 2):`scale3d(p, [1,2,3])` == `scale3d(p, { factor: [1,2,3] })`;
|
|
226
257
|
// 标量 factor(如 `scale(p, 2)`)由 assertScale3dParams 拒绝并提示 `scale`。
|
|
227
258
|
slotMap: { keys: ['factor'], vec3Keys: ['factor'], shapeArity: 1 },
|
|
259
|
+
naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } },
|
|
228
260
|
});
|
|
229
261
|
//# sourceMappingURL=transform.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/api/transform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib transform — 变换对象库函数(translate/rotate_euler/scale/scale3d)\n *\n *\n * dispatchPath 静态判定 brep/mesh,\n * BREP 路径用 brepOf(input) 取输入实体、fromBrep 登记输出实体。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { translateBrep, rotateBrep, scaleBrep, solidToShape } from '../brep/brep-ops'\nimport { identityEvolution, identityHashEvolution } from '../brep/face-evolution'\nimport { getBackends } from '../runtime-state'\nimport { fromBrep, brepOf, getSlot } from '../shape'\nimport { propagateAllOrigins } from '../topology/naming/roles'\nimport type { RoleTable } from '../topology/naming/types'\nimport { defineOp } from '../sdk'\nimport { assertVec3, assertPositiveNumber } from './assert'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/** BREP 路径:变换 solid + 恒等面演化 + 三角化 + fromBrep 登记。 */\n\n/**\n * Validate translate parameters: `offset` must be a vec3.\n * @param params - the raw translate operation parameters.\n */\nexport function assertTranslateParams(params: Record<string, unknown>): void {\n assertVec3(params.offset, 'translate.offset')\n}\n\n/**\n * Validate rotate_euler parameters: `anglesDeg` must be a vec3, and `pivot`\n * (if provided) must also be a vec3.\n * @param params - the raw rotate_euler operation parameters.\n */\nexport function assertRotateParams(params: Record<string, unknown>): void {\n assertVec3(params.anglesDeg, 'rotate_euler.anglesDeg')\n if (params.pivot !== undefined && params.pivot !== null) {\n assertVec3(params.pivot, 'rotate_euler.pivot')\n }\n}\n\n/**\n * Validate scale parameters (brepjs contract, §4.6 裁决 2): `factor` must be a\n * positive number (uniform). The non-uniform array form belongs to `scale3d` —\n * any `scale(p, { factor: [x,y,z] })` call throws an explicit `E_ARGS_FORM`\n * error pointing at `scale3d` (error hint ≠ compatibility).\n * @param params - the raw scale operation parameters.\n */\nexport function assertScaleParams(params: Record<string, unknown>): void {\n if (Array.isArray(params.factor)) {\n throw new Error(\n '[faijs/args] scale: E_ARGS_FORM: uniform scaling takes a single number ' +\n '(scale(p, s, { center? })). Non-uniform scaling uses scale3d(p, [x,y,z]).',\n )\n }\n assertPositiveNumber(params.factor, 'scale.factor')\n}\n\n/**\n * Validate scale3d parameters (P6: factor locked to Vec3): `factor` must be a\n * vec3. The uniform scalar form belongs to `scale` — any `scale3d(p, 2)` call\n * throws an explicit `E_ARGS_FORM` error pointing at `scale` (§4.6 裁决 2).\n * @param params - the raw scale3d operation parameters.\n */\nexport function assertScale3dParams(params: Record<string, unknown>): void {\n if (typeof params.factor === 'number') {\n throw new Error(\n '[faijs/args] scale3d: E_ARGS_FORM: factor must be a vec3 [x, y, z]. ' +\n 'Uniform scaling now uses scale(p, 2) (§4.6 裁决 2).',\n )\n }\n assertVec3(params.factor, 'scale3d.factor')\n}\n\n/** BREP 路径:变换 solid + 恒等面演化 + 恒等 roleTable 传播 + 三角化 + fromBrep 登记。 */\nfunction transformBrep(op: string, input: Shape, params: Record<string, unknown>): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/transform] no OCCT kernel')\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[stdlib/transform] input is not BREP')\n\n let resultSolid: BrepHandle\n if (op === 'translate') {\n resultSolid = translateBrep(kernel, inputSolid, params.offset as Vec3)\n } else if (op === 'rotate_euler') {\n resultSolid = rotateBrep(kernel, inputSolid, params.anglesDeg as Vec3, params.pivot as Vec3 | undefined)\n } else {\n // op is 'scale' | 'scale3d':统一走 带不动点的 scaleBrep(factor number|Vec3)。\n resultSolid = scaleBrep(kernel, inputSolid, params.factor as number | Vec3, params.center as Vec3 | undefined)\n }\n\n // §2.4/§3.3:刚体变换面 1:1 保留——hash 恒等传播 roleTable(所有 origin)\n const inputTable = getSlot(input)?.roleTable as RoleTable | undefined\n let roleTable: RoleTable | undefined\n if (inputTable && inputTable.size > 0) {\n roleTable = propagateAllOrigins(inputTable, identityHashEvolution(kernel, inputSolid, resultSolid))\n }\n\n return fromBrep(solidToShape(kernel, resultSolid), {\n solid: resultSolid,\n // 变换不改变拓扑,面 ordinal 不变(与旧路径一致)\n faceEvolution: identityEvolution(kernel, resultSolid),\n roleTable,\n })\n}\n\n/**\n * 平移几何体。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name translate\n * @returns Shape 平移后的几何,装配的相对位置靠成员的变换语句表达。\n * @param input - 目标几何。type:Shape required:true\n * @param params.offset - 平移向量(mm)。type:[x,y,z] required:true\n * @example\n * const p1 = cad.translate(part0, { offset: [10, 0, 0] })\n */\nexport const translate = defineOp({\n name: 'translate',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/translate] no input geometry')\n assertTranslateParams(params)\n return cad.translate(input, params.offset as Vec3)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/translate] no input geometry')\n assertTranslateParams(params)\n return transformBrep('translate', input, params)\n },\n // D11: `translate(p, 10, 0, 0)` == `translate(p, { offset: [10, 0, 0] })`;\n // `offset` is a vec3 slot sitting after the single leading Shape argument.\n slotMap: { keys: ['offset'], vec3Keys: ['offset'], shapeArity: 1 },\n})\n\n/**\n * 绕轴旋转几何体。anglesDeg 为欧拉角(度,XYZ 顺序)。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name rotate_euler\n * @returns Shape 旋转后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.anglesDeg - 欧拉角(度,XYZ 顺序)。type:[x,y,z] required:true\n * @param params.pivot - 旋转中心。type:[x,y,z] 默认 原点\n * @example\n * const p2 = cad.rotate_euler(part0, { anglesDeg: [0, 0, 45] })\n * const p3 = cad.rotate_euler(part0, { anglesDeg: [0, 0, 45], pivot: [0,0,0] })\n */\nexport const rotate_euler = defineOp({\n name: 'rotate_euler',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/rotate_euler] no input geometry')\n assertRotateParams(params)\n return cad.rotate_euler(input, params.anglesDeg as Vec3, params.pivot as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/rotate_euler] no input geometry')\n assertRotateParams(params)\n return transformBrep('rotate_euler', input, params)\n },\n // D11: `rotate_euler(p, 0, 0, 45)` == `rotate_euler(p, { anglesDeg: [0, 0, 45] })`.\n slotMap: { keys: ['anglesDeg'], vec3Keys: ['anglesDeg'], shapeArity: 1 },\n})\n\n/**\n * 等比缩放几何体(brepjs 契约,§4.6 裁决 2)。factor 只收 number;不动点默认\n * 原点(与 vendored `scale(shape, factor, { center? })` 一致),`center` 可选。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name scale\n * @returns Shape 缩放后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.factor - 等比缩放系数(> 0)。type:number required:true\n * @param params.center - 缩放不动点(p 保持不动)。type:[x,y,z] 默认 [0,0,0](原点)\n * @example\n * const p4 = cad.scale(part0, 2)\n * const p5 = cad.scale(part0, { factor: 2, center: [10, 0, 0] })\n */\nexport const scale = defineOp({\n name: 'scale',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale] no input geometry')\n assertScaleParams(params)\n return cad.scale(input, params.factor as number, params.center as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale] no input geometry')\n assertScaleParams(params)\n return transformBrep('scale', input, params)\n },\n // L3 schema: factor/center for codegen/UI panels.\n schema: { factor: 'number', center: 'vec3?' },\n // D11(§4.6):`scale(p, 2)` == `scale(p, { factor: 2 })`(标量槽);尾参 options\n // ({center})经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['factor'], shapeArity: 1 },\n})\n\n/**\n * 非等比缩放几何体(faijs 语义,§1.4.4 裁决 2)。factor 定死 vec3 — 等比缩放请用\n * `scale(p, s)`,`scale3d(p, [x,y,z])` 才可非等比。`center` 为不动点(默认原点)。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name scale3d\n * @returns Shape 缩放后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.factor - 三轴缩放系数(均 > 0)。type:[x,y,z] required:true\n * @param params.center - 缩放不动点。type:[x,y,z] 默认 [0,0,0](原点)\n * @example\n * const p4 = cad.scale3d(part0, { factor: [2, 1, 1] })\n * const p5 = cad.scale3d(part0, [2, 1, 1], { center: [10, 0, 0] })\n */\nexport const scale3d = defineOp({\n name: 'scale3d',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale3d] no input geometry')\n assertScale3dParams(params)\n return cad.scale3d(input, params.factor as Vec3, params.center as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale3d] no input geometry')\n assertScale3dParams(params)\n return transformBrep('scale3d', input, params)\n },\n // L3 schema: factor/center for codegen/UI panels.\n schema: { factor: 'vec3', center: 'vec3?' },\n // D11(裁决 2):`scale3d(p, [1,2,3])` == `scale3d(p, { factor: [1,2,3] })`;\n // 标量 factor(如 `scale(p, 2)`)由 assertScale3dParams 拒绝并提示 `scale`。\n slotMap: { keys: ['factor'], vec3Keys: ['factor'], shapeArity: 1 },\n})\n"]}
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/api/transform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib transform — 变换对象库函数(translate/rotate_euler/scale/scale3d)\n *\n *\n * dispatchPath 静态判定 brep/mesh,\n * BREP 路径用 brepOf(input) 取输入实体、fromBrep 登记输出实体。\n */\n\nimport type { Shape, Vec3 } from '../mesh/types'\nimport { cad } from '../mesh'\nimport { rotateBrep, scaleBrep, solidToShape } from '../brep/brep-ops'\nimport {\n identityEvolution,\n identityHashEvolution,\n scaleWithHashEvolution,\n translateWithHashEvolution,\n} from '../brep/face-evolution'\nimport type { HashEvolution } from '../brep/face-evolution'\nimport { getBackends } 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 { assertVec3, assertPositiveNumber } from './assert'\nimport type { BrepHandle } from '../brep/engine/types'\nimport type { BrepEngineApi } from '../brep/engine/primitives'\n\n/** BREP 路径:变换 solid + 恒等面演化 + 三角化 + fromBrep 登记。 */\n\n/**\n * Validate translate parameters: `offset` must be a vec3.\n * @param params - the raw translate operation parameters.\n */\nexport function assertTranslateParams(params: Record<string, unknown>): void {\n assertVec3(params.offset, 'translate.offset')\n}\n\n/**\n * Validate rotate_euler parameters: `anglesDeg` must be a vec3, and `pivot`\n * (if provided) must also be a vec3.\n * @param params - the raw rotate_euler operation parameters.\n */\nexport function assertRotateParams(params: Record<string, unknown>): void {\n assertVec3(params.anglesDeg, 'rotate_euler.anglesDeg')\n if (params.pivot !== undefined && params.pivot !== null) {\n assertVec3(params.pivot, 'rotate_euler.pivot')\n }\n}\n\n/**\n * Validate scale parameters (brepjs contract, §4.6 裁决 2): `factor` must be a\n * positive number (uniform). The non-uniform array form belongs to `scale3d` —\n * any `scale(p, { factor: [x,y,z] })` call throws an explicit `E_ARGS_FORM`\n * error pointing at `scale3d` (error hint ≠ compatibility).\n * @param params - the raw scale operation parameters.\n */\nexport function assertScaleParams(params: Record<string, unknown>): void {\n if (Array.isArray(params.factor)) {\n throw new Error(\n '[faijs/args] scale: E_ARGS_FORM: uniform scaling takes a single number ' +\n '(scale(p, s, { center? })). Non-uniform scaling uses scale3d(p, [x,y,z]).',\n )\n }\n assertPositiveNumber(params.factor, 'scale.factor')\n}\n\n/**\n * Validate scale3d parameters (P6: factor locked to Vec3): `factor` must be a\n * vec3. The uniform scalar form belongs to `scale` — any `scale3d(p, 2)` call\n * throws an explicit `E_ARGS_FORM` error pointing at `scale` (§4.6 裁决 2).\n * @param params - the raw scale3d operation parameters.\n */\nexport function assertScale3dParams(params: Record<string, unknown>): void {\n if (typeof params.factor === 'number') {\n throw new Error(\n '[faijs/args] scale3d: E_ARGS_FORM: factor must be a vec3 [x, y, z]. ' +\n 'Uniform scaling now uses scale(p, 2) (§4.6 裁决 2).',\n )\n }\n assertVec3(params.factor, 'scale3d.factor')\n}\n\n/**\n * BREP 路径:变换 solid + 面演化 + roleTable 传播 + 三角化 + fromBrep 登记。\n *\n * Phase 0.3:优先走内核**权威**面演化(`translateWithHistory` / `scaleWithHistory`);\n * 内核无法单次表达的(`rotate_euler` 任意欧拉+pivot、`scale3d` 非等比)退回\n * `identityHashEvolution`,其\"面枚举序号在变换后保持\"的假设由\n * `brep/face-evolution.ordering.test.ts` 实测钉住。\n * @param op - the transform operation name.\n * @param input - the input geometry.\n * @param params - the operation parameters.\n * @returns the transformed Shape.\n */\nfunction transformBrep(op: string, input: Shape, params: Record<string, unknown>): Shape {\n const kernel = getBackends().kernel.brep as BrepEngineApi | null\n if (!kernel) throw new Error('[stdlib/transform] no OCCT kernel')\n const inputSolid = brepOf(input) as BrepHandle | undefined\n if (!inputSolid) throw new Error('[stdlib/transform] input is not BREP')\n\n let resultSolid: BrepHandle\n let hashEvolution: HashEvolution\n\n if (op === 'translate') {\n // 权威映射:内核 translateWithHistory(1:1 全覆盖,实测见 evolution-bindings.test.ts)\n const r = translateWithHashEvolution(kernel, inputSolid, params.offset as Vec3)\n resultSolid = r.result\n hashEvolution = r.evolution\n } else if (op === 'scale') {\n // 权威映射:内核 scaleWithHistory(仅均匀 —— assertScaleParams 已保证 factor 是 number)\n const r = scaleWithHashEvolution(\n kernel,\n inputSolid,\n (params.center as Vec3 | undefined) ?? [0, 0, 0],\n params.factor as number,\n )\n resultSolid = r.result\n hashEvolution = r.evolution\n } else {\n // rotate_euler(任意欧拉角+pivot)/ scale3d(非等比):内核无单次 WithHistory 可表达\n if (op === 'rotate_euler') {\n resultSolid = rotateBrep(kernel, inputSolid, params.anglesDeg as Vec3, params.pivot as Vec3 | undefined)\n } else {\n resultSolid = scaleBrep(kernel, inputSolid, params.factor as number | Vec3, params.center as Vec3 | undefined)\n }\n hashEvolution = identityHashEvolution(kernel, inputSolid, resultSolid)\n }\n\n // §2.4/§3.3:刚体变换面 1:1 保留 —— 沿演化传播 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, hashEvolution)\n }\n\n return fromBrep(solidToShape(kernel, resultSolid), {\n solid: resultSolid,\n // 变换不改变拓扑,面 ordinal 不变(与旧路径一致)\n faceEvolution: identityEvolution(kernel, resultSolid),\n roleTable,\n })\n}\n\n/**\n * 平移几何体。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name translate\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 平移后的几何,装配的相对位置靠成员的变换语句表达。\n * @param input - 目标几何。type:Shape required:true\n * @param params.offset - 平移向量(mm)。type:[x,y,z] required:true\n * @example\n * const p1 = cad.translate(part0, { offset: [10, 0, 0] })\n */\nexport const translate = defineOp({\n name: 'translate',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/translate] no input geometry')\n assertTranslateParams(params)\n return cad.translate(input, params.offset as Vec3)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/translate] no input geometry')\n assertTranslateParams(params)\n return transformBrep('translate', input, params)\n },\n // D11: `translate(p, 10, 0, 0)` == `translate(p, { offset: [10, 0, 0] })`;\n // `offset` is a vec3 slot sitting after the single leading Shape argument.\n slotMap: { keys: ['offset'], vec3Keys: ['offset'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 绕轴旋转几何体。anglesDeg 为欧拉角(度,XYZ 顺序)。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name rotate_euler\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 旋转后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.anglesDeg - 欧拉角(度,XYZ 顺序)。type:[x,y,z] required:true\n * @param params.pivot - 旋转中心。type:[x,y,z] 默认 原点\n * @example\n * const p2 = cad.rotate_euler(part0, { anglesDeg: [0, 0, 45] })\n * const p3 = cad.rotate_euler(part0, { anglesDeg: [0, 0, 45], pivot: [0,0,0] })\n */\nexport const rotate_euler = defineOp({\n name: 'rotate_euler',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/rotate_euler] no input geometry')\n assertRotateParams(params)\n return cad.rotate_euler(input, params.anglesDeg as Vec3, params.pivot as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/rotate_euler] no input geometry')\n assertRotateParams(params)\n return transformBrep('rotate_euler', input, params)\n },\n // D11: `rotate_euler(p, 0, 0, 45)` == `rotate_euler(p, { anglesDeg: [0, 0, 45] })`.\n slotMap: { keys: ['anglesDeg'], vec3Keys: ['anglesDeg'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 等比缩放几何体(brepjs 契约,§4.6 裁决 2)。factor 只收 number;不动点默认\n * 原点(与 vendored `scale(shape, factor, { center? })` 一致),`center` 可选。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name scale\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 缩放后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.factor - 等比缩放系数(> 0)。type:number required:true\n * @param params.center - 缩放不动点(p 保持不动)。type:[x,y,z] 默认 [0,0,0](原点)\n * @example\n * const p4 = cad.scale(part0, 2)\n * const p5 = cad.scale(part0, { factor: 2, center: [10, 0, 0] })\n */\nexport const scale = defineOp({\n name: 'scale',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale] no input geometry')\n assertScaleParams(params)\n return cad.scale(input, params.factor as number, params.center as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale] no input geometry')\n assertScaleParams(params)\n return transformBrep('scale', input, params)\n },\n // L3 schema: factor/center for codegen/UI panels.\n schema: { factor: 'number', center: 'vec3?' },\n // D11(§4.6):`scale(p, 2)` == `scale(p, { factor: 2 })`(标量槽);尾参 options\n // ({center})经 dual-form-args 尾参合并并入。\n slotMap: { keys: ['factor'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n\n/**\n * 非等比缩放几何体(faijs 语义,§1.4.4 裁决 2)。factor 定死 vec3 — 等比缩放请用\n * `scale(p, s)`,`scale3d(p, [x,y,z])` 才可非等比。`center` 为不动点(默认原点)。\n * @group 变换\n * @inputs 1\n * @async false\n * @qual ok\n * @name scale3d\n * @deprecated **`../3d_editor` 消费面**(原 `@deprecated` 措辞已于 2026-09-22 校正):该 op 为编辑器应用提供(承载拖拽与时间线语句),不属 faijs 平台面,但**不是废弃项**——它服务真实负载。**变更其 API 形态必须同步更新 `../3d_editor`**(见 `docs/plans/2026-09-22-topology-identity-development-plan.md` §2)。faijs 平台面不提供等价 op(需要时须按平台需求另行设计,不得直接搬用本 op)。\n * @returns Shape 缩放后的几何。\n * @param input - 目标几何。type:Shape required:true\n * @param params.factor - 三轴缩放系数(均 > 0)。type:[x,y,z] required:true\n * @param params.center - 缩放不动点。type:[x,y,z] 默认 [0,0,0](原点)\n * @example\n * const p4 = cad.scale3d(part0, { factor: [2, 1, 1] })\n * const p5 = cad.scale3d(part0, [2, 1, 1], { center: [10, 0, 0] })\n */\nexport const scale3d = defineOp({\n name: 'scale3d',\n mesh: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale3d] no input geometry')\n assertScale3dParams(params)\n return cad.scale3d(input, params.factor as Vec3, params.center as Vec3 | undefined)\n },\n brep: (input: Shape, params: Record<string, unknown>) => {\n if (!input) throw new Error('[stdlib/scale3d] no input geometry')\n assertScale3dParams(params)\n return transformBrep('scale3d', input, params)\n },\n // L3 schema: factor/center for codegen/UI panels.\n schema: { factor: 'vec3', center: 'vec3?' },\n // D11(裁决 2):`scale3d(p, [1,2,3])` == `scale3d(p, { factor: [1,2,3] })`;\n // 标量 factor(如 `scale(p, 2)`)由 assertScale3dParams 拒绝并提示 `scale`。\n slotMap: { keys: ['factor'], vec3Keys: ['factor'], shapeArity: 1 },\n naming: { kind: 'kernel', newFaces: { via: 'byAdjacency' } } as Provenance,\n})\n"]}
|