@faicad/faijs 0.13.0 → 0.13.2

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.
Files changed (106) hide show
  1. package/dist/api/edge-ref.d.ts +3 -2
  2. package/dist/api/edge-ref.d.ts.map +1 -1
  3. package/dist/api/edge-ref.js +3 -2
  4. package/dist/api/edge-ref.js.map +1 -1
  5. package/dist/api/internal/compat-op.d.ts +2 -0
  6. package/dist/api/internal/compat-op.d.ts.map +1 -1
  7. package/dist/api/internal/compat-op.js +8 -1
  8. package/dist/api/internal/compat-op.js.map +1 -1
  9. package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
  10. package/dist/api/occt-kernel-bridge.js +7 -1
  11. package/dist/api/occt-kernel-bridge.js.map +1 -1
  12. package/dist/browser.d.ts +0 -2
  13. package/dist/browser.d.ts.map +1 -1
  14. package/dist/browser.js +2 -2
  15. package/dist/browser.js.map +1 -1
  16. package/dist/cad-runtime/browser-lib-loader.d.ts +1 -1
  17. package/dist/cad-runtime/browser-lib-loader.js +1 -1
  18. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  19. package/dist/fcstd/attachment.d.ts +65 -0
  20. package/dist/fcstd/attachment.d.ts.map +1 -0
  21. package/dist/fcstd/attachment.js +87 -0
  22. package/dist/fcstd/attachment.js.map +1 -0
  23. package/dist/fcstd/build-fai-zip.d.ts +11 -0
  24. package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
  25. package/dist/fcstd/build-fai-zip.js +9 -1
  26. package/dist/fcstd/build-fai-zip.js.map +1 -1
  27. package/dist/fcstd/cli.d.ts +3 -0
  28. package/dist/fcstd/cli.d.ts.map +1 -0
  29. package/dist/fcstd/cli.js +37 -0
  30. package/dist/fcstd/cli.js.map +1 -0
  31. package/dist/fcstd/codegen.d.ts +14 -1
  32. package/dist/fcstd/codegen.d.ts.map +1 -1
  33. package/dist/fcstd/codegen.js +11 -2
  34. package/dist/fcstd/codegen.js.map +1 -1
  35. package/dist/fcstd/container.d.ts +16 -1
  36. package/dist/fcstd/container.d.ts.map +1 -1
  37. package/dist/fcstd/container.js +12 -1
  38. package/dist/fcstd/container.js.map +1 -1
  39. package/dist/fcstd/contour.d.ts +9 -1
  40. package/dist/fcstd/contour.d.ts.map +1 -1
  41. package/dist/fcstd/contour.js +12 -1
  42. package/dist/fcstd/contour.js.map +1 -1
  43. package/dist/fcstd/convert.d.ts +47 -2
  44. package/dist/fcstd/convert.d.ts.map +1 -1
  45. package/dist/fcstd/convert.js +82 -13
  46. package/dist/fcstd/convert.js.map +1 -1
  47. package/dist/fcstd/document.d.ts +8 -1
  48. package/dist/fcstd/document.d.ts.map +1 -1
  49. package/dist/fcstd/document.js +4 -1
  50. package/dist/fcstd/document.js.map +1 -1
  51. package/dist/fcstd/expressions.d.ts +14 -1
  52. package/dist/fcstd/expressions.d.ts.map +1 -1
  53. package/dist/fcstd/expressions.js +11 -1
  54. package/dist/fcstd/expressions.js.map +1 -1
  55. package/dist/fcstd/external-geo.d.ts +15 -1
  56. package/dist/fcstd/external-geo.d.ts.map +1 -1
  57. package/dist/fcstd/external-geo.js +8 -1
  58. package/dist/fcstd/external-geo.js.map +1 -1
  59. package/dist/fcstd/feature-translate.d.ts +65 -3
  60. package/dist/fcstd/feature-translate.d.ts.map +1 -1
  61. package/dist/fcstd/feature-translate.js +82 -4
  62. package/dist/fcstd/feature-translate.js.map +1 -1
  63. package/dist/fcstd/index.d.ts +23 -0
  64. package/dist/fcstd/index.d.ts.map +1 -0
  65. package/dist/fcstd/index.js +19 -0
  66. package/dist/fcstd/index.js.map +1 -0
  67. package/dist/fcstd/placement.d.ts +49 -6
  68. package/dist/fcstd/placement.d.ts.map +1 -1
  69. package/dist/fcstd/placement.js +46 -6
  70. package/dist/fcstd/placement.js.map +1 -1
  71. package/dist/fcstd/planegcs-backend.d.ts +16 -1
  72. package/dist/fcstd/planegcs-backend.d.ts.map +1 -1
  73. package/dist/fcstd/planegcs-backend.js +16 -1
  74. package/dist/fcstd/planegcs-backend.js.map +1 -1
  75. package/dist/fcstd/sketch-parse.d.ts +43 -0
  76. package/dist/fcstd/sketch-parse.d.ts.map +1 -1
  77. package/dist/fcstd/sketch-parse.js +26 -0
  78. package/dist/fcstd/sketch-parse.js.map +1 -1
  79. package/dist/fcstd/sketch-solver.d.ts +20 -2
  80. package/dist/fcstd/sketch-solver.d.ts.map +1 -1
  81. package/dist/fcstd/sketch-solver.js +6 -1
  82. package/dist/fcstd/sketch-solver.js.map +1 -1
  83. package/dist/fcstd/sketch-verify.d.ts +19 -1
  84. package/dist/fcstd/sketch-verify.d.ts.map +1 -1
  85. package/dist/fcstd/sketch-verify.js +14 -1
  86. package/dist/fcstd/sketch-verify.js.map +1 -1
  87. package/dist/fcstd/unpack.d.ts +21 -2
  88. package/dist/fcstd/unpack.d.ts.map +1 -1
  89. package/dist/fcstd/unpack.js +11 -2
  90. package/dist/fcstd/unpack.js.map +1 -1
  91. package/dist/fcstd-convert.d.ts +30 -0
  92. package/dist/fcstd-convert.d.ts.map +1 -0
  93. package/dist/fcstd-convert.js +27 -0
  94. package/dist/fcstd-convert.js.map +1 -0
  95. package/dist/node-host/cli.d.ts.map +1 -1
  96. package/dist/node-host/cli.js +20 -19
  97. package/dist/node-host/cli.js.map +1 -1
  98. package/dist/vendored/brepjs/kernel/index.d.ts +7 -0
  99. package/dist/vendored/brepjs/kernel/index.d.ts.map +1 -1
  100. package/dist/vendored/brepjs/kernel/index.js +57 -0
  101. package/dist/vendored/brepjs/kernel/index.js.map +1 -1
  102. package/dist/weapp.d.ts +22 -0
  103. package/dist/weapp.d.ts.map +1 -0
  104. package/dist/weapp.js +23 -0
  105. package/dist/weapp.js.map +1 -0
  106. package/package.json +18 -5
