@faicad/faijs 0.13.2 → 0.16.0
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 +7 -0
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +44 -17
- 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 +71 -12
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +12 -8
- 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/edge-ref.d.ts.map +1 -1
- package/dist/api/edge-ref.js +7 -4
- 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/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/cad/script-face.d.ts +1 -1
- package/dist/api/generated/cad/script-face.d.ts.map +1 -1
- package/dist/api/generated/cad/script-face.js +1 -2
- package/dist/api/generated/cad/script-face.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 -2
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +1 -7
- package/dist/api/generated/script-face.d.ts.map +1 -1
- package/dist/api/generated/script-face.js +2 -4
- 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 -56
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +19 -68
- 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 +8 -12
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +22 -16
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +2 -1
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/compat-projection.d.ts +3 -1
- package/dist/api/internal/compat-projection.d.ts.map +1 -1
- package/dist/api/internal/compat-projection.js +8 -5
- package/dist/api/internal/compat-projection.js.map +1 -1
- package/dist/api/internal/replica-role-table.d.ts +36 -0
- package/dist/api/internal/replica-role-table.d.ts.map +1 -0
- package/dist/api/internal/replica-role-table.js +73 -0
- package/dist/api/internal/replica-role-table.js.map +1 -0
- package/dist/api/internal/result-unwrap.d.ts +3 -1
- package/dist/api/internal/result-unwrap.d.ts.map +1 -1
- package/dist/api/internal/result-unwrap.js +2 -2
- package/dist/api/internal/result-unwrap.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/occt-kernel-bridge.d.ts +105 -27
- package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
- package/dist/api/occt-kernel-bridge.js +255 -41
- package/dist/api/occt-kernel-bridge.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 +85 -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/replicate.d.ts +145 -0
- package/dist/api/replicate.d.ts.map +1 -0
- package/dist/api/replicate.js +351 -0
- package/dist/api/replicate.js.map +1 -0
- package/dist/api/revolve.d.ts +36 -0
- package/dist/api/revolve.d.ts.map +1 -0
- package/dist/api/revolve.js +165 -0
- package/dist/api/revolve.js.map +1 -0
- 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 +17 -0
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +86 -66
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/surface/projection-overrides.d.ts.map +1 -1
- package/dist/api/surface/projection-overrides.js +6 -0
- package/dist/api/surface/projection-overrides.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/boolean/deriveNormals.d.ts +5 -4
- package/dist/boolean/deriveNormals.d.ts.map +1 -1
- package/dist/boolean/deriveNormals.js +24 -7
- package/dist/boolean/deriveNormals.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 +66 -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 +44 -1
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +1 -5
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +246 -9
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +96 -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 +66 -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 +108 -12
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/browser.d.ts +6 -28
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +6 -17
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +13 -0
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +27 -0
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +46 -3
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +48 -3
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.d.ts +4 -4
- package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.js +7 -4
- 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/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 +52 -2
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +180 -9
- 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/env-agnostic.d.ts +38 -0
- package/dist/env-agnostic.d.ts.map +1 -0
- package/dist/env-agnostic.js +29 -0
- package/dist/env-agnostic.js.map +1 -0
- package/dist/fcstd/attachment.d.ts +8 -1
- package/dist/fcstd/attachment.d.ts.map +1 -1
- package/dist/fcstd/attachment.js +7 -1
- package/dist/fcstd/attachment.js.map +1 -1
- package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
- package/dist/fcstd/build-fai-zip.js +12 -7
- package/dist/fcstd/build-fai-zip.js.map +1 -1
- package/dist/fcstd/codegen.d.ts +10 -1
- package/dist/fcstd/codegen.d.ts.map +1 -1
- package/dist/fcstd/codegen.js +158 -49
- package/dist/fcstd/codegen.js.map +1 -1
- package/dist/fcstd/contour.d.ts.map +1 -1
- package/dist/fcstd/contour.js +23 -24
- package/dist/fcstd/contour.js.map +1 -1
- package/dist/fcstd/convert.d.ts +2 -18
- package/dist/fcstd/convert.d.ts.map +1 -1
- package/dist/fcstd/convert.js +35 -53
- package/dist/fcstd/convert.js.map +1 -1
- package/dist/fcstd/expressions.d.ts +24 -0
- package/dist/fcstd/expressions.d.ts.map +1 -1
- package/dist/fcstd/expressions.js +91 -0
- package/dist/fcstd/expressions.js.map +1 -1
- package/dist/fcstd/external-geo.d.ts +12 -1
- package/dist/fcstd/external-geo.d.ts.map +1 -1
- package/dist/fcstd/external-geo.js +15 -1
- package/dist/fcstd/external-geo.js.map +1 -1
- package/dist/fcstd/feature-translate.d.ts +21 -1
- package/dist/fcstd/feature-translate.d.ts.map +1 -1
- package/dist/fcstd/feature-translate.js +124 -8
- package/dist/fcstd/feature-translate.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 +121 -0
- package/dist/fcstd/structural-types.js.map +1 -0
- package/dist/index.d.ts +7 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -16
- package/dist/index.js.map +1 -1
- package/dist/lang/determinism-scanner.d.ts +71 -0
- package/dist/lang/determinism-scanner.d.ts.map +1 -0
- package/dist/lang/determinism-scanner.js +625 -0
- package/dist/lang/determinism-scanner.js.map +1 -0
- package/dist/lang/symbol-table.d.ts +31 -0
- package/dist/lang/symbol-table.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +13 -19
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +13 -19
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/lang/symbol-table.js +50 -1
- package/dist/lang/symbol-table.js.map +1 -1
- package/dist/mesh/creased-normals.d.ts +50 -0
- package/dist/mesh/creased-normals.d.ts.map +1 -0
- package/dist/mesh/creased-normals.js +114 -0
- package/dist/mesh/creased-normals.js.map +1 -0
- package/dist/mesh/decoration-provider.d.ts +53 -0
- package/dist/mesh/decoration-provider.d.ts.map +1 -0
- package/dist/mesh/decoration-provider.js +21 -0
- package/dist/mesh/decoration-provider.js.map +1 -0
- package/dist/mesh/engrave.d.ts +4 -0
- package/dist/mesh/engrave.d.ts.map +1 -1
- package/dist/mesh/engrave.js +22 -31
- package/dist/mesh/engrave.js.map +1 -1
- package/dist/mesh/index.d.ts +5 -14
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +7 -18
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +2 -1
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +5 -7
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/primitives.d.ts +5 -18
- package/dist/mesh/primitives.d.ts.map +1 -1
- package/dist/mesh/primitives.js +4 -48
- package/dist/mesh/primitives.js.map +1 -1
- package/dist/mesh/stl-loader.d.ts +23 -0
- package/dist/mesh/stl-loader.d.ts.map +1 -0
- package/dist/mesh/stl-loader.js +139 -0
- package/dist/mesh/stl-loader.js.map +1 -0
- package/dist/module-resolver/parse-imports.d.ts +37 -0
- package/dist/module-resolver/parse-imports.d.ts.map +1 -0
- package/dist/module-resolver/parse-imports.js +39 -0
- package/dist/module-resolver/parse-imports.js.map +1 -0
- package/dist/module-resolver/resolver.d.ts +1 -1
- package/dist/module-resolver/resolver.js +2 -2
- package/dist/module-resolver/resolver.js.map +1 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +37 -4
- package/dist/node-host/cli.js.map +1 -1
- package/dist/primitives/text/cjk-font.d.ts +42 -0
- package/dist/primitives/text/cjk-font.d.ts.map +1 -0
- package/dist/primitives/text/cjk-font.js +86 -0
- package/dist/primitives/text/cjk-font.js.map +1 -0
- 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/sdk.d.ts +2 -2
- package/dist/sdk.js +2 -2
- package/dist/sdk.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/symbol-table.d.ts +15 -0
- package/dist/symbol-table.d.ts.map +1 -0
- package/dist/symbol-table.js +14 -0
- package/dist/symbol-table.js.map +1 -0
- 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/vendored/brepjs/kernel/index.d.ts +5 -0
- package/dist/vendored/brepjs/kernel/index.d.ts.map +1 -1
- package/dist/vendored/brepjs/kernel/index.js +11 -0
- package/dist/vendored/brepjs/kernel/index.js.map +1 -1
- package/dist/weapp.d.ts +4 -4
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +7 -4
- package/dist/weapp.js.map +1 -1
- package/package.json +16 -14
- package/dist/api/compat/index.d.ts +0 -173
- package/dist/api/compat/index.d.ts.map +0 -1
- package/dist/api/compat/index.js +0 -222
- package/dist/api/compat/index.js.map +0 -1
- package/dist/api/compound.d.ts +0 -108
- package/dist/api/compound.d.ts.map +0 -1
- package/dist/api/compound.js +0 -162
- package/dist/api/compound.js.map +0 -1
- package/dist/api/copy.d.ts +0 -39
- package/dist/api/copy.d.ts.map +0 -1
- package/dist/api/copy.js +0 -81
- package/dist/api/copy.js.map +0 -1
- package/dist/api/fai_drill.d.ts +0 -46
- package/dist/api/fai_drill.d.ts.map +0 -1
- package/dist/api/fai_drill.js +0 -230
- package/dist/api/fai_drill.js.map +0 -1
- package/dist/api/fai_extrude.d.ts +0 -36
- package/dist/api/fai_extrude.d.ts.map +0 -1
- package/dist/api/fai_extrude.js +0 -78
- package/dist/api/fai_extrude.js.map +0 -1
- package/dist/api/fai_split.d.ts +0 -46
- package/dist/api/fai_split.d.ts.map +0 -1
- package/dist/api/fai_split.js +0 -253
- package/dist/api/fai_split.js.map +0 -1
- package/dist/api/load.d.ts +0 -39
- package/dist/api/load.d.ts.map +0 -1
- package/dist/api/load.js +0 -82
- package/dist/api/load.js.map +0 -1
- package/dist/api/svgExtrude.d.ts +0 -32
- package/dist/api/svgExtrude.d.ts.map +0 -1
- package/dist/api/svgExtrude.js +0 -73
- package/dist/api/svgExtrude.js.map +0 -1
- package/dist/api/text.d.ts +0 -34
- package/dist/api/text.d.ts.map +0 -1
- package/dist/api/text.js +0 -100
- package/dist/api/text.js.map +0 -1
- package/dist/brep/text/fontTestHelper.d.ts +0 -30
- package/dist/brep/text/fontTestHelper.d.ts.map +0 -1
- package/dist/brep/text/fontTestHelper.js +0 -57
- package/dist/brep/text/fontTestHelper.js.map +0 -1
- package/dist/cad-runtime/module-executor.d.ts +0 -271
- package/dist/cad-runtime/module-executor.d.ts.map +0 -1
- package/dist/cad-runtime/module-executor.js +0 -630
- package/dist/cad-runtime/module-executor.js.map +0 -1
- package/dist/cad-runtime/terminal-dag.d.ts +0 -65
- package/dist/cad-runtime/terminal-dag.d.ts.map +0 -1
- package/dist/cad-runtime/terminal-dag.js +0 -167
- package/dist/cad-runtime/terminal-dag.js.map +0 -1
- package/dist/faqts/browser.d.ts +0 -16
- package/dist/faqts/browser.d.ts.map +0 -1
- package/dist/faqts/browser.js +0 -13
- package/dist/faqts/browser.js.map +0 -1
- package/dist/faqts/exec-blob.d.ts +0 -14
- package/dist/faqts/exec-blob.d.ts.map +0 -1
- package/dist/faqts/exec-blob.js +0 -22
- package/dist/faqts/exec-blob.js.map +0 -1
- package/dist/faqts/exec-node.d.ts +0 -15
- package/dist/faqts/exec-node.d.ts.map +0 -1
- package/dist/faqts/exec-node.js +0 -29
- package/dist/faqts/exec-node.js.map +0 -1
- package/dist/faqts/imports.d.ts +0 -74
- package/dist/faqts/imports.d.ts.map +0 -1
- package/dist/faqts/imports.js +0 -95
- package/dist/faqts/imports.js.map +0 -1
- package/dist/faqts/index.d.ts +0 -22
- package/dist/faqts/index.d.ts.map +0 -1
- package/dist/faqts/index.js +0 -21
- package/dist/faqts/index.js.map +0 -1
- package/dist/faqts/node.d.ts +0 -23
- package/dist/faqts/node.d.ts.map +0 -1
- package/dist/faqts/node.js +0 -23
- package/dist/faqts/node.js.map +0 -1
- package/dist/faqts/run.d.ts +0 -62
- package/dist/faqts/run.d.ts.map +0 -1
- package/dist/faqts/run.js +0 -62
- package/dist/faqts/run.js.map +0 -1
- package/dist/faqts/transform.d.ts +0 -43
- package/dist/faqts/transform.d.ts.map +0 -1
- package/dist/faqts/transform.js +0 -35
- package/dist/faqts/transform.js.map +0 -1
- package/dist/lang/compile.d.ts +0 -50
- package/dist/lang/compile.d.ts.map +0 -1
- package/dist/lang/compile.js +0 -368
- package/dist/lang/compile.js.map +0 -1
- package/dist/lang/keep.d.ts +0 -109
- package/dist/lang/keep.d.ts.map +0 -1
- package/dist/lang/keep.js +0 -226
- package/dist/lang/keep.js.map +0 -1
- package/dist/lang/parser.d.ts +0 -91
- package/dist/lang/parser.d.ts.map +0 -1
- package/dist/lang/parser.js +0 -1594
- package/dist/lang/parser.js.map +0 -1
- package/dist/mesh/drill-hole/DrillHoleCore.d.ts +0 -90
- package/dist/mesh/drill-hole/DrillHoleCore.d.ts.map +0 -1
- package/dist/mesh/drill-hole/DrillHoleCore.js +0 -287
- package/dist/mesh/drill-hole/DrillHoleCore.js.map +0 -1
- package/dist/mesh/drill-hole/drill-types.d.ts +0 -34
- package/dist/mesh/drill-hole/drill-types.d.ts.map +0 -1
- package/dist/mesh/drill-hole/drill-types.js +0 -7
- package/dist/mesh/drill-hole/drill-types.js.map +0 -1
- package/dist/mesh/fai_drill.d.ts +0 -21
- package/dist/mesh/fai_drill.d.ts.map +0 -1
- package/dist/mesh/fai_drill.js +0 -92
- package/dist/mesh/fai_drill.js.map +0 -1
- package/dist/mesh/fai_extrude.d.ts +0 -24
- package/dist/mesh/fai_extrude.d.ts.map +0 -1
- package/dist/mesh/fai_extrude.js +0 -42
- package/dist/mesh/fai_extrude.js.map +0 -1
- package/dist/mesh/fai_split.d.ts +0 -164
- package/dist/mesh/fai_split.d.ts.map +0 -1
- package/dist/mesh/fai_split.js +0 -269
- package/dist/mesh/fai_split.js.map +0 -1
- package/dist/primitives/svg-extrude.d.ts +0 -43
- package/dist/primitives/svg-extrude.d.ts.map +0 -1
- package/dist/primitives/svg-extrude.js +0 -78
- package/dist/primitives/svg-extrude.js.map +0 -1
- package/dist/primitives/text/cjk.d.ts +0 -61
- package/dist/primitives/text/cjk.d.ts.map +0 -1
- package/dist/primitives/text/cjk.js +0 -215
- package/dist/primitives/text/cjk.js.map +0 -1
- package/dist/primitives/text-geometry.d.ts +0 -47
- package/dist/primitives/text-geometry.d.ts.map +0 -1
- package/dist/primitives/text-geometry.js +0 -127
- package/dist/primitives/text-geometry.js.map +0 -1
- package/dist/test-helpers.d.ts +0 -31
- package/dist/test-helpers.d.ts.map +0 -1
- package/dist/test-helpers.js +0 -55
- package/dist/test-helpers.js.map +0 -1
- package/dist/vendored/brepjs/core/kernelReentrancy.d.ts +0 -41
- package/dist/vendored/brepjs/core/kernelReentrancy.d.ts.map +0 -1
- package/dist/vendored/brepjs/core/kernelReentrancy.js +0 -68
- package/dist/vendored/brepjs/core/kernelReentrancy.js.map +0 -1
package/dist/fcstd/codegen.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { translateObject, isJsExpr, jsExpr } from './feature-translate.js';
|
|
2
|
-
import { isIdentityPlacement,
|
|
1
|
+
import { translateObject, isJsExpr, jsExpr, BODY_CHAIN_BASE } from './feature-translate.js';
|
|
2
|
+
import { isIdentityPlacement, invertApplyPlacement } from './placement.js';
|
|
3
|
+
import { isNonModelingType } from './structural-types.js';
|
|
3
4
|
/** Extract link dependencies relevant for ordering. */
|
|
4
5
|
function depsOf(obj) {
|
|
5
6
|
const out = [];
|
|
@@ -10,9 +11,21 @@ function depsOf(obj) {
|
|
|
10
11
|
if (v)
|
|
11
12
|
out.push(v);
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
// GOTCHA (ArchDetail corpus, 2026-09-21): App::PropertyLinkList properties.
|
|
15
|
+
// `Shapes` is the multi-input geometry list (Part::MultiFuse / MultiCommon);
|
|
16
|
+
// `Links` is Part::Compound's member list. Neither is a single-value link
|
|
17
|
+
// property, so missing it here left the Compound with NO dependency on its
|
|
18
|
+
// members — Kahn then placed it at its document position, and ArchDetail's
|
|
19
|
+
// compounds sit at doc index 10-14 while every member sits at 269+ (Draft
|
|
20
|
+
// emits the wire first, the compound last, but the file order is sorted by
|
|
21
|
+
// name). inputVar() found nothing yet → `compound-missing-members` for all
|
|
22
|
+
// five compounds, for a pure ordering reason.
|
|
23
|
+
const linkLists = ['Shapes', 'Links'];
|
|
24
|
+
for (const p of linkLists) {
|
|
25
|
+
const el = obj.properties.get(p)?.children[0];
|
|
26
|
+
if (!el)
|
|
27
|
+
continue;
|
|
28
|
+
for (const link of el.children) {
|
|
16
29
|
const v = link.attributes['value'];
|
|
17
30
|
if (v)
|
|
18
31
|
out.push(v);
|
|
@@ -56,17 +69,39 @@ function bodyFeatureNames(obj) {
|
|
|
56
69
|
* @param sketchContours solved contours per L0 sketch, keyed by object name
|
|
57
70
|
* @param baseName source base name used in generated file headers/labels
|
|
58
71
|
* @param placements per-object Placement used to re-orient placed geometry; missing → identity
|
|
72
|
+
* @param shapeCarriers objects whose Shape is a ZIP .brp member (pure-Shape carriers → shape-asset)
|
|
73
|
+
* @param brokenShapeAssets objects whose Shape `file` attribute points at a missing/empty member (explicit gap)
|
|
59
74
|
* @returns the lowered call plan, per-object dispositions and generated code
|
|
60
75
|
*/
|
|
61
76
|
export function generateModel(doc, sketchVerdict, sketchContours, baseName,
|
|
62
77
|
/** M8.3: per-object Placement (sketches + features); missing → identity */
|
|
63
78
|
placements,
|
|
64
79
|
/** H7: objects whose Shape is a ZIP .brp member (pure-Shape carriers → shape-asset). */
|
|
65
|
-
shapeCarriers
|
|
80
|
+
shapeCarriers,
|
|
81
|
+
/** E4: objects whose Shape `file` attribute points at a missing/empty member (explicit gap). */
|
|
82
|
+
brokenShapeAssets) {
|
|
66
83
|
const byName = new Map(doc.objects.map((o) => [o.name, o]));
|
|
84
|
+
// GOTCHA (test_geomop corpus, 2026-09-20): a dependency on a Body
|
|
85
|
+
// CONTAINER (Part::Cut with Tool→Body) really waits for the Body's
|
|
86
|
+
// features to have built the chain — expand the dep to the member
|
|
87
|
+
// features so Kahn orders the consumer AFTER the chain exists (and
|
|
88
|
+
// chainVar.get(Body) resolves). Treating the container itself as
|
|
89
|
+
// satisfiable instead let the Cut run before the chain was built.
|
|
67
90
|
const nodes = new Map();
|
|
68
91
|
for (const obj of doc.objects) {
|
|
69
|
-
|
|
92
|
+
const deps = new Set();
|
|
93
|
+
for (const d of depsOf(obj)) {
|
|
94
|
+
const target = byName.get(d);
|
|
95
|
+
if (target?.type === 'PartDesign::Body') {
|
|
96
|
+
for (const m of bodyFeatureNames(target))
|
|
97
|
+
if (byName.has(m))
|
|
98
|
+
deps.add(m);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
deps.add(d);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
nodes.set(obj.name, { name: obj.name, obj, deps });
|
|
70
105
|
}
|
|
71
106
|
// Kahn topological sort; objects with unbuilt deps fall back to insertion
|
|
72
107
|
// order iteration until progress stalls (remaining are baked with reason).
|
|
@@ -95,7 +130,7 @@ shapeCarriers) {
|
|
|
95
130
|
const node = nodes.get(name);
|
|
96
131
|
if (built.has(node.name))
|
|
97
132
|
continue;
|
|
98
|
-
if ([...node.deps].every((d) => built.has(d) || !byName.has(d))) {
|
|
133
|
+
if ([...node.deps].every((d) => built.has(d) || !byName.has(d) || byName.get(d).type === 'PartDesign::Body')) {
|
|
99
134
|
built.add(node.name);
|
|
100
135
|
order.push(node.name);
|
|
101
136
|
progress = true;
|
|
@@ -156,16 +191,28 @@ shapeCarriers) {
|
|
|
156
191
|
}
|
|
157
192
|
continue;
|
|
158
193
|
}
|
|
159
|
-
|
|
160
|
-
|
|
194
|
+
// Non-modeling objects are preserved-only and MUST be short-circuited
|
|
195
|
+
// BEFORE translation. GOTCHA (PadTest, 2026-09-21): this used to list only
|
|
196
|
+
// `App::Origin/Plane/Line`, so a Body's `PartDesign::Plane` went through
|
|
197
|
+
// the translator, matched the shape-asset rule (datum planes store a
|
|
198
|
+
// `Shape` .brp — the plane face) and was folded into the Body's chain:
|
|
199
|
+
// `cad.union(pad, datumPlane)`. That both corrupts the solid and fails at
|
|
200
|
+
// run time (`cad.load` requires a solid; a plane face has none). The
|
|
201
|
+
// predicate is shared with the C4 audit (`structural-types.ts`) so codegen
|
|
202
|
+
// and the disposition ledger can never disagree about what is non-modeling.
|
|
203
|
+
if (isNonModelingType(obj.type)) {
|
|
204
|
+
results.push({ name, type: obj.type, calls: [], disposition: 'preserved-only', reason: 'structural' });
|
|
161
205
|
continue;
|
|
162
206
|
}
|
|
163
207
|
// Sketches are now real face variables (see the Sketcher::SketchObject
|
|
164
208
|
// branch above), so every dependency that resolves to one flows through.
|
|
165
209
|
const verdict = translateObject(obj, (dep) => {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
210
|
+
// GOTCHA (test_geomop corpus, 2026-09-20): a dependency on a Body
|
|
211
|
+
// CONTAINER (Part::Cut with Tool→Body) resolves against the Body's
|
|
212
|
+
// accumulated chain head, not `variables` — the container name is
|
|
213
|
+
// never registered there (its result lives in chainVar).
|
|
214
|
+
return variables.get(dep) ?? chainVar.get(dep);
|
|
215
|
+
}, doc.objects, shapeCarriers, brokenShapeAssets);
|
|
169
216
|
node.verdict = verdict;
|
|
170
217
|
if (verdict.kind === 'translated') {
|
|
171
218
|
// rename output vars to partN sequence
|
|
@@ -174,6 +221,15 @@ shapeCarriers) {
|
|
|
174
221
|
variables.set(call.out, v);
|
|
175
222
|
// remap inputs that were intermediate (Pocket_cut) or named outputs
|
|
176
223
|
call.inputs = call.inputs.map((i) => variables.get(i) ?? i);
|
|
224
|
+
// GOTCHA (ArchDetail s444, 2026-09-21): `cad.compound` passes its
|
|
225
|
+
// members as LEXICAL VARIABLE NAMES inside `params.members` — they
|
|
226
|
+
// must be remapped like `inputs`, otherwise renderArgs emits them as
|
|
227
|
+
// string literals and the op receives strings (no BREP handle) and
|
|
228
|
+
// throws "compound members are not all on the BREP chain".
|
|
229
|
+
const members = call.params?.members;
|
|
230
|
+
if (Array.isArray(members)) {
|
|
231
|
+
call.params.members = members.map((m) => typeof m === 'string' ? (variables.get(m) ?? m) : m);
|
|
232
|
+
}
|
|
177
233
|
call.out = v;
|
|
178
234
|
calls.push(call);
|
|
179
235
|
}
|
|
@@ -193,25 +249,25 @@ shapeCarriers) {
|
|
|
193
249
|
const lastVar = verdict.calls.at(-1)?.out;
|
|
194
250
|
const sketchLink = obj.properties.get('Sketch')?.children[0]?.attributes['value'];
|
|
195
251
|
const pl = (sketchLink ? placements?.get(sketchLink) : undefined) ?? placements?.get(name);
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
}
|
|
252
|
+
// GOTCHA (H13, TO92, 2026-09-23): a shape-asset object's frozen `.brp`
|
|
253
|
+
// member is saved by FreeCAD WITH its Placement already applied (the
|
|
254
|
+
// asset's bbox starts at the placed z). Re-emitting `cad.place` with the
|
|
255
|
+
// object's stored Placement applies the SAME transform twice — volume
|
|
256
|
+
// and solids stay correct, only a bbox/com parity check exposes it.
|
|
257
|
+
// The import already carries the placement; never place it again.
|
|
258
|
+
const isShapeAsset = verdict.reason === 'shape-asset';
|
|
259
|
+
if (lastVar && pl && !isIdentityPlacement(pl) && !isShapeAsset) {
|
|
260
|
+
// 单个刚性放置:旋转(四元数,绕局部原点)+ 平移 = FreeCAD Placement(P,Q)。
|
|
261
|
+
// 直接发 cad.place,避免 euler 往返损失精度(方案 §4.7:两语句合一)。
|
|
262
|
+
const cur = lastVar;
|
|
263
|
+
const rv = newVar();
|
|
264
|
+
variables.set(cur, rv); // map old name → placed var for consumers
|
|
265
|
+
calls.push({
|
|
266
|
+
out: rv, op: 'cad.place', source: name, inputs: [cur],
|
|
267
|
+
params: { rotation: [...pl.q], position: [...pl.p] },
|
|
268
|
+
});
|
|
213
269
|
// the object's variable is now the fully placed result
|
|
214
|
-
variables.set(name,
|
|
270
|
+
variables.set(name, rv);
|
|
215
271
|
}
|
|
216
272
|
// M9.4 (D-C): fold the feature into its Body's chain — AFTER the placement
|
|
217
273
|
// step so the chain accumulates the PLACED feature shape. Pocket/Cut
|
|
@@ -234,6 +290,14 @@ shapeCarriers) {
|
|
|
234
290
|
// (bbox already exact at delta 0).
|
|
235
291
|
if (prev) {
|
|
236
292
|
for (const c of verdict.calls) {
|
|
293
|
+
// H7 (hole_puzzle corpus): the Pocket had NO BaseFeature property —
|
|
294
|
+
// the translator emitted BODY_CHAIN_BASE as the subtract's base
|
|
295
|
+
// input; retarget it at the chain head here (after the earlier
|
|
296
|
+
// inputs remap, which leaves the marker untouched since it is not
|
|
297
|
+
// a variable name).
|
|
298
|
+
if (c.inputs) {
|
|
299
|
+
c.inputs = c.inputs.map((i) => (i === BODY_CHAIN_BASE ? prev : i));
|
|
300
|
+
}
|
|
237
301
|
if (c.op === 'cad.extrude' && c.params.baseFeature !== undefined) {
|
|
238
302
|
// GOTCHA (PadTest V6 residual): the up-to extrude builds its
|
|
239
303
|
// prism in the SKETCH-LOCAL frame, but the chain head (prev)
|
|
@@ -244,25 +308,24 @@ shapeCarriers) {
|
|
|
244
308
|
// AddShape 48199 vs rebuilt deficit ~9108 mm^3 → 3.2% total).
|
|
245
309
|
const needsInverse = pl !== undefined && !isIdentityPlacement(pl);
|
|
246
310
|
if (needsInverse && pl) {
|
|
311
|
+
// 逆向刚性放置(单点发射,方案 §4.7):rotation 取共轭四元数、
|
|
312
|
+
// position 取 invertApplyPlacement(pl, 0) = -(invQ·p),合成为
|
|
313
|
+
// 一个 cad.place,避免 euler 往返。语义 = invertApplyPlacement(pl, prev)。
|
|
247
314
|
const invQ = [
|
|
248
315
|
-pl.q[0], -pl.q[1], -pl.q[2], pl.q[3],
|
|
249
316
|
];
|
|
250
|
-
const
|
|
251
|
-
const tv = newVar();
|
|
252
|
-
const tvCall = {
|
|
253
|
-
out: tv, op: 'cad.translate', source: name,
|
|
254
|
-
inputs: [prev], params: { offset: [-pl.p[0], -pl.p[1], -pl.p[2]] },
|
|
255
|
-
};
|
|
317
|
+
const invPos = invertApplyPlacement(pl, [0, 0, 0]);
|
|
256
318
|
const rv = newVar();
|
|
257
319
|
const rvCall = {
|
|
258
|
-
out: rv, op: 'cad.
|
|
259
|
-
inputs: [
|
|
320
|
+
out: rv, op: 'cad.place', source: name,
|
|
321
|
+
inputs: [prev],
|
|
322
|
+
params: { rotation: invQ, position: invPos },
|
|
260
323
|
};
|
|
261
324
|
// insert BEFORE the extrude call: faijs is a statement
|
|
262
325
|
// language — `baseFeature: partN` referencing a later
|
|
263
326
|
// statement is E_REFERENCE (parser rejects forward refs).
|
|
264
327
|
const at = calls.indexOf(c);
|
|
265
|
-
calls.splice(at < 0 ? calls.length : at, 0,
|
|
328
|
+
calls.splice(at < 0 ? calls.length : at, 0, rvCall);
|
|
266
329
|
c.params.baseFeature = jsExpr(rv);
|
|
267
330
|
}
|
|
268
331
|
else {
|
|
@@ -292,6 +355,14 @@ shapeCarriers) {
|
|
|
292
355
|
chainVar.set(body, nv);
|
|
293
356
|
}
|
|
294
357
|
}
|
|
358
|
+
// H7 guard (motor_mount_inch corpus): a feature outside a Body (or with
|
|
359
|
+
// no chain head yet) never gets its BODY_CHAIN_BASE retargeted — the
|
|
360
|
+
// marker would leak into the generated JS as an illegal identifier
|
|
361
|
+
// (parser kills the whole file). Downgrade to an explicit gap instead.
|
|
362
|
+
if (verdict.calls.some((c) => c.inputs?.includes(BODY_CHAIN_BASE))) {
|
|
363
|
+
results.push({ name, type: obj.type, calls: [], disposition: 'baked', reason: 'pocket-missing-dependency' });
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
295
366
|
results.push({ name, type: obj.type, variable: verdict.calls.at(-1)?.out, calls: verdict.calls, disposition: 'translated', reason: verdict.reason });
|
|
296
367
|
}
|
|
297
368
|
else if (verdict.kind === 'baked') {
|
|
@@ -311,7 +382,7 @@ shapeCarriers) {
|
|
|
311
382
|
// (including the chain union/subtract calls emitted for it) go to
|
|
312
383
|
// model/<BodyName>.fai.js; everything else (loose Part features) stays in
|
|
313
384
|
// main.fai.js. When no Body has geometry, everything lands in main (the
|
|
314
|
-
// single-file shape). Aggregate entry
|
|
385
|
+
// single-file shape). Aggregate entry compounds per-file roots via cad.compound.
|
|
315
386
|
const callBody = new Map();
|
|
316
387
|
for (const r of results) {
|
|
317
388
|
const b = memberToBody.get(r.name);
|
|
@@ -339,20 +410,49 @@ shapeCarriers) {
|
|
|
339
410
|
// further down (`let` TDZ ReferenceError at run time: `part8` used `part6`).
|
|
340
411
|
// Filtering `calls` in place preserves the topological order.
|
|
341
412
|
const assigned = new Map(); // call.out → Body file name
|
|
413
|
+
// chain-head var → terminal alias (and owning Body) — needed DURING
|
|
414
|
+
// routing: a foreign chain head is never in `assigned` (it is a Body's
|
|
415
|
+
// accumulated var, not a call output), so input-body checks must consult
|
|
416
|
+
// this map to detect cross-Body references.
|
|
417
|
+
const headToTerminal = new Map();
|
|
418
|
+
const headToBody = new Map();
|
|
419
|
+
for (const b of bodiesWithGeo) {
|
|
420
|
+
headToTerminal.set(chainVar.get(b), `${b}_out`);
|
|
421
|
+
headToBody.set(chainVar.get(b), b);
|
|
422
|
+
}
|
|
423
|
+
const mainPending = [];
|
|
424
|
+
const mainOuts = new Set();
|
|
342
425
|
for (const c of calls) {
|
|
343
426
|
const own = callBody.get(c.out);
|
|
344
|
-
const
|
|
427
|
+
const inputBodies = c.inputs.map((inp) => assigned.get(inp) ?? headToBody.get(inp)).filter((b) => b !== undefined);
|
|
428
|
+
const viaInput = inputBodies[0];
|
|
345
429
|
const b = own !== undefined && bodiesWithGeo.has(own) ? own : viaInput;
|
|
346
|
-
|
|
430
|
+
// GOTCHA (test_geomop corpus, 2026-09-20): a call whose own Body
|
|
431
|
+
// differs from an input's Body (Part::Cut with Base in another Body's
|
|
432
|
+
// chain) must NOT be emitted into its own Body file — the input
|
|
433
|
+
// variable lives in ANOTHER module and is not declared there
|
|
434
|
+
// (SEC_FREE_IDENT at check time). Same for inputs that will live in
|
|
435
|
+
// MAIN (loose Part boxes): routing is a forward pass over the
|
|
436
|
+
// topologically sorted calls, so main outputs are already known.
|
|
437
|
+
// NOTE: Body-chain fold calls (union/subtract emitted during folding)
|
|
438
|
+
// are NOT in `results`, so `own` is undefined for them — the main-input
|
|
439
|
+
// check must not depend on `own`.
|
|
440
|
+
const mixed = inputBodies.some((ib) => ib !== b) || (own !== undefined && viaInput !== undefined && viaInput !== own);
|
|
441
|
+
const touchesMain = c.inputs.some((i) => mainOuts.has(i));
|
|
442
|
+
if (b !== undefined && bodiesWithGeo.has(b) && !mixed && !touchesMain && (own === undefined || own === b)) {
|
|
347
443
|
if (!perBody.has(b))
|
|
348
444
|
perBody.set(b, []);
|
|
349
445
|
perBody.get(b).push(c);
|
|
350
446
|
assigned.set(c.out, b);
|
|
351
447
|
}
|
|
352
448
|
else {
|
|
353
|
-
|
|
449
|
+
mainPending.push(c);
|
|
450
|
+
mainOuts.add(c.out);
|
|
354
451
|
}
|
|
355
452
|
}
|
|
453
|
+
for (const c of mainPending) {
|
|
454
|
+
mainCalls.push({ ...c, inputs: c.inputs.map((i) => headToTerminal.get(i) ?? i) });
|
|
455
|
+
}
|
|
356
456
|
for (const b of bodiesWithGeo) {
|
|
357
457
|
const bodyCalls = perBody.get(b) ?? [];
|
|
358
458
|
// terminal: alias the chain head to <Body>_out so the aggregate entry
|
|
@@ -364,7 +464,7 @@ shapeCarriers) {
|
|
|
364
464
|
];
|
|
365
465
|
files.push({ path: `model/${b}.fai.js`, code: lowerBody(withTerminal, `${baseName}/${b}`, b), body: b });
|
|
366
466
|
}
|
|
367
|
-
// main.fai.js: aggregate the per-Body terminals via cad.
|
|
467
|
+
// main.fai.js: aggregate the per-Body terminals via cad.compound. M10c:
|
|
368
468
|
// cross-file references close through the standard relative-import
|
|
369
469
|
// contract (module-registry D6) — each Body module's terminal alias
|
|
370
470
|
// `<Body>_out` is its live shape, so a named import binds it.
|
|
@@ -373,7 +473,7 @@ shapeCarriers) {
|
|
|
373
473
|
lines.push(`// Units: mm (faijs contract; FCStd internal units are mm)`);
|
|
374
474
|
const members = [...bodiesWithGeo].map((b) => `${b}_out`);
|
|
375
475
|
// Always import the per-Body terminals: the aggregate entry references
|
|
376
|
-
// `<Body>_out` in BOTH the cad.
|
|
476
|
+
// `<Body>_out` in BOTH the cad.compound (multi-Body) and the single-Body alias
|
|
377
477
|
// path, so a missing import is a SEC_FREE_IDENT parse error (GOTCHA: the
|
|
378
478
|
// single-Body branch previously emitted `let part_out = <Body>_out;` with
|
|
379
479
|
// no import). `mainCalls` may still be empty here.
|
|
@@ -388,7 +488,7 @@ shapeCarriers) {
|
|
|
388
488
|
}
|
|
389
489
|
if (members.length > 1) {
|
|
390
490
|
rootVar = 'part_out';
|
|
391
|
-
lines.push(`let part_out = cad.
|
|
491
|
+
lines.push(`let part_out = cad.compound({ members: [${members.join(', ')}] });`);
|
|
392
492
|
}
|
|
393
493
|
else if (members.length === 1) {
|
|
394
494
|
// single Body: the imported terminal IS the result — alias keeps a
|
|
@@ -437,7 +537,7 @@ function lower(calls, baseName) {
|
|
|
437
537
|
const consumed = new Set(calls.flatMap((c) => c.inputs));
|
|
438
538
|
const roots = calls.filter((c) => !consumed.has(c.out)).map((c) => c.out);
|
|
439
539
|
if (roots.length > 1) {
|
|
440
|
-
lines.push(`let part_out = cad.
|
|
540
|
+
lines.push(`let part_out = cad.compound({ members: [${roots.join(', ')}] });`);
|
|
441
541
|
}
|
|
442
542
|
else if (roots.length === 0) {
|
|
443
543
|
lines.push(`// no translated geometry (all baked)`);
|
|
@@ -478,13 +578,22 @@ function containsJsExpr(v) {
|
|
|
478
578
|
}
|
|
479
579
|
function renderArgs(call) {
|
|
480
580
|
const positional = [
|
|
481
|
-
...call.inputs.map((i) => i),
|
|
581
|
+
...(call.noPositionalArgs ? [] : call.inputs.map((i) => i)),
|
|
482
582
|
...(call.literals ?? []).map((l) => renderValue(l)),
|
|
483
583
|
].filter((s) => s.length > 0); // M7.1: drop empty entries so we never emit `(, `
|
|
484
584
|
const named = [];
|
|
485
585
|
for (const [k, v] of Object.entries(call.params ?? {})) {
|
|
486
586
|
if (v === undefined)
|
|
487
587
|
continue;
|
|
588
|
+
// GOTCHA (ArchDetail s444, 2026-09-21): `cad.compound`'s `members` are
|
|
589
|
+
// LEXICAL VARIABLE NAMES, not data strings — render them bare, like
|
|
590
|
+
// positional inputs. renderValue would quote them and the op would
|
|
591
|
+
// receive strings with no BREP handle
|
|
592
|
+
// ("compound members are not all on the BREP chain").
|
|
593
|
+
if (k === 'members' && Array.isArray(v)) {
|
|
594
|
+
named.push(`members: [${v.join(', ')}]`);
|
|
595
|
+
continue;
|
|
596
|
+
}
|
|
488
597
|
named.push(`${k}: ${renderValue(v)}`);
|
|
489
598
|
}
|
|
490
599
|
const namedBlock = named.length ? `{ ${named.join(', ')} }` : '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/fcstd/codegen.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M5 — code generation: object graph + M4 call plans → model/*.fai.js.\n *\n * M5.1 topological order: Body.Group order wins where present; otherwise\n * PropertyLink dependency order. Cycles / missing deps → baked (no fallback\n * heuristics — explicit downgrade per plan §12).\n * M5.2 lowering: params → JS constants; calls → `const partN = await cad.x(...)`;\n * statement ids sN. Sketch contours enter as blueprint literals.\n */\nimport type { FcstdDocument } from './document.js';\nimport type { CadCall, TranslateVerdict } from './feature-translate.js';\nimport { translateObject, isJsExpr, jsExpr } from './feature-translate.js';\nimport type { Contour } from './contour.js';\nimport { type Placement, isIdentityPlacement, quatToEulerXYZDeg } from './placement.js';\n\n/** Per-object codegen outcome: what was emitted for one FCStd object. */\nexport interface GenObjectResult {\n /** FCStd object name */\n name: string;\n /** FCStd type id */\n type: string;\n /** variable name bound in generated code (partN) or undefined when baked */\n variable?: string;\n calls: CadCall[];\n disposition: 'translated' | 'baked' | 'preserved-only';\n reason?: string;\n /** M3 sketch verdict when the object is a sketch */\n sketch?: { level: 'L0' | 'L1' | 'L2'; reason?: string; loopCount?: number };\n}\n\n/** Full codegen output: lowered calls, per-object ledger and generated script(s). */\nexport interface GenResult {\n /** ordered translated calls (dependency order) */\n calls: CadCall[];\n objects: GenObjectResult[];\n /** generated .fai.js source (single-file mode or the main/aggregate script) */\n code: string;\n /** M10.3: multi-file mode — one script per Body with translated geometry.\n * Empty in single-file mode. Paths are container-relative (model/<Name>.fai.js). */\n files: { path: string; code: string; body: string }[];\n /** M10.3: variable in main.fai.js holding the grouped result (multi-file mode) */\n rootVar?: string;\n}\n\ninterface Node {\n name: string;\n obj: ReturnType<FcstdDocument['objects'][number]['properties']['get']> extends never ? never : FcstdDocument['objects'][number];\n deps: Set<string>;\n verdict?: TranslateVerdict;\n variable?: string;\n}\n\n/** Extract link dependencies relevant for ordering. */\nfunction depsOf(obj: FcstdDocument['objects'][number]): string[] {\n const out: string[] = [];\n const linkProps = ['Base', 'Tool', 'Profile', 'BaseFeature', 'Originals'];\n for (const p of linkProps) {\n const el = obj.properties.get(p)?.children[0];\n const v = el?.attributes['value'];\n if (v) out.push(v);\n }\n const shapes = obj.properties.get('Shapes')?.children[0];\n if (shapes) {\n for (const link of shapes.children) {\n const v = link.attributes['value'];\n if (v) out.push(v);\n }\n }\n return out;\n}\n\n/**\n * GOTCHA (PadTest V6 failure): a `PartDesign::Body`'s feature list lives in\n * DIFFERENT properties depending on the FreeCAD version —\n * - modern (0.19+): `Model` (App::PropertyLinkList), ordered\n * - legacy: `Group` (App::PropertyLinkList)\n * The Tip is `Body.Tip`. Reading only `Group` on a modern document yields an\n * empty list → no same-Body chaining → features degrade to a loose\n * `cad.group` of overlapping siblings (PadTest rebuilt volume ≈ 5.2× the Tip's,\n * bboxDiag ≈ 2×). Prefer `Model`, fall back to `Group`.\n */\nfunction bodyFeatureNames(obj: FcstdDocument['objects'][number]): string[] {\n for (const prop of ['Model', 'Group']) {\n const list = obj.properties.get(prop)?.children[0];\n if (!list) continue;\n const names: string[] = [];\n for (const link of list.children) {\n const v = link.attributes['value'];\n if (v) names.push(v);\n }\n if (names.length > 0) return names;\n }\n return [];\n}\n\n/**\n * M5.1/M5.2 — translate every object in dependency order and lower to JS.\n * `sketchVerdict` supplies the M3 outcome per sketch object name; sketches\n * whose contour feeds a Pad/Pocket appear as inputs.\n *\n * @param doc parsed FCStd object graph to translate\n * @param sketchVerdict per-sketch M3 verdict keyed by object name\n * @param sketchContours solved contours per L0 sketch, keyed by object name\n * @param baseName source base name used in generated file headers/labels\n * @param placements per-object Placement used to re-orient placed geometry; missing → identity\n * @returns the lowered call plan, per-object dispositions and generated code\n */\nexport function generateModel(\n doc: FcstdDocument,\n sketchVerdict: Map<string, { level: 'L0' | 'L1' | 'L2'; reason?: string; loopCount?: number }>,\n sketchContours: Map<string, Contour[]>,\n baseName: string,\n /** M8.3: per-object Placement (sketches + features); missing → identity */\n placements?: Map<string, Placement>,\n /** H7: objects whose Shape is a ZIP .brp member (pure-Shape carriers → shape-asset). */\n shapeCarriers?: ReadonlySet<string>,\n): GenResult {\n const byName = new Map(doc.objects.map((o) => [o.name, o]));\n const nodes = new Map<string, Node>();\n for (const obj of doc.objects) {\n nodes.set(obj.name, { name: obj.name, obj, deps: new Set(depsOf(obj)) });\n }\n\n // Kahn topological sort; objects with unbuilt deps fall back to insertion\n // order iteration until progress stalls (remaining are baked with reason).\n // M10.1: iteration order is Body.Group sequence FIRST (features of a Body\n // process in Group order so the D-C chain follows PartDesign semantics),\n // then leftover objects in document order.\n const groupSeq: string[] = [];\n for (const obj of doc.objects) {\n if (obj.type !== 'PartDesign::Body') continue;\n for (const m of bodyFeatureNames(obj)) {\n if (byName.has(m) && !groupSeq.includes(m)) groupSeq.push(m);\n }\n }\n const iterationOrder = [\n ...groupSeq,\n ...doc.objects.map((o) => o.name).filter((n) => !groupSeq.includes(n)),\n ];\n const order: string[] = [];\n const built = new Set<string>();\n let progress = true;\n while (progress) {\n progress = false;\n for (const name of iterationOrder) {\n const node = nodes.get(name)!;\n if (built.has(node.name)) continue;\n if ([...node.deps].every((d) => built.has(d) || !byName.has(d))) {\n built.add(node.name);\n order.push(node.name);\n progress = true;\n }\n }\n }\n\n const variables = new Map<string, string>();\n const results: GenObjectResult[] = [];\n const calls: CadCall[] = [];\n let partCounter = 0;\n const newVar = (): string => `part${partCounter++}`;\n\n // D-C (M9.4): same-Body features fuse cumulatively in Body.Group order —\n // the first translated feature is the base, every later additive feature\n // (Pad/…) unions with the chain, every subtractive one (Pocket/Cut)\n // subtracts. cad.group is NOT used inside a Body (that is assembly\n // semantics); cross-Body grouping stays in lower()'s root handling (M10).\n const memberToBody = new Map<string, string>();\n for (const obj of doc.objects) {\n if (obj.type !== 'PartDesign::Body') continue;\n for (const m of bodyFeatureNames(obj)) {\n if (!memberToBody.has(m)) memberToBody.set(m, obj.name);\n }\n }\n const chainVar = new Map<string, string>(); // body name → accumulated var\n\n for (const name of order) {\n const node = nodes.get(name)!;\n const obj = node.obj;\n\n if (obj.type === 'Sketcher::SketchObject') {\n const verdict = sketchVerdict.get(name);\n const contours = sketchContours.get(name);\n const usable =\n !!verdict &&\n verdict.level !== 'L2' &&\n (verdict.loopCount ?? 0) > 0 &&\n !!contours &&\n contours.length > 0;\n if (usable) {\n // M6 wiring: emit a real `cad.sketch({contours})` creator so the\n // solved contour becomes a face variable the Pad/Pocket/Extrusion/\n // Revolution features below can consume.\n const v = newVar();\n variables.set(name, v);\n const sketchCall: CadCall = {\n out: v, op: 'cad.sketch', source: name, inputs: [], params: { contours },\n };\n calls.push(sketchCall);\n results.push({\n name, type: obj.type, variable: v, calls: [sketchCall], disposition: 'translated',\n sketch: verdict,\n });\n } else {\n results.push({\n name, type: obj.type, calls: [], disposition: 'baked',\n reason: verdict?.reason ?? (contours ? 'sketch-not-solved' : 'sketch-no-contours'), sketch: verdict,\n });\n }\n continue;\n }\n\n if (obj.type === 'App::Origin' || obj.type === 'App::Plane' || obj.type === 'App::Line') {\n results.push({ name, type: obj.type, calls: [], disposition: 'preserved-only', reason: 'datum' });\n continue;\n }\n\n // Sketches are now real face variables (see the Sketcher::SketchObject\n // branch above), so every dependency that resolves to one flows through.\n const verdict = translateObject(obj, (dep) => {\n const v = variables.get(dep);\n return v !== undefined ? v : undefined;\n }, doc.objects, shapeCarriers);\n node.verdict = verdict;\n if (verdict.kind === 'translated') {\n // rename output vars to partN sequence\n for (const call of verdict.calls) {\n const v = newVar();\n variables.set(call.out, v);\n // remap inputs that were intermediate (Pocket_cut) or named outputs\n call.inputs = call.inputs.map((i) => variables.get(i) ?? i);\n call.out = v;\n calls.push(call);\n }\n // M8.3: features build in sketch-local coordinates (cad.sketch lays the\n // face on local XY; extrude runs along local +Z). Re-orient the final\n // solid by the PROFILE SKETCH's Placement: rotate_euler then translate,\n // so the result lands where FreeCAD puts it. Identity placements emit\n // nothing.\n // GOTCHA (PadTest V6, relErr 3.20%): a PartDesign feature's geometry is\n // built in the SKETCH frame, but FreeCAD may store a DIFFERENT Placement\n // on the feature object itself (Pad001: sketch P=(10,0,0)\n // Q=(0,.7071,0,.7071) vs feature P=0 Q=(0,.7071,.7071,0)) — re-orienting\n // by the feature's own frame drops the sketch origin offset and rotates\n // the extrude axis into the wrong direction (−3.20% volume, centroid\n // off 1.67). The sketch's Placement is the authoritative frame for the\n // built geometry; fall back to the feature's own for sketchless features.\n const lastVar = verdict.calls.at(-1)?.out;\n const sketchLink = obj.properties.get('Sketch')?.children[0]?.attributes['value'];\n const pl = (sketchLink ? placements?.get(sketchLink) : undefined) ?? placements?.get(name);\n if (lastVar && pl && !isIdentityPlacement(pl)) {\n let cur = lastVar;\n const euler = quatToEulerXYZDeg(pl.q);\n const isRotation = Math.abs(euler[0]) > 1e-9 || Math.abs(euler[1]) > 1e-9 || Math.abs(euler[2]) > 1e-9;\n if (isRotation) {\n const rv = newVar();\n variables.set(cur, rv); // map old name → rotated var for consumers\n calls.push({ out: rv, op: 'cad.rotate_euler', source: name, inputs: [cur], params: { anglesDeg: euler } });\n cur = rv;\n }\n const needsTranslate = Math.abs(pl.p[0]) > 1e-9 || Math.abs(pl.p[1]) > 1e-9 || Math.abs(pl.p[2]) > 1e-9;\n if (needsTranslate) {\n const tv = newVar();\n variables.set(cur, tv);\n calls.push({ out: tv, op: 'cad.translate', source: name, inputs: [cur], params: { offset: [...pl.p] } });\n cur = tv;\n }\n // the object's variable is now the fully placed result\n variables.set(name, cur);\n }\n // M9.4 (D-C): fold the feature into its Body's chain — AFTER the placement\n // step so the chain accumulates the PLACED feature shape. Pocket/Cut\n // subtract from the chain; everything else unions onto it. The first\n // feature in the Body's feature list (Model/Group) order becomes the\n // chain base — no cad.group inside a Body; consumers (M10) read chainVar.\n // GOTCHA (PadTest V6): folding the UNPLACED feature var (the old order)\n // left the chain head in sketch-local space while each feature's Placement\n // was applied to a separate, unused variable → the exported body spanned\n // both the local and the placed copies (~2× bboxDiag, ~5× volume).\n const body = memberToBody.get(name);\n const isSubtractive = obj.type === 'PartDesign::Pocket' || obj.type === 'Part::Cut';\n if (body) {\n const prev = chainVar.get(body);\n // UpToLast/UpToFirst: FreeCAD's \"up to\" support is the Body's ACCUMULATED\n // shape, NOT only the immediate BaseFeature link — retarget the kernel\n // ref at the chain head (prev). GOTCHA (PadTest V6): truncating against\n // the immediate BaseFeature (a small Pad001 disc) left an 8.06% volume\n // deficit vs the Tip; against the accumulated chain it drops to 3.20%\n // (bbox already exact at delta 0).\n if (prev) {\n for (const c of verdict.calls) {\n if (c.op === 'cad.extrude' && c.params.baseFeature !== undefined) {\n // GOTCHA (PadTest V6 residual): the up-to extrude builds its\n // prism in the SKETCH-LOCAL frame, but the chain head (prev)\n // lives in the PLACED (global) frame. FreeCAD's boolean runs in\n // one frame — so transform prev back into the sketch frame\n // first: local = R^-1(global - p). Feeding the placed chain var\n // directly silently truncates at the wrong face (Pad002 truth\n // AddShape 48199 vs rebuilt deficit ~9108 mm^3 → 3.2% total).\n const needsInverse =\n pl !== undefined && !isIdentityPlacement(pl);\n if (needsInverse && pl) {\n const invQ: [number, number, number, number] = [\n -pl.q[0]!, -pl.q[1]!, -pl.q[2]!, pl.q[3]!,\n ];\n const invEuler = quatToEulerXYZDeg(invQ);\n const tv = newVar();\n const tvCall: CadCall = {\n out: tv, op: 'cad.translate', source: name,\n inputs: [prev], params: { offset: [-pl.p[0]!, -pl.p[1]!, -pl.p[2]!] },\n };\n const rv = newVar();\n const rvCall: CadCall = {\n out: rv, op: 'cad.rotate_euler', source: name,\n inputs: [tv], params: { anglesDeg: invEuler },\n };\n // insert BEFORE the extrude call: faijs is a statement\n // language — `baseFeature: partN` referencing a later\n // statement is E_REFERENCE (parser rejects forward refs).\n const at = calls.indexOf(c);\n calls.splice(at < 0 ? calls.length : at, 0, tvCall, rvCall);\n c.params.baseFeature = jsExpr(rv);\n } else {\n c.params.baseFeature = jsExpr(prev);\n }\n }\n }\n }\n const featureVar = variables.get(name) ?? verdict.calls.at(-1)!.out;\n if (!prev) {\n chainVar.set(body, featureVar); // base feature\n } else if (isSubtractive && verdict.calls.at(-1)!.op === 'cad.subtract' && verdict.calls.at(-1)!.inputs.includes(prev)) {\n // Pocket already subtracted from the chain var itself (BaseFeature\n // resolved to the chain) — its output IS the new chain head; no\n // extra subtract (would cut twice).\n chainVar.set(body, featureVar);\n } else if (isSubtractive) {\n const nv = newVar();\n calls.push({ out: nv, op: 'cad.subtract', source: name, inputs: [prev, featureVar], params: {} });\n chainVar.set(body, nv);\n } else {\n const nv = newVar();\n calls.push({ out: nv, op: 'cad.union', source: name, inputs: [prev, featureVar], params: {} });\n chainVar.set(body, nv);\n }\n }\n results.push({ name, type: obj.type, variable: verdict.calls.at(-1)?.out, calls: verdict.calls, disposition: 'translated', reason: verdict.reason });\n } else if (verdict.kind === 'baked') {\n results.push({ name, type: obj.type, calls: [], disposition: 'baked', reason: verdict.reason });\n } else {\n results.push({ name, type: obj.type, calls: [], disposition: 'preserved-only', reason: verdict.reason });\n }\n }\n\n // also mark unreachable (cycle) objects as baked\n for (const obj of doc.objects) {\n if (!results.some((r) => r.name === obj.name)) {\n results.push({ name: obj.name, type: obj.type, calls: [], disposition: 'baked', reason: 'dependency-cycle' });\n }\n }\n\n // M10.3/M10.5 — split by Body: calls whose source object belongs to a Body\n // (including the chain union/subtract calls emitted for it) go to\n // model/<BodyName>.fai.js; everything else (loose Part features) stays in\n // main.fai.js. When no Body has geometry, everything lands in main (the\n // single-file shape). Aggregate entry groups per-file roots via cad.group.\n const callBody = new Map<string, string>();\n for (const r of results) {\n const b = memberToBody.get(r.name);\n if (b) for (const c of r.calls) callBody.set(c.out, b);\n }\n const bodiesWithGeo = new Set<string>();\n for (const b of new Set(memberToBody.values())) {\n if (chainVar.has(b)) bodiesWithGeo.add(b);\n }\n const files: GenResult['files'] = [];\n let code: string;\n let rootVar: string | undefined;\n if (bodiesWithGeo.size > 0) {\n const mainCalls: CadCall[] = [];\n const perBody = new Map<string, CadCall[]>();\n // M10c partition in DEPENDENCY ORDER: `calls` is already topologically\n // sorted, so ONE forward pass assigns each call — to its own source's Body\n // when known (`callBody`), else to the Body its first body-owned input went\n // to. GOTCHA (PadTest V6): the previous implementation re-assigned such\n // calls by APPENDING them to the end of the Body file, which broke\n // dependency order — a Body file ended up referencing a variable declared\n // further down (`let` TDZ ReferenceError at run time: `part8` used `part6`).\n // Filtering `calls` in place preserves the topological order.\n const assigned = new Map<string, string>(); // call.out → Body file name\n for (const c of calls) {\n const own = callBody.get(c.out);\n const viaInput = c.inputs.map((inp) => assigned.get(inp)).find((b) => b !== undefined);\n const b = own !== undefined && bodiesWithGeo.has(own) ? own : viaInput;\n if (b !== undefined && bodiesWithGeo.has(b)) {\n if (!perBody.has(b)) perBody.set(b, []);\n perBody.get(b)!.push(c);\n assigned.set(c.out, b);\n } else {\n mainCalls.push(c);\n }\n }\n for (const b of bodiesWithGeo) {\n const bodyCalls = perBody.get(b) ?? [];\n // terminal: alias the chain head to <Body>_out so the aggregate entry\n // has a stable, name-independent reference to each Body's result.\n const head = chainVar.get(b)!;\n const withTerminal = [\n ...bodyCalls,\n { out: `${b}_out`, op: 'identity', source: b, inputs: [head], params: {} } as CadCall,\n ];\n files.push({ path: `model/${b}.fai.js`, code: lowerBody(withTerminal, `${baseName}/${b}`, b), body: b });\n }\n // main.fai.js: aggregate the per-Body terminals via cad.group. M10c:\n // cross-file references close through the standard relative-import\n // contract (module-registry D6) — each Body module's terminal alias\n // `<Body>_out` is its live shape, so a named import binds it.\n const lines: string[] = [];\n lines.push(`// Generated by faijs FCStd port — ${baseName} (aggregate entry)`);\n lines.push(`// Units: mm (faijs contract; FCStd internal units are mm)`);\n const members = [...bodiesWithGeo].map((b) => `${b}_out`);\n // Always import the per-Body terminals: the aggregate entry references\n // `<Body>_out` in BOTH the cad.group (multi-Body) and the single-Body alias\n // path, so a missing import is a SEC_FREE_IDENT parse error (GOTCHA: the\n // single-Body branch previously emitted `let part_out = <Body>_out;` with\n // no import). `mainCalls` may still be empty here.\n if (members.length >= 1) {\n for (const b of bodiesWithGeo) {\n lines.push(`import { ${b}_out } from './${b}.fai.js'; // module ${b}`);\n }\n }\n for (const c of mainCalls) {\n const id = `s${lines.length - 2}`;\n lines.push(`let ${c.out} = ${c.op}(${renderArgs(c)}); // ${id} ${c.source}`);\n }\n if (members.length > 1) {\n rootVar = 'part_out';\n lines.push(`let part_out = cad.group({ members: [${members.join(', ')}] });`);\n } else if (members.length === 1) {\n // single Body: the imported terminal IS the result — alias keeps a\n // stable root name for executors\n rootVar = members[0];\n lines.push(`let part_out = ${rootVar}; // single-Body aggregate`);\n rootVar = 'part_out';\n }\n code = lines.join('\\n') + '\\n';\n } else {\n code = lower(calls, baseName);\n }\n return { calls, objects: results, code, files, rootVar };\n}\n\n/** M10.3 — lower one Body's calls; the last entry is the terminal alias\n * `<Body>_out` (plain JS assignment — faijs has no identity op). */\nfunction lowerBody(calls: CadCall[], label: string, body: string): string {\n const lines: string[] = [];\n lines.push(`// Generated by faijs FCStd port — ${label}`);\n lines.push(`// Units: mm (faijs contract; FCStd internal units are mm)`);\n for (const call of calls) {\n if (call.op === 'identity') {\n // terminal alias: `let <Body>_out = <chain head>;`\n lines.push(`let ${call.out} = ${call.inputs[0]}; // s? ${body} terminal`);\n continue;\n }\n const id = `s${lines.length - 2}`;\n lines.push(`let ${call.out} = ${call.op}(${renderArgs(call)}); // ${id} ${call.source}`);\n }\n return lines.join('\\n') + '\\n';\n}\n\n/** M5.2 — lower the call plan to .fai.js source. faijs syntax: top-level\n * statement flow with `let partN = cad.x(...)`; no wrapper function. */\nfunction lower(calls: CadCall[], baseName: string): string {\n const lines: string[] = [];\n lines.push(`// Generated by faijs FCStd port — ${baseName}`);\n lines.push(`// Units: mm (faijs contract; FCStd internal units are mm)`);\n for (const call of calls) {\n const id = `s${lines.length - 2}`; // statement id sN\n const args = renderArgs(call);\n lines.push(`let ${call.out} = ${call.op}(${args}); // ${id} ${call.source}`);\n }\n // final shape: union of root calls that nobody consumes; faijs scripts\n // end with the output-producing statement (no return, per fixtures).\n const consumed = new Set(calls.flatMap((c) => c.inputs));\n const roots = calls.filter((c) => !consumed.has(c.out)).map((c) => c.out);\n if (roots.length > 1) {\n lines.push(`let part_out = cad.group({ members: [${roots.join(', ')}] });`);\n } else if (roots.length === 0) {\n lines.push(`// no translated geometry (all baked)`);\n }\n return lines.join('\\n') + '\\n';\n}\n\n/**\n * M5.2 — render one IR value as JS. Plain values JSON-encode (byte-identical to\n * the pre-JsExpr output); a `JsExpr` marker renders verbatim, and a container\n * holding one renders element-wise so the expression survives into the source.\n */\nfunction renderValue(v: unknown): string {\n if (isJsExpr(v)) return v.__jsExpr;\n if (Array.isArray(v)) {\n if (v.some(isJsExpr)) return `[${v.map(renderValue).join(', ')}]`;\n return JSON.stringify(v);\n }\n if (v && typeof v === 'object') {\n const entries = Object.entries(v as Record<string, unknown>);\n if (entries.some(([, val]) => containsJsExpr(val))) {\n return `{ ${entries.map(([k, val]) => `${k}: ${renderValue(val)}`).join(', ')} }`;\n }\n return JSON.stringify(v);\n }\n return JSON.stringify(v);\n}\n\n/** True when a value is or (recursively) contains a `JsExpr` marker. */\nfunction containsJsExpr(v: unknown): boolean {\n if (isJsExpr(v)) return true;\n if (Array.isArray(v)) return v.some(containsJsExpr);\n if (v && typeof v === 'object') return Object.values(v as Record<string, unknown>).some(containsJsExpr);\n return false;\n}\n\nfunction renderArgs(call: CadCall): string {\n const positional: string[] = [\n ...call.inputs.map((i) => i),\n ...(call.literals ?? []).map((l) => renderValue(l)),\n ].filter((s) => s.length > 0); // M7.1: drop empty entries so we never emit `(, `\n const named: string[] = [];\n for (const [k, v] of Object.entries(call.params ?? {})) {\n if (v === undefined) continue;\n named.push(`${k}: ${renderValue(v)}`);\n }\n const namedBlock = named.length ? `{ ${named.join(', ')} }` : '';\n // M7.1: no leading comma when there are no positional args — a call with only\n // named params must render as `cad.sketch({ ... })`, never `cad.sketch(, {...})`.\n const rest = namedBlock ? (positional.length ? `, ${namedBlock}` : namedBlock) : '';\n return `${positional.join(', ')}${rest}`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/fcstd/codegen.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M5 — code generation: object graph + M4 call plans → model/*.fai.js.\n *\n * M5.1 topological order: Body.Group order wins where present; otherwise\n * PropertyLink dependency order. Cycles / missing deps → baked (no fallback\n * heuristics — explicit downgrade per plan §12).\n * M5.2 lowering: params → JS constants; calls → `const partN = await cad.x(...)`;\n * statement ids sN. Sketch contours enter as blueprint literals.\n *\n * 本文件为 Placement 发射平台 `cad.place`(旋转四元数 + 平移,单点)、为产物聚合发射\n * 平台 `cad.compound`(几何复合体,内核 `makeCompound`,持 OCCT 句柄)。这两个是 faijs\n * 平台几何 op(H11,方案 §4),不再借用 `../3d_editor` 的 `cad.group` /\n * `cad.translate` / `cad.rotate_euler`(编辑器交互 op,JSDoc 已 @deprecated)。\n */\nimport type { FcstdDocument } from './document.js';\nimport type { CadCall, TranslateVerdict } from './feature-translate.js';\nimport { translateObject, isJsExpr, jsExpr, BODY_CHAIN_BASE } from './feature-translate.js';\nimport type { Contour } from './contour.js';\nimport { type Placement, isIdentityPlacement, invertApplyPlacement } from './placement.js';\nimport { isNonModelingType } from './structural-types.js';\n\n/** Per-object codegen outcome: what was emitted for one FCStd object. */\nexport interface GenObjectResult {\n /** FCStd object name */\n name: string;\n /** FCStd type id */\n type: string;\n /** variable name bound in generated code (partN) or undefined when baked */\n variable?: string;\n calls: CadCall[];\n disposition: 'translated' | 'baked' | 'preserved-only';\n reason?: string;\n /** M3 sketch verdict when the object is a sketch */\n sketch?: { level: 'L0' | 'L1' | 'L2'; reason?: string; loopCount?: number };\n}\n\n/** Full codegen output: lowered calls, per-object ledger and generated script(s). */\nexport interface GenResult {\n /** ordered translated calls (dependency order) */\n calls: CadCall[];\n objects: GenObjectResult[];\n /** generated .fai.js source (single-file mode or the main/aggregate script) */\n code: string;\n /** M10.3: multi-file mode — one script per Body with translated geometry.\n * Empty in single-file mode. Paths are container-relative (model/<Name>.fai.js). */\n files: { path: string; code: string; body: string }[];\n /** M10.3: variable in main.fai.js holding the grouped result (multi-file mode) */\n rootVar?: string;\n}\n\ninterface Node {\n name: string;\n obj: ReturnType<FcstdDocument['objects'][number]['properties']['get']> extends never ? never : FcstdDocument['objects'][number];\n deps: Set<string>;\n verdict?: TranslateVerdict;\n variable?: string;\n}\n\n/** Extract link dependencies relevant for ordering. */\nfunction depsOf(obj: FcstdDocument['objects'][number]): string[] {\n const out: string[] = [];\n const linkProps = ['Base', 'Tool', 'Profile', 'BaseFeature', 'Originals'];\n for (const p of linkProps) {\n const el = obj.properties.get(p)?.children[0];\n const v = el?.attributes['value'];\n if (v) out.push(v);\n }\n // GOTCHA (ArchDetail corpus, 2026-09-21): App::PropertyLinkList properties.\n // `Shapes` is the multi-input geometry list (Part::MultiFuse / MultiCommon);\n // `Links` is Part::Compound's member list. Neither is a single-value link\n // property, so missing it here left the Compound with NO dependency on its\n // members — Kahn then placed it at its document position, and ArchDetail's\n // compounds sit at doc index 10-14 while every member sits at 269+ (Draft\n // emits the wire first, the compound last, but the file order is sorted by\n // name). inputVar() found nothing yet → `compound-missing-members` for all\n // five compounds, for a pure ordering reason.\n const linkLists = ['Shapes', 'Links'];\n for (const p of linkLists) {\n const el = obj.properties.get(p)?.children[0];\n if (!el) continue;\n for (const link of el.children) {\n const v = link.attributes['value'];\n if (v) out.push(v);\n }\n }\n return out;\n}\n\n/**\n * GOTCHA (PadTest V6 failure): a `PartDesign::Body`'s feature list lives in\n * DIFFERENT properties depending on the FreeCAD version —\n * - modern (0.19+): `Model` (App::PropertyLinkList), ordered\n * - legacy: `Group` (App::PropertyLinkList)\n * The Tip is `Body.Tip`. Reading only `Group` on a modern document yields an\n * empty list → no same-Body chaining → features degrade to a loose\n * `cad.group` of overlapping siblings (PadTest rebuilt volume ≈ 5.2× the Tip's,\n * bboxDiag ≈ 2×). Prefer `Model`, fall back to `Group`.\n */\nfunction bodyFeatureNames(obj: FcstdDocument['objects'][number]): string[] {\n for (const prop of ['Model', 'Group']) {\n const list = obj.properties.get(prop)?.children[0];\n if (!list) continue;\n const names: string[] = [];\n for (const link of list.children) {\n const v = link.attributes['value'];\n if (v) names.push(v);\n }\n if (names.length > 0) return names;\n }\n return [];\n}\n\n/**\n * M5.1/M5.2 — translate every object in dependency order and lower to JS.\n * `sketchVerdict` supplies the M3 outcome per sketch object name; sketches\n * whose contour feeds a Pad/Pocket appear as inputs.\n *\n * @param doc parsed FCStd object graph to translate\n * @param sketchVerdict per-sketch M3 verdict keyed by object name\n * @param sketchContours solved contours per L0 sketch, keyed by object name\n * @param baseName source base name used in generated file headers/labels\n * @param placements per-object Placement used to re-orient placed geometry; missing → identity\n * @param shapeCarriers objects whose Shape is a ZIP .brp member (pure-Shape carriers → shape-asset)\n * @param brokenShapeAssets objects whose Shape `file` attribute points at a missing/empty member (explicit gap)\n * @returns the lowered call plan, per-object dispositions and generated code\n */\nexport function generateModel(\n doc: FcstdDocument,\n sketchVerdict: Map<string, { level: 'L0' | 'L1' | 'L2'; reason?: string; loopCount?: number }>,\n sketchContours: Map<string, Contour[]>,\n baseName: string,\n /** M8.3: per-object Placement (sketches + features); missing → identity */\n placements?: Map<string, Placement>,\n /** H7: objects whose Shape is a ZIP .brp member (pure-Shape carriers → shape-asset). */\n shapeCarriers?: ReadonlySet<string>,\n /** E4: objects whose Shape `file` attribute points at a missing/empty member (explicit gap). */\n brokenShapeAssets?: ReadonlySet<string>,\n): GenResult {\n const byName = new Map(doc.objects.map((o) => [o.name, o]));\n // GOTCHA (test_geomop corpus, 2026-09-20): a dependency on a Body\n // CONTAINER (Part::Cut with Tool→Body) really waits for the Body's\n // features to have built the chain — expand the dep to the member\n // features so Kahn orders the consumer AFTER the chain exists (and\n // chainVar.get(Body) resolves). Treating the container itself as\n // satisfiable instead let the Cut run before the chain was built.\n const nodes = new Map<string, Node>();\n for (const obj of doc.objects) {\n const deps = new Set<string>();\n for (const d of depsOf(obj)) {\n const target = byName.get(d);\n if (target?.type === 'PartDesign::Body') {\n for (const m of bodyFeatureNames(target)) if (byName.has(m)) deps.add(m);\n } else {\n deps.add(d);\n }\n }\n nodes.set(obj.name, { name: obj.name, obj, deps });\n }\n\n // Kahn topological sort; objects with unbuilt deps fall back to insertion\n // order iteration until progress stalls (remaining are baked with reason).\n // M10.1: iteration order is Body.Group sequence FIRST (features of a Body\n // process in Group order so the D-C chain follows PartDesign semantics),\n // then leftover objects in document order.\n const groupSeq: string[] = [];\n for (const obj of doc.objects) {\n if (obj.type !== 'PartDesign::Body') continue;\n for (const m of bodyFeatureNames(obj)) {\n if (byName.has(m) && !groupSeq.includes(m)) groupSeq.push(m);\n }\n }\n const iterationOrder = [\n ...groupSeq,\n ...doc.objects.map((o) => o.name).filter((n) => !groupSeq.includes(n)),\n ];\n const order: string[] = [];\n const built = new Set<string>();\n let progress = true;\n while (progress) {\n progress = false;\n for (const name of iterationOrder) {\n const node = nodes.get(name)!;\n if (built.has(node.name)) continue;\n if ([...node.deps].every((d) => built.has(d) || !byName.has(d) || byName.get(d)!.type === 'PartDesign::Body')) {\n built.add(node.name);\n order.push(node.name);\n progress = true;\n }\n }\n }\n\n const variables = new Map<string, string>();\n const results: GenObjectResult[] = [];\n const calls: CadCall[] = [];\n let partCounter = 0;\n const newVar = (): string => `part${partCounter++}`;\n\n // D-C (M9.4): same-Body features fuse cumulatively in Body.Group order —\n // the first translated feature is the base, every later additive feature\n // (Pad/…) unions with the chain, every subtractive one (Pocket/Cut)\n // subtracts. cad.group is NOT used inside a Body (that is assembly\n // semantics); cross-Body grouping stays in lower()'s root handling (M10).\n const memberToBody = new Map<string, string>();\n for (const obj of doc.objects) {\n if (obj.type !== 'PartDesign::Body') continue;\n for (const m of bodyFeatureNames(obj)) {\n if (!memberToBody.has(m)) memberToBody.set(m, obj.name);\n }\n }\n const chainVar = new Map<string, string>(); // body name → accumulated var\n\n for (const name of order) {\n const node = nodes.get(name)!;\n const obj = node.obj;\n\n if (obj.type === 'Sketcher::SketchObject') {\n const verdict = sketchVerdict.get(name);\n const contours = sketchContours.get(name);\n const usable =\n !!verdict &&\n verdict.level !== 'L2' &&\n (verdict.loopCount ?? 0) > 0 &&\n !!contours &&\n contours.length > 0;\n if (usable) {\n // M6 wiring: emit a real `cad.sketch({contours})` creator so the\n // solved contour becomes a face variable the Pad/Pocket/Extrusion/\n // Revolution features below can consume.\n const v = newVar();\n variables.set(name, v);\n const sketchCall: CadCall = {\n out: v, op: 'cad.sketch', source: name, inputs: [], params: { contours },\n };\n calls.push(sketchCall);\n results.push({\n name, type: obj.type, variable: v, calls: [sketchCall], disposition: 'translated',\n sketch: verdict,\n });\n } else {\n results.push({\n name, type: obj.type, calls: [], disposition: 'baked',\n reason: verdict?.reason ?? (contours ? 'sketch-not-solved' : 'sketch-no-contours'), sketch: verdict,\n });\n }\n continue;\n }\n\n // Non-modeling objects are preserved-only and MUST be short-circuited\n // BEFORE translation. GOTCHA (PadTest, 2026-09-21): this used to list only\n // `App::Origin/Plane/Line`, so a Body's `PartDesign::Plane` went through\n // the translator, matched the shape-asset rule (datum planes store a\n // `Shape` .brp — the plane face) and was folded into the Body's chain:\n // `cad.union(pad, datumPlane)`. That both corrupts the solid and fails at\n // run time (`cad.load` requires a solid; a plane face has none). The\n // predicate is shared with the C4 audit (`structural-types.ts`) so codegen\n // and the disposition ledger can never disagree about what is non-modeling.\n if (isNonModelingType(obj.type)) {\n results.push({ name, type: obj.type, calls: [], disposition: 'preserved-only', reason: 'structural' });\n continue;\n }\n\n // Sketches are now real face variables (see the Sketcher::SketchObject\n // branch above), so every dependency that resolves to one flows through.\n const verdict = translateObject(obj, (dep) => {\n // GOTCHA (test_geomop corpus, 2026-09-20): a dependency on a Body\n // CONTAINER (Part::Cut with Tool→Body) resolves against the Body's\n // accumulated chain head, not `variables` — the container name is\n // never registered there (its result lives in chainVar).\n return variables.get(dep) ?? chainVar.get(dep);\n }, doc.objects, shapeCarriers, brokenShapeAssets);\n node.verdict = verdict;\n if (verdict.kind === 'translated') {\n // rename output vars to partN sequence\n for (const call of verdict.calls) {\n const v = newVar();\n variables.set(call.out, v);\n // remap inputs that were intermediate (Pocket_cut) or named outputs\n call.inputs = call.inputs.map((i) => variables.get(i) ?? i);\n // GOTCHA (ArchDetail s444, 2026-09-21): `cad.compound` passes its\n // members as LEXICAL VARIABLE NAMES inside `params.members` — they\n // must be remapped like `inputs`, otherwise renderArgs emits them as\n // string literals and the op receives strings (no BREP handle) and\n // throws \"compound members are not all on the BREP chain\".\n const members = (call.params as { members?: unknown } | undefined)?.members;\n if (Array.isArray(members)) {\n call.params!.members = members.map((m) =>\n typeof m === 'string' ? (variables.get(m) ?? m) : m,\n );\n }\n call.out = v;\n calls.push(call);\n }\n // M8.3: features build in sketch-local coordinates (cad.sketch lays the\n // face on local XY; extrude runs along local +Z). Re-orient the final\n // solid by the PROFILE SKETCH's Placement: rotate_euler then translate,\n // so the result lands where FreeCAD puts it. Identity placements emit\n // nothing.\n // GOTCHA (PadTest V6, relErr 3.20%): a PartDesign feature's geometry is\n // built in the SKETCH frame, but FreeCAD may store a DIFFERENT Placement\n // on the feature object itself (Pad001: sketch P=(10,0,0)\n // Q=(0,.7071,0,.7071) vs feature P=0 Q=(0,.7071,.7071,0)) — re-orienting\n // by the feature's own frame drops the sketch origin offset and rotates\n // the extrude axis into the wrong direction (−3.20% volume, centroid\n // off 1.67). The sketch's Placement is the authoritative frame for the\n // built geometry; fall back to the feature's own for sketchless features.\n const lastVar = verdict.calls.at(-1)?.out;\n const sketchLink = obj.properties.get('Sketch')?.children[0]?.attributes['value'];\n const pl = (sketchLink ? placements?.get(sketchLink) : undefined) ?? placements?.get(name);\n // GOTCHA (H13, TO92, 2026-09-23): a shape-asset object's frozen `.brp`\n // member is saved by FreeCAD WITH its Placement already applied (the\n // asset's bbox starts at the placed z). Re-emitting `cad.place` with the\n // object's stored Placement applies the SAME transform twice — volume\n // and solids stay correct, only a bbox/com parity check exposes it.\n // The import already carries the placement; never place it again.\n const isShapeAsset = verdict.reason === 'shape-asset';\n if (lastVar && pl && !isIdentityPlacement(pl) && !isShapeAsset) {\n // 单个刚性放置:旋转(四元数,绕局部原点)+ 平移 = FreeCAD Placement(P,Q)。\n // 直接发 cad.place,避免 euler 往返损失精度(方案 §4.7:两语句合一)。\n const cur = lastVar;\n const rv = newVar();\n variables.set(cur, rv); // map old name → placed var for consumers\n calls.push({\n out: rv, op: 'cad.place', source: name, inputs: [cur],\n params: { rotation: [...pl.q], position: [...pl.p] },\n });\n // the object's variable is now the fully placed result\n variables.set(name, rv);\n }\n // M9.4 (D-C): fold the feature into its Body's chain — AFTER the placement\n // step so the chain accumulates the PLACED feature shape. Pocket/Cut\n // subtract from the chain; everything else unions onto it. The first\n // feature in the Body's feature list (Model/Group) order becomes the\n // chain base — no cad.group inside a Body; consumers (M10) read chainVar.\n // GOTCHA (PadTest V6): folding the UNPLACED feature var (the old order)\n // left the chain head in sketch-local space while each feature's Placement\n // was applied to a separate, unused variable → the exported body spanned\n // both the local and the placed copies (~2× bboxDiag, ~5× volume).\n const body = memberToBody.get(name);\n const isSubtractive = obj.type === 'PartDesign::Pocket' || obj.type === 'Part::Cut';\n if (body) {\n const prev = chainVar.get(body);\n // UpToLast/UpToFirst: FreeCAD's \"up to\" support is the Body's ACCUMULATED\n // shape, NOT only the immediate BaseFeature link — retarget the kernel\n // ref at the chain head (prev). GOTCHA (PadTest V6): truncating against\n // the immediate BaseFeature (a small Pad001 disc) left an 8.06% volume\n // deficit vs the Tip; against the accumulated chain it drops to 3.20%\n // (bbox already exact at delta 0).\n if (prev) {\n for (const c of verdict.calls) {\n // H7 (hole_puzzle corpus): the Pocket had NO BaseFeature property —\n // the translator emitted BODY_CHAIN_BASE as the subtract's base\n // input; retarget it at the chain head here (after the earlier\n // inputs remap, which leaves the marker untouched since it is not\n // a variable name).\n if (c.inputs) {\n c.inputs = c.inputs.map((i) => (i === BODY_CHAIN_BASE ? prev : i));\n }\n if (c.op === 'cad.extrude' && c.params.baseFeature !== undefined) {\n // GOTCHA (PadTest V6 residual): the up-to extrude builds its\n // prism in the SKETCH-LOCAL frame, but the chain head (prev)\n // lives in the PLACED (global) frame. FreeCAD's boolean runs in\n // one frame — so transform prev back into the sketch frame\n // first: local = R^-1(global - p). Feeding the placed chain var\n // directly silently truncates at the wrong face (Pad002 truth\n // AddShape 48199 vs rebuilt deficit ~9108 mm^3 → 3.2% total).\n const needsInverse =\n pl !== undefined && !isIdentityPlacement(pl);\n if (needsInverse && pl) {\n // 逆向刚性放置(单点发射,方案 §4.7):rotation 取共轭四元数、\n // position 取 invertApplyPlacement(pl, 0) = -(invQ·p),合成为\n // 一个 cad.place,避免 euler 往返。语义 = invertApplyPlacement(pl, prev)。\n const invQ: [number, number, number, number] = [\n -pl.q[0]!, -pl.q[1]!, -pl.q[2]!, pl.q[3]!,\n ];\n const invPos = invertApplyPlacement(pl, [0, 0, 0]);\n const rv = newVar();\n const rvCall: CadCall = {\n out: rv, op: 'cad.place', source: name,\n inputs: [prev],\n params: { rotation: invQ, position: invPos },\n };\n // insert BEFORE the extrude call: faijs is a statement\n // language — `baseFeature: partN` referencing a later\n // statement is E_REFERENCE (parser rejects forward refs).\n const at = calls.indexOf(c);\n calls.splice(at < 0 ? calls.length : at, 0, rvCall);\n c.params.baseFeature = jsExpr(rv);\n } else {\n c.params.baseFeature = jsExpr(prev);\n }\n }\n }\n }\n const featureVar = variables.get(name) ?? verdict.calls.at(-1)!.out;\n if (!prev) {\n chainVar.set(body, featureVar); // base feature\n } else if (isSubtractive && verdict.calls.at(-1)!.op === 'cad.subtract' && verdict.calls.at(-1)!.inputs.includes(prev)) {\n // Pocket already subtracted from the chain var itself (BaseFeature\n // resolved to the chain) — its output IS the new chain head; no\n // extra subtract (would cut twice).\n chainVar.set(body, featureVar);\n } else if (isSubtractive) {\n const nv = newVar();\n calls.push({ out: nv, op: 'cad.subtract', source: name, inputs: [prev, featureVar], params: {} });\n chainVar.set(body, nv);\n } else {\n const nv = newVar();\n calls.push({ out: nv, op: 'cad.union', source: name, inputs: [prev, featureVar], params: {} });\n chainVar.set(body, nv);\n }\n }\n // H7 guard (motor_mount_inch corpus): a feature outside a Body (or with\n // no chain head yet) never gets its BODY_CHAIN_BASE retargeted — the\n // marker would leak into the generated JS as an illegal identifier\n // (parser kills the whole file). Downgrade to an explicit gap instead.\n if (verdict.calls.some((c) => c.inputs?.includes(BODY_CHAIN_BASE))) {\n results.push({ name, type: obj.type, calls: [], disposition: 'baked', reason: 'pocket-missing-dependency' });\n continue;\n }\n results.push({ name, type: obj.type, variable: verdict.calls.at(-1)?.out, calls: verdict.calls, disposition: 'translated', reason: verdict.reason });\n } else if (verdict.kind === 'baked') {\n results.push({ name, type: obj.type, calls: [], disposition: 'baked', reason: verdict.reason });\n } else {\n results.push({ name, type: obj.type, calls: [], disposition: 'preserved-only', reason: verdict.reason });\n }\n }\n\n // also mark unreachable (cycle) objects as baked\n for (const obj of doc.objects) {\n if (!results.some((r) => r.name === obj.name)) {\n results.push({ name: obj.name, type: obj.type, calls: [], disposition: 'baked', reason: 'dependency-cycle' });\n }\n }\n\n // M10.3/M10.5 — split by Body: calls whose source object belongs to a Body\n // (including the chain union/subtract calls emitted for it) go to\n // model/<BodyName>.fai.js; everything else (loose Part features) stays in\n // main.fai.js. When no Body has geometry, everything lands in main (the\n // single-file shape). Aggregate entry compounds per-file roots via cad.compound.\n const callBody = new Map<string, string>();\n for (const r of results) {\n const b = memberToBody.get(r.name);\n if (b) for (const c of r.calls) callBody.set(c.out, b);\n }\n const bodiesWithGeo = new Set<string>();\n for (const b of new Set(memberToBody.values())) {\n if (chainVar.has(b)) bodiesWithGeo.add(b);\n }\n const files: GenResult['files'] = [];\n let code: string;\n let rootVar: string | undefined;\n if (bodiesWithGeo.size > 0) {\n const mainCalls: CadCall[] = [];\n const perBody = new Map<string, CadCall[]>();\n // M10c partition in DEPENDENCY ORDER: `calls` is already topologically\n // sorted, so ONE forward pass assigns each call — to its own source's Body\n // when known (`callBody`), else to the Body its first body-owned input went\n // to. GOTCHA (PadTest V6): the previous implementation re-assigned such\n // calls by APPENDING them to the end of the Body file, which broke\n // dependency order — a Body file ended up referencing a variable declared\n // further down (`let` TDZ ReferenceError at run time: `part8` used `part6`).\n // Filtering `calls` in place preserves the topological order.\n const assigned = new Map<string, string>(); // call.out → Body file name\n // chain-head var → terminal alias (and owning Body) — needed DURING\n // routing: a foreign chain head is never in `assigned` (it is a Body's\n // accumulated var, not a call output), so input-body checks must consult\n // this map to detect cross-Body references.\n const headToTerminal = new Map<string, string>();\n const headToBody = new Map<string, string>();\n for (const b of bodiesWithGeo) {\n headToTerminal.set(chainVar.get(b)!, `${b}_out`);\n headToBody.set(chainVar.get(b)!, b);\n }\n const mainPending: CadCall[] = [];\n const mainOuts = new Set<string>();\n for (const c of calls) {\n const own = callBody.get(c.out);\n const inputBodies = c.inputs.map((inp) => assigned.get(inp) ?? headToBody.get(inp)).filter((b): b is string => b !== undefined);\n const viaInput = inputBodies[0];\n const b = own !== undefined && bodiesWithGeo.has(own) ? own : viaInput;\n // GOTCHA (test_geomop corpus, 2026-09-20): a call whose own Body\n // differs from an input's Body (Part::Cut with Base in another Body's\n // chain) must NOT be emitted into its own Body file — the input\n // variable lives in ANOTHER module and is not declared there\n // (SEC_FREE_IDENT at check time). Same for inputs that will live in\n // MAIN (loose Part boxes): routing is a forward pass over the\n // topologically sorted calls, so main outputs are already known.\n // NOTE: Body-chain fold calls (union/subtract emitted during folding)\n // are NOT in `results`, so `own` is undefined for them — the main-input\n // check must not depend on `own`.\n const mixed = inputBodies.some((ib) => ib !== b) || (own !== undefined && viaInput !== undefined && viaInput !== own);\n const touchesMain = c.inputs.some((i) => mainOuts.has(i));\n if (b !== undefined && bodiesWithGeo.has(b) && !mixed && !touchesMain && (own === undefined || own === b)) {\n if (!perBody.has(b)) perBody.set(b, []);\n perBody.get(b)!.push(c);\n assigned.set(c.out, b);\n } else {\n mainPending.push(c);\n mainOuts.add(c.out);\n }\n }\n for (const c of mainPending) {\n mainCalls.push({ ...c, inputs: c.inputs.map((i) => headToTerminal.get(i) ?? i) });\n }\n for (const b of bodiesWithGeo) {\n const bodyCalls = perBody.get(b) ?? [];\n // terminal: alias the chain head to <Body>_out so the aggregate entry\n // has a stable, name-independent reference to each Body's result.\n const head = chainVar.get(b)!;\n const withTerminal = [\n ...bodyCalls,\n { out: `${b}_out`, op: 'identity', source: b, inputs: [head], params: {} } as CadCall,\n ];\n files.push({ path: `model/${b}.fai.js`, code: lowerBody(withTerminal, `${baseName}/${b}`, b), body: b });\n }\n // main.fai.js: aggregate the per-Body terminals via cad.compound. M10c:\n // cross-file references close through the standard relative-import\n // contract (module-registry D6) — each Body module's terminal alias\n // `<Body>_out` is its live shape, so a named import binds it.\n const lines: string[] = [];\n lines.push(`// Generated by faijs FCStd port — ${baseName} (aggregate entry)`);\n lines.push(`// Units: mm (faijs contract; FCStd internal units are mm)`);\n const members = [...bodiesWithGeo].map((b) => `${b}_out`);\n // Always import the per-Body terminals: the aggregate entry references\n // `<Body>_out` in BOTH the cad.compound (multi-Body) and the single-Body alias\n // path, so a missing import is a SEC_FREE_IDENT parse error (GOTCHA: the\n // single-Body branch previously emitted `let part_out = <Body>_out;` with\n // no import). `mainCalls` may still be empty here.\n if (members.length >= 1) {\n for (const b of bodiesWithGeo) {\n lines.push(`import { ${b}_out } from './${b}.fai.js'; // module ${b}`);\n }\n }\n for (const c of mainCalls) {\n const id = `s${lines.length - 2}`;\n lines.push(`let ${c.out} = ${c.op}(${renderArgs(c)}); // ${id} ${c.source}`);\n }\n if (members.length > 1) {\n rootVar = 'part_out';\n lines.push(`let part_out = cad.compound({ members: [${members.join(', ')}] });`);\n } else if (members.length === 1) {\n // single Body: the imported terminal IS the result — alias keeps a\n // stable root name for executors\n rootVar = members[0];\n lines.push(`let part_out = ${rootVar}; // single-Body aggregate`);\n rootVar = 'part_out';\n }\n code = lines.join('\\n') + '\\n';\n } else {\n code = lower(calls, baseName);\n }\n return { calls, objects: results, code, files, rootVar };\n}\n\n/** M10.3 — lower one Body's calls; the last entry is the terminal alias\n * `<Body>_out` (plain JS assignment — faijs has no identity op). */\nfunction lowerBody(calls: CadCall[], label: string, body: string): string {\n const lines: string[] = [];\n lines.push(`// Generated by faijs FCStd port — ${label}`);\n lines.push(`// Units: mm (faijs contract; FCStd internal units are mm)`);\n for (const call of calls) {\n if (call.op === 'identity') {\n // terminal alias: `let <Body>_out = <chain head>;`\n lines.push(`let ${call.out} = ${call.inputs[0]}; // s? ${body} terminal`);\n continue;\n }\n const id = `s${lines.length - 2}`;\n lines.push(`let ${call.out} = ${call.op}(${renderArgs(call)}); // ${id} ${call.source}`);\n }\n return lines.join('\\n') + '\\n';\n}\n\n/** M5.2 — lower the call plan to .fai.js source. faijs syntax: top-level\n * statement flow with `let partN = cad.x(...)`; no wrapper function. */\nfunction lower(calls: CadCall[], baseName: string): string {\n const lines: string[] = [];\n lines.push(`// Generated by faijs FCStd port — ${baseName}`);\n lines.push(`// Units: mm (faijs contract; FCStd internal units are mm)`);\n for (const call of calls) {\n const id = `s${lines.length - 2}`; // statement id sN\n const args = renderArgs(call);\n lines.push(`let ${call.out} = ${call.op}(${args}); // ${id} ${call.source}`);\n }\n // final shape: union of root calls that nobody consumes; faijs scripts\n // end with the output-producing statement (no return, per fixtures).\n const consumed = new Set(calls.flatMap((c) => c.inputs));\n const roots = calls.filter((c) => !consumed.has(c.out)).map((c) => c.out);\n if (roots.length > 1) {\n lines.push(`let part_out = cad.compound({ members: [${roots.join(', ')}] });`);\n } else if (roots.length === 0) {\n lines.push(`// no translated geometry (all baked)`);\n }\n return lines.join('\\n') + '\\n';\n}\n\n/**\n * M5.2 — render one IR value as JS. Plain values JSON-encode (byte-identical to\n * the pre-JsExpr output); a `JsExpr` marker renders verbatim, and a container\n * holding one renders element-wise so the expression survives into the source.\n */\nfunction renderValue(v: unknown): string {\n if (isJsExpr(v)) return v.__jsExpr;\n if (Array.isArray(v)) {\n if (v.some(isJsExpr)) return `[${v.map(renderValue).join(', ')}]`;\n return JSON.stringify(v);\n }\n if (v && typeof v === 'object') {\n const entries = Object.entries(v as Record<string, unknown>);\n if (entries.some(([, val]) => containsJsExpr(val))) {\n return `{ ${entries.map(([k, val]) => `${k}: ${renderValue(val)}`).join(', ')} }`;\n }\n return JSON.stringify(v);\n }\n return JSON.stringify(v);\n}\n\n/** True when a value is or (recursively) contains a `JsExpr` marker. */\nfunction containsJsExpr(v: unknown): boolean {\n if (isJsExpr(v)) return true;\n if (Array.isArray(v)) return v.some(containsJsExpr);\n if (v && typeof v === 'object') return Object.values(v as Record<string, unknown>).some(containsJsExpr);\n return false;\n}\n\nfunction renderArgs(call: CadCall): string {\n const positional: string[] = [\n ...(call.noPositionalArgs ? [] : call.inputs.map((i) => i)),\n ...(call.literals ?? []).map((l) => renderValue(l)),\n ].filter((s) => s.length > 0); // M7.1: drop empty entries so we never emit `(, `\n const named: string[] = [];\n for (const [k, v] of Object.entries(call.params ?? {})) {\n if (v === undefined) continue;\n // GOTCHA (ArchDetail s444, 2026-09-21): `cad.compound`'s `members` are\n // LEXICAL VARIABLE NAMES, not data strings — render them bare, like\n // positional inputs. renderValue would quote them and the op would\n // receive strings with no BREP handle\n // (\"compound members are not all on the BREP chain\").\n if (k === 'members' && Array.isArray(v)) {\n named.push(`members: [${v.join(', ')}]`);\n continue;\n }\n named.push(`${k}: ${renderValue(v)}`);\n }\n const namedBlock = named.length ? `{ ${named.join(', ')} }` : '';\n // M7.1: no leading comma when there are no positional args — a call with only\n // named params must render as `cad.sketch({ ... })`, never `cad.sketch(, {...})`.\n const rest = namedBlock ? (positional.length ? `, ${namedBlock}` : namedBlock) : '';\n return `${positional.join(', ')}${rest}`;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contour.d.ts","sourceRoot":"","sources":["../../src/fcstd/contour.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,gHAAgH;AAChH,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAChE;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEN,0GAA0G;AAC1G,MAAM,WAAW,OAAO;IACtB,0CAA0C;IAC1C,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,2DAA2D;IAC3D,MAAM,EAAE,OAAO,CAAC;CACjB;AA2BD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"contour.d.ts","sourceRoot":"","sources":["../../src/fcstd/contour.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,gHAAgH;AAChH,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAChE;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEN,0GAA0G;AAC1G,MAAM,WAAW,OAAO;IACtB,0CAA0C;IAC1C,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,2DAA2D;IAC3D,MAAM,EAAE,OAAO,CAAC;CACjB;AA2BD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CA0D9D"}
|