@faicad/cq-compat 0.13.1 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.d.ts +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +8 -1
- package/dist/browser.js.map +1 -1
- package/dist/gear-test-harness.d.ts.map +1 -1
- package/dist/gear-test-harness.js +9 -12
- package/dist/gear-test-harness.js.map +1 -1
- package/dist/index.d.ts +5 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -4
- package/dist/index.js.map +1 -1
- package/dist/sketch.d.ts +209 -0
- package/dist/sketch.d.ts.map +1 -0
- package/dist/sketch.js +529 -0
- package/dist/sketch.js.map +1 -0
- package/dist/workplane.d.ts +47 -0
- package/dist/workplane.d.ts.map +1 -1
- package/dist/workplane.js +424 -5
- package/dist/workplane.js.map +1 -1
- package/package.json +3 -2
package/dist/workplane.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workplane.js","sourceRoot":"","sources":["../src/workplane.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @faicad/cq-compat — CadQuery API compatibility layer for faijs.\n *\n * Implements a Workplane carrier (geometry hidden in .shape) and\n * CadQuery-style methods. All methods are async and return a new Workplane\n * (immutable updates). The carrier uses a custom prototype so compatOp's\n * `borrowDeep` does not traverse its fields when the library is auto-lifted.\n *\n * Design doc: docs/plans/2026-09-06-cadquery-compat-and-multifile-faijs.md\n */\n\nimport { createApiNamespace } from '@faicad/faijs/api/api-namespace'\nimport { brepjsCompat } from '@faicad/faijs/api'\nimport { borrowBrepjsShape, adoptBrepjsProduct } from '@faicad/faijs/api/internal/l3-bridge'\nimport { fromHandle } from '@faicad/faijs/sdk'\nimport { brepOf, isShape } from '@faicad/faijs/shape'\nimport { getKernel } from '@faicad/faijs/occt-kernel/occtKernel'\nimport type { OcctKernel, ShapeHandle } from 'occt-wasm'\nimport type { Shape } from '@faicad/faijs/mesh/types'\n\n// ── cad namespace singleton (created once at module load) ──────────────────\nconst cad = createApiNamespace() as Record<string, (...args: unknown[]) => Promise<Shape>>\n\n// ── compatOp 提升边界归一(GOTCHA:borrowDeep 把实参 Shape 换成借用视图)──\n//\n// 当 cq-compat 命名空间被 registerLib 提升(无 dual-op → autoLift=true)时,\n// 每个裸导出函数的实参先经 borrowDeep:faijs Shape → 借用 brepjs 视图\n// `{ wrapped, disposed, delete, onDispose }`(`isShape=false`、`brepOf=undefined`)。\n// 直接调用(测试进程内)拿到的则是真实 Shape。两个形态都必须能消费:\n//\n// asBrepShape(v) —\n// - 真实 Shape → 原样返回;\n// - 借用视图(有 `.wrapped`)→ 提取原始 OCCT 句柄,fromHandle 还原为真实\n// Shape(mesh 三角化 + BREP 身份槽登记,brepOf 可恢复),按视图对象缓存\n// (同句柄多次调用不重复三角化);\n// - 其余 → 原样返回(调用方自行判空/报错)。\n//\n// 所有权:归一出的新 Shape 与原 part Shape 的 slot 指向同一 OCCT 句柄,但 slot\n// 按 Shape 对象各自持有(fromBrep 写的是新 Shape 的 slot),无共享释放路径——\n// 与 vendored 投影的 adoptBrepjsProduct 收编模式同构,不引入双重释放。\n// 视图 `.wrapped` 是 OcctWasmHandle 对象({ id, type, __occtWasm }),内核只收\n// 数字 id → 解包方式与 l3-bridge.adoptBrepjsProduct 一致(`'id' in wrapped` 分支)。\nconst borrowedShapeCache = new WeakMap<object, Shape>()\n\n/**\n * 把可能是借用视图的几何输入归一为真实 faijs Shape(见上方注释)。\n * @param v 真实 Shape、借用视图(`{ wrapped }`)或其他原样透传的输入。\n * @returns 真实 faijs `Shape`(借用视图经 `fromHandle` 还原并缓存)。\n */\nexport function asBrepShape(v: unknown): Shape {\n if (isShape(v)) return v as Shape\n if (v !== null && typeof v === 'object' && 'wrapped' in v) {\n const view = v as { wrapped: unknown }\n const hit = borrowedShapeCache.get(view)\n if (hit) return hit\n const wrappedAny = view.wrapped\n const handle =\n typeof wrappedAny === 'object' && wrappedAny !== null && 'id' in wrappedAny\n ? (wrappedAny as { id: number }).id\n : wrappedAny\n const s = fromHandle(handle) as Shape\n borrowedShapeCache.set(view, s)\n return s\n }\n return v as Shape\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\n/** RGB color (sRGB 0..1). */\nexport type RGB = [number, number, number]\n\n/**\n * A pending 2D profile wire (CadQuery `ctx.pendingWires` analogue).\n *\n * Upstream keeps a LIST of wires, and `extrude()` turns them into one face per\n * outermost wire with the enclosed wires punched as holes — verified against\n * cadquery 2.8.0 (two columns per pushPoint, and a plate with four holes):\n *\n * `circle(4).circle(2).extrude(4)` -> annulus, vol 150.796\n * `pushPoints([p1,p2]).circle(4).circle(2)` -> TWO annuli (2 solids)\n * `rect(2,2).rect(1.3,1.3,fc).vertices()`\n * `.circle(0.125).extrude(0.5)` -> ONE plate, vol 1.901825\n *\n * `cx`/`cy` are workplane-LOCAL coordinates (a wire created under `pushPoints`\n * or after `vertices()` is already positioned at its point). `group` is the\n * index of the point it was created at, kept only for diagnostics.\n */\n/** Snapshot of the plane a pending wire was created on (world coordinates). */\nexport interface WirePlane {\n origin: [number, number, number]\n xDir: [number, number, number]\n yDir: [number, number, number]\n normal: [number, number, number]\n}\n\n/**\n * A 2D profile wire queued on a Workplane until a solid op (extrude / revolve /\n * loft / …) consumes it. Every variant records its local 2D placement plus a\n * snapshot of the creation plane, so a later `workplane(offset)` or transformed\n * move does not retro-actively relocate wires that are already queued.\n */\nexport type PendingWire =\n | { kind: 'rect'; w: number; d: number; cx: number; cy: number; construction: boolean; plane?: WirePlane }\n | { kind: 'circle'; radius: number; cx: number; cy: number; construction: boolean; plane?: WirePlane }\n | {\n kind: 'ellipse'\n majorRadius: number\n minorRadius: number\n cx: number\n cy: number\n construction: boolean\n plane?: WirePlane\n /** True when the caller's y_radius exceeds x_radius (see {@link ellipse}). */\n flip?: boolean\n }\n | { kind: 'polygon'; n: number; d: number; cx: number; cy: number; construction: boolean; plane?: WirePlane }\n /** Open/closed ring produced by moveTo/lineTo/arcs/polyline + close()/wire(). */\n | { kind: 'path'; pts: [number, number][]; edges?: PendingEdge[]; construction: boolean; plane?: WirePlane }\n\n/**\n * One drafted 2D edge, in workplane-LOCAL coordinates — the CadQuery\n * `ctx.pendingEdges` analogue. All descriptors keep `from`/`to` so generic\n * consumers (vertex ring, close()) can treat every kind uniformly.\n */\nexport type PendingEdge =\n | { kind: 'line'; from: [number, number]; to: [number, number] }\n | { kind: 'arc3'; from: [number, number]; mid: [number, number]; to: [number, number] }\n | { kind: 'tangentArc'; from: [number, number]; tgt: [number, number]; to: [number, number] }\n | { kind: 'spline'; from: [number, number]; pts: [number, number][]; to: [number, number]; endTgt?: [number, number]; builtEdge?: unknown }\n\n/**\n * Workplane carrier — object with a custom prototype so compatOp's\n * `borrowDeep` does NOT traverse its fields (it only walks objects whose\n * prototype === Object.prototype). This prevents .shape from being replaced\n * by a borrowed brepjs view when the library is auto-lifted.\n */\nexport interface Workplane {\n __cq: true\n /** Plane name: \"XY\" | \"XZ\" | \"YZ\". */\n plane: string\n /** Workplane origin in world coordinates. */\n origin: [number, number, number]\n /** Workplane normal (unit vector, local +Z). */\n normal: [number, number, number]\n /** Workplane local +X in world coordinates (CadQuery Plane.xDir convention). */\n xDir: [number, number, number]\n /** Workplane local +Y in world coordinates (= normal × xDir). */\n yDir: [number, number, number]\n /** Current geometry (faijs Shape), or null for empty workplane. */\n shape: Shape | null\n /** Pending face selector (e.g. \">Z\", \"<X\"). Set by .faces(). */\n faceSel: string | null\n /** Pending edge selector (e.g. \"|Z\", \"\"). Set by .edges(). */\n edgeSel: string | null\n /** Pending vertex selector. Set by .vertices(). */\n vertexSel: string | null\n /** Accumulated pushPoints (2D offsets in workplane coords). */\n pts: [number, number][]\n /** Edge midpoints for construction rect (set by .edges()). */\n edgePts?: [number, number][]\n /** forConstruction flag — next rect/circle is construction geometry. */\n forConstruction: boolean\n /** Pending 2D rect profile (set by .rect(), consumed by .extrude()/.cutBlind()). */\n pendingRect?: { w: number; d: number }\n /** Pending 2D circle profile (set by .circle(), consumed by .extrude()/.cutBlind()). */\n pendingCircle?: { radius: number }\n /** Pending regular polygon profile (set by .polygon(), consumed by .extrude()/.cutBlind()). */\n pendingPolygon?: { n: number; d: number }\n /**\n * Pending 2D profile wires — the CadQuery `pendingWires` LIST.\n * `rect`/`circle`/`polygon` APPEND; `extrude` consumes. The single-slot\n * fields above are kept for the (single-wire) legacy path.\n */\n pendingWires?: PendingWire[]\n /**\n * Drafted 2D edges waiting to be combined into a wire — CadQuery\n * `ctx.pendingEdges`. Consumed by `wire()` / `close()`.\n */\n pendingEdges?: PendingEdge[]\n /**\n * Current drawing point in local coords — end of the last drafted edge, or\n * the plane origin when nothing has been drawn yet (upstream\n * `_findFromPoint`: last stack object, else `plane.origin`).\n */\n currentPoint?: [number, number]\n /**\n * First point of the wire currently being drafted, local coords — CadQuery\n * `ctx.firstPoint`. Set by the first non-construction edge, cleared by\n * `close()`.\n */\n firstPoint?: [number, number]\n /** Optional color (sRGB 0..1) for this part. */\n color?: RGB\n}\n\n/** Custom prototype — borrowDeep skips objects with non-Object prototype. */\nconst WP_PROTO = { __isCqWorkplane: true }\n\n// ── Internal helpers ───────────────────────────────────────────────────────\n\nfunction vadd(a: [number, number, number], b: [number, number, number]): [number, number, number] {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]]\n}\n\nfunction vscale(a: [number, number, number], s: number): [number, number, number] {\n return [a[0] * s, a[1] * s, a[2] * s]\n}\n\nfunction vdot(a: [number, number, number], b: [number, number, number]): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n}\n\nfunction vsub(a: [number, number, number], b: [number, number, number]): [number, number, number] {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2]]\n}\n\n/**\n * Local → world mapping for axis-aligned workplane normals, verified against\n * installed CadQuery 2.8.0 (`faces(sel).workplane(...).plane.xDir`):\n *\n * normal +Z → xDir +X, yDir +Y normal -Z → xDir +X, yDir -Y\n * normal +Y → xDir -X, yDir +Z normal -Y → xDir +X, yDir +Z\n * normal +X → xDir +Y, yDir +Z normal -X → xDir -Y, yDir +Z\n */\nconst FACE_AXES: Record<string, { x: [number, number, number]; y: [number, number, number] }> = {\n '0,0,1': { x: [1, 0, 0], y: [0, 1, 0] },\n '0,0,-1': { x: [1, 0, 0], y: [0, -1, 0] },\n '0,1,0': { x: [-1, 0, 0], y: [0, 0, 1] },\n '0,-1,0': { x: [1, 0, 0], y: [0, 0, 1] },\n '1,0,0': { x: [0, 1, 0], y: [0, 0, 1] },\n '-1,0,0': { x: [0, -1, 0], y: [0, 0, 1] },\n}\n\n/** Get the local axes for an axis-aligned normal (throws for arbitrary normals). */\nfunction faceAxes(normal: [number, number, number]): { x: [number, number, number]; y: [number, number, number] } {\n const key = `${normal[0]},${normal[1]},${normal[2]}`\n const axes = FACE_AXES[key]\n if (!axes) {\n throw new Error(`[cq-compat] unsupported workplane normal ${key} (axis-aligned only)`)\n }\n return axes\n}\n\n/** Map workplane-local (px, py) offsets to world coordinates. */\nfunction localToWorld(\n wp: Pick<Workplane, 'origin' | 'xDir' | 'yDir'>,\n px: number,\n py: number,\n): [number, number, number] {\n return vadd(wp.origin, vadd(vscale(wp.xDir, px), vscale(wp.yDir, py)))\n}\n\n/**\n * Reference points for eachpoint-style ops (box/sphere/cylinder/rect/circle/\n * polygon). Upstream positions each new object at whatever sits on the stack:\n * pushPoints() points win, otherwise the CURRENT DRAFTING POINT set by\n * moveTo/move (e.g. `workplane.rect(1,1).extrude(2).moveTo(0,2).rect(1,1)` —\n * `Workplane.testGlue`), otherwise the plane origin.\n */\nfunction eachPoints(wp: Workplane): [number, number][] {\n if (Array.isArray(wp.pts) && wp.pts.length > 0) return wp.pts\n if (wp.currentPoint) return [wp.currentPoint]\n return [[0, 0]] as [number, number][]\n}\n\n/** Snapshot the current plane so a pending wire survives later workplane() moves. */\nfunction planeOf(wp: Pick<Workplane, 'origin' | 'xDir' | 'yDir' | 'normal'>): WirePlane {\n return {\n origin: [...wp.origin] as [number, number, number],\n xDir: [...wp.xDir] as [number, number, number],\n yDir: [...wp.yDir] as [number, number, number],\n normal: [...wp.normal] as [number, number, number],\n }\n}\n\n/** Create an empty workplane on the given plane (CadQuery named-plane axes). */\nfunction makeWorkplane(plane: string): Workplane {\n // Full named-plane table verified against cadquery 2.8.0 (Plane.named):\n // 'front' == XY, 'bottom' == XZ, etc. The old 3-entry table silently fell\n // back to XY for any other name — e.g. \"front\"→XY was luck, but \"top\" would\n // have been wrong. Unknown names now throw like upstream.\n const axes: Record<string, { n: [number, number, number]; x: [number, number, number] }> = {\n XY: { n: [0, 0, 1], x: [1, 0, 0] },\n YZ: { n: [1, 0, 0], x: [0, 1, 0] },\n ZX: { n: [0, 1, 0], x: [0, 0, 1] },\n XZ: { n: [0, -1, 0], x: [1, 0, 0] },\n YX: { n: [0, 0, -1], x: [0, 1, 0] },\n ZY: { n: [-1, 0, 0], x: [0, 0, 1] },\n front: { n: [0, 0, 1], x: [1, 0, 0] },\n back: { n: [0, 0, -1], x: [-1, 0, 0] },\n left: { n: [-1, 0, 0], x: [0, 0, 1] },\n right: { n: [1, 0, 0], x: [0, 0, -1] },\n top: { n: [0, 1, 0], x: [1, 0, 0] },\n bottom: { n: [0, -1, 0], x: [1, 0, 0] },\n }\n const a = axes[plane]\n if (!a) {\n throw new Error(`[cq-compat] unknown plane \"${plane}\" (upstream names: XY/YZ/ZX/XZ/YX/ZY/front/back/left/right/top/bottom)`)\n }\n const yDir: [number, number, number] = [\n a.n[1] * a.x[2] - a.n[2] * a.x[1],\n a.n[2] * a.x[0] - a.n[0] * a.x[2],\n a.n[0] * a.x[1] - a.n[1] * a.x[0],\n ]\n return Object.assign(Object.create(WP_PROTO), {\n __cq: true as const,\n plane,\n origin: [0, 0, 0] as [number, number, number],\n normal: a.n,\n xDir: a.x,\n yDir,\n shape: null,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [] as [number, number][],\n forConstruction: false,\n }) as Workplane\n}\n\n/** Clone a workplane with overrides (preserves custom prototype). */\nfunction clone(wp: Workplane, overrides: Partial<Workplane>): Workplane {\n return Object.assign(Object.create(WP_PROTO), wp, overrides) as Workplane\n}\n\n/**\n * Unwrap a vendored brepjs `Result` into its value, throwing on `Err`.\n *\n * The vendored boolean ops return `Result<T>` (`{ ok: true, value }` /\n * `{ ok: false, error }`). Silently swallowing an `Err` here would leave the\n * workplane carrying stale geometry, so failures must surface.\n */\nfunction unwrapBrepResult(result: unknown): unknown {\n if (result && typeof result === 'object' && 'ok' in result) {\n const r = result as { ok: boolean; value?: unknown; error?: unknown }\n if (!r.ok) {\n const detail =\n typeof r.error === 'string'\n ? r.error\n : JSON.stringify(r.error, (_k, v) => (typeof v === 'bigint' ? String(v) : v)) ??\n String(r.error)\n throw new Error(`[cq-compat] brep boolean op failed: ${detail}`)\n }\n return r.value\n }\n return result\n}\n\n/** Call a `brepjsCompat` member by name (namespace is typed loosely here). */\nfunction compatFn(name: string): (...args: unknown[]) => unknown {\n const fn = (brepjsCompat as Record<string, unknown>)[name] as\n | ((...args: unknown[]) => unknown)\n | undefined\n if (!fn) throw new Error(`[cq-compat] brepjsCompat.${name} is not available`)\n return fn\n}\n\n/** Merge same-domain faces/edges after a boolean (CadQuery `clean=True`). */\nasync function cleanShapes(shape: Shape): Promise<Shape> {\n const simplified = unwrapBrepResult(compatFn('simplify')(borrowBrepjsShape(shape)))\n return adoptBrepjsProduct(simplified)\n}\n\n/**\n * Fuse two shapes into ONE solid via the vendored brepjs fuse.\n *\n * Rationale: `cad.union` (defineOp → booleanBrep → fromBrep repack) has been\n * observed to return a compound of two disjoint solids instead of a fused\n * single solid (see docs/analysis/2026-09-08-cq-compat-union-compound-bug.md).\n * The vendored `fuse` preserves the first operand's solid type, so the result\n * stays a single solid. See docs/analysis/2026-09-08-cq-compat-union-compound-bug.md.\n */\nasync function fuseShapes(a: Shape, b: Shape, clean: boolean = true): Promise<Shape> {\n const product = unwrapBrepResult(compatFn('fuse')(borrowBrepjsShape(a), borrowBrepjsShape(b)))\n const fused = adoptBrepjsProduct(product)\n // CadQuery ops take a `clean` flag (default True); clean=False preserves the\n // boolean splitter faces (verified vs 2.8.0: testNoClean wedge vol 10.650718\n // vs testClean 9.079922 — the kernel unify pass is NOT volume-preserving).\n return clean ? cleanShapes(fused) : fused\n}\n\n/** Cut a tool shape out of a base shape via the vendored brepjs cut. */\nasync function cutShapes(base: Shape, tool: Shape): Promise<Shape> {\n const product = unwrapBrepResult(compatFn('cut')(borrowBrepjsShape(base), borrowBrepjsShape(tool)))\n return cleanShapes(adoptBrepjsProduct(product))\n}\n\n/** Intersect two shapes via the vendored brepjs intersect. */\nasync function intersectShapes(a: Shape, b: Shape): Promise<Shape> {\n const product = unwrapBrepResult(compatFn('intersect')(borrowBrepjsShape(a), borrowBrepjsShape(b)))\n return cleanShapes(adoptBrepjsProduct(product))\n}\n\n/** Get bbox max of a shape (via cad.bboxMax — synchronous). */\nfunction bboxMax(shape: Shape): [number, number, number] {\n return cad.bboxMax(shape) as unknown as [number, number, number]\n}\n\n/** Get bbox min of a shape. */\nfunction bboxMin(shape: Shape): [number, number, number] {\n return cad.bboxMin(shape) as unknown as [number, number, number]\n}\n\n/**\n * Resolve a face selector to a world-space point (face center) and normal.\n *\n * CadQuery semantics: `faces(\">Z\")` selects the face(s) at the extreme of the\n * axis, and `workplane()` places the origin at the selected face's center —\n * `centerOption: \"CenterOfMass\"` (default) uses the face's surface centroid,\n * `\"CenterOfBoundBox\"` uses the face's bounding-box center.\n *\n * Supported forms: \">Z\", \"<Z\", \">X\", \"<X\", \">Y\", \"<Y\", \"+Z\"/\"-Z\" aliases, each\n * with an optional CadQuery-style index suffix like \">Z[-2]\". The six CadQuery\n * named views (\"front\"/\"back\"/\"left\"/\"right\"/\"top\"/\"bottom\") are accepted and\n * normalised to their axis equivalent (front=>\">Z\", back=>\"<Z\", left=>\"<X\",\n * right=>\">X\", top=>\">Y\", bottom=>\"<Y\"). This\n * implementation enumerates the actual BREP faces and picks the one whose\n * bbox-center is the extreme along the selector axis (ties broken by larger\n * surface area, so a main face wins over a small coplanar boss face). When the\n * shape has no BREP handle or the kernel is unavailable, it falls back to the\n * whole-shape bounding-box approximation.\n *\n * Indexed selectors (`\">Z[-2]\"`) follow CadQuery's DirectionMinMaxSelector\n * indexing, verified against the installed cadquery 2.8.0: `\">A[k]\"` lists all\n * faces ASCENDING along axis A (`[0]` = lowest, `[-1]` = highest); `\"<A[k]\"`\n * lists them DESCENDING (`[0]` = highest). The picked face's normal is the\n * outward direction (away from the shape bbox center).\n *\n * @param shape - Shape whose BREP faces are enumerated for selection.\n * @param sel - Selector string, e.g. \">Z\", \"<X\", \">Z[-2]\", or a named view\n * (\"front\"/\"back\"/\"left\"/\"right\"/\"top\"/\"bottom\").\n * @param centerOption - Optional center computation option forwarded to the\n * face-center evaluation.\n * @returns Promise resolving to the selected face's center point and outward\n * normal.\n */\n/**\n * CadQuery named views → axis selector (cadquery/selectors.py:687-694).\n * Verified against installed cadquery 2.8.0 by evaluating\n * `Workplane().rect(1,1).extrude(1).faces(n).val()` for each name.\n */\nconst NAMED_VIEW_TO_AXIS: Record<string, string> = {\n front: '>Z',\n back: '<Z',\n left: '<X',\n right: '>X',\n top: '>Y',\n bottom: '<Y',\n}\n\n/**\n * Resolve a CadQuery-style face selector string to the selected face's center\n * point and outward normal.\n *\n * Supported forms: \">Z\", \"<Z\", \">X\", \"<X\", \">Y\", \"<Y\", each with an optional\n * CadQuery-style index suffix like \">Z[-2]\", plus the six named views\n * (\"front\"/\"back\"/\"left\"/\"right\"/\"top\"/\"bottom\") which are aliases for the\n * corresponding axis selectors per cadquery/selectors.py:687-694.\n * @param shape - Shape whose BREP faces are enumerated for selection.\n * @param sel - Selector string, e.g. \">Z\", \"front\", \">Z[-2]\".\n * @param centerOption - Optional center computation option forwarded to the\n * face-center evaluation.\n * @returns Promise resolving to the selected face's center point and outward\n * normal.\n * @throws Error when the selector matches no face or has unknown syntax\n * (never falls back silently).\n */\nexport async function resolveFaceSelector(\n shape: Shape,\n sel: string,\n centerOption?: string,\n): Promise<{ center: [number, number, number]; normal: [number, number, number] }> {\n // compatOp 提升边界:实参可能是借用视图(见 asBrepShape 注释)——归一为真实\n // Shape,否则 brepOf 为 undefined 会落到 bbox 兜底并在 cad.bboxMax 崩溃。\n shape = asBrepShape(shape)\n // CadQuery named views are aliases for an axis DirectionMinMaxSelector\n // (cadquery/selectors.py:687-694):\n // front=>(0,0,1,max) back=>(0,0,1,min) left=>(1,0,0,min)\n // right=>(1,0,0,max) top=>(0,1,0,max) bottom=>(0,1,0,min)\n // Normalise once so every branch below sees a plain axis selector; without\n // this the lookup misses and the whole-shape bbox fallback silently returns\n // the shape centre instead of the face plane (half-a-hole volume error).\n sel = NAMED_VIEW_TO_AXIS[sel.trim().toLowerCase()] ?? sel\n // Strip index suffix like [-2]\n const baseSel = sel.replace(/\\[-?\\d+\\]$/, '')\n const axisDir: Record<string, { axis: 0 | 1 | 2; sign: 1 | -1 }> = {\n '>Z': { axis: 2, sign: 1 }, '+Z': { axis: 2, sign: 1 },\n '<Z': { axis: 2, sign: -1 }, '-Z': { axis: 2, sign: -1 },\n '>X': { axis: 0, sign: 1 }, '+X': { axis: 0, sign: 1 },\n '<X': { axis: 0, sign: -1 }, '-X': { axis: 0, sign: -1 },\n '>Y': { axis: 1, sign: 1 }, '+Y': { axis: 1, sign: 1 },\n '<Y': { axis: 1, sign: -1 }, '-Y': { axis: 1, sign: -1 },\n }\n const normals: Record<string, [number, number, number]> = {\n '>Z': [0, 0, 1], '+Z': [0, 0, 1], '<Z': [0, 0, -1], '-Z': [0, 0, -1],\n '>X': [1, 0, 0], '+X': [1, 0, 0], '<X': [-1, 0, 0], '-X': [-1, 0, 0],\n '>Y': [0, 1, 0], '+Y': [0, 1, 0], '<Y': [0, -1, 0], '-Y': [0, -1, 0],\n }\n const dir = axisDir[baseSel]\n const fallbackNormal = normals[baseSel] ?? ([0, 0, 1] as [number, number, number])\n\n // ── Multi-axis direction selectors (\"+XY\", \">XZ\", \"-YZ\" … cadquery\n // selectors.py:625 axes table XY=(1,1,0) XZ=(1,0,1) YZ=(0,1,1)) ──\n // '+'/'-' → DirectionSelector: only faces whose outward normal is PARALLEL\n // to the (±) direction (angle < 1e-4 rad, selectors.py:234). '>'/'<' →\n // DirectionMinMaxSelector (selectors.py:399): the face whose center of MASS\n // is farthest along the direction. Index suffixes mean DirectionNthSelector\n // there — not supported, throw instead of silently approximating.\n const multi = /^([<>+-])(XY|XZ|YZ)$/.exec(baseSel)\n if (multi) {\n if (/\\[-?\\d+\\]$/.test(sel.trim())) {\n throw new Error(\n `[cq-compat] selector \"${sel}\": indexed multi-axis selectors not supported`,\n )\n }\n const axesTable: Record<string, [number, number, number]> = {\n XY: [1, 1, 0],\n XZ: [1, 0, 1],\n YZ: [0, 1, 1],\n }\n let d = axesTable[multi[2]]\n if (multi[1] === '-') d = [-d[0], -d[1], -d[2]]\n const dLen = Math.hypot(d[0], d[1], d[2])\n const dirV: [number, number, number] = [d[0] / dLen, d[1] / dLen, d[2] / dLen]\n const handleM = brepOf(shape)\n if (!handleM) {\n throw new Error(`[cq-compat] selector \"${sel}\": BREP unavailable`)\n }\n const kernelM = getKernel() as unknown as OcctKernel\n const faceList = kernelM.getSubShapes(handleM as unknown as ShapeHandle, 'face') as unknown as ShapeHandle[]\n if (faceList.length === 0) {\n throw new Error(`[cq-compat] selector \"${sel}\": shape has no faces`)\n }\n const faceNormalOf = (f: ShapeHandle): [number, number, number] => {\n const uv = kernelM.uvBounds(f)\n const n = kernelM.surfaceNormal(f, (uv.uMin + uv.uMax) / 2, (uv.vMin + uv.vMax) / 2)\n return [n.x, n.y, n.z]\n }\n const comOf = (f: ShapeHandle): [number, number, number] => {\n const c = kernelM.getSurfaceCenterOfMass(f)\n return [c.x, c.y, c.z]\n }\n const dot = (a: [number, number, number], b: [number, number, number]): number =>\n a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n\n if (multi[1] === '+' || multi[1] === '-') {\n // DirectionSelector: angle(normal, dir) < 1e-4 rad (selectors.py:235).\n const PAR_TOL = Math.cos(1e-4)\n const found = faceList.find((f) => dot(faceNormalOf(f), dirV) > PAR_TOL)\n if (!found) {\n throw new Error(\n `[cq-compat] selector \"${sel}\": no face with normal parallel to the direction`,\n )\n }\n return { center: comOf(found), normal: faceNormalOf(found) }\n }\n // '>'/'<': DirectionMinMaxSelector over center-of-mass projections.\n let bestF: ShapeHandle | null = null\n let bestVal = 0\n for (const f of faceList) {\n const val = dot(comOf(f), dirV)\n if (!bestF || (multi[1] === '>' ? val > bestVal + 1e-9 : val < bestVal - 1e-9)) {\n bestF = f\n bestVal = val\n }\n }\n return { center: comOf(bestF!), normal: faceNormalOf(bestF!) }\n }\n\n // ── Face-based selection (BREP kernel available) ──\n try {\n const handle = brepOf(shape)\n const kernel = getKernel() as unknown as OcctKernel\n if (handle && dir) {\n const faces = kernel.getSubShapes(handle as unknown as ShapeHandle, 'face') as unknown as ShapeHandle[]\n const cands: { handle: ShapeHandle; center: [number, number, number] }[] = []\n for (const f of faces) {\n const bb = kernel.getBoundingBox(f)\n cands.push({\n handle: f,\n center: [\n (bb.xmin + bb.xmax) / 2,\n (bb.ymin + bb.ymax) / 2,\n (bb.zmin + bb.zmax) / 2,\n ],\n })\n }\n let best: { handle: ShapeHandle; center: [number, number, number] } | null = null\n let normal = fallbackNormal\n // Extract the index suffix, if any.\n const idxMatch = /\\[(-?\\d+)\\]$/.exec(sel.trim())\n if (idxMatch) {\n // CadQuery face indexing (verified vs cadquery 2.8.0):\n // '>A[k]' / '<A[k]' DirectionMinMaxSelector: '>' ascending, '<' descending\n // '+A[k]' / '-A[k]' DirectionSelector: list the extreme face first, then\n // inward — '-' ascending, '+' descending along A\n // (faces(\"-Y\")[1] is the 2nd -Y face from the -Y extreme,\n // NOT the +Y extreme face).\n // Only faces PERPENDICULAR to the axis participate (bbox thin along the axis).\n // For '+'/'-' selectors we additionally keep only faces whose outward normal\n // is parallel to the selector axis with the matching sign (CadQuery filters\n // by exact normal direction), so a boss face and its base sibling don't\n // collide in the index.\n const sc = baseSel[0]\n const isDirSelector = sc === '+' || sc === '-'\n const perp: typeof cands = cands.filter((cd) => {\n const bb = kernel.getBoundingBox(cd.handle)\n const ext = [bb.xmax - bb.xmin, bb.ymax - bb.ymin, bb.zmax - bb.zmin][dir.axis]\n if (ext > 0.1) return false\n if (isDirSelector) {\n const uv = kernel.uvBounds(cd.handle)\n const n = kernel.surfaceNormal(cd.handle, (uv.uMin + uv.uMax) / 2, (uv.vMin + uv.vMax) / 2)\n const nv: [number, number, number] = [n.x, n.y, n.z]\n if (Math.abs(nv[dir.axis]) < 0.999) return false\n if (Math.sign(nv[dir.axis]) !== dir.sign) return false\n }\n return true\n })\n const idx = parseInt(idxMatch[1], 10)\n const asc = sc === '>' || sc === '-'\n const sorted = perp\n .slice()\n .sort((a, b) => (asc ? a.center[dir.axis] - b.center[dir.axis] : b.center[dir.axis] - a.center[dir.axis]))\n const pick = idx < 0 ? sorted.length + idx : idx\n if (pick < 0 || pick >= sorted.length) {\n throw new Error(\n `[cq-compat] selector \"${sel}\": index ${idx} out of range (${sorted.length} faces)`,\n )\n }\n best = sorted[pick]\n if (isDirSelector) {\n // DirectionSelector: the outward normal is exactly the selector axis/sign.\n normal = fallbackNormal\n } else {\n // DirectionMinMaxSelector: outward normal from face position vs shape centre.\n const max = bboxMax(shape)\n const min = bboxMin(shape)\n const shapeCenter = [(max[0] + min[0]) / 2, (max[1] + min[1]) / 2, (max[2] + min[2]) / 2]\n normal = [0, 0, 0]\n normal[dir.axis] = best.center[dir.axis] >= shapeCenter[dir.axis] ? 1 : -1\n }\n } else {\n for (const cd of cands) {\n const val = cd.center[dir.axis]\n if (!best) {\n best = cd\n continue\n }\n const bestVal = best.center[dir.axis]\n if (dir.sign === 1 ? val > bestVal + 1e-6 : val < bestVal - 1e-6) {\n best = cd\n } else if (Math.abs(val - bestVal) <= 1e-6) {\n // Tie (e.g. coplanar faces at the same extreme): prefer the larger face\n const area = kernel.getSurfaceArea(cd.handle)\n if (area > kernel.getSurfaceArea(best.handle)) best = cd\n }\n }\n }\n if (best) {\n let origin: [number, number, number]\n if (centerOption === 'CenterOfBoundBox') {\n origin = best.center\n } else {\n // CenterOfMass: surface (area-weighted) centroid\n const com = kernel.getSurfaceCenterOfMass(best.handle)\n origin = [com.x, com.y, com.z]\n }\n return { center: origin, normal }\n }\n }\n } catch (e) {\n if (e instanceof Error && e.message.includes('out of range')) throw e\n // No BREP / kernel not ready — fall through to bbox approximation\n }\n\n // ── Fallback: whole-shape bbox (previous behavior) ──\n const max = bboxMax(shape)\n const min = bboxMin(shape)\n const center: [number, number, number] = [\n (max[0] + min[0]) / 2,\n (max[1] + min[1]) / 2,\n (max[2] + min[2]) / 2,\n ]\n\n const m = /^([<>+-])([XYZ])(?:\\[(-?\\d+)\\])?$/.exec(sel.trim())\n if (!m) {\n // Default: return center\n return { center, normal: [0, 0, 1] }\n }\n const [, sign, axisChar, idxStr] = m\n const axis = axisChar === 'X' ? 0 : axisChar === 'Y' ? 1 : 2\n // '>' and '+' select the max side; '<' and '-' select the min side.\n const maxDir = sign === '>' || sign === '+'\n const normal: [number, number, number] = [0, 0, 0]\n normal[axis] = maxDir ? 1 : -1\n\n if (idxStr === undefined) {\n const extreme: [number, number, number] = [center[0], center[1], center[2]]\n extreme[axis] = maxDir ? max[axis] : min[axis]\n return { center: extreme, normal }\n }\n\n // Indexed selector — enumerate real faces and sort by bbox center along axis.\n // CadQuery semantics: '>A[k]' ascending, '<A[k]' descending (see doc above).\n const idx = parseInt(idxStr, 10)\n const faces = compatFn('getFaces')(borrowBrepjsShape(shape)) as unknown[]\n type Entry = { c: [number, number, number]; bounds: Record<string, number> }\n const entries: Entry[] = faces.map((f) => {\n const b = compatFn('getBounds')(f) as Record<string, number>\n return {\n c: [(b.xMin + b.xMax) / 2, (b.yMin + b.yMax) / 2, (b.zMin + b.zMax) / 2],\n bounds: b,\n }\n })\n if (entries.length === 0) {\n throw new Error(`[cq-compat] selector \"${sel}\": shape has no faces`)\n }\n entries.sort((a, b) => (maxDir ? a.c[axis] - b.c[axis] : b.c[axis] - a.c[axis]))\n const pick = idx < 0 ? entries.length + idx : idx\n if (pick < 0 || pick >= entries.length) {\n throw new Error(\n `[cq-compat] selector \"${sel}\": index ${idx} out of range (${entries.length} faces)`,\n )\n }\n const fb = entries[pick].bounds\n const faceCenter: [number, number, number] = [\n (fb.xMin + fb.xMax) / 2,\n (fb.yMin + fb.yMax) / 2,\n (fb.zMin + fb.zMax) / 2,\n ]\n // Outward normal: away from the shape bbox center along the axis.\n normal[axis] = faceCenter[axis] >= center[axis] ? 1 : -1\n return { center: faceCenter, normal }\n}\n\n/**\n * Build a regular-polygon prism on a workplane (vendored polygon face +\n * extrude). CadQuery `polygon(n, d)`: n-gon inscribed in a circle of diameter\n * `d`, first vertex on the workplane local +X.\n */\nasync function makePolygonPrismAt(\n wp: Workplane,\n poly: { n: number; d: number },\n length: number,\n dir: [number, number, number],\n): Promise<Shape> {\n const pts: [number, number, number][] = []\n for (let i = 0; i < poly.n; i++) {\n const a = (2 * Math.PI * i) / poly.n\n pts.push(localToWorld(wp, Math.cos(a) * (poly.d / 2), Math.sin(a) * (poly.d / 2)))\n }\n const face = unwrapBrepResult(compatFn('polygon')(pts))\n const vec: [number, number, number] = [dir[0] * length, dir[1] * length, dir[2] * length]\n const prism = unwrapBrepResult(compatFn('extrude')(face, vec))\n return adoptBrepjsProduct(prism)\n}\n\n/**\n * Rotate a Z-axis-aligned primitive so its local +Z maps to `d` — ANY direction,\n * not just axis-aligned (verified vs cadquery 2.8.0: angled holes drill along\n * the transformed workplane normal). Euler decomposition that maps +Z onto d:\n * θy = asin(dx), θx = atan2(−dy, dz) (three.js XYZ-intrinsic, R = Rx·Ry)\n * Rx(θx)·Ry(θy)·(0,0,1) = (dx, dy, dz)\n */\nasync function orientZTo(shape: Shape, d: [number, number, number]): Promise<Shape> {\n const len = Math.hypot(d[0], d[1], d[2])\n const dx = d[0] / len\n const dy = d[1] / len\n const dz = d[2] / len\n const thetaX = Math.atan2(-dy, dz)\n const thetaY = Math.asin(Math.max(-1, Math.min(1, dx)))\n const anglesDeg: [number, number, number] = [\n (thetaX * 180) / Math.PI,\n (thetaY * 180) / Math.PI,\n 0,\n ]\n return cad.rotate_euler(shape, { anglesDeg }) as unknown as Shape\n}\n\n/**\n * Create a cone whose base (radius rBase) sits at the workplane origin and\n * whose apex side extends `height` along `wp.normal`-direction `d`.\n * Used for the full-cone countersink cut of cskHole (CadQuery semantics:\n * h = cskRadius / tan(cskAngle/2), cone from rBase to apex).\n */\nasync function makeConeAt(\n wp: Workplane,\n rBase: number,\n height: number,\n d: [number, number, number],\n): Promise<Shape> {\n const cone = await cad.cone(rBase, 0, height, { centered: true })\n const oriented = await orientZTo(cone as unknown as Shape, d)\n const center = vadd(wp.origin, vscale(d, height / 2))\n return cad.translate(oriented, { offset: center })\n}\n\n/**\n * Create a cylinder at the workplane origin, oriented along normal.\n * Used for hole/cutBlind implementations.\n */\nasync function makeCylinderAt(\n wp: Workplane,\n radius: number,\n height: number,\n): Promise<Shape> {\n const cyl = await cad.cylinder(radius, height, { centered: true })\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const o = Array.isArray(wp.origin) ? wp.origin : ([0, 0, 0] as [number, number, number])\n // Rotate the Z-axis cylinder so its axis aligns with the workplane normal.\n const oriented = await orientZTo(cyl as unknown as Shape, n)\n const center: [number, number, number] = [o[0] + n[0] * height / 2, o[1] + n[1] * height / 2, o[2] + n[2] * height / 2]\n return cad.translate(oriented, { offset: center })\n}\n\n/**\n * Create a box at the workplane origin: `w` along the workplane xDir, `d`\n * along yDir, `h` along the normal (CadQuery rect+extrude tool semantics).\n * The tool is built axis-aligned with the world extents implied by the\n * workplane basis, so it is correct for any axis-aligned normal.\n */\nasync function makeBoxAt(\n wp: Workplane,\n w: number,\n d: number,\n h: number,\n): Promise<Shape> {\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const o = Array.isArray(wp.origin) ? wp.origin : ([0, 0, 0] as [number, number, number])\n const axes = faceAxes(n)\n // World-space extents of a w×d×h box aligned to the (axis-aligned) basis.\n const sx = w * Math.abs(axes.x[0]) + d * Math.abs(axes.y[0]) + h * Math.abs(n[0])\n const sy = w * Math.abs(axes.x[1]) + d * Math.abs(axes.y[1]) + h * Math.abs(n[1])\n const sz = w * Math.abs(axes.x[2]) + d * Math.abs(axes.y[2]) + h * Math.abs(n[2])\n const box = await cad.box(sx, sy, sz, { centered: true })\n const center: [number, number, number] = [o[0] + n[0] * h / 2, o[1] + n[1] * h / 2, o[2] + n[2] * h / 2]\n return cad.translate(box, { offset: center })\n}\n\n// ── Public API ─────────────────────────────────────────────────────────────\n\n/** CadQuery `centered` parameter: bool or per-axis triple. */\ntype Centered3 = boolean | [boolean, boolean, boolean]\n\n/** Normalize a `centered` parameter to a per-axis triple. */\nfunction resolveCentered(c: Centered3): [boolean, boolean, boolean] {\n return typeof c === 'boolean' ? [c, c, c] : c\n}\n\n/** Build a compound Shape from several Shapes (brepjs makeCompound projection). */\nfunction makeCompoundShape(shapes: Shape[]): Shape {\n if (shapes.length === 1) return shapes[0]\n const product = unwrapBrepResult(\n compatFn('makeCompound')(shapes.map((s) => borrowBrepjsShape(s))),\n )\n return adoptBrepjsProduct(product)\n}\n\n/**\n * Finish an eachpoint-style op (box/sphere/cylinder): `combine=True` (CadQuery\n * default) fuses the created bodies with each other and with the existing\n * solid on the workplane; `combine=False` leaves them as separate solids in a\n * compound (verified vs cadquery 2.8.0: testSpherePointList -> 4 solids).\n */\nasync function combineEachpoint(\n wp: Workplane,\n shapes: Shape[],\n combine: boolean,\n clean: boolean = true,\n): Promise<Workplane> {\n let shape: Shape\n if (combine) {\n shape = shapes[0]\n for (let i = 1; i < shapes.length; i++) {\n shape = await fuseShapes(shape, shapes[i], clean)\n }\n if (wp.shape) shape = await fuseShapes(wp.shape, shape, clean)\n } else {\n shape = makeCompoundShape(shapes)\n }\n return clone(wp, { shape, faceSel: null, edgeSel: null, vertexSel: null, pts: [] })\n}\n\n/**\n * Workplane\n * @param plane - string\n * @returns Workplane\n */\nexport function Workplane(plane: string = 'XY'): Workplane {\n return makeWorkplane(plane)\n}\n\n/**\n * add\n * @param wp - Workplane\n * @param shape - Shape\n * @returns Promise<Workplane>\n */\nexport async function add(wp: Workplane, shape: Shape): Promise<Workplane> {\n return clone(wp, { shape })\n}\n\n/**\n * box\n * @param wp - Workplane\n * @param w - number\n * @param d - number\n * @param h - number\n * @param opts - { centered?; combine? }\n * @returns Promise<Workplane>\n *\n * CadQuery semantics (verified vs cadquery 2.8.0 `Workplane.box`): with the\n * default `centered=(True, True, True)` the box is centered on the workplane\n * origin in ALL three axes — including the normal direction. The old\n * \"sit on the face\" behaviour belonged to the makeBoxAt tool-body helper and\n * leaked into this public op (found by the parity harness, testBoxDefaults).\n *\n * Each-point semantics (verified vs 2.8.0): box() is eachpoint-based — with\n * points pushed on the stack a box is created at every point; `combine=True`\n * (default) fuses them with the existing solid, `combine=False` leaves them\n * as separate solids in a compound (test_getitem / testBoxPointList).\n */\nexport async function box(\n wp: Workplane,\n w: number,\n d: number,\n h: number,\n opts?: { centered?: Centered3; combine?: boolean },\n): Promise<Workplane> {\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const axes = faceAxes(n)\n // World-space extents of a w×d×h box aligned to the (axis-aligned) basis.\n const sx = w * Math.abs(axes.x[0]) + d * Math.abs(axes.y[0]) + h * Math.abs(n[0])\n const sy = w * Math.abs(axes.x[1]) + d * Math.abs(axes.y[1]) + h * Math.abs(n[1])\n const sz = w * Math.abs(axes.x[2]) + d * Math.abs(axes.y[2]) + h * Math.abs(n[2])\n const boxShape = await cad.box(sx, sy, sz, { centered: true })\n const c = resolveCentered(opts?.centered ?? true)\n // Uncentered axis: bbox corner sits on the point (offset by half the extent).\n const off: [number, number, number] = [\n c[0] ? 0 : (w / 2) * axes.x[0] + (d / 2) * axes.y[0] + (h / 2) * n[0],\n c[1] ? 0 : (w / 2) * axes.x[1] + (d / 2) * axes.y[1] + (h / 2) * n[1],\n c[2] ? 0 : (w / 2) * axes.x[2] + (d / 2) * axes.y[2] + (h / 2) * n[2],\n ]\n const points = eachPoints(wp)\n const shapes: Shape[] = []\n for (const [px, py] of points) {\n const center = vadd(localToWorld(wp, px, py), off)\n shapes.push(await cad.translate(boxShape, { offset: center }))\n }\n return combineEachpoint(wp, shapes, opts?.combine ?? true)\n}\n\n/**\n * sphere\n * @param wp - Workplane\n * @param radius - number\n * @param opts - { centered?; combine? }\n * @returns Promise<Workplane>\n *\n * CadQuery semantics (verified vs cadquery 2.8.0 `Workplane.sphere`): a sphere\n * is created for every point on the stack (or the workplane origin); per-axis\n * `centered=false` puts the sphere's bbox corner on the point. Only full\n * spheres are supported (angle1/angle2/angle3 partial sweeps are not\n * expressible with the cad.sphere primitive — upstream testSphereCustom stays\n * blocked on that).\n */\nexport async function sphere(\n wp: Workplane,\n radius: number,\n opts?: { centered?: Centered3; combine?: boolean },\n): Promise<Workplane> {\n const c = resolveCentered(opts?.centered ?? true)\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const x = Array.isArray(wp.xDir) ? wp.xDir : ([1, 0, 0] as [number, number, number])\n const y = Array.isArray(wp.yDir) ? wp.yDir : ([0, 1, 0] as [number, number, number])\n // Local-frame offset: uncentered axis -> bbox corner on the point.\n const offLocal: [number, number, number] = [c[0] ? 0 : radius, c[1] ? 0 : radius, c[2] ? 0 : radius]\n const off = vadd(vadd(vscale(x, offLocal[0]), vscale(y, offLocal[1])), vscale(n, offLocal[2]))\n const points = eachPoints(wp)\n const shapes: Shape[] = []\n for (const [px, py] of points) {\n const center = vadd(localToWorld(wp, px, py), off)\n shapes.push(await cad.sphere({ radius, center }))\n }\n return combineEachpoint(wp, shapes, opts?.combine ?? true)\n}\n\n/**\n * wedge — CadQuery `Workplane.wedge` parity.\n *\n * OCCT `BRepPrimAPI_MakeWedge(dx, dy, dz, xmin, zmin, xmax, zmax)` geometry:\n * the bottom face (local y=0) spans the full [0,dx]×[0,dz] rectangle and the\n * top face (local y=dy) spans [xmin,xmax]×[zmin,zmax]; all six faces are\n * planar. Built here as a RULED loft between the two rectangles — geometrically\n * identical to the OCCT primitive (verified vs cadquery 2.8.0: testClean\n * wedge-with-sphere union vol 9.079922 / testNoClean 10.650718).\n *\n * `centered=True` (default) shifts by (−dx/2, −dy/2, −dz/2) along the LOCAL\n * workplane axes, mirroring upstream's `offset` computation. Limitation: the\n * kernel has no makeWedge primitive, and upstream composes the wedge in WORLD\n * axes before the eachpoint location transform — for the default XY plane the\n * two agree; rotated planes are not exercised by any current mirror.\n *\n * @param wp - Workplane acting as the eachpoint carrier\n * @param dx - Bottom-face extent along local X\n * @param dy - Wedge height along local Y\n * @param dz - Bottom-face extent along local Z\n * @param xmin - Top-face minimum along local X\n * @param zmin - Top-face minimum along local Z\n * @param xmax - Top-face maximum along local X\n * @param zmax - Top-face maximum along local Z\n * @param opts - { centered?: Centered3; combine?: boolean; clean?: boolean }\n * @returns Promise<Workplane> carrying the wedge solid\n */\nexport async function wedge(\n wp: Workplane,\n dx: number,\n dy: number,\n dz: number,\n xmin: number,\n zmin: number,\n xmax: number,\n zmax: number,\n opts?: { centered?: Centered3; combine?: boolean; clean?: boolean },\n): Promise<Workplane> {\n const pl = {\n origin: Array.isArray(wp.origin) ? wp.origin : ([0, 0, 0] as [number, number, number]),\n xDir: Array.isArray(wp.xDir) ? wp.xDir : ([1, 0, 0] as [number, number, number]),\n yDir: Array.isArray(wp.yDir) ? wp.yDir : ([0, 1, 0] as [number, number, number]),\n normal: Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number]),\n }\n const p3 = (x: number, y: number, z: number): [number, number, number] =>\n vadd(pl.origin, vadd(vadd(vscale(pl.xDir, x), vscale(pl.yDir, y)), vscale(pl.normal, z)))\n const rectWire = (pts: [number, number, number][]): unknown => {\n const edges: unknown[] = []\n for (let i = 0; i < 4; i++) {\n edges.push(unwrapBrepResult(compatFn('makeLine')(pts[i], pts[(i + 1) % 4])))\n }\n return unwrapBrepResult(compatFn('assembleWire')(edges))\n }\n const c = resolveCentered(opts?.centered ?? true)\n const ox = c[0] ? -dx / 2 : 0\n const oy = c[1] ? -dy / 2 : 0\n const oz = c[2] ? -dz / 2 : 0\n // Bottom (local y=0): full [0,dx]×[0,dz]. Top (local y=dy): [xmin,xmax]×[zmin,zmax].\n // Corner order matches on both rectangles so the ruled loft pairs the right vertices.\n const bottom = rectWire([\n p3(ox, oy, oz),\n p3(ox + dx, oy, oz),\n p3(ox + dx, oy, oz + dz),\n p3(ox, oy, oz + dz),\n ])\n const top = rectWire([\n p3(ox + xmin, oy + dy, oz + zmin),\n p3(ox + xmax, oy + dy, oz + zmin),\n p3(ox + xmax, oy + dy, oz + zmax),\n p3(ox + xmin, oy + dy, oz + zmax),\n ])\n const solid = adoptBrepjsProduct(\n unwrapBrepResult(compatFn('loft')([bottom, top], { ruled: true })),\n ) as Shape\n const points = eachPoints(wp)\n const shapes: Shape[] = []\n for (const [px, py] of points) {\n shapes.push(await cad.translate(solid, { offset: localToWorld(wp, px, py) }))\n }\n return combineEachpoint(wp, shapes, opts?.combine ?? true, opts?.clean ?? true)\n}\n\n/**\n * Rotation R mapping local +Z onto `d`, reproducing OCCT `gp_Ax3(P, D)`\n * auto-XDirection (verified vs cadquery 2.8.0 by measuring\n * `Workplane.cylinder(..., direct=...)` center offsets for all six axis\n * directions). Applied to the per-axis `centered` offsets before the\n * workplane mapping, exactly as upstream `s.moved(Plane(...).location)` does.\n */\nfunction ax3Rotation(d: [number, number, number]): [number, number, number][] {\n const key = `${d[0]},${d[1]},${d[2]}`\n // rows: R·ex, R·ey, R·ez\n const table: Record<string, [[number, number, number], [number, number, number], [number, number, number]]> = {\n '1,0,0': [[0, 0, 1], [0, -1, 0], [1, 0, 0]],\n '-1,0,0': [[0, 0, -1], [0, -1, 0], [-1, 0, 0]],\n '0,1,0': [[0, 0, 1], [1, 0, 0], [0, 1, 0]],\n '0,-1,0': [[0, 0, -1], [1, 0, 0], [0, -1, 0]],\n '0,0,1': [[1, 0, 0], [0, 1, 0], [0, 0, 1]],\n '0,0,-1': [[-1, 0, 0], [0, 1, 0], [0, 0, -1]],\n }\n const r = table[key]\n if (!r) throw new Error(`[cq-compat] cylinder direct ${key} not supported (axis directions only)`)\n return r\n}\n\n/**\n * cylinder\n * @param wp - Workplane\n * @param height - number\n * @param radius - number\n * @param opts - { direct?; centered?; combine? }\n * @returns Promise<Workplane>\n *\n * CadQuery semantics (verified vs cadquery 2.8.0 `Workplane.cylinder`): a\n * cylinder for every point on the stack; per-axis `centered` offsets are\n * applied in the LOCAL frame (xDir/yDir/normal), then rotated by the\n * `direct` plane orientation (ax3Rotation table), then mapped by the\n * workplane basis. `angle != 360` pie-slice sweeps are not supported.\n */\nexport async function cylinder(\n wp: Workplane,\n height: number,\n radius: number,\n opts?: { direct?: [number, number, number]; angle?: number; centered?: Centered3; combine?: boolean },\n): Promise<Workplane> {\n const c = resolveCentered(opts?.centered ?? true)\n const d = opts?.direct ?? [0, 0, 1]\n if (opts?.angle !== undefined && opts.angle !== 360) {\n throw new Error('[cq-compat] cylinder angle != 360 is not supported')\n }\n const R = ax3Rotation(d)\n const rot = (v: [number, number, number]): [number, number, number] => [\n R[0][0] * v[0] + R[1][0] * v[1] + R[2][0] * v[2],\n R[0][1] * v[0] + R[1][1] * v[1] + R[2][1] * v[2],\n R[0][2] * v[0] + R[1][2] * v[1] + R[2][2] * v[2],\n ]\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const x = Array.isArray(wp.xDir) ? wp.xDir : ([1, 0, 0] as [number, number, number])\n const y = Array.isArray(wp.yDir) ? wp.yDir : ([0, 1, 0] as [number, number, number])\n // Map a local vector through the workplane basis.\n const map = (v: [number, number, number]): [number, number, number] =>\n vadd(vadd(vscale(x, v[0]), vscale(y, v[1])), vscale(n, v[2]))\n // Uncentered axis -> base offset by half the local extent.\n const offLocal: [number, number, number] = [\n c[0] ? 0 : radius,\n c[1] ? 0 : radius,\n c[2] ? -height / 2 : 0,\n ]\n const off = map(rot(offLocal))\n const axis = map(d)\n const axisLen = Math.hypot(axis[0], axis[1], axis[2])\n const axisUnit: [number, number, number] = [axis[0] / axisLen, axis[1] / axisLen, axis[2] / axisLen]\n const points = eachPoints(wp)\n const shapes: Shape[] = []\n for (const [px, py] of points) {\n const base = vadd(localToWorld(wp, px, py), off)\n const bodyCenter = vadd(base, vscale(axisUnit, height / 2))\n const cyl = await cad.cylinder({ radius, height, centered: true })\n const oriented = await orientZTo(cyl as unknown as Shape, axisUnit)\n shapes.push(await cad.translate(oriented, { offset: bodyCenter }))\n }\n return combineEachpoint(wp, shapes, opts?.combine ?? true)\n}\n\n/**\n * torus — CadQuery free-function analogue (occ_impl.shapes.torus).\n *\n * Upstream takes DIAMETERS and builds a full torus centred at the origin,\n * axis +Z: `torus(d1, d2)` -> R = d1/2, r = d2/2, V = 2π²·R·r²\n * (`torus(10, 2)` -> 98.696, ref-verified against cadquery 2.8.0).\n *\n * @param wp - Workplane carrier (fresh `Workplane()` for the free function).\n * @param d1 - Major DIAMETER.\n * @param d2 - Minor DIAMETER.\n * @param opts - { combine?: boolean }\n * @returns Promise<Workplane> carrying the torus solid.\n */\nexport async function torus(\n wp: Workplane,\n d1: number,\n d2: number,\n opts?: { combine?: boolean },\n): Promise<Workplane> {\n const product = unwrapBrepResult(compatFn('torus')(d1 / 2, d2 / 2))\n const shape = adoptBrepjsProduct(product)\n return combineEachpoint(wp, [shape], opts?.combine ?? true)\n}\n\n/**\n * cone — CadQuery free-function analogue (occ_impl.shapes.cone).\n *\n * Upstream takes DIAMETERS with the base centred on the origin at z=0, axis\n * +Z: `cone(d1, d2, h)` -> R = d1/2, r = d2/2, V = π/3·h·(R²+Rr+r²)\n * (`cone(2, 1, 1)` -> 1.8326, ref-verified against cadquery 2.8.0). The\n * 2-arg upstream form `cone(d, h)` is the full cone — pass `d2 = 0`.\n *\n * @param wp - Workplane carrier (fresh `Workplane()` for the free function).\n * @param d1 - Base DIAMETER.\n * @param d2 - Top DIAMETER (0 for a full cone).\n * @param h - Height along +Z.\n * @param opts - { combine?: boolean }\n * @returns Promise<Workplane> carrying the cone solid.\n */\nexport async function cone(\n wp: Workplane,\n d1: number,\n d2: number,\n h: number,\n opts?: { combine?: boolean },\n): Promise<Workplane> {\n const base = await cad.cone(d1 / 2, d2 / 2, h, { centered: true })\n // Kernel cone with centered:true is centred at the origin mid-height; lift\n // by h/2 so the base circle sits on z=0 (upstream free-function semantics).\n const shape = await cad.translate(base as unknown as Shape, { offset: [0, 0, h / 2] })\n return combineEachpoint(wp, [shape as Shape], opts?.combine ?? true)\n}\n\n/**\n * rarray\n * @param wp - Workplane\n * @param xSpacing - number\n * @param ySpacing - number\n * @param xCount - number\n * @param yCount - number\n * @param center - boolean | [boolean, boolean]\n * @returns Workplane\n *\n * CadQuery semantics (verified vs cadquery 2.8.0 `Workplane.rarray`): pushes\n * an xCount×yCount grid of points; per-axis `center=true` centers the grid on\n * the workplane origin, `false` puts the lower corner on it.\n */\nexport function rarray(\n wp: Workplane,\n xSpacing: number,\n ySpacing: number,\n xCount: number,\n yCount: number,\n center: boolean | [boolean, boolean] = true,\n): Workplane {\n if (xCount < 1 || yCount < 1 || (xSpacing <= 0 && ySpacing <= 0)) {\n throw new Error('[cq-compat] rarray: spacing and count must be > 0 in at least one direction')\n }\n const [cx, cy] = typeof center === 'boolean' ? [center, center] : center\n const ox = cx ? (-(xCount - 1) * xSpacing) / 2 : 0\n const oy = cy ? (-(yCount - 1) * ySpacing) / 2 : 0\n const pts: [number, number][] = []\n for (let i = 0; i < xCount; i++) {\n for (let j = 0; j < yCount; j++) {\n pts.push([i * xSpacing + ox, j * ySpacing + oy])\n }\n }\n return clone(wp, { pts })\n}\n\n/**\n * rect\n * @param wp - Workplane\n * @param w - number\n * @param d - number\n * @param opts - { forConstruction?: boolean }\n * @returns Workplane\n */\nexport function rect(\n wp: Workplane,\n w: number,\n d: number,\n opts?: { forConstruction?: boolean; centered?: boolean | [boolean, boolean] },\n): Workplane {\n // Upstream (cadquery 2.8.0 Workplane.rect): centered may be a bool or a\n // per-axis 2-tuple; centered=false puts the CORNER on the reference point,\n // extending in the +x/+y directions (offset is +len/2 even for negatives).\n const centered = opts?.centered ?? true\n const [cxOn, cyOn] = Array.isArray(centered) ? centered : [centered, centered]\n const ox = cxOn ? 0 : w / 2\n const oy = cyOn ? 0 : d / 2\n const at = eachPoints(wp)\n if (opts?.forConstruction) {\n // Construction rect: store corners for vertices() and edge midpoints for edges()\n return clone(wp, {\n forConstruction: true,\n pendingRect: { w, d },\n pendingWires: [\n ...(wp.pendingWires ?? []),\n ...at.map(([px, py]) => ({ kind: 'rect' as const, w, d, cx: px + ox, cy: py + oy, construction: true, plane: planeOf(wp) })),\n ],\n pts: [\n [ox - w / 2, oy - d / 2],\n [ox + w / 2, oy - d / 2],\n [ox + w / 2, oy + d / 2],\n [ox - w / 2, oy + d / 2],\n ],\n edgePts: [\n [ox, oy - d / 2],\n [ox + w / 2, oy],\n [ox, oy + d / 2],\n [ox - w / 2, oy],\n ],\n })\n }\n // Non-construction rect: store profile for extrude()/cutBlind()\n return clone(wp, {\n forConstruction: false,\n pendingRect: { w, d },\n pendingWires: [\n ...(wp.pendingWires ?? []),\n ...at.map(([px, py]) => ({ kind: 'rect' as const, w, d, cx: px + ox, cy: py + oy, construction: false, plane: planeOf(wp) })),\n ],\n })\n}\n\n/**\n * circle\n * @param wp - Workplane\n * @param radius - number\n * @returns Workplane\n */\nexport function circle(wp: Workplane, radius: number): Workplane {\n // CadQuery eachpoint semantics: with pushed points / selected vertices the\n // circle is created at EVERY point, and all of them land in pendingWires.\n const at = eachPoints(wp)\n return clone(wp, {\n forConstruction: false,\n pendingCircle: { radius },\n pendingWires: [\n ...(wp.pendingWires ?? []),\n ...at.map(([cx, cy]) => ({ kind: 'circle' as const, radius, cx, cy, construction: false, plane: planeOf(wp) })),\n ],\n })\n}\n\n/**\n * ellipse — CadQuery `Workplane.ellipse(x_radius, y_radius)` parity.\n *\n * `x_radius` lies on the workplane X axis and `y_radius` on Y — upstream puts\n * no ordering constraint on them (`testEdgeTypesFilter` uses `ellipse(3, 4)`).\n * The kernel's `makeEllipseEdge` requires major >= minor, ignores the plane's\n * own axes and lays the major axis on the global X direction, so a \"tall\"\n * ellipse is built as a wide one and then rotated 90° about the workplane\n * normal through its centre (see `buildProfileWire`).\n *\n * @param wp - Workplane\n * @param x_radius - radius along the workplane X axis\n * @param y_radius - radius along the workplane Y axis\n * @returns Workplane\n */\nexport function ellipse(wp: Workplane, x_radius: number, y_radius: number): Workplane {\n // CadQuery eachpoint semantics, same as circle(): one pending wire per\n // pushed point / selected vertex.\n const at = eachPoints(wp)\n const base = planeOf(wp)\n const flip = y_radius > x_radius\n return clone(wp, {\n forConstruction: false,\n pendingWires: [\n ...(wp.pendingWires ?? []),\n ...at.map(([cx, cy]) => ({\n kind: 'ellipse' as const,\n majorRadius: flip ? y_radius : x_radius,\n minorRadius: flip ? x_radius : y_radius,\n cx,\n cy,\n construction: false,\n plane: base,\n flip,\n })),\n ],\n })\n}\n\n/**\n * polygon\n * @param wp - Workplane\n * @param n - number\n * @param d - number\n * @returns Workplane\n */\nexport function polygon(wp: Workplane, n: number, d: number): Workplane {\n // CadQuery polygon(nSides, diameter): regular n-gon inscribed in a circle of\n // the given diameter, first vertex on local +X. The prism is materialized\n // when consumed by extrude()/cutBlind() (makePolygonPrismAt).\n const at = eachPoints(wp)\n return clone(wp, {\n forConstruction: false,\n pendingPolygon: { n, d },\n pendingWires: [\n ...(wp.pendingWires ?? []),\n ...at.map(([cx, cy]) => ({ kind: 'polygon' as const, n, d, cx, cy, construction: false, plane: planeOf(wp) })),\n ],\n })\n}\n\n/**\n * Implicit workplane for a pending face selection.\n *\n * CadQuery semantics (verified against cadquery 2.8.0): after `faces(sel)`, a\n * 2D profile followed by extrude/cut operates on the SELECTED face's plane,\n * exactly as if `workplane()` had been called — even though `Workplane.plane`\n * still reports the original origin. Measured on `box(1,1,1)`:\n * - `box(1,1,1).rect(1,.5).cutBlind(-0.2)` -> CoM z = +0.011111\n * (slot at z in [-0.2, 0])\n * - `box(1,1,1).faces(\">Z\").rect(1,.5).cutBlind(-0.2)` -> CoM z = -0.044444\n * (slot at z in [0.3, 0.5])\n * - `...faces(\">Z\")...cutBlind(+0.2)` -> volume unchanged (1.0):\n * the cut starts at z=0.5 and misses the solid entirely.\n * Without this step the profile is built on the un-lifted workplane and the\n * feature lands half a body away.\n *\n * NOTE ON TYPES: `workplane()` never touches `.shape`, only origin/axes. But\n * reassigning `wp` resets TypeScript's narrowing of `wp.shape`, so call sites\n * must capture the shape in a local BEFORE calling this helper.\n *\n * @param wp - Workplane possibly carrying a face selection.\n * @returns Promise<Workplane> with the face plane applied, or `wp` unchanged.\n */\nasync function applyPendingFacePlane(wp: Workplane): Promise<Workplane> {\n if (!wp.faceSel) return wp\n return workplane(wp)\n}\n\n// ── Pending-wire profiles (CadQuery pendingWires parity) ───────────────────\n\n/** Local-space (workplane 2D) bounding box of a pending wire. */\nfunction wireBBox(w: PendingWire): { minX: number; minY: number; maxX: number; maxY: number } {\n if (w.kind === 'circle') {\n return {\n minX: w.cx - w.radius,\n minY: w.cy - w.radius,\n maxX: w.cx + w.radius,\n maxY: w.cy + w.radius,\n }\n }\n if (w.kind === 'ellipse') {\n // flip: the built ellipse is rotated 90° in plane, so the local X extent is\n // the minor radius and the local Y extent the major one.\n const rx = w.flip ? w.minorRadius : w.majorRadius\n const ry = w.flip ? w.majorRadius : w.minorRadius\n return {\n minX: w.cx - rx,\n minY: w.cy - ry,\n maxX: w.cx + rx,\n maxY: w.cy + ry,\n }\n }\n if (w.kind === 'rect') {\n return {\n minX: w.cx - w.w / 2,\n minY: w.cy - w.d / 2,\n maxX: w.cx + w.w / 2,\n maxY: w.cy + w.d / 2,\n }\n }\n if (w.kind === 'path') {\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n const consider = (p: [number, number]): void => {\n minX = Math.min(minX, p[0])\n minY = Math.min(minY, p[1])\n maxX = Math.max(maxX, p[0])\n maxY = Math.max(maxY, p[1])\n }\n for (const p of w.pts) consider(p)\n // Arc bulges: include the through/mid points (for arc3 exact sweep max\n // needs the circle; the mid point is the standard chord-mid correction and\n // keeps cut-tool envelopes from under-covering bulged profiles).\n if (w.edges) {\n for (const e of w.edges) {\n if (e.kind === 'arc3') consider(e.mid)\n }\n }\n return { minX, minY, maxX, maxY }\n }\n // polygon: circumradius = d/2 (n-gon inscribed in a circle of diameter d)\n const r = w.d / 2\n return { minX: w.cx - r, minY: w.cy - r, maxX: w.cx + r, maxY: w.cy + r }\n}\n\n/**\n * Group pending wires into faces: every outermost wire becomes one face and\n * the wires it encloses become that face's holes.\n *\n * Mirrors cadquery 2.8.0 (measured, `sortWiresByBuildOrder`-like behaviour):\n * `pushPoints([p1,p2]).circle(4).circle(2)` -> TWO annuli (2 solids)\n * `rect(2,2)` + 4 corner circles -> ONE plate with 4 holes\n *\n * Nesting is decided by bbox containment; area ties keep declaration order so\n * disjoint wires of equal size never swallow each other.\n */\nfunction groupPendingWires(wires: PendingWire[]): { outer: PendingWire; holes: PendingWire[] }[] {\n const boxes = wires.map(wireBBox)\n const area = (i: number) => (boxes[i].maxX - boxes[i].minX) * (boxes[i].maxY - boxes[i].minY)\n const order = wires.map((_, i) => i).sort((a, b) => area(b) - area(a) || a - b)\n const groups: { outer: PendingWire; holes: PendingWire[] }[] = []\n const claimed = new Set<number>()\n for (const i of order) {\n if (claimed.has(i)) continue\n claimed.add(i)\n const ob = boxes[i]\n const holes: PendingWire[] = []\n for (const j of order) {\n if (claimed.has(j)) continue\n const hb = boxes[j]\n if (hb.minX >= ob.minX && hb.maxX <= ob.maxX && hb.minY >= ob.minY && hb.maxY <= ob.maxY) {\n claimed.add(j)\n holes.push(wires[j])\n }\n }\n groups.push({ outer: wires[i], holes })\n }\n return groups\n}\n\n// ── 2D drafting (CadQuery moveTo/lineTo/close/wire parity) ─────────────────\n\n/**\n * Current drawing point in local coordinates.\n *\n * Upstream `_findFromPoint` returns the end point of the last stack object, or\n * `plane.origin` when the stack is empty — hence the `[0, 0]` fallback.\n */\nfunction currentLocalPoint(wp: Workplane): [number, number] {\n return wp.currentPoint ?? ([0, 0] as [number, number])\n}\n\n/**\n * Draft one straight edge from the current point to `to` and advance there.\n *\n * `forConstruction` edges still move the current point (upstream calls\n * `newObject([edge])` unconditionally) but are NOT queued into `pendingEdges`\n * and never set `firstPoint` — upstream only queues via `_addPendingEdge`.\n */\nfunction draftEdge(wp: Workplane, to: [number, number], forConstruction: boolean): Workplane {\n const from = currentLocalPoint(wp)\n if (forConstruction) {\n return clone(wp, { currentPoint: to })\n }\n const edges: PendingEdge[] = [...(wp.pendingEdges ?? []), { kind: 'line', from, to }]\n return clone(wp, {\n pendingEdges: edges,\n currentPoint: to,\n firstPoint: wp.firstPoint ?? from,\n })\n}\n\n/**\n * Queue one arc edge descriptor (shared by threePointArc/sagittaArc/radiusArc)\n * with the same forConstruction semantics as draftEdge.\n */\nfunction draftArc3(\n wp: Workplane,\n mid: [number, number],\n to: [number, number],\n forConstruction: boolean,\n): Workplane {\n const from = currentLocalPoint(wp)\n if (forConstruction) {\n return clone(wp, { currentPoint: to })\n }\n const edges: PendingEdge[] = [...(wp.pendingEdges ?? []), { kind: 'arc3', from, mid, to }]\n return clone(wp, {\n pendingEdges: edges,\n currentPoint: to,\n firstPoint: wp.firstPoint ?? from,\n })\n}\n\n/**\n * Tangent of the last pending edge at its end point, in local coordinates —\n * the analytic analogue of upstream `previousEdge.tangentAt(1)`.\n *\n * - line: chord direction.\n * - arc3: perpendicular to the end radius of the circumcircle through\n * (from, mid, to), oriented along the travel direction.\n * - tangentArc: perpendicular to the end radius of the circle through `from`\n * with tangent `tgt`, oriented along the travel direction (center side `s`\n * selects the sweep orientation).\n * - spline: uses the stored end tangent (captured from the kernel at creation).\n */\nfunction lastEdgeEndTangent(wp: Workplane): [number, number] {\n const edges = wp.pendingEdges ?? []\n if (edges.length === 0) {\n throw new Error('[cq-compat] tangentArcPoint: no previous edge to continue tangentially')\n }\n const e = edges[edges.length - 1]\n if (e.kind === 'line') {\n const dx = e.to[0] - e.from[0]\n const dy = e.to[1] - e.from[1]\n const len = Math.hypot(dx, dy)\n if (len < 1e-12) throw new Error('[cq-compat] tangentArcPoint: degenerate previous line')\n return [dx / len, dy / len]\n }\n if (e.kind === 'spline') {\n if (e.endTgt) return e.endTgt\n throw new Error('[cq-compat] tangentArcPoint: spline edge has no stored end tangent')\n }\n // Circumcenter of (from, mid, to) for arc3, or of (from, tangent-constraint)\n // for tangentArc — both reduce to: circle through `from` and `to` whose\n // tangent at `from` is known.\n let cx: number, cy: number\n if (e.kind === 'arc3') {\n const [ax, ay] = e.from\n const [mx, my] = e.mid\n const [bx, by] = e.to\n const d = 2 * (ax * (my - by) + mx * (by - ay) + bx * (ay - my))\n if (Math.abs(d) < 1e-12) {\n throw new Error('[cq-compat] tangentArcPoint: previous arc is degenerate (collinear)')\n }\n const a2 = ax * ax + ay * ay\n const m2 = mx * mx + my * my\n const b2 = bx * bx + by * by\n cx = (a2 * (by - my) + m2 * (ay - by) + b2 * (my - ay)) / d\n cy = (a2 * (mx - bx) + m2 * (bx - ax) + b2 * (ax - mx)) / d\n } else {\n // tangentArc: center = from + s·n̂ with n̂ = perp(tgt), s = |d|²/(2·d·n̂)\n const tLen = Math.hypot(e.tgt[0], e.tgt[1])\n const tx = e.tgt[0] / tLen\n const ty = e.tgt[1] / tLen\n const nx = -ty\n const ny = tx\n const dx = e.to[0] - e.from[0]\n const dy = e.to[1] - e.from[1]\n const dn = dx * nx + dy * ny\n if (Math.abs(dn) < 1e-12) {\n throw new Error('[cq-compat] tangentArcPoint: previous arc is degenerate (straight)')\n }\n const s = (dx * dx + dy * dy) / (2 * dn)\n cx = e.from[0] + s * nx\n cy = e.from[1] + s * ny\n }\n // End radius → end tangent (perpendicular), oriented along travel. The\n // sweep orientation comes from where the circle center sits relative to the\n // travel: center on the LEFT of the direction of motion ⇒ CCW sweep (for\n // arc3 the mid point breaks the tie; for tangentArc the center side s does).\n // cross(from−C, to−C) alone is degenerate for half circles.\n const px = e.to[0] - cx\n const py = e.to[1] - cy\n const plen = Math.hypot(px, py)\n if (plen < 1e-12) throw new Error('[cq-compat] tangentArcPoint: previous arc has zero radius')\n let ccw: boolean\n if (e.kind === 'arc3') {\n ccw = (e.mid[0] - cx) * py - (e.mid[1] - cy) * px >= 0\n } else {\n // tangentArc: n̂ = perp(tgt) points LEFT of travel; s > 0 ⇒ center left ⇒ CCW.\n const tLen2 = Math.hypot(e.tgt[0], e.tgt[1])\n const nx = -e.tgt[1] / tLen2\n const ny = e.tgt[0] / tLen2\n const dx = e.to[0] - e.from[0]\n const dy = e.to[1] - e.from[1]\n ccw = dx * nx + dy * ny >= 0\n }\n return ccw ? [-py / plen, px / plen] : [py / plen, -px / plen]\n}\n\n/**\n * Queue one tangent-continuation arc descriptor (tangentArcPoint).\n */\nfunction draftTangentArc(\n wp: Workplane,\n tgt: [number, number],\n to: [number, number],\n forConstruction: boolean,\n): Workplane {\n const from = currentLocalPoint(wp)\n if (forConstruction) {\n return clone(wp, { currentPoint: to })\n }\n const edges: PendingEdge[] = [\n ...(wp.pendingEdges ?? []),\n { kind: 'tangentArc', from, tgt, to },\n ]\n return clone(wp, {\n pendingEdges: edges,\n currentPoint: to,\n firstPoint: wp.firstPoint ?? from,\n })\n}\n\n/**\n * threePointArc — draft an arc from the current point through `point1`,\n * ending at `point2` (CadQuery `Workplane.threePointArc`).\n * @param wp - Workplane\n * @param point1 - intermediate point the arc passes through (local 2D)\n * @param point2 - end point of the arc (local 2D)\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function threePointArc(\n wp: Workplane,\n point1: [number, number],\n point2: [number, number],\n forConstruction: boolean = false,\n): Workplane {\n return draftArc3(wp, point1, point2, forConstruction)\n}\n\n/**\n * sagittaArc — arc from the current point to `endPoint` with sagitta `sag`\n * (CadQuery `Workplane.sagittaArc`). Positive sag bulges to the LEFT of the\n * start→end direction (convex for a clockwise contour), negative to the right.\n * Mirrors the upstream sag-vector rotation in cq.py sagittaArc.\n * @param wp - Workplane\n * @param endPoint - end point (local 2D)\n * @param sag - sagitta (perpendicular distance from arc midpoint to the chord)\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function sagittaArc(\n wp: Workplane,\n endPoint: [number, number],\n sag: number,\n forConstruction: boolean = false,\n): Workplane {\n const start = currentLocalPoint(wp)\n const dx = endPoint[0] - start[0]\n const dy = endPoint[1] - start[1]\n const len = Math.hypot(dx, dy)\n if (len < 1e-12) {\n throw new Error('[cq-compat] sagittaArc: start and end points coincide')\n }\n const nx = dx / len\n const ny = dy / len\n const mag = Math.abs(sag)\n // sag > 0: rotate unit chord direction +90° (x,y)→(−y,x); sag < 0: −90°.\n const sx = sag > 0 ? -ny * mag : ny * mag\n const sy = sag > 0 ? nx * mag : -nx * mag\n const mid: [number, number] = [(start[0] + endPoint[0]) / 2 + sx, (start[1] + endPoint[1]) / 2 + sy]\n return draftArc3(wp, mid, endPoint, forConstruction)\n}\n\n/**\n * radiusArc — arc from the current point to `endPoint` with radius `radius`\n * (CadQuery `Workplane.radiusArc`). Positive radius = convex arc (for a\n * clockwise contour), negative = concave. The sagitta is derived exactly as\n * upstream: sag = |r| − sqrt(r² − (len/2)²).\n * @param wp - Workplane\n * @param endPoint - end point (local 2D)\n * @param radius - arc radius (sign selects the bulge side)\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function radiusArc(\n wp: Workplane,\n endPoint: [number, number],\n radius: number,\n forConstruction: boolean = false,\n): Workplane {\n const start = currentLocalPoint(wp)\n const halfLen = Math.hypot(endPoint[0] - start[0], endPoint[1] - start[1]) / 2\n const TOL = 1e-6\n const r2l2 = radius * radius - halfLen * halfLen\n if (r2l2 < -TOL) {\n throw new Error('[cq-compat] radiusArc: arc radius is not large enough to reach the end point')\n }\n let sag = Math.abs(radius)\n if (Math.abs(r2l2) >= TOL) sag -= Math.sqrt(r2l2)\n return sagittaArc(wp, endPoint, radius > 0 ? sag : -sag, forConstruction)\n}\n\n/**\n * tangentArcPoint — arc tangent to the end of the last drafted edge, ending at\n * `endpoint` (CadQuery `Workplane.tangentArcPoint`).\n * @param wp - Workplane\n * @param endpoint - end point (local 2D; relative to the current point when\n * `relative` is true)\n * @param forConstruction - edge is reference geometry only (default false)\n * @param relative - interpret `endpoint` relative to the current point (default true)\n * @returns Workplane\n */\nexport function tangentArcPoint(\n wp: Workplane,\n endpoint: [number, number],\n forConstruction: boolean = false,\n relative: boolean = true,\n): Workplane {\n const cur = currentLocalPoint(wp)\n const to: [number, number] = relative ? [cur[0] + endpoint[0], cur[1] + endpoint[1]] : [endpoint[0], endpoint[1]]\n const tgt = lastEdgeEndTangent(wp)\n return draftTangentArc(wp, tgt, to, forConstruction)\n}\n\n/**\n * spline — cubic B-spline edge interpolated exactly through `points`\n * (CadQuery `Workplane.spline`, includeCurrent=false default: the edge starts\n * at points[0], NOT at the current point — upstream `_toVectors` only prepends\n * the current point when includeCurrent is set). The current point becomes the\n * spline end. `includeCurrent` prepends the current point; the resulting edge\n * stores its kernel-measured end tangent so a following tangentArcPoint can\n * continue the curve.\n * @param wp - Workplane\n * @param points - interpolation points (local 2D; 3D z=0)\n * @param opts - { forConstruction?; includeCurrent?; periodic?; makeWire? }\n * @returns Workplane\n */\nexport function spline(\n wp: Workplane,\n points: [number, number][],\n opts?: { forConstruction?: boolean; includeCurrent?: boolean; periodic?: boolean; makeWire?: boolean },\n): Workplane {\n if (!Array.isArray(points) || points.length < 2) {\n throw new Error('[cq-compat] spline: at least 2 points are required')\n }\n const includeCurrent = opts?.includeCurrent === true\n const all: [number, number][] = includeCurrent ? [currentLocalPoint(wp), ...points] : points\n const end = all[all.length - 1]\n // Build the spline edge ONCE here and keep a strong reference to it in the\n // descriptor. Creating a throwaway edge just to measure the tangent and\n // dropping it is NOT safe: brepjs registers every kernel shape in a\n // FinalizationRegistry, and when GC collects the discarded wrapper the\n // arena slot is freed and recycled — the next tangent-arc handle can dangle\n // (observed as curvePointAt returning nulls + FACE_BUILD_FAILED).\n if (opts?.forConstruction) {\n return clone(wp, { currentPoint: end })\n }\n const world = all.map(([x, y]) => localToWorld(wp, x, y))\n const builtEdge = unwrapBrepResult(\n compatFn('makeBSplineInterpolation')(world, { periodic: false }),\n )\n const endTgt = splineEndTangent(builtEdge, wp)\n const edges: PendingEdge[] = [\n ...(wp.pendingEdges ?? []),\n { kind: 'spline', from: all[0], pts: all, to: end, endTgt, builtEdge },\n ]\n let next = clone(wp, {\n pendingEdges: edges,\n currentPoint: end,\n firstPoint: wp.firstPoint ?? all[0],\n })\n if (opts?.makeWire) {\n next = wire(next)\n }\n return next\n}\n\n/** Kernel-measured end tangent of a built spline edge, in workplane-local 2D. */\nfunction splineEndTangent(edge: unknown, wp: Workplane): [number, number] {\n // curveTangentAt returns a plain [x, y, z] ARRAY (vendored curveFns →\n // curveOps.curveTangent(...).tangent), not an {x,y,z} vector — indexing it\n // with .x yields undefined → NaN → a corrupt tangent-arc edge downstream.\n const tRaw = compatFn('curveTangentAt')(edge, 1) as number[] | { x: number; y: number; z: number }\n const t = Array.isArray(tRaw)\n ? { x: tRaw[0], y: tRaw[1], z: tRaw[2] }\n : (tRaw as { x: number; y: number; z: number })\n if (![t.x, t.y, t.z].every(Number.isFinite)) {\n throw new Error('[cq-compat] spline: kernel returned a non-finite end tangent')\n }\n // Back to workplane-local 2D.\n const o = wp.origin\n const bx = t.x - o[0]\n const by = t.y - o[1]\n const bz = t.z - o[2]\n const lx = bx * wp.xDir[0] + by * wp.xDir[1] + bz * wp.xDir[2]\n const ly = bx * wp.yDir[0] + by * wp.yDir[1] + bz * wp.yDir[2]\n const len = Math.hypot(lx, ly)\n if (len < 1e-12) throw new Error('[cq-compat] spline: zero end tangent')\n return [lx / len, ly / len]\n}\n\n/**\n * moveTo — move the current point without drawing (CadQuery `Workplane.moveTo`).\n * @param wp - Workplane\n * @param x - target x in local coords (default 0)\n * @param y - target y in local coords (default 0)\n * @returns Workplane\n */\nexport function moveTo(wp: Workplane, x: number = 0, y: number = 0): Workplane {\n return clone(wp, { currentPoint: [x, y] as [number, number] })\n}\n\n/**\n * move2D — relative version of `moveTo` (CadQuery `Workplane.move`).\n *\n * NOTE: upstream spells this `move`, but the Shape-level `move` (the in-place\n * twin of `moved`, which takes `Location` arguments) already owns that name in\n * cq-compat, so the 2D drafting variant is exported as `move2D`.\n *\n * @param wp - Workplane\n * @param xDist - x offset from the current point (default 0)\n * @param yDist - y offset from the current point (default 0)\n * @returns Workplane\n */\nexport function move2D(wp: Workplane, xDist: number = 0, yDist: number = 0): Workplane {\n const p = currentLocalPoint(wp)\n return moveTo(wp, p[0] + xDist, p[1] + yDist)\n}\n\n/**\n * lineTo — draft a straight edge to an absolute local point\n * (CadQuery `Workplane.lineTo`).\n * @param wp - Workplane\n * @param x - target x in local coords\n * @param y - target y in local coords\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function lineTo(wp: Workplane, x: number, y: number, forConstruction: boolean = false): Workplane {\n return draftEdge(wp, [x, y], forConstruction)\n}\n\n/**\n * line — draft a straight edge by a relative offset (CadQuery `Workplane.line`).\n * @param wp - Workplane\n * @param xDist - x offset from the current point\n * @param yDist - y offset from the current point\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function line(wp: Workplane, xDist: number, yDist: number, forConstruction: boolean = false): Workplane {\n const p = currentLocalPoint(wp)\n return draftEdge(wp, [p[0] + xDist, p[1] + yDist], forConstruction)\n}\n\n/**\n * vLine — vertical (local +Y) relative line (CadQuery `Workplane.vLine`).\n *\n * @param wp - Workplane\n * @param distance - signed length along local +Y\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function vLine(wp: Workplane, distance: number, forConstruction: boolean = false): Workplane {\n return line(wp, 0, distance, forConstruction)\n}\n\n/**\n * hLine — horizontal (local +X) relative line (CadQuery `Workplane.hLine`).\n *\n * @param wp - Workplane\n * @param distance - signed length along local +X\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function hLine(wp: Workplane, distance: number, forConstruction: boolean = false): Workplane {\n return line(wp, distance, 0, forConstruction)\n}\n\n/**\n * vLineTo — vertical line to an absolute local y (CadQuery `Workplane.vLineTo`).\n *\n * @param wp - Workplane\n * @param yCoord - absolute local y to end at\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function vLineTo(wp: Workplane, yCoord: number, forConstruction: boolean = false): Workplane {\n return lineTo(wp, currentLocalPoint(wp)[0], yCoord, forConstruction)\n}\n\n/**\n * hLineTo — horizontal line to an absolute local x (CadQuery `Workplane.hLineTo`).\n *\n * @param wp - Workplane\n * @param xCoord - absolute local x to end at\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function hLineTo(wp: Workplane, xCoord: number, forConstruction: boolean = false): Workplane {\n return lineTo(wp, xCoord, currentLocalPoint(wp)[1], forConstruction)\n}\n\n/**\n * polyline — draft a chain of edges through the given local points\n * (CadQuery `Workplane.polyline`).\n *\n * `includeCurrent=false` (upstream default) treats the FIRST point as an\n * implicit moveTo and only draws from it onward.\n *\n * @param wp - Workplane\n * @param pts - local 2D points\n * @param forConstruction - edges are reference geometry only (default false)\n * @param includeCurrent - start from the current point (default false)\n * @returns Workplane\n */\nexport function polyline(\n wp: Workplane,\n pts: [number, number][],\n forConstruction: boolean = false,\n includeCurrent: boolean = false,\n): Workplane {\n if (!Array.isArray(pts) || pts.length === 0) return wp\n let cur = wp\n if (includeCurrent) {\n for (const p of pts) cur = draftEdge(cur, [p[0], p[1]], forConstruction)\n return cur\n }\n // Upstream: startPoint = pts[0] (no edge drawn), then edges to pts[1:].\n cur = clone(cur, { currentPoint: [pts[0][0], pts[0][1]] as [number, number] })\n for (const p of pts.slice(1)) cur = draftEdge(cur, [p[0], p[1]], forConstruction)\n return cur\n}\n\n/**\n * wire — combine all pending edges into one pending wire\n * (CadQuery `Workplane.wire`). No-op when there are no free edges (upstream\n * returns self unchanged in that case).\n *\n * @param wp - Workplane\n * @param forConstruction - keep the wire out of the solid profile (default false)\n * @returns Workplane\n */\nexport function wire(wp: Workplane, forConstruction: boolean = false): Workplane {\n const edges = wp.pendingEdges ?? []\n if (edges.length === 0) return wp\n const pts: [number, number][] = []\n for (const e of edges) {\n if (pts.length === 0) pts.push([e.from[0], e.from[1]])\n pts.push([e.to[0], e.to[1]])\n }\n // close() may already have appended the segment back to the first point;\n // drop the duplicated vertex so the ring has no zero-length edge.\n if (pts.length > 1) {\n const a = pts[0]\n const b = pts[pts.length - 1]\n if (Math.hypot(a[0] - b[0], a[1] - b[1]) < 1e-9) pts.pop()\n }\n const w: PendingWire = {\n kind: 'path',\n pts,\n // Full edge descriptors (incl. arc3/tangentArc/spline) so wire assembly\n // rebuilds the exact curves; pts is the vertex ring used for bbox only.\n edges: edges.map((e) => ({ ...e })),\n construction: forConstruction,\n plane: planeOf(wp),\n }\n return clone(wp, {\n pendingEdges: [],\n pendingWires: forConstruction ? wp.pendingWires : [...(wp.pendingWires ?? []), w],\n })\n}\n\n/**\n * close — end drafting and build a closed wire (CadQuery `Workplane.close`).\n * Appends the closing segment when the end point is more than 1e-6 away from\n * the first point (upstream threshold), then delegates to `wire()`.\n *\n * @param wp - Workplane\n * @returns Workplane\n */\nexport function close(wp: Workplane): Workplane {\n const end = currentLocalPoint(wp)\n const start = wp.firstPoint\n if (!start) {\n throw new Error('[cq-compat] close: No start point specified - cannot close')\n }\n let cur = wp\n if (Math.hypot(end[0] - start[0], end[1] - start[1]) > 1e-6) {\n cur = draftEdge(cur, [start[0], start[1]], false)\n }\n cur = clone(cur, { firstPoint: undefined })\n return wire(cur)\n}\n\n/**\n * Reorder edge descriptors so the kernel's sequential wire builder accepts all\n * of them. `makeWire` adds edges one by one and silently DROPS an edge when it\n * connects to neither open end of the wire built so far — upstream CadQuery\n * 2.8 avoids this via the MakeWire list-Add overload (BRepBuilderAPI_MakeWire\n * with TopTools_ListOfShape), which keeps even disconnected edges. We can't\n * reach that overload from the wasm surface, but when the edge set forms a\n * single (possibly gappy) chain there is an ordering in which every edge\n * attaches to an open end when added (e.g. [line,line,spline,line] ->\n * [spline,closing,line,line]); find it with DFS over shared endpoints. The\n * kernel auto-orients reversed edges, so no descriptor reversal is needed.\n * Returns the input order unchanged when no full chain exists (multi-run gap —\n * the kernel then drops the stray run exactly as before).\n */\nfunction reorderForWireAssembly(edges: PendingEdge[]): PendingEdge[] {\n const n = edges.length\n if (n < 3) return edges\n const key = (p: [number, number]) =>\n `${Math.round(p[0] * 1e6) / 1e6},${Math.round(p[1] * 1e6) / 1e6}`\n const ends = edges.map((e) => [key(e.from), key(e.to)] as const)\n const used = new Array<boolean>(n).fill(false)\n const order: number[] = []\n const dfs = (tailKey: string): boolean => {\n if (order.length === n) return true\n for (let j = 0; j < n; j++) {\n if (used[j]) continue\n if (ends[j][0] !== tailKey && ends[j][1] !== tailKey) continue\n used[j] = true\n order.push(j)\n if (dfs(ends[j][0] === tailKey ? ends[j][1] : ends[j][0])) return true\n used[j] = false\n order.pop()\n }\n return false\n }\n for (let s = 0; s < n; s++) {\n order.length = 0\n used.fill(false)\n used[s] = true\n order.push(s)\n if (dfs(ends[s][1])) return order.map((i) => edges[i])\n }\n return edges\n}\n\n/** Build a brepjs wire for a pending 2D profile, in world coordinates. */\nasync function buildProfileWire(wp: Workplane, w: PendingWire): Promise<unknown> {\n // Use the wire's own creation-plane snapshot when present (loft sections can\n // live on different planes after intermediate workplane()/transformed calls).\n const pl = w.plane ?? {\n origin: wp.origin,\n xDir: wp.xDir,\n yDir: wp.yDir,\n normal: wp.normal,\n }\n const n = Array.isArray(pl.normal) ? pl.normal : ([0, 0, 1] as [number, number, number])\n if (w.kind === 'circle') {\n const center = localToWorld(pl, w.cx, w.cy)\n const edge = unwrapBrepResult(compatFn('makeCircle')(w.radius, center, n))\n return unwrapBrepResult(compatFn('assembleWire')([edge]))\n }\n if (w.kind === 'ellipse') {\n const center = localToWorld(pl, w.cx, w.cy)\n if (w.flip) {\n // \"Tall\" ellipse (y_radius > x_radius) — NOT reproducible today.\n //\n // The kernel lays the major axis on the GLOBAL X direction, ignores the\n // plane's own axes, and rejects major < minor (\"gp_Elips: invalid\n // construction parameters\"), so the only way to a tall ellipse is to\n // rotate a wide one. Every rotation path available re-approximates the\n // curve: `applyMatrix`/`generalTransformWithHistory` drifts 0.4% in\n // volume (testEdgeTypesFilter), and the plain `transform` / `rotate`\n // kernel entries produce a wire `makeFace` then rejects as non-planar.\n // Failing loudly instead of silently emitting an approximated ellipse.\n throw new Error(\n '[cq-compat] ellipse: y_radius > x_radius is not reproducible (kernel ellipse is always major-on-X and rotations re-approximate it)',\n )\n }\n const edge = unwrapBrepResult(compatFn('makeEllipseEdge')(w.majorRadius, w.minorRadius, center, n))\n return unwrapBrepResult(compatFn('assembleWire')([edge]))\n }\n if (w.kind === 'path') {\n // Drafted ring. When edge descriptors are present (arcs/splines), rebuild\n // the exact curves; otherwise consecutive ring points are line edges, with\n // the last one closing back to the first. Zero-length segments (a close()\n // that landed exactly on the start point) are skipped — OCCT rejects them\n // in a wire.\n const edges: unknown[] = []\n if (w.edges && w.edges.length > 0) {\n // Drop zero-length segments (a close() that landed exactly on the start\n // point — OCCT rejects them in a wire), then reorder so the sequential\n // makeWire builder keeps every edge (see reorderForWireAssembly).\n const descs = reorderForWireAssembly(\n w.edges.filter(\n (e) => e.kind !== 'line' || Math.hypot(e.to[0] - e.from[0], e.to[1] - e.from[1]) >= 1e-9,\n ),\n )\n for (const e of descs) {\n if (e.kind === 'line') {\n edges.push(\n unwrapBrepResult(compatFn('makeLine')(localToWorld(pl, e.from[0], e.from[1]), localToWorld(pl, e.to[0], e.to[1]))),\n )\n } else if (e.kind === 'arc3') {\n edges.push(\n compatFn('makeThreePointArc')(\n localToWorld(pl, e.from[0], e.from[1]),\n localToWorld(pl, e.mid[0], e.mid[1]),\n localToWorld(pl, e.to[0], e.to[1]),\n ),\n )\n } else if (e.kind === 'tangentArc') {\n const tLen = Math.hypot(e.tgt[0], e.tgt[1])\n const t: [number, number, number] = [\n (pl.xDir[0] * e.tgt[0] + pl.yDir[0] * e.tgt[1]) / tLen,\n (pl.xDir[1] * e.tgt[0] + pl.yDir[1] * e.tgt[1]) / tLen,\n (pl.xDir[2] * e.tgt[0] + pl.yDir[2] * e.tgt[1]) / tLen,\n ]\n edges.push(\n compatFn('makeTangentArc')(\n localToWorld(pl, e.from[0], e.from[1]),\n t,\n localToWorld(pl, e.to[0], e.to[1]),\n ),\n )\n } else if (e.builtEdge) {\n // Reuse the edge built at op time (strongly held — see spline()).\n edges.push(e.builtEdge)\n } else {\n // spline\n const world = e.pts.map(([x, y]) => localToWorld(pl, x, y))\n edges.push(unwrapBrepResult(compatFn('makeBSplineInterpolation')(world, { periodic: false })))\n }\n }\n } else {\n for (let i = 0; i < w.pts.length; i++) {\n const a = w.pts[i]\n const b = w.pts[(i + 1) % w.pts.length]\n if (Math.hypot(a[0] - b[0], a[1] - b[1]) < 1e-9) continue\n edges.push(\n unwrapBrepResult(compatFn('makeLine')(localToWorld(pl, a[0], a[1]), localToWorld(pl, b[0], b[1]))),\n )\n }\n }\n if (edges.length === 0) throw new Error('[cq-compat] buildProfileWire: degenerate path wire')\n return unwrapBrepResult(compatFn('assembleWire')(edges))\n }\n const ring: [number, number][] =\n w.kind === 'rect'\n ? [\n [w.cx - w.w / 2, w.cy - w.d / 2],\n [w.cx + w.w / 2, w.cy - w.d / 2],\n [w.cx + w.w / 2, w.cy + w.d / 2],\n [w.cx - w.w / 2, w.cy + w.d / 2],\n ]\n : Array.from({ length: w.n }, (_, i) => {\n const a = (2 * Math.PI * i) / w.n\n return [\n w.cx + Math.cos(a) * (w.d / 2),\n w.cy + Math.sin(a) * (w.d / 2),\n ] as [number, number]\n })\n const edges: unknown[] = []\n for (let i = 0; i < ring.length; i++) {\n const a = ring[i]\n const b = ring[(i + 1) % ring.length]\n edges.push(unwrapBrepResult(compatFn('makeLine')(localToWorld(pl, a[0], a[1]), localToWorld(pl, b[0], b[1]))))\n }\n return unwrapBrepResult(compatFn('assembleWire')(edges))\n}\n\n/**\n * Extrude the pending wire LIST: one face per outermost wire, enclosed wires\n * punched as holes, all faces extruded by `height` along the workplane normal\n * and unioned. Only used when more than one solid wire is pending — the\n * single-wire case keeps the legacy prism path (zero regression risk).\n */\n/** Rebuild a pending wire translated by `shift` in world space (used to place cut tools). */\nfunction shiftWire(w: PendingWire, wp: Workplane, shift: [number, number, number]): PendingWire {\n const base = w.plane ?? {\n origin: wp.origin,\n xDir: wp.xDir,\n yDir: wp.yDir,\n normal: wp.normal,\n }\n return {\n ...w,\n plane: {\n origin: [base.origin[0] + shift[0], base.origin[1] + shift[1], base.origin[2] + shift[2]],\n xDir: base.xDir,\n yDir: base.yDir,\n normal: base.normal,\n },\n } as PendingWire\n}\n\nasync function pendingPathPrism(\n wp: Workplane,\n vec: [number, number, number],\n shift?: [number, number, number],\n): Promise<Shape> {\n const all = (wp.pendingWires ?? []).filter((w) => !w.construction)\n const groups = groupPendingWires(all)\n let result: Shape | null = null\n for (const g of groups) {\n const outer = await buildProfileWire(wp, shift ? shiftWire(g.outer, wp, shift) : g.outer)\n const holeWires: unknown[] = []\n for (const h of g.holes) {\n holeWires.push(await buildProfileWire(wp, shift ? shiftWire(h, wp, shift) : h))\n }\n const face = unwrapBrepResult(compatFn('makeFace')(outer, holeWires))\n const prism = unwrapBrepResult(compatFn('extrude')(face, vec))\n const solid = adoptBrepjsProduct(prism) as Shape\n result = result ? await fuseShapes(result, solid) : solid\n }\n if (!result) throw new Error('[cq-compat] extrude: no pending wire to extrude')\n return result\n}\n\nasync function extrudePendingWires(wp: Workplane, height: number): Promise<Shape> {\n const dir = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const vec: [number, number, number] = [dir[0] * height, dir[1] * height, dir[2] * height]\n return pendingPathPrism(wp, vec)\n}\n\n/** True when a drafted (moveTo/lineTo/close) wire is pending — legacy paths never use it. */\nfunction hasPathWire(wp: Workplane): boolean {\n return (wp.pendingWires ?? []).some((w) => !w.construction && w.kind === 'path')\n}\n\n/**\n * extrude\n * @param wp - Workplane\n * @param height - number\n * @param combine - true (default): fuse the new solid with the carried shape;\n * false: the carrier holds ONLY the freshly extruded solid (upstream\n * `extrude(..., False)` — verified: testSolidReferenceCombineFalse exports the\n * lone boss, Compound vol 0.03125). The \"cut\"/\"s\" modes are NOT supported yet.\n * @returns Promise<Workplane>\n */\n/** Extract the numeric kernel id from a brepjs shape wrapper (or raw handle). */\nfunction rawShapeId(shapeWrapper: unknown): number {\n const w = (shapeWrapper as { wrapped?: unknown }).wrapped ?? shapeWrapper\n if (w && typeof w === 'object' && (w as { __occtWasm?: boolean }).__occtWasm) {\n return (w as { id: number }).id\n }\n return w as number\n}\n\n/**\n * extrude — CadQuery `Workplane.extrude` parity.\n *\n * Pulls the pending profile wire(s) along the workplane normal by `height`;\n * a negative height extrudes the other way. `taper` (degrees, default 0)\n * narrows the section towards the top and is limited to a single\n * non-construction pending wire.\n *\n * @param wp - Workplane\n * @param height - extrusion distance along the workplane normal\n * @param combine - fuse the result with the carried shape (default true)\n * @param opts - { taper?: number } draft angle in degrees\n * @returns Promise<Workplane>\n */\nexport async function extrude(\n wp: Workplane,\n height: number,\n combine: boolean = true,\n opts?: { taper?: number },\n): Promise<Workplane> {\n const taper = opts?.taper ?? 0\n if (taper !== 0) {\n // Tapered prism via the kernel draftPrism (BRepOffsetAPI_MakeDraft shell\n // equivalent; sign convention verified: positive angle narrows, matching\n // upstream `extrude(taper=20)` top-face < bottom-face).\n const solidWires = (wp.pendingWires ?? []).filter((w) => !w.construction)\n if (solidWires.length !== 1) {\n throw new Error('[cq-compat] extrude: taper requires exactly one pending profile wire')\n }\n const base = wp.shape\n wp = await applyPendingFacePlane(wp)\n const profile = await buildProfileWire(wp, solidWires[0])\n const face = unwrapBrepResult(compatFn('makeFace')(profile))\n const kernel = getKernel() as unknown as OcctKernel\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const raw = (\n kernel as unknown as {\n draftPrism: (\n face: ShapeHandle,\n dx: number,\n dy: number,\n dz: number,\n angleDeg: number,\n ) => ShapeHandle\n }\n ).draftPrism(\n rawShapeId(face) as unknown as ShapeHandle,\n n[0] * height,\n n[1] * height,\n n[2] * height,\n taper,\n )\n const prism = fromHandle(raw)\n const shape = combine === false || !base ? prism : await fuseShapes(base, prism)\n return clone(wp, {\n shape,\n pendingWires: [],\n pendingPolygon: undefined,\n pendingRect: undefined,\n pendingCircle: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n }\n // CadQuery pendingWires LIST: nested wires form one holed face per outermost\n // wire. Single-wire cases fall through to the legacy prism path unchanged.\n const solidWires = (wp.pendingWires ?? []).filter((w) => !w.construction)\n // A drafted path wire can never take the legacy single-slot path (there is no\n // pendingRect/pendingCircle/pendingPolygon for it), so it always goes through\n // the pendingWires LIST path. Ellipse wires likewise have no legacy slot and\n // are materialized via buildProfileWire. Everything else keeps the old condition.\n if (solidWires.length > 1 || hasPathWire(wp) || solidWires.some((w) => w.kind === 'ellipse')) {\n const base = wp.shape\n wp = await applyPendingFacePlane(wp)\n const prism = await extrudePendingWires(wp, height)\n const shape =\n combine === false || !base ? prism : await fuseShapes(base, prism)\n return clone(wp, {\n shape,\n pendingWires: [],\n pendingPolygon: undefined,\n pendingRect: undefined,\n pendingCircle: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n }\n // If there's a pending 2D profile (rect/circle/polygon) and no existing shape, create the 3D solid\n if (wp.pendingPolygon && !wp.shape) {\n const shape = await makePolygonPrismAt(wp, wp.pendingPolygon, height, wp.normal)\n return clone(wp, { shape, pendingWires: [], pendingPolygon: undefined, faceSel: null, edgeSel: null, vertexSel: null, pts: [] })\n }\n if (wp.pendingRect && !wp.shape) {\n const { w, d } = wp.pendingRect\n const shape = await makeBoxAt(wp, w, d, height)\n return clone(wp, { shape, pendingWires: [], pendingRect: undefined, faceSel: null, edgeSel: null, vertexSel: null, pts: [] })\n }\n if (wp.pendingCircle && !wp.shape) {\n const { radius } = wp.pendingCircle\n const shape = await makeCylinderAt(wp, radius, height)\n return clone(wp, { shape, pendingWires: [], pendingCircle: undefined, faceSel: null, edgeSel: null, vertexSel: null, pts: [] })\n }\n // Boss extrude on existing shape: create profile at each workplane point and union\n if (wp.shape) {\n // A pending faces(sel) lifts the profile plane (CadQuery implicit workplane).\n const base = wp.shape\n wp = await applyPendingFacePlane(wp)\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n // Slight overlap ensures OCCT fuse merges coplanar faces into one solid\n const OVERLAP = 0.1\n // If we have a pending profile on an existing shape, create and union\n if (wp.pendingPolygon || wp.pendingRect || wp.pendingCircle) {\n const points = eachPoints(wp)\n let shape = base\n let separate: Shape | null = null\n for (const [px, py] of points) {\n const bossWp: Workplane = { ...wp, origin: localToWorld(wp, px, py) }\n // combine=false keeps the new solid standalone: no OVERLAP padding (it\n // exists only to make the fuse merge coplanar faces) and no fuse.\n const h = combine === false ? height : height + OVERLAP\n let boss: Shape\n if (wp.pendingPolygon) {\n boss = await makePolygonPrismAt(bossWp, wp.pendingPolygon, h, wp.normal)\n } else if (wp.pendingRect) {\n const { w, d } = wp.pendingRect\n boss = await makeBoxAt(bossWp, w, d, h)\n } else {\n boss = await makeCylinderAt(bossWp, wp.pendingCircle!.radius, h)\n }\n if (combine === false) {\n separate = separate ? await fuseShapes(separate, boss) : boss\n continue\n }\n const shifted = await cad.translate(boss, {\n offset: [-n[0] * OVERLAP, -n[1] * OVERLAP, -n[2] * OVERLAP],\n })\n shape = await fuseShapes(shape, shifted as unknown as Shape)\n // The OVERLAP padding extends the boss BELOW the face plane so the OCCT\n // fuse merges the coplanar contact. When the profile overhangs the base\n // (e.g. a boss centred on a corner, testWorkplaneCenterMove), that\n // padding leaves stray material OUTSIDE the base under the face plane —\n // upstream keeps nothing there. Remove exactly that region:\n // (shifted boss \\ base) ∩ half-space below the face plane.\n // Profiles fully inside the base's cross-section can never overhang,\n // so the cheap bbox test skips the two extra booleans entirely.\n const bossB = compatFn('getBounds')(borrowBrepjsShape(boss)) as Record<string, number>\n const baseB = compatFn('getBounds')(borrowBrepjsShape(base)) as Record<string, number>\n const PAD_EPS = 1e-6\n const axisOf = (v: [number, number, number]): number =>\n Math.abs(v[0]) > 0.5 ? 0 : Math.abs(v[1]) > 0.5 ? 1 : 2\n // In-plane axes = the two axes perpendicular to the face normal.\n const overhangs = [0, 1, 2]\n .filter((i) => i !== axisOf(n))\n .some((i) => {\n const key = ['x', 'y', 'z'] as const\n return (\n bossB[`${key[i]}Min`] < baseB[`${key[i]}Min`] - PAD_EPS ||\n bossB[`${key[i]}Max`] > baseB[`${key[i]}Max`] + PAD_EPS\n )\n })\n if (overhangs) {\n const stray = await cutShapes(shifted as unknown as Shape, base)\n // Slab covering the half-space below the face plane (local z <= 0).\n const o = Array.isArray(wp.origin) ? wp.origin : ([0, 0, 0] as [number, number, number])\n const BIG =\n 2 *\n Math.max(\n baseB.xMax - baseB.xMin,\n baseB.yMax - baseB.yMin,\n baseB.zMax - baseB.zMin,\n bossB.xMax - bossB.xMin,\n bossB.yMax - bossB.yMin,\n bossB.zMax - bossB.zMin,\n ) +\n 10\n const belowWp: Workplane = {\n ...wp,\n origin: [o[0] - n[0] * BIG, o[1] - n[1] * BIG, o[2] - n[2] * BIG],\n }\n const slab = await makeBoxAt(belowWp, BIG, BIG, BIG)\n const strayBelow = await intersectShapes(stray, slab)\n shape = await cutShapes(shape, strayBelow)\n }\n }\n if (combine === false && separate) {\n return clone(wp, {\n shape: separate,\n pendingWires: [],\n pendingPolygon: undefined,\n pendingRect: undefined,\n pendingCircle: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n }\n return clone(wp, {\n shape,\n pendingWires: [],\n pendingPolygon: undefined,\n pendingRect: undefined,\n pendingCircle: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n }\n // No pending profile — return unchanged\n return wp\n }\n // No shape and no pending profile — return unchanged\n return wp\n}\n\n/**\n * revolve — CadQuery `Workplane.revolve` parity.\n *\n * Consumes the pending wire LIST (same grouping as extrude: one holed face per\n * outermost wire) and revolves each face around an axis. Axis endpoints are\n * LOCAL workplane coordinates (verified against cadquery 2.8.0\n * `Workplane.revolve`): start defaults to the plane origin; when only start is\n * given, end defaults to `(0, start.y)` if `start.y != 0` else `(0, 1)` — i.e.\n * the local +Y direction. Angle 0 is normalized to 360 (OCCT cannot do a\n * 0-degree revolve).\n *\n * @param wp - Workplane\n * @param angleDegrees - revolution angle (default 360)\n * @param axisStart - axis start point in local 2D coords\n * @param axisEnd - axis end point in local 2D coords\n * @param combine - true: fuse with base; \"cut\": subtract from base; false: keep separate\n * @returns Promise<Workplane>\n */\nexport async function revolve(\n wp: Workplane,\n angleDegrees = 360,\n axisStart?: [number, number] | [number, number, number],\n axisEnd?: [number, number] | [number, number, number],\n combine: boolean | 'cut' = true,\n): Promise<Workplane> {\n let angle = ((angleDegrees % 360) + 360) % 360\n if (angle === 0) angle = 360\n\n const sLocal: [number, number] = axisStart ? [axisStart[0], axisStart[1]] : [0, 0]\n const eLocal: [number, number] = axisEnd\n ? [axisEnd[0], axisEnd[1]]\n : sLocal[1] !== 0\n ? [0, sLocal[1]]\n : [0, 1]\n const startW = localToWorld(wp, sLocal[0], sLocal[1])\n const endW = localToWorld(wp, eLocal[0], eLocal[1])\n const axis: [number, number, number] = [endW[0] - startW[0], endW[1] - startW[1], endW[2] - startW[2]]\n const len = Math.hypot(axis[0], axis[1], axis[2])\n if (len === 0) throw new Error('[cq-compat] revolve: axis start and end coincide')\n const dir: [number, number, number] = [axis[0] / len, axis[1] / len, axis[2] / len]\n\n const all = (wp.pendingWires ?? []).filter((w) => !w.construction)\n if (all.length === 0) throw new Error('[cq-compat] revolve: no pending wire to revolve')\n\n wp = await applyPendingFacePlane(wp)\n const rad = (angle * Math.PI) / 180\n let result: Shape | null = null\n for (const g of groupPendingWires(all)) {\n const outer = await buildProfileWire(wp, g.outer)\n const holeWires: unknown[] = []\n for (const h of g.holes) holeWires.push(await buildProfileWire(wp, h))\n const face = unwrapBrepResult(compatFn('makeFace')(outer, holeWires))\n const revolved = unwrapBrepResult(compatFn('revolve')(face, { at: startW, axis: dir, angle: rad }))\n const solid = adoptBrepjsProduct(revolved) as Shape\n result = result ? await fuseShapes(result, solid) : solid\n }\n\n const base = wp.shape\n let shape = result as Shape\n if (combine === 'cut' && base) shape = await cutShapes(base, shape)\n else if (combine === true && base) shape = await fuseShapes(base, shape)\n // combine === false → keep the revolved solid alone\n\n return clone(wp, {\n shape,\n pendingWires: [],\n pendingPolygon: undefined,\n pendingRect: undefined,\n pendingCircle: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n}\n\n/** Options accepted by {@link loft}. */\nexport interface LoftOptions {\n ruled?: boolean\n combine?: boolean | 'cut'\n /** Degenerate start point (upstream `loft(vertex(...), ...)`) — world coordinates. */\n startPoint?: [number, number, number]\n /** Degenerate end point (upstream `loft(..., vertex(...))`) — world coordinates. */\n endPoint?: [number, number, number]\n}\n\n/** True when the carrier holds at least one solid (upstream `findSolid()` gate). */\nfunction hasSolidBase(shape: Shape): boolean {\n try {\n return (brepjsCompat.getSolids(borrowBrepjsShape(shape) as never) as unknown[]).length > 0\n } catch {\n return false\n }\n}\n\n/** Collect loft sections from a workplane: pending wires first, then stacked faces. */\nasync function collectLoftSections(wp: Workplane, sections: unknown[]): Promise<void> {\n const wires = (wp.pendingWires ?? []).filter((w) => !w.construction)\n for (const w of wires) {\n sections.push(await buildProfileWire(wp, w))\n }\n if (wires.length === 0 && wp.shape) {\n // Upstream `Workplane().add(face)...loft()` lofts the stacked faces of\n // wp.shape: each face's outer wire becomes a loft section (holes are\n // intentionally dropped — upstream section extraction is outerWire-only).\n const shapeFaces = compatFn('getFaces')(borrowBrepjsShape(wp.shape)) as unknown[]\n for (const f of shapeFaces) {\n sections.push(compatFn('outerWire')(f))\n }\n }\n}\n\n/**\n * loft — CadQuery `Workplane.loft` parity.\n *\n * Consumes the pending wire LIST as loft sections (each wire built on its own\n * creation-plane snapshot, so intermediate workplane(offset)/transformed moves\n * are honored). Upstream default is a smooth (ruled=False) loft.\n *\n * Additional workplanes may be passed positionally (upstream free-function form\n * `loft(w1, w2, w3)`): each contributes its own pending wires, or — when it\n * carries no pending wire — the outer wires of its stacked faces.\n *\n * @param wp - Workplane\n * @param rest - extra section workplanes, plus at most one options object\n * @returns Promise<Workplane>\n */\nexport async function loft(wp: Workplane, ...rest: (Workplane | LoftOptions)[]): Promise<Workplane> {\n const opts = rest.find((x): x is LoftOptions => !(x as Workplane).__cq)\n const extraWps = rest.filter((x): x is Workplane => (x as Workplane).__cq === true)\n const sections: unknown[] = []\n await collectLoftSections(wp, sections)\n for (const other of extraWps) {\n await collectLoftSections(other, sections)\n }\n if (sections.length === 0 && !opts?.startPoint && !opts?.endPoint) {\n throw new Error('[cq-compat] loft: no pending wire sections')\n }\n\n wp = await applyPendingFacePlane(wp)\n const loftCfg: Record<string, unknown> = { ruled: opts?.ruled ?? false }\n if (opts?.startPoint) loftCfg.startPoint = opts.startPoint\n if (opts?.endPoint) loftCfg.endPoint = opts.endPoint\n const solid = adoptBrepjsProduct(\n unwrapBrepResult(compatFn('loft')(sections, loftCfg)),\n ) as Shape\n\n const base = wp.shape\n let shape = solid\n const combine = opts?.combine ?? true\n if (combine === 'cut' && base) shape = await cutShapes(base, shape)\n else if (combine === true && base && hasSolidBase(base)) shape = await fuseShapes(base, shape)\n // combine === false → keep the loft alone\n // a non-solid carrier (e.g. `Workplane().add(face)`) is left alone too:\n // upstream `Workplane.loft` only fuses when the stack holds a solid\n // (`findSolid()` returns None otherwise — test_loft_face).\n\n return clone(wp, {\n shape,\n pendingWires: [],\n pendingPolygon: undefined,\n pendingRect: undefined,\n pendingCircle: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n}\n\n/**\n * cutBlind\n * @param wp - Workplane\n * @param depth - number\n * @param opts - { w?: number; d?: number; radius?: number }\n * @returns Promise<Workplane>\n */\nexport async function cutBlind(\n wp: Workplane,\n depth: number,\n opts?: { w?: number; d?: number; radius?: number; taper?: number },\n): Promise<Workplane> {\n if (!wp.shape) return wp\n const base = wp.shape\n wp = await applyPendingFacePlane(wp)\n const absDepth = Math.abs(depth)\n const invNormal: [number, number, number] = [-wp.normal[0], -wp.normal[1], -wp.normal[2]]\n let result = base\n if (opts?.taper) {\n // Tapered pocket via kernel draftPrism (same sign convention as extrude:\n // positive angle narrows along the extrusion direction, i.e. the pocket\n // opening is the profile and the bottom is smaller). Verified vs 2.8.0:\n // rect(2,2).extrude(2).faces(\">Z\").workplane().rect(1,1).cutBlind(-1,\n // taper=5) -> vol 7.2.\n const solidWires = (wp.pendingWires ?? []).filter((w) => !w.construction)\n if (solidWires.length !== 1) {\n throw new Error('[cq-compat] cutBlind: taper requires exactly one pending profile wire')\n }\n const profile = await buildProfileWire(wp, solidWires[0])\n const face = unwrapBrepResult(compatFn('makeFace')(profile))\n const kernel = getKernel() as unknown as OcctKernel\n const raw = (\n kernel as unknown as {\n draftPrism: (\n face: ShapeHandle,\n dx: number,\n dy: number,\n dz: number,\n angleDeg: number,\n ) => ShapeHandle\n }\n ).draftPrism(\n rawShapeId(face) as unknown as ShapeHandle,\n invNormal[0] * absDepth,\n invNormal[1] * absDepth,\n invNormal[2] * absDepth,\n opts.taper,\n )\n const tool = fromHandle(raw)\n result = await cutShapes(base, tool)\n return clone(wp, {\n shape: result,\n faceSel: null,\n edgeSel: null,\n pts: [],\n pendingWires: [],\n pendingRect: undefined,\n pendingCircle: undefined,\n pendingPolygon: undefined,\n })\n }\n // CadQuery semantics: pushPoints() before cutBlind() repeats the cut at every\n // point. With no pushed points, the cut happens at the workplane origin.\n const ptsArr = eachPoints(wp)\n for (const [px, py] of ptsArr) {\n const cutWp: Workplane = {\n ...wp,\n origin: localToWorld(wp, px, py),\n normal: invNormal,\n }\n let tool: Shape\n if (hasPathWire(wp)) {\n // Drafted wire (moveTo/lineTo/polyline + close): extrude the profile into\n // the cut tool along the (inverted) workplane normal.\n tool = await pendingPathPrism(wp, [\n invNormal[0] * absDepth,\n invNormal[1] * absDepth,\n invNormal[2] * absDepth,\n ])\n } else if (wp.pendingCircle) {\n tool = await makeCylinderAt(cutWp, wp.pendingCircle.radius, absDepth)\n } else if (wp.pendingRect) {\n tool = await makeBoxAt(cutWp, wp.pendingRect.w, wp.pendingRect.d, absDepth)\n } else if (wp.pendingPolygon) {\n tool = await makePolygonPrismAt(cutWp, wp.pendingPolygon, absDepth, invNormal)\n } else if (opts?.radius !== undefined) {\n tool = await makeCylinderAt(cutWp, opts.radius, absDepth)\n } else if (opts?.w !== undefined && opts?.d !== undefined) {\n tool = await makeBoxAt(cutWp, opts.w, opts.d, absDepth)\n } else {\n tool = await makeBoxAt(cutWp, 1000, 1000, absDepth)\n }\n result = await cutShapes(result, tool)\n }\n return clone(wp, { shape: result, faceSel: null, edgeSel: null, pts: [], pendingWires: [], pendingRect: undefined, pendingCircle: undefined, pendingPolygon: undefined })\n}\n\n/**\n * cutThruAll\n * @param wp - Workplane\n * @returns Promise<Workplane>\n *\n * CadQuery semantics (verified vs cadquery 2.8.0 `Workplane.cutThruAll`):\n * uses the pending 2D profile to cut through ALL material in BOTH normal\n * directions of the workplane. The tool body spans the whole solid along\n * the workplane normal (computed from the shape bounding box), so it is\n * exact for any profile depth.\n */\nexport async function cutThruAll(wp: Workplane): Promise<Workplane> {\n if (!wp.shape) return wp\n const base = wp.shape\n wp = await applyPendingFacePlane(wp)\n if (!wp.pendingCircle && !wp.pendingRect && !wp.pendingPolygon && !hasPathWire(wp)) {\n throw new Error('[cq-compat] cutThruAll requires a pending 2D profile')\n }\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const o = Array.isArray(wp.origin) ? wp.origin : ([0, 0, 0] as [number, number, number])\n const bmin = bboxMin(base)\n const bmax = bboxMax(base)\n // Span: farthest bbox corner from the workplane origin along the normal.\n let span = 0\n for (const cx of [bmin[0], bmax[0]]) {\n for (const cy of [bmin[1], bmax[1]]) {\n for (const cz of [bmin[2], bmax[2]]) {\n span = Math.max(span, Math.abs((cx - o[0]) * n[0] + (cy - o[1]) * n[1] + (cz - o[2]) * n[2]))\n }\n }\n }\n const B = span + 1\n // CadQuery semantics: pushPoints() before cutThruAll() repeats the cut at\n // every point (mirrors cutBlind). With no pushed points, one cut at the\n // workplane origin.\n const ptsArr = eachPoints(wp)\n let shape = base\n for (const [px, py] of ptsArr) {\n // Tool base at point - n·B, extending 2B along +n — covers both directions.\n const thruWp: Workplane = { ...wp, origin: vsub(localToWorld(wp, px, py), vscale(n, B)) }\n let tool: Shape\n if (hasPathWire(wp)) {\n // Drafted wire: the tool must span the whole solid along the normal and\n // start B below the workplane — same envelope as the primitive tools.\n // The profile lives on its own creation plane, so the offset goes into\n // the prism base, not into wp.origin.\n tool = await pendingPathPrism(\n wp,\n [n[0] * 2 * B, n[1] * 2 * B, n[2] * 2 * B],\n vscale(n, -B),\n )\n } else if (wp.pendingCircle) {\n tool = await makeCylinderAt(thruWp, wp.pendingCircle.radius, 2 * B)\n } else if (wp.pendingRect) {\n tool = await makeBoxAt(thruWp, wp.pendingRect.w, wp.pendingRect.d, 2 * B)\n } else {\n tool = await makePolygonPrismAt(thruWp, wp.pendingPolygon!, 2 * B, n)\n }\n shape = await cutShapes(shape, tool)\n }\n return clone(wp, { shape, faceSel: null, edgeSel: null, pts: [], pendingWires: [], pendingRect: undefined, pendingCircle: undefined, pendingPolygon: undefined })\n}\n\n/**\n * hole\n * @param wp - Workplane\n * @param diameter - number\n * @param depth - number\n * @returns Promise<Workplane>\n */\nexport async function hole(\n wp: Workplane,\n diameter: number,\n depth?: number,\n): Promise<Workplane> {\n if (!wp.shape) return wp\n const radius = diameter / 2\n const max = await bboxMax(wp.shape)\n const min = await bboxMin(wp.shape)\n // Through-hole with margin, measured along the workplane normal.\n const ext: [number, number, number] = [max[0] - min[0], max[1] - min[1], max[2] - min[2]]\n const totalHeight = Math.abs(vdot(ext, wp.normal)) + 4\n const holeHeight = depth ?? totalHeight\n\n const points = eachPoints(wp)\n let result = wp.shape\n\n for (const [px, py] of points) {\n const holeOrigin = localToWorld(wp, px, py)\n const invNormal: [number, number, number] = [-wp.normal[0], -wp.normal[1], -wp.normal[2]]\n const cyl = await makeCylinderAt(\n { ...wp, origin: holeOrigin, normal: invNormal },\n radius,\n holeHeight,\n )\n result = await cutShapes(result, cyl)\n }\n\n return clone(wp, { shape: result, faceSel: null, edgeSel: null, vertexSel: null, pts: [] })\n}\n\n/**\n * cboreHole\n * @param wp - Workplane\n * @param diameter - number\n * @param cboreDiameter - number\n * @param cboreDepth - number\n * @param depth - number | undefined (bore depth; undefined drills through, upstream depth=None)\n * @returns Promise<Workplane>\n */\nexport async function cboreHole(\n wp: Workplane,\n diameter: number,\n cboreDiameter: number,\n cboreDepth: number,\n depth?: number,\n): Promise<Workplane> {\n // hole() consumes and clears wp.pts — snapshot them first so the counterbore\n // lands on every pushed point, not just the origin fallback [0, 0].\n const savedPts = Array.isArray(wp.pts) ? [...wp.pts] : []\n let result = await hole(wp, diameter, depth)\n // Counterbore: larger shallow hole. Upstream (verified vs cadquery 2.8.0\n // Workplane.cboreHole) cuts EXACTLY cboreDepth below the workplane — the old\n // \"+1 safety margin\" over-cut every counterbore by 1 mm (parity harness,\n // testCounterBores__c2).\n if (result.shape) {\n const cboreRadius = cboreDiameter / 2\n const points = savedPts.length > 0 ? savedPts : ([[0, 0]] as [number, number][])\n let shape = result.shape\n for (const [px, py] of points) {\n const origin = localToWorld(result, px, py)\n const invNormal: [number, number, number] = [-result.normal[0], -result.normal[1], -result.normal[2]]\n const cyl = await makeCylinderAt({ ...result, origin, normal: invNormal }, cboreRadius, cboreDepth)\n shape = await cutShapes(shape, cyl)\n }\n result = clone(result, { shape })\n }\n return clone(result, { pts: [] })\n}\n\n/**\n * cskHole\n * @param wp - Workplane\n * @param diameter - number\n * @param cskDiameter - number\n * @param cskAngle - number\n * @returns Promise<Workplane>\n */\nexport async function cskHole(\n wp: Workplane,\n diameter: number,\n cskDiameter: number,\n cskAngle: number,\n): Promise<Workplane> {\n // hole() consumes and clears wp.pts — snapshot them first (same as cboreHole).\n const savedPts = Array.isArray(wp.pts) ? [...wp.pts] : []\n let result = await hole(wp, diameter)\n if (result.shape) {\n const cskRadius = cskDiameter / 2\n // CadQuery cskHole: full cone from cskRadius at the surface to an apex,\n // depth h = cskRadius / tan(cskAngle/2).\n const cskDepth = cskRadius / Math.tan((cskAngle * Math.PI) / 360)\n const points = savedPts.length > 0 ? savedPts : ([[0, 0]] as [number, number][])\n let shape = result.shape\n for (const [px, py] of points) {\n const origin = localToWorld(result, px, py)\n const invNormal: [number, number, number] = [-result.normal[0], -result.normal[1], -result.normal[2]]\n const cone = await makeConeAt({ ...result, origin }, cskRadius, cskDepth, invNormal)\n shape = await cutShapes(shape, cone)\n }\n result = clone(result, { shape })\n }\n return clone(result, { pts: [] })\n}\n\n/**\n * threadedHole\n * @param wp - Workplane\n * @param diameterOrFastener - number | unknown\n * @param depth - number\n * @returns Promise<Workplane>\n */\nexport async function threadedHole(\n wp: Workplane,\n diameterOrFastener: number | unknown,\n depth?: number,\n): Promise<Workplane> {\n const diameter = typeof diameterOrFastener === 'number' ? diameterOrFastener : 5\n return hole(wp, diameter, depth)\n}\n\n/**\n * faces\n * @param wp - Workplane\n * @param sel - string\n * @returns Workplane\n */\nexport function faces(wp: Workplane, sel: string): Workplane {\n return clone(wp, { faceSel: sel, edgeSel: null, vertexSel: null })\n}\n\n/**\n * edges\n * @param wp - Workplane\n * @param sel - string | { slice?: [number, number]; index?: number }\n * @returns Workplane\n */\nexport function edges(\n wp: Workplane,\n sel?: string | { slice?: [number, number]; index?: number },\n): Workplane {\n let pts = wp.edgePts ?? (Array.isArray(wp.pts) ? wp.pts : [])\n if (sel && typeof sel === 'object') {\n if (sel.slice) {\n const [start, end] = sel.slice\n pts = pts.slice(start === undefined ? 0 : start, end === undefined ? pts.length : end)\n } else if (sel.index !== undefined) {\n const idx = sel.index < 0 ? pts.length + sel.index : sel.index\n pts = [pts[idx]]\n }\n }\n return clone(wp, { edgeSel: typeof sel === 'string' ? sel : '', faceSel: null, vertexSel: null, pts: [...pts] })\n}\n\n/**\n * vertices\n * @param wp - Workplane\n * @param sel - string | { slice?: [number, number]; index?: number }\n * @returns Workplane\n */\nexport function vertices(\n wp: Workplane,\n sel?: string | { slice?: [number, number]; index?: number },\n): Workplane {\n let pts = Array.isArray(wp.pts) ? wp.pts : []\n if (sel && typeof sel === 'object') {\n if (sel.slice) {\n const [start, end] = sel.slice\n pts = pts.slice(start === undefined ? 0 : start, end === undefined ? pts.length : end)\n } else if (sel.index !== undefined) {\n const idx = sel.index < 0 ? pts.length + sel.index : sel.index\n pts = [pts[idx]]\n }\n }\n return clone(wp, { vertexSel: typeof sel === 'string' ? sel : '', faceSel: null, edgeSel: null, pts: [...pts] })\n}\n\n/**\n * solids — CadQuery `Workplane.solids(selector)` parity (selector forms not\n * supported; bare `solids()` only).\n *\n * Upstream returns a new Workplane whose stack holds each solid of the current\n * compound as a separate object, so `val()` is the FIRST solid (verified vs\n * cadquery 2.8.0: test_map_apply_filter_sort w.val() = vol 1.0 solid). The\n * cq-compat carrier keeps a single `.shape`, so `solids()` mirrors the\n * observable contract: the carrier shape becomes the first solid of the\n * compound (a single-solid shape passes through unchanged).\n *\n * @param wp - Workplane\n * @returns Workplane whose carried shape is the compound's first solid\n */\nexport function solids(wp: Workplane): Workplane {\n if (!wp.shape) return wp\n const handle = brepOf(wp.shape)\n if (handle === undefined) return wp\n const kernel = getKernel() as unknown as OcctKernel\n const sub = kernel.getSubShapes(handle as unknown as ShapeHandle, 'solid') as unknown as ShapeHandle[]\n if (sub.length === 0) return wp\n // Adopt the first solid into faijs ownership; release the rest (raw kernel\n // getSubShapes copies each sub-shape into its own arena slot — same contract\n // the kernel's own makeWireFromMixed wrapper honors).\n for (let i = 1; i < sub.length; i++) kernel.release(sub[i])\n return clone(wp, { shape: fromHandle(sub[0]) })\n}\n\n/**\n * workplane\n * @param wp - Workplane\n * @param opts - { centerOption?: string; offset?: number }\n * @returns Promise<Workplane>\n */\nexport async function workplane(\n wp: Workplane,\n opts?: { centerOption?: string; offset?: number; invert?: boolean },\n): Promise<Workplane> {\n // Upstream (cadquery 2.8.0 Workplane.workplane): invert flips the plane\n // normal (Plane.invert keeps xDir, flips zDir, yDir = zDir × xDir flips\n // accordingly); the offset is then applied along the (possibly inverted)\n // normal.\n const invert = opts?.invert === true\n const flip = (n: [number, number, number]): [number, number, number] => [\n -n[0],\n -n[1],\n -n[2],\n ]\n if (!wp.shape || !wp.faceSel) {\n // No face selected — just apply offset\n const normal = invert ? flip(wp.normal) : wp.normal\n if (opts?.offset) {\n const offset = vscale(normal, opts.offset)\n return clone(wp, { origin: vadd(wp.origin, offset), faceSel: null })\n }\n if (invert) {\n const yDir: [number, number, number] = [\n normal[1] * wp.xDir[2] - normal[2] * wp.xDir[1],\n normal[2] * wp.xDir[0] - normal[0] * wp.xDir[2],\n normal[0] * wp.xDir[1] - normal[1] * wp.xDir[0],\n ]\n return clone(wp, { normal, yDir, faceSel: null })\n }\n return clone(wp, { faceSel: null })\n }\n\n const { center, normal: faceNormal } = await resolveFaceSelector(wp.shape, wp.faceSel, opts?.centerOption)\n // CadQuery default centerOption is \"ProjectedOrigin\": project the current\n // origin onto the face plane. \"CenterOfBoundBox\"/\"CenterOfMass\" keep the\n // face centroid returned by resolveFaceSelector.\n let newOrigin: [number, number, number]\n if (opts?.centerOption && opts.centerOption !== 'ProjectedOrigin') {\n newOrigin = center\n } else {\n const t = vdot(vsub(center, wp.origin), faceNormal)\n newOrigin = vadd(wp.origin, vscale(faceNormal, t))\n }\n const normal = invert ? flip(faceNormal) : faceNormal\n if (opts?.offset) {\n newOrigin = vadd(newOrigin, vscale(normal, opts.offset))\n }\n // Upstream Workplane.workplane `_computeXdir`: xDir = (0,0,1)×normal, or\n // (1,0,0) when the face is parallel with the XY plane (degenerate cross);\n // then yDir = normal×xDir. Verified to reproduce FACE_AXES for all six axis\n // normals while also supporting arbitrary (e.g. faces(\"+XY\") diagonal) ones.\n let xDir: [number, number, number] = [1, 0, 0]\n const crLen = Math.hypot(normal[1], normal[0])\n if (crLen > 1e-9) {\n xDir = [-normal[1] / crLen, normal[0] / crLen, 0]\n }\n const yDir: [number, number, number] = [\n normal[1] * xDir[2] - normal[2] * xDir[1],\n normal[2] * xDir[0] - normal[0] * xDir[2],\n normal[0] * xDir[1] - normal[1] * xDir[0],\n ]\n return clone(wp, {\n origin: newOrigin,\n normal,\n xDir,\n yDir,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n}\n\n/**\n * center\n * @param wp - Workplane\n * @param x - number\n * @param y - number\n * @returns Workplane\n */\nexport function center(wp: Workplane, x: number, y: number): Workplane {\n // CadQuery semantics: offset along the workplane LOCAL x/y axes.\n return clone(wp, { origin: localToWorld(wp, x, y) })\n}\n\n/**\n * pushPoints\n * @param wp - Workplane\n * @param pts - [number, number][]\n * @returns Workplane\n */\nexport function pushPoints(wp: Workplane, pts: [number, number][]): Workplane {\n const existing = Array.isArray(wp.pts) ? wp.pts : []\n return clone(wp, { pts: [...existing, ...pts] })\n}\n\n/**\n * translate\n * @param wp - Workplane\n * @param v - [number, number, number]\n * @returns Promise<Workplane>\n */\nexport async function translate(\n wp: Workplane,\n v: [number, number, number],\n): Promise<Workplane> {\n if (!wp.shape) return clone(wp, { origin: vadd(wp.origin, v) })\n const shape = await cad.translate(wp.shape, { offset: v })\n return clone(wp, { shape, origin: vadd(wp.origin, v) })\n}\n\n/**\n * rotate\n * @param wp - Workplane\n * @param axis - [number, number, number]\n * @param angle - number\n * @returns Promise<Workplane>\n */\nexport async function rotate(\n wp: Workplane,\n axis: [number, number, number],\n angle: number,\n): Promise<Workplane> {\n if (!wp.shape) return wp\n const anglesDeg: [number, number, number] = [\n axis[0] * angle,\n axis[1] * angle,\n axis[2] * angle,\n ]\n const shape = await cad.rotate_euler(wp.shape, { anglesDeg })\n return clone(wp, { shape })\n}\n\n/**\n * Mirror-plane normals for the string form (upstream `Shape.mirror`,\n * cadquery 2.8.0: both spellings of a plane map to the SAME mirror plane —\n * 'YX' has normal (0,-1,0) but mirrors through the same y=0 plane as 'XZ').\n */\nconst MIRROR_PLANE_NORMALS: Record<string, [number, number, number]> = {\n XY: [0, 0, 1],\n YX: [0, 0, 1],\n XZ: [0, 1, 0],\n ZX: [0, 1, 0],\n YZ: [1, 0, 0],\n ZY: [1, 0, 0],\n}\n\n/**\n * mirror — full upstream `Workplane.mirror` semantics (cadquery 2.8.0, verified\n * against cq.py:1113):\n * - string form: 'XY'..'ZY' named mirror planes\n * - vector form: plane normal, mirrored about `basePointVector` (default origin)\n * - Workplane form (upstream Face form): normal + center of the selected face;\n * basePointVector only overrides the center when explicitly given\n * - `union`: fuse the mirrored copy with the original (upstream `self.union(newS)`)\n *\n * The kernel projection is `cad.mirror(shape, { normal, at })` — the previous\n * implementation passed `{ plane }`, which MirrorOptions does not know, so every\n * mirror silently used the default normal [1,0,0] (latent bug, found while\n * writing the test_mirror mirrors).\n *\n * @param wp - Workplane\n * @param mirrorPlane - 'XY'..'ZY' | plane normal vector | Workplane carrying a face selection (default 'XY')\n * @param basePointVector - point the mirror plane passes through (default: the selected face centre for the Workplane form, otherwise the world origin)\n * @param union - fuse the mirrored copy with the original (default false)\n * @returns Promise<Workplane> carrying the mirrored (or unioned) shape\n */\nexport async function mirror(\n wp: Workplane,\n mirrorPlane?: string | number[] | Workplane,\n basePointVector?: [number, number, number],\n union?: boolean,\n): Promise<Workplane> {\n if (!wp.shape) return wp\n let normal: [number, number, number]\n let at: [number, number, number]\n if (mirrorPlane && typeof mirrorPlane === 'object' && !Array.isArray(mirrorPlane)) {\n // Workplane carrying a face selection (upstream Face form).\n const fp = mirrorPlane as Workplane\n if (!fp.faceSel || !fp.shape) return wp\n const resolved = await resolveFaceSelector(fp.shape, fp.faceSel)\n normal = resolved.normal\n at = basePointVector ?? resolved.center\n } else if (Array.isArray(mirrorPlane)) {\n normal = [mirrorPlane[0] ?? 0, mirrorPlane[1] ?? 0, mirrorPlane[2] ?? 0]\n at = basePointVector ?? [0, 0, 0]\n } else {\n const key = String(mirrorPlane ?? 'XY').toUpperCase()\n normal = MIRROR_PLANE_NORMALS[key] ?? [0, 0, 1]\n at = basePointVector ?? [0, 0, 0]\n }\n const mirrored = await cad.mirror(wp.shape, { normal, at })\n const shape = union ? await fuseShapes(wp.shape, mirrored) : mirrored\n // Upstream returns a newObject stack holding only the mirrored/unioned\n // objects — pending selectors do not survive a mirror.\n return clone(wp, { shape, faceSel: null, edgeSel: null, vertexSel: null })\n}\n\n/**\n * faceCompound — extract the faces picked by a direction selector as a\n * standalone compound Shape (upstream module-level `Shape.faces(\">Z\")`, which\n * returns a Compound of faces — unlike `Workplane.faces()`, which only records\n * the selection). Needed by test_single_ent_selector where the exported var IS\n * the face compound (ref: Compound, area 2 = two unit-box top faces).\n *\n * `sel = 'all'` picks EVERY face of the shape — the upstream\n * `compound(shape.Faces())` free-function form (test_constructors c1/c2).\n *\n * @param wp - Workplane\n * @param sel - direction selector (\">Z\", \"<X\", …) or 'all' for every face\n * @returns Promise<Workplane> carrying the face compound\n */\nexport async function faceCompound(wp: Workplane, sel: string): Promise<Workplane> {\n if (!wp.shape) return wp\n const s = NAMED_VIEW_TO_AXIS[sel.trim().toLowerCase()] ?? sel\n if (s.trim().toLowerCase() === 'all') {\n const faces = compatFn('getFaces')(borrowBrepjsShape(wp.shape)) as unknown[]\n if (faces.length === 0) {\n throw new Error('[cq-compat] faceCompound \"all\": shape has no faces')\n }\n const product = compatFn('makeCompound')(faces) as unknown\n const shape = adoptBrepjsProduct(unwrapBrepResult(product))\n return clone(wp, { shape, faceSel: null, edgeSel: null, vertexSel: null })\n }\n const m = /^([<>])([XYZ])(?:\\[-?\\d+\\])?$/.exec(s.trim())\n if (!m) {\n throw new Error(`[cq-compat] unsupported face selector for faceCompound \"${sel}\"`)\n }\n const axis = m[2] === 'X' ? 0 : m[2] === 'Y' ? 1 : 2\n const sign = m[1] === '>' ? 1 : -1\n const bounds = (h: unknown): Record<string, number> =>\n compatFn('getBounds')(h) as Record<string, number>\n const faces = compatFn('getFaces')(borrowBrepjsShape(wp.shape)) as unknown[]\n // DirectionMinMaxSelector: among faces perpendicular to the axis, take ALL\n // faces whose center sits at the extremum (ties included — the two-boxes\n // compound exports BOTH top faces).\n const perp = faces.filter((f) => {\n const b = bounds(f)\n return [b.xMax - b.xMin, b.yMax - b.yMin, b.zMax - b.zMin][axis] <= 0.1\n })\n if (perp.length === 0) {\n throw new Error(`[cq-compat] no planar face for selector \"${sel}\"`)\n }\n const center = (b: Record<string, number>): number =>\n [(b.xMin + b.xMax) / 2, (b.yMin + b.yMax) / 2, (b.zMin + b.zMax) / 2][axis]\n const extremum = perp\n .map((f) => center(bounds(f)))\n .reduce((best, c) => (sign * c > sign * best ? c : best))\n const picked = perp.filter((f) => Math.abs(center(bounds(f)) - extremum) <= 1e-6)\n const product = compatFn('makeCompound')(picked) as unknown\n const shape = adoptBrepjsProduct(unwrapBrepResult(product))\n return clone(wp, { shape, faceSel: null, edgeSel: null, vertexSel: null })\n}\n\n/**\n * edgeCompound — extract the edges picked by a direction selector as a\n * standalone compound Shape (upstream `shape.edges(\">Z\")` on a Solid, which\n * returns a Compound of edges). Needed by TestCQSelectors.testShape where the\n * exported var IS the edge compound (ref: Compound of the 4 top edges).\n *\n * Semantics (upstream DirectionMinMaxSelector = CenterNthSelector n=-1):\n * order ALL edges by their center-of-mass projection onto the axis and take\n * the extremum cluster (ties included). For a centered box the vertical edges'\n * centers sit at z=0 while the top edges sit at z=+h/2 — so `\">Z\"` picks\n * exactly the 4 top edges.\n *\n * @param wp - Workplane\n * @param sel - direction selector (\">Z\", \"<X\", …) picking the extremum edge cluster\n * @returns Promise<Workplane> carrying the edge compound\n */\nexport async function edgeCompound(wp: Workplane, sel: string): Promise<Workplane> {\n if (!wp.shape) return wp\n const s = NAMED_VIEW_TO_AXIS[sel.trim().toLowerCase()] ?? sel\n const m = /^([<>])([XYZ])(?:\\[-?\\d+\\])?$/.exec(s.trim())\n if (!m) {\n throw new Error(`[cq-compat] unsupported face selector for edgeCompound \"${sel}\"`)\n }\n const axis = m[2] === 'X' ? 0 : m[2] === 'Y' ? 1 : 2\n const sign = m[1] === '>' ? 1 : -1\n const bounds = (h: unknown): Record<string, number> =>\n compatFn('getBounds')(h) as Record<string, number>\n const edges = compatFn('getEdges')(borrowBrepjsShape(wp.shape)) as unknown[]\n const center = (b: Record<string, number>): number =>\n [(b.xMin + b.xMax) / 2, (b.yMin + b.yMax) / 2, (b.zMin + b.zMax) / 2][axis]\n const extremum = edges\n .map((e) => center(bounds(e)))\n .reduce((best, c) => (sign * c > sign * best ? c : best))\n const picked = edges.filter((e) => Math.abs(center(bounds(e)) - extremum) <= 1e-6)\n const product = compatFn('makeCompound')(picked) as unknown\n const shape = adoptBrepjsProduct(unwrapBrepResult(product))\n return clone(wp, { shape, faceSel: null, edgeSel: null, vertexSel: null })\n}\n\n// ── Location / moved / move (阶段 E) ─────────────────────────────────────\n\n/**\n * Minimal analogue of CadQuery's `Location`.\n *\n * Upstream (`cadquery/occ_impl/geom.py::Location`) builds a `gp_Trsf` from a\n * translation plus an Euler rotation using **degrees** and\n * `gp_Extrinsic_XYZ` order, then maps `p -> R·p + t` (rotate first, translate\n * second). We keep exactly those two fields; rotation is stored in degrees so\n * mirrors can pass upstream angle literals verbatim.\n *\n * Not modelled: the `Location(Plane)` / `Location(Plane, VectorLike)` overloads\n * and `TopLoc_Location` composition — no mirror case needs them yet.\n */\nexport interface CqLocation {\n readonly __cqLocation: true\n /** Translation (mm). */\n readonly pos: [number, number, number]\n /** Euler rotation in degrees (upstream gp_Extrinsic_XYZ). */\n readonly rot: [number, number, number]\n}\n\nfunction locNum(v: unknown): number {\n return typeof v === 'number' && Number.isFinite(v) ? v : 0\n}\n\nfunction locVec3(a: unknown): [number, number, number] {\n if (Array.isArray(a)) return [locNum(a[0]), locNum(a[1]), locNum(a[2])]\n return [0, 0, 0]\n}\n\n/**\n * Type guard for a `Location` produced by {@link Location}.\n *\n * @param v - value to test\n * @returns True when `v` is a cq-compat Location\n */\nexport function isLocation(v: unknown): v is CqLocation {\n return typeof v === 'object' && v !== null && (v as { __cqLocation?: unknown }).__cqLocation === true\n}\n\n/**\n * Location — CadQuery `Location` constructor.\n *\n * Accepted forms (all verified against the upstream overloads used by\n * `tests/test_free_functions.py::test_moved`):\n * `Location([x, y, z])`\n * `Location([x, y, z], [rx, ry, rz])`\n * `Location(x, y, z)` / `Location(x, y, z, rx, ry, rz)`\n * `Location({ x, y, z, rx, ry, rz })` ← the `.moved(z=-1)` keyword form\n *\n * @param args - overload payload: `[pos]`, `[pos, rot]`, `(x, y, z[, rx, ry, rz])`, or the keyword object\n * @returns CqLocation (position in mm, rotation in degrees)\n */\nexport function Location(...args: unknown[]): CqLocation {\n const nums = args.filter((a): a is number => typeof a === 'number')\n const arrs = args.filter((a): a is unknown[] => Array.isArray(a))\n const obj = args.find((a) => typeof a === 'object' && a !== null && !Array.isArray(a)) as\n | Record<string, unknown>\n | undefined\n\n let pos: [number, number, number] = [0, 0, 0]\n let rot: [number, number, number] = [0, 0, 0]\n if (obj) {\n pos = [locNum(obj.x), locNum(obj.y), locNum(obj.z)]\n rot = [locNum(obj.rx), locNum(obj.ry), locNum(obj.rz)]\n } else if (nums.length >= 6) {\n pos = [nums[0], nums[1], nums[2]]\n rot = [nums[3], nums[4], nums[5]]\n } else if (nums.length >= 3) {\n pos = [nums[0], nums[1], nums[2]]\n } else if (arrs.length >= 2) {\n pos = locVec3(arrs[0])\n rot = locVec3(arrs[1])\n } else if (arrs.length === 1) {\n pos = locVec3(arrs[0])\n }\n return { __cqLocation: true, pos, rot }\n}\n\n/**\n * composeLocations(a, b) — the Location product `a * b` (upstream `Location.__mul__`):\n * apply `b` first, then `a`. Result: R = Ra·Rb, t = Ra·t_b + t_a.\n *\n * Mirrors need this because a Workplane whose carried shape is a **compound**\n * cannot be fed back into `moved` — the faijs runtime only re-attaches the BREP\n * handle across statement boundaries for solids (see `moved`'s KNOWN LIMITATION\n * note), so `bs1.moved(l3, l4)` has to be written as one `moved` over the\n * composed locations instead of two chained ones.\n *\n * @param a - outer location (applied second)\n * @param b - inner location (applied first)\n * @returns CqLocation holding the product a·b\n */\nexport function composeLocations(a: CqLocation, b: CqLocation): CqLocation {\n const ra = rotationMatrixDeg(a.rot)\n const rb = rotationMatrixDeg(b.rot)\n const mul = (m: number[], n: number[]): number[] => {\n const out = new Array<number>(9).fill(0)\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n out[i * 3 + j] = m[i * 3] * n[j] + m[i * 3 + 1] * n[3 + j] + m[i * 3 + 2] * n[6 + j]\n }\n }\n return out\n }\n const r = mul(ra, rb)\n const tb = b.pos\n const t: [number, number, number] = [\n ra[0] * tb[0] + ra[1] * tb[1] + ra[2] * tb[2] + a.pos[0],\n ra[3] * tb[0] + ra[4] * tb[1] + ra[5] * tb[2] + a.pos[1],\n ra[6] * tb[0] + ra[7] * tb[1] + ra[8] * tb[2] + a.pos[2],\n ]\n // recover Euler angles from the composed matrix (gp_Extrinsic_XYZ: R = Rz·Ry·Rx)\n const rot: [number, number, number] = [0, 0, 0]\n const cy = Math.hypot(r[0], r[3])\n if (cy > 1e-12) {\n rot[1] = (Math.atan2(-r[6], cy) * 180) / Math.PI\n rot[2] = (Math.atan2(r[3], r[0]) * 180) / Math.PI\n rot[0] = (Math.atan2(r[7], r[8]) * 180) / Math.PI\n } else {\n rot[1] = (Math.atan2(-r[6], cy) * 180) / Math.PI\n rot[2] = 0\n rot[0] = (Math.atan2(-r[5], r[4]) * 180) / Math.PI\n }\n const zero = (v: number): number => (v === 0 ? 0 : v)\n return {\n __cqLocation: true,\n pos: [zero(t[0]), zero(t[1]), zero(t[2])],\n rot: [zero(rot[0]), zero(rot[1]), zero(rot[2])],\n }\n}\n\n/**\n * Normalise the variadic argument list of `moved`/`move` into a Location list.\n *\n * Upstream dispatch (`Shape.moved`, cadquery 2.8.0) — the forms a mirror needs:\n * `moved(loc)` / `moved(loc1, loc2, …)` / `moved([loc1, loc2])`\n * `moved((0,0,1))` / `moved((0,0,1), (0,0,-1))` / `moved([(0,0,1), (0,0,-1)])`\n * `moved(0, 0, -1)` / `moved(z=-1)`\n */\nfunction toLocations(args: unknown[]): CqLocation[] {\n if (args.length === 0) return []\n if (args.every((a) => typeof a === 'number')) {\n const n = args as number[]\n return [\n {\n __cqLocation: true,\n pos: [locNum(n[0]), locNum(n[1]), locNum(n[2])],\n rot: [locNum(n[3]), locNum(n[4]), locNum(n[5])],\n },\n ]\n }\n const out: CqLocation[] = []\n for (const a of args) {\n if (isLocation(a)) {\n out.push(a)\n } else if (Array.isArray(a)) {\n if (a.length > 0 && isLocation(a[0])) {\n out.push(...(a as CqLocation[]))\n } else if (a.length > 0 && Array.isArray(a[0])) {\n for (const v of a) out.push(Location(v as number[]))\n } else {\n out.push(Location(a as number[]))\n }\n } else if (a && typeof a === 'object') {\n out.push(Location(a as Record<string, number>))\n }\n }\n return out\n}\n\n/**\n * Row-major 3x3 rotation for Euler angles in degrees, `gp_Extrinsic_XYZ` order\n * (rotations about the FIXED axes X, then Y, then Z: R = Rz·Ry·Rx) — the order\n * upstream `Location` uses.\n */\nfunction rotationMatrixDeg(rot: [number, number, number]): number[] {\n const rad = Math.PI / 180\n const [rx, ry, rz] = rot.map((d) => d * rad) as [number, number, number]\n const cx = Math.cos(rx)\n const sx = Math.sin(rx)\n const cy = Math.cos(ry)\n const sy = Math.sin(ry)\n const cz = Math.cos(rz)\n const sz = Math.sin(rz)\n const Rx = [1, 0, 0, 0, cx, -sx, 0, sx, cx]\n const Ry = [cy, 0, sy, 0, 1, 0, -sy, 0, cy]\n const Rz = [cz, -sz, 0, sz, cz, 0, 0, 0, 1]\n const mul = (a: number[], b: number[]): number[] => {\n const out = new Array<number>(9).fill(0)\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n out[i * 3 + j] = a[i * 3] * b[j] + a[i * 3 + 1] * b[3 + j] + a[i * 3 + 2] * b[6 + j]\n }\n }\n return out\n }\n return mul(Rz, mul(Ry, Rx))\n}\n\n/**\n * Apply one Location to a shape: rotate about the world origin, then translate\n * (p -> R·p + t, matching upstream `gp_Trsf.SetRotation` + `SetTranslationPart`).\n *\n * Uses the kernel `applyMatrix` projection rather than `cad.translate` /\n * `cad.rotate_euler`: the latter two are solid-only and throw\n * \"input is not BREP\" on a compound, which is exactly what `moved` produces\n * when it is given more than one location.\n */\nasync function applyLocation(shape: Shape, loc: CqLocation): Promise<Shape> {\n const [rx, ry, rz] = loc.rot\n const [x, y, z] = loc.pos\n if (rx === 0 && ry === 0 && rz === 0 && x === 0 && y === 0 && z === 0) return shape\n\n // Two paths, chosen by the number of solids in the carrier:\n //\n // - a SINGLE solid goes through the faijs `cad.rotate_euler` / `cad.translate`\n // defineOps. Those re-register the OCCT handle in a way that survives a\n // statement boundary, so the result exports as a true BREP STEP.\n // - a COMPOUND must use the kernel `applyMatrix` projection (the defineOps\n // are solid-only and reject it). That product does NOT keep its BREP slot\n // across a statement boundary — the STEP then falls back to a\n // TESSELLATED_SOLID — so mirrors avoid feeding a compound back into\n // `moved` (they fold the locations with composeLocations instead).\n const solids = ((): number => {\n try {\n return (brepjsCompat.getSolids(borrowBrepjsShape(shape) as never) as unknown[]).length\n } catch {\n return 0\n }\n })()\n if (solids <= 1) {\n let s = shape\n if (rx !== 0 || ry !== 0 || rz !== 0) {\n s = await cad.rotate_euler(s, { anglesDeg: [rx, ry, rz] })\n }\n if (x !== 0 || y !== 0 || z !== 0) {\n s = await cad.translate(s, { offset: [x, y, z] })\n }\n return s\n }\n const product = unwrapBrepResult(\n compatFn('applyMatrix')(borrowBrepjsShape(shape), {\n linear: rotationMatrixDeg(loc.rot) as never,\n translation: [x, y, z] as never,\n }),\n )\n return adoptBrepjsProduct(product)\n}\n\n/**\n * moved — apply one or more Locations to the carried geometry.\n *\n * Upstream is `Shape.moved(*locs)`: one location returns a moved copy, several\n * return a **compound** holding one copy per location (no boolean union —\n * `test_moved` asserts `bs1.Volume() == 2` and `len(bs1.Solids()) == 2` for two\n * disjoint unit boxes, which only holds for a compound).\n *\n * @param wp - Workplane\n * @param locs - Location | [x,y,z] | {x,y,z,rx,ry,rz} | list thereof\n * @returns Promise<Workplane>\n */\nexport async function moved(wp: Workplane, ...locs: unknown[]): Promise<Workplane> {\n if (!wp.shape) return wp\n const resolved = toLocations(locs)\n const copies: Shape[] = []\n for (const l of resolved) copies.push(await applyLocation(wp.shape, l))\n let shape: Shape\n if (copies.length === 0) {\n shape = wp.shape\n } else if (copies.length === 1) {\n shape = copies[0]\n } else {\n // Upstream `_compound_or_shape` groups the copies without any boolean or\n // clean pass — mirroring that keeps the topology (face/solid counts) equal\n // to upstream, which the STEP comparison gates on.\n const handles = copies.map((c) => borrowBrepjsShape(c))\n shape = adoptBrepjsProduct(unwrapBrepResult(compatFn('makeCompound')(handles)))\n }\n return clone(wp, {\n shape,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n pendingWires: [],\n })\n}\n\n/**\n * move — upstream mutates the shape in place; cq-compat carriers are immutable\n * so this is an alias of {@link moved}.\n *\n * @param wp - Workplane\n * @param locs - same forms as {@link moved}\n * @returns Promise<Workplane>\n */\nexport async function move(wp: Workplane, ...locs: unknown[]): Promise<Workplane> {\n return moved(wp, ...locs)\n}\n\n/**\n * union\n * @param wp - Workplane\n * @param other - Workplane | Shape\n * @returns Promise<Workplane>\n */\nexport async function union(\n wp: Workplane,\n other: Workplane | Shape,\n): Promise<Workplane> {\n if (!wp.shape) return wp\n const otherShape = 'shape' in other ? (other as Workplane).shape : (other as Shape)\n if (!otherShape) return wp\n const shape = await fuseShapes(wp.shape, otherShape)\n return clone(wp, { shape })\n}\n\n/**\n * combine\n * @param wp - Workplane\n * @returns Promise<Workplane>\n *\n * CadQuery semantics note (verified vs cadquery 2.8.0): upstream `combine()`\n * fuses all stack items. cq-compat fuses eagerly inside the building ops\n * (extrude / eachpoint with combine=True), so by the time combine() runs the\n * stack holds a single fused solid — the op degenerates to a `clean()` pass\n * (same-face merge), which matches the upstream test expectations\n * (testCombine: 11 faces either way).\n */\nexport async function combine(wp: Workplane): Promise<Workplane> {\n if (!wp.shape) return wp\n const shape = await cleanShapes(wp.shape)\n return clone(wp, { shape })\n}\n\n/**\n * cut\n * @param wp - Workplane\n * @param other - Workplane | Shape\n * @returns Promise<Workplane>\n */\nexport async function cut(\n wp: Workplane,\n other: Workplane | Shape,\n): Promise<Workplane> {\n if (!wp.shape) return wp\n const otherShape = 'shape' in other ? (other as Workplane).shape : (other as Shape)\n if (!otherShape) return wp\n const shape = await cad.subtract(wp.shape, otherShape)\n return clone(wp, { shape })\n}\n\n/**\n * face — materialize the pending wire LIST as one planar face per outermost\n * wire (upstream module-level `face(*wires)` free function). Enclosed wires\n * become holes of the enclosing face — the same outer/hole grouping `extrude`\n * uses. Several disjoint outer wires yield a Compound of faces.\n *\n * @param wp - Workplane carrying the pending wires\n * @returns Promise<Workplane> whose shape is the face (or face compound)\n */\nexport async function face(wp: Workplane): Promise<Workplane> {\n const all = (wp.pendingWires ?? []).filter((w) => !w.construction)\n if (all.length === 0) throw new Error('[cq-compat] face: no pending wire to build a face from')\n const groups = groupPendingWires(all)\n const faces: Shape[] = []\n for (const g of groups) {\n const outer = await buildProfileWire(wp, g.outer)\n const holeWires: unknown[] = []\n for (const h of g.holes) {\n holeWires.push(await buildProfileWire(wp, h))\n }\n faces.push(adoptBrepjsProduct(unwrapBrepResult(compatFn('makeFace')(outer, holeWires))) as Shape)\n }\n const shape = faces.length === 1 ? faces[0] : makeCompoundShape(faces)\n return clone(wp, {\n shape,\n pendingWires: [],\n pendingRect: undefined,\n pendingCircle: undefined,\n pendingPolygon: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n}\n\n/**\n * vertex — upstream module-level `vertex(x, y, z)` free function: a single\n * point shape. Used as a degenerate loft section (`loft(face, vertex(0,0,1))`)\n * and inside compounds.\n *\n * @param x - world x (default 0)\n * @param y - world y (default 0)\n * @param z - world z (default 0)\n * @returns Shape holding the vertex\n */\nexport function vertex(x: number = 0, y: number = 0, z: number = 0): Shape {\n return adoptBrepjsProduct(unwrapBrepResult(compatFn('makeVertex')([x, y, z]))) as Shape\n}\n\n/**\n * compound — upstream module-level `compound(*shapes)` free function: bundle\n * several shapes into a single Compound WITHOUT any boolean operation. Needed\n * by test_history_bool (imprint result = base solid + tool solid as a\n * compound) and test_union_compound-style cases.\n *\n * Accepts Shapes and Workplanes (their current shape is used); null/empty\n * entries are skipped. Returns a Shape whose value is the compound itself, so\n * mirrors write `let result = c` directly.\n *\n * @param items - Shapes and/or Workplanes to bundle (null/undefined entries are skipped)\n * @returns Compound Shape, or null when no item carries geometry\n */\nexport function compound(...items: (Workplane | Shape | null | undefined)[]): Shape | null {\n const shapes = items\n .map((it) => (it && typeof it === 'object' && 'shape' in (it as Workplane) ? (it as Workplane).shape : (it as Shape)))\n .filter((s): s is Shape => Boolean(s))\n if (shapes.length === 0) return null\n return makeCompoundShape(shapes)\n}\n\n/**\n * intersect\n * @param wp - Workplane\n * @param other - Workplane | Shape\n * @returns Promise<Workplane>\n */\nexport async function intersect(\n wp: Workplane,\n other: Workplane | Shape,\n): Promise<Workplane> {\n if (!wp.shape) return wp\n const otherShape = 'shape' in other ? (other as Workplane).shape : (other as Shape)\n if (!otherShape) return wp\n const shape = await intersectShapes(wp.shape, otherShape)\n return clone(wp, { shape })\n}\n\n/**\n * fillet\n * @param wp - Workplane\n * @param radius - number\n * @returns Promise<Workplane>\n */\n/**\n * Resolve a CadQuery edge selector string to concrete edge handles.\n *\n * Supports CadQuery's parallel-axis selectors \"|X\" / \"|Y\" / \"|Z\" (edges whose\n * bounding box is thin across the two perpendicular axes) and an empty / absent\n * selector meaning \"all edges\". Face/edge geometry beyond axis-parallel lines\n * is out of scope for this layer.\n */\nfunction resolveEdgeSelection(shape: Shape, sel: string | null | undefined): unknown[] {\n const edges = compatFn('getEdges')(borrowBrepjsShape(shape)) as unknown[]\n if (!sel || sel === '') return edges\n const m = /^\\|([XYZ])$/.exec(sel.trim())\n if (!m) {\n throw new Error(`[cq-compat] unsupported edge selector \"${sel}\" (supported: |X |Y |Z)`)\n }\n const axisIdx = m[1] === 'X' ? 0 : m[1] === 'Y' ? 1 : 2\n const perp = [0, 1, 2].filter((i) => i !== axisIdx)\n // The kernel inflates edge bounding boxes by ~0.1mm of tolerance padding, so\n // an axis-parallel edge is identified RELATIVELY: its extent along the axis\n // must dominate the two perpendicular extents (which stay padding-sized).\n const PAD = 0.5 // mm — max perpendicular extent for an axis-parallel edge\n return edges.filter((e) => {\n const b = compatFn('getBounds')(e) as Record<string, number>\n const min = [b.xMin, b.yMin, b.zMin]\n const max = [b.xMax, b.yMax, b.zMax]\n const extents = [max[0] - min[0], max[1] - min[1], max[2] - min[2]]\n const axisExtent = extents[axisIdx]\n return (\n perp.every((i) => extents[i] <= PAD) &&\n axisExtent > 2 * Math.max(extents[perp[0]], extents[perp[1]])\n )\n })\n}\n\n/**\n * Fillet selected edges of the current shape.\n *\n * Edge resolution mirrors chamfer: an explicit `|Z`-style / empty edgeSel goes\n * through `resolveEdgeSelection`; a pending face selection\n * (`.faces(\">Z\").fillet(r)`) fillets THE SELECTED FACE's edges via\n * `resolveFaceEdgeSelection` (upstream `.faces(\"+Z\").edges().fillet(r)`\n * semantics — the missing faceSel branch made testTopFaceFillet fillet all 12\n * edges instead of the 4 top ones). Failures propagate — silently returning\n * the unfilleted shape previously produced plates whose fillets were missing\n * entirely (bp/mb/mt/tp diagnosis, 2026-09-08).\n *\n * @param wp - Workplane whose current shape is filleted; consumes `edgeSel`/`faceSel`.\n * @param radius - Fillet radius in world units.\n * @returns Promise resolving to a new Workplane holding the filleted shape.\n */\nexport async function fillet(wp: Workplane, radius: number): Promise<Workplane> {\n if (!wp.shape) return wp\n let edges: unknown[]\n if (wp.edgeSel !== null && wp.edgeSel !== undefined) {\n edges = resolveEdgeSelection(wp.shape, wp.edgeSel)\n } else if (wp.faceSel) {\n edges = resolveFaceEdgeSelection(wp.shape, wp.faceSel)\n } else {\n edges = resolveEdgeSelection(wp.shape, undefined)\n }\n const result = compatFn('fillet')(borrowBrepjsShape(wp.shape), edges, radius)\n const product = unwrapBrepResult(result)\n const shape = adoptBrepjsProduct(product)\n return clone(wp, { shape, edgeSel: null, faceSel: null })\n}\n\n/**\n * chamfer\n * @param wp - Workplane\n * @param length - number\n * @param length2 - number | undefined\n * @returns Promise<Workplane>\n *\n * CadQuery semantics (verified vs cadquery 2.8.0 `Workplane.chamfer`):\n * chamfers the selected edges of the current shape. Edge resolution order:\n * explicit `edges(\"|Z\")` selector; else, if a face selector is pending\n * (`.faces(\">Z\").chamfer(l)`), the edges OF the selected face; else all\n * edges. LIMITATION: asymmetric `length2` is NOT supported — the occt-wasm\n * kernel chamfer takes a single uniform distance (resolveUniformRadius\n * degrades a pair to d1), so length2 throws instead of silently producing a\n * symmetric chamfer.\n */\nexport async function chamfer(\n wp: Workplane,\n length: number,\n length2?: number,\n): Promise<Workplane> {\n if (length2 !== undefined) {\n throw new Error('[cq-compat] chamfer length2 (asymmetric) is not supported by the occt-wasm kernel')\n }\n if (!wp.shape) return wp\n let edges: unknown[]\n if (wp.edgeSel !== null && wp.edgeSel !== undefined) {\n edges = resolveEdgeSelection(wp.shape, wp.edgeSel)\n } else if (wp.faceSel) {\n edges = resolveFaceEdgeSelection(wp.shape, wp.faceSel)\n } else {\n edges = resolveEdgeSelection(wp.shape, undefined)\n }\n const result = compatFn('chamfer')(borrowBrepjsShape(wp.shape), edges, length)\n const product = unwrapBrepResult(result)\n const shape = adoptBrepjsProduct(product)\n return clone(wp, { shape, edgeSel: null, faceSel: null })\n}\n\n/**\n * Resolve the edges belonging to the face picked by a direction selector\n * (upstream `.faces(\">Z\").chamfer(l)` chamfers the edges of that face).\n * Reuses the direction-minimum/maximum rule of resolveFaceSelector: among\n * faces perpendicular to the axis, the extremal one along it wins; its edges\n * are those whose bounding box lies inside the face's (kernel pads bounds by\n * ~0.1mm of tolerance, so a small positive slack is used).\n */\nfunction resolveFaceEdgeSelection(shape: Shape, sel: string): unknown[] {\n // '+'/'-' are accepted as aliases of '>'/'<' (CadQuery allows both spellings;\n // resolveFaceSelector's axis table does the same).\n const m = /^([<>+-])([XYZ])(?:\\[-?\\d+\\])?$/.exec(sel.trim())\n if (!m) {\n throw new Error(`[cq-compat] unsupported face selector for chamfer \"${sel}\"`)\n }\n const axis = m[2] === 'X' ? 0 : m[2] === 'Y' ? 1 : 2\n const sign = m[1] === '>' || m[1] === '+' ? 1 : -1\n const bounds = (h: unknown): Record<string, number> =>\n compatFn('getBounds')(h) as Record<string, number>\n const faces = compatFn('getFaces')(borrowBrepjsShape(shape)) as unknown[]\n const perp = faces.filter((f) => {\n const b = bounds(f)\n return [b.xMax - b.xMin, b.yMax - b.yMin, b.zMax - b.zMin][axis] <= 0.1\n })\n if (perp.length === 0) {\n throw new Error(`[cq-compat] no planar face for selector \"${sel}\"`)\n }\n const faceCenter = (b: Record<string, number>): number =>\n [(b.xMin + b.xMax) / 2, (b.yMin + b.yMax) / 2, (b.zMin + b.zMax) / 2][axis]\n const target = perp\n .map((f) => ({ f, b: bounds(f) }))\n .reduce((best, cur) => (sign * (faceCenter(cur.b) - faceCenter(best.b)) > 0 ? cur : best))\n const fc = faceCenter(target.b)\n // Edge bounds carry ±0.1mm kernel tolerance padding (measured: a unit-box\n // edge reports extents inflated by 0.2), while face bounds are tight. An\n // edge of the face lies IN its plane, so along the axis it is thin (pure\n // padding) and its center coincides with the face center.\n const EDGE_AXIS_MAX = 0.25\n const EDGE_CENTER_TOL = 0.15\n const edges = compatFn('getEdges')(borrowBrepjsShape(shape)) as unknown[]\n return edges.filter((e) => {\n const b = bounds(e)\n const ext = [b.xMax - b.xMin, b.yMax - b.yMin, b.zMax - b.zMin][axis]\n const c = [(b.xMin + b.xMax) / 2, (b.yMin + b.yMax) / 2, (b.zMin + b.zMax) / 2][axis]\n return ext <= EDGE_AXIS_MAX && Math.abs(c - fc) <= EDGE_CENTER_TOL\n })\n}\n\n/**\n * shell\n *\n * CadQuery `Workplane.shell(thickness)` parity: shells the solid found on the\n * stack, removing the faces selected by a preceding `faces(sel)` (empty\n * selection = `Shape.hollow` — no faces removed, the solid is hollowed into a\n * closed shell, verified vs cadquery 2.8.0: `box(2,2,2).shell(-0.1)` → 12\n * faces, vol 2.168). The kernel call is `OcctKernel.shell` =\n * `BRepOffsetAPI_MakeThickSolidByJoin` (negative thickness → walls inward,\n * positive → walls outward, mirroring upstream sign semantics).\n *\n * Face removal set: single-axis selectors (\">Z\"/\"<Z\"/\"+Z\"/\"-Z\" …) pick the\n * faces perpendicular to the axis whose bbox center sits at the extreme —\n * the same criteria `resolveFaceSelector` uses. Multi-axis and indexed\n * selectors are not supported here yet (the blocked mirrors that need them\n * are out of this phase's scope).\n *\n * @param wp - Workplane\n * @param thickness - number (negative: inward hollow)\n * @returns Promise<Workplane>\n */\nexport async function shell(wp: Workplane, thickness: number): Promise<Workplane> {\n if (!wp.shape) return wp\n const handle = brepOf(wp.shape)\n if (handle === undefined) return wp\n const kernel = getKernel() as unknown as OcctKernel\n const facesToRemove: ShapeHandle[] = []\n if (wp.faceSel) {\n facesToRemove.push(\n ...selectFaceHandlesForRemoval(kernel, handle as unknown as ShapeHandle, wp.faceSel),\n )\n }\n const h = handle as unknown as ShapeHandle\n let shape: Shape\n if (thickness < 0) {\n if (facesToRemove.length > 0) {\n // Walls inward with openings: the kernel call IS MakeThickSolidByJoin\n // semantics (remove faces, offset remaining inward by |thickness|).\n shape = fromHandle(kernel.shell(h, facesToRemove, -thickness, 1e-3))\n } else {\n // Closed hollow (upstream Shape.hollow): kernel.shell with NO removed\n // faces degenerates to the inward-offset solid (measured: box(2,2,2)\n // +0.1 -> 1.8^3 = 5.832), so the wall solid is original minus offset.\n const inner = fromHandle(kernel.shell(h, [], -thickness, 1e-3))\n shape = await cutShapes(wp.shape, inner)\n }\n } else {\n if (facesToRemove.length > 0) {\n // Walls outward with openings. Upstream routes this through\n // MakeThickSolidByJoin (offset + remove + join), which the kernel does\n // not expose: `offset` alone leaves the removed face closed. Cutting the\n // swept slab off each removed face (the earlier heuristic here) produced\n // geometry that does not match any upstream reference, so fail loudly\n // rather than emit an approximation — see testSimpleShell__s1/s3 in\n // tests/mark-blocked.ts.\n throw new Error(\n '[cq-compat] shell: positive thickness (walls outward) with removed faces is not supported',\n )\n }\n // Walls outward: rounded outward offset (arc-joined corners) minus the\n // original solid (verified vs 2.8.0: box(2,2,2).shell(0.1) -> 32 faces,\n // vol 2.592684356757526, bbox +-1.1).\n const outer = fromHandle(kernel.offset(h, thickness, 1e-3))\n shape = await cutShapes(outer, wp.shape)\n }\n return clone(wp, { shape, faceSel: null, edgeSel: null, vertexSel: null })\n}\n\n/**\n * Enumerate the solid's faces and return the removal set for `shell()` for a\n * single-axis selector string. A face participates when its bbox is thin along\n * the axis (perpendicular face) and its bbox center sits at the extreme end\n * picked by the selector (ties collected, matching upstream's multi-face\n * `faces(\"+Z\")` selection semantics).\n */\nfunction selectFaceHandlesForRemoval(\n kernel: OcctKernel,\n handle: ShapeHandle,\n sel: string,\n): ShapeHandle[] {\n const m = /^([<>+-])([XYZ])$/.exec(sel.trim())\n if (!m) {\n throw new Error(\n `[cq-compat] shell: face selector \"${sel}\" not supported (single-axis >Z/<Z/+Z/-Z only)`,\n )\n }\n const axisMap: Record<string, 0 | 1 | 2> = { X: 0, Y: 1, Z: 2 }\n const axis = axisMap[m[2]]\n const sign = m[1] === '<' || m[1] === '-' ? -1 : 1\n const faces = kernel.getSubShapes(handle, 'face') as unknown as ShapeHandle[]\n const perp: { h: ShapeHandle; c: number }[] = []\n for (const f of faces) {\n const bb = kernel.getBoundingBox(f)\n const ext = [bb.xmax - bb.xmin, bb.ymax - bb.ymin, bb.zmax - bb.zmin][axis]\n if (ext > 0.1) continue\n const c = [(bb.xmin + bb.xmax) / 2, (bb.ymin + bb.ymax) / 2, (bb.zmin + bb.zmax) / 2][axis]\n perp.push({ h: f, c })\n }\n if (perp.length === 0) {\n throw new Error(`[cq-compat] shell: no face perpendicular to axis for selector \"${sel}\"`)\n }\n const best = sign === 1 ? Math.max(...perp.map((p) => p.c)) : Math.min(...perp.map((p) => p.c))\n const TOL = 1e-6\n const picked = perp.filter((p) => Math.abs(p.c - best) <= TOL).map((p) => p.h)\n if (picked.length === faces.length) {\n throw new Error(`[cq-compat] shell: selector \"${sel}\" would remove every face`)\n }\n return picked\n}\n\n/**\n * val\n * @param wp - Workplane\n * @returns Shape | null\n */\nexport function val(wp: Workplane): Shape | null {\n return wp.shape\n}\n\n/**\n * vals\n * @param wp - Workplane\n * @returns (Shape | null)[]\n */\nexport function vals(wp: Workplane): (Shape | null)[] {\n return wp.shape ? [wp.shape] : []\n}\n\n/**\n * transformed\n * @param wp - Workplane\n * @param opts - { offset?: [number, number, number]; rotate?: [number, number, number] }\n * @returns Promise<Workplane>\n */\nexport async function transformed(\n wp: Workplane,\n opts: { offset?: [number, number, number]; rotate?: [number, number, number] },\n): Promise<Workplane> {\n let result = wp\n if (opts.offset) {\n // CadQuery applies the offset in LOCAL coordinates:\n // world offset = x·xDir + y·yDir + z·normal.\n const [x, y, z] = opts.offset\n const world = vadd(wp.origin, vadd(vscale(wp.xDir, x), vadd(vscale(wp.yDir, y), vscale(wp.normal, z))))\n result = clone(result, { origin: world })\n }\n if (opts.rotate) {\n // Upstream semantics (cadquery 2.8.0 Plane.rotated, verified): the plane's\n // DIRECTION vectors are rotated about the plane's own basis axes — x about\n // xDir, y about yDir, z about the normal — composed as T = Tx·Ty·Tz. The\n // origin is unaffected and the shape is NOT touched. The previous\n // implementation called rotate() (an op that rotates the shape with euler\n // angles) which silently returned the plane unchanged / rotated geometry.\n const [rxd, ryd, rzd] = opts.rotate\n const rad = Math.PI / 180\n const ax: [number, number, number] = [...wp.xDir]\n const ay: [number, number, number] = [...wp.yDir]\n const az: [number, number, number] = [...wp.normal]\n const rotAbout = (v: [number, number, number], a: [number, number, number], ang: number): [number, number, number] => {\n const c = Math.cos(ang)\n const s = Math.sin(ang)\n const cross: [number, number, number] = [\n a[1] * v[2] - a[2] * v[1],\n a[2] * v[0] - a[0] * v[2],\n a[0] * v[1] - a[1] * v[0],\n ]\n const dot = a[0] * v[0] + a[1] * v[1] + a[2] * v[2]\n return [\n v[0] * c + cross[0] * s + a[0] * dot * (1 - c),\n v[1] * c + cross[1] * s + a[1] * dot * (1 - c),\n v[2] * c + cross[2] * s + a[2] * dot * (1 - c),\n ]\n }\n const apply = (v: [number, number, number]): [number, number, number] =>\n rotAbout(rotAbout(rotAbout(v, az, rzd * rad), ay, ryd * rad), ax, rxd * rad)\n const newX = apply(ax)\n const newZ = apply(az)\n const newY: [number, number, number] = [\n newZ[1] * newX[2] - newZ[2] * newX[1],\n newZ[2] * newX[0] - newZ[0] * newX[2],\n newZ[0] * newX[1] - newZ[1] * newX[0],\n ]\n result = clone(result, { xDir: newX, yDir: newY, normal: newZ })\n }\n return result\n}\n\n/**\n * setColor\n * @param wp - Workplane\n * @param color - RGB\n * @returns Workplane\n */\nexport function setColor(wp: Workplane, color: RGB): Workplane {\n return clone(wp, { color })\n}\n\n// ── Gear-extension primitives (E1–E4) ───────────────────────────────────────\n// These four ops are required by the fai_cq_gears port (see\n// docs/plans/2026-09-11-cq-compat-gears-extensions-e1-e4.md). All call the\n// occt-wasm kernel directly via `getKernel()` — the same singleton fai_cq_gears\n// uses — so their `ShapeHandle`s are compatible with the rest of cq-compat.\n// occt-wasm already exposes `bsplineSurface` / `makeHelixWire` / `split` /\n// `halfSpace` natively (node_modules/occt-wasm/dist/index.d.ts:77/112/189/390),\n// so no vendored-layer extension is needed.\n//\n// NOTE: occt-wasm's JS wrapper reads `.x/.y/.z` off point arguments\n// (dist/index.js:169/396/485 and `#flattenPoints` at :1479) — it requires plain\n// `{x,y,z}` objects, NOT the `[x,y,z]` tuples faijs uses internally. `v3`\n// converts a tuple to the shape occt-wasm expects.\n\nconst v3 = (t: [number, number, number]): { x: number; y: number; z: number } => ({\n x: t[0],\n y: t[1],\n z: t[2],\n})\n\n\n/**\n * splineFace — build a B-spline surface face from a regular point grid and set\n * it as the workplane's current shape. CadQuery analog: `Face.makeSplineApprox`\n * (`Part.makeSplineSurface`) over the same `rows × cols` point grid.\n *\n * Two strategies are available via `opts.strategy`:\n *\n * - `'row-approx-loft'` (**default**): each grid row becomes a curve through\n * `approximatePoints(row, tolerance)`, the row wires are skinned with\n * `loft(wires, false, false)`, and the single resulting face is returned.\n * This matches CadQuery `makeSplineApprox` to 4.2e-11 (straight) / 5.6e-7\n * (helical) relative area on gear tooth grids — ≈3 orders better than\n * `'grid'` — because the curve-level tolerance carries the same meaning as\n * CadQuery's `spline_approx_tol`.\n * - `'grid'`: one-shot `bsplineSurface(flat, rows, cols)` over the whole grid.\n * occt-wasm exposes no DegMin/DegMax/Tol3D arguments here, so it runs with\n * kernel defaults; that measurably diverges from CadQuery's explicit\n * `(3, 8, 1e-2)` (≈2.3e-4 relative area on a gear tooth grid).\n *\n * Points are world-space and row-major (length `rows * cols`); the workplane's\n * plane/origin are not consulted — it is only the returned carrier.\n *\n * @param wp - Workplane carrier\n * @param grid - world-space points, row-major (length must equal `rows*cols`)\n * @param opts - `{ rows; cols; tolerance?; strategy? }`. `tolerance` is the\n * per-row curve approximation tolerance (default `1e-2`, matching CadQuery's\n * `spline_approx_tol`); `strategy` defaults to `'row-approx-loft'`\n * @returns Workplane with the spline face as `.shape`\n */\nexport async function splineFace(\n wp: Workplane,\n grid: [number, number, number][],\n opts: {\n rows: number\n cols: number\n tolerance?: number\n strategy?: 'row-approx-loft' | 'grid'\n },\n): Promise<Workplane> {\n const { rows, cols } = opts\n if (!Number.isInteger(rows) || !Number.isInteger(cols) || rows < 2 || cols < 2) {\n throw new Error('[cq-compat] splineFace: rows and cols must be integers >= 2')\n }\n if (grid.length !== rows * cols) {\n throw new Error(\n `[cq-compat] splineFace: grid length ${grid.length} != rows*cols (${rows * cols})`,\n )\n }\n const kernel = getKernel() as unknown as OcctKernel\n const k = kernel as unknown as {\n bsplineSurface: (\n pts: { x: number; y: number; z: number }[],\n rows: number,\n cols: number,\n ) => ShapeHandle\n approximatePoints: (\n pts: { x: number; y: number; z: number }[],\n tol?: number,\n ) => ShapeHandle\n makeWire: (edges: ShapeHandle[]) => ShapeHandle\n loft: (wires: ShapeHandle[], isSolid: boolean, ruled: boolean) => ShapeHandle\n isFace: (s: ShapeHandle) => boolean\n getSubShapes: (s: ShapeHandle, type: 'face') => ShapeHandle[]\n }\n\n if (opts.strategy === 'grid') {\n return clone(wp, { shape: fromHandle(k.bsplineSurface(grid.map(v3), rows, cols)) })\n }\n\n const tol = opts.tolerance ?? 1e-2\n const wires: ShapeHandle[] = []\n for (let r = 0; r < rows; r++) {\n const row = grid.slice(r * cols, (r + 1) * cols).map(v3)\n wires.push(k.makeWire([k.approximatePoints(row, tol)]))\n }\n const skinned = k.loft(wires, false, false)\n let face: ShapeHandle\n if (k.isFace(skinned)) {\n face = skinned\n } else {\n const faces = k.getSubShapes(skinned, 'face')\n if (faces.length !== 1) {\n throw new Error(\n `[cq-compat] splineFace: expected a single face from the row loft, got ${faces.length}`,\n )\n }\n face = faces[0]\n }\n return clone(wp, { shape: fromHandle(face) })\n}\n\n/**\n * helix — create a helical wire on the workplane (origin = `wp.origin`, axis =\n * `wp.normal`). Equivalent to CadQuery `Workplane().makeHelix(pitch, height,\n * radius, ...)`.\n *\n * @param wp - Workplane (origin + normal define the helix axis)\n * @param pitch - axial advance per full turn (mm)\n * @param height - total helix height (mm)\n * @param radius - helix radius (mm)\n * @param opts - `{ leftHanded?: boolean }` (default right-handed)\n * @returns Workplane with the helix wire as `.shape`\n */\nexport async function helix(\n wp: Workplane,\n pitch: number,\n height: number,\n radius: number,\n opts?: { leftHanded?: boolean },\n): Promise<Workplane> {\n const kernel = getKernel() as unknown as OcctKernel\n const axis: [number, number, number] = opts?.leftHanded\n ? [-wp.normal[0], -wp.normal[1], -wp.normal[2]]\n : wp.normal\n const raw = (\n kernel as unknown as {\n makeHelixWire: (\n origin: { x: number; y: number; z: number },\n axis: { x: number; y: number; z: number },\n pitch: number,\n height: number,\n radius: number,\n ) => ShapeHandle\n }\n ).makeHelixWire(v3(wp.origin), v3(axis), pitch, height, radius)\n return clone(wp, { shape: fromHandle(raw) })\n}\n\n/**\n * splitFace — split the workplane's current shape by a plane and keep one side.\n * Equivalent to CadQuery `face.split(plane)` / `split(keepTop)`.\n *\n * Internally builds a half-space tool (`occt-wasm` `halfSpace`) from the plane\n * and runs `BOPAlgo_Splitter` (`split`); the kept fragment is selected by the\n * signed distance of its bounding-box centre to the plane.\n *\n * @param wp - Workplane whose `.shape` is the face/solid to split\n * @param plane - splitting plane as `{ origin: Vec3; normal: Vec3 }`\n * @param keep - `'top'` (normal side, default) | `'bottom'` (opposite side)\n * @returns Workplane with the kept fragment as `.shape`\n */\nexport async function splitFace(\n wp: Workplane,\n plane: { origin: [number, number, number]; normal: [number, number, number] },\n keep: 'top' | 'bottom' = 'top',\n): Promise<Workplane> {\n if (!wp.shape) throw new Error('[cq-compat] splitFace: wp.shape is required')\n const handle = brepOf(wp.shape)\n if (!handle) throw new Error('[cq-compat] splitFace: BREP unavailable')\n const kernel = getKernel() as unknown as OcctKernel\n const n = plane.normal\n const nLen = Math.hypot(n[0], n[1], n[2]) || 1\n const un: [number, number, number] = [n[0] / nLen, n[1] / nLen, n[2] / nLen]\n const tool = (\n kernel as unknown as {\n halfSpace: (\n o: { x: number; y: number; z: number },\n nrm: { x: number; y: number; z: number },\n ) => ShapeHandle\n }\n ).halfSpace(v3(plane.origin), v3(un))\n const compound = (\n kernel as unknown as { split: (s: ShapeHandle, tools: ShapeHandle[]) => ShapeHandle }\n ).split(handle as unknown as ShapeHandle, [tool])\n const subType = hasSolidBase(wp.shape) ? 'solid' : 'face'\n let frags = kernel.getSubShapes(compound, subType) as unknown as ShapeHandle[]\n if (!frags || frags.length === 0) {\n frags = kernel.getSubShapes(compound, 'face') as unknown as ShapeHandle[]\n }\n const signedDist = (f: ShapeHandle): number => {\n const bb = kernel.getBoundingBox(f)\n const cx = (bb.xmin + bb.xmax) / 2\n const cy = (bb.ymin + bb.ymax) / 2\n const cz = (bb.zmin + bb.zmax) / 2\n return (cx - plane.origin[0]) * un[0] + (cy - plane.origin[1]) * un[1] + (cz - plane.origin[2]) * un[2]\n }\n const chosen = frags.filter((f) => (keep === 'top' ? signedDist(f) >= 0 : signedDist(f) < 0))\n if (chosen.length === 0) {\n throw new Error('[cq-compat] splitFace: no fragment on the kept side')\n }\n // Robust for a planar split: keep the single fragment, or the one whose\n // centre is furthest from the plane when several match.\n const result = chosen.reduce((a, b) => (Math.abs(signedDist(b)) > Math.abs(signedDist(a)) ? b : a))\n // NOTE: we intentionally do NOT release `compound` / unchosen fragments here —\n // the kept `result` is adopted by fromHandle; freeing the arena slots would\n // invalidate it. The leak is bounded per call (one split).\n return clone(wp, { shape: fromHandle(result) })\n}\n\n/**\n * twistExtrude — extrude a profile while twisting it about the extrusion axis\n * by `angle` (deg) over `height` (mm). Equivalent to CadQuery\n * `Workplane().twistExtrude(profile, angle, height, ...)`.\n *\n * Implemented by sweeping `steps`+1 rotated+translated copies of the profile\n * through `loft` (a smooth, ruled=False loft). The twist axis is `wp.normal`.\n *\n * @param wp - Workplane carrying the profile: either `.shape` (face/wire) or a\n * pending 2D profile (`rect`/`circle`/`pendingWires`), as upstream accepts\n * @param angle - total twist angle over height (deg)\n * @param height - extrusion height (mm)\n * @param opts - `{ steps?: number }` (section count; default scales with |angle|)\n * @returns Workplane with the twisted solid as `.shape`\n */\nexport async function twistExtrude(\n wp: Workplane,\n angle: number,\n height: number,\n opts?: { steps?: number },\n): Promise<Workplane> {\n // Accept either an explicit profile shape or a pending 2D profile\n // (rect/circle/polygon/pendingWires) — mirrors upstream\n // `Workplane().rect(...).twistExtrude(...)`, which reads the pending profile.\n let src = wp\n if (!wp.shape) {\n const hasPendingProfile = (wp.pendingWires ?? []).some((w) => !w.construction)\n if (!hasPendingProfile) {\n throw new Error(\n '[cq-compat] twistExtrude: profile required (set wp.shape or add a pending rect/circle/wire)',\n )\n }\n src = await face(wp)\n }\n const profile = src.shape\n if (!profile) throw new Error('[cq-compat] twistExtrude: profile required')\n const raw = brepOf(profile)\n if (raw === undefined) throw new Error('[cq-compat] twistExtrude: BREP unavailable')\n const handle = raw as unknown as ShapeHandle\n const steps = opts?.steps ?? Math.max(8, Math.ceil(Math.abs(angle) / 15))\n const axis = src.normal\n const kernel = getKernel() as unknown as OcctKernel\n const k = kernel as unknown as {\n copy: (s: ShapeHandle) => ShapeHandle\n rotate: (\n s: ShapeHandle,\n axis: {\n point: { x: number; y: number; z: number }\n direction: { x: number; y: number; z: number }\n },\n a: number,\n ) => ShapeHandle\n translate: (s: ShapeHandle, dx: number, dy: number, dz: number) => ShapeHandle\n }\n // Native rotate takes radians; rotate about the extrusion axis through the\n // workplane origin so the profile twists in place (no translation drift).\n const base = k.copy(handle)\n const DEG2RAD = Math.PI / 180\n const sections: Workplane[] = []\n for (let i = 0; i <= steps; i++) {\n const t = i / steps\n const rot = k.rotate(base, { point: v3(src.origin), direction: v3(axis) }, angle * t * DEG2RAD)\n const tr = k.translate(rot, axis[0] * height * t, axis[1] * height * t, axis[2] * height * t)\n sections.push(clone(src, { shape: fromHandle(tr), pendingWires: [] }))\n }\n return loft(sections[0], ...sections.slice(1), { ruled: false })\n}\n\n/**\n * solidFromFaces — sew a closed set of faces into a solid on the workplane.\n * Equivalent to CadQuery `cq.Shell.makeShell(faces)` + `Solid.makeSolid(...)`\n * (BRepBuilderAPI_Sewing + BRepBuilderAPI_MakeSolid + orientation fix).\n *\n * This is cq-compat extension E5 (fai_cq_gears port plan §13-6): the existing\n * `shell` op is hollowing (thickening a solid), not sewing face patches into\n * a solid, and gears need the latter after their tooth-face/cap faces are built.\n *\n * @param wp - Workplane providing the result's coordinate frame (origin/normal)\n * @param faces - Workplanes whose `.shape` are the faces to sew (each must be a face)\n * @param opts - `{ sewingTolerance?: number (default 1e-2, cq shell_sewing_tol);\n * fixOrientations?: boolean (default true) }`. `sew` does not guarantee\n * consistent face orientation — a loft-skinned tooth face can come out\n * inward-facing, making the sewn solid carry negative volume — so\n * `fixFaceOrientations` runs by default. If the fixed shape degrades back to\n * a shell (observed on micro-gap shells that only close via the sewing\n * tolerance), the pre-fix `makeSolid` result is kept instead.\n * @returns Workplane with the sewn solid as `.shape`\n */\nexport async function solidFromFaces(\n wp: Workplane,\n faces: Workplane[],\n opts?: { sewingTolerance?: number; fixOrientations?: boolean },\n): Promise<Workplane> {\n if (faces.length === 0) throw new Error('[cq-compat] solidFromFaces: faces must be non-empty')\n const handles: ShapeHandle[] = faces.map((f, i) => {\n if (!f.shape) throw new Error(`[cq-compat] solidFromFaces: faces[${i}].shape is required`)\n const h = brepOf(f.shape)\n if (h === undefined) throw new Error(`[cq-compat] solidFromFaces: faces[${i}] BREP unavailable`)\n return h as unknown as ShapeHandle\n })\n const kernel = getKernel() as unknown as OcctKernel\n const k = kernel as unknown as {\n sew: (shapes: ShapeHandle[], tolerance?: number) => ShapeHandle\n makeSolid: (shell: ShapeHandle) => ShapeHandle\n fixFaceOrientations: (shape: ShapeHandle) => ShapeHandle\n isSolid: (s: ShapeHandle) => boolean\n isShell: (s: ShapeHandle) => boolean\n getShapeType: (s: ShapeHandle) => string\n }\n const tol = opts?.sewingTolerance ?? 1e-2\n const shell = k.sew(handles, tol)\n if (!k.isShell(shell) && !k.isSolid(shell)) {\n throw new Error(\n `[cq-compat] solidFromFaces: sew did not produce a shell (got ${k.getShapeType(shell)})`,\n )\n }\n const solid = k.makeSolid(shell)\n let result = solid\n if (opts?.fixOrientations !== false && k.isSolid(solid)) {\n const fixed = k.fixFaceOrientations(solid)\n if (k.isSolid(fixed)) result = fixed\n }\n if (!k.isSolid(result)) {\n throw new Error(\n `[cq-compat] solidFromFaces: result is not a solid (got ${k.getShapeType(result)})`,\n )\n }\n return clone(wp, { shape: fromHandle(result), pendingWires: [] })\n}\n\n/** Endpoints of a curve edge (parameter-space — B-spline edges carry no\n * explicit vertices, so `curveParameters` + `curvePointAtParam` is the only\n * reliable endpoint path; the vertex fallback covers degenerate edges). */\nfunction edgeEndsRaw(\n k: OcctKernel,\n edge: ShapeHandle,\n): { edge: ShapeHandle; a: { x: number; y: number; z: number }; b: { x: number; y: number; z: number } } {\n try {\n const { first, last } = k.curveParameters(edge)\n return { edge, a: k.curvePointAtParam(edge, first), b: k.curvePointAtParam(edge, last) }\n } catch {\n const vs = k.getSubShapes(edge, 'vertex')\n if (vs.length < 2) {\n const p = k.vertexPosition(vs[0])\n return { edge, a: p, b: p }\n }\n return { edge, a: k.vertexPosition(vs[0]), b: k.vertexPosition(vs[1]) }\n }\n}\n\n/**\n * planarCap — build a planar cap face from the boundary edges of the given\n * faces that lie on the plane `origin · normal = d`, then set it as the\n * workplane shape. Equivalent to CadQuery gears' `planarCapAtZ` /\n * `Face.makeFromWires(Wire.combine(boundaryEdges, tol))`.\n *\n * This is cq-compat extension E6 (fai_cq_gears port plan §13-6): the existing\n * `wire`/`face` ops only consume pending drawing descriptors, not edges that\n * already exist inside kernel shapes — gears need to close their tooth-face\n * patches with end caps built from those edges.\n *\n * Edge chaining ports the proven TS re-implementation of OCCT's\n * `ShapeAnalysis_FreeBounds::ConnectEdgesToWires`: unordered edges are chained\n * by endpoint proximity within `tol` (kernel `makeWire` silently drops edges\n * when gaps exceed OCCT precision, so in-tolerance gaps are bridged with a\n * line segment — same as upstream).\n *\n * @param wp - Workplane providing the result's coordinate frame\n * @param faces - Workplanes whose `.shape` are the faces supplying boundary edges\n * @param plane - cap plane: `{ origin, normal }`; the plane offset is taken\n * from `origin` (edges whose bounding box lies within `pickTolerance` of the\n * plane are collected)\n * @param opts - `{ combineTolerance?: number (default 1e-2, cq wire_comb_tol);\n * pickTolerance?: number (default 1e-6) }`\n * @returns Workplane with the cap face as `.shape`\n */\nexport async function planarCap(\n wp: Workplane,\n faces: Workplane[],\n plane: { origin: [number, number, number]; normal: [number, number, number] },\n opts?: { combineTolerance?: number; pickTolerance?: number },\n): Promise<Workplane> {\n if (faces.length === 0) throw new Error('[cq-compat] planarCap: faces must be non-empty')\n const kernel = getKernel() as unknown as OcctKernel\n const k = kernel as unknown as {\n getSubShapes: (s: ShapeHandle, type: 'edge' | 'vertex') => ShapeHandle[]\n getBoundingBox: (s: ShapeHandle) => { xmin: number; xmax: number; ymin: number; ymax: number; zmin: number; zmax: number }\n curveParameters: (e: ShapeHandle) => { first: number; last: number }\n curvePointAtParam: (e: ShapeHandle, p: number) => { x: number; y: number; z: number }\n vertexPosition: (v: ShapeHandle) => { x: number; y: number; z: number }\n makeLineEdge: (a: { x: number; y: number; z: number }, b: { x: number; y: number; z: number }) => ShapeHandle\n makeWire: (edges: ShapeHandle[]) => ShapeHandle\n makeFace: (wire: ShapeHandle) => ShapeHandle\n healWire: (wire: ShapeHandle, tol: number) => ShapeHandle\n reverseShape: (s: ShapeHandle) => ShapeHandle\n }\n const n = plane.normal\n const nLen = Math.hypot(n[0], n[1], n[2]) || 1\n const un = [n[0] / nLen, n[1] / nLen, n[2] / nLen]\n const d = plane.origin[0] * un[0] + plane.origin[1] * un[1] + plane.origin[2] * un[2]\n const pickTol = opts?.pickTolerance ?? 1e-6\n const tol = opts?.combineTolerance ?? 1e-2\n\n // 1) Collect boundary edges lying on the plane (signed distance of the\n // edge bbox centre within pickTol). Faces share their common edges, so\n // deduplicate by the numeric kernel handle.\n const seen = new Set<number>()\n const onPlane: ShapeHandle[] = []\n for (const f of faces) {\n if (!f.shape) throw new Error('[cq-compat] planarCap: faces[i].shape is required')\n const fh = brepOf(f.shape)\n if (fh === undefined) throw new Error('[cq-compat] planarCap: faces[i] BREP unavailable')\n for (const e of k.getSubShapes(fh as unknown as ShapeHandle, 'edge')) {\n const id = e as unknown as number\n if (seen.has(id)) continue\n const bb = k.getBoundingBox(e)\n const cx = (bb.xmin + bb.xmax) / 2\n const cy = (bb.ymin + bb.ymax) / 2\n const cz = (bb.zmin + bb.zmax) / 2\n // Max plane distance over the whole bbox = |centre·n − d| + projection\n // of the half-extents onto the normal. Requiring this ≤ pickTol keeps\n // only edges that lie entirely flat on the plane (a merely-centred or\n // crossing vertical edge is rejected).\n const hx = (bb.xmax - bb.xmin) / 2\n const hy = (bb.ymax - bb.ymin) / 2\n const hz = (bb.zmax - bb.zmin) / 2\n const dist = Math.abs(cx * un[0] + cy * un[1] + cz * un[2] - d)\n + hx * Math.abs(un[0]) + hy * Math.abs(un[1]) + hz * Math.abs(un[2])\n if (dist <= pickTol) {\n seen.add(id)\n onPlane.push(e)\n }\n }\n }\n if (onPlane.length === 0) throw new Error('[cq-compat] planarCap: no boundary edges found on plane')\n\n // 2) Chain unordered edges into closed wires (ConnectEdgesToWires port).\n const pool = onPlane.map((e) => edgeEndsRaw(k as unknown as OcctKernel, e))\n const dist3 = (a: { x: number; y: number; z: number }, b: { x: number; y: number; z: number }) =>\n Math.hypot(a.x - b.x, a.y - b.y, a.z - b.z)\n const used = new Array<boolean>(pool.length).fill(false)\n const wires: ShapeHandle[] = []\n for (let start = 0; start < pool.length; start++) {\n if (used[start]) continue\n used[start] = true\n const chain: ShapeHandle[] = [pool[start].edge]\n let tail = pool[start].b\n const head = pool[start].a\n for (;;) {\n let found = -1\n let best = Infinity\n for (let j = 0; j < pool.length; j++) {\n if (used[j]) continue\n const dj = Math.min(dist3(pool[j].a, tail), dist3(pool[j].b, tail))\n if (dj <= tol && dj < best) { best = dj; found = j }\n }\n if (found < 0) break\n used[found] = true\n const e = pool[found]\n const flip = dist3(e.a, tail) <= dist3(e.b, tail)\n if (best > 1e-7) chain.push(k.makeLineEdge(tail, flip ? e.a : e.b))\n chain.push(flip ? e.edge : k.reverseShape(e.edge))\n tail = flip ? e.b : e.a\n if (dist3(tail, head) <= tol) break\n }\n const endGap = dist3(tail, head)\n if (chain.length > 1 && endGap > 1e-7 && endGap <= tol) chain.push(k.makeLineEdge(tail, head))\n wires.push(k.makeWire(chain))\n }\n if (wires.length !== 1) {\n throw new Error(\n `[cq-compat] planarCap: expected one closed loop on plane, got ${wires.length} wires from ${onPlane.length} edges`,\n )\n }\n\n // 3) Heal + make the cap face.\n const face = k.makeFace(k.healWire(wires[0], tol))\n return clone(wp, { shape: fromHandle(face), pendingWires: [] })\n}\n"]}
|
|
1
|
+
{"version":3,"file":"workplane.js","sourceRoot":"","sources":["../src/workplane.ts"],"names":[],"mappings":"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C,EAAE;QAClC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;QAClC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;QAClC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;QACnC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;QACnC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;QACnC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;QACrC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;QACtC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE;QACrC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QACtC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAA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","sourcesContent":["/**\n * @faicad/cq-compat — CadQuery API compatibility layer for faijs.\n *\n * Implements a Workplane carrier (geometry hidden in .shape) and\n * CadQuery-style methods. All methods are async and return a new Workplane\n * (immutable updates). The carrier uses a custom prototype so compatOp's\n * `borrowDeep` does not traverse its fields when the library is auto-lifted.\n *\n * Design doc: docs/plans/2026-09-06-cadquery-compat-and-multifile-faijs.md\n */\n\nimport { createApiNamespace } from '@faicad/faijs/api/api-namespace'\nimport { brepjsCompat } from '@faicad/faijs/api'\nimport { borrowBrepjsShape, adoptBrepjsProduct } from '@faicad/faijs/api/internal/l3-bridge'\nimport { fromHandle } from '@faicad/faijs/sdk'\nimport { brepOf, isShape } from '@faicad/faijs/shape'\nimport { setName, nameOf } from '@faicad/faijs'\nimport { getKernel } from '@faicad/faijs/occt-kernel/occtKernel'\nimport type { OcctKernel, ShapeHandle, Vec3 } from 'occt-wasm'\nimport type { Shape } from '@faicad/faijs/mesh/types'\n\n// ── cad namespace singleton (created once at module load) ──────────────────\nconst cad = createApiNamespace() as Record<string, (...args: unknown[]) => Promise<Shape>>\n\n// ── compatOp 提升边界归一(GOTCHA:borrowDeep 把实参 Shape 换成借用视图)──\n//\n// 当 cq-compat 命名空间被 registerLib 提升(无 dual-op → autoLift=true)时,\n// 每个裸导出函数的实参先经 borrowDeep:faijs Shape → 借用 brepjs 视图\n// `{ wrapped, disposed, delete, onDispose }`(`isShape=false`、`brepOf=undefined`)。\n// 直接调用(测试进程内)拿到的则是真实 Shape。两个形态都必须能消费:\n//\n// asBrepShape(v) —\n// - 真实 Shape → 原样返回;\n// - 借用视图(有 `.wrapped`)→ 提取原始 OCCT 句柄,fromHandle 还原为真实\n// Shape(mesh 三角化 + BREP 身份槽登记,brepOf 可恢复),按视图对象缓存\n// (同句柄多次调用不重复三角化);\n// - 其余 → 原样返回(调用方自行判空/报错)。\n//\n// 所有权:归一出的新 Shape 与原 part Shape 的 slot 指向同一 OCCT 句柄,但 slot\n// 按 Shape 对象各自持有(fromBrep 写的是新 Shape 的 slot),无共享释放路径——\n// 与 vendored 投影的 adoptBrepjsProduct 收编模式同构,不引入双重释放。\n// 视图 `.wrapped` 是 OcctWasmHandle 对象({ id, type, __occtWasm }),内核只收\n// 数字 id → 解包方式与 l3-bridge.adoptBrepjsProduct 一致(`'id' in wrapped` 分支)。\nconst borrowedShapeCache = new WeakMap<object, Shape>()\n\n/**\n * 把可能是借用视图的几何输入归一为真实 faijs Shape(见上方注释)。\n * @param v 真实 Shape、借用视图(`{ wrapped }`)或其他原样透传的输入。\n * @returns 真实 faijs `Shape`(借用视图经 `fromHandle` 还原并缓存)。\n */\nexport function asBrepShape(v: unknown): Shape {\n if (isShape(v)) return v as Shape\n if (v !== null && typeof v === 'object' && 'wrapped' in v) {\n const view = v as { wrapped: unknown }\n const hit = borrowedShapeCache.get(view)\n if (hit) return hit\n const wrappedAny = view.wrapped\n const handle =\n typeof wrappedAny === 'object' && wrappedAny !== null && 'id' in wrappedAny\n ? (wrappedAny as { id: number }).id\n : wrappedAny\n const s = fromHandle(handle) as Shape\n borrowedShapeCache.set(view, s)\n return s\n }\n return v as Shape\n}\n\n/**\n * 解包 Workplane/裸 Shape 几何输入,并把载体对象(Workplane)已登记的语句名\n * 透传给内部 shape(§1.4 lineage N1:输入 Shape 必须有 PartName 才允许成为\n * 链上节点)。语句名由引擎在语句结束时登记在载体对象(afterStatement\n * setName),此处同步到 shape 维——否则 cq.translate / rotate / mirror 这类\n * 「以 Workplane 为输入的独立语句」会把链上产物误判为库内临时件而抛\n * E_TOPO_UNTRACKED_INPUT。\n * @param v - Workplane({ shape })或裸 Shape。\n * @returns 内部 faijs `Shape`(名字已透传)。\n */\nfunction resolveInputShape(v: unknown): Shape {\n const s = (isShape(v) ? v : (v as { shape?: unknown } | null)?.shape) as Shape\n if (s && !isShape(v) && nameOf(s) === undefined) {\n const n = v !== null && typeof v === 'object' ? nameOf(v as object) : undefined\n if (n !== undefined) setName(s, n)\n }\n return s\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\n/** RGB color (sRGB 0..1). */\nexport type RGB = [number, number, number]\n\n/**\n * A pending 2D profile wire (CadQuery `ctx.pendingWires` analogue).\n *\n * Upstream keeps a LIST of wires, and `extrude()` turns them into one face per\n * outermost wire with the enclosed wires punched as holes — verified against\n * cadquery 2.8.0 (two columns per pushPoint, and a plate with four holes):\n *\n * `circle(4).circle(2).extrude(4)` -> annulus, vol 150.796\n * `pushPoints([p1,p2]).circle(4).circle(2)` -> TWO annuli (2 solids)\n * `rect(2,2).rect(1.3,1.3,fc).vertices()`\n * `.circle(0.125).extrude(0.5)` -> ONE plate, vol 1.901825\n *\n * `cx`/`cy` are workplane-LOCAL coordinates (a wire created under `pushPoints`\n * or after `vertices()` is already positioned at its point). `group` is the\n * index of the point it was created at, kept only for diagnostics.\n */\n/** Snapshot of the plane a pending wire was created on (world coordinates). */\nexport interface WirePlane {\n origin: [number, number, number]\n xDir: [number, number, number]\n yDir: [number, number, number]\n normal: [number, number, number]\n}\n\n/**\n * A 2D profile wire queued on a Workplane until a solid op (extrude / revolve /\n * loft / …) consumes it. Every variant records its local 2D placement plus a\n * snapshot of the creation plane, so a later `workplane(offset)` or transformed\n * move does not retro-actively relocate wires that are already queued.\n */\nexport type PendingWire =\n | { kind: 'rect'; w: number; d: number; cx: number; cy: number; construction: boolean; plane?: WirePlane }\n | { kind: 'circle'; radius: number; cx: number; cy: number; construction: boolean; plane?: WirePlane }\n | {\n kind: 'ellipse'\n majorRadius: number\n minorRadius: number\n cx: number\n cy: number\n construction: boolean\n plane?: WirePlane\n /** True when the caller's y_radius exceeds x_radius (see {@link ellipse}). */\n flip?: boolean\n }\n | { kind: 'polygon'; n: number; d: number; cx: number; cy: number; construction: boolean; plane?: WirePlane }\n /** Open/closed ring produced by moveTo/lineTo/arcs/polyline + close()/wire(). */\n | { kind: 'path'; pts: [number, number][]; edges?: PendingEdge[]; construction: boolean; plane?: WirePlane }\n\n/**\n * One drafted 2D edge, in workplane-LOCAL coordinates — the CadQuery\n * `ctx.pendingEdges` analogue. All descriptors keep `from`/`to` so generic\n * consumers (vertex ring, close()) can treat every kind uniformly.\n */\nexport type PendingEdge =\n | { kind: 'line'; from: [number, number]; to: [number, number] }\n | { kind: 'arc3'; from: [number, number]; mid: [number, number]; to: [number, number] }\n | { kind: 'tangentArc'; from: [number, number]; tgt: [number, number]; to: [number, number] }\n | { kind: 'spline'; from: [number, number]; pts: [number, number][]; to: [number, number]; endTgt?: [number, number]; builtEdge?: unknown }\n\n/**\n * Workplane carrier — object with a custom prototype so compatOp's\n * `borrowDeep` does NOT traverse its fields (it only walks objects whose\n * prototype === Object.prototype). This prevents .shape from being replaced\n * by a borrowed brepjs view when the library is auto-lifted.\n */\nexport interface Workplane {\n __cq: true\n /** Plane name: \"XY\" | \"XZ\" | \"YZ\". */\n plane: string\n /** Workplane origin in world coordinates. */\n origin: [number, number, number]\n /** Workplane normal (unit vector, local +Z). */\n normal: [number, number, number]\n /** Workplane local +X in world coordinates (CadQuery Plane.xDir convention). */\n xDir: [number, number, number]\n /** Workplane local +Y in world coordinates (= normal × xDir). */\n yDir: [number, number, number]\n /** Current geometry (faijs Shape), or null for empty workplane. */\n shape: Shape | null\n /** Pending face selector (e.g. \">Z\", \"<X\"). Set by .faces(). */\n faceSel: string | null\n /** Pending edge selector (e.g. \"|Z\", \"\"). Set by .edges(). */\n edgeSel: string | null\n /** Pending vertex selector. Set by .vertices(). */\n vertexSel: string | null\n /** Accumulated pushPoints (2D offsets in workplane coords). */\n pts: [number, number][]\n /** Edge midpoints for construction rect (set by .edges()). */\n edgePts?: [number, number][]\n /** forConstruction flag — next rect/circle is construction geometry. */\n forConstruction: boolean\n /** Pending 2D rect profile (set by .rect(), consumed by .extrude()/.cutBlind()). */\n pendingRect?: { w: number; d: number }\n /** Pending 2D circle profile (set by .circle(), consumed by .extrude()/.cutBlind()). */\n pendingCircle?: { radius: number }\n /** Pending regular polygon profile (set by .polygon(), consumed by .extrude()/.cutBlind()). */\n pendingPolygon?: { n: number; d: number }\n /**\n * Pending 2D profile wires — the CadQuery `pendingWires` LIST.\n * `rect`/`circle`/`polygon` APPEND; `extrude` consumes. The single-slot\n * fields above are kept for the (single-wire) legacy path.\n */\n pendingWires?: PendingWire[]\n /**\n * Drafted 2D edges waiting to be combined into a wire — CadQuery\n * `ctx.pendingEdges`. Consumed by `wire()` / `close()`.\n */\n pendingEdges?: PendingEdge[]\n /**\n * Current drawing point in local coords — end of the last drafted edge, or\n * the plane origin when nothing has been drawn yet (upstream\n * `_findFromPoint`: last stack object, else `plane.origin`).\n */\n currentPoint?: [number, number]\n /**\n * First point of the wire currently being drafted, local coords — CadQuery\n * `ctx.firstPoint`. Set by the first non-construction edge, cleared by\n * `close()`.\n */\n firstPoint?: [number, number]\n /** Optional color (sRGB 0..1) for this part. */\n color?: RGB\n /**\n * Tagged workplane snapshots (CadQuery .tag()), keyed by tag name.\n * Each snapshot records the plane frame and carried shape so\n * workplaneFromTagged can jump back to the marked plane.\n */\n tags?: Record<string, TaggedWorkplane>\n}\n\n/** Snapshot captured by \tag(): plane frame + carried shape. */\nexport interface TaggedWorkplane {\n origin: [number, number, number]\n xDir: [number, number, number]\n normal: [number, number, number]\n shape: Shape | null\n}\n\n/** Custom prototype — borrowDeep skips objects with non-Object prototype. */\nconst WP_PROTO = { __isCqWorkplane: true }\n\n// ── Internal helpers ───────────────────────────────────────────────────────\n\nfunction vadd(a: [number, number, number], b: [number, number, number]): [number, number, number] {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]]\n}\n\nfunction vscale(a: [number, number, number], s: number): [number, number, number] {\n return [a[0] * s, a[1] * s, a[2] * s]\n}\n\nfunction vdot(a: [number, number, number], b: [number, number, number]): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n}\n\nfunction vsub(a: [number, number, number], b: [number, number, number]): [number, number, number] {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2]]\n}\n\n/**\n * Local → world mapping for axis-aligned workplane normals, verified against\n * installed CadQuery 2.8.0 (`faces(sel).workplane(...).plane.xDir`):\n *\n * normal +Z → xDir +X, yDir +Y normal -Z → xDir +X, yDir -Y\n * normal +Y → xDir -X, yDir +Z normal -Y → xDir +X, yDir +Z\n * normal +X → xDir +Y, yDir +Z normal -X → xDir -Y, yDir +Z\n */\nconst FACE_AXES: Record<string, { x: [number, number, number]; y: [number, number, number] }> = {\n '0,0,1': { x: [1, 0, 0], y: [0, 1, 0] },\n '0,0,-1': { x: [1, 0, 0], y: [0, -1, 0] },\n '0,1,0': { x: [-1, 0, 0], y: [0, 0, 1] },\n '0,-1,0': { x: [1, 0, 0], y: [0, 0, 1] },\n '1,0,0': { x: [0, 1, 0], y: [0, 0, 1] },\n '-1,0,0': { x: [0, -1, 0], y: [0, 0, 1] },\n}\n\n/** Get the local axes for an axis-aligned normal (throws for arbitrary normals). */\nfunction faceAxes(normal: [number, number, number]): { x: [number, number, number]; y: [number, number, number] } {\n const key = `${normal[0]},${normal[1]},${normal[2]}`\n const axes = FACE_AXES[key]\n if (!axes) {\n throw new Error(`[cq-compat] unsupported workplane normal ${key} (axis-aligned only)`)\n }\n return axes\n}\n\n/** Map workplane-local (px, py) offsets to world coordinates. */\nfunction localToWorld(\n wp: Pick<Workplane, 'origin' | 'xDir' | 'yDir'>,\n px: number,\n py: number,\n): [number, number, number] {\n return vadd(wp.origin, vadd(vscale(wp.xDir, px), vscale(wp.yDir, py)))\n}\n\n/**\n * Reference points for eachpoint-style ops (box/sphere/cylinder/rect/circle/\n * polygon). Upstream positions each new object at whatever sits on the stack:\n * pushPoints() points win, otherwise the CURRENT DRAFTING POINT set by\n * moveTo/move (e.g. `workplane.rect(1,1).extrude(2).moveTo(0,2).rect(1,1)` —\n * `Workplane.testGlue`), otherwise the plane origin.\n */\nfunction eachPoints(wp: Workplane): [number, number][] {\n if (Array.isArray(wp.pts) && wp.pts.length > 0) return wp.pts\n if (wp.currentPoint) return [wp.currentPoint]\n return [[0, 0]] as [number, number][]\n}\n\n/** Snapshot the current plane so a pending wire survives later workplane() moves. */\nfunction planeOf(wp: Pick<Workplane, 'origin' | 'xDir' | 'yDir' | 'normal'>): WirePlane {\n return {\n origin: [...wp.origin] as [number, number, number],\n xDir: [...wp.xDir] as [number, number, number],\n yDir: [...wp.yDir] as [number, number, number],\n normal: [...wp.normal] as [number, number, number],\n }\n}\n\n/** Create an empty workplane on the given plane (CadQuery named-plane axes). */\nfunction makeWorkplane(plane: string): Workplane {\n // Full named-plane table verified against cadquery 2.8.0 (Plane.named):\n // 'front' == XY, 'bottom' == XZ, etc. The old 3-entry table silently fell\n // back to XY for any other name — e.g. \"front\"→XY was luck, but \"top\" would\n // have been wrong. Unknown names now throw like upstream.\n const axes: Record<string, { n: [number, number, number]; x: [number, number, number] }> = {\n XY: { n: [0, 0, 1], x: [1, 0, 0] },\n YZ: { n: [1, 0, 0], x: [0, 1, 0] },\n ZX: { n: [0, 1, 0], x: [0, 0, 1] },\n XZ: { n: [0, -1, 0], x: [1, 0, 0] },\n YX: { n: [0, 0, -1], x: [0, 1, 0] },\n ZY: { n: [-1, 0, 0], x: [0, 0, 1] },\n front: { n: [0, 0, 1], x: [1, 0, 0] },\n back: { n: [0, 0, -1], x: [-1, 0, 0] },\n left: { n: [-1, 0, 0], x: [0, 0, 1] },\n right: { n: [1, 0, 0], x: [0, 0, -1] },\n top: { n: [0, 1, 0], x: [1, 0, 0] },\n bottom: { n: [0, -1, 0], x: [1, 0, 0] },\n }\n const a = axes[plane]\n if (!a) {\n throw new Error(`[cq-compat] unknown plane \"${plane}\" (upstream names: XY/YZ/ZX/XZ/YX/ZY/front/back/left/right/top/bottom)`)\n }\n const yDir: [number, number, number] = [\n a.n[1] * a.x[2] - a.n[2] * a.x[1],\n a.n[2] * a.x[0] - a.n[0] * a.x[2],\n a.n[0] * a.x[1] - a.n[1] * a.x[0],\n ]\n return Object.assign(Object.create(WP_PROTO), {\n __cq: true as const,\n plane,\n origin: [0, 0, 0] as [number, number, number],\n normal: a.n,\n xDir: a.x,\n yDir,\n shape: null,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [] as [number, number][],\n forConstruction: false,\n }) as Workplane\n}\n\n/** Clone a workplane with overrides (preserves custom prototype). */\nfunction clone(wp: Workplane, overrides: Partial<Workplane>): Workplane {\n return Object.assign(Object.create(WP_PROTO), wp, overrides) as Workplane\n}\n\n/**\n * Unwrap a vendored brepjs `Result` into its value, throwing on `Err`.\n *\n * The vendored boolean ops return `Result<T>` (`{ ok: true, value }` /\n * `{ ok: false, error }`). Silently swallowing an `Err` here would leave the\n * workplane carrying stale geometry, so failures must surface.\n */\nfunction unwrapBrepResult(result: unknown): unknown {\n if (result && typeof result === 'object' && 'ok' in result) {\n const r = result as { ok: boolean; value?: unknown; error?: unknown }\n if (!r.ok) {\n const detail =\n typeof r.error === 'string'\n ? r.error\n : JSON.stringify(r.error, (_k, v) => (typeof v === 'bigint' ? String(v) : v)) ??\n String(r.error)\n throw new Error(`[cq-compat] brep boolean op failed: ${detail}`)\n }\n return r.value\n }\n return result\n}\n\n/** Call a `brepjsCompat` member by name (namespace is typed loosely here). */\nfunction compatFn(name: string): (...args: unknown[]) => unknown {\n const fn = (brepjsCompat as Record<string, unknown>)[name] as\n | ((...args: unknown[]) => unknown)\n | undefined\n if (!fn) throw new Error(`[cq-compat] brepjsCompat.${name} is not available`)\n return fn\n}\n\n/** Merge same-domain faces/edges after a boolean (CadQuery `clean=True`). */\nasync function cleanShapes(shape: Shape): Promise<Shape> {\n const simplified = unwrapBrepResult(compatFn('simplify')(borrowBrepjsShape(shape)))\n return adoptBrepjsProduct(simplified)\n}\n\n/**\n * Fuse two shapes into ONE solid via the vendored brepjs fuse.\n *\n * Rationale: `cad.union` (defineOp → booleanBrep → fromBrep repack) has been\n * observed to return a compound of two disjoint solids instead of a fused\n * single solid (see docs/analysis/2026-09-08-cq-compat-union-compound-bug.md).\n * The vendored `fuse` preserves the first operand's solid type, so the result\n * stays a single solid. See docs/analysis/2026-09-08-cq-compat-union-compound-bug.md.\n */\nasync function fuseShapes(a: Shape, b: Shape, clean: boolean = true): Promise<Shape> {\n const product = unwrapBrepResult(compatFn('fuse')(borrowBrepjsShape(a), borrowBrepjsShape(b)))\n const fused = adoptBrepjsProduct(product)\n // CadQuery ops take a `clean` flag (default True); clean=False preserves the\n // boolean splitter faces (verified vs 2.8.0: testNoClean wedge vol 10.650718\n // vs testClean 9.079922 — the kernel unify pass is NOT volume-preserving).\n return clean ? cleanShapes(fused) : fused\n}\n\n/** Cut a tool shape out of a base shape via the vendored brepjs cut. */\nasync function cutShapes(base: Shape, tool: Shape): Promise<Shape> {\n const product = unwrapBrepResult(compatFn('cut')(borrowBrepjsShape(base), borrowBrepjsShape(tool)))\n return cleanShapes(adoptBrepjsProduct(product))\n}\n\n/** Intersect two shapes via the vendored brepjs intersect. */\nasync function intersectShapes(a: Shape, b: Shape): Promise<Shape> {\n const product = unwrapBrepResult(compatFn('intersect')(borrowBrepjsShape(a), borrowBrepjsShape(b)))\n return cleanShapes(adoptBrepjsProduct(product))\n}\n\n/** Get bbox max of a shape (via cad.bboxMax — synchronous). */\nfunction bboxMax(shape: Shape): [number, number, number] {\n return cad.bboxMax(shape) as unknown as [number, number, number]\n}\n\n/** Get bbox min of a shape. */\nfunction bboxMin(shape: Shape): [number, number, number] {\n return cad.bboxMin(shape) as unknown as [number, number, number]\n}\n\n/**\n * Resolve a face selector to a world-space point (face center) and normal.\n *\n * CadQuery semantics: `faces(\">Z\")` selects the face(s) at the extreme of the\n * axis, and `workplane()` places the origin at the selected face's center —\n * `centerOption: \"CenterOfMass\"` (default) uses the face's surface centroid,\n * `\"CenterOfBoundBox\"` uses the face's bounding-box center.\n *\n * Supported forms: \">Z\", \"<Z\", \">X\", \"<X\", \">Y\", \"<Y\", \"+Z\"/\"-Z\" aliases, each\n * with an optional CadQuery-style index suffix like \">Z[-2]\". The six CadQuery\n * named views (\"front\"/\"back\"/\"left\"/\"right\"/\"top\"/\"bottom\") are accepted and\n * normalised to their axis equivalent (front=>\">Z\", back=>\"<Z\", left=>\"<X\",\n * right=>\">X\", top=>\">Y\", bottom=>\"<Y\"). This\n * implementation enumerates the actual BREP faces and picks the one whose\n * bbox-center is the extreme along the selector axis (ties broken by larger\n * surface area, so a main face wins over a small coplanar boss face). When the\n * shape has no BREP handle or the kernel is unavailable, it falls back to the\n * whole-shape bounding-box approximation.\n *\n * Indexed selectors (`\">Z[-2]\"`) follow CadQuery's DirectionMinMaxSelector\n * indexing, verified against the installed cadquery 2.8.0: `\">A[k]\"` lists all\n * faces ASCENDING along axis A (`[0]` = lowest, `[-1]` = highest); `\"<A[k]\"`\n * lists them DESCENDING (`[0]` = highest). The picked face's normal is the\n * outward direction (away from the shape bbox center).\n *\n * @param shape - Shape whose BREP faces are enumerated for selection.\n * @param sel - Selector string, e.g. \">Z\", \"<X\", \">Z[-2]\", or a named view\n * (\"front\"/\"back\"/\"left\"/\"right\"/\"top\"/\"bottom\").\n * @param centerOption - Optional center computation option forwarded to the\n * face-center evaluation.\n * @returns Promise resolving to the selected face's center point and outward\n * normal.\n */\n/**\n * CadQuery named views → axis selector (cadquery/selectors.py:687-694).\n * Verified against installed cadquery 2.8.0 by evaluating\n * `Workplane().rect(1,1).extrude(1).faces(n).val()` for each name.\n */\nconst NAMED_VIEW_TO_AXIS: Record<string, string> = {\n front: '>Z',\n back: '<Z',\n left: '<X',\n right: '>X',\n top: '>Y',\n bottom: '<Y',\n}\n\n/**\n * Resolve a CadQuery-style face selector string to the selected face's center\n * point and outward normal.\n *\n * Supported forms: \">Z\", \"<Z\", \">X\", \"<X\", \">Y\", \"<Y\", each with an optional\n * CadQuery-style index suffix like \">Z[-2]\", plus the six named views\n * (\"front\"/\"back\"/\"left\"/\"right\"/\"top\"/\"bottom\") which are aliases for the\n * corresponding axis selectors per cadquery/selectors.py:687-694.\n * @param shape - Shape whose BREP faces are enumerated for selection.\n * @param sel - Selector string, e.g. \">Z\", \"front\", \">Z[-2]\".\n * @param centerOption - Optional center computation option forwarded to the\n * face-center evaluation.\n * @returns Promise resolving to the selected face's center point and outward\n * normal.\n * @throws Error when the selector matches no face or has unknown syntax\n * (never falls back silently).\n */\nexport async function resolveFaceSelector(\n shape: Shape,\n sel: string,\n centerOption?: string,\n): Promise<{ center: [number, number, number]; normal: [number, number, number] }> {\n // compatOp 提升边界:实参可能是借用视图(见 asBrepShape 注释)——归一为真实\n // Shape,否则 brepOf 为 undefined 会落到 bbox 兜底并在 cad.bboxMax 崩溃。\n shape = asBrepShape(shape)\n // CadQuery named views are aliases for an axis DirectionMinMaxSelector\n // (cadquery/selectors.py:687-694):\n // front=>(0,0,1,max) back=>(0,0,1,min) left=>(1,0,0,min)\n // right=>(1,0,0,max) top=>(0,1,0,max) bottom=>(0,1,0,min)\n // Normalise once so every branch below sees a plain axis selector; without\n // this the lookup misses and the whole-shape bbox fallback silently returns\n // the shape centre instead of the face plane (half-a-hole volume error).\n sel = NAMED_VIEW_TO_AXIS[sel.trim().toLowerCase()] ?? sel\n // Strip index suffix like [-2]\n const baseSel = sel.replace(/\\[-?\\d+\\]$/, '')\n const axisDir: Record<string, { axis: 0 | 1 | 2; sign: 1 | -1 }> = {\n '>Z': { axis: 2, sign: 1 }, '+Z': { axis: 2, sign: 1 },\n '<Z': { axis: 2, sign: -1 }, '-Z': { axis: 2, sign: -1 },\n '>X': { axis: 0, sign: 1 }, '+X': { axis: 0, sign: 1 },\n '<X': { axis: 0, sign: -1 }, '-X': { axis: 0, sign: -1 },\n '>Y': { axis: 1, sign: 1 }, '+Y': { axis: 1, sign: 1 },\n '<Y': { axis: 1, sign: -1 }, '-Y': { axis: 1, sign: -1 },\n }\n const normals: Record<string, [number, number, number]> = {\n '>Z': [0, 0, 1], '+Z': [0, 0, 1], '<Z': [0, 0, -1], '-Z': [0, 0, -1],\n '>X': [1, 0, 0], '+X': [1, 0, 0], '<X': [-1, 0, 0], '-X': [-1, 0, 0],\n '>Y': [0, 1, 0], '+Y': [0, 1, 0], '<Y': [0, -1, 0], '-Y': [0, -1, 0],\n }\n const dir = axisDir[baseSel]\n const fallbackNormal = normals[baseSel] ?? ([0, 0, 1] as [number, number, number])\n\n // ── Multi-axis direction selectors (\"+XY\", \">XZ\", \"-YZ\" … cadquery\n // selectors.py:625 axes table XY=(1,1,0) XZ=(1,0,1) YZ=(0,1,1)) ──\n // '+'/'-' → DirectionSelector: only faces whose outward normal is PARALLEL\n // to the (±) direction (angle < 1e-4 rad, selectors.py:234). '>'/'<' →\n // DirectionMinMaxSelector (selectors.py:399): the face whose center of MASS\n // is farthest along the direction. Index suffixes mean DirectionNthSelector\n // there — not supported, throw instead of silently approximating.\n const multi = /^([<>+-])(XY|XZ|YZ)$/.exec(baseSel)\n if (multi) {\n if (/\\[-?\\d+\\]$/.test(sel.trim())) {\n throw new Error(\n `[cq-compat] selector \"${sel}\": indexed multi-axis selectors not supported`,\n )\n }\n const axesTable: Record<string, [number, number, number]> = {\n XY: [1, 1, 0],\n XZ: [1, 0, 1],\n YZ: [0, 1, 1],\n }\n let d = axesTable[multi[2]]\n if (multi[1] === '-') d = [-d[0], -d[1], -d[2]]\n const dLen = Math.hypot(d[0], d[1], d[2])\n const dirV: [number, number, number] = [d[0] / dLen, d[1] / dLen, d[2] / dLen]\n const handleM = brepOf(shape)\n if (!handleM) {\n throw new Error(`[cq-compat] selector \"${sel}\": BREP unavailable`)\n }\n const kernelM = getKernel() as unknown as OcctKernel\n const faceList = kernelM.getSubShapes(handleM as unknown as ShapeHandle, 'face') as unknown as ShapeHandle[]\n if (faceList.length === 0) {\n throw new Error(`[cq-compat] selector \"${sel}\": shape has no faces`)\n }\n const faceNormalOf = (f: ShapeHandle): [number, number, number] => {\n const uv = kernelM.uvBounds(f)\n const n = kernelM.surfaceNormal(f, (uv.uMin + uv.uMax) / 2, (uv.vMin + uv.vMax) / 2)\n return [n.x, n.y, n.z]\n }\n const comOf = (f: ShapeHandle): [number, number, number] => {\n const c = kernelM.getSurfaceCenterOfMass(f)\n return [c.x, c.y, c.z]\n }\n const dot = (a: [number, number, number], b: [number, number, number]): number =>\n a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n\n if (multi[1] === '+' || multi[1] === '-') {\n // DirectionSelector: angle(normal, dir) < 1e-4 rad (selectors.py:235).\n const PAR_TOL = Math.cos(1e-4)\n const found = faceList.find((f) => dot(faceNormalOf(f), dirV) > PAR_TOL)\n if (!found) {\n throw new Error(\n `[cq-compat] selector \"${sel}\": no face with normal parallel to the direction`,\n )\n }\n return { center: comOf(found), normal: faceNormalOf(found) }\n }\n // '>'/'<': DirectionMinMaxSelector over center-of-mass projections.\n let bestF: ShapeHandle | null = null\n let bestVal = 0\n for (const f of faceList) {\n const val = dot(comOf(f), dirV)\n if (!bestF || (multi[1] === '>' ? val > bestVal + 1e-9 : val < bestVal - 1e-9)) {\n bestF = f\n bestVal = val\n }\n }\n return { center: comOf(bestF!), normal: faceNormalOf(bestF!) }\n }\n\n // ── Face-based selection (BREP kernel available) ──\n try {\n const handle = brepOf(shape)\n const kernel = getKernel() as unknown as OcctKernel\n if (handle && dir) {\n const faces = kernel.getSubShapes(handle as unknown as ShapeHandle, 'face') as unknown as ShapeHandle[]\n const cands: { handle: ShapeHandle; center: [number, number, number] }[] = []\n for (const f of faces) {\n const bb = kernel.getBoundingBox(f)\n cands.push({\n handle: f,\n center: [\n (bb.xmin + bb.xmax) / 2,\n (bb.ymin + bb.ymax) / 2,\n (bb.zmin + bb.zmax) / 2,\n ],\n })\n }\n let best: { handle: ShapeHandle; center: [number, number, number] } | null = null\n let normal = fallbackNormal\n // Extract the index suffix, if any.\n const idxMatch = /\\[(-?\\d+)\\]$/.exec(sel.trim())\n if (idxMatch) {\n // CadQuery face indexing (verified vs cadquery 2.8.0):\n // '>A[k]' / '<A[k]' DirectionMinMaxSelector: '>' ascending, '<' descending\n // '+A[k]' / '-A[k]' DirectionSelector: list the extreme face first, then\n // inward — '-' ascending, '+' descending along A\n // (faces(\"-Y\")[1] is the 2nd -Y face from the -Y extreme,\n // NOT the +Y extreme face).\n // Only faces PERPENDICULAR to the axis participate (bbox thin along the axis).\n // For '+'/'-' selectors we additionally keep only faces whose outward normal\n // is parallel to the selector axis with the matching sign (CadQuery filters\n // by exact normal direction), so a boss face and its base sibling don't\n // collide in the index.\n const sc = baseSel[0]\n const isDirSelector = sc === '+' || sc === '-'\n const perp: typeof cands = cands.filter((cd) => {\n const bb = kernel.getBoundingBox(cd.handle)\n const ext = [bb.xmax - bb.xmin, bb.ymax - bb.ymin, bb.zmax - bb.zmin][dir.axis]\n if (ext > 0.1) return false\n if (isDirSelector) {\n const uv = kernel.uvBounds(cd.handle)\n const n = kernel.surfaceNormal(cd.handle, (uv.uMin + uv.uMax) / 2, (uv.vMin + uv.vMax) / 2)\n const nv: [number, number, number] = [n.x, n.y, n.z]\n if (Math.abs(nv[dir.axis]) < 0.999) return false\n if (Math.sign(nv[dir.axis]) !== dir.sign) return false\n }\n return true\n })\n const idx = parseInt(idxMatch[1], 10)\n const asc = sc === '>' || sc === '-'\n const sorted = perp\n .slice()\n .sort((a, b) => (asc ? a.center[dir.axis] - b.center[dir.axis] : b.center[dir.axis] - a.center[dir.axis]))\n const pick = idx < 0 ? sorted.length + idx : idx\n if (pick < 0 || pick >= sorted.length) {\n throw new Error(\n `[cq-compat] selector \"${sel}\": index ${idx} out of range (${sorted.length} faces)`,\n )\n }\n best = sorted[pick]\n if (isDirSelector) {\n // DirectionSelector: the outward normal is exactly the selector axis/sign.\n normal = fallbackNormal\n } else {\n // DirectionMinMaxSelector: outward normal from face position vs shape centre.\n const max = bboxMax(shape)\n const min = bboxMin(shape)\n const shapeCenter = [(max[0] + min[0]) / 2, (max[1] + min[1]) / 2, (max[2] + min[2]) / 2]\n normal = [0, 0, 0]\n normal[dir.axis] = best.center[dir.axis] >= shapeCenter[dir.axis] ? 1 : -1\n }\n } else {\n for (const cd of cands) {\n const val = cd.center[dir.axis]\n if (!best) {\n best = cd\n continue\n }\n const bestVal = best.center[dir.axis]\n if (dir.sign === 1 ? val > bestVal + 1e-6 : val < bestVal - 1e-6) {\n best = cd\n } else if (Math.abs(val - bestVal) <= 1e-6) {\n // Tie (e.g. coplanar faces at the same extreme): prefer the larger face\n const area = kernel.getSurfaceArea(cd.handle)\n if (area > kernel.getSurfaceArea(best.handle)) best = cd\n }\n }\n }\n if (best) {\n let origin: [number, number, number]\n if (centerOption === 'CenterOfBoundBox') {\n origin = best.center\n } else {\n // CenterOfMass: surface (area-weighted) centroid\n const com = kernel.getSurfaceCenterOfMass(best.handle)\n origin = [com.x, com.y, com.z]\n }\n return { center: origin, normal }\n }\n }\n } catch (e) {\n if (e instanceof Error && e.message.includes('out of range')) throw e\n // No BREP / kernel not ready — fall through to bbox approximation\n }\n\n // ── Fallback: whole-shape bbox (previous behavior) ──\n const max = bboxMax(shape)\n const min = bboxMin(shape)\n const center: [number, number, number] = [\n (max[0] + min[0]) / 2,\n (max[1] + min[1]) / 2,\n (max[2] + min[2]) / 2,\n ]\n\n const m = /^([<>+-])([XYZ])(?:\\[(-?\\d+)\\])?$/.exec(sel.trim())\n if (!m) {\n // Default: return center\n return { center, normal: [0, 0, 1] }\n }\n const [, sign, axisChar, idxStr] = m\n const axis = axisChar === 'X' ? 0 : axisChar === 'Y' ? 1 : 2\n // '>' and '+' select the max side; '<' and '-' select the min side.\n const maxDir = sign === '>' || sign === '+'\n const normal: [number, number, number] = [0, 0, 0]\n normal[axis] = maxDir ? 1 : -1\n\n if (idxStr === undefined) {\n const extreme: [number, number, number] = [center[0], center[1], center[2]]\n extreme[axis] = maxDir ? max[axis] : min[axis]\n return { center: extreme, normal }\n }\n\n // Indexed selector — enumerate real faces and sort by bbox center along axis.\n // CadQuery semantics: '>A[k]' ascending, '<A[k]' descending (see doc above).\n const idx = parseInt(idxStr, 10)\n const faces = compatFn('getFaces')(borrowBrepjsShape(shape)) as unknown[]\n type Entry = { c: [number, number, number]; bounds: Record<string, number> }\n const entries: Entry[] = faces.map((f) => {\n const b = compatFn('getBounds')(f) as Record<string, number>\n return {\n c: [(b.xMin + b.xMax) / 2, (b.yMin + b.yMax) / 2, (b.zMin + b.zMax) / 2],\n bounds: b,\n }\n })\n if (entries.length === 0) {\n throw new Error(`[cq-compat] selector \"${sel}\": shape has no faces`)\n }\n entries.sort((a, b) => (maxDir ? a.c[axis] - b.c[axis] : b.c[axis] - a.c[axis]))\n const pick = idx < 0 ? entries.length + idx : idx\n if (pick < 0 || pick >= entries.length) {\n throw new Error(\n `[cq-compat] selector \"${sel}\": index ${idx} out of range (${entries.length} faces)`,\n )\n }\n const fb = entries[pick].bounds\n const faceCenter: [number, number, number] = [\n (fb.xMin + fb.xMax) / 2,\n (fb.yMin + fb.yMax) / 2,\n (fb.zMin + fb.zMax) / 2,\n ]\n // Outward normal: away from the shape bbox center along the axis.\n normal[axis] = faceCenter[axis] >= center[axis] ? 1 : -1\n return { center: faceCenter, normal }\n}\n\n/**\n * Build a regular-polygon prism on a workplane (vendored polygon face +\n * extrude). CadQuery `polygon(n, d)`: n-gon inscribed in a circle of diameter\n * `d`, first vertex on the workplane local +X.\n */\nasync function makePolygonPrismAt(\n wp: Workplane,\n poly: { n: number; d: number },\n length: number,\n dir: [number, number, number],\n): Promise<Shape> {\n const pts: [number, number, number][] = []\n for (let i = 0; i < poly.n; i++) {\n const a = (2 * Math.PI * i) / poly.n\n pts.push(localToWorld(wp, Math.cos(a) * (poly.d / 2), Math.sin(a) * (poly.d / 2)))\n }\n const face = unwrapBrepResult(compatFn('polygon')(pts))\n const vec: [number, number, number] = [dir[0] * length, dir[1] * length, dir[2] * length]\n const prism = unwrapBrepResult(compatFn('extrude')(face, vec))\n return adoptBrepjsProduct(prism)\n}\n\n/**\n * Rotate a Z-axis-aligned primitive so its local +Z maps to `d` — ANY direction,\n * not just axis-aligned (verified vs cadquery 2.8.0: angled holes drill along\n * the transformed workplane normal). Euler decomposition that maps +Z onto d:\n * θy = asin(dx), θx = atan2(−dy, dz) (three.js XYZ-intrinsic, R = Rx·Ry)\n * Rx(θx)·Ry(θy)·(0,0,1) = (dx, dy, dz)\n */\nasync function orientZTo(shape: Shape, d: [number, number, number]): Promise<Shape> {\n const len = Math.hypot(d[0], d[1], d[2])\n const dx = d[0] / len\n const dy = d[1] / len\n const dz = d[2] / len\n const thetaX = Math.atan2(-dy, dz)\n const thetaY = Math.asin(Math.max(-1, Math.min(1, dx)))\n const anglesDeg: [number, number, number] = [\n (thetaX * 180) / Math.PI,\n (thetaY * 180) / Math.PI,\n 0,\n ]\n return cad.rotate_euler(shape, { anglesDeg }) as unknown as Shape\n}\n\n/**\n * Create a cone whose base (radius rBase) sits at the workplane origin and\n * whose apex side extends `height` along `wp.normal`-direction `d`.\n * Used for the full-cone countersink cut of cskHole (CadQuery semantics:\n * h = cskRadius / tan(cskAngle/2), cone from rBase to apex).\n */\nasync function makeConeAt(\n wp: Workplane,\n rBase: number,\n height: number,\n d: [number, number, number],\n): Promise<Shape> {\n const cone = await cad.cone(rBase, 0, height, { centered: true })\n const oriented = await orientZTo(cone as unknown as Shape, d)\n const center = vadd(wp.origin, vscale(d, height / 2))\n return cad.translate(oriented, { offset: center })\n}\n\n/**\n * Create a cylinder at the workplane origin, oriented along normal.\n * Used for hole/cutBlind implementations.\n */\nasync function makeCylinderAt(\n wp: Workplane,\n radius: number,\n height: number,\n): Promise<Shape> {\n const cyl = await cad.cylinder(radius, height, { centered: true })\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const o = Array.isArray(wp.origin) ? wp.origin : ([0, 0, 0] as [number, number, number])\n // Rotate the Z-axis cylinder so its axis aligns with the workplane normal.\n const oriented = await orientZTo(cyl as unknown as Shape, n)\n const center: [number, number, number] = [o[0] + n[0] * height / 2, o[1] + n[1] * height / 2, o[2] + n[2] * height / 2]\n return cad.translate(oriented, { offset: center })\n}\n\n/**\n * Create a box at the workplane origin: `w` along the workplane xDir, `d`\n * along yDir, `h` along the normal (CadQuery rect+extrude tool semantics).\n * The tool is built axis-aligned with the world extents implied by the\n * workplane basis, so it is correct for any axis-aligned normal.\n */\nasync function makeBoxAt(\n wp: Workplane,\n w: number,\n d: number,\n h: number,\n): Promise<Shape> {\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const o = Array.isArray(wp.origin) ? wp.origin : ([0, 0, 0] as [number, number, number])\n const axes = faceAxes(n)\n // World-space extents of a w×d×h box aligned to the (axis-aligned) basis.\n const sx = w * Math.abs(axes.x[0]) + d * Math.abs(axes.y[0]) + h * Math.abs(n[0])\n const sy = w * Math.abs(axes.x[1]) + d * Math.abs(axes.y[1]) + h * Math.abs(n[1])\n const sz = w * Math.abs(axes.x[2]) + d * Math.abs(axes.y[2]) + h * Math.abs(n[2])\n const box = await cad.box(sx, sy, sz, { centered: true })\n const center: [number, number, number] = [o[0] + n[0] * h / 2, o[1] + n[1] * h / 2, o[2] + n[2] * h / 2]\n return cad.translate(box, { offset: center })\n}\n\n// ── Public API ─────────────────────────────────────────────────────────────\n\n/** CadQuery `centered` parameter: bool or per-axis triple. */\ntype Centered3 = boolean | [boolean, boolean, boolean]\n\n/** Normalize a `centered` parameter to a per-axis triple. */\nfunction resolveCentered(c: Centered3): [boolean, boolean, boolean] {\n return typeof c === 'boolean' ? [c, c, c] : c\n}\n\n/** Build a compound Shape from several Shapes (brepjs makeCompound projection). */\nfunction makeCompoundShape(shapes: Shape[]): Shape {\n if (shapes.length === 1) return shapes[0]\n const product = unwrapBrepResult(\n compatFn('makeCompound')(shapes.map((s) => borrowBrepjsShape(s))),\n )\n return adoptBrepjsProduct(product)\n}\n\n/**\n * Finish an eachpoint-style op (box/sphere/cylinder): `combine=True` (CadQuery\n * default) fuses the created bodies with each other and with the existing\n * solid on the workplane; `combine=False` leaves them as separate solids in a\n * compound (verified vs cadquery 2.8.0: testSpherePointList -> 4 solids).\n */\nasync function combineEachpoint(\n wp: Workplane,\n shapes: Shape[],\n combine: boolean,\n clean: boolean = true,\n): Promise<Workplane> {\n let shape: Shape\n if (combine) {\n shape = shapes[0]\n for (let i = 1; i < shapes.length; i++) {\n shape = await fuseShapes(shape, shapes[i], clean)\n }\n if (wp.shape) shape = await fuseShapes(wp.shape, shape, clean)\n } else {\n shape = makeCompoundShape(shapes)\n }\n return clone(wp, { shape, faceSel: null, edgeSel: null, vertexSel: null, pts: [] })\n}\n\n/**\n * Workplane\n * @param plane - string\n * @returns Workplane\n */\nexport function Workplane(plane: string = 'XY'): Workplane {\n return makeWorkplane(plane)\n}\n\n/**\n * add\n * @param wp - Workplane\n * @param shape - Shape\n * @returns Promise<Workplane>\n */\nexport async function add(wp: Workplane, shape: Shape): Promise<Workplane> {\n return clone(wp, { shape })\n}\n\n/**\n * box\n * @param wp - Workplane\n * @param w - number\n * @param d - number\n * @param h - number\n * @param opts - { centered?; combine? }\n * @returns Promise<Workplane>\n *\n * CadQuery semantics (verified vs cadquery 2.8.0 `Workplane.box`): with the\n * default `centered=(True, True, True)` the box is centered on the workplane\n * origin in ALL three axes — including the normal direction. The old\n * \"sit on the face\" behaviour belonged to the makeBoxAt tool-body helper and\n * leaked into this public op (found by the parity harness, testBoxDefaults).\n *\n * Each-point semantics (verified vs 2.8.0): box() is eachpoint-based — with\n * points pushed on the stack a box is created at every point; `combine=True`\n * (default) fuses them with the existing solid, `combine=False` leaves them\n * as separate solids in a compound (test_getitem / testBoxPointList).\n */\nexport async function box(\n wp: Workplane,\n w: number,\n d: number,\n h: number,\n opts?: { centered?: Centered3; combine?: boolean },\n): Promise<Workplane> {\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const axes = faceAxes(n)\n // World-space extents of a w×d×h box aligned to the (axis-aligned) basis.\n const sx = w * Math.abs(axes.x[0]) + d * Math.abs(axes.y[0]) + h * Math.abs(n[0])\n const sy = w * Math.abs(axes.x[1]) + d * Math.abs(axes.y[1]) + h * Math.abs(n[1])\n const sz = w * Math.abs(axes.x[2]) + d * Math.abs(axes.y[2]) + h * Math.abs(n[2])\n const boxShape = await cad.box(sx, sy, sz, { centered: true })\n const c = resolveCentered(opts?.centered ?? true)\n // Uncentered axis: bbox corner sits on the point (offset by half the extent).\n const off: [number, number, number] = [\n c[0] ? 0 : (w / 2) * axes.x[0] + (d / 2) * axes.y[0] + (h / 2) * n[0],\n c[1] ? 0 : (w / 2) * axes.x[1] + (d / 2) * axes.y[1] + (h / 2) * n[1],\n c[2] ? 0 : (w / 2) * axes.x[2] + (d / 2) * axes.y[2] + (h / 2) * n[2],\n ]\n const points = eachPoints(wp)\n const shapes: Shape[] = []\n for (const [px, py] of points) {\n const center = vadd(localToWorld(wp, px, py), off)\n shapes.push(await cad.translate(boxShape, { offset: center }))\n }\n return combineEachpoint(wp, shapes, opts?.combine ?? true)\n}\n\n/**\n * sphere\n * @param wp - Workplane\n * @param radius - number\n * @param opts - { centered?; combine? }\n * @returns Promise<Workplane>\n *\n * CadQuery semantics (verified vs cadquery 2.8.0 `Workplane.sphere`): a sphere\n * is created for every point on the stack (or the workplane origin); per-axis\n * `centered=false` puts the sphere's bbox corner on the point. Only full\n * spheres are supported (angle1/angle2/angle3 partial sweeps are not\n * expressible with the cad.sphere primitive — upstream testSphereCustom stays\n * blocked on that).\n */\nexport async function sphere(\n wp: Workplane,\n radius: number,\n opts?: { centered?: Centered3; combine?: boolean },\n): Promise<Workplane> {\n const c = resolveCentered(opts?.centered ?? true)\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const x = Array.isArray(wp.xDir) ? wp.xDir : ([1, 0, 0] as [number, number, number])\n const y = Array.isArray(wp.yDir) ? wp.yDir : ([0, 1, 0] as [number, number, number])\n // Local-frame offset: uncentered axis -> bbox corner on the point.\n const offLocal: [number, number, number] = [c[0] ? 0 : radius, c[1] ? 0 : radius, c[2] ? 0 : radius]\n const off = vadd(vadd(vscale(x, offLocal[0]), vscale(y, offLocal[1])), vscale(n, offLocal[2]))\n const points = eachPoints(wp)\n const shapes: Shape[] = []\n for (const [px, py] of points) {\n const center = vadd(localToWorld(wp, px, py), off)\n shapes.push(await cad.sphere({ radius, center }))\n }\n return combineEachpoint(wp, shapes, opts?.combine ?? true)\n}\n\n/**\n * wedge — CadQuery `Workplane.wedge` parity.\n *\n * OCCT `BRepPrimAPI_MakeWedge(dx, dy, dz, xmin, zmin, xmax, zmax)` geometry:\n * the bottom face (local y=0) spans the full [0,dx]×[0,dz] rectangle and the\n * top face (local y=dy) spans [xmin,xmax]×[zmin,zmax]; all six faces are\n * planar. Built here as a RULED loft between the two rectangles — geometrically\n * identical to the OCCT primitive (verified vs cadquery 2.8.0: testClean\n * wedge-with-sphere union vol 9.079922 / testNoClean 10.650718).\n *\n * `centered=True` (default) shifts by (−dx/2, −dy/2, −dz/2) along the LOCAL\n * workplane axes, mirroring upstream's `offset` computation. Limitation: the\n * kernel has no makeWedge primitive, and upstream composes the wedge in WORLD\n * axes before the eachpoint location transform — for the default XY plane the\n * two agree; rotated planes are not exercised by any current mirror.\n *\n * @param wp - Workplane acting as the eachpoint carrier\n * @param dx - Bottom-face extent along local X\n * @param dy - Wedge height along local Y\n * @param dz - Bottom-face extent along local Z\n * @param xmin - Top-face minimum along local X\n * @param zmin - Top-face minimum along local Z\n * @param xmax - Top-face maximum along local X\n * @param zmax - Top-face maximum along local Z\n * @param opts - { centered?: Centered3; combine?: boolean; clean?: boolean }\n * @returns Promise<Workplane> carrying the wedge solid\n */\nexport async function wedge(\n wp: Workplane,\n dx: number,\n dy: number,\n dz: number,\n xmin: number,\n zmin: number,\n xmax: number,\n zmax: number,\n opts?: { centered?: Centered3; combine?: boolean; clean?: boolean },\n): Promise<Workplane> {\n const pl = {\n origin: Array.isArray(wp.origin) ? wp.origin : ([0, 0, 0] as [number, number, number]),\n xDir: Array.isArray(wp.xDir) ? wp.xDir : ([1, 0, 0] as [number, number, number]),\n yDir: Array.isArray(wp.yDir) ? wp.yDir : ([0, 1, 0] as [number, number, number]),\n normal: Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number]),\n }\n const p3 = (x: number, y: number, z: number): [number, number, number] =>\n vadd(pl.origin, vadd(vadd(vscale(pl.xDir, x), vscale(pl.yDir, y)), vscale(pl.normal, z)))\n const rectWire = (pts: [number, number, number][]): unknown => {\n const edges: unknown[] = []\n for (let i = 0; i < 4; i++) {\n edges.push(unwrapBrepResult(compatFn('makeLine')(pts[i], pts[(i + 1) % 4])))\n }\n return unwrapBrepResult(compatFn('assembleWire')(edges))\n }\n const c = resolveCentered(opts?.centered ?? true)\n const ox = c[0] ? -dx / 2 : 0\n const oy = c[1] ? -dy / 2 : 0\n const oz = c[2] ? -dz / 2 : 0\n // Bottom (local y=0): full [0,dx]×[0,dz]. Top (local y=dy): [xmin,xmax]×[zmin,zmax].\n // Corner order matches on both rectangles so the ruled loft pairs the right vertices.\n const bottom = rectWire([\n p3(ox, oy, oz),\n p3(ox + dx, oy, oz),\n p3(ox + dx, oy, oz + dz),\n p3(ox, oy, oz + dz),\n ])\n const top = rectWire([\n p3(ox + xmin, oy + dy, oz + zmin),\n p3(ox + xmax, oy + dy, oz + zmin),\n p3(ox + xmax, oy + dy, oz + zmax),\n p3(ox + xmin, oy + dy, oz + zmax),\n ])\n const solid = adoptBrepjsProduct(\n unwrapBrepResult(compatFn('loft')([bottom, top], { ruled: true })),\n ) as Shape\n const points = eachPoints(wp)\n const shapes: Shape[] = []\n for (const [px, py] of points) {\n shapes.push(await cad.translate(solid, { offset: localToWorld(wp, px, py) }))\n }\n return combineEachpoint(wp, shapes, opts?.combine ?? true, opts?.clean ?? true)\n}\n\n/**\n * Rotation R mapping local +Z onto `d`, reproducing OCCT `gp_Ax3(P, D)`\n * auto-XDirection (verified vs cadquery 2.8.0 by measuring\n * `Workplane.cylinder(..., direct=...)` center offsets for all six axis\n * directions). Applied to the per-axis `centered` offsets before the\n * workplane mapping, exactly as upstream `s.moved(Plane(...).location)` does.\n */\nfunction ax3Rotation(d: [number, number, number]): [number, number, number][] {\n const key = `${d[0]},${d[1]},${d[2]}`\n // rows: R·ex, R·ey, R·ez\n const table: Record<string, [[number, number, number], [number, number, number], [number, number, number]]> = {\n '1,0,0': [[0, 0, 1], [0, -1, 0], [1, 0, 0]],\n '-1,0,0': [[0, 0, -1], [0, -1, 0], [-1, 0, 0]],\n '0,1,0': [[0, 0, 1], [1, 0, 0], [0, 1, 0]],\n '0,-1,0': [[0, 0, -1], [1, 0, 0], [0, -1, 0]],\n '0,0,1': [[1, 0, 0], [0, 1, 0], [0, 0, 1]],\n '0,0,-1': [[-1, 0, 0], [0, 1, 0], [0, 0, -1]],\n }\n const r = table[key]\n if (!r) throw new Error(`[cq-compat] cylinder direct ${key} not supported (axis directions only)`)\n return r\n}\n\n/**\n * cylinder\n * @param wp - Workplane\n * @param height - number\n * @param radius - number\n * @param opts - { direct?; centered?; combine? }\n * @returns Promise<Workplane>\n *\n * CadQuery semantics (verified vs cadquery 2.8.0 `Workplane.cylinder`): a\n * cylinder for every point on the stack; per-axis `centered` offsets are\n * applied in the LOCAL frame (xDir/yDir/normal), then rotated by the\n * `direct` plane orientation (ax3Rotation table), then mapped by the\n * workplane basis. `angle != 360` pie-slice sweeps are not supported.\n */\nexport async function cylinder(\n wp: Workplane,\n height: number,\n radius: number,\n opts?: { direct?: [number, number, number]; angle?: number; centered?: Centered3; combine?: boolean },\n): Promise<Workplane> {\n const c = resolveCentered(opts?.centered ?? true)\n const d = opts?.direct ?? [0, 0, 1]\n if (opts?.angle !== undefined && opts.angle !== 360) {\n throw new Error('[cq-compat] cylinder angle != 360 is not supported')\n }\n const R = ax3Rotation(d)\n const rot = (v: [number, number, number]): [number, number, number] => [\n R[0][0] * v[0] + R[1][0] * v[1] + R[2][0] * v[2],\n R[0][1] * v[0] + R[1][1] * v[1] + R[2][1] * v[2],\n R[0][2] * v[0] + R[1][2] * v[1] + R[2][2] * v[2],\n ]\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const x = Array.isArray(wp.xDir) ? wp.xDir : ([1, 0, 0] as [number, number, number])\n const y = Array.isArray(wp.yDir) ? wp.yDir : ([0, 1, 0] as [number, number, number])\n // Map a local vector through the workplane basis.\n const map = (v: [number, number, number]): [number, number, number] =>\n vadd(vadd(vscale(x, v[0]), vscale(y, v[1])), vscale(n, v[2]))\n // Uncentered axis -> base offset by half the local extent.\n const offLocal: [number, number, number] = [\n c[0] ? 0 : radius,\n c[1] ? 0 : radius,\n c[2] ? -height / 2 : 0,\n ]\n const off = map(rot(offLocal))\n const axis = map(d)\n const axisLen = Math.hypot(axis[0], axis[1], axis[2])\n const axisUnit: [number, number, number] = [axis[0] / axisLen, axis[1] / axisLen, axis[2] / axisLen]\n const points = eachPoints(wp)\n const shapes: Shape[] = []\n for (const [px, py] of points) {\n const base = vadd(localToWorld(wp, px, py), off)\n const bodyCenter = vadd(base, vscale(axisUnit, height / 2))\n const cyl = await cad.cylinder({ radius, height, centered: true })\n const oriented = await orientZTo(cyl as unknown as Shape, axisUnit)\n shapes.push(await cad.translate(oriented, { offset: bodyCenter }))\n }\n return combineEachpoint(wp, shapes, opts?.combine ?? true)\n}\n\n/**\n * torus — CadQuery free-function analogue (occ_impl.shapes.torus).\n *\n * Upstream takes DIAMETERS and builds a full torus centred at the origin,\n * axis +Z: `torus(d1, d2)` -> R = d1/2, r = d2/2, V = 2π²·R·r²\n * (`torus(10, 2)` -> 98.696, ref-verified against cadquery 2.8.0).\n *\n * @param wp - Workplane carrier (fresh `Workplane()` for the free function).\n * @param d1 - Major DIAMETER.\n * @param d2 - Minor DIAMETER.\n * @param opts - { combine?: boolean }\n * @returns Promise<Workplane> carrying the torus solid.\n */\nexport async function torus(\n wp: Workplane,\n d1: number,\n d2: number,\n opts?: { combine?: boolean },\n): Promise<Workplane> {\n const product = unwrapBrepResult(compatFn('torus')(d1 / 2, d2 / 2))\n const shape = adoptBrepjsProduct(product)\n return combineEachpoint(wp, [shape], opts?.combine ?? true)\n}\n\n/**\n * cone — CadQuery free-function analogue (occ_impl.shapes.cone).\n *\n * Upstream takes DIAMETERS with the base centred on the origin at z=0, axis\n * +Z: `cone(d1, d2, h)` -> R = d1/2, r = d2/2, V = π/3·h·(R²+Rr+r²)\n * (`cone(2, 1, 1)` -> 1.8326, ref-verified against cadquery 2.8.0). The\n * 2-arg upstream form `cone(d, h)` is the full cone — pass `d2 = 0`.\n *\n * @param wp - Workplane carrier (fresh `Workplane()` for the free function).\n * @param d1 - Base DIAMETER.\n * @param d2 - Top DIAMETER (0 for a full cone).\n * @param h - Height along +Z.\n * @param opts - { combine?: boolean }\n * @returns Promise<Workplane> carrying the cone solid.\n */\nexport async function cone(\n wp: Workplane,\n d1: number,\n d2: number,\n h: number,\n opts?: { combine?: boolean },\n): Promise<Workplane> {\n const base = await cad.cone(d1 / 2, d2 / 2, h, { centered: true })\n // Kernel cone with centered:true is centred at the origin mid-height; lift\n // by h/2 so the base circle sits on z=0 (upstream free-function semantics).\n const shape = await cad.translate(base as unknown as Shape, { offset: [0, 0, h / 2] })\n return combineEachpoint(wp, [shape as Shape], opts?.combine ?? true)\n}\n\n/**\n * rarray\n * @param wp - Workplane\n * @param xSpacing - number\n * @param ySpacing - number\n * @param xCount - number\n * @param yCount - number\n * @param center - boolean | [boolean, boolean]\n * @returns Workplane\n *\n * CadQuery semantics (verified vs cadquery 2.8.0 `Workplane.rarray`): pushes\n * an xCount×yCount grid of points; per-axis `center=true` centers the grid on\n * the workplane origin, `false` puts the lower corner on it.\n */\nexport function rarray(\n wp: Workplane,\n xSpacing: number,\n ySpacing: number,\n xCount: number,\n yCount: number,\n center: boolean | [boolean, boolean] = true,\n): Workplane {\n if (xCount < 1 || yCount < 1 || (xSpacing <= 0 && ySpacing <= 0)) {\n throw new Error('[cq-compat] rarray: spacing and count must be > 0 in at least one direction')\n }\n const [cx, cy] = typeof center === 'boolean' ? [center, center] : center\n const ox = cx ? (-(xCount - 1) * xSpacing) / 2 : 0\n const oy = cy ? (-(yCount - 1) * ySpacing) / 2 : 0\n const pts: [number, number][] = []\n for (let i = 0; i < xCount; i++) {\n for (let j = 0; j < yCount; j++) {\n pts.push([i * xSpacing + ox, j * ySpacing + oy])\n }\n }\n return clone(wp, { pts })\n}\n\n/**\n * rect\n * @param wp - Workplane\n * @param w - number\n * @param d - number\n * @param opts - { forConstruction?: boolean }\n * @returns Workplane\n */\nexport function rect(\n wp: Workplane,\n w: number,\n d: number,\n opts?: { forConstruction?: boolean; centered?: boolean | [boolean, boolean] },\n): Workplane {\n // Upstream (cadquery 2.8.0 Workplane.rect): centered may be a bool or a\n // per-axis 2-tuple; centered=false puts the CORNER on the reference point,\n // extending in the +x/+y directions (offset is +len/2 even for negatives).\n const centered = opts?.centered ?? true\n const [cxOn, cyOn] = Array.isArray(centered) ? centered : [centered, centered]\n const ox = cxOn ? 0 : w / 2\n const oy = cyOn ? 0 : d / 2\n const at = eachPoints(wp)\n if (opts?.forConstruction) {\n // Construction rect: store corners for vertices() and edge midpoints for edges()\n return clone(wp, {\n forConstruction: true,\n pendingRect: { w, d },\n pendingWires: [\n ...(wp.pendingWires ?? []),\n ...at.map(([px, py]) => ({ kind: 'rect' as const, w, d, cx: px + ox, cy: py + oy, construction: true, plane: planeOf(wp) })),\n ],\n pts: [\n [ox - w / 2, oy - d / 2],\n [ox + w / 2, oy - d / 2],\n [ox + w / 2, oy + d / 2],\n [ox - w / 2, oy + d / 2],\n ],\n edgePts: [\n [ox, oy - d / 2],\n [ox + w / 2, oy],\n [ox, oy + d / 2],\n [ox - w / 2, oy],\n ],\n })\n }\n // Non-construction rect: store profile for extrude()/cutBlind()\n return clone(wp, {\n forConstruction: false,\n pendingRect: { w, d },\n pendingWires: [\n ...(wp.pendingWires ?? []),\n ...at.map(([px, py]) => ({ kind: 'rect' as const, w, d, cx: px + ox, cy: py + oy, construction: false, plane: planeOf(wp) })),\n ],\n })\n}\n\n/**\n * circle\n * @param wp - Workplane\n * @param radius - number\n * @returns Workplane\n */\nexport function circle(wp: Workplane, radius: number): Workplane {\n // CadQuery eachpoint semantics: with pushed points / selected vertices the\n // circle is created at EVERY point, and all of them land in pendingWires.\n const at = eachPoints(wp)\n return clone(wp, {\n forConstruction: false,\n pendingCircle: { radius },\n pendingWires: [\n ...(wp.pendingWires ?? []),\n ...at.map(([cx, cy]) => ({ kind: 'circle' as const, radius, cx, cy, construction: false, plane: planeOf(wp) })),\n ],\n })\n}\n\n/**\n * ellipse — CadQuery `Workplane.ellipse(x_radius, y_radius)` parity.\n *\n * `x_radius` lies on the workplane X axis and `y_radius` on Y — upstream puts\n * no ordering constraint on them (`testEdgeTypesFilter` uses `ellipse(3, 4)`).\n * The kernel's `makeEllipseEdge` requires major >= minor, ignores the plane's\n * own axes and lays the major axis on the global X direction, so a \"tall\"\n * ellipse is built as a wide one and then rotated 90° about the workplane\n * normal through its centre (see `buildProfileWire`).\n *\n * @param wp - Workplane\n * @param x_radius - radius along the workplane X axis\n * @param y_radius - radius along the workplane Y axis\n * @returns Workplane\n */\nexport function ellipse(wp: Workplane, x_radius: number, y_radius: number): Workplane {\n // CadQuery eachpoint semantics, same as circle(): one pending wire per\n // pushed point / selected vertex.\n const at = eachPoints(wp)\n const base = planeOf(wp)\n const flip = y_radius > x_radius\n return clone(wp, {\n forConstruction: false,\n pendingWires: [\n ...(wp.pendingWires ?? []),\n ...at.map(([cx, cy]) => ({\n kind: 'ellipse' as const,\n majorRadius: flip ? y_radius : x_radius,\n minorRadius: flip ? x_radius : y_radius,\n cx,\n cy,\n construction: false,\n plane: base,\n flip,\n })),\n ],\n })\n}\n\n/**\n * polygon\n * @param wp - Workplane\n * @param n - number\n * @param d - number\n * @returns Workplane\n */\nexport function polygon(wp: Workplane, n: number, d: number): Workplane {\n // CadQuery polygon(nSides, diameter): regular n-gon inscribed in a circle of\n // the given diameter, first vertex on local +X. The prism is materialized\n // when consumed by extrude()/cutBlind() (makePolygonPrismAt).\n const at = eachPoints(wp)\n return clone(wp, {\n forConstruction: false,\n pendingPolygon: { n, d },\n pendingWires: [\n ...(wp.pendingWires ?? []),\n ...at.map(([cx, cy]) => ({ kind: 'polygon' as const, n, d, cx, cy, construction: false, plane: planeOf(wp) })),\n ],\n })\n}\n\n/**\n * Implicit workplane for a pending face selection.\n *\n * CadQuery semantics (verified against cadquery 2.8.0): after `faces(sel)`, a\n * 2D profile followed by extrude/cut operates on the SELECTED face's plane,\n * exactly as if `workplane()` had been called — even though `Workplane.plane`\n * still reports the original origin. Measured on `box(1,1,1)`:\n * - `box(1,1,1).rect(1,.5).cutBlind(-0.2)` -> CoM z = +0.011111\n * (slot at z in [-0.2, 0])\n * - `box(1,1,1).faces(\">Z\").rect(1,.5).cutBlind(-0.2)` -> CoM z = -0.044444\n * (slot at z in [0.3, 0.5])\n * - `...faces(\">Z\")...cutBlind(+0.2)` -> volume unchanged (1.0):\n * the cut starts at z=0.5 and misses the solid entirely.\n * Without this step the profile is built on the un-lifted workplane and the\n * feature lands half a body away.\n *\n * NOTE ON TYPES: `workplane()` never touches `.shape`, only origin/axes. But\n * reassigning `wp` resets TypeScript's narrowing of `wp.shape`, so call sites\n * must capture the shape in a local BEFORE calling this helper.\n *\n * @param wp - Workplane possibly carrying a face selection.\n * @returns Promise<Workplane> with the face plane applied, or `wp` unchanged.\n */\nasync function applyPendingFacePlane(wp: Workplane): Promise<Workplane> {\n if (!wp.faceSel) return wp\n return workplane(wp)\n}\n\n// ── Pending-wire profiles (CadQuery pendingWires parity) ───────────────────\n\n/** Local-space (workplane 2D) bounding box of a pending wire. */\nfunction wireBBox(w: PendingWire): { minX: number; minY: number; maxX: number; maxY: number } {\n if (w.kind === 'circle') {\n return {\n minX: w.cx - w.radius,\n minY: w.cy - w.radius,\n maxX: w.cx + w.radius,\n maxY: w.cy + w.radius,\n }\n }\n if (w.kind === 'ellipse') {\n // flip: the built ellipse is rotated 90° in plane, so the local X extent is\n // the minor radius and the local Y extent the major one.\n const rx = w.flip ? w.minorRadius : w.majorRadius\n const ry = w.flip ? w.majorRadius : w.minorRadius\n return {\n minX: w.cx - rx,\n minY: w.cy - ry,\n maxX: w.cx + rx,\n maxY: w.cy + ry,\n }\n }\n if (w.kind === 'rect') {\n return {\n minX: w.cx - w.w / 2,\n minY: w.cy - w.d / 2,\n maxX: w.cx + w.w / 2,\n maxY: w.cy + w.d / 2,\n }\n }\n if (w.kind === 'path') {\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n const consider = (p: [number, number]): void => {\n minX = Math.min(minX, p[0])\n minY = Math.min(minY, p[1])\n maxX = Math.max(maxX, p[0])\n maxY = Math.max(maxY, p[1])\n }\n for (const p of w.pts) consider(p)\n // Arc bulges: include the through/mid points (for arc3 exact sweep max\n // needs the circle; the mid point is the standard chord-mid correction and\n // keeps cut-tool envelopes from under-covering bulged profiles).\n if (w.edges) {\n for (const e of w.edges) {\n if (e.kind === 'arc3') consider(e.mid)\n }\n }\n return { minX, minY, maxX, maxY }\n }\n // polygon: circumradius = d/2 (n-gon inscribed in a circle of diameter d)\n const r = w.d / 2\n return { minX: w.cx - r, minY: w.cy - r, maxX: w.cx + r, maxY: w.cy + r }\n}\n\n/**\n * Group pending wires into faces: every outermost wire becomes one face and\n * the wires it encloses become that face's holes.\n *\n * Mirrors cadquery 2.8.0 (measured, `sortWiresByBuildOrder`-like behaviour):\n * `pushPoints([p1,p2]).circle(4).circle(2)` -> TWO annuli (2 solids)\n * `rect(2,2)` + 4 corner circles -> ONE plate with 4 holes\n *\n * Nesting is decided by bbox containment; area ties keep declaration order so\n * disjoint wires of equal size never swallow each other.\n */\nfunction groupPendingWires(wires: PendingWire[]): { outer: PendingWire; holes: PendingWire[] }[] {\n const boxes = wires.map(wireBBox)\n const area = (i: number) => (boxes[i].maxX - boxes[i].minX) * (boxes[i].maxY - boxes[i].minY)\n const order = wires.map((_, i) => i).sort((a, b) => area(b) - area(a) || a - b)\n const groups: { outer: PendingWire; holes: PendingWire[] }[] = []\n const claimed = new Set<number>()\n for (const i of order) {\n if (claimed.has(i)) continue\n claimed.add(i)\n const ob = boxes[i]\n const holes: PendingWire[] = []\n for (const j of order) {\n if (claimed.has(j)) continue\n const hb = boxes[j]\n if (hb.minX >= ob.minX && hb.maxX <= ob.maxX && hb.minY >= ob.minY && hb.maxY <= ob.maxY) {\n claimed.add(j)\n holes.push(wires[j])\n }\n }\n groups.push({ outer: wires[i], holes })\n }\n return groups\n}\n\n// ── 2D drafting (CadQuery moveTo/lineTo/close/wire parity) ─────────────────\n\n/**\n * Current drawing point in local coordinates.\n *\n * Upstream `_findFromPoint` returns the end point of the last stack object, or\n * `plane.origin` when the stack is empty — hence the `[0, 0]` fallback.\n */\nfunction currentLocalPoint(wp: Workplane): [number, number] {\n return wp.currentPoint ?? ([0, 0] as [number, number])\n}\n\n/**\n * Draft one straight edge from the current point to `to` and advance there.\n *\n * `forConstruction` edges still move the current point (upstream calls\n * `newObject([edge])` unconditionally) but are NOT queued into `pendingEdges`\n * and never set `firstPoint` — upstream only queues via `_addPendingEdge`.\n */\nfunction draftEdge(wp: Workplane, to: [number, number], forConstruction: boolean): Workplane {\n const from = currentLocalPoint(wp)\n if (forConstruction) {\n return clone(wp, { currentPoint: to })\n }\n const edges: PendingEdge[] = [...(wp.pendingEdges ?? []), { kind: 'line', from, to }]\n return clone(wp, {\n pendingEdges: edges,\n currentPoint: to,\n firstPoint: wp.firstPoint ?? from,\n })\n}\n\n/**\n * Queue one arc edge descriptor (shared by threePointArc/sagittaArc/radiusArc)\n * with the same forConstruction semantics as draftEdge.\n */\nfunction draftArc3(\n wp: Workplane,\n mid: [number, number],\n to: [number, number],\n forConstruction: boolean,\n): Workplane {\n const from = currentLocalPoint(wp)\n if (forConstruction) {\n return clone(wp, { currentPoint: to })\n }\n const edges: PendingEdge[] = [...(wp.pendingEdges ?? []), { kind: 'arc3', from, mid, to }]\n return clone(wp, {\n pendingEdges: edges,\n currentPoint: to,\n firstPoint: wp.firstPoint ?? from,\n })\n}\n\n/**\n * Tangent of the last pending edge at its end point, in local coordinates —\n * the analytic analogue of upstream `previousEdge.tangentAt(1)`.\n *\n * - line: chord direction.\n * - arc3: perpendicular to the end radius of the circumcircle through\n * (from, mid, to), oriented along the travel direction.\n * - tangentArc: perpendicular to the end radius of the circle through `from`\n * with tangent `tgt`, oriented along the travel direction (center side `s`\n * selects the sweep orientation).\n * - spline: uses the stored end tangent (captured from the kernel at creation).\n */\nfunction lastEdgeEndTangent(wp: Workplane): [number, number] {\n const edges = wp.pendingEdges ?? []\n if (edges.length === 0) {\n throw new Error('[cq-compat] tangentArcPoint: no previous edge to continue tangentially')\n }\n const e = edges[edges.length - 1]\n if (e.kind === 'line') {\n const dx = e.to[0] - e.from[0]\n const dy = e.to[1] - e.from[1]\n const len = Math.hypot(dx, dy)\n if (len < 1e-12) throw new Error('[cq-compat] tangentArcPoint: degenerate previous line')\n return [dx / len, dy / len]\n }\n if (e.kind === 'spline') {\n if (e.endTgt) return e.endTgt\n throw new Error('[cq-compat] tangentArcPoint: spline edge has no stored end tangent')\n }\n // Circumcenter of (from, mid, to) for arc3, or of (from, tangent-constraint)\n // for tangentArc — both reduce to: circle through `from` and `to` whose\n // tangent at `from` is known.\n let cx: number, cy: number\n if (e.kind === 'arc3') {\n const [ax, ay] = e.from\n const [mx, my] = e.mid\n const [bx, by] = e.to\n const d = 2 * (ax * (my - by) + mx * (by - ay) + bx * (ay - my))\n if (Math.abs(d) < 1e-12) {\n throw new Error('[cq-compat] tangentArcPoint: previous arc is degenerate (collinear)')\n }\n const a2 = ax * ax + ay * ay\n const m2 = mx * mx + my * my\n const b2 = bx * bx + by * by\n cx = (a2 * (by - my) + m2 * (ay - by) + b2 * (my - ay)) / d\n cy = (a2 * (mx - bx) + m2 * (bx - ax) + b2 * (ax - mx)) / d\n } else {\n // tangentArc: center = from + s·n̂ with n̂ = perp(tgt), s = |d|²/(2·d·n̂)\n const tLen = Math.hypot(e.tgt[0], e.tgt[1])\n const tx = e.tgt[0] / tLen\n const ty = e.tgt[1] / tLen\n const nx = -ty\n const ny = tx\n const dx = e.to[0] - e.from[0]\n const dy = e.to[1] - e.from[1]\n const dn = dx * nx + dy * ny\n if (Math.abs(dn) < 1e-12) {\n throw new Error('[cq-compat] tangentArcPoint: previous arc is degenerate (straight)')\n }\n const s = (dx * dx + dy * dy) / (2 * dn)\n cx = e.from[0] + s * nx\n cy = e.from[1] + s * ny\n }\n // End radius → end tangent (perpendicular), oriented along travel. The\n // sweep orientation comes from where the circle center sits relative to the\n // travel: center on the LEFT of the direction of motion ⇒ CCW sweep (for\n // arc3 the mid point breaks the tie; for tangentArc the center side s does).\n // cross(from−C, to−C) alone is degenerate for half circles.\n const px = e.to[0] - cx\n const py = e.to[1] - cy\n const plen = Math.hypot(px, py)\n if (plen < 1e-12) throw new Error('[cq-compat] tangentArcPoint: previous arc has zero radius')\n let ccw: boolean\n if (e.kind === 'arc3') {\n ccw = (e.mid[0] - cx) * py - (e.mid[1] - cy) * px >= 0\n } else {\n // tangentArc: n̂ = perp(tgt) points LEFT of travel; s > 0 ⇒ center left ⇒ CCW.\n const tLen2 = Math.hypot(e.tgt[0], e.tgt[1])\n const nx = -e.tgt[1] / tLen2\n const ny = e.tgt[0] / tLen2\n const dx = e.to[0] - e.from[0]\n const dy = e.to[1] - e.from[1]\n ccw = dx * nx + dy * ny >= 0\n }\n return ccw ? [-py / plen, px / plen] : [py / plen, -px / plen]\n}\n\n/**\n * Queue one tangent-continuation arc descriptor (tangentArcPoint).\n */\nfunction draftTangentArc(\n wp: Workplane,\n tgt: [number, number],\n to: [number, number],\n forConstruction: boolean,\n): Workplane {\n const from = currentLocalPoint(wp)\n if (forConstruction) {\n return clone(wp, { currentPoint: to })\n }\n const edges: PendingEdge[] = [\n ...(wp.pendingEdges ?? []),\n { kind: 'tangentArc', from, tgt, to },\n ]\n return clone(wp, {\n pendingEdges: edges,\n currentPoint: to,\n firstPoint: wp.firstPoint ?? from,\n })\n}\n\n/**\n * threePointArc — draft an arc from the current point through `point1`,\n * ending at `point2` (CadQuery `Workplane.threePointArc`).\n * @param wp - Workplane\n * @param point1 - intermediate point the arc passes through (local 2D)\n * @param point2 - end point of the arc (local 2D)\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function threePointArc(\n wp: Workplane,\n point1: [number, number],\n point2: [number, number],\n forConstruction: boolean = false,\n): Workplane {\n return draftArc3(wp, point1, point2, forConstruction)\n}\n\n/**\n * sagittaArc — arc from the current point to `endPoint` with sagitta `sag`\n * (CadQuery `Workplane.sagittaArc`). Positive sag bulges to the LEFT of the\n * start→end direction (convex for a clockwise contour), negative to the right.\n * Mirrors the upstream sag-vector rotation in cq.py sagittaArc.\n * @param wp - Workplane\n * @param endPoint - end point (local 2D)\n * @param sag - sagitta (perpendicular distance from arc midpoint to the chord)\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function sagittaArc(\n wp: Workplane,\n endPoint: [number, number],\n sag: number,\n forConstruction: boolean = false,\n): Workplane {\n const start = currentLocalPoint(wp)\n const dx = endPoint[0] - start[0]\n const dy = endPoint[1] - start[1]\n const len = Math.hypot(dx, dy)\n if (len < 1e-12) {\n throw new Error('[cq-compat] sagittaArc: start and end points coincide')\n }\n const nx = dx / len\n const ny = dy / len\n const mag = Math.abs(sag)\n // sag > 0: rotate unit chord direction +90° (x,y)→(−y,x); sag < 0: −90°.\n const sx = sag > 0 ? -ny * mag : ny * mag\n const sy = sag > 0 ? nx * mag : -nx * mag\n const mid: [number, number] = [(start[0] + endPoint[0]) / 2 + sx, (start[1] + endPoint[1]) / 2 + sy]\n return draftArc3(wp, mid, endPoint, forConstruction)\n}\n\n/**\n * radiusArc — arc from the current point to `endPoint` with radius `radius`\n * (CadQuery `Workplane.radiusArc`). Positive radius = convex arc (for a\n * clockwise contour), negative = concave. The sagitta is derived exactly as\n * upstream: sag = |r| − sqrt(r² − (len/2)²).\n * @param wp - Workplane\n * @param endPoint - end point (local 2D)\n * @param radius - arc radius (sign selects the bulge side)\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function radiusArc(\n wp: Workplane,\n endPoint: [number, number],\n radius: number,\n forConstruction: boolean = false,\n): Workplane {\n const start = currentLocalPoint(wp)\n const halfLen = Math.hypot(endPoint[0] - start[0], endPoint[1] - start[1]) / 2\n const TOL = 1e-6\n const r2l2 = radius * radius - halfLen * halfLen\n if (r2l2 < -TOL) {\n throw new Error('[cq-compat] radiusArc: arc radius is not large enough to reach the end point')\n }\n let sag = Math.abs(radius)\n if (Math.abs(r2l2) >= TOL) sag -= Math.sqrt(r2l2)\n return sagittaArc(wp, endPoint, radius > 0 ? sag : -sag, forConstruction)\n}\n\n/**\n * tangentArcPoint — arc tangent to the end of the last drafted edge, ending at\n * `endpoint` (CadQuery `Workplane.tangentArcPoint`).\n * @param wp - Workplane\n * @param endpoint - end point (local 2D; relative to the current point when\n * `relative` is true)\n * @param forConstruction - edge is reference geometry only (default false)\n * @param relative - interpret `endpoint` relative to the current point (default true)\n * @returns Workplane\n */\nexport function tangentArcPoint(\n wp: Workplane,\n endpoint: [number, number],\n forConstruction: boolean = false,\n relative: boolean = true,\n): Workplane {\n const cur = currentLocalPoint(wp)\n const to: [number, number] = relative ? [cur[0] + endpoint[0], cur[1] + endpoint[1]] : [endpoint[0], endpoint[1]]\n const tgt = lastEdgeEndTangent(wp)\n return draftTangentArc(wp, tgt, to, forConstruction)\n}\n\n/**\n * spline — cubic B-spline edge interpolated exactly through `points`\n * (CadQuery `Workplane.spline`, includeCurrent=false default: the edge starts\n * at points[0], NOT at the current point — upstream `_toVectors` only prepends\n * the current point when includeCurrent is set). The current point becomes the\n * spline end. `includeCurrent` prepends the current point; the resulting edge\n * stores its kernel-measured end tangent so a following tangentArcPoint can\n * continue the curve.\n * @param wp - Workplane\n * @param points - interpolation points (local 2D; 3D z=0)\n * @param opts - { forConstruction?; includeCurrent?; periodic?; makeWire? }\n * @returns Workplane\n */\nexport function spline(\n wp: Workplane,\n points: [number, number][],\n opts?: { forConstruction?: boolean; includeCurrent?: boolean; periodic?: boolean; makeWire?: boolean },\n): Workplane {\n if (!Array.isArray(points) || points.length < 2) {\n throw new Error('[cq-compat] spline: at least 2 points are required')\n }\n const includeCurrent = opts?.includeCurrent === true\n const all: [number, number][] = includeCurrent ? [currentLocalPoint(wp), ...points] : points\n const end = all[all.length - 1]\n // Build the spline edge ONCE here and keep a strong reference to it in the\n // descriptor. Creating a throwaway edge just to measure the tangent and\n // dropping it is NOT safe: brepjs registers every kernel shape in a\n // FinalizationRegistry, and when GC collects the discarded wrapper the\n // arena slot is freed and recycled — the next tangent-arc handle can dangle\n // (observed as curvePointAt returning nulls + FACE_BUILD_FAILED).\n if (opts?.forConstruction) {\n return clone(wp, { currentPoint: end })\n }\n const world = all.map(([x, y]) => localToWorld(wp, x, y))\n const builtEdge = unwrapBrepResult(\n compatFn('makeBSplineInterpolation')(world, { periodic: false }),\n )\n const endTgt = splineEndTangent(builtEdge, wp)\n const edges: PendingEdge[] = [\n ...(wp.pendingEdges ?? []),\n { kind: 'spline', from: all[0], pts: all, to: end, endTgt, builtEdge },\n ]\n let next = clone(wp, {\n pendingEdges: edges,\n currentPoint: end,\n firstPoint: wp.firstPoint ?? all[0],\n })\n if (opts?.makeWire) {\n next = wire(next)\n }\n return next\n}\n\n/** Kernel-measured end tangent of a built spline edge, in workplane-local 2D. */\nfunction splineEndTangent(edge: unknown, wp: Workplane): [number, number] {\n // curveTangentAt returns a plain [x, y, z] ARRAY (vendored curveFns →\n // curveOps.curveTangent(...).tangent), not an {x,y,z} vector — indexing it\n // with .x yields undefined → NaN → a corrupt tangent-arc edge downstream.\n const tRaw = compatFn('curveTangentAt')(edge, 1) as number[] | { x: number; y: number; z: number }\n const t = Array.isArray(tRaw)\n ? { x: tRaw[0], y: tRaw[1], z: tRaw[2] }\n : (tRaw as { x: number; y: number; z: number })\n if (![t.x, t.y, t.z].every(Number.isFinite)) {\n throw new Error('[cq-compat] spline: kernel returned a non-finite end tangent')\n }\n // Back to workplane-local 2D.\n const o = wp.origin\n const bx = t.x - o[0]\n const by = t.y - o[1]\n const bz = t.z - o[2]\n const lx = bx * wp.xDir[0] + by * wp.xDir[1] + bz * wp.xDir[2]\n const ly = bx * wp.yDir[0] + by * wp.yDir[1] + bz * wp.yDir[2]\n const len = Math.hypot(lx, ly)\n if (len < 1e-12) throw new Error('[cq-compat] spline: zero end tangent')\n return [lx / len, ly / len]\n}\n\n/**\n * moveTo — move the current point without drawing (CadQuery `Workplane.moveTo`).\n * @param wp - Workplane\n * @param x - target x in local coords (default 0)\n * @param y - target y in local coords (default 0)\n * @returns Workplane\n */\nexport function moveTo(wp: Workplane, x: number = 0, y: number = 0): Workplane {\n return clone(wp, { currentPoint: [x, y] as [number, number] })\n}\n\n/**\n * move2D — relative version of `moveTo` (CadQuery `Workplane.move`).\n *\n * NOTE: upstream spells this `move`, but the Shape-level `move` (the in-place\n * twin of `moved`, which takes `Location` arguments) already owns that name in\n * cq-compat, so the 2D drafting variant is exported as `move2D`.\n *\n * @param wp - Workplane\n * @param xDist - x offset from the current point (default 0)\n * @param yDist - y offset from the current point (default 0)\n * @returns Workplane\n */\nexport function move2D(wp: Workplane, xDist: number = 0, yDist: number = 0): Workplane {\n const p = currentLocalPoint(wp)\n return moveTo(wp, p[0] + xDist, p[1] + yDist)\n}\n\n/**\n * lineTo — draft a straight edge to an absolute local point\n * (CadQuery `Workplane.lineTo`).\n * @param wp - Workplane\n * @param x - target x in local coords\n * @param y - target y in local coords\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function lineTo(wp: Workplane, x: number, y: number, forConstruction: boolean = false): Workplane {\n return draftEdge(wp, [x, y], forConstruction)\n}\n\n/**\n * line — draft a straight edge by a relative offset (CadQuery `Workplane.line`).\n * @param wp - Workplane\n * @param xDist - x offset from the current point\n * @param yDist - y offset from the current point\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function line(wp: Workplane, xDist: number, yDist: number, forConstruction: boolean = false): Workplane {\n const p = currentLocalPoint(wp)\n return draftEdge(wp, [p[0] + xDist, p[1] + yDist], forConstruction)\n}\n\n/**\n * vLine — vertical (local +Y) relative line (CadQuery `Workplane.vLine`).\n *\n * @param wp - Workplane\n * @param distance - signed length along local +Y\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function vLine(wp: Workplane, distance: number, forConstruction: boolean = false): Workplane {\n return line(wp, 0, distance, forConstruction)\n}\n\n/**\n * hLine — horizontal (local +X) relative line (CadQuery `Workplane.hLine`).\n *\n * @param wp - Workplane\n * @param distance - signed length along local +X\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function hLine(wp: Workplane, distance: number, forConstruction: boolean = false): Workplane {\n return line(wp, distance, 0, forConstruction)\n}\n\n/**\n * vLineTo — vertical line to an absolute local y (CadQuery `Workplane.vLineTo`).\n *\n * @param wp - Workplane\n * @param yCoord - absolute local y to end at\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function vLineTo(wp: Workplane, yCoord: number, forConstruction: boolean = false): Workplane {\n return lineTo(wp, currentLocalPoint(wp)[0], yCoord, forConstruction)\n}\n\n/**\n * hLineTo — horizontal line to an absolute local x (CadQuery `Workplane.hLineTo`).\n *\n * @param wp - Workplane\n * @param xCoord - absolute local x to end at\n * @param forConstruction - edge is reference geometry only (default false)\n * @returns Workplane\n */\nexport function hLineTo(wp: Workplane, xCoord: number, forConstruction: boolean = false): Workplane {\n return lineTo(wp, xCoord, currentLocalPoint(wp)[1], forConstruction)\n}\n\n/**\n * polyline — draft a chain of edges through the given local points\n * (CadQuery `Workplane.polyline`).\n *\n * `includeCurrent=false` (upstream default) treats the FIRST point as an\n * implicit moveTo and only draws from it onward.\n *\n * @param wp - Workplane\n * @param pts - local 2D points\n * @param forConstruction - edges are reference geometry only (default false)\n * @param includeCurrent - start from the current point (default false)\n * @returns Workplane\n */\nexport function polyline(\n wp: Workplane,\n pts: [number, number][],\n forConstruction: boolean = false,\n includeCurrent: boolean = false,\n): Workplane {\n if (!Array.isArray(pts) || pts.length === 0) return wp\n let cur = wp\n if (includeCurrent) {\n for (const p of pts) cur = draftEdge(cur, [p[0], p[1]], forConstruction)\n return cur\n }\n // Upstream: startPoint = pts[0] (no edge drawn), then edges to pts[1:].\n cur = clone(cur, { currentPoint: [pts[0][0], pts[0][1]] as [number, number] })\n for (const p of pts.slice(1)) cur = draftEdge(cur, [p[0], p[1]], forConstruction)\n return cur\n}\n\n/**\n * wire — combine all pending edges into one pending wire\n * (CadQuery `Workplane.wire`). No-op when there are no free edges (upstream\n * returns self unchanged in that case).\n *\n * @param wp - Workplane\n * @param forConstruction - keep the wire out of the solid profile (default false)\n * @returns Workplane\n */\nexport function wire(wp: Workplane, forConstruction: boolean = false): Workplane {\n const edges = wp.pendingEdges ?? []\n if (edges.length === 0) return wp\n const pts: [number, number][] = []\n for (const e of edges) {\n if (pts.length === 0) pts.push([e.from[0], e.from[1]])\n pts.push([e.to[0], e.to[1]])\n }\n // close() may already have appended the segment back to the first point;\n // drop the duplicated vertex so the ring has no zero-length edge.\n if (pts.length > 1) {\n const a = pts[0]\n const b = pts[pts.length - 1]\n if (Math.hypot(a[0] - b[0], a[1] - b[1]) < 1e-9) pts.pop()\n }\n const w: PendingWire = {\n kind: 'path',\n pts,\n // Full edge descriptors (incl. arc3/tangentArc/spline) so wire assembly\n // rebuilds the exact curves; pts is the vertex ring used for bbox only.\n edges: edges.map((e) => ({ ...e })),\n construction: forConstruction,\n plane: planeOf(wp),\n }\n return clone(wp, {\n pendingEdges: [],\n pendingWires: forConstruction ? wp.pendingWires : [...(wp.pendingWires ?? []), w],\n })\n}\n\n/**\n * close — end drafting and build a closed wire (CadQuery `Workplane.close`).\n * Appends the closing segment when the end point is more than 1e-6 away from\n * the first point (upstream threshold), then delegates to `wire()`.\n *\n * @param wp - Workplane\n * @returns Workplane\n */\nexport function close(wp: Workplane): Workplane {\n const end = currentLocalPoint(wp)\n const start = wp.firstPoint\n if (!start) {\n throw new Error('[cq-compat] close: No start point specified - cannot close')\n }\n let cur = wp\n if (Math.hypot(end[0] - start[0], end[1] - start[1]) > 1e-6) {\n cur = draftEdge(cur, [start[0], start[1]], false)\n }\n cur = clone(cur, { firstPoint: undefined })\n return wire(cur)\n}\n\n/**\n * Reorder edge descriptors so the kernel's sequential wire builder accepts all\n * of them. `makeWire` adds edges one by one and silently DROPS an edge when it\n * connects to neither open end of the wire built so far — upstream CadQuery\n * 2.8 avoids this via the MakeWire list-Add overload (BRepBuilderAPI_MakeWire\n * with TopTools_ListOfShape), which keeps even disconnected edges. We can't\n * reach that overload from the wasm surface, but when the edge set forms a\n * single (possibly gappy) chain there is an ordering in which every edge\n * attaches to an open end when added (e.g. [line,line,spline,line] ->\n * [spline,closing,line,line]); find it with DFS over shared endpoints. The\n * kernel auto-orients reversed edges, so no descriptor reversal is needed.\n * Returns the input order unchanged when no full chain exists (multi-run gap —\n * the kernel then drops the stray run exactly as before).\n */\nfunction reorderForWireAssembly(edges: PendingEdge[]): PendingEdge[] {\n const n = edges.length\n if (n < 3) return edges\n const key = (p: [number, number]) =>\n `${Math.round(p[0] * 1e6) / 1e6},${Math.round(p[1] * 1e6) / 1e6}`\n const ends = edges.map((e) => [key(e.from), key(e.to)] as const)\n const used = new Array<boolean>(n).fill(false)\n const order: number[] = []\n const dfs = (tailKey: string): boolean => {\n if (order.length === n) return true\n for (let j = 0; j < n; j++) {\n if (used[j]) continue\n if (ends[j][0] !== tailKey && ends[j][1] !== tailKey) continue\n used[j] = true\n order.push(j)\n if (dfs(ends[j][0] === tailKey ? ends[j][1] : ends[j][0])) return true\n used[j] = false\n order.pop()\n }\n return false\n }\n for (let s = 0; s < n; s++) {\n order.length = 0\n used.fill(false)\n used[s] = true\n order.push(s)\n if (dfs(ends[s][1])) return order.map((i) => edges[i])\n }\n return edges\n}\n\n/** Build a brepjs wire for a pending 2D profile, in world coordinates. */\nasync function buildProfileWire(wp: Workplane, w: PendingWire): Promise<unknown> {\n // Use the wire's own creation-plane snapshot when present (loft sections can\n // live on different planes after intermediate workplane()/transformed calls).\n const pl = w.plane ?? {\n origin: wp.origin,\n xDir: wp.xDir,\n yDir: wp.yDir,\n normal: wp.normal,\n }\n const n = Array.isArray(pl.normal) ? pl.normal : ([0, 0, 1] as [number, number, number])\n if (w.kind === 'circle') {\n const center = localToWorld(pl, w.cx, w.cy)\n const edge = unwrapBrepResult(compatFn('makeCircle')(w.radius, center, n))\n return unwrapBrepResult(compatFn('assembleWire')([edge]))\n }\n if (w.kind === 'ellipse') {\n const center = localToWorld(pl, w.cx, w.cy)\n if (w.flip) {\n // \"Tall\" ellipse (y_radius > x_radius) — NOT reproducible today.\n //\n // The kernel lays the major axis on the GLOBAL X direction, ignores the\n // plane's own axes, and rejects major < minor (\"gp_Elips: invalid\n // construction parameters\"), so the only way to a tall ellipse is to\n // rotate a wide one. Every rotation path available re-approximates the\n // curve: `applyMatrix`/`generalTransformWithHistory` drifts 0.4% in\n // volume (testEdgeTypesFilter), and the plain `transform` / `rotate`\n // kernel entries produce a wire `makeFace` then rejects as non-planar.\n // Failing loudly instead of silently emitting an approximated ellipse.\n throw new Error(\n '[cq-compat] ellipse: y_radius > x_radius is not reproducible (kernel ellipse is always major-on-X and rotations re-approximate it)',\n )\n }\n const edge = unwrapBrepResult(compatFn('makeEllipseEdge')(w.majorRadius, w.minorRadius, center, n))\n return unwrapBrepResult(compatFn('assembleWire')([edge]))\n }\n if (w.kind === 'path') {\n // Drafted ring. When edge descriptors are present (arcs/splines), rebuild\n // the exact curves; otherwise consecutive ring points are line edges, with\n // the last one closing back to the first. Zero-length segments (a close()\n // that landed exactly on the start point) are skipped — OCCT rejects them\n // in a wire.\n const edges: unknown[] = []\n if (w.edges && w.edges.length > 0) {\n // Drop zero-length segments (a close() that landed exactly on the start\n // point — OCCT rejects them in a wire), then reorder so the sequential\n // makeWire builder keeps every edge (see reorderForWireAssembly).\n const descs = reorderForWireAssembly(\n w.edges.filter(\n (e) => e.kind !== 'line' || Math.hypot(e.to[0] - e.from[0], e.to[1] - e.from[1]) >= 1e-9,\n ),\n )\n for (const e of descs) {\n if (e.kind === 'line') {\n edges.push(\n unwrapBrepResult(compatFn('makeLine')(localToWorld(pl, e.from[0], e.from[1]), localToWorld(pl, e.to[0], e.to[1]))),\n )\n } else if (e.kind === 'arc3') {\n edges.push(\n compatFn('makeThreePointArc')(\n localToWorld(pl, e.from[0], e.from[1]),\n localToWorld(pl, e.mid[0], e.mid[1]),\n localToWorld(pl, e.to[0], e.to[1]),\n ),\n )\n } else if (e.kind === 'tangentArc') {\n const tLen = Math.hypot(e.tgt[0], e.tgt[1])\n const t: [number, number, number] = [\n (pl.xDir[0] * e.tgt[0] + pl.yDir[0] * e.tgt[1]) / tLen,\n (pl.xDir[1] * e.tgt[0] + pl.yDir[1] * e.tgt[1]) / tLen,\n (pl.xDir[2] * e.tgt[0] + pl.yDir[2] * e.tgt[1]) / tLen,\n ]\n edges.push(\n compatFn('makeTangentArc')(\n localToWorld(pl, e.from[0], e.from[1]),\n t,\n localToWorld(pl, e.to[0], e.to[1]),\n ),\n )\n } else if (e.builtEdge) {\n // Reuse the edge built at op time (strongly held — see spline()).\n edges.push(e.builtEdge)\n } else {\n // spline\n const world = e.pts.map(([x, y]) => localToWorld(pl, x, y))\n edges.push(unwrapBrepResult(compatFn('makeBSplineInterpolation')(world, { periodic: false })))\n }\n }\n } else {\n for (let i = 0; i < w.pts.length; i++) {\n const a = w.pts[i]\n const b = w.pts[(i + 1) % w.pts.length]\n if (Math.hypot(a[0] - b[0], a[1] - b[1]) < 1e-9) continue\n edges.push(\n unwrapBrepResult(compatFn('makeLine')(localToWorld(pl, a[0], a[1]), localToWorld(pl, b[0], b[1]))),\n )\n }\n }\n if (edges.length === 0) throw new Error('[cq-compat] buildProfileWire: degenerate path wire')\n return unwrapBrepResult(compatFn('assembleWire')(edges))\n }\n const ring: [number, number][] =\n w.kind === 'rect'\n ? [\n [w.cx - w.w / 2, w.cy - w.d / 2],\n [w.cx + w.w / 2, w.cy - w.d / 2],\n [w.cx + w.w / 2, w.cy + w.d / 2],\n [w.cx - w.w / 2, w.cy + w.d / 2],\n ]\n : Array.from({ length: w.n }, (_, i) => {\n const a = (2 * Math.PI * i) / w.n\n return [\n w.cx + Math.cos(a) * (w.d / 2),\n w.cy + Math.sin(a) * (w.d / 2),\n ] as [number, number]\n })\n const edges: unknown[] = []\n for (let i = 0; i < ring.length; i++) {\n const a = ring[i]\n const b = ring[(i + 1) % ring.length]\n edges.push(unwrapBrepResult(compatFn('makeLine')(localToWorld(pl, a[0], a[1]), localToWorld(pl, b[0], b[1]))))\n }\n return unwrapBrepResult(compatFn('assembleWire')(edges))\n}\n\n/**\n * Extrude the pending wire LIST: one face per outermost wire, enclosed wires\n * punched as holes, all faces extruded by `height` along the workplane normal\n * and unioned. Only used when more than one solid wire is pending — the\n * single-wire case keeps the legacy prism path (zero regression risk).\n */\n/** Rebuild a pending wire translated by `shift` in world space (used to place cut tools). */\nfunction shiftWire(w: PendingWire, wp: Workplane, shift: [number, number, number]): PendingWire {\n const base = w.plane ?? {\n origin: wp.origin,\n xDir: wp.xDir,\n yDir: wp.yDir,\n normal: wp.normal,\n }\n return {\n ...w,\n plane: {\n origin: [base.origin[0] + shift[0], base.origin[1] + shift[1], base.origin[2] + shift[2]],\n xDir: base.xDir,\n yDir: base.yDir,\n normal: base.normal,\n },\n } as PendingWire\n}\n\nasync function pendingPathPrism(\n wp: Workplane,\n vec: [number, number, number],\n shift?: [number, number, number],\n): Promise<Shape> {\n const all = (wp.pendingWires ?? []).filter((w) => !w.construction)\n const groups = groupPendingWires(all)\n let result: Shape | null = null\n for (const g of groups) {\n const outer = await buildProfileWire(wp, shift ? shiftWire(g.outer, wp, shift) : g.outer)\n const holeWires: unknown[] = []\n for (const h of g.holes) {\n holeWires.push(await buildProfileWire(wp, shift ? shiftWire(h, wp, shift) : h))\n }\n const face = unwrapBrepResult(compatFn('makeFace')(outer, holeWires))\n const prism = unwrapBrepResult(compatFn('extrude')(face, vec))\n const solid = adoptBrepjsProduct(prism) as Shape\n result = result ? await fuseShapes(result, solid) : solid\n }\n if (!result) throw new Error('[cq-compat] extrude: no pending wire to extrude')\n return result\n}\n\nasync function extrudePendingWires(wp: Workplane, height: number): Promise<Shape> {\n const dir = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const vec: [number, number, number] = [dir[0] * height, dir[1] * height, dir[2] * height]\n return pendingPathPrism(wp, vec)\n}\n\n/** True when a drafted (moveTo/lineTo/close) wire is pending — legacy paths never use it. */\nfunction hasPathWire(wp: Workplane): boolean {\n return (wp.pendingWires ?? []).some((w) => !w.construction && w.kind === 'path')\n}\n\n/**\n * extrude\n * @param wp - Workplane\n * @param height - number\n * @param combine - true (default): fuse the new solid with the carried shape;\n * false: the carrier holds ONLY the freshly extruded solid (upstream\n * `extrude(..., False)` — verified: testSolidReferenceCombineFalse exports the\n * lone boss, Compound vol 0.03125). The \"cut\"/\"s\" modes are NOT supported yet.\n * @returns Promise<Workplane>\n */\n/** Extract the numeric kernel id from a brepjs shape wrapper (or raw handle). */\nfunction rawShapeId(shapeWrapper: unknown): number {\n const w = (shapeWrapper as { wrapped?: unknown }).wrapped ?? shapeWrapper\n if (w && typeof w === 'object' && (w as { __occtWasm?: boolean }).__occtWasm) {\n return (w as { id: number }).id\n }\n return w as number\n}\n\n/**\n * extrude — CadQuery `Workplane.extrude` parity.\n *\n * Pulls the pending profile wire(s) along the workplane normal by `height`;\n * a negative height extrudes the other way. `taper` (degrees, default 0)\n * narrows the section towards the top and is limited to a single\n * non-construction pending wire.\n *\n * @param wp - Workplane\n * @param height - extrusion distance along the workplane normal\n * @param combine - fuse the result with the carried shape (default true)\n * @param opts - { taper?: number } draft angle in degrees\n * @returns Promise<Workplane>\n */\nexport async function extrude(\n wp: Workplane,\n height: number,\n combine: boolean = true,\n opts?: { taper?: number },\n): Promise<Workplane> {\n const taper = opts?.taper ?? 0\n if (taper !== 0) {\n // Tapered prism via the kernel draftPrism (BRepOffsetAPI_MakeDraft shell\n // equivalent; sign convention verified: positive angle narrows, matching\n // upstream `extrude(taper=20)` top-face < bottom-face).\n const solidWires = (wp.pendingWires ?? []).filter((w) => !w.construction)\n if (solidWires.length !== 1) {\n throw new Error('[cq-compat] extrude: taper requires exactly one pending profile wire')\n }\n const base = wp.shape\n wp = await applyPendingFacePlane(wp)\n const profile = await buildProfileWire(wp, solidWires[0])\n if (taper < 0) {\n // Outward taper: the section GROWS by |h·tan(taper)| per side with ARC\n // joins at convex corners (upstream `extrude(h, taper=-20)` yields a\n // 10-face body: bottom + arc-joined top + 4 planar side faces + 4\n // conical corner faces). The kernel draftPrism produces sharp-corner\n // frusta only (volume overshoots the arc-joined body by ~2%), so the\n // exact body is sewn from its faces.\n return outwardTaperPrism(wp, base, profile, height, taper, combine)\n }\n const face = unwrapBrepResult(compatFn('makeFace')(profile))\n const kernel = getKernel() as unknown as OcctKernel\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const raw = (\n kernel as unknown as {\n draftPrism: (\n face: ShapeHandle,\n dx: number,\n dy: number,\n dz: number,\n angleDeg: number,\n ) => ShapeHandle\n }\n ).draftPrism(\n rawShapeId(face) as unknown as ShapeHandle,\n n[0] * height,\n n[1] * height,\n n[2] * height,\n taper,\n )\n const prism = fromHandle(raw)\n const shape = combine === false || !base ? prism : await fuseShapes(base, prism)\n return clone(wp, {\n shape,\n pendingWires: [],\n pendingPolygon: undefined,\n pendingRect: undefined,\n pendingCircle: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n }\n // CadQuery pendingWires LIST: nested wires form one holed face per outermost\n // wire. Single-wire cases fall through to the legacy prism path unchanged.\n const solidWires = (wp.pendingWires ?? []).filter((w) => !w.construction)\n // A drafted path wire can never take the legacy single-slot path (there is no\n // pendingRect/pendingCircle/pendingPolygon for it), so it always goes through\n // the pendingWires LIST path. Ellipse wires likewise have no legacy slot and\n // are materialized via buildProfileWire. Everything else keeps the old condition.\n if (solidWires.length > 1 || hasPathWire(wp) || solidWires.some((w) => w.kind === 'ellipse')) {\n const base = wp.shape\n wp = await applyPendingFacePlane(wp)\n const prism = await extrudePendingWires(wp, height)\n const shape =\n combine === false || !base ? prism : await fuseShapes(base, prism)\n return clone(wp, {\n shape,\n pendingWires: [],\n pendingPolygon: undefined,\n pendingRect: undefined,\n pendingCircle: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n }\n // If there's a pending 2D profile (rect/circle/polygon) and no existing shape, create the 3D solid\n if (wp.pendingPolygon && !wp.shape) {\n const shape = await makePolygonPrismAt(wp, wp.pendingPolygon, height, wp.normal)\n return clone(wp, { shape, pendingWires: [], pendingPolygon: undefined, faceSel: null, edgeSel: null, vertexSel: null, pts: [] })\n }\n if (wp.pendingRect && !wp.shape) {\n const { w, d } = wp.pendingRect\n const shape = await makeBoxAt(wp, w, d, height)\n return clone(wp, { shape, pendingWires: [], pendingRect: undefined, faceSel: null, edgeSel: null, vertexSel: null, pts: [] })\n }\n if (wp.pendingCircle && !wp.shape) {\n const { radius } = wp.pendingCircle\n const shape = await makeCylinderAt(wp, radius, height)\n return clone(wp, { shape, pendingWires: [], pendingCircle: undefined, faceSel: null, edgeSel: null, vertexSel: null, pts: [] })\n }\n // Boss extrude on existing shape: create profile at each workplane point and union\n if (wp.shape) {\n // A pending faces(sel) lifts the profile plane (CadQuery implicit workplane).\n const base = wp.shape\n wp = await applyPendingFacePlane(wp)\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n // Slight overlap ensures OCCT fuse merges coplanar faces into one solid\n const OVERLAP = 0.1\n // If we have a pending profile on an existing shape, create and union\n if (wp.pendingPolygon || wp.pendingRect || wp.pendingCircle) {\n const points = eachPoints(wp)\n let shape = base\n let separate: Shape | null = null\n for (const [px, py] of points) {\n const bossWp: Workplane = { ...wp, origin: localToWorld(wp, px, py) }\n // combine=false keeps the new solid standalone: no OVERLAP padding (it\n // exists only to make the fuse merge coplanar faces) and no fuse.\n const h = combine === false ? height : height + OVERLAP\n let boss: Shape\n if (wp.pendingPolygon) {\n boss = await makePolygonPrismAt(bossWp, wp.pendingPolygon, h, wp.normal)\n } else if (wp.pendingRect) {\n const { w, d } = wp.pendingRect\n boss = await makeBoxAt(bossWp, w, d, h)\n } else {\n boss = await makeCylinderAt(bossWp, wp.pendingCircle!.radius, h)\n }\n if (combine === false) {\n separate = separate ? await fuseShapes(separate, boss) : boss\n continue\n }\n const shifted = await cad.translate(boss, {\n offset: [-n[0] * OVERLAP, -n[1] * OVERLAP, -n[2] * OVERLAP],\n })\n shape = await fuseShapes(shape, shifted as unknown as Shape)\n // The OVERLAP padding extends the boss BELOW the face plane so the OCCT\n // fuse merges the coplanar contact. When the profile overhangs the base\n // (e.g. a boss centred on a corner, testWorkplaneCenterMove), that\n // padding leaves stray material OUTSIDE the base under the face plane —\n // upstream keeps nothing there. Remove exactly that region:\n // (shifted boss \\ base) ∩ half-space below the face plane.\n // Profiles fully inside the base's cross-section can never overhang,\n // so the cheap bbox test skips the two extra booleans entirely.\n const bossB = compatFn('getBounds')(borrowBrepjsShape(boss)) as Record<string, number>\n const baseB = compatFn('getBounds')(borrowBrepjsShape(base)) as Record<string, number>\n const PAD_EPS = 1e-6\n const axisOf = (v: [number, number, number]): number =>\n Math.abs(v[0]) > 0.5 ? 0 : Math.abs(v[1]) > 0.5 ? 1 : 2\n // In-plane axes = the two axes perpendicular to the face normal.\n const overhangs = [0, 1, 2]\n .filter((i) => i !== axisOf(n))\n .some((i) => {\n const key = ['x', 'y', 'z'] as const\n return (\n bossB[`${key[i]}Min`] < baseB[`${key[i]}Min`] - PAD_EPS ||\n bossB[`${key[i]}Max`] > baseB[`${key[i]}Max`] + PAD_EPS\n )\n })\n if (overhangs) {\n const stray = await cutShapes(shifted as unknown as Shape, base)\n // Slab covering the half-space below the face plane (local z <= 0).\n const o = Array.isArray(wp.origin) ? wp.origin : ([0, 0, 0] as [number, number, number])\n const BIG =\n 2 *\n Math.max(\n baseB.xMax - baseB.xMin,\n baseB.yMax - baseB.yMin,\n baseB.zMax - baseB.zMin,\n bossB.xMax - bossB.xMin,\n bossB.yMax - bossB.yMin,\n bossB.zMax - bossB.zMin,\n ) +\n 10\n const belowWp: Workplane = {\n ...wp,\n origin: [o[0] - n[0] * BIG, o[1] - n[1] * BIG, o[2] - n[2] * BIG],\n }\n const slab = await makeBoxAt(belowWp, BIG, BIG, BIG)\n const strayBelow = await intersectShapes(stray, slab)\n shape = await cutShapes(shape, strayBelow)\n }\n }\n if (combine === false && separate) {\n return clone(wp, {\n shape: separate,\n pendingWires: [],\n pendingPolygon: undefined,\n pendingRect: undefined,\n pendingCircle: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n }\n return clone(wp, {\n shape,\n pendingWires: [],\n pendingPolygon: undefined,\n pendingRect: undefined,\n pendingCircle: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n }\n // No pending profile — return unchanged\n return wp\n }\n // No shape and no pending profile — return unchanged\n return wp\n}\n\n/**\n * outwardTaperPrism — build the exact outward-tapered prism (taper < 0).\n *\n * Upstream CadQuery `extrude(h, taper=-t)` grows the section by\n * `|h·tan(t)|` per side with ARC joins at convex corners: the ref body is\n * 10 faces (bottom + arc-joined top + 4 planar side faces + 4 conical corner\n * faces). The kernel `draftPrism` only produces sharp-corner frusta, whose\n * volume overshoots the arc-joined body (~2% at -20°), so this sews the exact\n * faces instead. Supported for rectilinear (4 straight-edge) profiles on\n * XY-oriented workplanes; anything else fails loudly rather than emitting a\n * wrong-corner body.\n *\n * @param wp - Workplane (post `applyPendingFacePlane`)\n * @param base - carried shape to fuse with (undefined when none)\n * @param profile - pending profile wire (BREP handle or wrapper)\n * @param height - extrusion distance along the workplane normal\n * @param taper - negative draft angle in degrees\n * @param combine - fuse the result with the carried shape (default true)\n * @returns Promise<Workplane>\n */\nasync function outwardTaperPrism(\n wp: Workplane,\n base: Shape | null | undefined,\n profile: unknown,\n height: number,\n taper: number,\n combine: boolean,\n): Promise<Workplane> {\n const kernel = getKernel() as unknown as OcctKernel\n const k = kernel as unknown as {\n makeFace: (wire: ShapeHandle) => ShapeHandle\n offsetWire2D: (wire: ShapeHandle, dist: number, joinType: number) => ShapeHandle\n translate: (s: ShapeHandle, dx: number, dy: number, dz: number) => ShapeHandle\n getSubShapes: (s: ShapeHandle, type: string) => ShapeHandle[]\n makeLineEdge: (a: Vec3, b: Vec3) => ShapeHandle\n makeWire: (edges: ShapeHandle[]) => ShapeHandle\n revolve: (s: ShapeHandle, axis: { point: Vec3; direction: Vec3 }, angle: number) => ShapeHandle\n curveType: (e: ShapeHandle) => string\n curveParameters: (e: ShapeHandle) => { first: number; last: number }\n curvePointAtParam: (e: ShapeHandle, t: number) => Vec3\n sew: (faces: ShapeHandle[], tolerance: number) => ShapeHandle\n makeSolid: (shell: ShapeHandle) => ShapeHandle\n fixFaceOrientations: (s: ShapeHandle) => ShapeHandle\n isSolid: (s: ShapeHandle) => boolean\n getBoundingBox: (s: ShapeHandle) => { xmin: number; ymin: number; zmin: number; xmax: number; ymax: number; zmax: number }\n }\n const raw = rawShapeId(profile) as unknown as ShapeHandle\n const off = Math.abs(height * Math.tan((Math.abs(taper) * Math.PI) / 180))\n if (off < 1e-9) {\n throw new Error('[cq-compat] extrude: outward taper resolves to a zero offset')\n }\n // The sewing construction is XY-oriented; the profile plane is recovered via\n // its own z-extent, so off-plane workplanes still work as long as the profile\n // is axis-aligned. Non-axis-aligned planes are rejected.\n const bb0 = k.getBoundingBox(raw)\n const z0 = bb0.zmin\n if (Math.abs(bb0.zmax - bb0.zmin) > 1e-9) {\n throw new Error('[cq-compat] extrude: outward taper requires a planar profile (got z-extent)')\n }\n // 1. bottom face\n const bottomFace = k.makeFace(raw)\n // 2. top wire: arc-join offset lifted to z0+height\n const topWireRaw = k.translate(k.offsetWire2D(raw, off, 0), 0, 0, z0 + height)\n const topFace = k.makeFace(topWireRaw)\n // 3. classify top edges (straight vs arc) and match to bottom edges\n const bEdges = k.getSubShapes(raw, 'edge')\n const tEdges = k.getSubShapes(topWireRaw, 'edge')\n if (bEdges.length !== 4 || tEdges.length !== 8) {\n throw new Error(\n `[cq-compat] extrude: outward taper supports only 4-sided rectilinear profiles (got ${bEdges.length} bottom / ${tEdges.length} top edges)`,\n )\n }\n const ends = (e: ShapeHandle): { a: Vec3; b: Vec3 } => {\n const { first, last } = k.curveParameters(e)\n return { a: k.curvePointAtParam(e, first), b: k.curvePointAtParam(e, last) }\n }\n const bEnds = bEdges.map(ends)\n const tTypes = tEdges.map((e) => String(k.curveType(e)).toLowerCase())\n const straightIdx = tTypes\n .map((t, i) => (t === 'line' ? i : -1))\n .filter((i) => i >= 0)\n const arcIdx = tTypes\n .map((t, i) => (t === 'line' ? -1 : i))\n .filter((i) => i >= 0)\n if (straightIdx.length !== 4 || arcIdx.length !== 4) {\n throw new Error(\n `[cq-compat] extrude: outward taper top wire misclassified (${straightIdx.length} straight / ${arcIdx.length} arc)`,\n )\n }\n // Match each bottom edge to the parallel straight top edge (arc-join offset\n // preserves edge directions); the bottom edge's end vertex is the corner apex.\n const tEnds = straightIdx.map((i) => ends(tEdges[i]))\n const matches: number[] = new Array(4).fill(-1)\n const eps = 1e-6\n for (let i = 0; i < 4; i++) {\n const d = { x: bEnds[i].b.x - bEnds[i].a.x, y: bEnds[i].b.y - bEnds[i].a.y }\n for (let j = 0; j < 4; j++) {\n if (matches.includes(j)) continue\n const td = { x: tEnds[j].b.x - tEnds[j].a.x, y: tEnds[j].b.y - tEnds[j].a.y }\n const cross = d.x * td.y - d.y * td.x\n const dot = d.x * td.x + d.y * td.y\n if (Math.abs(cross) < eps * Math.max(1, Math.hypot(d.x, d.y) * Math.hypot(td.x, td.y)) && dot > 0) {\n matches[i] = j\n break\n }\n }\n }\n if (matches.some((m) => m < 0)) {\n throw new Error('[cq-compat] extrude: outward taper could not match side edges')\n }\n // 4. sew the 10 faces\n const faces: ShapeHandle[] = [bottomFace, topFace]\n for (let i = 0; i < 4; i++) {\n const bp = bEnds[i]\n const tp = tEnds[matches[i]]\n // side plane: bottom edge + (bottom end -> top end) + REVERSED top edge\n // (top end -> top start) + (top start -> bottom start). Using the kernel\n // top edge's own direction would break the wire's head-to-tail continuity\n // (the previous edge ends at the top END), so the reversed segment is\n // built explicitly — verified against the probe construction.\n faces.push(\n k.makeFace(\n k.makeWire([\n bEdges[i],\n k.makeLineEdge(bp.b, tp.b),\n k.makeLineEdge(tp.b, tp.a),\n k.makeLineEdge(tp.a, bp.a),\n ]),\n ),\n )\n // conical corner face: generatrix (apex = bottom edge end) -> arc edge end, revolved 90°\n const arcE = tEdges[arcIdx[i]]\n const arcEnds = ends(arcE)\n const apex = { x: bp.b.x, y: bp.b.y, z: z0 } as Vec3\n // Generatrix to the arc's DOWNSTREAM end (last param): sweeping +90° about\n // +Z from the downstream direction covers the corner's arc quadrant exactly\n // (verified: `arcStart` here is (100,-off) for corner (100,0), i.e. the -Y\n // side, sweeping -Y -> +X). Using the upstream end would sweep into the\n // wrong quadrant.\n faces.push(\n k.revolve(\n k.makeLineEdge(apex, arcEnds.b),\n { point: apex, direction: { x: 0, y: 0, z: 1 } },\n Math.PI / 2,\n ),\n )\n }\n const shell = k.sew(faces, 1e-2)\n let solid = k.makeSolid(shell)\n const fixed = k.fixFaceOrientations(solid)\n if (k.isSolid(fixed)) solid = fixed\n const prism = fromHandle(solid)\n const shape = combine === false || !base ? prism : await fuseShapes(base, prism)\n return clone(wp, {\n shape,\n pendingWires: [],\n pendingPolygon: undefined,\n pendingRect: undefined,\n pendingCircle: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n}\n\n/**\n * revolve — CadQuery `Workplane.revolve` parity.\n *\n * Consumes the pending wire LIST (same grouping as extrude: one holed face per\n * outermost wire) and revolves each face around an axis. Axis endpoints are\n * LOCAL workplane coordinates (verified against cadquery 2.8.0\n * `Workplane.revolve`): start defaults to the plane origin; when only start is\n * given, end defaults to `(0, start.y)` if `start.y != 0` else `(0, 1)` — i.e.\n * the local +Y direction. Angle 0 is normalized to 360 (OCCT cannot do a\n * 0-degree revolve).\n *\n * @param wp - Workplane\n * @param angleDegrees - revolution angle (default 360)\n * @param axisStart - axis start point in local 2D coords\n * @param axisEnd - axis end point in local 2D coords\n * @param combine - true: fuse with base; \"cut\": subtract from base; false: keep separate\n * @returns Promise<Workplane>\n */\nexport async function revolve(\n wp: Workplane,\n angleDegrees = 360,\n axisStart?: [number, number] | [number, number, number],\n axisEnd?: [number, number] | [number, number, number],\n combine: boolean | 'cut' = true,\n): Promise<Workplane> {\n let angle = ((angleDegrees % 360) + 360) % 360\n if (angle === 0) angle = 360\n\n const sLocal: [number, number] = axisStart ? [axisStart[0], axisStart[1]] : [0, 0]\n const eLocal: [number, number] = axisEnd\n ? [axisEnd[0], axisEnd[1]]\n : sLocal[1] !== 0\n ? [0, sLocal[1]]\n : [0, 1]\n const startW = localToWorld(wp, sLocal[0], sLocal[1])\n const endW = localToWorld(wp, eLocal[0], eLocal[1])\n const axis: [number, number, number] = [endW[0] - startW[0], endW[1] - startW[1], endW[2] - startW[2]]\n const len = Math.hypot(axis[0], axis[1], axis[2])\n if (len === 0) throw new Error('[cq-compat] revolve: axis start and end coincide')\n const dir: [number, number, number] = [axis[0] / len, axis[1] / len, axis[2] / len]\n\n const all = (wp.pendingWires ?? []).filter((w) => !w.construction)\n if (all.length === 0) throw new Error('[cq-compat] revolve: no pending wire to revolve')\n\n wp = await applyPendingFacePlane(wp)\n const rad = (angle * Math.PI) / 180\n let result: Shape | null = null\n for (const g of groupPendingWires(all)) {\n const outer = await buildProfileWire(wp, g.outer)\n const holeWires: unknown[] = []\n for (const h of g.holes) holeWires.push(await buildProfileWire(wp, h))\n const face = unwrapBrepResult(compatFn('makeFace')(outer, holeWires))\n const revolved = unwrapBrepResult(compatFn('revolve')(face, { at: startW, axis: dir, angle: rad }))\n const solid = adoptBrepjsProduct(revolved) as Shape\n result = result ? await fuseShapes(result, solid) : solid\n }\n\n const base = wp.shape\n let shape = result as Shape\n if (combine === 'cut' && base) shape = await cutShapes(base, shape)\n else if (combine === true && base) shape = await fuseShapes(base, shape)\n // combine === false → keep the revolved solid alone\n\n return clone(wp, {\n shape,\n pendingWires: [],\n pendingPolygon: undefined,\n pendingRect: undefined,\n pendingCircle: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n}\n\n/** Options accepted by {@link loft}. */\nexport interface LoftOptions {\n ruled?: boolean\n combine?: boolean | 'cut'\n /** Degenerate start point (upstream `loft(vertex(...), ...)`) — world coordinates. */\n startPoint?: [number, number, number]\n /** Degenerate end point (upstream `loft(..., vertex(...))`) — world coordinates. */\n endPoint?: [number, number, number]\n}\n\n/** True when the carrier holds at least one solid (upstream `findSolid()` gate). */\nfunction hasSolidBase(shape: Shape): boolean {\n try {\n return (brepjsCompat.getSolids(borrowBrepjsShape(shape) as never) as unknown[]).length > 0\n } catch {\n return false\n }\n}\n\n/** Collect loft sections from a workplane: pending wires first, then stacked faces. */\nasync function collectLoftSections(wp: Workplane, sections: unknown[]): Promise<void> {\n const wires = (wp.pendingWires ?? []).filter((w) => !w.construction)\n for (const w of wires) {\n sections.push(await buildProfileWire(wp, w))\n }\n if (wires.length === 0 && wp.shape) {\n // Upstream `Workplane().add(face)...loft()` lofts the stacked faces of\n // wp.shape: each face's outer wire becomes a loft section (holes are\n // intentionally dropped — upstream section extraction is outerWire-only).\n const shapeFaces = compatFn('getFaces')(borrowBrepjsShape(wp.shape)) as unknown[]\n for (const f of shapeFaces) {\n sections.push(compatFn('outerWire')(f))\n }\n }\n}\n\n/**\n * loft — CadQuery `Workplane.loft` parity.\n *\n * Consumes the pending wire LIST as loft sections (each wire built on its own\n * creation-plane snapshot, so intermediate workplane(offset)/transformed moves\n * are honored). Upstream default is a smooth (ruled=False) loft.\n *\n * Additional workplanes may be passed positionally (upstream free-function form\n * `loft(w1, w2, w3)`): each contributes its own pending wires, or — when it\n * carries no pending wire — the outer wires of its stacked faces.\n *\n * @param wp - Workplane\n * @param rest - extra section workplanes, plus at most one options object\n * @returns Promise<Workplane>\n */\nexport async function loft(wp: Workplane, ...rest: (Workplane | LoftOptions)[]): Promise<Workplane> {\n const opts = rest.find((x): x is LoftOptions => !(x as Workplane).__cq)\n const extraWps = rest.filter((x): x is Workplane => (x as Workplane).__cq === true)\n const sections: unknown[] = []\n await collectLoftSections(wp, sections)\n for (const other of extraWps) {\n await collectLoftSections(other, sections)\n }\n if (sections.length === 0 && !opts?.startPoint && !opts?.endPoint) {\n throw new Error('[cq-compat] loft: no pending wire sections')\n }\n\n wp = await applyPendingFacePlane(wp)\n const loftCfg: Record<string, unknown> = { ruled: opts?.ruled ?? false }\n if (opts?.startPoint) loftCfg.startPoint = opts.startPoint\n if (opts?.endPoint) loftCfg.endPoint = opts.endPoint\n const solid = adoptBrepjsProduct(\n unwrapBrepResult(compatFn('loft')(sections, loftCfg)),\n ) as Shape\n\n const base = wp.shape\n let shape = solid\n const combine = opts?.combine ?? true\n if (combine === 'cut' && base) shape = await cutShapes(base, shape)\n else if (combine === true && base && hasSolidBase(base)) shape = await fuseShapes(base, shape)\n // combine === false → keep the loft alone\n // a non-solid carrier (e.g. `Workplane().add(face)`) is left alone too:\n // upstream `Workplane.loft` only fuses when the stack holds a solid\n // (`findSolid()` returns None otherwise — test_loft_face).\n\n return clone(wp, {\n shape,\n pendingWires: [],\n pendingPolygon: undefined,\n pendingRect: undefined,\n pendingCircle: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n}\n\n/**\n * cutBlind\n * @param wp - Workplane\n * @param depth - number\n * @param opts - { w?: number; d?: number; radius?: number }\n * @returns Promise<Workplane>\n */\nexport async function cutBlind(\n wp: Workplane,\n depth: number,\n opts?: { w?: number; d?: number; radius?: number; taper?: number },\n): Promise<Workplane> {\n if (!wp.shape) return wp\n const base = wp.shape\n wp = await applyPendingFacePlane(wp)\n const absDepth = Math.abs(depth)\n const invNormal: [number, number, number] = [-wp.normal[0], -wp.normal[1], -wp.normal[2]]\n let result = base\n if (opts?.taper) {\n // Tapered pocket via kernel draftPrism (same sign convention as extrude:\n // positive angle narrows along the extrusion direction, i.e. the pocket\n // opening is the profile and the bottom is smaller). Verified vs 2.8.0:\n // rect(2,2).extrude(2).faces(\">Z\").workplane().rect(1,1).cutBlind(-1,\n // taper=5) -> vol 7.2.\n const solidWires = (wp.pendingWires ?? []).filter((w) => !w.construction)\n if (solidWires.length !== 1) {\n throw new Error('[cq-compat] cutBlind: taper requires exactly one pending profile wire')\n }\n const profile = await buildProfileWire(wp, solidWires[0])\n const face = unwrapBrepResult(compatFn('makeFace')(profile))\n const kernel = getKernel() as unknown as OcctKernel\n const raw = (\n kernel as unknown as {\n draftPrism: (\n face: ShapeHandle,\n dx: number,\n dy: number,\n dz: number,\n angleDeg: number,\n ) => ShapeHandle\n }\n ).draftPrism(\n rawShapeId(face) as unknown as ShapeHandle,\n invNormal[0] * absDepth,\n invNormal[1] * absDepth,\n invNormal[2] * absDepth,\n opts.taper,\n )\n const tool = fromHandle(raw)\n result = await cutShapes(base, tool)\n return clone(wp, {\n shape: result,\n faceSel: null,\n edgeSel: null,\n pts: [],\n pendingWires: [],\n pendingRect: undefined,\n pendingCircle: undefined,\n pendingPolygon: undefined,\n })\n }\n // CadQuery semantics: pushPoints() before cutBlind() repeats the cut at every\n // point. With no pushed points, the cut happens at the workplane origin.\n const ptsArr = eachPoints(wp)\n for (const [px, py] of ptsArr) {\n const cutWp: Workplane = {\n ...wp,\n origin: localToWorld(wp, px, py),\n normal: invNormal,\n }\n let tool: Shape\n if (hasPathWire(wp)) {\n // Drafted wire (moveTo/lineTo/polyline + close): extrude the profile into\n // the cut tool along the (inverted) workplane normal.\n tool = await pendingPathPrism(wp, [\n invNormal[0] * absDepth,\n invNormal[1] * absDepth,\n invNormal[2] * absDepth,\n ])\n } else if (wp.pendingCircle) {\n tool = await makeCylinderAt(cutWp, wp.pendingCircle.radius, absDepth)\n } else if (wp.pendingRect) {\n tool = await makeBoxAt(cutWp, wp.pendingRect.w, wp.pendingRect.d, absDepth)\n } else if (wp.pendingPolygon) {\n tool = await makePolygonPrismAt(cutWp, wp.pendingPolygon, absDepth, invNormal)\n } else if (opts?.radius !== undefined) {\n tool = await makeCylinderAt(cutWp, opts.radius, absDepth)\n } else if (opts?.w !== undefined && opts?.d !== undefined) {\n tool = await makeBoxAt(cutWp, opts.w, opts.d, absDepth)\n } else {\n tool = await makeBoxAt(cutWp, 1000, 1000, absDepth)\n }\n result = await cutShapes(result, tool)\n }\n return clone(wp, { shape: result, faceSel: null, edgeSel: null, pts: [], pendingWires: [], pendingRect: undefined, pendingCircle: undefined, pendingPolygon: undefined })\n}\n\n/**\n * cutThruAll\n * @param wp - Workplane\n * @returns Promise<Workplane>\n *\n * CadQuery semantics (verified vs cadquery 2.8.0 `Workplane.cutThruAll`):\n * uses the pending 2D profile to cut through ALL material in BOTH normal\n * directions of the workplane. The tool body spans the whole solid along\n * the workplane normal (computed from the shape bounding box), so it is\n * exact for any profile depth.\n */\nexport async function cutThruAll(wp: Workplane): Promise<Workplane> {\n if (!wp.shape) return wp\n const base = wp.shape\n wp = await applyPendingFacePlane(wp)\n if (!wp.pendingCircle && !wp.pendingRect && !wp.pendingPolygon && !hasPathWire(wp)) {\n throw new Error('[cq-compat] cutThruAll requires a pending 2D profile')\n }\n const n = Array.isArray(wp.normal) ? wp.normal : ([0, 0, 1] as [number, number, number])\n const o = Array.isArray(wp.origin) ? wp.origin : ([0, 0, 0] as [number, number, number])\n const bmin = bboxMin(base)\n const bmax = bboxMax(base)\n // Span: farthest bbox corner from the workplane origin along the normal.\n let span = 0\n for (const cx of [bmin[0], bmax[0]]) {\n for (const cy of [bmin[1], bmax[1]]) {\n for (const cz of [bmin[2], bmax[2]]) {\n span = Math.max(span, Math.abs((cx - o[0]) * n[0] + (cy - o[1]) * n[1] + (cz - o[2]) * n[2]))\n }\n }\n }\n const B = span + 1\n // CadQuery semantics: pushPoints() before cutThruAll() repeats the cut at\n // every point (mirrors cutBlind). With no pushed points, one cut at the\n // workplane origin.\n const ptsArr = eachPoints(wp)\n let shape = base\n for (const [px, py] of ptsArr) {\n // Tool base at point - n·B, extending 2B along +n — covers both directions.\n const thruWp: Workplane = { ...wp, origin: vsub(localToWorld(wp, px, py), vscale(n, B)) }\n let tool: Shape\n if (hasPathWire(wp)) {\n // Drafted wire: the tool must span the whole solid along the normal and\n // start B below the workplane — same envelope as the primitive tools.\n // The profile lives on its own creation plane, so the offset goes into\n // the prism base, not into wp.origin.\n tool = await pendingPathPrism(\n wp,\n [n[0] * 2 * B, n[1] * 2 * B, n[2] * 2 * B],\n vscale(n, -B),\n )\n } else if (wp.pendingCircle) {\n tool = await makeCylinderAt(thruWp, wp.pendingCircle.radius, 2 * B)\n } else if (wp.pendingRect) {\n tool = await makeBoxAt(thruWp, wp.pendingRect.w, wp.pendingRect.d, 2 * B)\n } else {\n tool = await makePolygonPrismAt(thruWp, wp.pendingPolygon!, 2 * B, n)\n }\n shape = await cutShapes(shape, tool)\n }\n return clone(wp, { shape, faceSel: null, edgeSel: null, pts: [], pendingWires: [], pendingRect: undefined, pendingCircle: undefined, pendingPolygon: undefined })\n}\n\n/**\n * hole\n * @param wp - Workplane\n * @param diameter - number\n * @param depth - number\n * @returns Promise<Workplane>\n */\nexport async function hole(\n wp: Workplane,\n diameter: number,\n depth?: number,\n): Promise<Workplane> {\n if (!wp.shape) return wp\n const radius = diameter / 2\n const max = await bboxMax(wp.shape)\n const min = await bboxMin(wp.shape)\n // Through-hole with margin, measured along the workplane normal.\n const ext: [number, number, number] = [max[0] - min[0], max[1] - min[1], max[2] - min[2]]\n const totalHeight = Math.abs(vdot(ext, wp.normal)) + 4\n const holeHeight = depth ?? totalHeight\n\n const points = eachPoints(wp)\n let result = wp.shape\n\n for (const [px, py] of points) {\n const holeOrigin = localToWorld(wp, px, py)\n const invNormal: [number, number, number] = [-wp.normal[0], -wp.normal[1], -wp.normal[2]]\n const cyl = await makeCylinderAt(\n { ...wp, origin: holeOrigin, normal: invNormal },\n radius,\n holeHeight,\n )\n result = await cutShapes(result, cyl)\n }\n\n return clone(wp, { shape: result, faceSel: null, edgeSel: null, vertexSel: null, pts: [] })\n}\n\n/**\n * cboreHole\n * @param wp - Workplane\n * @param diameter - number\n * @param cboreDiameter - number\n * @param cboreDepth - number\n * @param depth - number | undefined (bore depth; undefined drills through, upstream depth=None)\n * @returns Promise<Workplane>\n */\nexport async function cboreHole(\n wp: Workplane,\n diameter: number,\n cboreDiameter: number,\n cboreDepth: number,\n depth?: number,\n): Promise<Workplane> {\n // hole() consumes and clears wp.pts — snapshot them first so the counterbore\n // lands on every pushed point, not just the origin fallback [0, 0].\n const savedPts = Array.isArray(wp.pts) ? [...wp.pts] : []\n let result = await hole(wp, diameter, depth)\n // Counterbore: larger shallow hole. Upstream (verified vs cadquery 2.8.0\n // Workplane.cboreHole) cuts EXACTLY cboreDepth below the workplane — the old\n // \"+1 safety margin\" over-cut every counterbore by 1 mm (parity harness,\n // testCounterBores__c2).\n if (result.shape) {\n const cboreRadius = cboreDiameter / 2\n const points = savedPts.length > 0 ? savedPts : ([[0, 0]] as [number, number][])\n let shape = result.shape\n for (const [px, py] of points) {\n const origin = localToWorld(result, px, py)\n const invNormal: [number, number, number] = [-result.normal[0], -result.normal[1], -result.normal[2]]\n const cyl = await makeCylinderAt({ ...result, origin, normal: invNormal }, cboreRadius, cboreDepth)\n shape = await cutShapes(shape, cyl)\n }\n result = clone(result, { shape })\n }\n return clone(result, { pts: [] })\n}\n\n/**\n * cskHole\n * @param wp - Workplane\n * @param diameter - number\n * @param cskDiameter - number\n * @param cskAngle - number\n * @returns Promise<Workplane>\n */\nexport async function cskHole(\n wp: Workplane,\n diameter: number,\n cskDiameter: number,\n cskAngle: number,\n): Promise<Workplane> {\n // hole() consumes and clears wp.pts — snapshot them first (same as cboreHole).\n const savedPts = Array.isArray(wp.pts) ? [...wp.pts] : []\n let result = await hole(wp, diameter)\n if (result.shape) {\n const cskRadius = cskDiameter / 2\n // CadQuery cskHole: full cone from cskRadius at the surface to an apex,\n // depth h = cskRadius / tan(cskAngle/2).\n const cskDepth = cskRadius / Math.tan((cskAngle * Math.PI) / 360)\n const points = savedPts.length > 0 ? savedPts : ([[0, 0]] as [number, number][])\n let shape = result.shape\n for (const [px, py] of points) {\n const origin = localToWorld(result, px, py)\n const invNormal: [number, number, number] = [-result.normal[0], -result.normal[1], -result.normal[2]]\n const cone = await makeConeAt({ ...result, origin }, cskRadius, cskDepth, invNormal)\n shape = await cutShapes(shape, cone)\n }\n result = clone(result, { shape })\n }\n return clone(result, { pts: [] })\n}\n\n/**\n * threadedHole\n * @param wp - Workplane\n * @param diameterOrFastener - number | unknown\n * @param depth - number\n * @returns Promise<Workplane>\n */\nexport async function threadedHole(\n wp: Workplane,\n diameterOrFastener: number | unknown,\n depth?: number,\n): Promise<Workplane> {\n const diameter = typeof diameterOrFastener === 'number' ? diameterOrFastener : 5\n return hole(wp, diameter, depth)\n}\n\n/**\n * faces\n * @param wp - Workplane\n * @param sel - string\n * @returns Workplane\n */\n// ── Phase 3: siblings(CadQuery Shape.siblings 拓扑邻接语义)────────────\n//\n// 语义(对照 cadquery 2.8.0 occ_impl/shapes.py::siblings):\n// siblings(ctx, kind, level) = 从起点实体出发,沿「kind 子实体共享」的拓扑\n// 邻接走 level 步。每一步:当前集合的每个实体 → 其 kind 子实体 → 每个子实体\n// 的 ancestors(inverse 类型,TopExp.MapShapesAndAncestors)→ 去重。\n// kind=Edge → Face 网络(face 的边 → 边所属的面);kind=Vertex → Edge 网络。\n// level 可为 int(单层)或 tuple(各层结果并集,每层独立 exclude)。\n// faijs lineage 是语句级构造历史,与 CQ 拓扑图不同——此处按拓扑邻接实现,\n// 不接 lineage(Phase 3 风险注记的既定决策)。\n\n\n/** 实体 bbox 中心(方向/极值判定)。 */\nfunction handleCenter(kernel: OcctKernel, h: ShapeHandle): [number, number, number] {\n const bb = kernel.getBoundingBox(h)\n return [(bb.xmin + bb.xmax) / 2, (bb.ymin + bb.ymax) / 2, (bb.zmin + bb.zmax) / 2]\n}\n\n/** 实体 bbox 尺寸。 */\nfunction handleExtents(kernel: OcctKernel, h: ShapeHandle): [number, number, number] {\n const bb = kernel.getBoundingBox(h)\n return [bb.xmax - bb.xmin, bb.ymax - bb.ymin, bb.zmax - bb.zmin]\n}\n\nconst SIBLING_AXIS: Record<string, { axis: 0 | 1 | 2; sign: 1 | -1 }> = {\n '>Z': { axis: 2, sign: 1 }, '+Z': { axis: 2, sign: 1 },\n '<Z': { axis: 2, sign: -1 }, '-Z': { axis: 2, sign: -1 },\n '>X': { axis: 0, sign: 1 }, '+X': { axis: 0, sign: 1 },\n '<X': { axis: 0, sign: -1 }, '-X': { axis: 0, sign: -1 },\n '>Y': { axis: 1, sign: 1 }, '+Y': { axis: 1, sign: 1 },\n '<Y': { axis: 1, sign: -1 }, '-Y': { axis: 1, sign: -1 },\n}\n\n/** 字符串选择器 → face handles(起点解析用;语义对齐 resolveFaceSelector)。 */\nfunction selectFaceHandles(kernel: OcctKernel, shapeH: ShapeHandle, sel: string): ShapeHandle[] {\n const s = NAMED_VIEW_TO_AXIS[sel.trim().toLowerCase()] ?? sel\n const baseSel = s.replace(/\\[-?\\d+\\]$/, '')\n const dir = SIBLING_AXIS[baseSel]\n if (!dir) throw new Error(`[cq-compat] siblings: unsupported face selector \"${sel}\"`)\n const faces = kernel.getSubShapes(shapeH, 'face') as unknown as ShapeHandle[]\n const cands = faces.map((h) => ({ h, c: handleCenter(kernel, h), ext: handleExtents(kernel, h) }))\n // 仅垂直于方向的面参与(bbox 沿该轴薄)\n const perp = cands.filter((cd) => cd.ext[dir.axis] <= 0.1)\n if (perp.length === 0) throw new Error(`[cq-compat] siblings: no face perpendicular to \"${sel}\"`)\n const idxMatch = /\\[(-?\\d+)\\]$/.exec(s.trim())\n if (idxMatch) {\n const asc = baseSel[0] === '>' || baseSel[0] === '-'\n const sorted = perp\n .slice()\n .sort((a, b) => (asc ? a.c[dir.axis] - b.c[dir.axis] : b.c[dir.axis] - a.c[dir.axis]))\n let k = parseInt(idxMatch[1], 10)\n k = k < 0 ? sorted.length + k : k\n if (k < 0 || k >= sorted.length) {\n throw new Error(`[cq-compat] siblings: face index ${k} out of range (${sorted.length})`)\n }\n return [sorted[k]!.h]\n }\n // DirectionMinMax:极值单面(并列取面积大者,与 resolveFaceSelector 同规则)\n let best = perp[0]!\n for (const cd of perp) {\n const val = cd.c[dir.axis]\n const bv = best.c[dir.axis]\n if (dir.sign === 1 ? val > bv + 1e-6 : val < bv - 1e-6) best = cd\n else if (Math.abs(val - bv) <= 1e-6 && kernel.getSurfaceArea(cd.h) > kernel.getSurfaceArea(best.h)) best = cd\n }\n return [best.h]\n}\n\n/** 字符串选择器 → edge handles。'>A'/'<A':方向极值(该方向所有极值边);\n * '|A':与轴平行的边(bbox 主导维度为 A)。'[k]' 索引支持。 */\nfunction selectEdgeHandles(kernel: OcctKernel, shapeH: ShapeHandle, sel: string): ShapeHandle[] {\n const s = NAMED_VIEW_TO_AXIS[sel.trim().toLowerCase()] ?? sel\n const baseSel = s.replace(/\\[-?\\d+\\]$/, '')\n const edges = kernel.getSubShapes(shapeH, 'edge') as unknown as ShapeHandle[]\n const idxMatch = /\\[(-?\\d+)\\]$/.exec(s.trim())\n const pickIdx = (list: ShapeHandle[]): ShapeHandle[] => {\n if (!idxMatch) return list\n let k = parseInt(idxMatch[1], 10)\n k = k < 0 ? list.length + k : k\n if (k < 0 || k >= list.length) {\n throw new Error(`[cq-compat] siblings: edge index ${k} out of range (${list.length})`)\n }\n return [list[k]!]\n }\n if (baseSel[0] === '|') {\n const axis = baseSel[1]\n const ai = axis === 'X' ? 0 : axis === 'Y' ? 1 : 2\n const par = edges.filter((h) => {\n const ext = handleExtents(kernel, h)\n return ext[ai] > 1e-6 && ext[(ai + 1) % 3] < 1e-6 && ext[(ai + 2) % 3] < 1e-6\n })\n return pickIdx(par)\n }\n const dir = SIBLING_AXIS[baseSel]\n if (!dir) throw new Error(`[cq-compat] siblings: unsupported edge selector \"${sel}\"`)\n const pts = edges.map((h) => ({ h, c: handleCenter(kernel, h) }))\n const best = dir.sign === 1\n ? Math.max(...pts.map((p) => p.c[dir.axis]))\n : Math.min(...pts.map((p) => p.c[dir.axis]))\n const extreme = pts.filter((p) => Math.abs(p.c[dir.axis] - best) < 1e-6).map((p) => p.h)\n return pickIdx(extreme)\n}\n\n/** 一步拓扑邻接:h 的 kind 子实体 → 每个子实体的 ancestors(inverse 类型)。\n * O(n×m):ctx 实体数量级小(box 6 面 12 边 8 顶点),不做索引缓存。 */\nfunction siblingStep(\n kernel: OcctKernel,\n ctxH: ShapeHandle,\n h: number,\n kindLower: 'edge' | 'vertex' | 'face',\n invLower: 'face' | 'edge' | 'vertex',\n): number[] {\n const children = kernel.getSubShapes(h as unknown as ShapeHandle, kindLower) as unknown as number[]\n const invs = kernel.getSubShapes(ctxH, invLower) as unknown as number[]\n const out = new Set<number>()\n for (const child of children) {\n for (const inv of invs) {\n const invChildren = kernel.getSubShapes(inv as unknown as ShapeHandle, kindLower) as unknown as number[]\n // GOTCHA(Phase 3 实测,cadquery 2.8.0 拓扑语义):OCCT 中共享边/顶点\n // 是「同一 TShape 不同 TopoDS 句柄」——两个 face 各自枚举出的共享边\n // handle id 不同(location/表层封装差异),=== 匹配恒 false。CQ 的\n // MapShapesAndAncestors 用 IsSame 判拓扑相等,此处必须用 kernel.isSame。\n for (const ic of invChildren) {\n if (kernel.isSame(ic as never, child as never)) {\n out.add(inv)\n break\n }\n }\n }\n }\n return [...out]\n}\n\n/** 解析 siblings 起点实体:Workplane 的 faceSel/edgeSel 优先,否则 shape 本身。 */\nfunction resolveSiblingStarts(\n kernel: OcctKernel,\n ctxH: ShapeHandle,\n start: Shape | Workplane,\n): number[] {\n const wp = start as Workplane\n if (wp && (wp as { __cq?: boolean }).__cq === true) {\n if (wp.faceSel) return selectFaceHandles(kernel, ctxH, wp.faceSel).map((h) => h as number)\n if (wp.edgeSel) return selectEdgeHandles(kernel, ctxH, wp.edgeSel).map((h) => h as number)\n const sh = wp.shape ? (brepOf(asBrepShape(wp.shape)) as ShapeHandle | undefined) : undefined\n return sh ? [sh as number] : []\n }\n const sh = brepOf(asBrepShape(start as Shape)) as ShapeHandle | undefined\n return sh ? [sh as number] : []\n}\n\n/**\n * siblings — CadQuery Shape.siblings:拓扑邻接选择(Phase 3)。\n * @param start - 起点(Workplane 带 faceSel/edgeSel,或 Shape)。\n * @param ctxShape - 邻接搜索的容器 shape(CadQuery 的 ctx)。\n * @param kind - 链接实体类型:'Edge'(返回面网络)| 'Vertex'(返回边网络)| 'Face'。\n * @param level - 拓扑距离:int 或 int 数组(各层并集,每层独立排除)。\n * @returns Promise<Workplane> 选中的实体集合(shape = 实体 compound;空集返回空 compound)。\n */\nexport async function siblings(\n start: Shape | Workplane,\n ctxShape: Shape | Workplane,\n kind: 'Edge' | 'Vertex' | 'Face',\n level: number | number[],\n): Promise<Workplane> {\n const kernel = getKernel() as unknown as OcctKernel\n const ctx = asBrepShape(resolveInputShape(ctxShape))\n const ctxH = brepOf(ctx) as ShapeHandle | undefined\n if (!ctxH) throw new Error('[cq-compat] siblings: ctx shape has no BREP handle')\n const kindLower = kind.toLowerCase() as 'edge' | 'vertex' | 'face'\n const startEnts = resolveSiblingStarts(kernel, ctxH, start)\n if (startEnts.length === 0) {\n throw new Error('[cq-compat] siblings: no starting entity resolvable')\n }\n // CQ:Ancestor = shapetype(self),输出类型随起点实体动态变化。起点经\n // getShapeType 判定;compound/其他类型兜底 'face'(Shape.siblings 的\n // self 在 test_* 中为 face/edge,compound 起点无合法 Ancestor 语义)。\n const startType = kernel.getShapeType(startEnts[0] as never)\n const invLower: 'face' | 'edge' | 'vertex' =\n startType === 'edge' || startType === 'vertex' ? startType : 'face'\n const levels = (Array.isArray(level) ? level : [level])\n .map(Number)\n .filter((l) => Number.isFinite(l) && l >= 1)\n // GOTCHA(Phase 3 实测):occt-wasm 的 getSubShapes 每次调用为同一拓扑\n // 实体分配新的 handle id(f1=[2..7], f2=[8..13]),id 相等性不能表达\n // 拓扑相等。所有去重/排除判断一律用 kernel.isSame(同 CQ 的\n // MapShapesAndAncestors IsSame 语义)。\n const isSameHandle = (a: number, b: number): boolean => kernel.isSame(a as never, b as never)\n const inList = (list: number[], h: number): boolean => list.some((x) => isSameHandle(x, h))\n const out: number[] = []\n for (const lvl of levels) {\n // CQ 的 exclude 语义(occ_impl/shapes.py::siblings):闭包累积,每层递归\n // 开始时把「上一层结果」整体加入 exclude;层内所有实体共享同一 exclude,\n // 不会因遍历顺序提前放行同层邻居(否则 4 侧面环会把 A2/A3 漏进 level 2)。\n const visited: number[] = [...startEnts]\n let frontier = startEnts\n for (let i = 0; i < lvl; i++) {\n const next: number[] = []\n for (const h of frontier) {\n for (const n of siblingStep(kernel, ctxH, h, kindLower, invLower)) {\n if (!inList(visited, n)) next.push(n)\n }\n }\n for (const n of next) if (!inList(visited, n)) visited.push(n)\n if (next.length === 0) break\n frontier = next\n }\n for (const h of frontier) if (!inList(startEnts, h)) out.push(h)\n }\n const uniq: number[] = []\n for (const h of out) if (!uniq.some((x) => isSameHandle(x, h))) uniq.push(h)\n const compound =\n uniq.length === 0 ? await cad.compound({ members: [] }) : await cad.compound({ members: uniq.map((h) => fromHandle(h as unknown as ShapeHandle)) })\n return clone(makeWorkplane('XY'), { shape: compound })\n}\n\n/**\n * faces\n * @param wp - Workplane\n * @param sel - string\n * @returns Workplane\n */\nexport function faces(wp: Workplane, sel: string): Workplane {\n return clone(wp, { faceSel: sel, edgeSel: null, vertexSel: null })\n}\n\n/**\n * tag — CadQuery Workplane.tag(name) parity (dataflow carrier).\n *\n * Upstream records the current workplane state (origin/xDir/normal + current\n * objects) under a name so a later workplaneFromTagged can jump back to it.\n * The faijs carrier keeps a snapshot of the plane frame and the carried\n * shape; the tagged objects stay the current shape's sub-shapes.\n *\n * @param wp - Workplane to mark\n * @param name - Tag name\n * @returns Workplane carrying the tag snapshot\n */\nexport function tag(wp: Workplane, name: string): Workplane {\n return clone(wp, {\n tags: {\n ...(wp.tags ?? {}),\n [name]: { origin: wp.origin, xDir: wp.xDir, normal: wp.normal, shape: wp.shape },\n },\n })\n}\n\n/**\n * workplaneFromTagged — CadQuery Workplane.workplaneFromTagged(name) parity.\n *\n * Restores the workplane frame (origin/xDir/normal) and carried shape captured\n * by an earlier \tag(name). Points/selectors are reset (upstream jumps back\n * to the tagged plane with an empty stack).\n *\n * @param wp - Workplane carrying the tags\n * @param name - Tag name to restore\n * @returns Workplane restored to the tagged plane\n */\nexport function workplaneFromTagged(wp: Workplane, name: string): Workplane {\n const saved = wp.tags?.[name]\n if (!saved) throw new Error('workplaneFromTagged: tag ' + name + ' not found')\n // Upstream Workplane.workplaneFromTagged calls _fromPlane, which keeps\n // the CURRENT objects (carried shape) and only swaps the plane frame\n // (origin/xDir/normal). Restoring the saved shape would drop any solids\n // built since the tag (verified vs cadquery 2.8.0 testWorkplaneFromTagged).\n return clone(wp, {\n origin: saved.origin,\n xDir: saved.xDir,\n normal: saved.normal,\n pts: [],\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n })\n}\n\n/**\n * edges\n * @param wp - Workplane\n * @param sel - string | { slice?: [number, number]; index?: number }\n * @returns Workplane\n */\nexport function edges(\n wp: Workplane,\n sel?: string | { slice?: [number, number]; index?: number },\n): Workplane {\n let pts = wp.edgePts ?? (Array.isArray(wp.pts) ? wp.pts : [])\n if (sel && typeof sel === 'object') {\n if (sel.slice) {\n const [start, end] = sel.slice\n pts = pts.slice(start === undefined ? 0 : start, end === undefined ? pts.length : end)\n } else if (sel.index !== undefined) {\n const idx = sel.index < 0 ? pts.length + sel.index : sel.index\n pts = [pts[idx]]\n }\n }\n return clone(wp, { edgeSel: typeof sel === 'string' ? sel : '', faceSel: null, vertexSel: null, pts: [...pts] })\n}\n\n/**\n * vertices\n * @param wp - Workplane\n * @param sel - string | { slice?: [number, number]; index?: number }\n * @returns Workplane\n */\nexport function vertices(\n wp: Workplane,\n sel?: string | { slice?: [number, number]; index?: number },\n): Workplane {\n let pts = Array.isArray(wp.pts) ? wp.pts : []\n if (sel && typeof sel === 'object') {\n if (sel.slice) {\n const [start, end] = sel.slice\n pts = pts.slice(start === undefined ? 0 : start, end === undefined ? pts.length : end)\n } else if (sel.index !== undefined) {\n const idx = sel.index < 0 ? pts.length + sel.index : sel.index\n pts = [pts[idx]]\n }\n }\n return clone(wp, { vertexSel: typeof sel === 'string' ? sel : '', faceSel: null, edgeSel: null, pts: [...pts] })\n}\n\n/**\n * solids — CadQuery `Workplane.solids(selector)` parity (selector forms not\n * supported; bare `solids()` only).\n *\n * Upstream returns a new Workplane whose stack holds each solid of the current\n * compound as a separate object, so `val()` is the FIRST solid (verified vs\n * cadquery 2.8.0: test_map_apply_filter_sort w.val() = vol 1.0 solid). The\n * cq-compat carrier keeps a single `.shape`, so `solids()` mirrors the\n * observable contract: the carrier shape becomes the first solid of the\n * compound (a single-solid shape passes through unchanged).\n *\n * @param wp - Workplane\n * @returns Workplane whose carried shape is the compound's first solid\n */\nexport function solids(wp: Workplane): Workplane {\n if (!wp.shape) return wp\n const handle = brepOf(wp.shape)\n if (handle === undefined) return wp\n const kernel = getKernel() as unknown as OcctKernel\n const sub = kernel.getSubShapes(handle as unknown as ShapeHandle, 'solid') as unknown as ShapeHandle[]\n if (sub.length === 0) return wp\n // Adopt the first solid into faijs ownership; release the rest (raw kernel\n // getSubShapes copies each sub-shape into its own arena slot — same contract\n // the kernel's own makeWireFromMixed wrapper honors).\n for (let i = 1; i < sub.length; i++) kernel.release(sub[i])\n return clone(wp, { shape: fromHandle(sub[0]) })\n}\n\n/**\n * workplane\n * @param wp - Workplane\n * @param opts - { centerOption?: string; offset?: number }\n * @returns Promise<Workplane>\n */\nexport async function workplane(\n wp: Workplane,\n opts?: { centerOption?: string; offset?: number; invert?: boolean },\n): Promise<Workplane> {\n // Upstream (cadquery 2.8.0 Workplane.workplane): invert flips the plane\n // normal (Plane.invert keeps xDir, flips zDir, yDir = zDir × xDir flips\n // accordingly); the offset is then applied along the (possibly inverted)\n // normal.\n const invert = opts?.invert === true\n const flip = (n: [number, number, number]): [number, number, number] => [\n -n[0],\n -n[1],\n -n[2],\n ]\n if (!wp.shape || !wp.faceSel) {\n // No face selected — just apply offset\n const normal = invert ? flip(wp.normal) : wp.normal\n if (opts?.offset) {\n const offset = vscale(normal, opts.offset)\n return clone(wp, { origin: vadd(wp.origin, offset), faceSel: null })\n }\n if (invert) {\n const yDir: [number, number, number] = [\n normal[1] * wp.xDir[2] - normal[2] * wp.xDir[1],\n normal[2] * wp.xDir[0] - normal[0] * wp.xDir[2],\n normal[0] * wp.xDir[1] - normal[1] * wp.xDir[0],\n ]\n return clone(wp, { normal, yDir, faceSel: null })\n }\n return clone(wp, { faceSel: null })\n }\n\n const { center, normal: faceNormal } = await resolveFaceSelector(wp.shape, wp.faceSel, opts?.centerOption)\n // CadQuery default centerOption is \"ProjectedOrigin\": project the current\n // origin onto the face plane. \"CenterOfBoundBox\"/\"CenterOfMass\" keep the\n // face centroid returned by resolveFaceSelector.\n let newOrigin: [number, number, number]\n if (opts?.centerOption && opts.centerOption !== 'ProjectedOrigin') {\n newOrigin = center\n } else {\n const t = vdot(vsub(center, wp.origin), faceNormal)\n newOrigin = vadd(wp.origin, vscale(faceNormal, t))\n }\n const normal = invert ? flip(faceNormal) : faceNormal\n if (opts?.offset) {\n newOrigin = vadd(newOrigin, vscale(normal, opts.offset))\n }\n // Upstream Workplane.workplane `_computeXdir`: xDir = (0,0,1)×normal, or\n // (1,0,0) when the face is parallel with the XY plane (degenerate cross);\n // then yDir = normal×xDir. Verified to reproduce FACE_AXES for all six axis\n // normals while also supporting arbitrary (e.g. faces(\"+XY\") diagonal) ones.\n let xDir: [number, number, number] = [1, 0, 0]\n const crLen = Math.hypot(normal[1], normal[0])\n if (crLen > 1e-9) {\n xDir = [-normal[1] / crLen, normal[0] / crLen, 0]\n }\n const yDir: [number, number, number] = [\n normal[1] * xDir[2] - normal[2] * xDir[1],\n normal[2] * xDir[0] - normal[0] * xDir[2],\n normal[0] * xDir[1] - normal[1] * xDir[0],\n ]\n return clone(wp, {\n origin: newOrigin,\n normal,\n xDir,\n yDir,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n}\n\n/**\n * center\n * @param wp - Workplane\n * @param x - number\n * @param y - number\n * @returns Workplane\n */\nexport function center(wp: Workplane, x: number, y: number): Workplane {\n // CadQuery semantics: offset along the workplane LOCAL x/y axes.\n return clone(wp, { origin: localToWorld(wp, x, y) })\n}\n\n/**\n * pushPoints\n * @param wp - Workplane\n * @param pts - [number, number][]\n * @returns Workplane\n */\nexport function pushPoints(wp: Workplane, pts: [number, number][]): Workplane {\n const existing = Array.isArray(wp.pts) ? wp.pts : []\n return clone(wp, { pts: [...existing, ...pts] })\n}\n\n/**\n * translate\n * @param wp - Workplane\n * @param v - [number, number, number]\n * @returns Promise<Workplane>\n */\nexport async function translate(\n wp: Workplane,\n v: [number, number, number],\n): Promise<Workplane> {\n if (!wp.shape) return clone(wp, { origin: vadd(wp.origin, v) })\n const shape = await cad.translate(resolveInputShape(wp), { offset: v })\n return clone(wp, { shape, origin: vadd(wp.origin, v) })\n}\n\n/**\n * rotate\n * @param wp - Workplane\n * @param axis - [number, number, number]\n * @param angle - number\n * @returns Promise<Workplane>\n */\nexport async function rotate(\n wp: Workplane,\n axis: [number, number, number],\n angle: number,\n): Promise<Workplane> {\n if (!wp.shape) return wp\n const anglesDeg: [number, number, number] = [\n axis[0] * angle,\n axis[1] * angle,\n axis[2] * angle,\n ]\n const shape = await cad.rotate_euler(resolveInputShape(wp), { anglesDeg })\n return clone(wp, { shape })\n}\n\n/**\n * Mirror-plane normals for the string form (upstream `Shape.mirror`,\n * cadquery 2.8.0: both spellings of a plane map to the SAME mirror plane —\n * 'YX' has normal (0,-1,0) but mirrors through the same y=0 plane as 'XZ').\n */\nconst MIRROR_PLANE_NORMALS: Record<string, [number, number, number]> = {\n XY: [0, 0, 1],\n YX: [0, 0, 1],\n XZ: [0, 1, 0],\n ZX: [0, 1, 0],\n YZ: [1, 0, 0],\n ZY: [1, 0, 0],\n}\n\n/**\n * mirror — full upstream `Workplane.mirror` semantics (cadquery 2.8.0, verified\n * against cq.py:1113):\n * - string form: 'XY'..'ZY' named mirror planes\n * - vector form: plane normal, mirrored about `basePointVector` (default origin)\n * - Workplane form (upstream Face form): normal + center of the selected face;\n * basePointVector only overrides the center when explicitly given\n * - `union`: fuse the mirrored copy with the original (upstream `self.union(newS)`)\n *\n * The kernel projection is `cad.mirror(shape, { normal, at })` — the previous\n * implementation passed `{ plane }`, which MirrorOptions does not know, so every\n * mirror silently used the default normal [1,0,0] (latent bug, found while\n * writing the test_mirror mirrors).\n *\n * @param wp - Workplane\n * @param mirrorPlane - 'XY'..'ZY' | plane normal vector | Workplane carrying a face selection (default 'XY')\n * @param basePointVector - point the mirror plane passes through (default: the selected face centre for the Workplane form, otherwise the world origin)\n * @param union - fuse the mirrored copy with the original (default false)\n * @returns Promise<Workplane> carrying the mirrored (or unioned) shape\n */\nexport async function mirror(\n wp: Workplane,\n mirrorPlane?: string | number[] | Workplane,\n basePointVector?: [number, number, number],\n union?: boolean,\n): Promise<Workplane> {\n if (!wp.shape) return wp\n let normal: [number, number, number]\n let at: [number, number, number]\n if (mirrorPlane && typeof mirrorPlane === 'object' && !Array.isArray(mirrorPlane)) {\n // Workplane carrying a face selection (upstream Face form).\n const fp = mirrorPlane as Workplane\n if (!fp.faceSel || !fp.shape) return wp\n const resolved = await resolveFaceSelector(fp.shape, fp.faceSel)\n normal = resolved.normal\n at = basePointVector ?? resolved.center\n } else if (Array.isArray(mirrorPlane)) {\n normal = [mirrorPlane[0] ?? 0, mirrorPlane[1] ?? 0, mirrorPlane[2] ?? 0]\n at = basePointVector ?? [0, 0, 0]\n } else {\n const key = String(mirrorPlane ?? 'XY').toUpperCase()\n normal = MIRROR_PLANE_NORMALS[key] ?? [0, 0, 1]\n at = basePointVector ?? [0, 0, 0]\n }\n const mirrored = await cad.mirror(resolveInputShape(wp), { normal, at })\n const shape = union ? await fuseShapes(wp.shape, mirrored) : mirrored\n // Upstream returns a newObject stack holding only the mirrored/unioned\n // objects — pending selectors do not survive a mirror.\n return clone(wp, { shape, faceSel: null, edgeSel: null, vertexSel: null })\n}\n\n/**\n * faceCompound — extract the faces picked by a direction selector as a\n * standalone compound Shape (upstream module-level `Shape.faces(\">Z\")`, which\n * returns a Compound of faces — unlike `Workplane.faces()`, which only records\n * the selection). Needed by test_single_ent_selector where the exported var IS\n * the face compound (ref: Compound, area 2 = two unit-box top faces).\n *\n * `sel = 'all'` picks EVERY face of the shape — the upstream\n * `compound(shape.Faces())` free-function form (test_constructors c1/c2).\n *\n * @param wp - Workplane\n * @param sel - direction selector (\">Z\", \"<X\", …) or 'all' for every face\n * @returns Promise<Workplane> carrying the face compound\n */\nexport async function faceCompound(wp: Workplane, sel: string): Promise<Workplane> {\n if (!wp.shape) return wp\n const s = NAMED_VIEW_TO_AXIS[sel.trim().toLowerCase()] ?? sel\n if (s.trim().toLowerCase() === 'all') {\n const faces = compatFn('getFaces')(borrowBrepjsShape(wp.shape)) as unknown[]\n if (faces.length === 0) {\n throw new Error('[cq-compat] faceCompound \"all\": shape has no faces')\n }\n const product = compatFn('makeCompound')(faces) as unknown\n const shape = adoptBrepjsProduct(unwrapBrepResult(product))\n return clone(wp, { shape, faceSel: null, edgeSel: null, vertexSel: null })\n }\n const m = /^([<>])([XYZ])(?:\\[-?\\d+\\])?$/.exec(s.trim())\n if (!m) {\n throw new Error(`[cq-compat] unsupported face selector for faceCompound \"${sel}\"`)\n }\n const axis = m[2] === 'X' ? 0 : m[2] === 'Y' ? 1 : 2\n const sign = m[1] === '>' ? 1 : -1\n const bounds = (h: unknown): Record<string, number> =>\n compatFn('getBounds')(h) as Record<string, number>\n const faces = compatFn('getFaces')(borrowBrepjsShape(wp.shape)) as unknown[]\n // DirectionMinMaxSelector: among faces perpendicular to the axis, take ALL\n // faces whose center sits at the extremum (ties included — the two-boxes\n // compound exports BOTH top faces).\n const perp = faces.filter((f) => {\n const b = bounds(f)\n return [b.xMax - b.xMin, b.yMax - b.yMin, b.zMax - b.zMin][axis] <= 0.1\n })\n if (perp.length === 0) {\n throw new Error(`[cq-compat] no planar face for selector \"${sel}\"`)\n }\n const center = (b: Record<string, number>): number =>\n [(b.xMin + b.xMax) / 2, (b.yMin + b.yMax) / 2, (b.zMin + b.zMax) / 2][axis]\n const extremum = perp\n .map((f) => center(bounds(f)))\n .reduce((best, c) => (sign * c > sign * best ? c : best))\n const picked = perp.filter((f) => Math.abs(center(bounds(f)) - extremum) <= 1e-6)\n const product = compatFn('makeCompound')(picked) as unknown\n const shape = adoptBrepjsProduct(unwrapBrepResult(product))\n return clone(wp, { shape, faceSel: null, edgeSel: null, vertexSel: null })\n}\n\n/**\n * edgeCompound — extract the edges picked by a direction selector as a\n * standalone compound Shape (upstream `shape.edges(\">Z\")` on a Solid, which\n * returns a Compound of edges). Needed by TestCQSelectors.testShape where the\n * exported var IS the edge compound (ref: Compound of the 4 top edges).\n *\n * Semantics (upstream DirectionMinMaxSelector = CenterNthSelector n=-1):\n * order ALL edges by their center-of-mass projection onto the axis and take\n * the extremum cluster (ties included). For a centered box the vertical edges'\n * centers sit at z=0 while the top edges sit at z=+h/2 — so `\">Z\"` picks\n * exactly the 4 top edges.\n *\n * @param wp - Workplane\n * @param sel - direction selector (\">Z\", \"<X\", …) picking the extremum edge cluster\n * @returns Promise<Workplane> carrying the edge compound\n */\nexport async function edgeCompound(wp: Workplane, sel: string): Promise<Workplane> {\n if (!wp.shape) return wp\n const s = NAMED_VIEW_TO_AXIS[sel.trim().toLowerCase()] ?? sel\n const m = /^([<>])([XYZ])(?:\\[-?\\d+\\])?$/.exec(s.trim())\n if (!m) {\n throw new Error(`[cq-compat] unsupported face selector for edgeCompound \"${sel}\"`)\n }\n const axis = m[2] === 'X' ? 0 : m[2] === 'Y' ? 1 : 2\n const sign = m[1] === '>' ? 1 : -1\n const bounds = (h: unknown): Record<string, number> =>\n compatFn('getBounds')(h) as Record<string, number>\n const edges = compatFn('getEdges')(borrowBrepjsShape(wp.shape)) as unknown[]\n const center = (b: Record<string, number>): number =>\n [(b.xMin + b.xMax) / 2, (b.yMin + b.yMax) / 2, (b.zMin + b.zMax) / 2][axis]\n const extremum = edges\n .map((e) => center(bounds(e)))\n .reduce((best, c) => (sign * c > sign * best ? c : best))\n const picked = edges.filter((e) => Math.abs(center(bounds(e)) - extremum) <= 1e-6)\n const product = compatFn('makeCompound')(picked) as unknown\n const shape = adoptBrepjsProduct(unwrapBrepResult(product))\n return clone(wp, { shape, faceSel: null, edgeSel: null, vertexSel: null })\n}\n\n// ── Location / moved / move (阶段 E) ─────────────────────────────────────\n\n/**\n * Minimal analogue of CadQuery's `Location`.\n *\n * Upstream (`cadquery/occ_impl/geom.py::Location`) builds a `gp_Trsf` from a\n * translation plus an Euler rotation using **degrees** and\n * `gp_Extrinsic_XYZ` order, then maps `p -> R·p + t` (rotate first, translate\n * second). We keep exactly those two fields; rotation is stored in degrees so\n * mirrors can pass upstream angle literals verbatim.\n *\n * Not modelled: the `Location(Plane)` / `Location(Plane, VectorLike)` overloads\n * and `TopLoc_Location` composition — no mirror case needs them yet.\n */\nexport interface CqLocation {\n readonly __cqLocation: true\n /** Translation (mm). */\n readonly pos: [number, number, number]\n /** Euler rotation in degrees (upstream gp_Extrinsic_XYZ). */\n readonly rot: [number, number, number]\n}\n\nfunction locNum(v: unknown): number {\n return typeof v === 'number' && Number.isFinite(v) ? v : 0\n}\n\nfunction locVec3(a: unknown): [number, number, number] {\n if (Array.isArray(a)) return [locNum(a[0]), locNum(a[1]), locNum(a[2])]\n return [0, 0, 0]\n}\n\n/**\n * Type guard for a `Location` produced by {@link Location}.\n *\n * @param v - value to test\n * @returns True when `v` is a cq-compat Location\n */\nexport function isLocation(v: unknown): v is CqLocation {\n return typeof v === 'object' && v !== null && (v as { __cqLocation?: unknown }).__cqLocation === true\n}\n\n/**\n * Location — CadQuery `Location` constructor.\n *\n * Accepted forms (all verified against the upstream overloads used by\n * `tests/test_free_functions.py::test_moved`):\n * `Location([x, y, z])`\n * `Location([x, y, z], [rx, ry, rz])`\n * `Location(x, y, z)` / `Location(x, y, z, rx, ry, rz)`\n * `Location({ x, y, z, rx, ry, rz })` ← the `.moved(z=-1)` keyword form\n *\n * @param args - overload payload: `[pos]`, `[pos, rot]`, `(x, y, z[, rx, ry, rz])`, or the keyword object\n * @returns CqLocation (position in mm, rotation in degrees)\n */\nexport function Location(...args: unknown[]): CqLocation {\n const nums = args.filter((a): a is number => typeof a === 'number')\n const arrs = args.filter((a): a is unknown[] => Array.isArray(a))\n const obj = args.find((a) => typeof a === 'object' && a !== null && !Array.isArray(a)) as\n | Record<string, unknown>\n | undefined\n\n let pos: [number, number, number] = [0, 0, 0]\n let rot: [number, number, number] = [0, 0, 0]\n if (obj) {\n pos = [locNum(obj.x), locNum(obj.y), locNum(obj.z)]\n rot = [locNum(obj.rx), locNum(obj.ry), locNum(obj.rz)]\n } else if (nums.length >= 6) {\n pos = [nums[0], nums[1], nums[2]]\n rot = [nums[3], nums[4], nums[5]]\n } else if (nums.length >= 3) {\n pos = [nums[0], nums[1], nums[2]]\n } else if (arrs.length >= 2) {\n pos = locVec3(arrs[0])\n rot = locVec3(arrs[1])\n } else if (arrs.length === 1) {\n pos = locVec3(arrs[0])\n }\n return { __cqLocation: true, pos, rot }\n}\n\n/**\n * composeLocations(a, b) — the Location product `a * b` (upstream `Location.__mul__`):\n * apply `b` first, then `a`. Result: R = Ra·Rb, t = Ra·t_b + t_a.\n *\n * Mirrors need this because a Workplane whose carried shape is a **compound**\n * cannot be fed back into `moved` — the faijs runtime only re-attaches the BREP\n * handle across statement boundaries for solids (see `moved`'s KNOWN LIMITATION\n * note), so `bs1.moved(l3, l4)` has to be written as one `moved` over the\n * composed locations instead of two chained ones.\n *\n * @param a - outer location (applied second)\n * @param b - inner location (applied first)\n * @returns CqLocation holding the product a·b\n */\nexport function composeLocations(a: CqLocation, b: CqLocation): CqLocation {\n const ra = rotationMatrixDeg(a.rot)\n const rb = rotationMatrixDeg(b.rot)\n const mul = (m: number[], n: number[]): number[] => {\n const out = new Array<number>(9).fill(0)\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n out[i * 3 + j] = m[i * 3] * n[j] + m[i * 3 + 1] * n[3 + j] + m[i * 3 + 2] * n[6 + j]\n }\n }\n return out\n }\n const r = mul(ra, rb)\n const tb = b.pos\n const t: [number, number, number] = [\n ra[0] * tb[0] + ra[1] * tb[1] + ra[2] * tb[2] + a.pos[0],\n ra[3] * tb[0] + ra[4] * tb[1] + ra[5] * tb[2] + a.pos[1],\n ra[6] * tb[0] + ra[7] * tb[1] + ra[8] * tb[2] + a.pos[2],\n ]\n // recover Euler angles from the composed matrix (gp_Extrinsic_XYZ: R = Rz·Ry·Rx)\n const rot: [number, number, number] = [0, 0, 0]\n const cy = Math.hypot(r[0], r[3])\n if (cy > 1e-12) {\n rot[1] = (Math.atan2(-r[6], cy) * 180) / Math.PI\n rot[2] = (Math.atan2(r[3], r[0]) * 180) / Math.PI\n rot[0] = (Math.atan2(r[7], r[8]) * 180) / Math.PI\n } else {\n rot[1] = (Math.atan2(-r[6], cy) * 180) / Math.PI\n rot[2] = 0\n rot[0] = (Math.atan2(-r[5], r[4]) * 180) / Math.PI\n }\n const zero = (v: number): number => (v === 0 ? 0 : v)\n return {\n __cqLocation: true,\n pos: [zero(t[0]), zero(t[1]), zero(t[2])],\n rot: [zero(rot[0]), zero(rot[1]), zero(rot[2])],\n }\n}\n\n/**\n * Normalise the variadic argument list of `moved`/`move` into a Location list.\n *\n * Upstream dispatch (`Shape.moved`, cadquery 2.8.0) — the forms a mirror needs:\n * `moved(loc)` / `moved(loc1, loc2, …)` / `moved([loc1, loc2])`\n * `moved((0,0,1))` / `moved((0,0,1), (0,0,-1))` / `moved([(0,0,1), (0,0,-1)])`\n * `moved(0, 0, -1)` / `moved(z=-1)`\n */\nfunction toLocations(args: unknown[]): CqLocation[] {\n if (args.length === 0) return []\n if (args.every((a) => typeof a === 'number')) {\n const n = args as number[]\n return [\n {\n __cqLocation: true,\n pos: [locNum(n[0]), locNum(n[1]), locNum(n[2])],\n rot: [locNum(n[3]), locNum(n[4]), locNum(n[5])],\n },\n ]\n }\n const out: CqLocation[] = []\n for (const a of args) {\n if (isLocation(a)) {\n out.push(a)\n } else if (Array.isArray(a)) {\n if (a.length > 0 && isLocation(a[0])) {\n out.push(...(a as CqLocation[]))\n } else if (a.length > 0 && Array.isArray(a[0])) {\n for (const v of a) out.push(Location(v as number[]))\n } else {\n out.push(Location(a as number[]))\n }\n } else if (a && typeof a === 'object') {\n out.push(Location(a as Record<string, number>))\n }\n }\n return out\n}\n\n/**\n * Row-major 3x3 rotation for Euler angles in degrees, `gp_Extrinsic_XYZ` order\n * (rotations about the FIXED axes X, then Y, then Z: R = Rz·Ry·Rx) — the order\n * upstream `Location` uses.\n */\nfunction rotationMatrixDeg(rot: [number, number, number]): number[] {\n const rad = Math.PI / 180\n const [rx, ry, rz] = rot.map((d) => d * rad) as [number, number, number]\n const cx = Math.cos(rx)\n const sx = Math.sin(rx)\n const cy = Math.cos(ry)\n const sy = Math.sin(ry)\n const cz = Math.cos(rz)\n const sz = Math.sin(rz)\n const Rx = [1, 0, 0, 0, cx, -sx, 0, sx, cx]\n const Ry = [cy, 0, sy, 0, 1, 0, -sy, 0, cy]\n const Rz = [cz, -sz, 0, sz, cz, 0, 0, 0, 1]\n const mul = (a: number[], b: number[]): number[] => {\n const out = new Array<number>(9).fill(0)\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n out[i * 3 + j] = a[i * 3] * b[j] + a[i * 3 + 1] * b[3 + j] + a[i * 3 + 2] * b[6 + j]\n }\n }\n return out\n }\n return mul(Rz, mul(Ry, Rx))\n}\n\n/**\n * Apply one Location to a shape: rotate about the world origin, then translate\n * (p -> R·p + t, matching upstream `gp_Trsf.SetRotation` + `SetTranslationPart`).\n *\n * Uses the kernel `applyMatrix` projection rather than `cad.translate` /\n * `cad.rotate_euler`: the latter two are solid-only and throw\n * \"input is not BREP\" on a compound, which is exactly what `moved` produces\n * when it is given more than one location.\n */\nasync function applyLocation(shape: Shape, loc: CqLocation): Promise<Shape> {\n const [rx, ry, rz] = loc.rot\n const [x, y, z] = loc.pos\n if (rx === 0 && ry === 0 && rz === 0 && x === 0 && y === 0 && z === 0) return shape\n\n // Two paths, chosen by the number of solids in the carrier:\n //\n // - a SINGLE solid goes through the faijs `cad.rotate_euler` / `cad.translate`\n // defineOps. Those re-register the OCCT handle in a way that survives a\n // statement boundary, so the result exports as a true BREP STEP.\n // - a COMPOUND must use the kernel `applyMatrix` projection (the defineOps\n // are solid-only and reject it). That product does NOT keep its BREP slot\n // across a statement boundary — the STEP then falls back to a\n // TESSELLATED_SOLID — so mirrors avoid feeding a compound back into\n // `moved` (they fold the locations with composeLocations instead).\n const solids = ((): number => {\n try {\n return (brepjsCompat.getSolids(borrowBrepjsShape(shape) as never) as unknown[]).length\n } catch {\n return 0\n }\n })()\n if (solids <= 1) {\n let s = shape\n if (rx !== 0 || ry !== 0 || rz !== 0) {\n s = await cad.rotate_euler(s, { anglesDeg: [rx, ry, rz] })\n }\n if (x !== 0 || y !== 0 || z !== 0) {\n s = await cad.translate(s, { offset: [x, y, z] })\n }\n return s\n }\n const product = unwrapBrepResult(\n compatFn('applyMatrix')(borrowBrepjsShape(shape), {\n linear: rotationMatrixDeg(loc.rot) as never,\n translation: [x, y, z] as never,\n }),\n )\n return adoptBrepjsProduct(product)\n}\n\n/**\n * moved — apply one or more Locations to the carried geometry.\n *\n * Upstream is `Shape.moved(*locs)`: one location returns a moved copy, several\n * return a **compound** holding one copy per location (no boolean union —\n * `test_moved` asserts `bs1.Volume() == 2` and `len(bs1.Solids()) == 2` for two\n * disjoint unit boxes, which only holds for a compound).\n *\n * @param wp - Workplane\n * @param locs - Location | [x,y,z] | {x,y,z,rx,ry,rz} | list thereof\n * @returns Promise<Workplane>\n */\nexport async function moved(wp: Workplane, ...locs: unknown[]): Promise<Workplane> {\n if (!wp.shape) return wp\n const resolved = toLocations(locs)\n const copies: Shape[] = []\n for (const l of resolved) copies.push(await applyLocation(resolveInputShape(wp), l))\n let shape: Shape\n if (copies.length === 0) {\n shape = wp.shape\n } else if (copies.length === 1) {\n shape = copies[0]\n } else {\n // Upstream `_compound_or_shape` groups the copies without any boolean or\n // clean pass — mirroring that keeps the topology (face/solid counts) equal\n // to upstream, which the STEP comparison gates on.\n const handles = copies.map((c) => borrowBrepjsShape(c))\n shape = adoptBrepjsProduct(unwrapBrepResult(compatFn('makeCompound')(handles)))\n }\n return clone(wp, {\n shape,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n pendingWires: [],\n })\n}\n\n/**\n * move — upstream mutates the shape in place; cq-compat carriers are immutable\n * so this is an alias of {@link moved}.\n *\n * @param wp - Workplane\n * @param locs - same forms as {@link moved}\n * @returns Promise<Workplane>\n */\nexport async function move(wp: Workplane, ...locs: unknown[]): Promise<Workplane> {\n return moved(wp, ...locs)\n}\n\n/**\n * union\n * @param wp - Workplane\n * @param other - Workplane | Shape\n * @returns Promise<Workplane>\n */\nexport async function union(\n wp: Workplane,\n other: Workplane | Shape,\n): Promise<Workplane> {\n if (!wp.shape) return wp\n const otherShape = 'shape' in other ? (other as Workplane).shape : (other as Shape)\n if (!otherShape) return wp\n const shape = await fuseShapes(wp.shape, otherShape)\n return clone(wp, { shape })\n}\n\n/**\n * combine\n * @param wp - Workplane\n * @returns Promise<Workplane>\n *\n * CadQuery semantics note (verified vs cadquery 2.8.0): upstream `combine()`\n * fuses all stack items. cq-compat fuses eagerly inside the building ops\n * (extrude / eachpoint with combine=True), so by the time combine() runs the\n * stack holds a single fused solid — the op degenerates to a `clean()` pass\n * (same-face merge), which matches the upstream test expectations\n * (testCombine: 11 faces either way).\n */\nexport async function combine(wp: Workplane): Promise<Workplane> {\n if (!wp.shape) return wp\n const shape = await cleanShapes(wp.shape)\n return clone(wp, { shape })\n}\n\n/**\n * cut\n * @param wp - Workplane\n * @param other - Workplane | Shape\n * @returns Promise<Workplane>\n */\nexport async function cut(\n wp: Workplane,\n other: Workplane | Shape,\n): Promise<Workplane> {\n if (!wp.shape) return wp\n const otherShape = 'shape' in other ? (other as Workplane).shape : (other as Shape)\n if (!otherShape) return wp\n const shape = await cad.subtract(resolveInputShape(wp), resolveInputShape(other))\n return clone(wp, { shape })\n}\n\n/**\n * face — materialize the pending wire LIST as one planar face per outermost\n * wire (upstream module-level `face(*wires)` free function). Enclosed wires\n * become holes of the enclosing face — the same outer/hole grouping `extrude`\n * uses. Several disjoint outer wires yield a Compound of faces.\n *\n * @param wp - Workplane carrying the pending wires\n * @returns Promise<Workplane> whose shape is the face (or face compound)\n */\nexport async function face(wp: Workplane): Promise<Workplane> {\n const all = (wp.pendingWires ?? []).filter((w) => !w.construction)\n if (all.length === 0) throw new Error('[cq-compat] face: no pending wire to build a face from')\n const groups = groupPendingWires(all)\n const faces: Shape[] = []\n for (const g of groups) {\n const outer = await buildProfileWire(wp, g.outer)\n const holeWires: unknown[] = []\n for (const h of g.holes) {\n holeWires.push(await buildProfileWire(wp, h))\n }\n faces.push(adoptBrepjsProduct(unwrapBrepResult(compatFn('makeFace')(outer, holeWires))) as Shape)\n }\n const shape = faces.length === 1 ? faces[0] : makeCompoundShape(faces)\n return clone(wp, {\n shape,\n pendingWires: [],\n pendingRect: undefined,\n pendingCircle: undefined,\n pendingPolygon: undefined,\n faceSel: null,\n edgeSel: null,\n vertexSel: null,\n pts: [],\n })\n}\n\n/**\n * vertex — upstream module-level `vertex(x, y, z)` free function: a single\n * point shape. Used as a degenerate loft section (`loft(face, vertex(0,0,1))`)\n * and inside compounds.\n *\n * @param x - world x (default 0)\n * @param y - world y (default 0)\n * @param z - world z (default 0)\n * @returns Shape holding the vertex\n */\nexport function vertex(x: number = 0, y: number = 0, z: number = 0): Shape {\n return adoptBrepjsProduct(unwrapBrepResult(compatFn('makeVertex')([x, y, z]))) as Shape\n}\n\n/**\n * compound — upstream module-level `compound(*shapes)` free function: bundle\n * several shapes into a single Compound WITHOUT any boolean operation. Needed\n * by test_history_bool (imprint result = base solid + tool solid as a\n * compound) and test_union_compound-style cases.\n *\n * Accepts Shapes and Workplanes (their current shape is used); null/empty\n * entries are skipped. Returns a Shape whose value is the compound itself, so\n * mirrors write `let result = c` directly.\n *\n * @param items - Shapes and/or Workplanes to bundle (null/undefined entries are skipped)\n * @returns Compound Shape, or null when no item carries geometry\n */\nexport function compound(...items: (Workplane | Shape | null | undefined)[]): Shape | null {\n const shapes = items\n .map((it) => (it && typeof it === 'object' && 'shape' in (it as Workplane) ? (it as Workplane).shape : (it as Shape)))\n .filter((s): s is Shape => Boolean(s))\n if (shapes.length === 0) return null\n return makeCompoundShape(shapes)\n}\n\n/**\n * intersect\n * @param wp - Workplane\n * @param other - Workplane | Shape\n * @returns Promise<Workplane>\n */\nexport async function intersect(\n wp: Workplane,\n other: Workplane | Shape,\n): Promise<Workplane> {\n if (!wp.shape) return wp\n const otherShape = 'shape' in other ? (other as Workplane).shape : (other as Shape)\n if (!otherShape) return wp\n const shape = await intersectShapes(wp.shape, otherShape)\n return clone(wp, { shape })\n}\n\n/**\n * fillet\n * @param wp - Workplane\n * @param radius - number\n * @returns Promise<Workplane>\n */\n/**\n * Resolve a CadQuery edge selector string to concrete edge handles.\n *\n * Supports CadQuery's parallel-axis selectors \"|X\" / \"|Y\" / \"|Z\" (edges whose\n * bounding box is thin across the two perpendicular axes) and an empty / absent\n * selector meaning \"all edges\". Face/edge geometry beyond axis-parallel lines\n * is out of scope for this layer.\n */\nfunction resolveEdgeSelection(shape: Shape, sel: string | null | undefined): unknown[] {\n const edges = compatFn('getEdges')(borrowBrepjsShape(shape)) as unknown[]\n if (!sel || sel === '') return edges\n const m = /^\\|([XYZ])$/.exec(sel.trim())\n if (!m) {\n throw new Error(`[cq-compat] unsupported edge selector \"${sel}\" (supported: |X |Y |Z)`)\n }\n const axisIdx = m[1] === 'X' ? 0 : m[1] === 'Y' ? 1 : 2\n const perp = [0, 1, 2].filter((i) => i !== axisIdx)\n // The kernel inflates edge bounding boxes by ~0.1mm of tolerance padding, so\n // an axis-parallel edge is identified RELATIVELY: its extent along the axis\n // must dominate the two perpendicular extents (which stay padding-sized).\n const PAD = 0.5 // mm — max perpendicular extent for an axis-parallel edge\n return edges.filter((e) => {\n const b = compatFn('getBounds')(e) as Record<string, number>\n const min = [b.xMin, b.yMin, b.zMin]\n const max = [b.xMax, b.yMax, b.zMax]\n const extents = [max[0] - min[0], max[1] - min[1], max[2] - min[2]]\n const axisExtent = extents[axisIdx]\n return (\n perp.every((i) => extents[i] <= PAD) &&\n axisExtent > 2 * Math.max(extents[perp[0]], extents[perp[1]])\n )\n })\n}\n\n/**\n * Fillet selected edges of the current shape.\n *\n * Edge resolution mirrors chamfer: an explicit `|Z`-style / empty edgeSel goes\n * through `resolveEdgeSelection`; a pending face selection\n * (`.faces(\">Z\").fillet(r)`) fillets THE SELECTED FACE's edges via\n * `resolveFaceEdgeSelection` (upstream `.faces(\"+Z\").edges().fillet(r)`\n * semantics — the missing faceSel branch made testTopFaceFillet fillet all 12\n * edges instead of the 4 top ones). Failures propagate — silently returning\n * the unfilleted shape previously produced plates whose fillets were missing\n * entirely (bp/mb/mt/tp diagnosis, 2026-09-08).\n *\n * @param wp - Workplane whose current shape is filleted; consumes `edgeSel`/`faceSel`.\n * @param radius - Fillet radius in world units.\n * @returns Promise resolving to a new Workplane holding the filleted shape.\n */\nexport async function fillet(wp: Workplane, radius: number): Promise<Workplane> {\n if (!wp.shape) return wp\n let edges: unknown[]\n if (wp.edgeSel !== null && wp.edgeSel !== undefined) {\n edges = resolveEdgeSelection(wp.shape, wp.edgeSel)\n } else if (wp.faceSel) {\n edges = resolveFaceEdgeSelection(wp.shape, wp.faceSel)\n } else {\n edges = resolveEdgeSelection(wp.shape, undefined)\n }\n const result = compatFn('fillet')(borrowBrepjsShape(wp.shape), edges, radius)\n const product = unwrapBrepResult(result)\n const shape = adoptBrepjsProduct(product)\n return clone(wp, { shape, edgeSel: null, faceSel: null })\n}\n\n/**\n * chamfer\n * @param wp - Workplane\n * @param length - number\n * @param length2 - number | undefined\n * @returns Promise<Workplane>\n *\n * CadQuery semantics (verified vs cadquery 2.8.0 `Workplane.chamfer`):\n * chamfers the selected edges of the current shape. Edge resolution order:\n * explicit `edges(\"|Z\")` selector; else, if a face selector is pending\n * (`.faces(\">Z\").chamfer(l)`), the edges OF the selected face; else all\n * edges. LIMITATION: asymmetric `length2` is NOT supported — the occt-wasm\n * kernel chamfer takes a single uniform distance (resolveUniformRadius\n * degrades a pair to d1), so length2 throws instead of silently producing a\n * symmetric chamfer.\n */\nexport async function chamfer(\n wp: Workplane,\n length: number,\n length2?: number,\n): Promise<Workplane> {\n if (length2 !== undefined) {\n throw new Error('[cq-compat] chamfer length2 (asymmetric) is not supported by the occt-wasm kernel')\n }\n if (!wp.shape) return wp\n let edges: unknown[]\n if (wp.edgeSel !== null && wp.edgeSel !== undefined) {\n edges = resolveEdgeSelection(wp.shape, wp.edgeSel)\n } else if (wp.faceSel) {\n edges = resolveFaceEdgeSelection(wp.shape, wp.faceSel)\n } else {\n edges = resolveEdgeSelection(wp.shape, undefined)\n }\n const result = compatFn('chamfer')(borrowBrepjsShape(wp.shape), edges, length)\n const product = unwrapBrepResult(result)\n const shape = adoptBrepjsProduct(product)\n return clone(wp, { shape, edgeSel: null, faceSel: null })\n}\n\n/**\n * Resolve the edges belonging to the face picked by a direction selector\n * (upstream `.faces(\">Z\").chamfer(l)` chamfers the edges of that face).\n * Reuses the direction-minimum/maximum rule of resolveFaceSelector: among\n * faces perpendicular to the axis, the extremal one along it wins; its edges\n * are those whose bounding box lies inside the face's (kernel pads bounds by\n * ~0.1mm of tolerance, so a small positive slack is used).\n */\nfunction resolveFaceEdgeSelection(shape: Shape, sel: string): unknown[] {\n // '+'/'-' are accepted as aliases of '>'/'<' (CadQuery allows both spellings;\n // resolveFaceSelector's axis table does the same).\n const m = /^([<>+-])([XYZ])(?:\\[-?\\d+\\])?$/.exec(sel.trim())\n if (!m) {\n throw new Error(`[cq-compat] unsupported face selector for chamfer \"${sel}\"`)\n }\n const axis = m[2] === 'X' ? 0 : m[2] === 'Y' ? 1 : 2\n const sign = m[1] === '>' || m[1] === '+' ? 1 : -1\n const bounds = (h: unknown): Record<string, number> =>\n compatFn('getBounds')(h) as Record<string, number>\n const faces = compatFn('getFaces')(borrowBrepjsShape(shape)) as unknown[]\n const perp = faces.filter((f) => {\n const b = bounds(f)\n return [b.xMax - b.xMin, b.yMax - b.yMin, b.zMax - b.zMin][axis] <= 0.1\n })\n if (perp.length === 0) {\n throw new Error(`[cq-compat] no planar face for selector \"${sel}\"`)\n }\n const faceCenter = (b: Record<string, number>): number =>\n [(b.xMin + b.xMax) / 2, (b.yMin + b.yMax) / 2, (b.zMin + b.zMax) / 2][axis]\n const target = perp\n .map((f) => ({ f, b: bounds(f) }))\n .reduce((best, cur) => (sign * (faceCenter(cur.b) - faceCenter(best.b)) > 0 ? cur : best))\n const fc = faceCenter(target.b)\n // Edge bounds carry ±0.1mm kernel tolerance padding (measured: a unit-box\n // edge reports extents inflated by 0.2), while face bounds are tight. An\n // edge of the face lies IN its plane, so along the axis it is thin (pure\n // padding) and its center coincides with the face center.\n const EDGE_AXIS_MAX = 0.25\n const EDGE_CENTER_TOL = 0.15\n const edges = compatFn('getEdges')(borrowBrepjsShape(shape)) as unknown[]\n return edges.filter((e) => {\n const b = bounds(e)\n const ext = [b.xMax - b.xMin, b.yMax - b.yMin, b.zMax - b.zMin][axis]\n const c = [(b.xMin + b.xMax) / 2, (b.yMin + b.yMax) / 2, (b.zMin + b.zMax) / 2][axis]\n return ext <= EDGE_AXIS_MAX && Math.abs(c - fc) <= EDGE_CENTER_TOL\n })\n}\n\n/**\n * shell\n *\n * CadQuery `Workplane.shell(thickness)` parity: shells the solid found on the\n * stack, removing the faces selected by a preceding `faces(sel)` (empty\n * selection = `Shape.hollow` — no faces removed, the solid is hollowed into a\n * closed shell, verified vs cadquery 2.8.0: `box(2,2,2).shell(-0.1)` → 12\n * faces, vol 2.168). The kernel call is `OcctKernel.shell` =\n * `BRepOffsetAPI_MakeThickSolidByJoin` (negative thickness → walls inward,\n * positive → walls outward, mirroring upstream sign semantics).\n *\n * Face removal set: single-axis selectors (\">Z\"/\"<Z\"/\"+Z\"/\"-Z\" …) pick the\n * faces perpendicular to the axis whose bbox center sits at the extreme —\n * the same criteria `resolveFaceSelector` uses. Multi-axis and indexed\n * selectors are not supported here yet (the blocked mirrors that need them\n * are out of this phase's scope).\n *\n * @param wp - Workplane\n * @param thickness - number (negative: inward hollow)\n * @returns Promise<Workplane>\n */\nexport async function shell(wp: Workplane, thickness: number): Promise<Workplane> {\n if (!wp.shape) return wp\n const handle = brepOf(wp.shape)\n if (handle === undefined) return wp\n const kernel = getKernel() as unknown as OcctKernel\n const facesToRemove: ShapeHandle[] = []\n if (wp.faceSel) {\n facesToRemove.push(\n ...selectFaceHandlesForRemoval(kernel, handle as unknown as ShapeHandle, wp.faceSel),\n )\n }\n const h = handle as unknown as ShapeHandle\n let shape: Shape\n if (thickness < 0) {\n if (facesToRemove.length > 0) {\n // Walls inward with openings: the kernel call IS MakeThickSolidByJoin\n // semantics (remove faces, offset remaining inward by |thickness|).\n shape = fromHandle(kernel.shell(h, facesToRemove, -thickness, 1e-3))\n } else {\n // Closed hollow (upstream Shape.hollow): kernel.shell with NO removed\n // faces degenerates to the inward-offset solid (measured: box(2,2,2)\n // +0.1 -> 1.8^3 = 5.832), so the wall solid is original minus offset.\n const inner = fromHandle(kernel.shell(h, [], -thickness, 1e-3))\n shape = await cutShapes(wp.shape, inner)\n }\n } else {\n if (facesToRemove.length > 0) {\n // Walls outward with openings. Upstream routes this through\n // MakeThickSolidByJoin (offset + remove + join), which the kernel does\n // not expose: `offset` alone leaves the removed face closed. Cutting the\n // swept slab off each removed face (the earlier heuristic here) produced\n // geometry that does not match any upstream reference, so fail loudly\n // rather than emit an approximation — see testSimpleShell__s1/s3 in\n // tests/mark-blocked.ts.\n throw new Error(\n '[cq-compat] shell: positive thickness (walls outward) with removed faces is not supported',\n )\n }\n // Walls outward: rounded outward offset (arc-joined corners) minus the\n // original solid (verified vs 2.8.0: box(2,2,2).shell(0.1) -> 32 faces,\n // vol 2.592684356757526, bbox +-1.1).\n const outer = fromHandle(kernel.offset(h, thickness, 1e-3))\n shape = await cutShapes(outer, wp.shape)\n }\n return clone(wp, { shape, faceSel: null, edgeSel: null, vertexSel: null })\n}\n\n/**\n * Enumerate the solid's faces and return the removal set for `shell()` for a\n * single-axis selector string. A face participates when its bbox is thin along\n * the axis (perpendicular face) and its bbox center sits at the extreme end\n * picked by the selector (ties collected, matching upstream's multi-face\n * `faces(\"+Z\")` selection semantics).\n */\nfunction selectFaceHandlesForRemoval(\n kernel: OcctKernel,\n handle: ShapeHandle,\n sel: string,\n): ShapeHandle[] {\n const m = /^([<>+-])([XYZ])$/.exec(sel.trim())\n if (!m) {\n throw new Error(\n `[cq-compat] shell: face selector \"${sel}\" not supported (single-axis >Z/<Z/+Z/-Z only)`,\n )\n }\n const axisMap: Record<string, 0 | 1 | 2> = { X: 0, Y: 1, Z: 2 }\n const axis = axisMap[m[2]]\n const sign = m[1] === '<' || m[1] === '-' ? -1 : 1\n const faces = kernel.getSubShapes(handle, 'face') as unknown as ShapeHandle[]\n const perp: { h: ShapeHandle; c: number }[] = []\n for (const f of faces) {\n const bb = kernel.getBoundingBox(f)\n const ext = [bb.xmax - bb.xmin, bb.ymax - bb.ymin, bb.zmax - bb.zmin][axis]\n if (ext > 0.1) continue\n const c = [(bb.xmin + bb.xmax) / 2, (bb.ymin + bb.ymax) / 2, (bb.zmin + bb.zmax) / 2][axis]\n perp.push({ h: f, c })\n }\n if (perp.length === 0) {\n throw new Error(`[cq-compat] shell: no face perpendicular to axis for selector \"${sel}\"`)\n }\n const best = sign === 1 ? Math.max(...perp.map((p) => p.c)) : Math.min(...perp.map((p) => p.c))\n const TOL = 1e-6\n const picked = perp.filter((p) => Math.abs(p.c - best) <= TOL).map((p) => p.h)\n if (picked.length === faces.length) {\n throw new Error(`[cq-compat] shell: selector \"${sel}\" would remove every face`)\n }\n return picked\n}\n\n/**\n * val\n * @param wp - Workplane\n * @returns Shape | null\n */\nexport function val(wp: Workplane): Shape | null {\n return wp.shape\n}\n\n/**\n * vals\n * @param wp - Workplane\n * @returns (Shape | null)[]\n */\nexport function vals(wp: Workplane): (Shape | null)[] {\n return wp.shape ? [wp.shape] : []\n}\n\n/**\n * transformed\n * @param wp - Workplane\n * @param opts - { offset?: [number, number, number]; rotate?: [number, number, number] }\n * @returns Promise<Workplane>\n */\nexport async function transformed(\n wp: Workplane,\n opts: { offset?: [number, number, number]; rotate?: [number, number, number] },\n): Promise<Workplane> {\n let result = wp\n if (opts.offset) {\n // CadQuery applies the offset in LOCAL coordinates:\n // world offset = x·xDir + y·yDir + z·normal.\n const [x, y, z] = opts.offset\n const world = vadd(wp.origin, vadd(vscale(wp.xDir, x), vadd(vscale(wp.yDir, y), vscale(wp.normal, z))))\n result = clone(result, { origin: world })\n }\n if (opts.rotate) {\n // Upstream semantics (cadquery 2.8.0 Plane.rotated, verified): the plane's\n // DIRECTION vectors are rotated about the plane's own basis axes — x about\n // xDir, y about yDir, z about the normal — composed as T = Tx·Ty·Tz. The\n // origin is unaffected and the shape is NOT touched. The previous\n // implementation called rotate() (an op that rotates the shape with euler\n // angles) which silently returned the plane unchanged / rotated geometry.\n const [rxd, ryd, rzd] = opts.rotate\n const rad = Math.PI / 180\n const ax: [number, number, number] = [...wp.xDir]\n const ay: [number, number, number] = [...wp.yDir]\n const az: [number, number, number] = [...wp.normal]\n const rotAbout = (v: [number, number, number], a: [number, number, number], ang: number): [number, number, number] => {\n const c = Math.cos(ang)\n const s = Math.sin(ang)\n const cross: [number, number, number] = [\n a[1] * v[2] - a[2] * v[1],\n a[2] * v[0] - a[0] * v[2],\n a[0] * v[1] - a[1] * v[0],\n ]\n const dot = a[0] * v[0] + a[1] * v[1] + a[2] * v[2]\n return [\n v[0] * c + cross[0] * s + a[0] * dot * (1 - c),\n v[1] * c + cross[1] * s + a[1] * dot * (1 - c),\n v[2] * c + cross[2] * s + a[2] * dot * (1 - c),\n ]\n }\n const apply = (v: [number, number, number]): [number, number, number] =>\n rotAbout(rotAbout(rotAbout(v, az, rzd * rad), ay, ryd * rad), ax, rxd * rad)\n const newX = apply(ax)\n const newZ = apply(az)\n const newY: [number, number, number] = [\n newZ[1] * newX[2] - newZ[2] * newX[1],\n newZ[2] * newX[0] - newZ[0] * newX[2],\n newZ[0] * newX[1] - newZ[1] * newX[0],\n ]\n result = clone(result, { xDir: newX, yDir: newY, normal: newZ })\n }\n return result\n}\n\n/**\n * setColor\n * @param wp - Workplane\n * @param color - RGB\n * @returns Workplane\n */\nexport function setColor(wp: Workplane, color: RGB): Workplane {\n return clone(wp, { color })\n}\n\n// ── Gear-extension primitives (E1–E4) ───────────────────────────────────────\n// These four ops are required by the fai_cq_gears port (see\n// docs/plans/2026-09-11-cq-compat-gears-extensions-e1-e4.md). All call the\n// occt-wasm kernel directly via `getKernel()` — the same singleton fai_cq_gears\n// uses — so their `ShapeHandle`s are compatible with the rest of cq-compat.\n// occt-wasm already exposes `bsplineSurface` / `makeHelixWire` / `split` /\n// `halfSpace` natively (node_modules/occt-wasm/dist/index.d.ts:77/112/189/390),\n// so no vendored-layer extension is needed.\n//\n// NOTE: occt-wasm's JS wrapper reads `.x/.y/.z` off point arguments\n// (dist/index.js:169/396/485 and `#flattenPoints` at :1479) — it requires plain\n// `{x,y,z}` objects, NOT the `[x,y,z]` tuples faijs uses internally. `v3`\n// converts a tuple to the shape occt-wasm expects.\n\nconst v3 = (t: [number, number, number]): { x: number; y: number; z: number } => ({\n x: t[0],\n y: t[1],\n z: t[2],\n})\n\n\n/**\n * splineFace — build a B-spline surface face from a regular point grid and set\n * it as the workplane's current shape. CadQuery analog: `Face.makeSplineApprox`\n * (`Part.makeSplineSurface`) over the same `rows × cols` point grid.\n *\n * Two strategies are available via `opts.strategy`:\n *\n * - `'row-approx-loft'` (**default**): each grid row becomes a curve through\n * `approximatePoints(row, tolerance)`, the row wires are skinned with\n * `loft(wires, false, false)`, and the single resulting face is returned.\n * This matches CadQuery `makeSplineApprox` to 4.2e-11 (straight) / 5.6e-7\n * (helical) relative area on gear tooth grids — ≈3 orders better than\n * `'grid'` — because the curve-level tolerance carries the same meaning as\n * CadQuery's `spline_approx_tol`.\n * - `'grid'`: one-shot `bsplineSurface(flat, rows, cols)` over the whole grid.\n * occt-wasm exposes no DegMin/DegMax/Tol3D arguments here, so it runs with\n * kernel defaults; that measurably diverges from CadQuery's explicit\n * `(3, 8, 1e-2)` (≈2.3e-4 relative area on a gear tooth grid).\n *\n * Points are world-space and row-major (length `rows * cols`); the workplane's\n * plane/origin are not consulted — it is only the returned carrier.\n *\n * @param wp - Workplane carrier\n * @param grid - world-space points, row-major (length must equal `rows*cols`)\n * @param opts - `{ rows; cols; tolerance?; strategy? }`. `tolerance` is the\n * per-row curve approximation tolerance (default `1e-2`, matching CadQuery's\n * `spline_approx_tol`); `strategy` defaults to `'row-approx-loft'`\n * @returns Workplane with the spline face as `.shape`\n */\nexport async function splineFace(\n wp: Workplane,\n grid: [number, number, number][],\n opts: {\n rows: number\n cols: number\n tolerance?: number\n strategy?: 'row-approx-loft' | 'grid'\n },\n): Promise<Workplane> {\n const { rows, cols } = opts\n if (!Number.isInteger(rows) || !Number.isInteger(cols) || rows < 2 || cols < 2) {\n throw new Error('[cq-compat] splineFace: rows and cols must be integers >= 2')\n }\n if (grid.length !== rows * cols) {\n throw new Error(\n `[cq-compat] splineFace: grid length ${grid.length} != rows*cols (${rows * cols})`,\n )\n }\n const kernel = getKernel() as unknown as OcctKernel\n const k = kernel as unknown as {\n bsplineSurface: (\n pts: { x: number; y: number; z: number }[],\n rows: number,\n cols: number,\n ) => ShapeHandle\n approximatePoints: (\n pts: { x: number; y: number; z: number }[],\n tol?: number,\n ) => ShapeHandle\n makeWire: (edges: ShapeHandle[]) => ShapeHandle\n loft: (wires: ShapeHandle[], isSolid: boolean, ruled: boolean) => ShapeHandle\n isFace: (s: ShapeHandle) => boolean\n getSubShapes: (s: ShapeHandle, type: 'face') => ShapeHandle[]\n }\n\n if (opts.strategy === 'grid') {\n return clone(wp, { shape: fromHandle(k.bsplineSurface(grid.map(v3), rows, cols)) })\n }\n\n const tol = opts.tolerance ?? 1e-2\n const wires: ShapeHandle[] = []\n for (let r = 0; r < rows; r++) {\n const row = grid.slice(r * cols, (r + 1) * cols).map(v3)\n wires.push(k.makeWire([k.approximatePoints(row, tol)]))\n }\n const skinned = k.loft(wires, false, false)\n let face: ShapeHandle\n if (k.isFace(skinned)) {\n face = skinned\n } else {\n const faces = k.getSubShapes(skinned, 'face')\n if (faces.length !== 1) {\n throw new Error(\n `[cq-compat] splineFace: expected a single face from the row loft, got ${faces.length}`,\n )\n }\n face = faces[0]\n }\n return clone(wp, { shape: fromHandle(face) })\n}\n\n/**\n * helix — create a helical wire on the workplane (origin = `wp.origin`, axis =\n * `wp.normal`). Equivalent to CadQuery `Workplane().makeHelix(pitch, height,\n * radius, ...)`.\n *\n * @param wp - Workplane (origin + normal define the helix axis)\n * @param pitch - axial advance per full turn (mm)\n * @param height - total helix height (mm)\n * @param radius - helix radius (mm)\n * @param opts - `{ leftHanded?: boolean }` (default right-handed)\n * @returns Workplane with the helix wire as `.shape`\n */\nexport async function helix(\n wp: Workplane,\n pitch: number,\n height: number,\n radius: number,\n opts?: { leftHanded?: boolean },\n): Promise<Workplane> {\n const kernel = getKernel() as unknown as OcctKernel\n const axis: [number, number, number] = opts?.leftHanded\n ? [-wp.normal[0], -wp.normal[1], -wp.normal[2]]\n : wp.normal\n const raw = (\n kernel as unknown as {\n makeHelixWire: (\n origin: { x: number; y: number; z: number },\n axis: { x: number; y: number; z: number },\n pitch: number,\n height: number,\n radius: number,\n ) => ShapeHandle\n }\n ).makeHelixWire(v3(wp.origin), v3(axis), pitch, height, radius)\n return clone(wp, { shape: fromHandle(raw) })\n}\n\n/**\n * splitFace — split the workplane's current shape by a plane and keep one side.\n * Equivalent to CadQuery `face.split(plane)` / `split(keepTop)`.\n *\n * Internally builds a half-space tool (`occt-wasm` `halfSpace`) from the plane\n * and runs `BOPAlgo_Splitter` (`split`); the kept fragment is selected by the\n * signed distance of its bounding-box centre to the plane.\n *\n * @param wp - Workplane whose `.shape` is the face/solid to split\n * @param plane - splitting plane as `{ origin: Vec3; normal: Vec3 }`\n * @param keep - `'top'` (normal side, default) | `'bottom'` (opposite side)\n * @returns Workplane with the kept fragment as `.shape`\n */\nexport async function splitFace(\n wp: Workplane,\n plane: { origin: [number, number, number]; normal: [number, number, number] },\n keep: 'top' | 'bottom' = 'top',\n): Promise<Workplane> {\n if (!wp.shape) throw new Error('[cq-compat] splitFace: wp.shape is required')\n const handle = brepOf(wp.shape)\n if (!handle) throw new Error('[cq-compat] splitFace: BREP unavailable')\n const kernel = getKernel() as unknown as OcctKernel\n const n = plane.normal\n const nLen = Math.hypot(n[0], n[1], n[2]) || 1\n const un: [number, number, number] = [n[0] / nLen, n[1] / nLen, n[2] / nLen]\n const tool = (\n kernel as unknown as {\n halfSpace: (\n o: { x: number; y: number; z: number },\n nrm: { x: number; y: number; z: number },\n ) => ShapeHandle\n }\n ).halfSpace(v3(plane.origin), v3(un))\n const compound = (\n kernel as unknown as { split: (s: ShapeHandle, tools: ShapeHandle[]) => ShapeHandle }\n ).split(handle as unknown as ShapeHandle, [tool])\n const subType = hasSolidBase(wp.shape) ? 'solid' : 'face'\n let frags = kernel.getSubShapes(compound, subType) as unknown as ShapeHandle[]\n if (!frags || frags.length === 0) {\n frags = kernel.getSubShapes(compound, 'face') as unknown as ShapeHandle[]\n }\n const signedDist = (f: ShapeHandle): number => {\n const bb = kernel.getBoundingBox(f)\n const cx = (bb.xmin + bb.xmax) / 2\n const cy = (bb.ymin + bb.ymax) / 2\n const cz = (bb.zmin + bb.zmax) / 2\n return (cx - plane.origin[0]) * un[0] + (cy - plane.origin[1]) * un[1] + (cz - plane.origin[2]) * un[2]\n }\n const chosen = frags.filter((f) => (keep === 'top' ? signedDist(f) >= 0 : signedDist(f) < 0))\n if (chosen.length === 0) {\n throw new Error('[cq-compat] splitFace: no fragment on the kept side')\n }\n // Robust for a planar split: keep the single fragment, or the one whose\n // centre is furthest from the plane when several match.\n const result = chosen.reduce((a, b) => (Math.abs(signedDist(b)) > Math.abs(signedDist(a)) ? b : a))\n // NOTE: we intentionally do NOT release `compound` / unchosen fragments here —\n // the kept `result` is adopted by fromHandle; freeing the arena slots would\n // invalidate it. The leak is bounded per call (one split).\n return clone(wp, { shape: fromHandle(result) })\n}\n\n/**\n * twistExtrude — extrude a profile while twisting it about the extrusion axis\n * by `angle` (deg) over `height` (mm). Equivalent to CadQuery\n * `Workplane().twistExtrude(profile, angle, height, ...)`.\n *\n * Implemented by sweeping `steps`+1 rotated+translated copies of the profile\n * through `loft` (a smooth, ruled=False loft). The twist axis is `wp.normal`.\n *\n * @param wp - Workplane carrying the profile: either `.shape` (face/wire) or a\n * pending 2D profile (`rect`/`circle`/`pendingWires`), as upstream accepts\n * @param angle - total twist angle over height (deg)\n * @param height - extrusion height (mm)\n * @param opts - `{ steps?: number }` (section count; default scales with |angle|)\n * @returns Workplane with the twisted solid as `.shape`\n */\nexport async function twistExtrude(\n wp: Workplane,\n angle: number,\n height: number,\n opts?: { steps?: number },\n): Promise<Workplane> {\n // Accept either an explicit profile shape or a pending 2D profile\n // (rect/circle/polygon/pendingWires) — mirrors upstream\n // `Workplane().rect(...).twistExtrude(...)`, which reads the pending profile.\n let src = wp\n if (!wp.shape) {\n const hasPendingProfile = (wp.pendingWires ?? []).some((w) => !w.construction)\n if (!hasPendingProfile) {\n throw new Error(\n '[cq-compat] twistExtrude: profile required (set wp.shape or add a pending rect/circle/wire)',\n )\n }\n src = await face(wp)\n }\n const profile = src.shape\n if (!profile) throw new Error('[cq-compat] twistExtrude: profile required')\n const raw = brepOf(profile)\n if (raw === undefined) throw new Error('[cq-compat] twistExtrude: BREP unavailable')\n const handle = raw as unknown as ShapeHandle\n const steps = opts?.steps ?? Math.max(8, Math.ceil(Math.abs(angle) / 15))\n const axis = src.normal\n const kernel = getKernel() as unknown as OcctKernel\n const k = kernel as unknown as {\n copy: (s: ShapeHandle) => ShapeHandle\n rotate: (\n s: ShapeHandle,\n axis: {\n point: { x: number; y: number; z: number }\n direction: { x: number; y: number; z: number }\n },\n a: number,\n ) => ShapeHandle\n translate: (s: ShapeHandle, dx: number, dy: number, dz: number) => ShapeHandle\n }\n // Native rotate takes radians; rotate about the extrusion axis through the\n // workplane origin so the profile twists in place (no translation drift).\n const base = k.copy(handle)\n const DEG2RAD = Math.PI / 180\n const sections: Workplane[] = []\n for (let i = 0; i <= steps; i++) {\n const t = i / steps\n const rot = k.rotate(base, { point: v3(src.origin), direction: v3(axis) }, angle * t * DEG2RAD)\n const tr = k.translate(rot, axis[0] * height * t, axis[1] * height * t, axis[2] * height * t)\n sections.push(clone(src, { shape: fromHandle(tr), pendingWires: [] }))\n }\n return loft(sections[0], ...sections.slice(1), { ruled: false })\n}\n\n/**\n * solidFromFaces — sew a closed set of faces into a solid on the workplane.\n * Equivalent to CadQuery `cq.Shell.makeShell(faces)` + `Solid.makeSolid(...)`\n * (BRepBuilderAPI_Sewing + BRepBuilderAPI_MakeSolid + orientation fix).\n *\n * This is cq-compat extension E5 (fai_cq_gears port plan §13-6): the existing\n * `shell` op is hollowing (thickening a solid), not sewing face patches into\n * a solid, and gears need the latter after their tooth-face/cap faces are built.\n *\n * @param wp - Workplane providing the result's coordinate frame (origin/normal)\n * @param faces - Workplanes whose `.shape` are the faces to sew (each must be a face)\n * @param opts - `{ sewingTolerance?: number (default 1e-2, cq shell_sewing_tol);\n * fixOrientations?: boolean (default true) }`. `sew` does not guarantee\n * consistent face orientation — a loft-skinned tooth face can come out\n * inward-facing, making the sewn solid carry negative volume — so\n * `fixFaceOrientations` runs by default. If the fixed shape degrades back to\n * a shell (observed on micro-gap shells that only close via the sewing\n * tolerance), the pre-fix `makeSolid` result is kept instead.\n * @returns Workplane with the sewn solid as `.shape`\n */\nexport async function solidFromFaces(\n wp: Workplane,\n faces: Workplane[],\n opts?: { sewingTolerance?: number; fixOrientations?: boolean },\n): Promise<Workplane> {\n if (faces.length === 0) throw new Error('[cq-compat] solidFromFaces: faces must be non-empty')\n const handles: ShapeHandle[] = faces.map((f, i) => {\n if (!f.shape) throw new Error(`[cq-compat] solidFromFaces: faces[${i}].shape is required`)\n const h = brepOf(f.shape)\n if (h === undefined) throw new Error(`[cq-compat] solidFromFaces: faces[${i}] BREP unavailable`)\n return h as unknown as ShapeHandle\n })\n const kernel = getKernel() as unknown as OcctKernel\n const k = kernel as unknown as {\n sew: (shapes: ShapeHandle[], tolerance?: number) => ShapeHandle\n makeSolid: (shell: ShapeHandle) => ShapeHandle\n fixFaceOrientations: (shape: ShapeHandle) => ShapeHandle\n isSolid: (s: ShapeHandle) => boolean\n isShell: (s: ShapeHandle) => boolean\n getShapeType: (s: ShapeHandle) => string\n }\n const tol = opts?.sewingTolerance ?? 1e-2\n const shell = k.sew(handles, tol)\n if (!k.isShell(shell) && !k.isSolid(shell)) {\n throw new Error(\n `[cq-compat] solidFromFaces: sew did not produce a shell (got ${k.getShapeType(shell)})`,\n )\n }\n const solid = k.makeSolid(shell)\n let result = solid\n if (opts?.fixOrientations !== false && k.isSolid(solid)) {\n const fixed = k.fixFaceOrientations(solid)\n if (k.isSolid(fixed)) result = fixed\n }\n if (!k.isSolid(result)) {\n throw new Error(\n `[cq-compat] solidFromFaces: result is not a solid (got ${k.getShapeType(result)})`,\n )\n }\n return clone(wp, { shape: fromHandle(result), pendingWires: [] })\n}\n\n/** Endpoints of a curve edge (parameter-space — B-spline edges carry no\n * explicit vertices, so `curveParameters` + `curvePointAtParam` is the only\n * reliable endpoint path; the vertex fallback covers degenerate edges). */\nfunction edgeEndsRaw(\n k: OcctKernel,\n edge: ShapeHandle,\n): { edge: ShapeHandle; a: { x: number; y: number; z: number }; b: { x: number; y: number; z: number } } {\n try {\n const { first, last } = k.curveParameters(edge)\n return { edge, a: k.curvePointAtParam(edge, first), b: k.curvePointAtParam(edge, last) }\n } catch {\n const vs = k.getSubShapes(edge, 'vertex')\n if (vs.length < 2) {\n const p = k.vertexPosition(vs[0])\n return { edge, a: p, b: p }\n }\n return { edge, a: k.vertexPosition(vs[0]), b: k.vertexPosition(vs[1]) }\n }\n}\n\n/**\n * planarCap — build a planar cap face from the boundary edges of the given\n * faces that lie on the plane `origin · normal = d`, then set it as the\n * workplane shape. Equivalent to CadQuery gears' `planarCapAtZ` /\n * `Face.makeFromWires(Wire.combine(boundaryEdges, tol))`.\n *\n * This is cq-compat extension E6 (fai_cq_gears port plan §13-6): the existing\n * `wire`/`face` ops only consume pending drawing descriptors, not edges that\n * already exist inside kernel shapes — gears need to close their tooth-face\n * patches with end caps built from those edges.\n *\n * Edge chaining ports the proven TS re-implementation of OCCT's\n * `ShapeAnalysis_FreeBounds::ConnectEdgesToWires`: unordered edges are chained\n * by endpoint proximity within `tol` (kernel `makeWire` silently drops edges\n * when gaps exceed OCCT precision, so in-tolerance gaps are bridged with a\n * line segment — same as upstream).\n *\n * @param wp - Workplane providing the result's coordinate frame\n * @param faces - Workplanes whose `.shape` are the faces supplying boundary edges\n * @param plane - cap plane: `{ origin, normal }`; the plane offset is taken\n * from `origin` (edges whose bounding box lies within `pickTolerance` of the\n * plane are collected)\n * @param opts - `{ combineTolerance?: number (default 1e-2, cq wire_comb_tol);\n * pickTolerance?: number (default 1e-6) }`\n * @returns Workplane with the cap face as `.shape`\n */\nexport async function planarCap(\n wp: Workplane,\n faces: Workplane[],\n plane: { origin: [number, number, number]; normal: [number, number, number] },\n opts?: { combineTolerance?: number; pickTolerance?: number },\n): Promise<Workplane> {\n if (faces.length === 0) throw new Error('[cq-compat] planarCap: faces must be non-empty')\n const kernel = getKernel() as unknown as OcctKernel\n const k = kernel as unknown as {\n getSubShapes: (s: ShapeHandle, type: 'edge' | 'vertex') => ShapeHandle[]\n getBoundingBox: (s: ShapeHandle) => { xmin: number; xmax: number; ymin: number; ymax: number; zmin: number; zmax: number }\n curveParameters: (e: ShapeHandle) => { first: number; last: number }\n curvePointAtParam: (e: ShapeHandle, p: number) => { x: number; y: number; z: number }\n vertexPosition: (v: ShapeHandle) => { x: number; y: number; z: number }\n makeLineEdge: (a: { x: number; y: number; z: number }, b: { x: number; y: number; z: number }) => ShapeHandle\n makeWire: (edges: ShapeHandle[]) => ShapeHandle\n makeFace: (wire: ShapeHandle) => ShapeHandle\n healWire: (wire: ShapeHandle, tol: number) => ShapeHandle\n reverseShape: (s: ShapeHandle) => ShapeHandle\n }\n const n = plane.normal\n const nLen = Math.hypot(n[0], n[1], n[2]) || 1\n const un = [n[0] / nLen, n[1] / nLen, n[2] / nLen]\n const d = plane.origin[0] * un[0] + plane.origin[1] * un[1] + plane.origin[2] * un[2]\n const pickTol = opts?.pickTolerance ?? 1e-6\n const tol = opts?.combineTolerance ?? 1e-2\n\n // 1) Collect boundary edges lying on the plane (signed distance of the\n // edge bbox centre within pickTol). Faces share their common edges, so\n // deduplicate by the numeric kernel handle.\n const seen = new Set<number>()\n const onPlane: ShapeHandle[] = []\n for (const f of faces) {\n if (!f.shape) throw new Error('[cq-compat] planarCap: faces[i].shape is required')\n const fh = brepOf(f.shape)\n if (fh === undefined) throw new Error('[cq-compat] planarCap: faces[i] BREP unavailable')\n for (const e of k.getSubShapes(fh as unknown as ShapeHandle, 'edge')) {\n const id = e as unknown as number\n if (seen.has(id)) continue\n const bb = k.getBoundingBox(e)\n const cx = (bb.xmin + bb.xmax) / 2\n const cy = (bb.ymin + bb.ymax) / 2\n const cz = (bb.zmin + bb.zmax) / 2\n // Max plane distance over the whole bbox = |centre·n − d| + projection\n // of the half-extents onto the normal. Requiring this ≤ pickTol keeps\n // only edges that lie entirely flat on the plane (a merely-centred or\n // crossing vertical edge is rejected).\n const hx = (bb.xmax - bb.xmin) / 2\n const hy = (bb.ymax - bb.ymin) / 2\n const hz = (bb.zmax - bb.zmin) / 2\n const dist = Math.abs(cx * un[0] + cy * un[1] + cz * un[2] - d)\n + hx * Math.abs(un[0]) + hy * Math.abs(un[1]) + hz * Math.abs(un[2])\n if (dist <= pickTol) {\n seen.add(id)\n onPlane.push(e)\n }\n }\n }\n if (onPlane.length === 0) throw new Error('[cq-compat] planarCap: no boundary edges found on plane')\n\n // 2) Chain unordered edges into closed wires (ConnectEdgesToWires port).\n const pool = onPlane.map((e) => edgeEndsRaw(k as unknown as OcctKernel, e))\n const dist3 = (a: { x: number; y: number; z: number }, b: { x: number; y: number; z: number }) =>\n Math.hypot(a.x - b.x, a.y - b.y, a.z - b.z)\n const used = new Array<boolean>(pool.length).fill(false)\n const wires: ShapeHandle[] = []\n for (let start = 0; start < pool.length; start++) {\n if (used[start]) continue\n used[start] = true\n const chain: ShapeHandle[] = [pool[start].edge]\n let tail = pool[start].b\n const head = pool[start].a\n for (;;) {\n let found = -1\n let best = Infinity\n for (let j = 0; j < pool.length; j++) {\n if (used[j]) continue\n const dj = Math.min(dist3(pool[j].a, tail), dist3(pool[j].b, tail))\n if (dj <= tol && dj < best) { best = dj; found = j }\n }\n if (found < 0) break\n used[found] = true\n const e = pool[found]\n const flip = dist3(e.a, tail) <= dist3(e.b, tail)\n if (best > 1e-7) chain.push(k.makeLineEdge(tail, flip ? e.a : e.b))\n chain.push(flip ? e.edge : k.reverseShape(e.edge))\n tail = flip ? e.b : e.a\n if (dist3(tail, head) <= tol) break\n }\n const endGap = dist3(tail, head)\n if (chain.length > 1 && endGap > 1e-7 && endGap <= tol) chain.push(k.makeLineEdge(tail, head))\n wires.push(k.makeWire(chain))\n }\n if (wires.length !== 1) {\n throw new Error(\n `[cq-compat] planarCap: expected one closed loop on plane, got ${wires.length} wires from ${onPlane.length} edges`,\n )\n }\n\n // 3) Heal + make the cap face.\n const face = k.makeFace(k.healWire(wires[0], tol))\n return clone(wp, { shape: fromHandle(face), pendingWires: [] })\n}\n"]}
|