@@ -1 +1 @@
1
- {"version":3,"file":"feature-translate.js","sourceRoot":"","sources":["../../src/fcstd/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, type ExpressionBinding } from './expressions.js';\nimport { placementOf, quatToMatrix } from './placement.js';\n\nexport interface CadCall {\n /** target variable name (partN, assigned by M5) */\n out: string;\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\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\nexport type TranslateVerdict =\n | { kind: 'translated'; calls: CadCall[]; reason?: string }\n | { kind: 'baked'; reason: string }\n | { kind: 'preserved-only'; reason: string };\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 'PartDesign::LinearPattern',\n 'PartDesign::PolarPattern',\n 'PartDesign::Fillet',\n 'PartDesign::Chamfer',\n // M13.1 (probed on real corpus — scripts/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]);\n\nexport function isWhitelisted(type: string): boolean {\n return WHITELIST.has(type);\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 */\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 return bindings.find((b) => norm(b.path) === name);\n}\n\n/** M11.2: true when `name` has a binding that is NOT a constant expression. */\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\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::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 */\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/** Placement position (Px/Py/Pz) of an object. */\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 * 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 */\nexport function translateObject(\n obj: FcstdObject,\n inputVar: (depName: string) => string | undefined,\n docObjects?: readonly FcstdObject[],\n): TranslateVerdict {\n if (!isWhitelisted(obj.type)) {\n return { kind: 'baked', reason: `type-not-whitelisted: ${obj.type}` };\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 return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.group', source: obj.name, inputs: vars as string[],\n 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::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::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 const baseVar = base ? inputVar(base) : undefined;\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') {\n return { kind: 'baked', reason: `pocket-type-${ftype}-unsupported` };\n }\n if (midplane) return { kind: 'baked', reason: 'pocket-midplane-unsupported' };\n // Pocket cuts INTO the material: extrude the profile opposite the normal\n // (or along it when Reversed), then subtract from base.\n const signed = reversed ? len : -len;\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 len = propNum(obj, 'Length') ?? 0;\n const dir = propVec(obj, 'Dir') ?? [0, 0, 1];\n const reversed = propBool(obj, 'Reverse');\n const vec: [number, number, number] = [dir[0] * len, dir[1] * len, dir[2] * len];\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 * vec[0], s * vec[1], s * vec[2]]], params: {},\n }],\n };\n }\n case 'PartDesign::Revolution': {\n const profile = profileLink(obj);\n const profileVar = profile ? inputVar(profile) : undefined;\n if (!profileVar) return { kind: 'baked', reason: 'revolution-missing-profile' };\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::LinearPattern': {\n const source = propLink(obj, 'Source');\n const sourceVar = source ? inputVar(source) : 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 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 case 'PartDesign::PolarPattern': {\n const source = propLink(obj, 'Source');\n const sourceVar = source ? inputVar(source) : 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 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/fcstd/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, type ExpressionBinding } from './expressions.js';\nimport { placementOf, quatToMatrix } from './placement.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\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/** 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 '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]);\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 return bindings.find((b) => norm(b.path) === name);\n}\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::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 * 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 * @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): TranslateVerdict {\n if (!isWhitelisted(obj.type)) {\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 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 return {\n kind: 'translated',\n calls: [{\n out, op: 'cad.group', source: obj.name, inputs: vars as string[],\n 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::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::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 const baseVar = base ? inputVar(base) : undefined;\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') {\n return { kind: 'baked', reason: `pocket-type-${ftype}-unsupported` };\n }\n if (midplane) return { kind: 'baked', reason: 'pocket-midplane-unsupported' };\n // Pocket cuts INTO the material: extrude the profile opposite the normal\n // (or along it when Reversed), then subtract from base.\n const signed = reversed ? len : -len;\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 len = propNum(obj, 'Length') ?? 0;\n const dir = propVec(obj, 'Dir') ?? [0, 0, 1];\n const reversed = propBool(obj, 'Reverse');\n const vec: [number, number, number] = [dir[0] * len, dir[1] * len, dir[2] * len];\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 * vec[0], s * vec[1], s * vec[2]]], params: {},\n }],\n };\n }\n case 'PartDesign::Revolution': {\n const profile = profileLink(obj);\n const profileVar = profile ? inputVar(profile) : undefined;\n if (!profileVar) return { kind: 'baked', reason: 'revolution-missing-profile' };\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::LinearPattern': {\n const source = propLink(obj, 'Source');\n const sourceVar = source ? inputVar(source) : 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 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 case 'PartDesign::PolarPattern': {\n const source = propLink(obj, 'Source');\n const sourceVar = source ? inputVar(source) : 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 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"]}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * FCStd read layer (public surface, `@faicad/faijs/fcstd`).
3
+ *
4
+ * Unpacks an .FCStd container and parses `Document.xml` into the object graph,
5
+ * plus the sketch/constraint/expression parse helpers built on top of it. This
6
+ * is the reading half of FCStd support: consumers that inspect documents
7
+ * (profiling, coverage reports, migration tooling) use this entry instead of
8
+ * re-implementing the XML layout.
9
+ *
10
+ * The conversion pipeline (`./convert.js` → `.fai.zip`) is deliberately NOT
11
+ * re-exported here: it pulls the planegcs solver and the occt kernel, which are
12
+ * development/peer dependencies, so importing it would drag a solver into every
13
+ * consumer of the read layer. Conversion is exposed separately.
14
+ */
15
+ export { unpackFcstd, memberText } from './unpack.js';
16
+ export type { FcstdArchive, FcstdMember, UnpackError } from './unpack.js';
17
+ export { parseDocumentXml } from './document.js';
18
+ export type { FcstdDocument, FcstdObject, FcstdProperty, ParseError } from './document.js';
19
+ export { parseSketchObject, parseGeometryList, parseConstraintList, CONSTRAINT_NAMES } from './sketch-parse.js';
20
+ export type { ConstraintType, GeoId, GeoRef, PointPos, SketchCon, SketchGeom, ParsedSketch } from './sketch-parse.js';
21
+ export { parseExpressionEngine } from './expressions.js';
22
+ export type { ExpressionBinding } from './expressions.js';
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fcstd/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAChH,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtH,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * FCStd read layer (public surface, `@faicad/faijs/fcstd`).
3
+ *
4
+ * Unpacks an .FCStd container and parses `Document.xml` into the object graph,
5
+ * plus the sketch/constraint/expression parse helpers built on top of it. This
6
+ * is the reading half of FCStd support: consumers that inspect documents
7
+ * (profiling, coverage reports, migration tooling) use this entry instead of
8
+ * re-implementing the XML layout.
9
+ *
10
+ * The conversion pipeline (`./convert.js` → `.fai.zip`) is deliberately NOT
11
+ * re-exported here: it pulls the planegcs solver and the occt kernel, which are
12
+ * development/peer dependencies, so importing it would drag a solver into every
13
+ * consumer of the read layer. Conversion is exposed separately.
14
+ */
15
+ export { unpackFcstd, memberText } from './unpack.js';
16
+ export { parseDocumentXml } from './document.js';
17
+ export { parseSketchObject, parseGeometryList, parseConstraintList, CONSTRAINT_NAMES } from './sketch-parse.js';
18
+ export { parseExpressionEngine } from './expressions.js';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fcstd/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEhH,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["/**\n * FCStd read layer (public surface, `@faicad/faijs/fcstd`).\n *\n * Unpacks an .FCStd container and parses `Document.xml` into the object graph,\n * plus the sketch/constraint/expression parse helpers built on top of it. This\n * is the reading half of FCStd support: consumers that inspect documents\n * (profiling, coverage reports, migration tooling) use this entry instead of\n * re-implementing the XML layout.\n *\n * The conversion pipeline (`./convert.js` → `.fai.zip`) is deliberately NOT\n * re-exported here: it pulls the planegcs solver and the occt kernel, which are\n * development/peer dependencies, so importing it would drag a solver into every\n * consumer of the read layer. Conversion is exposed separately.\n */\nexport { unpackFcstd, memberText } from './unpack.js';\nexport type { FcstdArchive, FcstdMember, UnpackError } from './unpack.js';\nexport { parseDocumentXml } from './document.js';\nexport type { FcstdDocument, FcstdObject, FcstdProperty, ParseError } from './document.js';\nexport { parseSketchObject, parseGeometryList, parseConstraintList, CONSTRAINT_NAMES } from './sketch-parse.js';\nexport type { ConstraintType, GeoId, GeoRef, PointPos, SketchCon, SketchGeom, ParsedSketch } from './sketch-parse.js';\nexport { parseExpressionEngine } from './expressions.js';\nexport type { ExpressionBinding } from './expressions.js';"]}
@@ -12,35 +12,78 @@
12
12
  * `App::PropertyPlacementSub`-style properties.
