import { Group, Box3, BufferGeometry, MeshStandardMaterial, Mesh, Box3Helper, LineBasicMaterial, PlaneGeometry, Vector3, Plane, Raycaster } from 'three';
import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js';
import { type IViewer } from '../../IViewer.js';
import { Extension } from './Extension.js';
import { CameraController } from './CameraController.js';
export declare enum SectionToolEvent {
    DragStart = "section-box-drag-start",
    DragEnd = "section-box-drag-end",
    Updated = "section-box-changed"
}
export interface SectionToolEventPayload {
    [SectionToolEvent.DragStart]: void;
    [SectionToolEvent.DragEnd]: void;
    [SectionToolEvent.Updated]: Plane[];
}
export declare class SectionTool extends Extension {
    protected cameraProvider: CameraController;
    get inject(): (typeof CameraController)[];
    protected dragging: boolean;
    protected display: Group;
    protected boxGeometry: BufferGeometry;
    protected boxMaterial: MeshStandardMaterial;
    protected boxMesh: Mesh;
    protected boxMeshHelper: Box3Helper;
    protected boxMeshHelperMaterial: LineBasicMaterial;
    protected plane: PlaneGeometry;
    protected hoverPlane: Mesh;
    protected sphere: Mesh;
    protected sidesSimple: {
        [id: string]: {
            verts: number[];
            axis: string;
        };
    };
    protected currentRange: number[] | null;
    protected planes: Plane[];
    protected prevPosition: Vector3 | null;
    protected attachedToBox: boolean;
    protected controls: TransformControls;
    protected allowSelection: boolean;
    protected raycaster: Raycaster;
    get enabled(): boolean;
    set enabled(value: boolean);
    get visible(): boolean;
    set visible(value: boolean);
    constructor(viewer: IViewer, cameraProvider: CameraController);
    on<T extends SectionToolEvent>(eventType: T, listener: (arg: SectionToolEventPayload[T]) => void): void;
    private _setupControls;
    private _draggingChangeHandler;
    private clickHandler;
    private _generateSimpleCube;
    private _generateOrUpdatePlanes;
    private _attachControlsToBox;
    getBox(): Box3;
    setBox(targetBox: Box3, offset?: number): void;
    toggle(): void;
}
