import { Vector3D } from '@google/model-viewer/lib/model-viewer-base';
import { Euler, Group, Line, Matrix4, Vector3 } from 'three';
import { EventEmitter } from 'events';
import { EulerYXZ } from './eulerYXZ';
import { Sensor } from './sensor';
export declare class MeasurementTool extends EventEmitter {
    private _isEditModeActive;
    private _measurementPoints;
    private _measuredLength;
    private _currentOrientation;
    private _currentTranslation;
    private _imageSensor;
    private _imageCamOrientation;
    private _measurementDistances;
    private _showMeasurementDistances;
    private _sceneElementGroup;
    set imageSensor(sensor: Sensor);
    set imageCamOrientation(imageCamOrientation: Matrix4);
    get sceneElementGroup(): Group;
    set isEditModeActive(isEditModeActive: boolean);
    get isEditModeActive(): boolean;
    get numPoints(): number;
    get measurementPoints(): MeasurementPoint[];
    get measurementDistances(): MeasurementDistance[];
    get measuredLength(): number;
    set translation(translation: Vector3);
    set eulerOrientation(orientation: EulerYXZ);
    addPointFromImage(imageXCoor: number, imageYCoor: number): void;
    addPointFrom3DScene(position: Vector3D, normal: Vector3D, updateHotspotInImage?: boolean, label?: string | number): void;
    resetPoints(): void;
    showPoints(): void;
    hidePoints(): void;
    get showMeasurementDistances(): boolean;
    set showMeasurementDistances(value: boolean);
    saveMeasurement(format?: 'csv' | 'json'): void;
    loadMeasurement(url: string): Promise<void>;
    private _updateHotspotInImage;
}
export declare class MeasurementSceneLineElement {
    private _distanceLine;
    private _lineGeometry;
    private _lineMaterial;
    private _translation;
    private _pointsInModelCoor;
    constructor();
    get lineElement(): Line;
    addPoint(point: Vector3, translationInScene: Vector3, sceneOrientation: Euler): void;
    addPointInModelCoor(point: Vector3, translationInScene: Vector3, sceneOrientation: Euler): void;
    setTranslation(translation: Vector3): void;
    setEulerOrientation(orientation: Euler): void;
    set opacity(value: number);
    show(): void;
    hide(): void;
    reset(): void;
}
export declare class MeasurementDistance {
    private _sceneLineElement;
    private _distanceAnnotation;
    private _numVisiblePoints;
    private _isHidden;
    constructor(index: number, startPoint: MeasurementPoint, endPoint: MeasurementPoint, translationInScene: Vector3, sceneOrientation: Euler);
    get distance(): number;
    get sceneElement(): Line;
    get annotationElement(): HTMLButtonElement;
    translate(translation: Vector3): void;
    changeSceneOrientation(orientation: Euler): void;
    show(): void;
    hide(): void;
    reset(): void;
    private _handlePointVisibilityChanged;
    private _updateAnnotationVisibility;
}
export declare class SceneHotspotElement extends EventEmitter {
    protected _domElement: HTMLButtonElement;
    private _positionInModelCoor;
    private _positionInSceneCoor;
    private _normalInModelCoor;
    private _normalInSceneCoor;
    constructor(positionInScene: Vector3, normalInScene: Vector3, sceneOrientation: Euler);
    get domElement(): HTMLButtonElement;
    get positionInModelCoor(): Vector3;
    get positionInSceneCoor(): Vector3;
    get normalInSceneCoor(): Vector3;
    get positionInSceneCoorAsString(): string;
    get normalInSceneCoorAsString(): string;
    updatePosition(sceneOrientation: Euler): void;
    show(): void;
    hide(): void;
    delete(): void;
    private _handleFocusChanged;
}
export declare class MeasurementPoint extends SceneHotspotElement {
    constructor(label: string | number, position: Vector3, normal: Vector3, sceneOrientation: Euler);
    set label(value: string);
    get label(): string;
    distanceTo(measurementPoint: MeasurementPoint): number;
}
export declare class MeasurementDistanceAnnotation extends SceneHotspotElement {
    private _distance;
    constructor(index: number, distance: number, position: Vector3, normal: Vector3, sceneOrientation: Euler);
    get distance(): number;
}
export type Measurement = {
    pos: number[];
    normal: number[];
    distance?: number;
    label: string;
}[];