13
13
  */
14
14
  import type { FcstdObject } from './document.js';
15
+ /**
16
+ * A placement: translation plus rotation quaternion (x, y, z, w).
17
+ */
15
18
  export interface Placement {
16
19
  /** translation (mm) */
17
20
  p: [number, number, number];
18
21
  /** rotation quaternion (x, y, z, w) */
19
22
  q: [number, number, number, number];
20
23
  }
21
- /** Extract a Placement from a PropertyPlacement element (or missing → identity). */
24
+ /**
25
+ * Extract a Placement from a PropertyPlacement element (or missing → identity).
26
+ *
27
+ * @param prop - the Placement property (App::PropertyPlacement) or undefined.
28
+ * @returns the parsed placement; identity when `prop` is missing.
29
+ */
22
30
  export declare function placementOfProp(prop: FcstdObject['properties'] extends Map<string, infer V> ? V | undefined : never): Placement;
23
- /** Convenience: the object's Placement property (identity when absent). */
31
+ /**
32
+ * Convenience: the object's Placement property (identity when absent).
33
+ *
34
+ * @param obj - the FCStd object to read.
35
+ * @returns the object's placement, or identity when it has none.
36
+ */
24
37
  export declare function placementOf(obj: FcstdObject): Placement;
25
- /** 3×3 row-major rotation matrix from a (x,y,z,w) quaternion. */
38
+ /**
39
+ * 3×3 row-major rotation matrix from a (x,y,z,w) quaternion.
40
+ *
41
+ * @param q - the quaternion in (x, y, z, w) order.
42
+ * @returns the 3×3 row-major rotation matrix (9 entries).
43
+ * @throws when the quaternion has a zero/non-finite norm.
44
+ */
26
45
  export declare function quatToMatrix(q: [number, number, number, number]): number[];
