import { EventType, Handler, WildcardHandler } from 'mitt';
import { Canvas } from './canvas';
import { Options, PenPlugin, PluginOptions } from './options';
import { calcTextDrawRect, calcTextLines, calcTextRect, facePen, getWords, LockState, Pen, renderPenRaw, IValue, setElemPosition } from './pen';
import { Point } from './point';
import { EditAction, register, registerAnchors, registerCanvasDraw, registerGridDrawer, unregisterGridDrawer, Meta2dData, Meta2dStore, Network, HttpOptions, Sql } from './store';
import { Padding } from './utils';
import { Rect } from './rect';
import { Event, TriggerCondition } from './event';
import { ViewMap } from './map';
import { MqttClient } from 'mqtt';
import { MessageOptions } from './message';
export declare class Meta2d {
    store: Meta2dStore;
    canvas: Canvas;
    websocket: WebSocket;
    mqttClient: MqttClient;
    websockets: WebSocket[];
    mqttClients: MqttClient[];
    eventSources: EventSource[];
    penPluginMap: Map<PenPlugin, {
        tag?: string;
        name?: string;
        id?: string;
        option: Object;
    }[]>;
    socketFn: (e: string, context?: {
        meta2d?: Meta2d;
        type?: string;
        topic?: string;
        url?: string;
        method?: string;
        net?: any;
    }) => boolean | string;
    events: Record<number, (pen: Pen, e: Event, params?: any) => void>;
    map: ViewMap;
    mapTimer: any;
    /**
     * fillView 首次填充前各 fit 顶层图元的原始几何快照（设计坐标系，与 scale/origin 无关）。
     * 用于保证多次调用 fillView 的幂等性：每次填充前先还原到原始几何，再执行拉伸，
     * 避免在已拉伸的结果上重复拉伸导致超出屏幕。open 新图纸时置空。
     */
    fillViewSnapshot: Map<string, any> | null;
    constructor(parent: string | HTMLElement, opts?: Options);
    facePen: typeof facePen;
    getWords: typeof getWords;
    calcTextLines: typeof calcTextLines;
    calcTextRect: typeof calcTextRect;
    calcTextDrawRect: typeof calcTextDrawRect;
    /**
     * @deprecated 改用 beforeAddPens
     */
    get beforeAddPen(): (pen: Pen) => boolean;
    /**
     * @deprecated 改用 beforeAddPens
     */
    set beforeAddPen(fn: (pen: Pen) => boolean);
    get beforeAddPens(): (pens: Pen[]) => Promise<boolean>;
    set beforeAddPens(fn: (pens: Pen[]) => Promise<boolean>);
    get beforeAddAnchor(): (pen: Pen, anchor: Point) => Promise<boolean>;
    set beforeAddAnchor(fn: (pen: Pen, anchor: Point) => Promise<boolean>);
    get beforeRemovePens(): (pens: Pen[]) => Promise<boolean>;
    set beforeRemovePens(fn: (pens: Pen[]) => Promise<boolean>);
    get beforeRemoveAnchor(): (pen: Pen, anchor: Point) => Promise<boolean>;
    set beforeRemoveAnchor(fn: (pen: Pen, anchor: Point) => Promise<boolean>);
    setOptions(opts?: Options): void;
    getOptions(): Options;
    /**
     * @description
     * @author Joseph Ho
     * @date 21/02/2025
     * @param {string} themeName 主题名
     * @param {object} theme 主题变量字符串数组
     * @returns {*}
     * @memberof Meta2d
     */
    registerTheme(themeName: string, theme: object): void;
    setTheme(theme: string): void;
    setDatabyOptions(options?: Options): void;
    private init;
    initEventFns(): void;
    getSendData(data: any[], cpen?: Pen): any;
    convertType(value: string, type: string): any;
    getEventData(list: any, pen: Pen): any;
    message(options: MessageOptions): void;
    closeAll(): void;
    navigatorTo(id: string): Promise<void>;
    doSendDataEvent(value: any, topics?: string): void;
    sendDataToNetWork(value: any, pen: Pen, e: any): Promise<void>;
    resize(width?: number, height?: number): void;
    /**
     *
     * @param emit 是否发送消息
     */
    addPen(pen: Pen, history?: boolean, emit?: boolean, abs?: boolean): Promise<Pen>;
    addPenSync(pen: Pen, history?: boolean, emit?: boolean, abs?: boolean): Pen;
    addPensSync(pens: Pen[], history?: boolean, abs?: boolean): Pen[];
    addPens(pens: Pen[], history?: boolean, abs?: boolean): Promise<Pen[]>;
    render(patchFlags?: boolean | number): void;
    setBackgroundImage(url: string, data?: any): Promise<void>;
    setBackgroundColor(color?: string): void;
    setGrid({ grid, gridColor, gridSize, gridRotate, gridType, gridScope, }?: {
        grid?: boolean;
        gridColor?: string;
        gridSize?: number;
        gridRotate?: number;
        gridType?: string;
        gridScope?: 'full' | 'inner' | 'outer';
    }): void;
    setRule({ rule, ruleColor, }?: {
        rule?: boolean;
        ruleColor?: string;
    }): void;
    open(data?: Meta2dData, render?: boolean): void;
    dirtyData(active?: boolean): any[];
    clearDirtyData(): void;
    cacheData(id: string): void;
    loadCacheData(id: string): void;
    loadLineAnimateDraws(): void;
    statistics(): {
        图元总数量: number;
        图片图元数量: number;
        图片图元绘制数量: number;
        dom图元数量: number;
        正在执行的动画数量: number;
        数据点数量: number;
    };
    initBindDatas(): void;
    jetLinksList: any[];
    jetLinksClient: any;
    initBinds(): void;
    connectSocket(): void;
    /**
     * open 后执行初始化 Js ，每个图纸可配置一个初始化 js
     */
    private doInitJS;
    doInitFn(): void;
    drawLine(lineName?: string): void;
    alignPenToGrid(pen: Pen): void;
    drawingPencil(): void;
    stopPencil(): void;
    lock(lock: LockState): void;
    finishDrawLine(end?: boolean): Promise<void>;
    finishPencil(): Promise<void>;
    updateLineType(pen: Pen, lineName: string): void;
    addDrawLineFn(fnName: string, fn: Function): void;
    removeDrawLineFn(fnName: string): void;
    showMagnifier(): void;
    hideMagnifier(): void;
    toggleMagnifier(): void;
    /**
     * 擦除画布，释放 store 上的 pens
     * @param render 是否重绘
     */
    clear(render?: boolean, template?: string): void;
    emit<T = any>(type: EventType, event?: T): void;
    emit(type: '*', event?: any): void;
    on<T = any>(type: EventType, handler: Handler<T>): Meta2d;
    on(type: '*', handler: WildcardHandler): Meta2d;
    off<T = any>(type: EventType, handler: Handler<T>): Meta2d;
    off(type: '*', handler: WildcardHandler): Meta2d;
    register: typeof register;
    registerCanvasDraw: typeof registerCanvasDraw;
    registerAnchors: typeof registerAnchors;
    registerGridDrawer: typeof registerGridDrawer;
    unregisterGridDrawer: typeof unregisterGridDrawer;
    registerLineAnimateDraws: (name: any, drawFunc: any) => void;
    updateLineAnimateDraws(name: any, option: any): void;
    registerMoveDock(dock: (store: Meta2dStore, rect: Rect, pens: Pen[], offset: Point) => {
        xDock: Point;
        yDock: Point;
    }): void;
    /**
     * 参数同方法 registerMoveDock ，最后一个参数由 offset 偏移修改成了当前 resize 的点
     */
    registerResizeDock(dock: (store: Meta2dStore, rect: Rect, pens: Pen[], resizeIndex: number) => {
        xDock: Point;
        yDock: Point;
    }): void;
    find(id: string): Pen[];
    find(tag: string): Pen[];
    /**
     * 使用 Array.find 找到即返回，否则返回 undefined
     */
    findOne(id: string): Pen | undefined;
    findOne(tag: string): Pen | undefined;
    getPenRect(pen: Pen): {
        x: number;
        y: number;
        width: number;
        height: number;
    };
    setPenRect(pen: Pen, rect: Rect, render?: boolean): void;
    startAnimate(idOrTagOrPens?: string | Pen[], params?: number | string): void;
    pauseAnimate(idOrTagOrPens?: string | Pen[]): void;
    stopAnimate(idOrTagOrPens?: string | Pen[]): void;
    startVideo(idOrTagOrPens?: string | Pen[]): void;
    pauseVideo(idOrTagOrPens?: string | Pen[]): void;
    stopVideo(idOrTagOrPens?: string | Pen[]): void;
    calcAnimateDuration(pen: Pen): number;
    /**
     * 组合
     * @param pens 组合的画笔们
     * @param showChild 组合后展示第几个孩子
     * @param active 是否激活组合后的画笔
     */
    combine(pens?: Pen[], showChild?: number, active?: boolean): any;
    uncombine(pen?: Pen): void;
    clearCombine(pen?: Pen): void;
    appendChild(pens?: Pen[]): void;
    /***
     * 修改子图元大小，更新整个组合图元
     * @param rect 新的大小 世界坐标
     * @param child 待更新子图元
     * @param parent 父图元
     */
    updateRectbyChild(rect: Rect, child: Pen, parent: Pen): void;
    isCombine(pen: Pen): boolean;
    active(pens: Pen[], emit?: boolean): void;
    inactive(): void;
    activeAll(): void;
    focus(id: string): void;
    /**
     * 删除画笔
     * @param pens 需要删除的画笔们
     * @param canDelLocked 是否删除已经锁住的画笔
     */
    delete(pens?: Pen[], canDelLocked?: boolean, history?: boolean): void;
    deleteSync(pens?: Pen[], canDelLocked?: boolean, history?: boolean): void;
    scale(scale: number, center?: {
        x: number;
        y: number;
    }): void;
    translate(x: number, y: number): void;
    translatePens(pens: Pen[], x: number, y: number): void;
    getParent(pen: Pen, root?: boolean): Pen;
    getAllChildren(pen: Pen): Pen[];
    getAllFollowers(pen: Pen): Pen[];
    data(): Meta2dData;
    copy(pens?: Pen[]): void;
    cut(pens?: Pen[]): void;
    paste(): void;
    undo(): void;
    redo(): void;
    listenSocket(): boolean;
    websocketTimes: number;
    connectWebsocket(websocket?: string): void;
    closeWebsocket(): void;
    mqttTimes: number;
    connectMqtt(params?: {
        mqtt: string;
        mqttTopics: string;
        mqttOptions?: {
            clientId?: string;
            username?: string;
            password?: string;
            customClientId?: boolean;
        };
    }): void;
    closeMqtt(): void;
    httpTimer: any;
    httpTimerList: any[];
    connectHttp(): void;
    oldRequestHttp(_req: HttpOptions): Promise<void>;
    sendDatabyHttp(data: string): Promise<void>;
    closeHttp(): void;
    updateTimer: any;
    updateTimerList: any[];
    sqlTimerList: any[];
    connectNetwork(): void;
    reconnectNetwork(index: number): void;
    iotMqttClient: MqttClient;
    iotTimer: any;
    connectIot(): Promise<void>;
    iotAggregateBuild(item: any): {
        token: string;
        deviceId: any;
        key: any;
        name: string;
    };
    iotAggregatePublish(item: any): void;
    closeIot(): void;
    connectSqls(): void;
    connectSSE(net: Network): Promise<void>;
    closeSSE(): void;
    connectNetMqtt(net: Network): Promise<void>;
    connectNetWebSocket(net: Network): Promise<void>;
    getMqttUrl(): Promise<{
        username: any;
        password: any;
        url: string;
    }>;
    getIotToken(devices: any, type: number, room?: string): Promise<any>;
    unsubscribeIot(token: string, room?: string): Promise<any>;
    doSqlCode(sql: Sql): Promise<void>;
    randomString(e: number): string;
    mockValue(data: any): any;
    dataMock(): void;
    networkMock(): void;
    startDataMock(): void;
    stopDataMock(): void;
    penMock(pen: Pen): void;
    penNetwork(pen: Pen): void;
    getDynamicParam(key: string): any;
    onNetworkConnect(https: Network[]): void;
    requestHttp(_req: Network): Promise<void>;
    closeNetwork(): void;
    socketCallback(message: string, context?: {
        type?: string;
        topic?: string;
        url?: string;
        method?: string;
        name?: string;
        net?: Network;
    }): void;
    setDatas(datas: {
        dataId?: string;
        id?: string;
        value: any;
    }[], { render, doEvent, history, }?: {
        render?: boolean;
        doEvent?: boolean;
        history?: boolean;
    }): void;
    setValue(data: IValue, { render, doEvent, history, }?: {
        render?: boolean;
        doEvent?: boolean;
        history?: boolean;
    }): void;
    /**
     * @deprecated 改用 setValue
     */
    _setValue(data: IValue, history?: boolean): void;
    pushHistory(action: EditAction): void;
    showInput(pen: Pen, rect?: Rect): void;
    hideInput(): void;
    clearDropdownList(): void;
    clearRuleLines(): void;
    private onEvent;
    private doEvent;
    doMessageEvent(eventName: string, data?: any): void;
    doDataEvent: (datas: {
        dataId?: string;
        id?: string;
        value: any;
    }[]) => void;
    initGlobalTriggers(): void;
    initMessageEvents(): void;
    dataJudegeCondition(data: any, key: string, condition: TriggerCondition): boolean;
    judgeCondition(pen: Pen, key: string, condition: TriggerCondition): boolean;
    pushChildren(parent: Pen, children: Pen[]): void;
    renderPenRaw: typeof renderPenRaw;
    toPng(padding?: Padding, callback?: BlobCallback, containBkImg?: boolean, maxWidth?: number): string;
    activeToPng(padding?: Padding, maxWidth?: number): string;
    pensToPng(pens?: Pen[], padding?: Padding, maxWidth?: number): string;
    /**
     * 下载 png
     * @param name 传入参数自带文件后缀名 例如：'test.png'
     * @param padding 上右下左的内边距
     */
    downloadPng(name?: string, padding?: Padding, maxWidth?: number): void;
    downloadSvg(defs?: string[]): void;
    getRect(pens?: Pen[]): Rect;
    hiddenTemplate(): void;
    showTemplate(): void;
    lockTemplate(lock: LockState): void;
    /**
     * 放大到屏幕尺寸，并居中
     * @param fit true，填满但完整展示；false，填满，但长边可能截取（即显示不完整）
     */
    fitView(fit?: boolean, viewPadding?: Padding, fill?: boolean): void;
    fillView(): void;
    scaleView(): void;
    setFits(): void;
    trimPens(): void;
    /**
     * 放大到屏幕尺寸，并居中
     * @param fit true，填满但完整展示；false，填满，但长边可能截取（即显示不完整）
     */
    fitTemplateView(fit?: boolean, viewPadding?: Padding): void;
    fitSizeView(fit?: boolean | string, viewPadding?: Padding, fill?: boolean): void;
    centerSizeView(): void;
    /**
     * 宽度放大到屏幕尺寸，并滚动到最顶部
     *
     */
    scrollView(viewPadding?: Padding, pageMode?: boolean): void;
    screenView(viewPadding?: Padding, WorH?: boolean): void;
    topView(paddingTop?: number): void;
    centerView(): void;
    /**
     * 画布是否有 画笔
     * RuleLine 不算
     */
    hasView(): boolean;
    private getViewCenter;
    /**
     * 大小相同
     * @param pens 画笔们
     */
    beSameByFirst(pens?: Pen[], attribute?: string): void;
    /**
     * 大小相同
     * @param pens 画笔们
     */
    beSameByLast(pens?: Pen[], attribute?: string): void;
    /**
     * 格式刷（样式相同，大小无需一致。）
     * @param pens 画笔们
     */
    formatPainterByFirst(pens?: Pen[]): void;
    /**
     * 格式刷（样式相同，大小无需一致。）
     * @param pens 画笔们
     */
    formatPainterByLast(pens?: Pen[]): void;
    setFormatPainter(): void;
    formatPainter(): void;
    clearFormatPainter(): void;
    alignNodes(align: string, pens?: Pen[], rect?: Rect): void;
    alignNodesV(align: string, pens?: Pen[], whole?: boolean): void;
    /**
     * 对齐画笔，基于第一个画笔
     * @param align 左对齐，右对齐，上对齐，下对齐，居中对齐
     * @param pens
     */
    alignNodesByFirst(align: string, pens?: Pen[]): void;
    /**
     * 对齐画笔，基于最后选中的画笔
     * @param align 左对齐，右对齐，上对齐，下对齐，居中对齐
     * @param pens
     */
    alignNodesByLast(align: string, pens?: Pen[]): void;
    /**
     * 将画笔参照 rect 进行 align 对齐
     * @param align 左对齐，右对齐，上对齐，下对齐，居中对齐
     * @param pen 当前需要对齐的画笔
     * @param rect 参照矩形
     * @returns
     */
    private alignPen;
    /**
     * 水平或垂直方向的均分
     * @param direction 方向，width 说明水平方向间距相同
     * @param pens 节点们，默认全部的
     * @param distance 总的宽 or 高
     */
    private spaceBetweenByDirection;
    spaceBetween(pens?: Pen[], width?: number): void;
    spaceBetweenColumn(pens?: Pen[], height?: number): void;
    layout(pens?: Pen[], width?: number, space?: number): void;
    gotoView(pen: Pen): void;
    animateView(options: {
        x?: number;
        y?: number;
        scale?: number;
        pen?: Pen;
        duration?: number;
        easing?: string;
        center?: Point;
    }): void;
    showMap(): void;
    hideMap(): void;
    onSizeUpdate(): void;
    toggleAnchorMode(): void;
    addAnchorHand(): void;
    removeAnchorHand(): void;
    toggleAnchorHand(): void;
    /**
     * 将该画笔置顶，即放到数组最后，最后绘制即在顶部
     * @param pens pen 置顶的画笔
     */
    top(pens?: Pen | Pen[]): void;
    /**
     * 若本次改变的画笔存在图片，并且在上层 or 下层，需要擦除上层 or 下层
     * 子节点中包含图片，也需要重绘
     * @param pens 本次改变的 pens
     */
    initImageCanvas(pens: Pen[]): void;
    /**
     * 模版图元图层改变
     * @param pens 本次改变的 pens
     */
    initTemplateCanvas(pens: Pen[]): void;
    /**
     * 该画笔置底，即放到数组最前，最后绘制即在底部
     * @param pens 画笔们，注意 pen 必须在该数组内才有效
     */
    bottom(pens?: Pen | Pen[]): void;
    /**
     * data.pens 决定了绘制顺序，即越后面的越在上层
     * 该方法通过区域重叠计算，找出该画笔之后第一个与其重叠的画笔，然后把该画笔放到找出的画笔之后
     * @param pen 画笔
     */
    upByArea(pen: Pen): void;
    specificLayerMove(pen: Pen, type: string): void;
    /**
     * 该画笔上移，即把该画笔在数组中的位置向后移动一个
     * @param pens 画笔
     */
    up(pens?: Pen | Pen[]): void;
    /**
     * 该画笔下移，即把该画笔在该数组中的位置前移一个
     * @param pen 画笔
     */
    down(pens?: Pen | Pen[]): void;
    setLayer(pen: Pen, toIndex: number, pens?: Pen[]): void;
    changePenId(oldId: string, newId: string): void;
    /**
     * 得到与当前节点连接的线
     * @param node 节点，非连线
     * @param type 类型，全部的连接线/入线/出线
     */
    getLines(node: Pen, type?: 'all' | 'in' | 'out'): Pen[];
    /**
     * 得到当前节点的下一个节点，即出口节点数组
     * 得到当前连线的出口节点
     * @param pen 节点或连线
     */
    nextNode(pen: Pen): Pen[];
    /**
     * 得到当前节点的上一个节点，即入口节点数组
     * 得到当前连线的入口节点
     * @param pen 节点或连线
     */
    previousNode(pen: Pen): Pen[];
    /**
     * 获取节点所有的下一个连接关系
     * @param pen
     *
     */
    getNext(pen: Pen): any[];
    /**
     * 为画布添加锚点
     * @param pen 画笔
     * @param anchor 待添加锚点
     * @param index 连线类型 添加锚点到哪个位置
     */
    addAnchor(pen: Pen, anchor: Point, index?: number): void;
    /**
     *
     * @param from 连接节点
     * @param fromAnchor 连接节点锚点
     * @param to 被连接节点
     * @param toAnchor 被连接节点锚点
     */
    connectLine(from: Pen, to: Pen, fromAnchor?: Point, toAnchor?: Point, render?: boolean): Pen;
    /**
     * 生成一个拷贝组合后的 画笔数组（组合图形），不影响原画布画笔，常用作 二次复用的组件
     * @param pens 画笔数组
     * @param showChild 是否作为状态复用（参考 combine showChild）
     * @param anchor 是否产生默认的锚点
     * @returns 组合图形
     */
    toComponent(pens?: Pen[], showChild?: number, anchor?: boolean): Pen[];
    /**
     * @description 安装插件方法
     * @param plugins 插件列表及其配置项
     * @param pen {string | Pen} 接受tag、name、或者Pen对象*/
    installPenPlugins(pen: {
        tag?: string;
        name?: string;
        id?: string;
    }, plugins: PluginOptions[]): void;
    uninstallPenPlugins(pen: {
        tag?: string;
        name?: string;
        id?: string;
    }, plugins: PluginOptions[]): void;
    setVisible(pen: Pen, visible: boolean, render?: boolean): void;
    clearHover(): void;
    closeSocket(): void;
    setElemPosition: typeof setElemPosition;
    setLifeCycleFunc: (pen: Pen, lifeCycle: any, func: Function, del?: boolean) => () => void;
    destroy(onlyData?: boolean): void;
}
