import { Box3, Camera, Object3D, Plane, Raycaster, Vector2, Vector3, type Intersection } from 'three';
import { ExtendedMeshIntersection } from '../../objects/SpeckleRaycaster.js';
import { MeasurementData, MeasurementType } from '@speckle/shared/viewer/state';
export declare enum MeasurementState {
    HIDDEN = 0,
    DANGLING_START = 1,
    DANGLING_END = 2,
    COMPLETE = 3
}
export declare abstract class Measurement extends Object3D {
    startPoint: Vector3;
    endPoint: Vector3;
    startNormal: Vector3;
    endNormal: Vector3;
    startLineLength: number;
    endLineLength: number;
    value: number;
    units: string;
    precision: number;
    measurementId: string;
    protected _state: MeasurementState;
    protected renderingCamera: Camera | null;
    protected renderingSize: Vector2;
    constructor();
    set state(value: MeasurementState);
    get state(): MeasurementState;
    abstract set isVisible(value: boolean);
    abstract get measurementType(): MeasurementType;
    get bounds(): Box3;
    frameUpdate(camera: Camera | null, size: Vector2, _bounds?: Box3): void;
    abstract update(): Promise<void>;
    abstract raycast(_raycaster: Raycaster, _intersects: Array<Intersection>): void;
    abstract highlight(_value: boolean): void;
    abstract updateClippingPlanes(_planes: Plane[]): void;
    abstract locationUpdated(point?: Vector3, normal?: Vector3, ndcScreen?: Vector2): void;
    abstract locationSelected(point?: Vector3, normal?: Vector3, ndcScreen?: Vector2): void;
    snap?(ndcPoint: Vector2, intersection: ExtendedMeshIntersection, outPoint: Vector3, outNormal: Vector3): boolean;
    toMeasurementData(): MeasurementData;
    fromMeasurementData(data: MeasurementData): void;
}