27
- /** Apply placement (rotate then translate) to a point. */
46
+ /**
47
+ * Apply placement (rotate then translate) to a point.
48
+ *
49
+ * @param pl - the placement to apply.
50
+ * @param w - the world-space input point (mm).
51
+ * @returns the transformed point (mm).
52
+ */
28
53
  export declare function applyPlacement(pl: Placement, w: [number, number, number]): [number, number, number];
29
- /** Apply the inverse placement (translate back, rotate by conjugate). */
54
+ /**
55
+ * Apply the inverse placement (translate back, rotate by conjugate).
56
+ *
57
+ * @param pl - the placement whose inverse is applied.
58
+ * @param w - the world-space input point (mm).
59
+ * @returns the point mapped into the placement-local frame (mm).
60
+ */
30
61
  export declare function invertApplyPlacement(pl: Placement, w: [number, number, number]): [number, number, number];
31
62
  /**
32
63
  * M8.3 — quaternion → XYZ euler angles in DEGREES, matching the convention of
33
64
  * `rotateBrep` (brep/brep-ops.ts): THREE.Euler(order 'XYZ'), i.e. the rotation
34
65
  * matrix is RX·RY·RZ (column vectors; Z applied first). Pinned against THREE
35
66
  * itself in placement.test.ts — not from memory.
67
+ *
68
+ * @param q - the quaternion in (x, y, z, w) order.
69
+ * @returns (x, y, z) euler angles in degrees.
36
70
  */
