@faicad/faijs-fcstd 0.17.0 → 0.18.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/codegen.d.ts +1 -1
- package/dist/codegen.d.ts.map +1 -1
- package/dist/codegen.js +4 -4
- package/dist/codegen.js.map +1 -1
- package/dist/convert.d.ts +3 -3
- package/dist/convert.d.ts.map +1 -1
- package/dist/convert.js +6 -6
- package/dist/convert.js.map +1 -1
- package/dist/feature-translate.d.ts +1 -1
- package/dist/feature-translate.d.ts.map +1 -1
- package/dist/feature-translate.js +13 -2
- package/dist/feature-translate.js.map +1 -1
- package/dist/sketch-parse.d.ts +12 -163
- package/dist/sketch-parse.d.ts.map +1 -1
- package/dist/sketch-parse.js +2 -49
- package/dist/sketch-parse.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-translate.js","sourceRoot":"","sources":["../src/feature-translate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M4 — whitelisted feature translation: FCStd objects → cad-op call plan.\n *\n * M4.1 whitelist: anything not listed → baked (S3, no silent loss).\n * M4.2 primitives → cad.box/cylinder/cone/sphere\n * M4.3 booleans → cad.union/subtract/intersect\n * M4.6 Pad/Pocket → cad.extrude/cad.subtract over the M3 sketch contour (M6: sketch is a cad.sketch face)\n *\n * The call plan is an intermediate representation: M5 lowers it to .fai.js\n * (statements sN, variables partN). Geometry values are already mm (D7).\n */\nimport type { FcstdObject } from './document.js';\nimport { parseExpressionEngine, evalWithDoc, type ExpressionBinding } from './expressions.js';\nimport { placementOf, quatToMatrix } from './placement.js';\nimport { shapeBrpFile } from './external-geo.js';\nimport type { FilletEdgeEntry } from './fillet-edges.js';\n\n/**\n * One cad-op call in the M4 call plan (lowered to .fai.js by M5).\n */\nexport interface CadCall {\n /** target variable name (partN, assigned by M5) */\n out: string;\n /** cad-op name, e.g. \"cad.box\" */\n op: string;\n /** positional + named params, JSON-serializable */\n params: Record<string, unknown>;\n /** variable names this call consumes (rendered positionally before literals) */\n inputs: string[];\n /** positional literal values appended after `inputs` (e.g. a direction Vec3) */\n literals?: unknown[];\n /** FCStd object this call came from */\n source: string;\n /**\n * When true, `inputs` is bookkeeping-only (dependency tracking / variable\n * remapping / consumed-set) and must NOT be rendered as positional args —\n * the real args come from `params`. Used by params-only ops like\n * `cad.compound` whose members live in `params.members` (rendering `inputs`\n * positionally would shadow `params`).\n */\n noPositionalArgs?: boolean;\n}\n\n/**\n * A raw JS expression argument that M5 renders verbatim instead of JSON-encoding.\n *\n * Needed when a call argument is itself a function call against a variable that\n * only exists at run time — e.g. `cad.edgeRef(part3, 17)` for the edge selection\n * of a Fillet/Chamfer (the EdgeTopoRef must be resolved against the live base\n * shape, so it cannot be baked into the IR as a literal).\n */\nexport interface JsExpr {\n /** the JS source to emit in the argument position */\n readonly __jsExpr: string;\n}\n\n/**\n * Wrap raw JS source as a verbatim argument (`JsExpr`).\n *\n * @param code - the JS expression source to emit in the argument position.\n * @returns the `JsExpr` marker carrying that source.\n */\nexport function jsExpr(code: string): JsExpr {\n return { __jsExpr: code };\n}\n\n/**\n * True for a `JsExpr` marker (used by M5 to render verbatim).\n *\n * @param v - the value to test.\n * @returns true when `v` is a `JsExpr` marker.\n */\nexport function isJsExpr(v: unknown): v is JsExpr {\n return typeof v === 'object' && v !== null && typeof (v as { __jsExpr?: unknown }).__jsExpr === 'string';\n}\n\n/**\n * Outcome of translating one FCStd object: a cad-op call plan, an explicit\n * bake with reason, or preserved-only (no geometry emitted).\n */\nexport type TranslateVerdict =\n | { kind: 'translated'; calls: CadCall[]; reason?: string }\n | { kind: 'baked'; reason: string }\n | { kind: 'preserved-only'; reason: string };\n\n/**\n * H7 (hole_puzzle corpus, 2026-09-20): marker input for a subtract whose base\n * is implied by the Body's feature order (no explicit BaseFeature property).\n * Codegen retargets this at the chain head when folding the feature into its\n * Body chain. Never a legal variable name (contains `::`), so it cannot be\n * confused with a real input.\n */\nexport const BODY_CHAIN_BASE = '::body-chain-base::';\n\n/** M4.1 whitelist (plan §5.5.5 measurable types only). */\nconst WHITELIST = new Set([\n 'Part::Box',\n 'Part::Cylinder',\n 'Part::Cut',\n 'Part::MultiFuse',\n 'Part::Extrusion',\n 'PartDesign::Pad',\n 'PartDesign::Pocket',\n 'PartDesign::Revolution',\n // P2-2 (2026-09-24): Groove is Revolution + subtractive — same Profile/\n // ReferenceAxis/Angle shape as Revolution, but cuts from the base feature\n // instead of fusing. Previously absent from the whitelist it silently fell\n // to preservedOnly (26 objects in Mannequin_mp alone).\n 'PartDesign::Groove',\n 'PartDesign::LinearPattern',\n 'PartDesign::PolarPattern',\n 'PartDesign::Fillet',\n 'PartDesign::Chamfer',\n // M13.1 (probed on real corpus — fcstd-port/tools/probe-m13-types.ts):\n // Part::Compound carries a Links PropertyLinkList; Part::Sphere carries\n // Radius (+ optional Angle like Cylinder).\n 'Part::Compound',\n 'Part::Sphere',\n // P5 (2026-09-24): Part::Mirroring mirrors its Source across the plane\n // through Base with normal Normal (253 corpus occurrences).\n 'Part::Mirroring',\n // P6 (2026-09-24): Part::Revolution revolves Source around the axis\n // through Base with direction Axis by Angle degrees (425 corpus\n // occurrences — highest-frequency untranslated Part::* type after P5).\n 'Part::Revolution',\n // P7 (2026-09-24): Part::Fuse fuses Base + Tool (two PropertyLinks, same\n // serialization shape as Part::Cut — 42 corpus occurrences).\n 'Part::Fuse',\n // P8 (2026-09-24): Part::Chamfer — Base link + edge selection AND sizes in\n // the binary PropertyFilletEdges ZIP member (109 corpus occurrences).\n 'Part::Chamfer',\n // P9 (2026-09-24): Part::Fillet — same binary PropertyFilletEdges member as\n // Part::Chamfer (196 corpus occurrences). cad.fillet (M1) takes ONE uniform\n // radius for all edges, so per-edge / two-distance differences bake.\n 'Part::Fillet',\n // P2-3 (2026-09-24): sweep/loft/helix translation branch. The kernel ops\n // `cad.sweep` / `cad.loft` / `cad.helix` (core, a4f9f30 / b0c4a92) are\n // already implemented; this wires the FCStd translator to emit them.\n // Corpus (library-profile.md): Part::Sweep 268, Part::Loft 107, Part::Helix <63.\n 'Part::Sweep',\n 'Part::Loft',\n 'Part::Helix',\n]);\n\n/**\n * True when the object type is on the M4.1 translation whitelist.\n *\n * @param type - the FCStd object type, e.g. \"Part::Box\".\n * @returns true when the type is whitelisted for translation.\n */\nexport function isWhitelisted(type: string): boolean {\n return WHITELIST.has(type);\n}\n\n/**\n * H10 (plan §3.1/§3.5): C4's Python exception, decided by PROPERTY presence —\n * NOT by the `Python` type-name suffix. Matches the library profile's\n * pythonObjects口径 (profile.mjs: type contains \"Python\" or carries\n * Python/Proxy properties); here only the property evidence qualifies, so a\n * Python-suffixed type without the property stays a plain translation gap.\n * @param obj - the FCStd object to inspect.\n * @returns true when the object is a Python-scripted feature whose serialized\n * shape is opaque (legitimate `python-baked` under C4).\n */\nexport function isPythonOpaque(obj: FcstdObject): boolean {\n for (const [name, prop] of obj.properties) {\n if (name === 'Python' || name === 'Proxy') return true;\n if (prop.type === 'App::PropertyPythonObject') return true;\n }\n return false;\n}\n\nfunction propNum(obj: FcstdObject, name: string): number | undefined {\n // M11.1: an ExpressionEngine binding overrides the stored <Float> value\n // (FreeCAD recomputes bound properties from expressions on load). A\n // non-constant binding is reported via exprBindingOf, not guessed here.\n const bound = expressionBindingOf(obj, name);\n if (bound && bound.value !== undefined) return bound.value;\n const p = obj.properties.get(name);\n if (!p) return undefined;\n const el = p.children[0];\n const v = el?.attributes['value'];\n return v === undefined ? undefined : Number(v);\n}\n\n/**\n * M11.1/M11.2: the ExpressionEngine binding for `name`, if any. `value` is\n * undefined for non-constant expressions (references/arithmetic) — the caller\n * must bake with an explicit reason instead of estimating.\n *\n * @param obj - the FCStd object whose ExpressionEngine to inspect.\n * @param name - the property name to look up.\n * @returns the binding for `name`, or undefined when the object has no\n * ExpressionEngine binding for it.\n */\nexport function expressionBindingOf(obj: FcstdObject, name: string): ExpressionBinding | undefined {\n const bindings = parseExpressionEngine(obj.properties.get('ExpressionEngine') as never);\n if (bindings.length === 0) return undefined;\n const norm = (p: string): string => (p.startsWith('.') ? p.slice(1) : p);\n const b = bindings.find((b) => norm(b.path) === name);\n // P1-1(参数载体):非常量绑定尝试三跳解析(<<Label>>.Alias → 单元格值)。\n // docObjects 由 translateObject 入口注入(模块级上下文,见 docContext)。\n if (b && b.value === undefined && docContext) {\n const v = evalWithDoc(b.expression, docContext);\n if (v !== undefined) return { ...b, value: v };\n }\n return b;\n}\n\n/** P1-1: translateObject 入口注入的文档对象上下文(表达式的引用解析需要全文档)。 */\nlet docContext: readonly FcstdObject[] | undefined;\n\n/**\n * M11.2: detect a non-constant expression binding on a property.\n *\n * @param obj - the FCStd object whose ExpressionEngine to inspect.\n * @param name - the property name to look up.\n * @returns true when `name` has a binding that is NOT a constant expression.\n */\nexport function hasNonConstantBinding(obj: FcstdObject, name: string): boolean {\n const b = expressionBindingOf(obj, name);\n return b !== undefined && b.value === undefined;\n}\n\nfunction propBool(obj: FcstdObject, name: string): boolean {\n const el = obj.properties.get(name)?.children[0];\n return el?.attributes['value'] === 'true';\n}\n\nfunction propLink(obj: FcstdObject, name: string): string | undefined {\n const el = obj.properties.get(name)?.children[0];\n const v = el?.attributes['value'];\n return v && v.length > 0 ? v : undefined;\n}\n\n/** Read a string-valued property (e.g. ReferenceAxis). */\nfunction propStr(obj: FcstdObject, name: string): string | undefined {\n const el = obj.properties.get(name)?.children[0];\n const v = el?.attributes['value'];\n return v && v.length > 0 ? v : undefined;\n}\n\n/**\n * M9.1 — Pad/Pocket `Type` enumeration (App::PropertyEnumeration, stored as\n * the string enum label OR its integer index — both seen in the corpus).\n * FreeCAD sources: Pad.h / Pocket.h TypeEnum lists (differs between the two):\n * Pad: 0=Length 1=UpToLast 2=UpToFirst 3=UpToFace 4=TwoLengths\n * Pocket: 0=Length 1=ThroughAll 2=UpToFirst 3=UpToFace 4=TwoLengths\n * A missing Type property means Length (0) — the FreeCAD default.\n */\nexport type FeatureType =\n | 'Length' | 'ThroughAll' | 'UpToLast' | 'UpToFirst' | 'UpToFace' | 'TwoLengths' | 'unknown';\n\nconst PAD_TYPES: Record<string, FeatureType> = {\n '0': 'Length', '1': 'UpToLast', '2': 'UpToFirst', '3': 'UpToFace', '4': 'TwoLengths',\n Length: 'Length', UpToLast: 'UpToLast', UpToFirst: 'UpToFirst', UpToFace: 'UpToFace', TwoLengths: 'TwoLengths',\n};\nconst POCKET_TYPES: Record<string, FeatureType> = {\n '0': 'Length', '1': 'ThroughAll', '2': 'UpToFirst', '3': 'UpToFace', '4': 'TwoLengths',\n Length: 'Length', ThroughAll: 'ThroughAll', UpToFirst: 'UpToFirst', UpToFace: 'UpToFace', TwoLengths: 'TwoLengths',\n};\n\n/**\n * Read the Pad/Pocket `Type` enumeration of an object (M9.1).\n *\n * @param obj - the FCStd Pad or Pocket object.\n * @param kind - which type-enum table to apply (Pad vs Pocket labels differ).\n * @returns the parsed feature type; 'Length' when Type is missing, 'unknown'\n * when the stored label/index is not recognized.\n */\nexport function featureTypeOf(obj: FcstdObject, kind: 'pad' | 'pocket'): FeatureType {\n const el = obj.properties.get('Type')?.children[0];\n const raw = el?.attributes['value'];\n if (raw === undefined || raw === '') return 'Length';\n const table = kind === 'pad' ? PAD_TYPES : POCKET_TYPES;\n return table[raw] ?? 'unknown';\n}\n\n/** Read an App::PropertyVector (`value=\"x y z\"`) as a Vec3. */\nfunction propVec(obj: FcstdObject, name: string): [number, number, number] | undefined {\n const raw = propStr(obj, name);\n if (!raw) return undefined;\n const parts = raw.trim().split(/\\s+/).map(Number);\n if (parts.length !== 3 || parts.some((n) => !Number.isFinite(n))) return undefined;\n return [parts[0]!, parts[1]!, parts[2]!];\n}\n\n/**\n * Read an App::PropertyVector serialized as a `<PropertyVector valueX= valueY=\n * valueZ=/>` child element (P5: Part::Mirroring Base/Normal use this form —\n * GOTCHA: propVec expects `value=\"x y z\"`, a DIFFERENT serialization).\n */\nfunction propVecXYZ(obj: FcstdObject, name: string): [number, number, number] | undefined {\n const a = obj.properties.get(name)?.children[0]?.attributes;\n if (!a) return undefined;\n const x = Number(a['valueX']), y = Number(a['valueY']), z = Number(a['valueZ']);\n if (![x, y, z].every(Number.isFinite)) return undefined;\n return [x, y, z];\n}\n\n/** Normalize a Vec3 to unit length (zero-safe: returns input if |v| = 0). */\nfunction normalize3(v: [number, number, number]): [number, number, number] {\n const mag = Math.hypot(v[0], v[1], v[2]);\n if (mag <= 0) return v;\n return [v[0] / mag, v[1] / mag, v[2] / mag];\n}\n\n/**\n * Read an `App::PropertyLinkSub`: the target object name plus its sub-element\n * names. FreeCAD serializes this as\n * `<LinkSub value=\"Pad001\" count=\"2\"><Sub value=\"Edge17\"/><Sub value=\"Edge18\"/></LinkSub>`.\n */\nfunction propLinkSub(obj: FcstdObject, name: string): { obj: string; subs: string[] } | undefined {\n const el = obj.properties.get(name)?.children[0];\n if (!el) return undefined;\n const target = el.attributes['value'];\n if (!target || target.length === 0) return undefined;\n const subs: string[] = [];\n for (const sub of el.children) {\n const v = sub.attributes['value'];\n if (v) subs.push(v);\n }\n return { obj: target, subs };\n}\n\n/**\n * Parse FreeCAD edge sub-element names (`Edge17`) into 1-based ordinals.\n * Returns undefined when any entry is not an `EdgeN` reference (a Face/Vertex\n * selection cannot be expressed as a faijs `EdgeTopoRef`).\n */\nfunction parseEdgeSubs(subs: readonly string[]): number[] | undefined {\n const out: number[] = [];\n for (const s of subs) {\n const m = /^Edge(\\d+)$/.exec(s);\n if (!m) return undefined;\n const n = Number(m[1]);\n if (!Number.isInteger(n) || n < 1) return undefined;\n out.push(n);\n }\n return out;\n}\n\n/**\n * Parse a FreeCAD face sub-element name (`Face3`) into a 1-based ordinal.\n * Returns undefined when the selection is not a plain `FaceN` reference (e.g. a\n * TNaming-modified name `\"Face__20f_...\"`, an `Edge*`/`Vertex*` selection, or a\n * multi-face set) so the caller can bake with an explicit reason instead of\n * guessing. The ordinal is consumed by `cad.faceRef`, whose face enumeration\n * order is calibrated to match FreeCAD's `FaceN` (plan §4.3-C2 / R-A).\n */\nfunction parseFaceSub(subs: readonly string[]): number | undefined {\n if (subs.length !== 1) return undefined;\n const m = /^Face(\\d+)$/.exec(subs[0]!);\n if (!m) return undefined;\n const n = Number(m[1]);\n return Number.isInteger(n) && n >= 1 ? n : undefined;\n}\n\n/**\n * Build the `edges` argument for a fillet/chamfer call: one `cad.edgeRef(base, N)`\n * expression per FreeCAD edge ordinal. The refs must be resolved against the\n * live base shape at run time (an `EdgeTopoRef` is a two-face role pair, which\n * only the runtime naming layer knows), so they enter the IR as `JsExpr`.\n */\nfunction edgeRefArgs(baseVar: string, ordinals: readonly number[]): JsExpr[] {\n return ordinals.map((n) => jsExpr(`cad.edgeRef(${baseVar}, ${n})`));\n}\n\n/**\n * Parse a PartDesign ReferenceAxis reference into a 3D axis + pivot point.\n *\n * FreeCAD stores this as an `App::PropertyLinkSub` string that either names a\n * standard body axis (`V_Axis` / `H_Axis` / `N_Axis`, or the generic `Axis`\n * that PartDesign revolves around = +Z) or an edge/vertex of another feature.\n * Edge/vertex axes require resolving referenced geometry, which the port does\n * not yet do (explicit downgrade, no silent loss).\n *\n * @param ref - the ReferenceAxis (or Direction) LinkSub string, may be undefined.\n * @returns a unit axis and pivot point, or undefined when the reference names\n * edge/vertex geometry (unsupported).\n */\nexport function parseReferenceAxis(ref: string | undefined): { axis: [number, number, number]; at: [number, number, number] } | undefined {\n const at: [number, number, number] = [0, 0, 0];\n if (!ref) return { axis: [0, 0, 1], at };\n if (/Edge|Vertex/i.test(ref)) return undefined; // geometry-referenced axis: unsupported\n // Standard body axes. PartDesign LinearPattern stores Direction as a LinkSub\n // naming X_Axis/Y_Axis/Z_Axis; older ReferenceAxis uses V_Axis/H_Axis/N_Axis.\n if (/X_Axis|H_Axis/i.test(ref)) return { axis: [1, 0, 0], at };\n if (/Y_Axis/i.test(ref)) return { axis: [0, 1, 0], at };\n if (/Z_Axis|V_Axis/i.test(ref)) return { axis: [0, 0, 1], at };\n if (/N_Axis/i.test(ref)) return { axis: [1, 0, 0], at }; // legacy mapping, keep stable\n // The generic \"Axis\" or anything else defaults to +Z (sketch normal)\n return { axis: [0, 0, 1], at };\n}\n\n/**\n * Resolve a Pad/Pocket profile link. Modern files use `Profile`; files saved\n * by FreeCAD ≤ 0.19 store the sketch directly under `Sketch` (observed in\n * PadTest.fcstd, ProgramVersion 0.14/0.17 era).\n */\nfunction profileLink(obj: FcstdObject): string | undefined {\n return propLink(obj, 'Profile') ?? propLink(obj, 'Sketch');\n}\n\n/**\n * Placement position (translation) of an object.\n *\n * @param obj - the FCStd object to read.\n * @returns the (Px, Py, Pz) translation from its Placement, or (0,0,0) when absent.\n */\nexport function placementPos(obj: FcstdObject): [number, number, number] {\n // Property → <PropertyPlacement Px=... Py=... Pz=.../>\n const pp = obj.properties.get('Placement')?.children[0];\n if (!pp) return [0, 0, 0];\n return [\n Number(pp.attributes['Px'] ?? 0),\n Number(pp.attributes['Py'] ?? 0),\n Number(pp.attributes['Pz'] ?? 0),\n ];\n}\n\n/**\n * A frozen `.brp` shape delivered through the container's `assets/` becomes an\n * addressable Shape via `cad.import_brep` — the **platform** BREP-asset import\n * op (`api/import-brep.ts`), which reads through the host asset resolver and\n * returns a BREP-backed Shape the rest of the chain can consume.\n *\n * GOTCHA (2026-09-21, found while verifying ArchDetail): the shape-asset rounds\n * used to emit a made-up `cad.import_shape`, which is **not** in the cad\n * namespace. 42 of the 50 corpus products therefore parsed clean but could not\n * RUN — `cliCheck` validates syntax and script-local references, never the\n * callee's existence, so only a real `run --mode brep` exposes this.\n *\n * Contract details:\n * - asset: the asset file name WITHOUT extension — that is the key rule of the\n * documented directory mode of `FsAssetResolver` (`key = basename(file)`),\n * which is how a container's `assets/` directory is exposed.\n *\n * C6 (non-solid first-class): `cad.import_brep` always imports with\n * `allowNonSolid` (wire/face/shell are first-class). There is no `format`\n * hint — the op goes straight to `loadBrep` on the OCCT kernel, which needs\n * no format detection. Booleans / up-to targets that require a solid still\n * fail at the **use site**, never at the import site.\n *\n * @param obj - the FCStd object whose frozen shape is being imported.\n * @param assetFile - the `.brp` member name recorded on the object's Shape/SubShape property.\n * @returns the `cad.import_brep` call binding `obj.name` to the imported geometry.\n */\nfunction shapeAssetCall(obj: FcstdObject, assetFile: string): CadCall {\n const asset = assetFile.replace(/^.*[/\\\\]/, '').replace(/\\.brp$/i, '');\n return {\n out: obj.name, op: 'cad.import_brep', source: obj.name, inputs: [],\n params: { asset },\n };\n}\n\n/**\n * M4 translate one object. `inputVar` maps a dependency object name to the\n * variable holding its geometry (sketch contours or prior solid).\n *\n * `docObjects` (optional) is the full document object list — needed by the\n * UpToFace datum-plane path to read the target plane's Placement (plan\n * extrude-upto-face §4.3-C1). When absent, UpToFace keeps the explicit bake.\n *\n * @param obj - the FCStd object to translate.\n * @param inputVar - resolves a dependency object name to the variable holding\n * its geometry (sketch contours or prior solid).\n * @param docObjects - the full document object list, needed by the UpToFace\n * datum-plane path; optional.\n * @param shapeCarriers - objects whose Shape is stored as a .brp member; optional.\n * @param brokenShapeAssets - objects whose Shape `file` attribute points at a missing/empty member (explicit gap); optional.\n * @param filletEdgesData - parsed PropertyFilletEdges binaries keyed by object name (Part::Chamfer/Fillet); optional.\n * @returns the cad-op call plan, or an explicit bake/preserve verdict with reason.\n */\nexport function translateObject(\n obj: FcstdObject,\n inputVar: (depName: string) => string | undefined,\n docObjects?: readonly FcstdObject[],\n /** H7: names of objects whose Shape is stored as a .brp member (probed from the ZIP). */\n shapeCarriers?: ReadonlySet<string>,\n /** E4: objects whose Shape `file` attribute points at a missing/empty member. */\n brokenShapeAssets?: ReadonlySet<string>,\n /** P8: parsed PropertyFilletEdges binaries keyed by object name (Part::Chamfer/Fillet). */\n filletEdgesData?: ReadonlyMap<string, FilletEdgeEntry[]>,\n): TranslateVerdict {\n // P1-1(参数载体):注入文档上下文,让 expressionBindingOf 能做\n // <<Label>>.Alias 三跳解析(引用算术需要全文档找 Spreadsheet 数据源)。\n if (docObjects) docContext = docObjects;\n // E4 (H12): a Shape/SubShape `file` attribute whose member is missing or\n // zero-bytes in the archive is a BROKEN asset, not a shape-asset — surface\n // it as an explicit convert-time gap instead of letting the object fall\n // through to python-opaque (which would silently swallow the defect).\n if (brokenShapeAssets?.has(obj.name)) {\n return { kind: 'baked', reason: 'shape-asset-broken: frozen .brp member missing or empty' };\n }\n // H7 follow-up (Body-less CAM corpus, 2026-09-20): a SubShape property whose\n // .brp member exists is the feature's own RESULT cache — the pocketed/\n // filleted geometry is already a fact delivered via assets/. shape-asset\n // beats an honest-but-useless dependency gap for Body-less files. Only\n // SubShape qualifies (Pads also carry Shape in these files — they must keep\n // the normal translation path).\n if (shapeCarriers?.has(obj.name) && obj.properties.has('SubShape')) {\n // The result cache is a real, addressable solid: downstream features\n // (Fillet Base→Pocket, Cut Base→…) must resolve it as a variable, so the\n // verdict emits a real load call instead of zero calls (hole_puzzle\n // GOTCHA: zero-call objects got no codegen variable and consumers gapped\n // with fillet-missing-base / cut-missing-dependency).\n const assetFile = obj.properties.get('SubShape')?.children[0]?.attributes['file'] ?? `${obj.name}.SubShape.brp`;\n return {\n kind: 'translated',\n calls: [shapeAssetCall(obj, assetFile)],\n reason: 'shape-asset',\n };\n }\n if (!isWhitelisted(obj.type)) {\n // GOTCHA (EngineBlock corpus, 2026-09-20): Shape-asset evidence PRECEDES\n // python-opaque. Draft circles carry Proxy (python evidence) AND a real\n // Shape .brp member; python-opaque baked them silently and downstream\n // Part::Extrusion gapped with extrusion-missing-base. Geometry is an\n // existing fact — import it.\n if (shapeCarriers?.has(obj.name)) {\n const assetFile = shapeBrpFile(obj) ?? `${obj.name}.Shape.brp`;\n return {\n kind: 'translated',\n calls: [shapeAssetCall(obj, assetFile)],\n reason: 'shape-asset',\n };\n }\n // H10: property-evidenced Python features bake legitimately (C4) —\n // auditMapping renames this reason to `python-baked`. Everything else is\n // a plain translation gap.\n if (isPythonOpaque(obj)) return { kind: 'baked', reason: 'python-opaque' };\n // H7 first cut: a Part::Feature is a pure Shape carrier (corpus probe:\n // property surface is Shape [+ShapeMaterial] only; geometry lives in the\n // ZIP's .brp member). With shape evidence there is nothing to translate —\n // the geometry is delivered via assets/ (build-fai-zip M2.3 already copies\n // it), so record `translated` with no cad calls. Without evidence it is an\n // explicit gap, never a silent bake.\n if (obj.type === 'Part::Feature') {\n if (shapeCarriers?.has(obj.name)) return { kind: 'translated', calls: [], reason: 'shape-asset' };\n return { kind: 'baked', reason: 'shape-asset-missing' };\n }\n return { kind: 'baked', reason: `type-not-whitelisted: ${obj.type}` };\n }\n /** Map FreeCAD Part::Sweep `Transition` (enum label or index) → cad.sweep transitionMode. */\n function normalizeSweepTransition(raw: string | undefined): 'right' | 'transformed' | 'round' | undefined {\n if (raw === undefined) return undefined;\n if (raw === 'RightAngle' || raw === '0') return 'right';\n if (raw === 'Transformed' || raw === '1') return 'transformed';\n if (raw === 'Round' || raw === '2') return 'round';\n return undefined;\n }\n\n const out = obj.name; // M5 renames to partN\n switch (obj.type) {\n case 'Part::Box': {\n const l = propNum(obj, 'Length') ?? 0;\n const w = propNum(obj, 'Width') ?? 0;\n const h = propNum(obj, 'Height') ?? 0;\n // FCStd Box: corner at Placement, extends +X/+Y/+Z\n const [x, y, z] = placementPos(obj);\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.box', source: obj.name, inputs: [],\n params: { width: w, depth: l, height: h, at: [x, y, z], centered: false },\n }],\n };\n }\n case 'Part::Cylinder': {\n const r = propNum(obj, 'Radius') ?? 0;\n const h = propNum(obj, 'Height') ?? 0;\n const [x, y, z] = placementPos(obj);\n const angle = propNum(obj, 'Angle') ?? 360;\n if (angle !== 360) return { kind: 'baked', reason: 'cylinder-partial-angle' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.cylinder', source: obj.name, inputs: [],\n params: { radius: r, height: h, at: [x, y, z], centered: false },\n }],\n };\n }\n case 'Part::Compound': {\n // M13.1 probe (ArchDetail.FCStd): members live in a `Links`\n // PropertyLinkList; every corpus instance also stores a baked .brp,\n // but translating the member group keeps the chain explicit.\n const linksEl = obj.properties.get('Links')?.children[0];\n const members: string[] = [];\n for (const link of linksEl?.children ?? []) {\n const v = link.attributes['value'];\n if (v) members.push(v);\n }\n const vars = members.map((m) => inputVar(m));\n if (vars.length === 0 || vars.some((v) => v === undefined)) {\n return { kind: 'baked', reason: 'compound-missing-members' };\n }\n // `Part::Compound` 是几何对象(`Part::Feature` 子类,带 Shape + Placement)。\n // 用平台几何 compound(`cad.compound`,内核 `makeCompound`,持 OCCT 句柄,\n // 可变换/可导出),不再借用 ../3d_editor 的结构分组 op `cad.group`。\n // members 经 `params.members` 传递;`inputs` 仅作依赖登记(consumed / 变量重映射),\n // 由 `noPositionalArgs` 保证不被 renderArgs 当作位置参数渲染。\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.compound', source: obj.name, inputs: vars as string[],\n noPositionalArgs: true, params: { members: vars },\n }],\n };\n }\n case 'Part::Sphere': {\n const r = propNum(obj, 'Radius');\n if (r === undefined || r <= 0) return { kind: 'baked', reason: 'sphere-missing-radius' };\n const angle1 = propNum(obj, 'Angle1') ?? -90;\n const angle2 = propNum(obj, 'Angle2') ?? 90;\n const angle3 = propNum(obj, 'Angle3') ?? 360;\n if (angle1 !== -90 || angle2 !== 90 || angle3 !== 360) {\n return { kind: 'baked', reason: 'sphere-partial-angle' };\n }\n const [x, y, z] = placementPos(obj);\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.sphere', source: obj.name, inputs: [],\n params: { radius: r, at: [x, y, z] },\n }],\n };\n }\n case 'Part::Mirroring': {\n // P5: mirror Source across the plane through Base with normal Normal.\n // The result is the mirrored copy alone (FreeCAD does NOT fuse the\n // original in Part::Mirroring — the corpus pairs it with explicit\n // fusion features when needed), so this maps to `cad.mirror`, not\n // `cad.mirrorJoin`.\n const src = propLink(obj, 'Source');\n const s = src ? inputVar(src) : undefined;\n if (!s) return { kind: 'baked', reason: 'mirroring-missing-source' };\n const base = propVecXYZ(obj, 'Base') ?? [0, 0, 0];\n const normalRaw = propVecXYZ(obj, 'Normal');\n if (!normalRaw || Math.hypot(...normalRaw) <= 0) {\n return { kind: 'baked', reason: 'mirroring-missing-normal' };\n }\n const normal = normalize3(normalRaw);\n // FreeCAD mirrors across the plane through (Base + Placement translation)\n // — Placement here is a pure translation in all corpus samples; the\n // plane point is Base shifted by it.\n const [px, py, pz] = placementPos(obj);\n const at = [base[0]! + px, base[1]! + py, base[2]! + pz] as [number, number, number];\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.mirror', source: obj.name, inputs: [s],\n noPositionalArgs: true, params: { normal, at },\n }],\n };\n }\n case 'Part::Cut': {\n const base = propLink(obj, 'Base');\n const tool = propLink(obj, 'Tool');\n const b = base ? inputVar(base) : undefined;\n const t = tool ? inputVar(tool) : undefined;\n if (!b || !t) return { kind: 'baked', reason: 'cut-missing-dependency' };\n return {\n kind: 'translated',\n calls: [{ out, op: 'cad.subtract', source: obj.name, inputs: [b, t], params: {} }],\n };\n }\n case 'Part::Fuse': {\n // P7: same Base/Tool PropertyLink serialization as Part::Cut, but\n // fuses instead of cutting.\n const fuseBase = propLink(obj, 'Base');\n const fuseTool = propLink(obj, 'Tool');\n const fb = fuseBase ? inputVar(fuseBase) : undefined;\n const ft = fuseTool ? inputVar(fuseTool) : undefined;\n if (!fb || !ft) return { kind: 'baked', reason: 'fuse-missing-dependency' };\n return {\n kind: 'translated',\n calls: [{ out, op: 'cad.union', source: obj.name, inputs: [fb, ft], params: {} }],\n };\n }\n case 'Part::MultiFuse': {\n // <LinkList count=\"N\"><Link value=\"A\"/>...</LinkList>\n const shapes = propLinkList(obj, 'Shapes');\n const inputs = shapes.map(inputVar);\n if (shapes.length < 2 || inputs.some((i) => i === undefined)) {\n return { kind: 'baked', reason: 'multifuse-missing-dependency' };\n }\n return {\n kind: 'translated',\n calls: [{ out, op: 'cad.union', source: obj.name, inputs: inputs as string[], params: {} }],\n };\n }\n case 'PartDesign::Pad': {\n const profile = profileLink(obj);\n const len = propNum(obj, 'Length') ?? 0;\n const reversed = propBool(obj, 'Reversed');\n const midplane = propBool(obj, 'Midplane');\n const profileVar = profile ? inputVar(profile) : undefined;\n if (!profileVar) return { kind: 'baked', reason: 'pad-missing-profile' };\n // M11.2: a non-constant expression binding (cross-object reference /\n // identifier arithmetic) leaves the length unknown — explicit bake,\n // never estimate (plan §12).\n if (hasNonConstantBinding(obj, 'Length')) {\n return { kind: 'baked', reason: 'pad-length-expression-non-constant' };\n }\n // M9.1/M9.2: Type-driven semantics — no silent Length fallback.\n const ftype = featureTypeOf(obj, 'pad');\n if (ftype === 'TwoLengths') {\n const len2 = propNum(obj, 'Length2') ?? 0;\n // TwoLengths: Length forward + Length2 backward, fused. Named\n // intermediate vars so mapping/debug can locate each segment.\n const pos = `${out}__pos`;\n const neg = `${out}__neg`;\n const calls: CadCall[] = [\n { out: pos, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, len]], params: {} },\n { out: neg, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, -len2]], params: {} },\n { out, op: 'cad.union', source: obj.name, inputs: [pos, neg], params: {} },\n ];\n return { kind: 'translated', calls };\n }\n if (ftype === 'UpToFace') {\n // extrude-upto-face plan §4.3-C1: when the target is a datum plane\n // (PartDesign::Plane — an infinite plane, not a solid face), the\n // extrude length is the exact signed distance from the profile plane\n // to the datum plane. Zero bake, no faceRef needed.\n const upTo = propLinkSub(obj, 'UpToFace');\n if (upTo && docObjects) {\n const target = docObjects.find((o) => o.name === upTo.obj);\n // C1 (extrude-upto-face §4.3-C1): datum plane (infinite plane) →\n // exact signed distance → cad.extrude({ length }). No faceRef needed.\n if (target && target.type === 'PartDesign::Plane') {\n const pl = placementOf(target);\n // datum plane normal = placement R * local +Z\n const m = quatToMatrix(pl.q);\n const normal: [number, number, number] = [m[2]!, m[5]!, m[8]!];\n // sketch normal (the extrude direction); the profile sketch lies on\n // its own placement, and the feature extrudes along it.\n const skPl = placementOf(docObjects.find((o) => o.name === (profile ?? '')) ?? target);\n const skM = quatToMatrix(skPl.q);\n const dir: [number, number, number] = [skM[2]!, skM[5]!, skM[8]!];\n // GOTCHA (probe-upto-padtest-verify.ts, PadTest Pad001): the datum\n // plane is an arbitrary plane, NOT axis-aligned to the extrude\n // direction. The signed distance to reach it along `dir` is\n // t = ((pl.p - skPl.p) · n) / (dir · n)\n // where n is the datum plane normal — NOT the naive (Δp · dir),\n // which only works when n ∥ dir (axis-aligned). The naive form\n // yields −50 for PadTest while the true distance is +10; the\n // corrected form matches FreeCAD's Tip bbox exactly (diag 156.84).\n const denom = dir[0] * normal[0] + dir[1] * normal[1] + dir[2] * normal[2];\n // plane parallel to the extrude direction → no finite intersection\n if (!Number.isFinite(denom) || Math.abs(denom) < 1e-9) {\n return { kind: 'baked', reason: 'uptoface-datum-plane-parallel' };\n }\n const dpn =\n (pl.p[0] - skPl.p[0]) * normal[0] +\n (pl.p[1] - skPl.p[1]) * normal[1] +\n (pl.p[2] - skPl.p[2]) * normal[2];\n const t = dpn / denom;\n if (Number.isFinite(t) && Math.abs(t) > 1e-9) {\n // GOTCHA (PadTest V6 residual, relErr 3.02%): the datum plane may\n // be TILTED relative to the extrude direction (Pad001: datum\n // normal (−0.038·…) not parallel to the sketch normal). A fixed\n // length `signed` gives a FLAT top; FreeCAD's Pad reaches the\n // PLANE, producing a slanted top (truth AddShape 4860.42 vs flat\n // disc 1874.83). Emit an explicit plane target instead and let\n // the kernel's half-space intersection produce the slanted cut.\n // The extrude runs in sketch-local coords, so transform the\n // global plane into the sketch frame: p_local = R⁻¹(p_g − sk.p),\n // n_local = R⁻¹(n_g) (R⁻¹ = Rᵀ).\n const inv = [0, 1, 2].map((c) => [\n skM[c]!, skM[3 + c]!, skM[6 + c]!,\n ]);\n const d = [\n pl.p[0] - skPl.p[0], pl.p[1] - skPl.p[1], pl.p[2] - skPl.p[2],\n ] as [number, number, number];\n const ptLocal: [number, number, number] = [\n inv[0]![0]! * d[0] + inv[0]![1]! * d[1] + inv[0]![2]! * d[2],\n inv[1]![0]! * d[0] + inv[1]![1]! * d[1] + inv[1]![2]! * d[2],\n inv[2]![0]! * d[0] + inv[2]![1]! * d[1] + inv[2]![2]! * d[2],\n ];\n const nLocal: [number, number, number] = [\n inv[0]![0]! * normal[0] + inv[0]![1]! * normal[1] + inv[0]![2]! * normal[2],\n inv[1]![0]! * normal[0] + inv[1]![1]! * normal[1] + inv[1]![2]! * normal[2],\n inv[2]![0]! * normal[0] + inv[2]![1]! * normal[1] + inv[2]![2]! * normal[2],\n ];\n return {\n kind: 'translated',\n reason: 'uptoface-via-datum-plane-distance',\n calls: [{\n out, op: 'cad.extrude', source: obj.name, inputs: [profileVar],\n params: { upTo: { plane: { point: ptLocal, normal: nLocal } } },\n }],\n };\n }\n return { kind: 'baked', reason: 'uptoface-datum-plane-degenerate-distance' };\n }\n // C2.2 (extrude-upto-face §4.3-C2 point 2): solid-feature target →\n // reference its face by ordinal via `cad.extrude({ upTo:\n // cad.faceRef(targetVar, N) })`. faceRef's ordinal is calibrated to\n // match FreeCAD's `FaceN` (R-A, same TopExp::MapShapes + IndexedMap\n // enumeration as edgeRef); the runtime naming layer resolves the ref\n // against the live target shape, so it enters the IR as a JsExpr.\n if (target) {\n const targetVar = inputVar(upTo.obj);\n if (targetVar) {\n const faceN = parseFaceSub(upTo.subs);\n if (faceN !== undefined) {\n return {\n kind: 'translated',\n reason: 'uptoface-via-faceRef',\n calls: [{\n out, op: 'cad.extrude', source: obj.name, inputs: [profileVar],\n params: { upTo: jsExpr(`cad.faceRef(${targetVar}, ${faceN})`) },\n }],\n };\n }\n // sub present but not a plain FaceN reference → explicit bake\n return { kind: 'baked', reason: 'uptoface-sub-unparseable' };\n }\n }\n }\n return { kind: 'baked', reason: 'uptoface-solid-face-unsupported' };\n }\n if (ftype === 'UpToLast' || ftype === 'UpToFirst') {\n // plan §4.3-C2: UpToLast/UpToFirst extrude to the far/near face of the\n // support (BaseFeature) via `cad.extrude({ upTo: 'last' | 'first' })`\n // (up-to lives on the platform op cad.extrude, never on fai_extrude).\n // The kernel up-to does the truncation; baseFeature must be resolvable\n // or we bake explicitly — no silent bbox-derived length guess.\n const base = propLink(obj, 'BaseFeature');\n const baseVar = base ? inputVar(base) : undefined;\n if (!baseVar) return { kind: 'baked', reason: 'pad-upTo-missing-base' };\n const upTo = ftype === 'UpToLast' ? 'last' : 'first';\n return {\n kind: 'translated',\n reason: `pad-${ftype}-via-baseFeature`,\n calls: [{\n out, op: 'cad.extrude', source: obj.name, inputs: [profileVar],\n params: { upTo, baseFeature: jsExpr(baseVar) },\n }],\n };\n }\n if (ftype !== 'Length') {\n // anything still non-Length (e.g. 'unknown') → explicit bake, never guess\n return { kind: 'baked', reason: `pad-type-${ftype}-unsupported` };\n }\n // cad.extrude extrudes the sketch face into a prism along +Z (the sketch\n // normal in body-local frame); length sign encodes direction.\n if (midplane) {\n // symmetric about the sketch plane: two half-prisms fused\n const pos = `${out}__pos`;\n const neg = `${out}__neg`;\n const calls: CadCall[] = [\n { out: pos, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, len / 2]], params: {} },\n { out: neg, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, -len / 2]], params: {} },\n { out, op: 'cad.union', source: obj.name, inputs: [pos, neg], params: {} },\n ];\n return { kind: 'translated', calls };\n }\n const signed = reversed ? -len : len;\n return {\n kind: 'translated',\n calls: [{ out, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, signed]], params: {} }],\n };\n }\n case 'PartDesign::Pocket': {\n const profile = profileLink(obj);\n const len = propNum(obj, 'Length') ?? 0;\n const reversed = propBool(obj, 'Reversed');\n const midplane = propBool(obj, 'Midplane');\n const base = propLink(obj, 'BaseFeature');\n const profileVar = profile ? inputVar(profile) : undefined;\n // GOTCHA (hole_puzzle corpus, 2026-09-20): FreeCAD 0.20+ PartDesign\n // files routinely OMIT BaseFeature on interior features — the base is\n // implied by the Body's feature order (chain head). A MISSING property\n // is \"no explicit base\" → emit the subtract with the BODY_CHAIN_BASE\n // marker; codegen retargets it at the chain head when folding. Only an\n // EXPLICIT base that fails to resolve is a dependency gap.\n const baseVar = base ? inputVar(base) : BODY_CHAIN_BASE;\n if (!profileVar || !baseVar) return { kind: 'baked', reason: 'pocket-missing-dependency' };\n if (hasNonConstantBinding(obj, 'Length')) {\n return { kind: 'baked', reason: 'pocket-length-expression-non-constant' };\n }\n // M9.1/M9.2/M9.3: Type-driven semantics — explicit bake for anything\n // beyond the supported set (no silent downgrade).\n const ftype = featureTypeOf(obj, 'pocket');\n if (ftype === 'UpToFace') {\n // C2.3 (extrude-upto-face §4.3-C2 point 4): Pocket UpToFace — same\n // datum-plane path as Pad (plane target in sketch-local frame); the\n // cut direction is handled by the kernel's auto-orientation toward\n // the plane (GOTCHA: Pocket cuts INTO the material, the plane lies\n // on the far side, and the kernel flips the extrude direction).\n const upTo = propLinkSub(obj, 'UpToFace');\n if (upTo && docObjects) {\n const target = docObjects.find((o) => o.name === upTo.obj);\n if (target && target.type === 'PartDesign::Plane') {\n const pl = placementOf(target);\n const m = quatToMatrix(pl.q);\n const normal: [number, number, number] = [m[2]!, m[5]!, m[8]!];\n const skPl = placementOf(docObjects.find((o) => o.name === (profile ?? '')) ?? target);\n const skM = quatToMatrix(skPl.q);\n const dir: [number, number, number] = [skM[2]!, skM[5]!, skM[8]!];\n const denom = dir[0] * normal[0] + dir[1] * normal[1] + dir[2] * normal[2];\n if (!Number.isFinite(denom) || Math.abs(denom) < 1e-9) {\n return { kind: 'baked', reason: 'pocket-uptoface-datum-plane-parallel' };\n }\n // plane → sketch-local frame (p_local = R⁻¹(p_g − sk.p), n_local = R⁻¹ n)\n const inv = [0, 1, 2].map((c) => [skM[c]!, skM[3 + c]!, skM[6 + c]!]);\n const d = [pl.p[0] - skPl.p[0], pl.p[1] - skPl.p[1], pl.p[2] - skPl.p[2]] as [number, number, number];\n const ptLocal: [number, number, number] = [\n inv[0]![0]! * d[0] + inv[0]![1]! * d[1] + inv[0]![2]! * d[2],\n inv[1]![0]! * d[0] + inv[1]![1]! * d[1] + inv[1]![2]! * d[2],\n inv[2]![0]! * d[0] + inv[2]![1]! * d[1] + inv[2]![2]! * d[2],\n ];\n const nLocal: [number, number, number] = [\n inv[0]![0]! * normal[0] + inv[0]![1]! * normal[1] + inv[0]![2]! * normal[2],\n inv[1]![0]! * normal[0] + inv[1]![1]! * normal[1] + inv[1]![2]! * normal[2],\n inv[2]![0]! * normal[0] + inv[2]![1]! * normal[1] + inv[2]![2]! * normal[2],\n ];\n const cutVar = `${out}_cut`;\n const calls: CadCall[] = [\n {\n out: cutVar, op: 'cad.extrude', source: obj.name, inputs: [profileVar],\n params: { upTo: { plane: { point: ptLocal, normal: nLocal } } },\n },\n { out, op: 'cad.subtract', source: obj.name, inputs: [baseVar, cutVar], params: {} },\n ];\n return { kind: 'translated', reason: 'pocket-uptoface-via-datum-plane', calls };\n }\n return { kind: 'baked', reason: 'pocket-uptoface-solid-face-unsupported' };\n }\n return { kind: 'baked', reason: 'pocket-uptoface-sub-unparseable' };\n }\n if (ftype === 'UpToFirst') {\n // C2.3: Pocket UpToFirst — cut prism to the support's NEAR face along\n // the cut direction; the kernel truncates the prism against the\n // baseFeature (chain head), then the result is subtracted.\n const baseVarUp = baseVar;\n const cutVar = `${out}_cut`;\n const calls: CadCall[] = [\n {\n out: cutVar, op: 'cad.extrude', source: obj.name, inputs: [profileVar],\n params: { upTo: 'first', baseFeature: jsExpr(baseVarUp) },\n },\n { out, op: 'cad.subtract', source: obj.name, inputs: [baseVarUp, cutVar], params: {} },\n ];\n return { kind: 'translated', reason: 'pocket-uptofirst-via-baseFeature', calls };\n }\n if (ftype !== 'Length' && ftype !== 'TwoLengths' && ftype !== 'ThroughAll') {\n return { kind: 'baked', reason: `pocket-type-${ftype}-unsupported` };\n }\n // P1-1b (2026-09-23): Pocket Midplane — symmetric cut prism about the\n // sketch plane (same construction as the Pad midplane branch: two\n // half-prisms fused, then subtracted). Direction sign is irrelevant\n // (symmetric); ThroughAll keeps its far-beyond-extent depth.\n if (midplane) {\n const THROUGH_ALL_DEPTH = 1e6;\n const depth = ftype === 'ThroughAll' ? THROUGH_ALL_DEPTH : len;\n const half = depth / 2;\n const pos = `${out}_cut_pos`;\n const neg = `${out}_cut_neg`;\n const cutVar = `${out}_cut`;\n const calls: CadCall[] = [\n { out: pos, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, half]], params: {} },\n { out: neg, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, -half]], params: {} },\n { out: cutVar, op: 'cad.union', source: obj.name, inputs: [pos, neg], params: {} },\n { out, op: 'cad.subtract', source: obj.name, inputs: [baseVar, cutVar], params: {} },\n ];\n return { kind: 'translated', calls };\n }\n // Pocket cuts INTO the material: extrude the profile opposite the normal\n // (or along it when Reversed), then subtract from base.\n // ThroughAll (hole_puzzle corpus, 2026-09-20): FreeCAD truncates the\n // prism against the base solid, so a depth far beyond any realistic\n // base extent is safe — the subtract is exact either way.\n const THROUGH_ALL_DEPTH = 1e6;\n const depth = ftype === 'ThroughAll' ? THROUGH_ALL_DEPTH : len;\n const signed = reversed ? depth : -depth;\n const cutVar = `${out}_cut`;\n const calls: CadCall[] = [{\n out: cutVar, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, signed]], params: {},\n }];\n calls.push({ out, op: 'cad.subtract', source: obj.name, inputs: [baseVar, cutVar], params: {} });\n return { kind: 'translated', calls };\n }\n case 'Part::Extrusion': {\n const base = propLink(obj, 'Base');\n const baseVar = base ? inputVar(base) : undefined;\n if (!baseVar) return { kind: 'baked', reason: 'extrusion-missing-base' };\n const dir = propVecXYZ(obj, 'Dir') ?? propVec(obj, 'Dir') ?? [0, 0, 1];\n // FreeCAD 0.20+ serializes the flag as `Reversed`; older files used\n // `Reverse`. Accept both.\n const reversed = propBool(obj, 'Reversed') || propBool(obj, 'Reverse');\n // E4 (2026-09-23): Part::Extrusion serializes in three shapes. New\n // format: LengthFwd/LengthRev (unit Dir). Old format: only Dir, whose\n // magnitude IS the extrusion length. Legacy: Length + Dir. The previous\n // code only knew the legacy shape → len=0 → E_EXTRUDE_ZERO_VECTOR on\n // 918 corpus runs.\n const lengthFwd = propNum(obj, 'LengthFwd');\n const lengthRev = propNum(obj, 'LengthRev');\n const taperAngle = propNum(obj, 'TaperAngle') ?? 0;\n if (taperAngle !== 0) {\n // No-heuristic-fallback: silently ignoring a taper would produce wrong\n // geometry. Bake with an explicit reason instead.\n return { kind: 'baked', reason: 'extrusion-taper-unsupported' };\n }\n const unitDir = normalize3(dir);\n const calls: CadCall[] = [];\n const emitExtrude = (outName: string, fwdLen: number, revLen: number) => {\n if (fwdLen > 0) {\n calls.push({\n out: revLen > 0 ? `${outName}_fwd` : outName,\n op: 'cad.extrude', source: obj.name, inputs: [baseVar],\n literals: [[unitDir[0] * fwdLen, unitDir[1] * fwdLen, unitDir[2] * fwdLen]], params: {},\n });\n }\n if (revLen > 0) {\n // `|| 0` normalizes -0 to +0 (JSON/对拍 noise otherwise).\n calls.push({\n out: fwdLen > 0 ? `${outName}_rev` : outName,\n op: 'cad.extrude', source: obj.name, inputs: [baseVar],\n literals: [[(-unitDir[0] * revLen) || 0, (-unitDir[1] * revLen) || 0, (-unitDir[2] * revLen) || 0]], params: {},\n });\n }\n };\n if (lengthFwd !== undefined || lengthRev !== undefined) {\n const symmetric = propBool(obj, 'Symmetric');\n const fwd = lengthFwd ?? 0;\n const revRaw = lengthRev ?? 0;\n // FreeCAD semantics: Symmetric extrudes LengthFwd on BOTH sides;\n // Reversed swaps the fwd/rev sides (same magnitudes).\n const fwdLen = symmetric ? fwd : (reversed ? revRaw : fwd);\n const revLen = symmetric ? fwd : (reversed ? fwd : revRaw);\n if (fwdLen > 0 && revLen > 0) {\n emitExtrude(out, fwdLen, revLen);\n calls.push({ out, op: 'cad.union', source: obj.name, inputs: [`${out}_fwd`, `${out}_rev`], params: {} });\n } else {\n emitExtrude(out, fwdLen, revLen);\n }\n if (calls.length === 0) return { kind: 'baked', reason: 'extrusion-zero-length' };\n return { kind: 'translated', calls };\n }\n const legacyLen = propNum(obj, 'Length');\n if (legacyLen !== undefined) {\n // Legacy shape: Length + unit Dir.\n const s = reversed ? -1 : 1;\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.extrude', source: obj.name, inputs: [baseVar],\n literals: [[s * dir[0] * legacyLen, s * dir[1] * legacyLen, s * dir[2] * legacyLen]], params: {},\n }],\n };\n }\n // Old format: |Dir| IS the extrusion length; Dir is the vector.\n const mag = Math.hypot(dir[0], dir[1], dir[2]);\n if (mag <= 0) return { kind: 'baked', reason: 'extrusion-zero-length' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.extrude', source: obj.name, inputs: [baseVar],\n literals: [reversed ? [-dir[0], -dir[1], -dir[2]] : dir], params: {},\n }],\n };\n }\n case 'Part::Revolution': {\n // P6: Part-workbench revolve — Source profile + axis given DIRECTLY as\n // Base/Axis PropertyVector (GOTCHA: valueX/Y/Z child-element form, NOT\n // the value=\"x y z\" attribute form propVec reads; PartDesign::Revolution\n // instead stores a ReferenceAxis string — different serialization, so\n // this is a separate branch, not a shared one).\n const revSrc = propLink(obj, 'Source');\n const revVar = revSrc ? inputVar(revSrc) : undefined;\n if (!revVar) {\n return { kind: 'baked', reason: revSrc ? `part-revolution-source-baked-upstream:${revSrc}` : 'part-revolution-missing-source' };\n }\n const axisRaw = propVecXYZ(obj, 'Axis');\n if (!axisRaw || Math.hypot(...axisRaw) <= 0) {\n return { kind: 'baked', reason: 'part-revolution-missing-axis' };\n }\n const axis = normalize3(axisRaw);\n const base = propVecXYZ(obj, 'Base') ?? [0, 0, 0];\n const [rpx, rpy, rpz] = placementPos(obj);\n const at = [base[0]! + rpx, base[1]! + rpy, base[2]! + rpz] as [number, number, number];\n const revAngleDeg = propNum(obj, 'Angle') ?? 360;\n if (revAngleDeg <= 0 || revAngleDeg > 360) {\n return { kind: 'baked', reason: 'part-revolution-angle-out-of-range' };\n }\n const revAngle = (revAngleDeg * Math.PI) / 180;\n if (propStr(obj, 'Symmetric') === 'true') {\n return { kind: 'baked', reason: 'part-revolution-symmetric-unsupported' };\n }\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.revolve', source: obj.name, inputs: [revVar],\n noPositionalArgs: true, params: { axis, at, angle: revAngle },\n }],\n };\n }\n case 'PartDesign::Revolution': {\n const profile = profileLink(obj);\n const profileVar = profile ? inputVar(profile) : undefined;\n if (!profileVar) {\n // P2-1 (2026-09-24, Mannequin_mp): a `revolution-missing-profile`\n // cascade lie — 13 Revolutions had a VALID Profile link (e.g.\n // Revolution033 → Sketch061) whose target sketch was baked upstream\n // (unsupported-geometry), so inputVar resolved undefined. Distinguish\n // \"no link at all\" from \"link exists but upstream not translated\".\n return { kind: 'baked', reason: profile ? `revolution-profile-baked-upstream:${profile}` : 'revolution-missing-profile' };\n }\n const angleDeg = propNum(obj, 'Angle') ?? 360;\n const angle = (angleDeg * Math.PI) / 180;\n const axisInfo = parseReferenceAxis(propStr(obj, 'ReferenceAxis'));\n if (!axisInfo) return { kind: 'baked', reason: 'revolution-edge-axis-unsupported' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.revolve', source: obj.name, inputs: [profileVar],\n params: { axis: axisInfo.axis, at: axisInfo.at, angle },\n }],\n };\n }\n case 'PartDesign::Groove': {\n // P2-2 (2026-09-24): Groove = Revolution + subtract — revolve the\n // profile around the axis, then cut it from the base feature. Same\n // Profile/ReferenceAxis/Angle serialization as Revolution.\n const grooveProfile = profileLink(obj);\n const grooveProfileVar = grooveProfile ? inputVar(grooveProfile) : undefined;\n if (!grooveProfileVar) {\n return {\n kind: 'baked',\n reason: grooveProfile ? `groove-profile-baked-upstream:${grooveProfile}` : 'groove-missing-profile',\n };\n }\n const baseVar = inputVar(propLink(obj, 'BaseFeature') ?? '');\n if (!baseVar) return { kind: 'baked', reason: 'groove-missing-base' };\n const gAngleDeg = propNum(obj, 'Angle') ?? 360;\n const gAngle = (gAngleDeg * Math.PI) / 180;\n const gAxis = parseReferenceAxis(propStr(obj, 'ReferenceAxis'));\n if (!gAxis) return { kind: 'baked', reason: 'groove-edge-axis-unsupported' };\n const grooveVar = `${out}_groove`;\n return {\n kind: 'translated',\n calls: [\n {\n out: grooveVar, op: 'cad.revolve', source: obj.name, inputs: [grooveProfileVar],\n params: { axis: gAxis.axis, at: gAxis.at, angle: gAngle },\n },\n { out, op: 'cad.subtract', source: obj.name, inputs: [baseVar, grooveVar], params: {} },\n ],\n };\n }\n case 'PartDesign::LinearPattern': {\n // P3-1 (2026-09-23): FreeCAD serializes Transformed features with the\n // patterned features in `Originals` (PropertyLinkList); `Source` only\n // exists on some versions. Read Source first, then fall back to\n // Originals[0] (multi-original → fuse the patterned copies below).\n const source = propLink(obj, 'Source') ?? propLinkList(obj, 'Originals')[0];\n const originals = source ? [source] : [];\n const sourceVar = originals.length > 0 ? inputVar(originals[0]!) : undefined;\n if (!sourceVar) return { kind: 'baked', reason: 'linear-pattern-missing-source' };\n const dirInfo = parseReferenceAxis(propStr(obj, 'Direction'));\n if (!dirInfo) return { kind: 'baked', reason: 'linear-pattern-edge-dir-unsupported' };\n const occ = Math.max(2, Math.round(propNum(obj, 'Occurrences') ?? 2));\n const length = propNum(obj, 'Length') ?? 0;\n const spacing = occ > 1 ? length / (occ - 1) : 0;\n if (originals.length === 1) {\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.linearPattern', source: obj.name, inputs: [sourceVar],\n literals: [dirInfo.axis, occ, spacing], params: {},\n }],\n };\n }\n // Multi-original: pattern each, then fuse.\n const calls: CadCall[] = originals.map((o, i) => {\n const v = inputVar(o);\n if (!v) return null;\n return {\n out: i === 0 ? `${out}_p0` : `${out}_p${i}`, op: 'cad.linearPattern', source: obj.name, inputs: [v],\n literals: [dirInfo.axis, occ, spacing], params: {},\n } as CadCall;\n }).filter((c): c is CadCall => c !== null);\n for (let i = 1; i < calls.length; i++) {\n calls.push({\n out: i === calls.length - 1 ? out : `${out}_u${i}`,\n op: 'cad.union', source: obj.name,\n inputs: [i === 1 ? calls[0]!.out : `${out}_u${i - 1}`, calls[i]!.out], params: {},\n });\n }\n return { kind: 'translated', calls };\n }\n case 'PartDesign::PolarPattern': {\n const sourcePolar = propLink(obj, 'Source') ?? propLinkList(obj, 'Originals')[0];\n const sourceVar = sourcePolar ? inputVar(sourcePolar) : undefined;\n if (!sourceVar) return { kind: 'baked', reason: 'polar-pattern-missing-source' };\n const axisInfo = parseReferenceAxis(propStr(obj, 'Axis'));\n if (!axisInfo) return { kind: 'baked', reason: 'polar-pattern-edge-axis-unsupported' };\n const occ = Math.max(2, Math.round(propNum(obj, 'Occurrences') ?? 2));\n const angle = propNum(obj, 'Angle') ?? 360;\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.circularPattern', source: obj.name, inputs: [sourceVar],\n literals: [axisInfo.axis, occ, angle], params: {},\n }],\n };\n }\n case 'PartDesign::Fillet': {\n const base = propLinkSub(obj, 'Base');\n const baseVar = base ? inputVar(base.obj) : undefined;\n if (!baseVar) return { kind: 'baked', reason: 'fillet-missing-base' };\n if (propBool(obj, 'UseAllEdges')) return { kind: 'baked', reason: 'fillet-all-edges-unsupported' };\n if (!base || base.subs.length === 0) return { kind: 'baked', reason: 'fillet-no-edges' };\n const ordinals = parseEdgeSubs(base.subs);\n if (!ordinals) return { kind: 'baked', reason: 'fillet-non-edge-sub' };\n const radius = propNum(obj, 'Radius');\n if (radius === undefined || !(radius > 0)) return { kind: 'baked', reason: 'fillet-bad-radius' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.fillet', source: obj.name, inputs: [baseVar],\n params: { edges: edgeRefArgs(baseVar, ordinals), radius },\n }],\n };\n }\n case 'PartDesign::Chamfer': {\n const base = propLinkSub(obj, 'Base');\n const baseVar = base ? inputVar(base.obj) : undefined;\n if (!baseVar) return { kind: 'baked', reason: 'chamfer-missing-base' };\n if (propBool(obj, 'UseAllEdges')) return { kind: 'baked', reason: 'chamfer-all-edges-unsupported' };\n if (!base || base.subs.length === 0) return { kind: 'baked', reason: 'chamfer-no-edges' };\n const ordinals = parseEdgeSubs(base.subs);\n if (!ordinals) return { kind: 'baked', reason: 'chamfer-non-edge-sub' };\n const edges = edgeRefArgs(baseVar, ordinals);\n // ChamferType enum (FeatureChamfer.cpp:55): 0 \"Equal distance\" (the\n // default when the property is absent, i.e. files predating it),\n // 1 \"Two distances\", 2 \"Distance and Angle\".\n const type = Math.round(propNum(obj, 'ChamferType') ?? 0);\n const size = propNum(obj, 'Size');\n if (type === 1) {\n const size2 = propNum(obj, 'Size2');\n if (size === undefined || !(size > 0) || size2 === undefined || !(size2 > 0)) {\n return { kind: 'baked', reason: 'chamfer-bad-two-distances' };\n }\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.chamfer', source: obj.name, inputs: [baseVar],\n params: { edges, type: 'twoDistances', width1: size, width2: size2 },\n }],\n };\n }\n if (type === 2) {\n // FreeCAD's Angle is degrees, range 0–180 (floatAngle); cad.chamfer\n // accepts degrees in the open interval (0, 90) only.\n const angle = propNum(obj, 'Angle');\n if (size === undefined || !(size > 0) || angle === undefined || !(angle > 0 && angle < 90)) {\n return { kind: 'baked', reason: 'chamfer-bad-distance-angle' };\n }\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.chamfer', source: obj.name, inputs: [baseVar],\n params: { edges, type: 'distanceAngle', width: size, angle },\n }],\n };\n }\n if (type !== 0) return { kind: 'baked', reason: `chamfer-unknown-type: ${type}` };\n if (size === undefined || !(size > 0)) return { kind: 'baked', reason: 'chamfer-bad-size' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.chamfer', source: obj.name, inputs: [baseVar],\n params: { edges, type: 'equal', width: size },\n }],\n };\n }\n case 'Part::Chamfer': {\n // P8: Part-workbench chamfer. GOTCHA: edge selection AND sizes do NOT\n // live in Document.xml — the `Edges` property points at a binary\n // PropertyFilletEdges ZIP member (parsed by convert, passed in via\n // filletEdgesData). XML-only reading yields no size at all.\n const chBase = propLink(obj, 'Base');\n const chBaseVar = chBase ? inputVar(chBase) : undefined;\n if (!chBaseVar) return { kind: 'baked', reason: 'chamfer-missing-base' };\n const chEntries = filletEdgesData?.get(obj.name);\n if (!chEntries || chEntries.length === 0) {\n return { kind: 'baked', reason: 'chamfer-edges-data-missing' };\n }\n // cad.chamfer 'equal' takes ONE width for ALL edges. Mixed sizes across\n // edges cannot be emitted as sequential calls either: after the first\n // chamfer the shape's edge ordinals shift, so the second call's\n // EdgeN refs would point at the wrong edges (corpus: 1/109 objects).\n const chSizes = new Set(chEntries.map((e) => e.size1));\n if (chSizes.size > 1) return { kind: 'baked', reason: 'chamfer-mixed-sizes' };\n // Asymmetric size1 != size2 (two-distance chamfer): 0 corpus\n // occurrences; the Size1/Size2 face-side correspondence to\n // cad.chamfer twoDistances width1/width2 is unverified — honest bake.\n if (chEntries.some((e) => e.size1 !== e.size2)) {\n return { kind: 'baked', reason: 'chamfer-asymmetric-sizes' };\n }\n const chSize = chEntries[0]!.size1;\n if (!(chSize > 0)) return { kind: 'baked', reason: 'chamfer-bad-size' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.chamfer', source: obj.name, inputs: [chBaseVar],\n params: { edges: edgeRefArgs(chBaseVar, chEntries.map((e) => e.edge)), type: 'equal', width: chSize },\n }],\n };\n }\n case 'Part::Fillet': {\n // P9: Part-workbench fillet. Same binary PropertyFilletEdges member as\n // Part::Chamfer (parsed by convert, passed in via filletEdgesData). The\n // radius lives ONLY in that binary member — Document.xml carries no\n // usable radius.\n const fBase = propLink(obj, 'Base');\n const fBaseVar = fBase ? inputVar(fBase) : undefined;\n if (!fBaseVar) return { kind: 'baked', reason: 'fillet-missing-base' };\n const fEntries = filletEdgesData?.get(obj.name);\n if (!fEntries || fEntries.length === 0) {\n return { kind: 'baked', reason: 'fillet-edges-data-missing' };\n }\n // cad.fillet (M1) supports ONE uniform radius for all edges. A constant\n // fillet stores radius in both size1 and size2; anything else (size1 !=\n // size2, or differing radius across edges) is a variable-radius fillet\n // that M1 cannot emit as a single call — and sequential calls would shift\n // edge ordinals (same hazard as chamfer). Honest bake, no silent loss.\n if (fEntries.some((e) => e.size1 !== e.size2)) {\n return { kind: 'baked', reason: 'fillet-asymmetric-sizes' };\n }\n const fRadii = new Set(fEntries.map((e) => e.size1));\n if (fRadii.size > 1) return { kind: 'baked', reason: 'fillet-variable-radius' };\n const fRadius = fEntries[0]!.size1;\n if (!(fRadius > 0)) return { kind: 'baked', reason: 'fillet-bad-radius' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.fillet', source: obj.name, inputs: [fBaseVar],\n params: { edges: edgeRefArgs(fBaseVar, fEntries.map((e) => e.edge)), radius: fRadius },\n }],\n };\n }\n case 'Part::Sweep': {\n // P2-3: FreeCAD Part::Sweep → cad.sweep(profile, spine, opts).\n // Real FCStd (corpus-verified 2026-09-24): the section is carried in\n // `Sections` (App::PropertyLinkList, usually length 1) — NOT `Profile`,\n // which is absent in the corpus. We accept either, preferring the\n // standard `Profile` and falling back to `Sections[0]`.\n // The path is `Spine` (App::PropertyLinkSub): { obj: sketch, subs: edges }.\n // We pass the base object as the spine; cad.sweep now tolerates a face\n // argument and takes its outer-ring wire as the path (api/sweep.ts\n // toProfileWireView), which is exact for the dominant case where the\n // selected sub-edges ARE the full outline. Multi-edge sub-path selection\n // that is a strict subset is a P4-1 refinement (curve/attachment).\n // Mode: Frenet (0, default) / Binormal (1) / Auxiliary (2). Auxiliary\n // needs a second supporting spine we do not carry → honest bake. Check\n // this BEFORE dependency resolution: an unsupported mode is a property of\n // this object alone, independent of whether its profile/spine resolved\n // (cf. the \"Auxiliary mode\" test where inputVar is stubbed away).\n const modeRaw = propStr(obj, 'Mode');\n if (modeRaw === 'Auxiliary' || modeRaw === '2') {\n return { kind: 'baked', reason: 'sweep-auxiliary-unsupported' };\n }\n const sweepProfile = propLink(obj, 'Profile') ?? propLinkList(obj, 'Sections')[0];\n const sweepSpineSub = propLinkSub(obj, 'Spine');\n const sweepSpine = sweepSpineSub?.obj;\n const profileVar = sweepProfile ? inputVar(sweepProfile) : undefined;\n const spineVar = sweepSpine ? inputVar(sweepSpine) : undefined;\n if (!profileVar) {\n return { kind: 'baked', reason: sweepProfile ? `sweep-profile-baked-upstream:${sweepProfile}` : 'sweep-missing-profile' };\n }\n if (!spineVar) {\n return { kind: 'baked', reason: sweepSpine ? `sweep-spine-baked-upstream:${sweepSpine}` : 'sweep-missing-spine' };\n }\n const frenet = modeRaw === undefined || modeRaw === 'Frenet' || modeRaw === '0' || propBool(obj, 'Frenet');\n const transition = normalizeSweepTransition(propStr(obj, 'Transition'));\n const opts: Record<string, unknown> = {};\n if (frenet) opts.frenet = true;\n if (transition) opts.transitionMode = transition;\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.sweep', source: obj.name, inputs: [profileVar, spineVar], params: opts,\n }],\n };\n }\n case 'Part::Loft': {\n // P2-3: FreeCAD Part::Loft → cad.loft([sections], opts). `Sections` is a\n // PropertyLinkList of already-translated profile faces/wires; cad.loft\n // adapts each face → outer-ring wire (api/loft.ts toProfileWireView).\n const sections = propLinkList(obj, 'Sections');\n // Closed loft needs a `closed` option cad.loft does not expose → honest\n // bake. Check this BEFORE dependency resolution: an unsupported option is\n // a property of this object alone, independent of whether its sections\n // resolved (cf. the \"Closed=true\" test where inputVar is stubbed away).\n if (propBool(obj, 'Closed')) return { kind: 'baked', reason: 'loft-closed-unsupported' };\n const sectionVars = sections.map((s) => inputVar(s));\n if (sections.length < 2) {\n // Genuinely fewer than two profiles → not a loft, no upstream involvement.\n return { kind: 'baked', reason: 'loft-missing-sections' };\n }\n const missingIdx = sectionVars.findIndex((v) => v === undefined);\n if (missingIdx >= 0) {\n // A section resolved to an object that itself got baked upstream → we\n // cannot reconstruct its geometry here → honest bake with the culprit.\n return { kind: 'baked', reason: `loft-section-baked-upstream:${sections[missingIdx]}` };\n }\n const ruled = propBool(obj, 'Ruled'); // FC default true; emit only when false\n const params: Record<string, unknown> = {};\n if (ruled === false) params.ruled = false;\n // Sections rendered as a positional array literal. Remap-safe: inputVar\n // already returns the renamed var (deps are processed before dependents,\n // cf. the fillet edgeRefArgs JsExpr precedent).\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.loft', source: obj.name, inputs: [],\n literals: [jsExpr(`[${sectionVars.join(', ')}]`)], params,\n }],\n };\n }\n case 'Part::Helix': {\n // P2-3: FreeCAD Part::Helix (3D curve primitive) → cad.helix({radius,pitch,turns}).\n // cad.helix yields a 1D curve usable as a sweep spine. FC Helix props:\n // Radius / Pitch / Height (+ optional Angle cone taper, Turns alias).\n // The object's own Placement is applied by codegen's normal cad.place step,\n // so we do NOT bake origin here (that would double-place).\n const hRadius = propNum(obj, 'Radius');\n const hPitch = propNum(obj, 'Pitch');\n const hHeight = propNum(obj, 'Height');\n const hTurns = propNum(obj, 'Turns');\n const hAngle = propNum(obj, 'Angle') ?? 0;\n if (!(hRadius !== undefined && hRadius > 0)) return { kind: 'baked', reason: 'helix-missing-radius' };\n if (!(hPitch !== undefined && hPitch !== 0)) return { kind: 'baked', reason: 'helix-missing-pitch' };\n // cad.helix is cylindrical; a cone-taper helix is unsupported → honest bake.\n if (hAngle !== 0) return { kind: 'baked', reason: 'helix-cone-unsupported' };\n const turns = hHeight !== undefined ? hHeight / hPitch : hTurns;\n if (!(turns !== undefined && turns > 0)) return { kind: 'baked', reason: 'helix-missing-turns' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.helix', source: obj.name, inputs: [],\n params: { radius: hRadius, pitch: hPitch, turns },\n }],\n };\n }\n default:\n return { kind: 'baked', reason: `type-not-implemented: ${obj.type}` };\n }\n}\n\nfunction propLinkList(obj: FcstdObject, name: string): string[] {\n const listEl = obj.properties.get(name)?.children[0];\n if (!listEl) return [];\n const out: string[] = [];\n for (const link of listEl.children) {\n const v = link.attributes['value'];\n if (v) out.push(v);\n }\n return out;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"feature-translate.js","sourceRoot":"","sources":["../src/feature-translate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * M4 — whitelisted feature translation: FCStd objects → cad-op call plan.\n *\n * M4.1 whitelist: anything not listed → baked (S3, no silent loss).\n * M4.2 primitives → cad.box/cylinder/cone/sphere\n * M4.3 booleans → cad.union/subtract/intersect\n * M4.6 Pad/Pocket → cad.extrude/cad.subtract over the M3 sketch contour (M6: sketch is a cad.profile face)\n *\n * The call plan is an intermediate representation: M5 lowers it to .fai.js\n * (statements sN, variables partN). Geometry values are already mm (D7).\n */\nimport type { FcstdObject } from './document.js';\nimport { parseExpressionEngine, evalWithDoc, type ExpressionBinding } from './expressions.js';\nimport { placementOf, quatToMatrix } from './placement.js';\nimport { shapeBrpFile } from './external-geo.js';\nimport type { FilletEdgeEntry } from './fillet-edges.js';\n\n/**\n * One cad-op call in the M4 call plan (lowered to .fai.js by M5).\n */\nexport interface CadCall {\n /** target variable name (partN, assigned by M5) */\n out: string;\n /** cad-op name, e.g. \"cad.box\" */\n op: string;\n /** positional + named params, JSON-serializable */\n params: Record<string, unknown>;\n /** variable names this call consumes (rendered positionally before literals) */\n inputs: string[];\n /** positional literal values appended after `inputs` (e.g. a direction Vec3) */\n literals?: unknown[];\n /** FCStd object this call came from */\n source: string;\n /**\n * When true, `inputs` is bookkeeping-only (dependency tracking / variable\n * remapping / consumed-set) and must NOT be rendered as positional args —\n * the real args come from `params`. Used by params-only ops like\n * `cad.compound` whose members live in `params.members` (rendering `inputs`\n * positionally would shadow `params`).\n */\n noPositionalArgs?: boolean;\n}\n\n/**\n * A raw JS expression argument that M5 renders verbatim instead of JSON-encoding.\n *\n * Needed when a call argument is itself a function call against a variable that\n * only exists at run time — e.g. `cad.edgeRef(part3, 17)` for the edge selection\n * of a Fillet/Chamfer (the EdgeTopoRef must be resolved against the live base\n * shape, so it cannot be baked into the IR as a literal).\n */\nexport interface JsExpr {\n /** the JS source to emit in the argument position */\n readonly __jsExpr: string;\n}\n\n/**\n * Wrap raw JS source as a verbatim argument (`JsExpr`).\n *\n * @param code - the JS expression source to emit in the argument position.\n * @returns the `JsExpr` marker carrying that source.\n */\nexport function jsExpr(code: string): JsExpr {\n return { __jsExpr: code };\n}\n\n/**\n * True for a `JsExpr` marker (used by M5 to render verbatim).\n *\n * @param v - the value to test.\n * @returns true when `v` is a `JsExpr` marker.\n */\nexport function isJsExpr(v: unknown): v is JsExpr {\n return typeof v === 'object' && v !== null && typeof (v as { __jsExpr?: unknown }).__jsExpr === 'string';\n}\n\n/**\n * Outcome of translating one FCStd object: a cad-op call plan, an explicit\n * bake with reason, or preserved-only (no geometry emitted).\n */\nexport type TranslateVerdict =\n | { kind: 'translated'; calls: CadCall[]; reason?: string }\n | { kind: 'baked'; reason: string }\n | { kind: 'preserved-only'; reason: string };\n\n/**\n * H7 (hole_puzzle corpus, 2026-09-20): marker input for a subtract whose base\n * is implied by the Body's feature order (no explicit BaseFeature property).\n * Codegen retargets this at the chain head when folding the feature into its\n * Body chain. Never a legal variable name (contains `::`), so it cannot be\n * confused with a real input.\n */\nexport const BODY_CHAIN_BASE = '::body-chain-base::';\n\n/** M4.1 whitelist (plan §5.5.5 measurable types only). */\nconst WHITELIST = new Set([\n 'Part::Box',\n 'Part::Cylinder',\n 'Part::Cut',\n 'Part::MultiFuse',\n 'Part::Extrusion',\n 'PartDesign::Pad',\n 'PartDesign::Pocket',\n 'PartDesign::Revolution',\n // P2-2 (2026-09-24): Groove is Revolution + subtractive — same Profile/\n // ReferenceAxis/Angle shape as Revolution, but cuts from the base feature\n // instead of fusing. Previously absent from the whitelist it silently fell\n // to preservedOnly (26 objects in Mannequin_mp alone).\n 'PartDesign::Groove',\n 'PartDesign::LinearPattern',\n 'PartDesign::PolarPattern',\n 'PartDesign::Fillet',\n 'PartDesign::Chamfer',\n // M13.1 (probed on real corpus — fcstd-port/tools/probe-m13-types.ts):\n // Part::Compound carries a Links PropertyLinkList; Part::Sphere carries\n // Radius (+ optional Angle like Cylinder).\n 'Part::Compound',\n 'Part::Sphere',\n // P5 (2026-09-24): Part::Mirroring mirrors its Source across the plane\n // through Base with normal Normal (253 corpus occurrences).\n 'Part::Mirroring',\n // P6 (2026-09-24): Part::Revolution revolves Source around the axis\n // through Base with direction Axis by Angle degrees (425 corpus\n // occurrences — highest-frequency untranslated Part::* type after P5).\n 'Part::Revolution',\n // P7 (2026-09-24): Part::Fuse fuses Base + Tool (two PropertyLinks, same\n // serialization shape as Part::Cut — 42 corpus occurrences).\n 'Part::Fuse',\n // P8 (2026-09-24): Part::Chamfer — Base link + edge selection AND sizes in\n // the binary PropertyFilletEdges ZIP member (109 corpus occurrences).\n 'Part::Chamfer',\n // P9 (2026-09-24): Part::Fillet — same binary PropertyFilletEdges member as\n // Part::Chamfer (196 corpus occurrences). cad.fillet (M1) takes ONE uniform\n // radius for all edges, so per-edge / two-distance differences bake.\n 'Part::Fillet',\n // P2-3 (2026-09-24): sweep/loft/helix translation branch. The kernel ops\n // `cad.sweep` / `cad.loft` / `cad.helix` (core, a4f9f30 / b0c4a92) are\n // already implemented; this wires the FCStd translator to emit them.\n // Corpus (library-profile.md): Part::Sweep 268, Part::Loft 107, Part::Helix <63.\n 'Part::Sweep',\n 'Part::Loft',\n 'Part::Helix',\n]);\n\n/**\n * True when the object type is on the M4.1 translation whitelist.\n *\n * @param type - the FCStd object type, e.g. \"Part::Box\".\n * @returns true when the type is whitelisted for translation.\n */\nexport function isWhitelisted(type: string): boolean {\n return WHITELIST.has(type);\n}\n\n/**\n * H10 (plan §3.1/§3.5): C4's Python exception, decided by PROPERTY presence —\n * NOT by the `Python` type-name suffix. Matches the library profile's\n * pythonObjects口径 (profile.mjs: type contains \"Python\" or carries\n * Python/Proxy properties); here only the property evidence qualifies, so a\n * Python-suffixed type without the property stays a plain translation gap.\n * @param obj - the FCStd object to inspect.\n * @returns true when the object is a Python-scripted feature whose serialized\n * shape is opaque (legitimate `python-baked` under C4).\n */\nexport function isPythonOpaque(obj: FcstdObject): boolean {\n for (const [name, prop] of obj.properties) {\n if (name === 'Python' || name === 'Proxy') return true;\n if (prop.type === 'App::PropertyPythonObject') return true;\n }\n return false;\n}\n\nfunction propNum(obj: FcstdObject, name: string): number | undefined {\n // M11.1: an ExpressionEngine binding overrides the stored <Float> value\n // (FreeCAD recomputes bound properties from expressions on load). A\n // non-constant binding is reported via exprBindingOf, not guessed here.\n const bound = expressionBindingOf(obj, name);\n if (bound && bound.value !== undefined) return bound.value;\n const p = obj.properties.get(name);\n if (!p) return undefined;\n const el = p.children[0];\n const v = el?.attributes['value'];\n return v === undefined ? undefined : Number(v);\n}\n\n/**\n * M11.1/M11.2: the ExpressionEngine binding for `name`, if any. `value` is\n * undefined for non-constant expressions (references/arithmetic) — the caller\n * must bake with an explicit reason instead of estimating.\n *\n * @param obj - the FCStd object whose ExpressionEngine to inspect.\n * @param name - the property name to look up.\n * @returns the binding for `name`, or undefined when the object has no\n * ExpressionEngine binding for it.\n */\nexport function expressionBindingOf(obj: FcstdObject, name: string): ExpressionBinding | undefined {\n const bindings = parseExpressionEngine(obj.properties.get('ExpressionEngine') as never);\n if (bindings.length === 0) return undefined;\n const norm = (p: string): string => (p.startsWith('.') ? p.slice(1) : p);\n const b = bindings.find((b) => norm(b.path) === name);\n // P1-1(参数载体):非常量绑定尝试三跳解析(<<Label>>.Alias → 单元格值)。\n // docObjects 由 translateObject 入口注入(模块级上下文,见 docContext)。\n if (b && b.value === undefined && docContext) {\n const v = evalWithDoc(b.expression, docContext);\n if (v !== undefined) return { ...b, value: v };\n }\n return b;\n}\n\n/** P1-1: translateObject 入口注入的文档对象上下文(表达式的引用解析需要全文档)。 */\nlet docContext: readonly FcstdObject[] | undefined;\n\n/**\n * M11.2: detect a non-constant expression binding on a property.\n *\n * @param obj - the FCStd object whose ExpressionEngine to inspect.\n * @param name - the property name to look up.\n * @returns true when `name` has a binding that is NOT a constant expression.\n */\nexport function hasNonConstantBinding(obj: FcstdObject, name: string): boolean {\n const b = expressionBindingOf(obj, name);\n return b !== undefined && b.value === undefined;\n}\n\nfunction propBool(obj: FcstdObject, name: string): boolean {\n const el = obj.properties.get(name)?.children[0];\n return el?.attributes['value'] === 'true';\n}\n\nfunction propLink(obj: FcstdObject, name: string): string | undefined {\n const el = obj.properties.get(name)?.children[0];\n const v = el?.attributes['value'];\n return v && v.length > 0 ? v : undefined;\n}\n\n/** Read a string-valued property (e.g. ReferenceAxis). */\nfunction propStr(obj: FcstdObject, name: string): string | undefined {\n const el = obj.properties.get(name)?.children[0];\n const v = el?.attributes['value'];\n return v && v.length > 0 ? v : undefined;\n}\n\n/**\n * M9.1 — Pad/Pocket `Type` enumeration (App::PropertyEnumeration, stored as\n * the string enum label OR its integer index — both seen in the corpus).\n * FreeCAD sources: Pad.h / Pocket.h TypeEnum lists (differs between the two):\n * Pad: 0=Length 1=UpToLast 2=UpToFirst 3=UpToFace 4=TwoLengths\n * Pocket: 0=Length 1=ThroughAll 2=UpToFirst 3=UpToFace 4=TwoLengths\n * A missing Type property means Length (0) — the FreeCAD default.\n */\nexport type FeatureType =\n | 'Length' | 'ThroughAll' | 'UpToLast' | 'UpToFirst' | 'UpToFace' | 'TwoLengths' | 'unknown';\n\nconst PAD_TYPES: Record<string, FeatureType> = {\n '0': 'Length', '1': 'UpToLast', '2': 'UpToFirst', '3': 'UpToFace', '4': 'TwoLengths',\n Length: 'Length', UpToLast: 'UpToLast', UpToFirst: 'UpToFirst', UpToFace: 'UpToFace', TwoLengths: 'TwoLengths',\n};\nconst POCKET_TYPES: Record<string, FeatureType> = {\n '0': 'Length', '1': 'ThroughAll', '2': 'UpToFirst', '3': 'UpToFace', '4': 'TwoLengths',\n Length: 'Length', ThroughAll: 'ThroughAll', UpToFirst: 'UpToFirst', UpToFace: 'UpToFace', TwoLengths: 'TwoLengths',\n};\n\n/**\n * Read the Pad/Pocket `Type` enumeration of an object (M9.1).\n *\n * @param obj - the FCStd Pad or Pocket object.\n * @param kind - which type-enum table to apply (Pad vs Pocket labels differ).\n * @returns the parsed feature type; 'Length' when Type is missing, 'unknown'\n * when the stored label/index is not recognized.\n */\nexport function featureTypeOf(obj: FcstdObject, kind: 'pad' | 'pocket'): FeatureType {\n const el = obj.properties.get('Type')?.children[0];\n const raw = el?.attributes['value'];\n if (raw === undefined || raw === '') return 'Length';\n const table = kind === 'pad' ? PAD_TYPES : POCKET_TYPES;\n return table[raw] ?? 'unknown';\n}\n\n/** Read an App::PropertyVector (`value=\"x y z\"`) as a Vec3. */\nfunction propVec(obj: FcstdObject, name: string): [number, number, number] | undefined {\n const raw = propStr(obj, name);\n if (!raw) return undefined;\n const parts = raw.trim().split(/\\s+/).map(Number);\n if (parts.length !== 3 || parts.some((n) => !Number.isFinite(n))) return undefined;\n return [parts[0]!, parts[1]!, parts[2]!];\n}\n\n/**\n * Read an App::PropertyVector serialized as a `<PropertyVector valueX= valueY=\n * valueZ=/>` child element (P5: Part::Mirroring Base/Normal use this form —\n * GOTCHA: propVec expects `value=\"x y z\"`, a DIFFERENT serialization).\n */\nfunction propVecXYZ(obj: FcstdObject, name: string): [number, number, number] | undefined {\n const a = obj.properties.get(name)?.children[0]?.attributes;\n if (!a) return undefined;\n const x = Number(a['valueX']), y = Number(a['valueY']), z = Number(a['valueZ']);\n if (![x, y, z].every(Number.isFinite)) return undefined;\n return [x, y, z];\n}\n\n/** Normalize a Vec3 to unit length (zero-safe: returns input if |v| = 0). */\nfunction normalize3(v: [number, number, number]): [number, number, number] {\n const mag = Math.hypot(v[0], v[1], v[2]);\n if (mag <= 0) return v;\n return [v[0] / mag, v[1] / mag, v[2] / mag];\n}\n\n/**\n * Read an `App::PropertyLinkSub`: the target object name plus its sub-element\n * names. FreeCAD serializes this as\n * `<LinkSub value=\"Pad001\" count=\"2\"><Sub value=\"Edge17\"/><Sub value=\"Edge18\"/></LinkSub>`.\n */\nfunction propLinkSub(obj: FcstdObject, name: string): { obj: string; subs: string[] } | undefined {\n const el = obj.properties.get(name)?.children[0];\n if (!el) return undefined;\n const target = el.attributes['value'];\n if (!target || target.length === 0) return undefined;\n const subs: string[] = [];\n for (const sub of el.children) {\n const v = sub.attributes['value'];\n if (v) subs.push(v);\n }\n return { obj: target, subs };\n}\n\n/**\n * Parse FreeCAD edge sub-element names (`Edge17`) into 1-based ordinals.\n * Returns undefined when any entry is not an `EdgeN` reference (a Face/Vertex\n * selection cannot be expressed as a faijs `EdgeTopoRef`).\n */\nfunction parseEdgeSubs(subs: readonly string[]): number[] | undefined {\n const out: number[] = [];\n for (const s of subs) {\n const m = /^Edge(\\d+)$/.exec(s);\n if (!m) return undefined;\n const n = Number(m[1]);\n if (!Number.isInteger(n) || n < 1) return undefined;\n out.push(n);\n }\n return out;\n}\n\n/**\n * Parse a FreeCAD face sub-element name (`Face3`) into a 1-based ordinal.\n * Returns undefined when the selection is not a plain `FaceN` reference (e.g. a\n * TNaming-modified name `\"Face__20f_...\"`, an `Edge*`/`Vertex*` selection, or a\n * multi-face set) so the caller can bake with an explicit reason instead of\n * guessing. The ordinal is consumed by `cad.faceRef`, whose face enumeration\n * order is calibrated to match FreeCAD's `FaceN` (plan §4.3-C2 / R-A).\n */\nfunction parseFaceSub(subs: readonly string[]): number | undefined {\n if (subs.length !== 1) return undefined;\n const m = /^Face(\\d+)$/.exec(subs[0]!);\n if (!m) return undefined;\n const n = Number(m[1]);\n return Number.isInteger(n) && n >= 1 ? n : undefined;\n}\n\n/**\n * Build the `edges` argument for a fillet/chamfer call: one `cad.edgeRef(base, N)`\n * expression per FreeCAD edge ordinal. The refs must be resolved against the\n * live base shape at run time (an `EdgeTopoRef` is a two-face role pair, which\n * only the runtime naming layer knows), so they enter the IR as `JsExpr`.\n */\nfunction edgeRefArgs(baseVar: string, ordinals: readonly number[]): JsExpr[] {\n return ordinals.map((n) => jsExpr(`cad.edgeRef(${baseVar}, ${n})`));\n}\n\n/**\n * Parse a PartDesign ReferenceAxis reference into a 3D axis + pivot point.\n *\n * FreeCAD stores this as an `App::PropertyLinkSub` string that either names a\n * standard body axis (`V_Axis` / `H_Axis` / `N_Axis`, or the generic `Axis`\n * that PartDesign revolves around = +Z) or an edge/vertex of another feature.\n * Edge/vertex axes require resolving referenced geometry, which the port does\n * not yet do (explicit downgrade, no silent loss).\n *\n * @param ref - the ReferenceAxis (or Direction) LinkSub string, may be undefined.\n * @returns a unit axis and pivot point, or undefined when the reference names\n * edge/vertex geometry (unsupported).\n */\nexport function parseReferenceAxis(ref: string | undefined): { axis: [number, number, number]; at: [number, number, number] } | undefined {\n const at: [number, number, number] = [0, 0, 0];\n if (!ref) return { axis: [0, 0, 1], at };\n if (/Edge|Vertex/i.test(ref)) return undefined; // geometry-referenced axis: unsupported\n // Standard body axes. PartDesign LinearPattern stores Direction as a LinkSub\n // naming X_Axis/Y_Axis/Z_Axis; older ReferenceAxis uses V_Axis/H_Axis/N_Axis.\n if (/X_Axis|H_Axis/i.test(ref)) return { axis: [1, 0, 0], at };\n if (/Y_Axis/i.test(ref)) return { axis: [0, 1, 0], at };\n if (/Z_Axis|V_Axis/i.test(ref)) return { axis: [0, 0, 1], at };\n if (/N_Axis/i.test(ref)) return { axis: [1, 0, 0], at }; // legacy mapping, keep stable\n // The generic \"Axis\" or anything else defaults to +Z (sketch normal)\n return { axis: [0, 0, 1], at };\n}\n\n/**\n * Resolve a Pad/Pocket profile link. Modern files use `Profile`; files saved\n * by FreeCAD ≤ 0.19 store the sketch directly under `Sketch` (observed in\n * PadTest.fcstd, ProgramVersion 0.14/0.17 era).\n */\nfunction profileLink(obj: FcstdObject): string | undefined {\n return propLink(obj, 'Profile') ?? propLink(obj, 'Sketch');\n}\n\n/**\n * Placement position (translation) of an object.\n *\n * @param obj - the FCStd object to read.\n * @returns the (Px, Py, Pz) translation from its Placement, or (0,0,0) when absent.\n */\nexport function placementPos(obj: FcstdObject): [number, number, number] {\n // Property → <PropertyPlacement Px=... Py=... Pz=.../>\n const pp = obj.properties.get('Placement')?.children[0];\n if (!pp) return [0, 0, 0];\n return [\n Number(pp.attributes['Px'] ?? 0),\n Number(pp.attributes['Py'] ?? 0),\n Number(pp.attributes['Pz'] ?? 0),\n ];\n}\n\n/**\n * A frozen `.brp` shape delivered through the container's `assets/` becomes an\n * addressable Shape via `cad.import_brep` — the **platform** BREP-asset import\n * op (`api/import-brep.ts`), which reads through the host asset resolver and\n * returns a BREP-backed Shape the rest of the chain can consume.\n *\n * GOTCHA (2026-09-21, found while verifying ArchDetail): the shape-asset rounds\n * used to emit a made-up `cad.import_shape`, which is **not** in the cad\n * namespace. 42 of the 50 corpus products therefore parsed clean but could not\n * RUN — `cliCheck` validates syntax and script-local references, never the\n * callee's existence, so only a real `run --mode brep` exposes this.\n *\n * Contract details:\n * - asset: the asset file name WITHOUT extension — that is the key rule of the\n * documented directory mode of `FsAssetResolver` (`key = basename(file)`),\n * which is how a container's `assets/` directory is exposed.\n *\n * C6 (non-solid first-class): `cad.import_brep` always imports with\n * `allowNonSolid` (wire/face/shell are first-class). There is no `format`\n * hint — the op goes straight to `loadBrep` on the OCCT kernel, which needs\n * no format detection. Booleans / up-to targets that require a solid still\n * fail at the **use site**, never at the import site.\n *\n * @param obj - the FCStd object whose frozen shape is being imported.\n * @param assetFile - the `.brp` member name recorded on the object's Shape/SubShape property.\n * @returns the `cad.import_brep` call binding `obj.name` to the imported geometry.\n */\nfunction shapeAssetCall(obj: FcstdObject, assetFile: string): CadCall {\n const asset = assetFile.replace(/^.*[/\\\\]/, '').replace(/\\.brp$/i, '');\n return {\n out: obj.name, op: 'cad.import_brep', source: obj.name, inputs: [],\n params: { asset },\n };\n}\n\n/**\n * M4 translate one object. `inputVar` maps a dependency object name to the\n * variable holding its geometry (sketch contours or prior solid).\n *\n * `docObjects` (optional) is the full document object list — needed by the\n * UpToFace datum-plane path to read the target plane's Placement (plan\n * extrude-upto-face §4.3-C1). When absent, UpToFace keeps the explicit bake.\n *\n * @param obj - the FCStd object to translate.\n * @param inputVar - resolves a dependency object name to the variable holding\n * its geometry (sketch contours or prior solid).\n * @param docObjects - the full document object list, needed by the UpToFace\n * datum-plane path; optional.\n * @param shapeCarriers - objects whose Shape is stored as a .brp member; optional.\n * @param brokenShapeAssets - objects whose Shape `file` attribute points at a missing/empty member (explicit gap); optional.\n * @param filletEdgesData - parsed PropertyFilletEdges binaries keyed by object name (Part::Chamfer/Fillet); optional.\n * @returns the cad-op call plan, or an explicit bake/preserve verdict with reason.\n */\nexport function translateObject(\n obj: FcstdObject,\n inputVar: (depName: string) => string | undefined,\n docObjects?: readonly FcstdObject[],\n /** H7: names of objects whose Shape is stored as a .brp member (probed from the ZIP). */\n shapeCarriers?: ReadonlySet<string>,\n /** E4: objects whose Shape `file` attribute points at a missing/empty member. */\n brokenShapeAssets?: ReadonlySet<string>,\n /** P8: parsed PropertyFilletEdges binaries keyed by object name (Part::Chamfer/Fillet). */\n filletEdgesData?: ReadonlyMap<string, FilletEdgeEntry[]>,\n): TranslateVerdict {\n // P1-1(参数载体):注入文档上下文,让 expressionBindingOf 能做\n // <<Label>>.Alias 三跳解析(引用算术需要全文档找 Spreadsheet 数据源)。\n if (docObjects) docContext = docObjects;\n // E4 (H12): a Shape/SubShape `file` attribute whose member is missing or\n // zero-bytes in the archive is a BROKEN asset, not a shape-asset — surface\n // it as an explicit convert-time gap instead of letting the object fall\n // through to python-opaque (which would silently swallow the defect).\n if (brokenShapeAssets?.has(obj.name)) {\n return { kind: 'baked', reason: 'shape-asset-broken: frozen .brp member missing or empty' };\n }\n // H7 follow-up (Body-less CAM corpus, 2026-09-20): a SubShape property whose\n // .brp member exists is the feature's own RESULT cache — the pocketed/\n // filleted geometry is already a fact delivered via assets/. shape-asset\n // beats an honest-but-useless dependency gap for Body-less files. Only\n // SubShape qualifies (Pads also carry Shape in these files — they must keep\n // the normal translation path).\n if (shapeCarriers?.has(obj.name) && obj.properties.has('SubShape')) {\n // The result cache is a real, addressable solid: downstream features\n // (Fillet Base→Pocket, Cut Base→…) must resolve it as a variable, so the\n // verdict emits a real load call instead of zero calls (hole_puzzle\n // GOTCHA: zero-call objects got no codegen variable and consumers gapped\n // with fillet-missing-base / cut-missing-dependency).\n const assetFile = obj.properties.get('SubShape')?.children[0]?.attributes['file'] ?? `${obj.name}.SubShape.brp`;\n return {\n kind: 'translated',\n calls: [shapeAssetCall(obj, assetFile)],\n reason: 'shape-asset',\n };\n }\n if (!isWhitelisted(obj.type)) {\n // GOTCHA (EngineBlock corpus, 2026-09-20): Shape-asset evidence PRECEDES\n // python-opaque. Draft circles carry Proxy (python evidence) AND a real\n // Shape .brp member; python-opaque baked them silently and downstream\n // Part::Extrusion gapped with extrusion-missing-base. Geometry is an\n // existing fact — import it.\n if (shapeCarriers?.has(obj.name)) {\n const assetFile = shapeBrpFile(obj) ?? `${obj.name}.Shape.brp`;\n return {\n kind: 'translated',\n calls: [shapeAssetCall(obj, assetFile)],\n reason: 'shape-asset',\n };\n }\n // H10: property-evidenced Python features bake legitimately (C4) —\n // auditMapping renames this reason to `python-baked`. Everything else is\n // a plain translation gap.\n if (isPythonOpaque(obj)) return { kind: 'baked', reason: 'python-opaque' };\n // H7 first cut: a Part::Feature is a pure Shape carrier (corpus probe:\n // property surface is Shape [+ShapeMaterial] only; geometry lives in the\n // ZIP's .brp member). With shape evidence there is nothing to translate —\n // the geometry is delivered via assets/ (build-fai-zip M2.3 already copies\n // it), so record `translated` with no cad calls. Without evidence it is an\n // explicit gap, never a silent bake.\n if (obj.type === 'Part::Feature') {\n if (shapeCarriers?.has(obj.name)) return { kind: 'translated', calls: [], reason: 'shape-asset' };\n return { kind: 'baked', reason: 'shape-asset-missing' };\n }\n return { kind: 'baked', reason: `type-not-whitelisted: ${obj.type}` };\n }\n /** Map FreeCAD Part::Sweep `Transition` (enum label or index) → cad.sweep transitionMode. */\n function normalizeSweepTransition(raw: string | undefined): 'right' | 'transformed' | 'round' | undefined {\n if (raw === undefined) return undefined;\n if (raw === 'RightAngle' || raw === '0') return 'right';\n if (raw === 'Transformed' || raw === '1') return 'transformed';\n if (raw === 'Round' || raw === '2') return 'round';\n return undefined;\n }\n\n const out = obj.name; // M5 renames to partN\n switch (obj.type) {\n case 'Part::Box': {\n const l = propNum(obj, 'Length') ?? 0;\n const w = propNum(obj, 'Width') ?? 0;\n const h = propNum(obj, 'Height') ?? 0;\n // FCStd Box: corner at Placement, extends +X/+Y/+Z\n const [x, y, z] = placementPos(obj);\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.box', source: obj.name, inputs: [],\n params: { width: w, depth: l, height: h, at: [x, y, z], centered: false },\n }],\n };\n }\n case 'Part::Cylinder': {\n const r = propNum(obj, 'Radius') ?? 0;\n const h = propNum(obj, 'Height') ?? 0;\n const [x, y, z] = placementPos(obj);\n const angle = propNum(obj, 'Angle') ?? 360;\n if (angle !== 360) return { kind: 'baked', reason: 'cylinder-partial-angle' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.cylinder', source: obj.name, inputs: [],\n params: { radius: r, height: h, at: [x, y, z], centered: false },\n }],\n };\n }\n case 'Part::Compound': {\n // M13.1 probe (ArchDetail.FCStd): members live in a `Links`\n // PropertyLinkList; every corpus instance also stores a baked .brp,\n // but translating the member group keeps the chain explicit.\n const linksEl = obj.properties.get('Links')?.children[0];\n const members: string[] = [];\n for (const link of linksEl?.children ?? []) {\n const v = link.attributes['value'];\n if (v) members.push(v);\n }\n const vars = members.map((m) => inputVar(m));\n if (vars.length === 0 || vars.some((v) => v === undefined)) {\n return { kind: 'baked', reason: 'compound-missing-members' };\n }\n // `Part::Compound` 是几何对象(`Part::Feature` 子类,带 Shape + Placement)。\n // 用平台几何 compound(`cad.compound`,内核 `makeCompound`,持 OCCT 句柄,\n // 可变换/可导出),不再借用 ../3d_editor 的结构分组 op `cad.group`。\n // members 经 `params.members` 传递;`inputs` 仅作依赖登记(consumed / 变量重映射),\n // 由 `noPositionalArgs` 保证不被 renderArgs 当作位置参数渲染。\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.compound', source: obj.name, inputs: vars as string[],\n noPositionalArgs: true, params: { members: vars },\n }],\n };\n }\n case 'Part::Sphere': {\n const r = propNum(obj, 'Radius');\n if (r === undefined || r <= 0) return { kind: 'baked', reason: 'sphere-missing-radius' };\n const angle1 = propNum(obj, 'Angle1') ?? -90;\n const angle2 = propNum(obj, 'Angle2') ?? 90;\n const angle3 = propNum(obj, 'Angle3') ?? 360;\n if (angle1 !== -90 || angle2 !== 90 || angle3 !== 360) {\n return { kind: 'baked', reason: 'sphere-partial-angle' };\n }\n const [x, y, z] = placementPos(obj);\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.sphere', source: obj.name, inputs: [],\n params: { radius: r, at: [x, y, z] },\n }],\n };\n }\n case 'Part::Mirroring': {\n // P5: mirror Source across the plane through Base with normal Normal.\n // The result is the mirrored copy alone (FreeCAD does NOT fuse the\n // original in Part::Mirroring — the corpus pairs it with explicit\n // fusion features when needed), so this maps to `cad.mirror`, not\n // `cad.mirrorJoin`.\n const src = propLink(obj, 'Source');\n const s = src ? inputVar(src) : undefined;\n if (!s) return { kind: 'baked', reason: 'mirroring-missing-source' };\n const base = propVecXYZ(obj, 'Base') ?? [0, 0, 0];\n const normalRaw = propVecXYZ(obj, 'Normal');\n if (!normalRaw || Math.hypot(...normalRaw) <= 0) {\n return { kind: 'baked', reason: 'mirroring-missing-normal' };\n }\n const normal = normalize3(normalRaw);\n // FreeCAD mirrors across the plane through (Base + Placement translation)\n // — Placement here is a pure translation in all corpus samples; the\n // plane point is Base shifted by it.\n const [px, py, pz] = placementPos(obj);\n const at = [base[0]! + px, base[1]! + py, base[2]! + pz] as [number, number, number];\n return {\n kind: 'translated',\n calls: [{\n // GOTCHA (2026-09-25, A1 mirror E_OP_FAILED): `cad.mirror(input,\n // options)` takes the SOURCE SHAPE as a POSITIONAL arg. Do NOT set\n // `noPositionalArgs` here — that flag is only for ops with zero\n // positional inputs (e.g. cad.compound({ members })), and setting it\n // made renderArgs drop `inputs[0]`, emitting\n // `cad.mirror({ normal, at })` with no geometry → E_OP_FAILED at run.\n out, op: 'cad.mirror', source: obj.name, inputs: [s],\n params: { normal, at },\n }],\n };\n }\n case 'Part::Cut': {\n const base = propLink(obj, 'Base');\n const tool = propLink(obj, 'Tool');\n const b = base ? inputVar(base) : undefined;\n const t = tool ? inputVar(tool) : undefined;\n if (!b || !t) return { kind: 'baked', reason: 'cut-missing-dependency' };\n return {\n kind: 'translated',\n calls: [{ out, op: 'cad.subtract', source: obj.name, inputs: [b, t], params: {} }],\n };\n }\n case 'Part::Fuse': {\n // P7: same Base/Tool PropertyLink serialization as Part::Cut, but\n // fuses instead of cutting.\n const fuseBase = propLink(obj, 'Base');\n const fuseTool = propLink(obj, 'Tool');\n const fb = fuseBase ? inputVar(fuseBase) : undefined;\n const ft = fuseTool ? inputVar(fuseTool) : undefined;\n if (!fb || !ft) return { kind: 'baked', reason: 'fuse-missing-dependency' };\n return {\n kind: 'translated',\n calls: [{ out, op: 'cad.union', source: obj.name, inputs: [fb, ft], params: {} }],\n };\n }\n case 'Part::MultiFuse': {\n // <LinkList count=\"N\"><Link value=\"A\"/>...</LinkList>\n const shapes = propLinkList(obj, 'Shapes');\n const inputs = shapes.map(inputVar);\n if (shapes.length < 2 || inputs.some((i) => i === undefined)) {\n return { kind: 'baked', reason: 'multifuse-missing-dependency' };\n }\n return {\n kind: 'translated',\n calls: [{ out, op: 'cad.union', source: obj.name, inputs: inputs as string[], params: {} }],\n };\n }\n case 'PartDesign::Pad': {\n const profile = profileLink(obj);\n const len = propNum(obj, 'Length') ?? 0;\n const reversed = propBool(obj, 'Reversed');\n const midplane = propBool(obj, 'Midplane');\n const profileVar = profile ? inputVar(profile) : undefined;\n if (!profileVar) return { kind: 'baked', reason: 'pad-missing-profile' };\n // M11.2: a non-constant expression binding (cross-object reference /\n // identifier arithmetic) leaves the length unknown — explicit bake,\n // never estimate (plan §12).\n if (hasNonConstantBinding(obj, 'Length')) {\n return { kind: 'baked', reason: 'pad-length-expression-non-constant' };\n }\n // M9.1/M9.2: Type-driven semantics — no silent Length fallback.\n const ftype = featureTypeOf(obj, 'pad');\n if (ftype === 'TwoLengths') {\n const len2 = propNum(obj, 'Length2') ?? 0;\n // TwoLengths: Length forward + Length2 backward, fused. Named\n // intermediate vars so mapping/debug can locate each segment.\n const pos = `${out}__pos`;\n const neg = `${out}__neg`;\n const calls: CadCall[] = [\n { out: pos, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, len]], params: {} },\n { out: neg, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, -len2]], params: {} },\n { out, op: 'cad.union', source: obj.name, inputs: [pos, neg], params: {} },\n ];\n return { kind: 'translated', calls };\n }\n if (ftype === 'UpToFace') {\n // extrude-upto-face plan §4.3-C1: when the target is a datum plane\n // (PartDesign::Plane — an infinite plane, not a solid face), the\n // extrude length is the exact signed distance from the profile plane\n // to the datum plane. Zero bake, no faceRef needed.\n const upTo = propLinkSub(obj, 'UpToFace');\n if (upTo && docObjects) {\n const target = docObjects.find((o) => o.name === upTo.obj);\n // C1 (extrude-upto-face §4.3-C1): datum plane (infinite plane) →\n // exact signed distance → cad.extrude({ length }). No faceRef needed.\n if (target && target.type === 'PartDesign::Plane') {\n const pl = placementOf(target);\n // datum plane normal = placement R * local +Z\n const m = quatToMatrix(pl.q);\n const normal: [number, number, number] = [m[2]!, m[5]!, m[8]!];\n // sketch normal (the extrude direction); the profile sketch lies on\n // its own placement, and the feature extrudes along it.\n const skPl = placementOf(docObjects.find((o) => o.name === (profile ?? '')) ?? target);\n const skM = quatToMatrix(skPl.q);\n const dir: [number, number, number] = [skM[2]!, skM[5]!, skM[8]!];\n // GOTCHA (probe-upto-padtest-verify.ts, PadTest Pad001): the datum\n // plane is an arbitrary plane, NOT axis-aligned to the extrude\n // direction. The signed distance to reach it along `dir` is\n // t = ((pl.p - skPl.p) · n) / (dir · n)\n // where n is the datum plane normal — NOT the naive (Δp · dir),\n // which only works when n ∥ dir (axis-aligned). The naive form\n // yields −50 for PadTest while the true distance is +10; the\n // corrected form matches FreeCAD's Tip bbox exactly (diag 156.84).\n const denom = dir[0] * normal[0] + dir[1] * normal[1] + dir[2] * normal[2];\n // plane parallel to the extrude direction → no finite intersection\n if (!Number.isFinite(denom) || Math.abs(denom) < 1e-9) {\n return { kind: 'baked', reason: 'uptoface-datum-plane-parallel' };\n }\n const dpn =\n (pl.p[0] - skPl.p[0]) * normal[0] +\n (pl.p[1] - skPl.p[1]) * normal[1] +\n (pl.p[2] - skPl.p[2]) * normal[2];\n const t = dpn / denom;\n if (Number.isFinite(t) && Math.abs(t) > 1e-9) {\n // GOTCHA (PadTest V6 residual, relErr 3.02%): the datum plane may\n // be TILTED relative to the extrude direction (Pad001: datum\n // normal (−0.038·…) not parallel to the sketch normal). A fixed\n // length `signed` gives a FLAT top; FreeCAD's Pad reaches the\n // PLANE, producing a slanted top (truth AddShape 4860.42 vs flat\n // disc 1874.83). Emit an explicit plane target instead and let\n // the kernel's half-space intersection produce the slanted cut.\n // The extrude runs in sketch-local coords, so transform the\n // global plane into the sketch frame: p_local = R⁻¹(p_g − sk.p),\n // n_local = R⁻¹(n_g) (R⁻¹ = Rᵀ).\n const inv = [0, 1, 2].map((c) => [\n skM[c]!, skM[3 + c]!, skM[6 + c]!,\n ]);\n const d = [\n pl.p[0] - skPl.p[0], pl.p[1] - skPl.p[1], pl.p[2] - skPl.p[2],\n ] as [number, number, number];\n const ptLocal: [number, number, number] = [\n inv[0]![0]! * d[0] + inv[0]![1]! * d[1] + inv[0]![2]! * d[2],\n inv[1]![0]! * d[0] + inv[1]![1]! * d[1] + inv[1]![2]! * d[2],\n inv[2]![0]! * d[0] + inv[2]![1]! * d[1] + inv[2]![2]! * d[2],\n ];\n const nLocal: [number, number, number] = [\n inv[0]![0]! * normal[0] + inv[0]![1]! * normal[1] + inv[0]![2]! * normal[2],\n inv[1]![0]! * normal[0] + inv[1]![1]! * normal[1] + inv[1]![2]! * normal[2],\n inv[2]![0]! * normal[0] + inv[2]![1]! * normal[1] + inv[2]![2]! * normal[2],\n ];\n return {\n kind: 'translated',\n reason: 'uptoface-via-datum-plane-distance',\n calls: [{\n out, op: 'cad.extrude', source: obj.name, inputs: [profileVar],\n params: { upTo: { plane: { point: ptLocal, normal: nLocal } } },\n }],\n };\n }\n return { kind: 'baked', reason: 'uptoface-datum-plane-degenerate-distance' };\n }\n // C2.2 (extrude-upto-face §4.3-C2 point 2): solid-feature target →\n // reference its face by ordinal via `cad.extrude({ upTo:\n // cad.faceRef(targetVar, N) })`. faceRef's ordinal is calibrated to\n // match FreeCAD's `FaceN` (R-A, same TopExp::MapShapes + IndexedMap\n // enumeration as edgeRef); the runtime naming layer resolves the ref\n // against the live target shape, so it enters the IR as a JsExpr.\n if (target) {\n const targetVar = inputVar(upTo.obj);\n if (targetVar) {\n const faceN = parseFaceSub(upTo.subs);\n if (faceN !== undefined) {\n return {\n kind: 'translated',\n reason: 'uptoface-via-faceRef',\n calls: [{\n out, op: 'cad.extrude', source: obj.name, inputs: [profileVar],\n params: { upTo: jsExpr(`cad.faceRef(${targetVar}, ${faceN})`) },\n }],\n };\n }\n // sub present but not a plain FaceN reference → explicit bake\n return { kind: 'baked', reason: 'uptoface-sub-unparseable' };\n }\n }\n }\n return { kind: 'baked', reason: 'uptoface-solid-face-unsupported' };\n }\n if (ftype === 'UpToLast' || ftype === 'UpToFirst') {\n // plan §4.3-C2: UpToLast/UpToFirst extrude to the far/near face of the\n // support (BaseFeature) via `cad.extrude({ upTo: 'last' | 'first' })`\n // (up-to lives on the platform op cad.extrude, never on fai_extrude).\n // The kernel up-to does the truncation; baseFeature must be resolvable\n // or we bake explicitly — no silent bbox-derived length guess.\n const base = propLink(obj, 'BaseFeature');\n const baseVar = base ? inputVar(base) : undefined;\n if (!baseVar) return { kind: 'baked', reason: 'pad-upTo-missing-base' };\n const upTo = ftype === 'UpToLast' ? 'last' : 'first';\n return {\n kind: 'translated',\n reason: `pad-${ftype}-via-baseFeature`,\n calls: [{\n out, op: 'cad.extrude', source: obj.name, inputs: [profileVar],\n params: { upTo, baseFeature: jsExpr(baseVar) },\n }],\n };\n }\n if (ftype !== 'Length') {\n // anything still non-Length (e.g. 'unknown') → explicit bake, never guess\n return { kind: 'baked', reason: `pad-type-${ftype}-unsupported` };\n }\n // cad.extrude extrudes the sketch face into a prism along +Z (the sketch\n // normal in body-local frame); length sign encodes direction.\n if (midplane) {\n // symmetric about the sketch plane: two half-prisms fused\n const pos = `${out}__pos`;\n const neg = `${out}__neg`;\n const calls: CadCall[] = [\n { out: pos, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, len / 2]], params: {} },\n { out: neg, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, -len / 2]], params: {} },\n { out, op: 'cad.union', source: obj.name, inputs: [pos, neg], params: {} },\n ];\n return { kind: 'translated', calls };\n }\n const signed = reversed ? -len : len;\n return {\n kind: 'translated',\n calls: [{ out, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, signed]], params: {} }],\n };\n }\n case 'PartDesign::Pocket': {\n const profile = profileLink(obj);\n const len = propNum(obj, 'Length') ?? 0;\n const reversed = propBool(obj, 'Reversed');\n const midplane = propBool(obj, 'Midplane');\n const base = propLink(obj, 'BaseFeature');\n const profileVar = profile ? inputVar(profile) : undefined;\n // GOTCHA (hole_puzzle corpus, 2026-09-20): FreeCAD 0.20+ PartDesign\n // files routinely OMIT BaseFeature on interior features — the base is\n // implied by the Body's feature order (chain head). A MISSING property\n // is \"no explicit base\" → emit the subtract with the BODY_CHAIN_BASE\n // marker; codegen retargets it at the chain head when folding. Only an\n // EXPLICIT base that fails to resolve is a dependency gap.\n const baseVar = base ? inputVar(base) : BODY_CHAIN_BASE;\n if (!profileVar || !baseVar) return { kind: 'baked', reason: 'pocket-missing-dependency' };\n if (hasNonConstantBinding(obj, 'Length')) {\n return { kind: 'baked', reason: 'pocket-length-expression-non-constant' };\n }\n // M9.1/M9.2/M9.3: Type-driven semantics — explicit bake for anything\n // beyond the supported set (no silent downgrade).\n const ftype = featureTypeOf(obj, 'pocket');\n if (ftype === 'UpToFace') {\n // C2.3 (extrude-upto-face §4.3-C2 point 4): Pocket UpToFace — same\n // datum-plane path as Pad (plane target in sketch-local frame); the\n // cut direction is handled by the kernel's auto-orientation toward\n // the plane (GOTCHA: Pocket cuts INTO the material, the plane lies\n // on the far side, and the kernel flips the extrude direction).\n const upTo = propLinkSub(obj, 'UpToFace');\n if (upTo && docObjects) {\n const target = docObjects.find((o) => o.name === upTo.obj);\n if (target && target.type === 'PartDesign::Plane') {\n const pl = placementOf(target);\n const m = quatToMatrix(pl.q);\n const normal: [number, number, number] = [m[2]!, m[5]!, m[8]!];\n const skPl = placementOf(docObjects.find((o) => o.name === (profile ?? '')) ?? target);\n const skM = quatToMatrix(skPl.q);\n const dir: [number, number, number] = [skM[2]!, skM[5]!, skM[8]!];\n const denom = dir[0] * normal[0] + dir[1] * normal[1] + dir[2] * normal[2];\n if (!Number.isFinite(denom) || Math.abs(denom) < 1e-9) {\n return { kind: 'baked', reason: 'pocket-uptoface-datum-plane-parallel' };\n }\n // plane → sketch-local frame (p_local = R⁻¹(p_g − sk.p), n_local = R⁻¹ n)\n const inv = [0, 1, 2].map((c) => [skM[c]!, skM[3 + c]!, skM[6 + c]!]);\n const d = [pl.p[0] - skPl.p[0], pl.p[1] - skPl.p[1], pl.p[2] - skPl.p[2]] as [number, number, number];\n const ptLocal: [number, number, number] = [\n inv[0]![0]! * d[0] + inv[0]![1]! * d[1] + inv[0]![2]! * d[2],\n inv[1]![0]! * d[0] + inv[1]![1]! * d[1] + inv[1]![2]! * d[2],\n inv[2]![0]! * d[0] + inv[2]![1]! * d[1] + inv[2]![2]! * d[2],\n ];\n const nLocal: [number, number, number] = [\n inv[0]![0]! * normal[0] + inv[0]![1]! * normal[1] + inv[0]![2]! * normal[2],\n inv[1]![0]! * normal[0] + inv[1]![1]! * normal[1] + inv[1]![2]! * normal[2],\n inv[2]![0]! * normal[0] + inv[2]![1]! * normal[1] + inv[2]![2]! * normal[2],\n ];\n const cutVar = `${out}_cut`;\n const calls: CadCall[] = [\n {\n out: cutVar, op: 'cad.extrude', source: obj.name, inputs: [profileVar],\n params: { upTo: { plane: { point: ptLocal, normal: nLocal } } },\n },\n { out, op: 'cad.subtract', source: obj.name, inputs: [baseVar, cutVar], params: {} },\n ];\n return { kind: 'translated', reason: 'pocket-uptoface-via-datum-plane', calls };\n }\n return { kind: 'baked', reason: 'pocket-uptoface-solid-face-unsupported' };\n }\n return { kind: 'baked', reason: 'pocket-uptoface-sub-unparseable' };\n }\n if (ftype === 'UpToFirst') {\n // C2.3: Pocket UpToFirst — cut prism to the support's NEAR face along\n // the cut direction; the kernel truncates the prism against the\n // baseFeature (chain head), then the result is subtracted.\n const baseVarUp = baseVar;\n const cutVar = `${out}_cut`;\n const calls: CadCall[] = [\n {\n out: cutVar, op: 'cad.extrude', source: obj.name, inputs: [profileVar],\n params: { upTo: 'first', baseFeature: jsExpr(baseVarUp) },\n },\n { out, op: 'cad.subtract', source: obj.name, inputs: [baseVarUp, cutVar], params: {} },\n ];\n return { kind: 'translated', reason: 'pocket-uptofirst-via-baseFeature', calls };\n }\n if (ftype !== 'Length' && ftype !== 'TwoLengths' && ftype !== 'ThroughAll') {\n return { kind: 'baked', reason: `pocket-type-${ftype}-unsupported` };\n }\n // P1-1b (2026-09-23): Pocket Midplane — symmetric cut prism about the\n // sketch plane (same construction as the Pad midplane branch: two\n // half-prisms fused, then subtracted). Direction sign is irrelevant\n // (symmetric); ThroughAll keeps its far-beyond-extent depth.\n if (midplane) {\n const THROUGH_ALL_DEPTH = 1e6;\n const depth = ftype === 'ThroughAll' ? THROUGH_ALL_DEPTH : len;\n const half = depth / 2;\n const pos = `${out}_cut_pos`;\n const neg = `${out}_cut_neg`;\n const cutVar = `${out}_cut`;\n const calls: CadCall[] = [\n { out: pos, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, half]], params: {} },\n { out: neg, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, -half]], params: {} },\n { out: cutVar, op: 'cad.union', source: obj.name, inputs: [pos, neg], params: {} },\n { out, op: 'cad.subtract', source: obj.name, inputs: [baseVar, cutVar], params: {} },\n ];\n return { kind: 'translated', calls };\n }\n // Pocket cuts INTO the material: extrude the profile opposite the normal\n // (or along it when Reversed), then subtract from base.\n // ThroughAll (hole_puzzle corpus, 2026-09-20): FreeCAD truncates the\n // prism against the base solid, so a depth far beyond any realistic\n // base extent is safe — the subtract is exact either way.\n const THROUGH_ALL_DEPTH = 1e6;\n const depth = ftype === 'ThroughAll' ? THROUGH_ALL_DEPTH : len;\n const signed = reversed ? depth : -depth;\n const cutVar = `${out}_cut`;\n const calls: CadCall[] = [{\n out: cutVar, op: 'cad.extrude', source: obj.name, inputs: [profileVar], literals: [[0, 0, signed]], params: {},\n }];\n calls.push({ out, op: 'cad.subtract', source: obj.name, inputs: [baseVar, cutVar], params: {} });\n return { kind: 'translated', calls };\n }\n case 'Part::Extrusion': {\n const base = propLink(obj, 'Base');\n const baseVar = base ? inputVar(base) : undefined;\n if (!baseVar) return { kind: 'baked', reason: 'extrusion-missing-base' };\n const dir = propVecXYZ(obj, 'Dir') ?? propVec(obj, 'Dir') ?? [0, 0, 1];\n // FreeCAD 0.20+ serializes the flag as `Reversed`; older files used\n // `Reverse`. Accept both.\n const reversed = propBool(obj, 'Reversed') || propBool(obj, 'Reverse');\n // E4 (2026-09-23): Part::Extrusion serializes in three shapes. New\n // format: LengthFwd/LengthRev (unit Dir). Old format: only Dir, whose\n // magnitude IS the extrusion length. Legacy: Length + Dir. The previous\n // code only knew the legacy shape → len=0 → E_EXTRUDE_ZERO_VECTOR on\n // 918 corpus runs.\n const lengthFwd = propNum(obj, 'LengthFwd');\n const lengthRev = propNum(obj, 'LengthRev');\n const taperAngle = propNum(obj, 'TaperAngle') ?? 0;\n if (taperAngle !== 0) {\n // No-heuristic-fallback: silently ignoring a taper would produce wrong\n // geometry. Bake with an explicit reason instead.\n return { kind: 'baked', reason: 'extrusion-taper-unsupported' };\n }\n const unitDir = normalize3(dir);\n const calls: CadCall[] = [];\n const emitExtrude = (outName: string, fwdLen: number, revLen: number) => {\n if (fwdLen > 0) {\n calls.push({\n out: revLen > 0 ? `${outName}_fwd` : outName,\n op: 'cad.extrude', source: obj.name, inputs: [baseVar],\n literals: [[unitDir[0] * fwdLen, unitDir[1] * fwdLen, unitDir[2] * fwdLen]], params: {},\n });\n }\n if (revLen > 0) {\n // `|| 0` normalizes -0 to +0 (JSON/对拍 noise otherwise).\n calls.push({\n out: fwdLen > 0 ? `${outName}_rev` : outName,\n op: 'cad.extrude', source: obj.name, inputs: [baseVar],\n literals: [[(-unitDir[0] * revLen) || 0, (-unitDir[1] * revLen) || 0, (-unitDir[2] * revLen) || 0]], params: {},\n });\n }\n };\n if (lengthFwd !== undefined || lengthRev !== undefined) {\n const symmetric = propBool(obj, 'Symmetric');\n const fwd = lengthFwd ?? 0;\n const revRaw = lengthRev ?? 0;\n // FreeCAD semantics: Symmetric extrudes LengthFwd on BOTH sides;\n // Reversed swaps the fwd/rev sides (same magnitudes).\n const fwdLen = symmetric ? fwd : (reversed ? revRaw : fwd);\n const revLen = symmetric ? fwd : (reversed ? fwd : revRaw);\n if (fwdLen > 0 && revLen > 0) {\n emitExtrude(out, fwdLen, revLen);\n calls.push({ out, op: 'cad.union', source: obj.name, inputs: [`${out}_fwd`, `${out}_rev`], params: {} });\n } else {\n emitExtrude(out, fwdLen, revLen);\n }\n if (calls.length === 0) return { kind: 'baked', reason: 'extrusion-zero-length' };\n return { kind: 'translated', calls };\n }\n const legacyLen = propNum(obj, 'Length');\n if (legacyLen !== undefined) {\n // Legacy shape: Length + unit Dir.\n const s = reversed ? -1 : 1;\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.extrude', source: obj.name, inputs: [baseVar],\n literals: [[s * dir[0] * legacyLen, s * dir[1] * legacyLen, s * dir[2] * legacyLen]], params: {},\n }],\n };\n }\n // Old format: |Dir| IS the extrusion length; Dir is the vector.\n const mag = Math.hypot(dir[0], dir[1], dir[2]);\n if (mag <= 0) return { kind: 'baked', reason: 'extrusion-zero-length' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.extrude', source: obj.name, inputs: [baseVar],\n literals: [reversed ? [-dir[0], -dir[1], -dir[2]] : dir], params: {},\n }],\n };\n }\n case 'Part::Revolution': {\n // P6: Part-workbench revolve — Source profile + axis given DIRECTLY as\n // Base/Axis PropertyVector (GOTCHA: valueX/Y/Z child-element form, NOT\n // the value=\"x y z\" attribute form propVec reads; PartDesign::Revolution\n // instead stores a ReferenceAxis string — different serialization, so\n // this is a separate branch, not a shared one).\n const revSrc = propLink(obj, 'Source');\n const revVar = revSrc ? inputVar(revSrc) : undefined;\n if (!revVar) {\n return { kind: 'baked', reason: revSrc ? `part-revolution-source-baked-upstream:${revSrc}` : 'part-revolution-missing-source' };\n }\n const axisRaw = propVecXYZ(obj, 'Axis');\n if (!axisRaw || Math.hypot(...axisRaw) <= 0) {\n return { kind: 'baked', reason: 'part-revolution-missing-axis' };\n }\n const axis = normalize3(axisRaw);\n const base = propVecXYZ(obj, 'Base') ?? [0, 0, 0];\n const [rpx, rpy, rpz] = placementPos(obj);\n const at = [base[0]! + rpx, base[1]! + rpy, base[2]! + rpz] as [number, number, number];\n const revAngleDeg = propNum(obj, 'Angle') ?? 360;\n if (revAngleDeg <= 0 || revAngleDeg > 360) {\n return { kind: 'baked', reason: 'part-revolution-angle-out-of-range' };\n }\n const revAngle = (revAngleDeg * Math.PI) / 180;\n if (propStr(obj, 'Symmetric') === 'true') {\n return { kind: 'baked', reason: 'part-revolution-symmetric-unsupported' };\n }\n return {\n kind: 'translated',\n calls: [{\n // GOTCHA (2026-09-25, A3 revolve REVOLVE_FAILED): same root cause as\n // the mirror branch — `cad.revolve(input, { axis, at, angle })` takes\n // the source shape as a POSITIONAL arg. `noPositionalArgs: true` made\n // renderArgs drop `inputs[0]`, emitting `cad.revolve({ axis, at, angle })`\n // with no geometry → REVOLVE_FAILED at run.\n out, op: 'cad.revolve', source: obj.name, inputs: [revVar],\n params: { axis, at, angle: revAngle },\n }],\n };\n }\n case 'PartDesign::Revolution': {\n const profile = profileLink(obj);\n const profileVar = profile ? inputVar(profile) : undefined;\n if (!profileVar) {\n // P2-1 (2026-09-24, Mannequin_mp): a `revolution-missing-profile`\n // cascade lie — 13 Revolutions had a VALID Profile link (e.g.\n // Revolution033 → Sketch061) whose target sketch was baked upstream\n // (unsupported-geometry), so inputVar resolved undefined. Distinguish\n // \"no link at all\" from \"link exists but upstream not translated\".\n return { kind: 'baked', reason: profile ? `revolution-profile-baked-upstream:${profile}` : 'revolution-missing-profile' };\n }\n const angleDeg = propNum(obj, 'Angle') ?? 360;\n const angle = (angleDeg * Math.PI) / 180;\n const axisInfo = parseReferenceAxis(propStr(obj, 'ReferenceAxis'));\n if (!axisInfo) return { kind: 'baked', reason: 'revolution-edge-axis-unsupported' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.revolve', source: obj.name, inputs: [profileVar],\n params: { axis: axisInfo.axis, at: axisInfo.at, angle },\n }],\n };\n }\n case 'PartDesign::Groove': {\n // P2-2 (2026-09-24): Groove = Revolution + subtract — revolve the\n // profile around the axis, then cut it from the base feature. Same\n // Profile/ReferenceAxis/Angle serialization as Revolution.\n const grooveProfile = profileLink(obj);\n const grooveProfileVar = grooveProfile ? inputVar(grooveProfile) : undefined;\n if (!grooveProfileVar) {\n return {\n kind: 'baked',\n reason: grooveProfile ? `groove-profile-baked-upstream:${grooveProfile}` : 'groove-missing-profile',\n };\n }\n const baseVar = inputVar(propLink(obj, 'BaseFeature') ?? '');\n if (!baseVar) return { kind: 'baked', reason: 'groove-missing-base' };\n const gAngleDeg = propNum(obj, 'Angle') ?? 360;\n const gAngle = (gAngleDeg * Math.PI) / 180;\n const gAxis = parseReferenceAxis(propStr(obj, 'ReferenceAxis'));\n if (!gAxis) return { kind: 'baked', reason: 'groove-edge-axis-unsupported' };\n const grooveVar = `${out}_groove`;\n return {\n kind: 'translated',\n calls: [\n {\n out: grooveVar, op: 'cad.revolve', source: obj.name, inputs: [grooveProfileVar],\n params: { axis: gAxis.axis, at: gAxis.at, angle: gAngle },\n },\n { out, op: 'cad.subtract', source: obj.name, inputs: [baseVar, grooveVar], params: {} },\n ],\n };\n }\n case 'PartDesign::LinearPattern': {\n // P3-1 (2026-09-23): FreeCAD serializes Transformed features with the\n // patterned features in `Originals` (PropertyLinkList); `Source` only\n // exists on some versions. Read Source first, then fall back to\n // Originals[0] (multi-original → fuse the patterned copies below).\n const source = propLink(obj, 'Source') ?? propLinkList(obj, 'Originals')[0];\n const originals = source ? [source] : [];\n const sourceVar = originals.length > 0 ? inputVar(originals[0]!) : undefined;\n if (!sourceVar) return { kind: 'baked', reason: 'linear-pattern-missing-source' };\n const dirInfo = parseReferenceAxis(propStr(obj, 'Direction'));\n if (!dirInfo) return { kind: 'baked', reason: 'linear-pattern-edge-dir-unsupported' };\n const occ = Math.max(2, Math.round(propNum(obj, 'Occurrences') ?? 2));\n const length = propNum(obj, 'Length') ?? 0;\n const spacing = occ > 1 ? length / (occ - 1) : 0;\n if (originals.length === 1) {\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.linearPattern', source: obj.name, inputs: [sourceVar],\n literals: [dirInfo.axis, occ, spacing], params: {},\n }],\n };\n }\n // Multi-original: pattern each, then fuse.\n const calls: CadCall[] = originals.map((o, i) => {\n const v = inputVar(o);\n if (!v) return null;\n return {\n out: i === 0 ? `${out}_p0` : `${out}_p${i}`, op: 'cad.linearPattern', source: obj.name, inputs: [v],\n literals: [dirInfo.axis, occ, spacing], params: {},\n } as CadCall;\n }).filter((c): c is CadCall => c !== null);\n for (let i = 1; i < calls.length; i++) {\n calls.push({\n out: i === calls.length - 1 ? out : `${out}_u${i}`,\n op: 'cad.union', source: obj.name,\n inputs: [i === 1 ? calls[0]!.out : `${out}_u${i - 1}`, calls[i]!.out], params: {},\n });\n }\n return { kind: 'translated', calls };\n }\n case 'PartDesign::PolarPattern': {\n const sourcePolar = propLink(obj, 'Source') ?? propLinkList(obj, 'Originals')[0];\n const sourceVar = sourcePolar ? inputVar(sourcePolar) : undefined;\n if (!sourceVar) return { kind: 'baked', reason: 'polar-pattern-missing-source' };\n const axisInfo = parseReferenceAxis(propStr(obj, 'Axis'));\n if (!axisInfo) return { kind: 'baked', reason: 'polar-pattern-edge-axis-unsupported' };\n const occ = Math.max(2, Math.round(propNum(obj, 'Occurrences') ?? 2));\n const angle = propNum(obj, 'Angle') ?? 360;\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.circularPattern', source: obj.name, inputs: [sourceVar],\n literals: [axisInfo.axis, occ, angle], params: {},\n }],\n };\n }\n case 'PartDesign::Fillet': {\n const base = propLinkSub(obj, 'Base');\n const baseVar = base ? inputVar(base.obj) : undefined;\n if (!baseVar) return { kind: 'baked', reason: 'fillet-missing-base' };\n if (propBool(obj, 'UseAllEdges')) return { kind: 'baked', reason: 'fillet-all-edges-unsupported' };\n if (!base || base.subs.length === 0) return { kind: 'baked', reason: 'fillet-no-edges' };\n const ordinals = parseEdgeSubs(base.subs);\n if (!ordinals) return { kind: 'baked', reason: 'fillet-non-edge-sub' };\n const radius = propNum(obj, 'Radius');\n if (radius === undefined || !(radius > 0)) return { kind: 'baked', reason: 'fillet-bad-radius' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.fillet', source: obj.name, inputs: [baseVar],\n params: { edges: edgeRefArgs(baseVar, ordinals), radius },\n }],\n };\n }\n case 'PartDesign::Chamfer': {\n const base = propLinkSub(obj, 'Base');\n const baseVar = base ? inputVar(base.obj) : undefined;\n if (!baseVar) return { kind: 'baked', reason: 'chamfer-missing-base' };\n if (propBool(obj, 'UseAllEdges')) return { kind: 'baked', reason: 'chamfer-all-edges-unsupported' };\n if (!base || base.subs.length === 0) return { kind: 'baked', reason: 'chamfer-no-edges' };\n const ordinals = parseEdgeSubs(base.subs);\n if (!ordinals) return { kind: 'baked', reason: 'chamfer-non-edge-sub' };\n const edges = edgeRefArgs(baseVar, ordinals);\n // ChamferType enum (FeatureChamfer.cpp:55): 0 \"Equal distance\" (the\n // default when the property is absent, i.e. files predating it),\n // 1 \"Two distances\", 2 \"Distance and Angle\".\n const type = Math.round(propNum(obj, 'ChamferType') ?? 0);\n const size = propNum(obj, 'Size');\n if (type === 1) {\n const size2 = propNum(obj, 'Size2');\n if (size === undefined || !(size > 0) || size2 === undefined || !(size2 > 0)) {\n return { kind: 'baked', reason: 'chamfer-bad-two-distances' };\n }\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.chamfer', source: obj.name, inputs: [baseVar],\n params: { edges, type: 'twoDistances', width1: size, width2: size2 },\n }],\n };\n }\n if (type === 2) {\n // FreeCAD's Angle is degrees, range 0–180 (floatAngle); cad.chamfer\n // accepts degrees in the open interval (0, 90) only.\n const angle = propNum(obj, 'Angle');\n if (size === undefined || !(size > 0) || angle === undefined || !(angle > 0 && angle < 90)) {\n return { kind: 'baked', reason: 'chamfer-bad-distance-angle' };\n }\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.chamfer', source: obj.name, inputs: [baseVar],\n params: { edges, type: 'distanceAngle', width: size, angle },\n }],\n };\n }\n if (type !== 0) return { kind: 'baked', reason: `chamfer-unknown-type: ${type}` };\n if (size === undefined || !(size > 0)) return { kind: 'baked', reason: 'chamfer-bad-size' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.chamfer', source: obj.name, inputs: [baseVar],\n params: { edges, type: 'equal', width: size },\n }],\n };\n }\n case 'Part::Chamfer': {\n // P8: Part-workbench chamfer. GOTCHA: edge selection AND sizes do NOT\n // live in Document.xml — the `Edges` property points at a binary\n // PropertyFilletEdges ZIP member (parsed by convert, passed in via\n // filletEdgesData). XML-only reading yields no size at all.\n const chBase = propLink(obj, 'Base');\n const chBaseVar = chBase ? inputVar(chBase) : undefined;\n if (!chBaseVar) return { kind: 'baked', reason: 'chamfer-missing-base' };\n const chEntries = filletEdgesData?.get(obj.name);\n if (!chEntries || chEntries.length === 0) {\n return { kind: 'baked', reason: 'chamfer-edges-data-missing' };\n }\n // cad.chamfer 'equal' takes ONE width for ALL edges. Mixed sizes across\n // edges cannot be emitted as sequential calls either: after the first\n // chamfer the shape's edge ordinals shift, so the second call's\n // EdgeN refs would point at the wrong edges (corpus: 1/109 objects).\n const chSizes = new Set(chEntries.map((e) => e.size1));\n if (chSizes.size > 1) return { kind: 'baked', reason: 'chamfer-mixed-sizes' };\n // Asymmetric size1 != size2 (two-distance chamfer): 0 corpus\n // occurrences; the Size1/Size2 face-side correspondence to\n // cad.chamfer twoDistances width1/width2 is unverified — honest bake.\n if (chEntries.some((e) => e.size1 !== e.size2)) {\n return { kind: 'baked', reason: 'chamfer-asymmetric-sizes' };\n }\n const chSize = chEntries[0]!.size1;\n if (!(chSize > 0)) return { kind: 'baked', reason: 'chamfer-bad-size' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.chamfer', source: obj.name, inputs: [chBaseVar],\n params: { edges: edgeRefArgs(chBaseVar, chEntries.map((e) => e.edge)), type: 'equal', width: chSize },\n }],\n };\n }\n case 'Part::Fillet': {\n // P9: Part-workbench fillet. Same binary PropertyFilletEdges member as\n // Part::Chamfer (parsed by convert, passed in via filletEdgesData). The\n // radius lives ONLY in that binary member — Document.xml carries no\n // usable radius.\n const fBase = propLink(obj, 'Base');\n const fBaseVar = fBase ? inputVar(fBase) : undefined;\n if (!fBaseVar) return { kind: 'baked', reason: 'fillet-missing-base' };\n const fEntries = filletEdgesData?.get(obj.name);\n if (!fEntries || fEntries.length === 0) {\n return { kind: 'baked', reason: 'fillet-edges-data-missing' };\n }\n // cad.fillet (M1) supports ONE uniform radius for all edges. A constant\n // fillet stores radius in both size1 and size2; anything else (size1 !=\n // size2, or differing radius across edges) is a variable-radius fillet\n // that M1 cannot emit as a single call — and sequential calls would shift\n // edge ordinals (same hazard as chamfer). Honest bake, no silent loss.\n if (fEntries.some((e) => e.size1 !== e.size2)) {\n return { kind: 'baked', reason: 'fillet-asymmetric-sizes' };\n }\n const fRadii = new Set(fEntries.map((e) => e.size1));\n if (fRadii.size > 1) return { kind: 'baked', reason: 'fillet-variable-radius' };\n const fRadius = fEntries[0]!.size1;\n if (!(fRadius > 0)) return { kind: 'baked', reason: 'fillet-bad-radius' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.fillet', source: obj.name, inputs: [fBaseVar],\n params: { edges: edgeRefArgs(fBaseVar, fEntries.map((e) => e.edge)), radius: fRadius },\n }],\n };\n }\n case 'Part::Sweep': {\n // P2-3: FreeCAD Part::Sweep → cad.sweep(profile, spine, opts).\n // Real FCStd (corpus-verified 2026-09-24): the section is carried in\n // `Sections` (App::PropertyLinkList, usually length 1) — NOT `Profile`,\n // which is absent in the corpus. We accept either, preferring the\n // standard `Profile` and falling back to `Sections[0]`.\n // The path is `Spine` (App::PropertyLinkSub): { obj: sketch, subs: edges }.\n // We pass the base object as the spine; cad.sweep now tolerates a face\n // argument and takes its outer-ring wire as the path (api/sweep.ts\n // toProfileWireView), which is exact for the dominant case where the\n // selected sub-edges ARE the full outline. Multi-edge sub-path selection\n // that is a strict subset is a P4-1 refinement (curve/attachment).\n // Mode: Frenet (0, default) / Binormal (1) / Auxiliary (2). Auxiliary\n // needs a second supporting spine we do not carry → honest bake. Check\n // this BEFORE dependency resolution: an unsupported mode is a property of\n // this object alone, independent of whether its profile/spine resolved\n // (cf. the \"Auxiliary mode\" test where inputVar is stubbed away).\n const modeRaw = propStr(obj, 'Mode');\n if (modeRaw === 'Auxiliary' || modeRaw === '2') {\n return { kind: 'baked', reason: 'sweep-auxiliary-unsupported' };\n }\n const sweepProfile = propLink(obj, 'Profile') ?? propLinkList(obj, 'Sections')[0];\n const sweepSpineSub = propLinkSub(obj, 'Spine');\n const sweepSpine = sweepSpineSub?.obj;\n const profileVar = sweepProfile ? inputVar(sweepProfile) : undefined;\n const spineVar = sweepSpine ? inputVar(sweepSpine) : undefined;\n if (!profileVar) {\n return { kind: 'baked', reason: sweepProfile ? `sweep-profile-baked-upstream:${sweepProfile}` : 'sweep-missing-profile' };\n }\n if (!spineVar) {\n return { kind: 'baked', reason: sweepSpine ? `sweep-spine-baked-upstream:${sweepSpine}` : 'sweep-missing-spine' };\n }\n const frenet = modeRaw === undefined || modeRaw === 'Frenet' || modeRaw === '0' || propBool(obj, 'Frenet');\n const transition = normalizeSweepTransition(propStr(obj, 'Transition'));\n const opts: Record<string, unknown> = {};\n if (frenet) opts.frenet = true;\n if (transition) opts.transitionMode = transition;\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.sweep', source: obj.name, inputs: [profileVar, spineVar], params: opts,\n }],\n };\n }\n case 'Part::Loft': {\n // P2-3: FreeCAD Part::Loft → cad.loft([sections], opts). `Sections` is a\n // PropertyLinkList of already-translated profile faces/wires; cad.loft\n // adapts each face → outer-ring wire (api/loft.ts toProfileWireView).\n const sections = propLinkList(obj, 'Sections');\n // Closed loft needs a `closed` option cad.loft does not expose → honest\n // bake. Check this BEFORE dependency resolution: an unsupported option is\n // a property of this object alone, independent of whether its sections\n // resolved (cf. the \"Closed=true\" test where inputVar is stubbed away).\n if (propBool(obj, 'Closed')) return { kind: 'baked', reason: 'loft-closed-unsupported' };\n const sectionVars = sections.map((s) => inputVar(s));\n if (sections.length < 2) {\n // Genuinely fewer than two profiles → not a loft, no upstream involvement.\n return { kind: 'baked', reason: 'loft-missing-sections' };\n }\n const missingIdx = sectionVars.findIndex((v) => v === undefined);\n if (missingIdx >= 0) {\n // A section resolved to an object that itself got baked upstream → we\n // cannot reconstruct its geometry here → honest bake with the culprit.\n return { kind: 'baked', reason: `loft-section-baked-upstream:${sections[missingIdx]}` };\n }\n const ruled = propBool(obj, 'Ruled'); // FC default true; emit only when false\n const params: Record<string, unknown> = {};\n if (ruled === false) params.ruled = false;\n // Sections rendered as a positional array literal. Remap-safe: inputVar\n // already returns the renamed var (deps are processed before dependents,\n // cf. the fillet edgeRefArgs JsExpr precedent).\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.loft', source: obj.name, inputs: [],\n literals: [jsExpr(`[${sectionVars.join(', ')}]`)], params,\n }],\n };\n }\n case 'Part::Helix': {\n // P2-3: FreeCAD Part::Helix (3D curve primitive) → cad.helix({radius,pitch,turns}).\n // cad.helix yields a 1D curve usable as a sweep spine. FC Helix props:\n // Radius / Pitch / Height (+ optional Angle cone taper, Turns alias).\n // The object's own Placement is applied by codegen's normal cad.place step,\n // so we do NOT bake origin here (that would double-place).\n const hRadius = propNum(obj, 'Radius');\n const hPitch = propNum(obj, 'Pitch');\n const hHeight = propNum(obj, 'Height');\n const hTurns = propNum(obj, 'Turns');\n const hAngle = propNum(obj, 'Angle') ?? 0;\n if (!(hRadius !== undefined && hRadius > 0)) return { kind: 'baked', reason: 'helix-missing-radius' };\n if (!(hPitch !== undefined && hPitch !== 0)) return { kind: 'baked', reason: 'helix-missing-pitch' };\n // cad.helix is cylindrical; a cone-taper helix is unsupported → honest bake.\n if (hAngle !== 0) return { kind: 'baked', reason: 'helix-cone-unsupported' };\n const turns = hHeight !== undefined ? hHeight / hPitch : hTurns;\n if (!(turns !== undefined && turns > 0)) return { kind: 'baked', reason: 'helix-missing-turns' };\n return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.helix', source: obj.name, inputs: [],\n params: { radius: hRadius, pitch: hPitch, turns },\n }],\n };\n }\n default:\n return { kind: 'baked', reason: `type-not-implemented: ${obj.type}` };\n }\n}\n\nfunction propLinkList(obj: FcstdObject, name: string): string[] {\n const listEl = obj.properties.get(name)?.children[0];\n if (!listEl) return [];\n const out: string[] = [];\n for (const link of listEl.children) {\n const v = link.attributes['value'];\n if (v) out.push(v);\n }\n return out;\n}\n"]}
|