export interface PrototypeField { name: string; kind: 'Float' | 'ScaledInteger' | 'Integer'; precision?: 'single' | 'double'; scale?: number; offset?: number; minimum?: number; maximum?: number; } /** * Per-scan pose: rotation (unit quaternion w + xi + yj + zk) + * translation (in source-frame metres). Optional because most * single-scan exports don't need one — when absent we treat the * scan as already in the file's global frame (identity pose). */ export interface E57Pose { rotation: { w: number; x: number; y: number; z: number; }; translation: { x: number; y: number; z: number; }; } export interface Data3DEntry { guid: string; name?: string; recordCount: number; /** Logical offset into the file where the binary section begins. */ binaryFileOffset: number; /** Field declarations in record order. */ prototype: PrototypeField[]; /** * Per-Data3D pose that places the scan into the file's global * frame. Applied by `decodeE57` before merging multi-scan files; * single-scan files where the pose is identity / absent are no-ops. */ pose?: E57Pose; } /** * Parse the E57 XML section. * * Uses our own minimal SAX-style parser (`xml-mini.ts`) instead of * `DOMParser` because dedicated Web Workers — where the decode runs — * don't expose DOMParser. The shape we need (e57Root → data3D → * vectorChild → prototype) is shallow and attribute-heavy, well within * the mini parser's scope. */ export declare function parseE57Xml(xmlText: string): Data3DEntry[]; export declare function findField(proto: PrototypeField[], name: string): PrototypeField | undefined; //# sourceMappingURL=e57-xml.d.ts.map