37
71
  export declare function quatToEulerXYZDeg(q: [number, number, number, number]): [number, number, number];
38
- /** True when the placement is (approximately) the identity — no transform needed. */
72
+ /**
73
+ * True when the placement is (approximately) the identity — no transform needed.
74
+ *
75
+ * @param pl - the placement to test.
76
+ * @param eps - tolerance for both translation and quaternion components.
77
+ * @returns true when the placement is within `eps` of identity.
78
+ */
39
79
  export declare function isIdentityPlacement(pl: Placement, eps?: number): boolean;
40
80
  /**
41
81
  * M8.3 — orthonormal sketch-plane basis (u, v) from the placement rotation:
42
82
  * u = rotated X axis, v = rotated Y axis, normal = rotated Z. Points on the
43
83
  * sketch plane (z≈0 in local coords) map to global as p·u + q·v.
84
+ *
85
+ * @param pl - the placement whose rotation defines the plane.
86
+ * @returns the rotated X axis (u), Y axis (v) and plane normal (n).
44
87
  */
45
88
  export declare function planeBasis(pl: Placement): {
46
89
  u: [number, number, number];
@@ -1 +1 @@
1
- {"version":3,"file":"placement.d.ts","sourceRoot":"","sources":["../../src/fcstd/placement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,SAAS;IACxB,uBAAuB;IACvB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,uCAAuC;IACvC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,YAAY,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAO/H;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,CAEvD;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAW1E;AAED,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAInG;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAIzG;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAa/F;AAED,qFAAqF;AACrF,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,SAAO,GAAG,OAAO,CAMtE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,SAAS,GAAG;IAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAKnI"}
1
+ {"version":3,"file":"placement.d.ts","sourceRoot":"","sources":["../../src/fcstd/placement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,uBAAuB;IACvB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,uCAAuC;IACvC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,YAAY,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAO/H;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,CAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAW1E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAInG;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAIzG;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAa/F;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,SAAO,GAAG,OAAO,CAMtE;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,SAAS,GAAG;IAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAKnI"}
@@ -1,4 +1,9 @@
1
- /** Extract a Placement from a PropertyPlacement element (or missing → identity). */
1
+ /**
2
+ * Extract a Placement from a PropertyPlacement element (or missing → identity).
3
+ *
4
+ * @param prop - the Placement property (App::PropertyPlacement) or undefined.
5
+ * @returns the parsed placement; identity when `prop` is missing.
6
+ */
2
7
  export function placementOfProp(prop) {
3
8
  const el = prop?.children[0];
4
9
  const a = el?.attributes ?? {};
@@ -7,11 +12,22 @@ export function placementOfProp(prop) {
7
12
  q: [Number(a['Q0'] ?? 0), Number(a['Q1'] ?? 0), Number(a['Q2'] ?? 0), Number(a['Q3'] ?? 1)],
8
13
  };
9
14
  }
10
- /** Convenience: the object's Placement property (identity when absent). */
15
+ /**
16
+ * Convenience: the object's Placement property (identity when absent).
17
+ *
18
+ * @param obj - the FCStd object to read.
19
+ * @returns the object's placement, or identity when it has none.
20
+ */
11
21
  export function placementOf(obj) {
12
22
  return placementOfProp(obj.properties.get('Placement'));
13
23
  }
14
- /** 3×3 row-major rotation matrix from a (x,y,z,w) quaternion. */
24
+ /**
25
+ * 3×3 row-major rotation matrix from a (x,y,z,w) quaternion.
26
+ *
27
+ * @param q - the quaternion in (x, y, z, w) order.
28
+ * @returns the 3×3 row-major rotation matrix (9 entries).
29
+ * @throws when the quaternion has a zero/non-finite norm.
30
+ */
15
31
  export function quatToMatrix(q) {
16
32
  const [x, y, z, w] = q;
17
33
  const n = Math.hypot(x, y, z, w);
@@ -25,13 +41,25 @@ export function quatToMatrix(q) {
25
41
  s * (nx * nz - nw * ny), s * (ny * nz + nw * nx), 1 - s * (nx * nx + ny * ny),
26
42
  ];
27
43
  }
28
- /** Apply placement (rotate then translate) to a point. */
44
+ /**
45
+ * Apply placement (rotate then translate) to a point.
46
+ *
47
+ * @param pl - the placement to apply.
48
+ * @param w - the world-space input point (mm).
49
+ * @returns the transformed point (mm).
50
+ */
29
51
  export function applyPlacement(pl, w) {
30
52
  const m = quatToMatrix(pl.q);
31
53
  const r = (i) => m[i * 3] * w[0] + m[i * 3 + 1] * w[1] + m[i * 3 + 2] * w[2];
32
54
  return [r(0) + pl.p[0], r(1) + pl.p[1], r(2) + pl.p[2]];
33
55
  }
34
- /** Apply the inverse placement (translate back, rotate by conjugate). */
56
+ /**
57
+ * Apply the inverse placement (translate back, rotate by conjugate).
58
+ *
59
+ * @param pl - the placement whose inverse is applied.
60
+ * @param w - the world-space input point (mm).
61
+ * @returns the point mapped into the placement-local frame (mm).
62
+ */
35
63
  export function invertApplyPlacement(pl, w) {
36
64
  const d = [w[0] - pl.p[0], w[1] - pl.p[1], w[2] - pl.p[2]];
37
65
  const inv = { p: [0, 0, 0], q: [-pl.q[0], -pl.q[1], -pl.q[2], pl.q[3]] };
@@ -42,6 +70,9 @@ export function invertApplyPlacement(pl, w) {
42
70
  * `rotateBrep` (brep/brep-ops.ts): THREE.Euler(order 'XYZ'), i.e. the rotation
43
71
  * matrix is RX·RY·RZ (column vectors; Z applied first). Pinned against THREE
44
72
  * itself in placement.test.ts — not from memory.
73
+ *
74
+ * @param q - the quaternion in (x, y, z, w) order.
75
+ * @returns (x, y, z) euler angles in degrees.
45
76
  */
46
77
  export function quatToEulerXYZDeg(q) {
47
78
  const m = quatToMatrix(q);
@@ -57,7 +88,13 @@ export function quatToEulerXYZDeg(q) {
57
88
  const x = Math.atan2(m[3], m[4]);
58
89
  return [(x * 180) / Math.PI, (y * 180) / Math.PI, 0];
59
90
  }
60
- /** True when the placement is (approximately) the identity — no transform needed. */
91
+ /**
92
+ * True when the placement is (approximately) the identity — no transform needed.
93
+ *
94
+ * @param pl - the placement to test.
95
+ * @param eps - tolerance for both translation and quaternion components.
96
+ * @returns true when the placement is within `eps` of identity.
97
+ */
61
98
  export function isIdentityPlacement(pl, eps = 1e-9) {
62
99
  return (Math.abs(pl.p[0]) < eps && Math.abs(pl.p[1]) < eps && Math.abs(pl.p[2]) < eps &&
63
100
  Math.abs(pl.q[0]) < eps && Math.abs(pl.q[1]) < eps && Math.abs(pl.q[2]) < eps &&
@@ -67,6 +104,9 @@ export function isIdentityPlacement(pl, eps = 1e-9) {
67
104
  * M8.3 — orthonormal sketch-plane basis (u, v) from the placement rotation:
68
105
  * u = rotated X axis, v = rotated Y axis, normal = rotated Z. Points on the
69
106
  * sketch plane (z≈0 in local coords) map to global as p·u + q·v.
107
+ *
108
+ * @param pl - the placement whose rotation defines the plane.
109
+ * @returns the rotated X axis (u), Y axis (v) and plane normal (n).
70
110
  */
71
111
  export function planeBasis(pl) {
72
112
  const m = quatToMatrix(pl.q);