type SectionAxis = 'x' | 'y' | 'z'; /** A clipping section: cut perpendicular to `axis` at `frac` (0..1) of that axis's bbox span. */ export interface SectionSpec { axis: SectionAxis; frac: number; } /** A numbered label anchored at a 3D feature, projected per-view into the render (Set-of-Marks). */ export interface Mark { label: string; pos: readonly [number, number, number]; } interface MarkBody { index: number; bounds?: { xMin: number; xMax: number; yMin: number; yMax: number; zMin: number; zMax: number; } | undefined; } interface MarkBore { axisOrigin: readonly [number, number, number]; } /** * Kernel-anchored marks for the judge: `B` at each body's bbox centroid (only for multi-body * parts — a single body needs no label) and `H1..` at each bore's axis. The same id lands on the same * feature across every view (it's a 3D anchor projected per-view), giving the judge view-invariant, * part-space addressing without per-body mesh color. * * Body labels use the body's INDEX (0-based), matching how the measured-facts digest refers to bodies * ("bodies 0&1: interfering"), so the judge can cross-reference a mark with the facts. A body that * can't be located (no bounds) simply gets no mark — there is no resequenced gap. */ export declare function featureMarks(bodies: readonly MarkBody[], bores: readonly MarkBore[]): Mark[]; interface AimBore { radius: number; axisOrigin: readonly [number, number, number]; axisDir: readonly [number, number, number]; } interface AimBounds { xMin: number; xMax: number; yMin: number; yMax: number; zMin: number; zMax: number; } /** * Aim a section cut through the dominant (largest-radius) bore: cut on the basis axis MOST * perpendicular to the bore axis, positioned to pass THROUGH the bore origin — so the bore opens as * a clean cross-section (reads wall thickness, where the xray is cluttered). Returns null when there * are no bores or no bounds. Plain structural inputs keep this decoupled from the verify report. */ export declare function aimedSection(bores: readonly AimBore[], bounds: AimBounds | undefined): SectionSpec | null; export {};