@faicad/faijs 0.14.1 → 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 +23 -22
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +26 -8
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +4 -1
- package/dist/api/chamfer.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 -1
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +1 -4
- package/dist/api/generated/script-face.d.ts.map +1 -1
- package/dist/api/generated/script-face.js +2 -3
- package/dist/api/generated/script-face.js.map +1 -1
- package/dist/api/generated/sketching.js +1 -1
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/topology.d.ts +0 -8
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +19 -26
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/index.d.ts +1 -10
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +10 -18
- package/dist/api/index.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/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.map +1 -1
- package/dist/api/pattern.js +25 -61
- package/dist/api/pattern.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/surface/arg-spec.d.ts +8 -0
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +37 -36
- 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/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/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +58 -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 +39 -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 +232 -18
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +79 -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 +18 -1
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +81 -11
- 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 -18
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +25 -18
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.d.ts +4 -2
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +2 -0
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.d.ts +4 -6
- package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
- package/dist/cad-runtime/browser-lib-loader.js +4 -9
- package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +0 -7
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +1 -3
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +13 -18
- package/dist/cad-runtime/runtime.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/codegen.d.ts.map +1 -1
- package/dist/fcstd/codegen.js +8 -1
- package/dist/fcstd/codegen.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/feature-translate.d.ts.map +1 -1
- package/dist/fcstd/feature-translate.js +16 -2
- package/dist/fcstd/feature-translate.js.map +1 -1
- package/dist/fcstd/structural-types.d.ts.map +1 -1
- package/dist/fcstd/structural-types.js +5 -0
- package/dist/fcstd/structural-types.js.map +1 -1
- package/dist/index.d.ts +7 -24
- 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 +9 -0
- package/dist/lang/determinism-scanner.d.ts.map +1 -1
- package/dist/lang/determinism-scanner.js +7 -1
- package/dist/lang/determinism-scanner.js.map +1 -1
- 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 +6 -16
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +6 -16
- 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 -19
- 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 +1 -22
- 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/sdk.d.ts +2 -2
- package/dist/sdk.js +2 -2
- package/dist/sdk.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/lineage-resolve.js +1 -1
- package/dist/topology/naming/lineage-resolve.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 +3 -3
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +6 -3
- 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 -110
- package/dist/api/compound.d.ts.map +0 -1
- package/dist/api/compound.js +0 -164
- package/dist/api/compound.js.map +0 -1
- package/dist/api/copy.d.ts +0 -40
- package/dist/api/copy.d.ts.map +0 -1
- package/dist/api/copy.js +0 -83
- 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 -243
- 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 -79
- 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 -254
- package/dist/api/fai_split.js.map +0 -1
- package/dist/api/load.d.ts +0 -41
- package/dist/api/load.d.ts.map +0 -1
- package/dist/api/load.js +0 -84
- 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 -74
- 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 -101
- 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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* env-agnostic.ts — environment-agnostic shared surface (weapp plan §9.1)
|
|
3
|
+
*
|
|
4
|
+
* One home for the exports that every host entry (index / browser / weapp)
|
|
5
|
+
* must share: identity + runtime-state + lang/* text-layer tools. Umbrella
|
|
6
|
+
* entries re-export this module instead of hand-listing the same symbols three
|
|
7
|
+
* times — hand lists are how drift (and entry leaks) happened before.
|
|
8
|
+
*
|
|
9
|
+
* Constraint: NOTHING in this module's dependency graph may be
|
|
10
|
+
* platform-specific. No node:*, no DOM, no three (the weapp main thread holds
|
|
11
|
+
* its own three copy — a second copy via this entry is a hard failure), no
|
|
12
|
+
* brepkit, no wasm loaders. Guarded by entry-boundary.test.ts.
|
|
13
|
+
*/
|
|
14
|
+
export type { FileId, InnerId, ScopedId, StmtId, PartName, GroupName, RefId, ReferenceId, SelectorKey, OccurrenceId, ShapeId, FaceId, EdgeId, NodeId, StatementId, FaceSelector, } from './identity.js';
|
|
15
|
+
export { asFileId, asInnerId, asScopedId, asStmtId, asPartName, asGroupName, asRefId, asReferenceId, asSelectorKey, asOccurrenceId, asShapeId, asFaceId, asEdgeId, asNodeId, toScopedId, splitScopedId, isScopedId, toInnerId, } from './identity.js';
|
|
16
|
+
export { configureBackends, getBackends, setCurrentStmt, getCurrentStmt, keep, keepHidden, getRuntimeState, nameOf, setName, setKeepSink, setPendingAssemblyTransforms, takePendingAssemblyTransforms, assertContractVersion, CONTRACT_VERSION, } from './runtime-state.js';
|
|
17
|
+
export type { Backends, FaijsRuntimeState, ShapeSlot, KeepSink, RuntimeExecutionMode, AssemblyTransform, StdlibFn, StdlibNamespace, ExecutionAnchor, } from './runtime-state.js';
|
|
18
|
+
export type { Vec3, JsonValue, TerminalShape, ParamDef, } from './lang/types.js';
|
|
19
|
+
export type { Provenance, NewFaceRule } from './topology/naming/lineage.js';
|
|
20
|
+
export { derivePartName, getMaxModelNum, } from './lang/allocate-id.js';
|
|
21
|
+
export type { DerivePartNameInput, DerivePartNameResult } from './lang/allocate-id.js';
|
|
22
|
+
export { fmtNum, formatCodeLine } from './lang/codegen.js';
|
|
23
|
+
export type { FormatCodeLineInput } from './lang/codegen.js';
|
|
24
|
+
export { analyzeCode } from './lang/statement-summary.js';
|
|
25
|
+
export type { StatementSummary } from './lang/statement-summary.js';
|
|
26
|
+
export { codeToArgs } from './lang/code-to-args.js';
|
|
27
|
+
export type { CodeToArgsResult } from './lang/code-to-args.js';
|
|
28
|
+
export { extractMetadata } from './lang/metadata-extractor.js';
|
|
29
|
+
export type { UiMetadata, ArgSource, ParamEntry, ImportEntry, FunctionEntry, BlockEntry, KeepEntry, ExtractMetadataOptions, } from './lang/metadata-extractor.js';
|
|
30
|
+
export { scanSource, scanAst, assertSecure } from './lang/security-scanner.js';
|
|
31
|
+
export type { SecurityPolicy, SecurityRuleId, SecurityViolation, SecurityScanOptions, SecurityScanResult, } from './lang/security-scanner.js';
|
|
32
|
+
export { validateExpression } from './lang/expr-validate.js';
|
|
33
|
+
export type { ExprValidateInput, ExprValidateResult } from './lang/expr-validate.js';
|
|
34
|
+
export { editArgSource } from './lang/source-edit.js';
|
|
35
|
+
export type { EditSourceError } from './lang/source-edit.js';
|
|
36
|
+
export type { HostArg, HostRef, HostVarRef, HostParamRef, HostCallRef, HostExprRef, HostRefKind, } from './lang/host-arg.js';
|
|
37
|
+
export { isHostVarRef, isHostParamRef, isHostCallRef, isHostExprRef, isHostRef, hostArgToDisplay, hostArgToLiteral, HOST_REF_KINDS, } from './lang/host-arg.js';
|
|
38
|
+
//# sourceMappingURL=env-agnostic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-agnostic.d.ts","sourceRoot":"","sources":["../src/env-agnostic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,YAAY,EACV,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EACtD,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EACtD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,GAClD,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAClE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAChE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAC5B,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,GACjD,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAC9D,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAC/D,4BAA4B,EAAE,6BAA6B,EAAE,qBAAqB,EAClF,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AACxB,YAAY,EACV,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,oBAAoB,EACtE,iBAAiB,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,GAC9D,MAAM,iBAAiB,CAAA;AAGxB,YAAY,EACV,IAAI,EAAE,SAAS,EACf,aAAa,EAAE,QAAQ,GACxB,MAAM,cAAc,CAAA;AAErB,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,EACL,cAAc,EAAE,cAAc,GAC/B,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACnF,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,YAAY,EACV,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EACpF,sBAAsB,GACvB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3E,YAAY,EACV,cAAc,EAAE,cAAc,EAAE,iBAAiB,EACjD,mBAAmB,EAAE,kBAAkB,GACxC,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD,YAAY,EACV,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,GAClF,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EACrE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,GACnD,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* env-agnostic.ts — environment-agnostic shared surface (weapp plan §9.1)
|
|
3
|
+
*
|
|
4
|
+
* One home for the exports that every host entry (index / browser / weapp)
|
|
5
|
+
* must share: identity + runtime-state + lang/* text-layer tools. Umbrella
|
|
6
|
+
* entries re-export this module instead of hand-listing the same symbols three
|
|
7
|
+
* times — hand lists are how drift (and entry leaks) happened before.
|
|
8
|
+
*
|
|
9
|
+
* Constraint: NOTHING in this module's dependency graph may be
|
|
10
|
+
* platform-specific. No node:*, no DOM, no three (the weapp main thread holds
|
|
11
|
+
* its own three copy — a second copy via this entry is a hard failure), no
|
|
12
|
+
* brepkit, no wasm loaders. Guarded by entry-boundary.test.ts.
|
|
13
|
+
*/
|
|
14
|
+
export { asFileId, asInnerId, asScopedId, asStmtId, asPartName, asGroupName, asRefId, asReferenceId, asSelectorKey, asOccurrenceId, asShapeId, asFaceId, asEdgeId, asNodeId, toScopedId, splitScopedId, isScopedId, toInnerId, } from './identity.js';
|
|
15
|
+
// ── runtime-state:运行时状态锚点(零依赖层;引擎与库共享)──
|
|
16
|
+
export { configureBackends, getBackends, setCurrentStmt, getCurrentStmt, keep, keepHidden, getRuntimeState, nameOf, setName, setKeepSink, setPendingAssemblyTransforms, takePendingAssemblyTransforms, assertContractVersion, CONTRACT_VERSION, } from './runtime-state.js';
|
|
17
|
+
export { derivePartName, getMaxModelNum, } from './lang/allocate-id.js';
|
|
18
|
+
export { fmtNum, formatCodeLine } from './lang/codegen.js';
|
|
19
|
+
export { analyzeCode } from './lang/statement-summary.js';
|
|
20
|
+
export { codeToArgs } from './lang/code-to-args.js';
|
|
21
|
+
// MetadataExtractor — 无 IR 元数据提取器(UI 通道语义源;UiMetadata 全量)
|
|
22
|
+
export { extractMetadata } from './lang/metadata-extractor.js';
|
|
23
|
+
// SecurityScanner — 静态安全门禁(纵深防御第一层)
|
|
24
|
+
export { scanSource, scanAst, assertSecure } from './lang/security-scanner.js';
|
|
25
|
+
// 参数表达式编辑(P0-C/P0-D):实时校验层 + 编辑面板纯函数
|
|
26
|
+
export { validateExpression } from './lang/expr-validate.js';
|
|
27
|
+
export { editArgSource } from './lang/source-edit.js';
|
|
28
|
+
export { isHostVarRef, isHostParamRef, isHostCallRef, isHostExprRef, isHostRef, hostArgToDisplay, hostArgToLiteral, HOST_REF_KINDS, } from './lang/host-arg.js';
|
|
29
|
+
//# sourceMappingURL=env-agnostic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-agnostic.js","sourceRoot":"","sources":["../src/env-agnostic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,EACL,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAClE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAChE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAC5B,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,GACjD,MAAM,YAAY,CAAA;AAEnB,0CAA0C;AAC1C,OAAO,EACL,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAC9D,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAC/D,4BAA4B,EAAE,6BAA6B,EAAE,qBAAqB,EAClF,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AAaxB,OAAO,EACL,cAAc,EAAE,cAAc,GAC/B,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,0DAA0D;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAK3D,oCAAoC;AACpC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAK3E,qCAAqC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAMlD,OAAO,EACL,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EACrE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,GACnD,MAAM,iBAAiB,CAAA","sourcesContent":["/**\n * env-agnostic.ts — environment-agnostic shared surface (weapp plan §9.1)\n *\n * One home for the exports that every host entry (index / browser / weapp)\n * must share: identity + runtime-state + lang/* text-layer tools. Umbrella\n * entries re-export this module instead of hand-listing the same symbols three\n * times — hand lists are how drift (and entry leaks) happened before.\n *\n * Constraint: NOTHING in this module's dependency graph may be\n * platform-specific. No node:*, no DOM, no three (the weapp main thread holds\n * its own three copy — a second copy via this entry is a hard failure), no\n * brepkit, no wasm loaders. Guarded by entry-boundary.test.ts.\n */\n\n// ── identity:品牌类型 + 信任点(f0,零依赖)──\nexport type {\n FileId, InnerId, ScopedId, StmtId, PartName, GroupName,\n RefId, ReferenceId, SelectorKey, OccurrenceId, ShapeId,\n FaceId, EdgeId, NodeId, StatementId, FaceSelector,\n} from './identity'\nexport {\n asFileId, asInnerId, asScopedId, asStmtId, asPartName, asGroupName,\n asRefId, asReferenceId, asSelectorKey, asOccurrenceId, asShapeId,\n asFaceId, asEdgeId, asNodeId,\n toScopedId, splitScopedId, isScopedId, toInnerId,\n} from './identity'\n\n// ── runtime-state:运行时状态锚点(零依赖层;引擎与库共享)──\nexport {\n configureBackends, getBackends, setCurrentStmt, getCurrentStmt,\n keep, keepHidden, getRuntimeState, nameOf, setName, setKeepSink,\n setPendingAssemblyTransforms, takePendingAssemblyTransforms, assertContractVersion,\n CONTRACT_VERSION,\n} from './runtime-state'\nexport type {\n Backends, FaijsRuntimeState, ShapeSlot, KeepSink, RuntimeExecutionMode,\n AssemblyTransform, StdlibFn, StdlibNamespace, ExecutionAnchor,\n} from './runtime-state'\n\n// ── L0 lang/ 文本面(IR 是引擎内部实现细节,不导出;公开面只有代码文本工具与结果类型)──\nexport type {\n Vec3, JsonValue,\n TerminalShape, ParamDef,\n} from './lang/types'\n// 拓扑身份 provenance 类型(op 级命名 / 拓扑身份系统公开面)。\nexport type { Provenance, NewFaceRule } from './topology/naming/lineage'\nexport {\n derivePartName, getMaxModelNum,\n} from './lang/allocate-id'\nexport type { DerivePartNameInput, DerivePartNameResult } from './lang/allocate-id'\nexport { fmtNum, formatCodeLine } from './lang/codegen'\nexport type { FormatCodeLineInput } from './lang/codegen'\nexport { analyzeCode } from './lang/statement-summary'\nexport type { StatementSummary } from './lang/statement-summary'\nexport { codeToArgs } from './lang/code-to-args'\nexport type { CodeToArgsResult } from './lang/code-to-args'\n// MetadataExtractor — 无 IR 元数据提取器(UI 通道语义源;UiMetadata 全量)\nexport { extractMetadata } from './lang/metadata-extractor'\nexport type {\n UiMetadata, ArgSource, ParamEntry, ImportEntry, FunctionEntry, BlockEntry, KeepEntry,\n ExtractMetadataOptions,\n} from './lang/metadata-extractor'\n// SecurityScanner — 静态安全门禁(纵深防御第一层)\nexport { scanSource, scanAst, assertSecure } from './lang/security-scanner'\nexport type {\n SecurityPolicy, SecurityRuleId, SecurityViolation,\n SecurityScanOptions, SecurityScanResult,\n} from './lang/security-scanner'\n// 参数表达式编辑(P0-C/P0-D):实时校验层 + 编辑面板纯函数\nexport { validateExpression } from './lang/expr-validate'\nexport type { ExprValidateInput, ExprValidateResult } from './lang/expr-validate'\nexport { editArgSource } from './lang/source-edit'\nexport type { EditSourceError } from './lang/source-edit'\n// HostArg — 宿主友好位置参数类型(IR 屏蔽层)\nexport type {\n HostArg, HostRef, HostVarRef, HostParamRef, HostCallRef, HostExprRef, HostRefKind,\n} from './lang/host-arg'\nexport {\n isHostVarRef, isHostParamRef, isHostCallRef, isHostExprRef, isHostRef,\n hostArgToDisplay, hostArgToLiteral, HOST_REF_KINDS,\n} from './lang/host-arg'\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/fcstd/codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAoB,MAAM,wBAAwB,CAAC;AAExE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,KAAK,SAAS,EAA6C,MAAM,gBAAgB,CAAC;AAG3F,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,WAAW,EAAE,YAAY,GAAG,OAAO,GAAG,gBAAgB,CAAC;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7E;AAED,qFAAqF;AACrF,MAAM,WAAW,SAAS;IACxB,kDAAkD;IAClD,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb;wFACoF;IACpF,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtD,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAgED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,aAAa,EAClB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9F,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EACtC,QAAQ,EAAE,MAAM;AAChB,2EAA2E;AAC3E,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;AACnC,wFAAwF;AACxF,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC;AACnC,gGAAgG;AAChG,iBAAiB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACtC,SAAS,
|
|
1
|
+
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/fcstd/codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAoB,MAAM,wBAAwB,CAAC;AAExE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,KAAK,SAAS,EAA6C,MAAM,gBAAgB,CAAC;AAG3F,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,WAAW,EAAE,YAAY,GAAG,OAAO,GAAG,gBAAgB,CAAC;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7E;AAED,qFAAqF;AACrF,MAAM,WAAW,SAAS;IACxB,kDAAkD;IAClD,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb;wFACoF;IACpF,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtD,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAgED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,aAAa,EAClB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9F,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EACtC,QAAQ,EAAE,MAAM;AAChB,2EAA2E;AAC3E,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;AACnC,wFAAwF;AACxF,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC;AACnC,gGAAgG;AAChG,iBAAiB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACtC,SAAS,CA+ZX"}
|
package/dist/fcstd/codegen.js
CHANGED
|
@@ -249,7 +249,14 @@ brokenShapeAssets) {
|
|
|
249
249
|
const lastVar = verdict.calls.at(-1)?.out;
|
|
250
250
|
const sketchLink = obj.properties.get('Sketch')?.children[0]?.attributes['value'];
|
|
251
251
|
const pl = (sketchLink ? placements?.get(sketchLink) : undefined) ?? placements?.get(name);
|
|
252
|
-
|
|
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) {
|
|
253
260
|
// 单个刚性放置:旋转(四元数,绕局部原点)+ 平移 = FreeCAD Placement(P,Q)。
|
|
254
261
|
// 直接发 cad.place,避免 euler 往返损失精度(方案 §4.7:两语句合一)。
|
|
255
262
|
const cur = lastVar;
|
|
@@ -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 *\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 if (lastVar && pl && !isIdentityPlacement(pl)) {\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
|
+
{"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"]}
|
|
@@ -23,6 +23,30 @@ export type ExprValue = number | undefined;
|
|
|
23
23
|
* @returns the value in mm, or undefined when not a constant expression
|
|
24
24
|
*/
|
|
25
25
|
export declare function evalConstantExpression(expr: string): ExprValue;
|
|
26
|
+
import type { FcstdObject } from './document.js';
|
|
27
|
+
/**
|
|
28
|
+
* 三跳解析:`<<Label>>.Alias` / `Object.Alias` → 数据源对象 → 别名单元格 → 去掉
|
|
29
|
+
* 前导 `=` 后交给 evalConstantExpression。同表地址(`=B2*2` 里的 `B2`)再跳一次。
|
|
30
|
+
*
|
|
31
|
+
* @param docObjects 全文档对象(按 Label 或 name 匹配数据源)
|
|
32
|
+
* @param label 数据源标识(`<<Label>>` 内的 Label,或裸对象名)
|
|
33
|
+
* @param alias 单元格别名
|
|
34
|
+
* @returns 单元格值(mm),不可解析 → undefined
|
|
35
|
+
*/
|
|
36
|
+
export declare function spreadsheetAliasValue(docObjects: readonly FcstdObject[], label: string, alias: string): ExprValue;
|
|
37
|
+
/**
|
|
38
|
+
* 带文档上下文的表达式求值:引用(`<<L>>.A` / `L.A` / 同表地址 `B2`)替换为
|
|
39
|
+
* 数值后,求值仅含常数与 + - * / ( ) 的算术。任何残留标识符 / 函数 → undefined
|
|
40
|
+
* (no heuristic fallback)。返回值单位跟随单元格(mm 语境,角度单元格调用方解释)。
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* Evaluate a FreeCAD expression against the document objects.
|
|
44
|
+
* @param expr - the expression text (without the leading `=`).
|
|
45
|
+
* @param docObjects - the document objects visible to the expression.
|
|
46
|
+
* @param self - the object the expression is evaluated on, if any.
|
|
47
|
+
* @returns the evaluated expression value.
|
|
48
|
+
*/
|
|
49
|
+
export declare function evalWithDoc(expr: string, docObjects: readonly FcstdObject[], self?: FcstdObject): ExprValue;
|
|
26
50
|
/** One <Expression path=... expression=...> binding with its optional constant value. */
|
|
27
51
|
export interface ExpressionBinding {
|
|
28
52
|
/** property path the expression drives (e.g. "Length") */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../src/fcstd/expressions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,+GAA+G;AAC/G,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAa3C;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAY9D;
|
|
1
|
+
{"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../src/fcstd/expressions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,+GAA+G;AAC/G,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAa3C;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAY9D;AAUD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,SAAS,WAAW,EAAE,EAClC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,SAAS,CAiBX;AAQD;;;;GAIG;AACH;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,SAAS,WAAW,EAAE,EAClC,IAAI,CAAC,EAAE,WAAW,GACjB,SAAS,CAuBX;AA6BD,yFAAyF;AACzF,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,aAAa,GAAG,SAAS,GAC9B,iBAAiB,EAAE,CAWrB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAElE"}
|
|
@@ -33,6 +33,97 @@ export function evalConstantExpression(expr) {
|
|
|
33
33
|
return undefined; // unknown unit → unsupported
|
|
34
34
|
return value * factor;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* 三跳解析:`<<Label>>.Alias` / `Object.Alias` → 数据源对象 → 别名单元格 → 去掉
|
|
38
|
+
* 前导 `=` 后交给 evalConstantExpression。同表地址(`=B2*2` 里的 `B2`)再跳一次。
|
|
39
|
+
*
|
|
40
|
+
* @param docObjects 全文档对象(按 Label 或 name 匹配数据源)
|
|
41
|
+
* @param label 数据源标识(`<<Label>>` 内的 Label,或裸对象名)
|
|
42
|
+
* @param alias 单元格别名
|
|
43
|
+
* @returns 单元格值(mm),不可解析 → undefined
|
|
44
|
+
*/
|
|
45
|
+
export function spreadsheetAliasValue(docObjects, label, alias) {
|
|
46
|
+
const src = docObjects.find((o) => o.type === 'Spreadsheet::Sheet' &&
|
|
47
|
+
(objectLabel(o) === label || o.name === label));
|
|
48
|
+
if (!src)
|
|
49
|
+
return undefined;
|
|
50
|
+
// cells 属性(Spreadsheet::PropertySheet)的 <Cell address alias content/> 子元素
|
|
51
|
+
const cells = src.properties.get('cells') ?? [...src.properties.values()].find((p) => p.children.some((c) => c.tagName === 'Cell' || c.children.some((g) => g.tagName === 'Cell')));
|
|
52
|
+
if (!cells)
|
|
53
|
+
return undefined;
|
|
54
|
+
const cell = [...cells.children].flatMap((c) => (c.tagName === 'Cell' ? [c] : c.children))
|
|
55
|
+
.find((c) => c.tagName === 'Cell' && c.attributes['alias'] === alias);
|
|
56
|
+
if (!cell)
|
|
57
|
+
return undefined;
|
|
58
|
+
const content = cell.attributes['content'] ?? '';
|
|
59
|
+
// 去掉前导 =(同表地址/算术再走一次带上下文的求值,一跳深度足够语料头部)
|
|
60
|
+
return evalWithDoc(content.startsWith('=') ? content.slice(1) : content, docObjects, src);
|
|
61
|
+
}
|
|
62
|
+
/** 对象的 Label 属性(FreeCAD 引用 `<<Label>>` 用的是它,不是 name)。 */
|
|
63
|
+
function objectLabel(o) {
|
|
64
|
+
const el = o.properties.get('Label')?.children[0];
|
|
65
|
+
return el?.attributes['value'] ?? (el?.valueText || undefined);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 带文档上下文的表达式求值:引用(`<<L>>.A` / `L.A` / 同表地址 `B2`)替换为
|
|
69
|
+
* 数值后,求值仅含常数与 + - * / ( ) 的算术。任何残留标识符 / 函数 → undefined
|
|
70
|
+
* (no heuristic fallback)。返回值单位跟随单元格(mm 语境,角度单元格调用方解释)。
|
|
71
|
+
*/
|
|
72
|
+
/**
|
|
73
|
+
* Evaluate a FreeCAD expression against the document objects.
|
|
74
|
+
* @param expr - the expression text (without the leading `=`).
|
|
75
|
+
* @param docObjects - the document objects visible to the expression.
|
|
76
|
+
* @param self - the object the expression is evaluated on, if any.
|
|
77
|
+
* @returns the evaluated expression value.
|
|
78
|
+
*/
|
|
79
|
+
export function evalWithDoc(expr, docObjects, self) {
|
|
80
|
+
let s = expr.trim();
|
|
81
|
+
// 引用替换:<<Label>>.Alias | Label.Alias | Object.Alias(标识符.标识符)
|
|
82
|
+
s = s.replace(/<<([^>]+)>>\.([A-Za-z_][A-Za-z0-9_]*)|([A-Za-z_][A-Za-z0-9_]*)\.([A-Za-z_][A-Za-z0-9_]*)/g, (whole, brLabel, brAlias, plLabel, plAlias) => {
|
|
83
|
+
const label = brLabel ?? plLabel;
|
|
84
|
+
const alias = brAlias ?? plAlias;
|
|
85
|
+
const v = spreadsheetAliasValue(docObjects, label, alias);
|
|
86
|
+
return v === undefined ? whole : `(${v})`;
|
|
87
|
+
});
|
|
88
|
+
// 同表地址(self 表内 address→alias 值,如 `B2` / `B2*2`):仅当 self 是表
|
|
89
|
+
if (self?.type === 'Spreadsheet::Sheet') {
|
|
90
|
+
s = s.replace(/\b([A-Z]+[0-9]+)\b/g, (whole, addr) => {
|
|
91
|
+
const v = spreadsheetAddressValue(self, addr, docObjects);
|
|
92
|
+
return v === undefined ? whole : `(${v})`;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// 单元格值自带单位(=5.9mm)——先按「常数+单位」求值(evalConstantExpression
|
|
96
|
+
// 的既有口径),再进纯算术;单位记号在算术前剥离(返回值跟随 mm 语境)。
|
|
97
|
+
const constant = evalConstantExpression(s);
|
|
98
|
+
if (constant !== undefined)
|
|
99
|
+
return constant;
|
|
100
|
+
s = s.replace(/\b(mm|millimeter|cm|centimeter|m|meter|in|inch|"|ft|foot|deg|degree|°|rad|radian)\b/g, '');
|
|
101
|
+
return evalArithmetic(s);
|
|
102
|
+
}
|
|
103
|
+
/** 同表地址取值:address → 该单元格 content(递归经 evalWithDoc,一跳深度)。 */
|
|
104
|
+
function spreadsheetAddressValue(sheet, address, docObjects) {
|
|
105
|
+
const cells = sheet.properties.get('cells');
|
|
106
|
+
if (!cells)
|
|
107
|
+
return undefined;
|
|
108
|
+
const cell = [...cells.children].flatMap((c) => (c.tagName === 'Cell' ? [c] : c.children))
|
|
109
|
+
.find((c) => c.tagName === 'Cell' && c.attributes['address'] === address);
|
|
110
|
+
if (!cell)
|
|
111
|
+
return undefined;
|
|
112
|
+
const content = cell.attributes['content'] ?? '';
|
|
113
|
+
return evalWithDoc(content.startsWith('=') ? content.slice(1) : content, docObjects, sheet);
|
|
114
|
+
}
|
|
115
|
+
/** 仅含数字与 + - * / ( ) 空格的算术求值;任何其它字符 → undefined。 */
|
|
116
|
+
function evalArithmetic(s) {
|
|
117
|
+
if (!/^[-+*/(). 0-9eE]*$/.test(s))
|
|
118
|
+
return undefined;
|
|
119
|
+
try {
|
|
120
|
+
const v = Function(`"use strict"; return (${s});`)();
|
|
121
|
+
return typeof v === 'number' && Number.isFinite(v) ? v : undefined;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
36
127
|
/**
|
|
37
128
|
* Extract expression bindings from a parsed ExpressionEngine property.
|
|
38
129
|
* `bindable` = every expression evaluated to a constant (then the property
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expressions.js","sourceRoot":"","sources":["../../src/fcstd/expressions.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,GAA2B;IACzC,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;IACpB,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE;IACtB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI;IACpB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI;IAC/B,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;IACtB,qEAAqE;IACrE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IACzB,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,gBAAgB;IAChB,MAAM,CAAC,GAAG,+DAA+D,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClF,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACnB,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC,CAAC,6BAA6B;IACzE,OAAO,KAAK,GAAG,MAAM,CAAC;AACxB,CAAC;AAaD;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAA+B;IAE/B,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,OAAO,KAAK,YAAY;YAAE,SAAS;QAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QACrD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,sBAAsB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,QAA6B;IACvD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;AAC7E,CAAC","sourcesContent":["/**\r\n * M6.2 — expression downgrade: <ExpressionEngine> → concrete values.\r\n *\r\n * Format (verified on TwoLengthsPadWithExpression.FCStd):\r\n * <ExpressionEngine count=\"N\">\r\n * <Expression path=\"Length\" expression=\"10 mm\" />\r\n * </ExpressionEngine>\r\n *\r\n * Scope: constant expressions only — number literals with optional unit\r\n * (mm/m/cm/in/deg/rad). Anything else (object references like Sketch.Constraints[3],\r\n * arithmetic with identifiers, functions) is NOT evaluated: the consumer must\r\n * treat the property as unknown and degrade (no heuristic fallback, plan §12).\r\n */\r\nimport type { FcstdProperty } from './document.js';\r\n\r\n/** Evaluated expression result in mm (angles keep their own unit): a number, or undefined when unsupported. */\nexport type ExprValue = number | undefined;\r\n\r\nconst UNIT_TO_MM: Record<string, number> = {\r\n mm: 1, millimeter: 1,\r\n cm: 10, centimeter: 10,\r\n m: 1000, meter: 1000,\r\n in: 25.4, inch: 25.4, '\"': 25.4,\r\n ft: 304.8, foot: 304.8,\r\n // angles: value kept in the expression's own unit; callers interpret\r\n deg: 1, degree: 1, '°': 1,\r\n rad: 1, radian: 1,\r\n};\r\n\r\n/**\r\n * Evaluate a constant expression. Returns undefined when the expression is\r\n * not a bare constant (reference/arithmetic/function) — explicit unsupported,\r\n * no guessing.\r\n *\r\n * @param expr raw expression string (e.g. \"10 mm\")\r\n * @returns the value in mm, or undefined when not a constant expression\r\n */\r\nexport function evalConstantExpression(expr: string): ExprValue {\r\n const s = expr.trim();\r\n // number [unit]\r\n const m = /^([-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?)\\s*([A-Za-z°\"]*)$/.exec(s);\r\n if (!m) return undefined;\r\n const value = Number(m[1]);\r\n if (!Number.isFinite(value)) return undefined;\r\n const unit = m[2]!;\r\n if (unit === '') return value;\r\n const factor = UNIT_TO_MM[unit.toLowerCase()];\r\n if (factor === undefined) return undefined; // unknown unit → unsupported\r\n return value * factor;\r\n}\r\n\r\n\r\n/** One <Expression path=... expression=...> binding with its optional constant value. */\r\nexport interface ExpressionBinding {\r\n /** property path the expression drives (e.g. \"Length\") */\r\n path: string;\r\n /** raw expression string */\r\n expression: string;\r\n /** evaluated constant; undefined when not a constant expression */\r\n value?: number;\r\n}\r\n\r\n/**\r\n * Extract expression bindings from a parsed ExpressionEngine property.\r\n * `bindable` = every expression evaluated to a constant (then the property\r\n * values can be overridden); otherwise the engine is only partially readable.\r\n *\r\n * @param prop the parsed <ExpressionEngine> property (undefined → no bindings)\r\n * @returns one binding per <Expression> child, values evaluated\r\n */\r\nexport function parseExpressionEngine(\r\n prop: FcstdProperty | undefined,\r\n): ExpressionBinding[] {\r\n const engineEl = prop?.children[0];\r\n if (!engineEl) return [];\r\n const out: ExpressionBinding[] = [];\r\n for (const el of engineEl.children) {\r\n if (el.tagName !== 'Expression') continue;\r\n const path = el.attributes['path'] ?? '';\r\n const expression = el.attributes['expression'] ?? '';\r\n out.push({ path, expression, value: evalConstantExpression(expression) });\r\n }\r\n return out;\r\n}\r\n\r\n/**\n * True when all bindings are constants → safe to override property values.\r\n * @param bindings bindings extracted by parseExpressionEngine\r\n * @returns true when there is at least one binding and every value is defined\r\n */\r\nexport function allConstant(bindings: ExpressionBinding[]): boolean {\r\n return bindings.length > 0 && bindings.every((b) => b.value !== undefined);\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"expressions.js","sourceRoot":"","sources":["../../src/fcstd/expressions.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M6.2 — expression downgrade: <ExpressionEngine> → concrete values.\n *\n * Format (verified on TwoLengthsPadWithExpression.FCStd):\n * <ExpressionEngine count=\"N\">\n * <Expression path=\"Length\" expression=\"10 mm\" />\n * </ExpressionEngine>\n *\n * Scope: constant expressions only — number literals with optional unit\n * (mm/m/cm/in/deg/rad). Anything else (object references like Sketch.Constraints[3],\n * arithmetic with identifiers, functions) is NOT evaluated: the consumer must\n * treat the property as unknown and degrade (no heuristic fallback, plan §12).\n */\nimport type { FcstdProperty } from './document.js';\n\n/** Evaluated expression result in mm (angles keep their own unit): a number, or undefined when unsupported. */\nexport type ExprValue = number | undefined;\n\nconst UNIT_TO_MM: Record<string, number> = {\n mm: 1, millimeter: 1,\n cm: 10, centimeter: 10,\n m: 1000, meter: 1000,\n in: 25.4, inch: 25.4, '\"': 25.4,\n ft: 304.8, foot: 304.8,\n // angles: value kept in the expression's own unit; callers interpret\n deg: 1, degree: 1, '°': 1,\n rad: 1, radian: 1,\n};\n\n/**\n * Evaluate a constant expression. Returns undefined when the expression is\n * not a bare constant (reference/arithmetic/function) — explicit unsupported,\n * no guessing.\n *\n * @param expr raw expression string (e.g. \"10 mm\")\n * @returns the value in mm, or undefined when not a constant expression\n */\nexport function evalConstantExpression(expr: string): ExprValue {\n const s = expr.trim();\n // number [unit]\n const m = /^([-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?)\\s*([A-Za-z°\"]*)$/.exec(s);\n if (!m) return undefined;\n const value = Number(m[1]);\n if (!Number.isFinite(value)) return undefined;\n const unit = m[2]!;\n if (unit === '') return value;\n const factor = UNIT_TO_MM[unit.toLowerCase()];\n if (factor === undefined) return undefined; // unknown unit → unsupported\n return value * factor;\n}\n\n// ── P1-1 参数载体(2026-09-23):Spreadsheet 别名三跳解析 + 引用算术 ──\n//\n// 语料实测(B2 / probe-param-cells,见 2026-09-21 方案 §3.9):<Expression> 的\n// 绝对头部是 `<<Label>>.Alias`(1,377 条)与引用参与的算术(657 条),而带别名\n// 的参数单元格 84.8% 就是「=5.9mm」形态——现有 evalConstantExpression 已能算值,\n// 缺的只是三跳:<<Data>> → 按 Label 找对象 → 按 alias 找单元格 → 去掉前导 =。\n// 函数族 / cells[...] 区间仍不猜(no heuristic fallback,方案 §12)。\n\nimport type { FcstdObject } from './document.js';\n\n/**\n * 三跳解析:`<<Label>>.Alias` / `Object.Alias` → 数据源对象 → 别名单元格 → 去掉\n * 前导 `=` 后交给 evalConstantExpression。同表地址(`=B2*2` 里的 `B2`)再跳一次。\n *\n * @param docObjects 全文档对象(按 Label 或 name 匹配数据源)\n * @param label 数据源标识(`<<Label>>` 内的 Label,或裸对象名)\n * @param alias 单元格别名\n * @returns 单元格值(mm),不可解析 → undefined\n */\nexport function spreadsheetAliasValue(\n docObjects: readonly FcstdObject[],\n label: string,\n alias: string,\n): ExprValue {\n const src = docObjects.find(\n (o) => o.type === 'Spreadsheet::Sheet' &&\n (objectLabel(o) === label || o.name === label),\n );\n if (!src) return undefined;\n // cells 属性(Spreadsheet::PropertySheet)的 <Cell address alias content/> 子元素\n const cells = src.properties.get('cells') ?? [...src.properties.values()].find((p) =>\n p.children.some((c) => c.tagName === 'Cell' || c.children.some((g) => g.tagName === 'Cell')),\n );\n if (!cells) return undefined;\n const cell = [...cells.children].flatMap((c) => (c.tagName === 'Cell' ? [c] : c.children))\n .find((c) => c.tagName === 'Cell' && c.attributes['alias'] === alias);\n if (!cell) return undefined;\n const content = cell.attributes['content'] ?? '';\n // 去掉前导 =(同表地址/算术再走一次带上下文的求值,一跳深度足够语料头部)\n return evalWithDoc(content.startsWith('=') ? content.slice(1) : content, docObjects, src);\n}\n\n/** 对象的 Label 属性(FreeCAD 引用 `<<Label>>` 用的是它,不是 name)。 */\nfunction objectLabel(o: FcstdObject): string | undefined {\n const el = o.properties.get('Label')?.children[0];\n return el?.attributes['value'] ?? (el?.valueText || undefined);\n}\n\n/**\n * 带文档上下文的表达式求值:引用(`<<L>>.A` / `L.A` / 同表地址 `B2`)替换为\n * 数值后,求值仅含常数与 + - * / ( ) 的算术。任何残留标识符 / 函数 → undefined\n * (no heuristic fallback)。返回值单位跟随单元格(mm 语境,角度单元格调用方解释)。\n */\n/**\n * Evaluate a FreeCAD expression against the document objects.\n * @param expr - the expression text (without the leading `=`).\n * @param docObjects - the document objects visible to the expression.\n * @param self - the object the expression is evaluated on, if any.\n * @returns the evaluated expression value.\n */\nexport function evalWithDoc(\n expr: string,\n docObjects: readonly FcstdObject[],\n self?: FcstdObject,\n): ExprValue {\n let s = expr.trim();\n // 引用替换:<<Label>>.Alias | Label.Alias | Object.Alias(标识符.标识符)\n s = s.replace(/<<([^>]+)>>\\.([A-Za-z_][A-Za-z0-9_]*)|([A-Za-z_][A-Za-z0-9_]*)\\.([A-Za-z_][A-Za-z0-9_]*)/g,\n (whole, brLabel, brAlias, plLabel, plAlias) => {\n const label = brLabel ?? plLabel;\n const alias = brAlias ?? plAlias;\n const v = spreadsheetAliasValue(docObjects, label!, alias!);\n return v === undefined ? whole : `(${v})`;\n });\n // 同表地址(self 表内 address→alias 值,如 `B2` / `B2*2`):仅当 self 是表\n if (self?.type === 'Spreadsheet::Sheet') {\n s = s.replace(/\\b([A-Z]+[0-9]+)\\b/g, (whole, addr: string) => {\n const v = spreadsheetAddressValue(self, addr, docObjects);\n return v === undefined ? whole : `(${v})`;\n });\n }\n // 单元格值自带单位(=5.9mm)——先按「常数+单位」求值(evalConstantExpression\n // 的既有口径),再进纯算术;单位记号在算术前剥离(返回值跟随 mm 语境)。\n const constant = evalConstantExpression(s);\n if (constant !== undefined) return constant;\n s = s.replace(/\\b(mm|millimeter|cm|centimeter|m|meter|in|inch|\"|ft|foot|deg|degree|°|rad|radian)\\b/g, '');\n return evalArithmetic(s);\n}\n\n/** 同表地址取值:address → 该单元格 content(递归经 evalWithDoc,一跳深度)。 */\nfunction spreadsheetAddressValue(\n sheet: FcstdObject,\n address: string,\n docObjects: readonly FcstdObject[],\n): ExprValue {\n const cells = sheet.properties.get('cells');\n if (!cells) return undefined;\n const cell = [...cells.children].flatMap((c) => (c.tagName === 'Cell' ? [c] : c.children))\n .find((c) => c.tagName === 'Cell' && c.attributes['address'] === address);\n if (!cell) return undefined;\n const content = cell.attributes['content'] ?? '';\n return evalWithDoc(content.startsWith('=') ? content.slice(1) : content, docObjects, sheet);\n}\n\n/** 仅含数字与 + - * / ( ) 空格的算术求值;任何其它字符 → undefined。 */\nfunction evalArithmetic(s: string): ExprValue {\n if (!/^[-+*/(). 0-9eE]*$/.test(s)) return undefined;\n try {\n const v = Function(`\"use strict\"; return (${s});`)() as unknown;\n return typeof v === 'number' && Number.isFinite(v) ? v : undefined;\n } catch {\n return undefined;\n }\n}\n\n\n/** One <Expression path=... expression=...> binding with its optional constant value. */\nexport interface ExpressionBinding {\n /** property path the expression drives (e.g. \"Length\") */\n path: string;\n /** raw expression string */\n expression: string;\n /** evaluated constant; undefined when not a constant expression */\n value?: number;\n}\n\n/**\n * Extract expression bindings from a parsed ExpressionEngine property.\n * `bindable` = every expression evaluated to a constant (then the property\n * values can be overridden); otherwise the engine is only partially readable.\n *\n * @param prop the parsed <ExpressionEngine> property (undefined → no bindings)\n * @returns one binding per <Expression> child, values evaluated\n */\nexport function parseExpressionEngine(\n prop: FcstdProperty | undefined,\n): ExpressionBinding[] {\n const engineEl = prop?.children[0];\n if (!engineEl) return [];\n const out: ExpressionBinding[] = [];\n for (const el of engineEl.children) {\n if (el.tagName !== 'Expression') continue;\n const path = el.attributes['path'] ?? '';\n const expression = el.attributes['expression'] ?? '';\n out.push({ path, expression, value: evalConstantExpression(expression) });\n }\n return out;\n}\n\n/**\n * True when all bindings are constants → safe to override property values.\n * @param bindings bindings extracted by parseExpressionEngine\n * @returns true when there is at least one binding and every value is defined\n */\nexport function allConstant(bindings: ExpressionBinding[]): boolean {\n return bindings.length > 0 && bindings.every((b) => b.value !== undefined);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-translate.d.ts","sourceRoot":"","sources":["../../src/fcstd/feature-translate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,
|
|
1
|
+
{"version":3,"file":"feature-translate.d.ts","sourceRoot":"","sources":["../../src/fcstd/feature-translate.ts"],"names":[],"mappings":"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"}
|