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; abstract raycast(_raycaster: Raycaster, _intersects: Array): 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; }