import { Matrix4, Vector2, Vector3 } from "three";
import { Board } from "../../DatabaseServices/Entity/Board";
import { Line } from "../../DatabaseServices/Entity/Line";
import { Polyline } from "../../DatabaseServices/Entity/Polyline";
/** 针对圆弧板的线性切割 */
export declare class LinearCuttingForSweep {
    br: Board;
    splitPl: Polyline;
    /** 点集生成二维刀 */
    static CreateSplitPl(pts: Vector3[]): Polyline;
    /** 生成圆弧板的切割器*/
    constructor(br: Board, splitPl: Polyline);
    /**
     * 进行切割
     * @param {Polyline[]} clipPls 用于切割的刀
     * @returns {[Polyline[], Polyline[], {x:number; y:number}[]]} [切割后轮廓, 切割后路径, 切割后轮廓的偏移值]
     * @第一步 判断当前切割的视图类型
     * @第二步 根据视图类型判断切割的是路径还是面
     * @第三步 把被切割对象(路径与板包围盒)平移到对应视图的平面
     * @第四步 旋转被切割对象到XOY平面
     * @第五步 在XOY平面下进行切割
     */
    Split(ucs: Matrix4, clipPls?: Polyline[]): [Polyline[], Polyline[], {
        x: number;
        y: number;
    }[], number[]];
    /**
     * 切割面
     * @param {Polyline} sweepPathInWCS 放样路径
     * @param {Line[]} brBoxLines 板包围盒
     * @param {Polyline} pathBoxPl 路径包围盒
     * @第一步 计算刀与板包围盒的交点，以及在盒内的顶点，记住采样点
     * @第二步 记录采样点在刀上的位置，并移动到路径所在的平面
     * @第三步 根据采样点生成垂直于XOY平面的直线
     * @第四步 计算这些直线与路径的交点
     * @第五步 将这些交点映射到展开后的路径上
     * @第六步 根据记录的位置排序这些点，并生成新的刀
     */
    SplitInPlane(sweepPathInWCS: Polyline, brBoxLines: Line[], pathBoxPl: Polyline): [Polyline[], Polyline[], {
        x: number;
        y: number;
    }[], number[]];
    /** 判断视图类型 */
    private GetViewStr;
    /** 判断切割的是路径还是面 */
    private IsPathOrPlane;
    /** 获取调整角度(用于处理放样角度带来的影响) */
    private GetAdjustAngle;
    /** 统一板包围盒与路径包围盒一致 */
    private UnifyBrBoxAndPathBox;
    /** 平移路径到对应视图平面 */
    private MovePathToView;
    /** 平移板包围盒到对应视图平面 */
    private MoveBrBoxToView;
    /** 旋转到俯视图下(即XOY平面) */
    private RotateToXOY;
    /** 修正放样角度带来的影响(比如求不到交点) */
    private AdjustForSweepAngle;
    /** 对路径进行细化 */
    private Tessellate;
    /** 规范超出的部分 */
    private AdjustOverBox;
    /** 获取板件坐标系下的放样路径 */
    private GetSweepPathInOCS;
    /** 获取板件坐标系下的放样路径并与板件的边对齐 */
    private GetSweepPathInOCSWithBr;
    /** 求得的板包围盒的交点与盒内的顶点 */
    private GetPtsInbrBox;
    /** 切割路径 */
    SplitInPath(sweepPathInWCS: Polyline): [Polyline[], Polyline[], {
        x: number;
        y: number;
    }[], number[]];
    /** 获取原始位置与切割位置的变换信息 */
    private GetPositionData;
    /** 旋转平移到切割位置 */
    private ToSplitPosition;
    /** 平移旋转到原始位置 */
    private ReSplitPosition;
    /** 用刀去切割板(包括轮廓与路径) */
    private SplitBrByKnifes;
    /**
     * @todo 这个是旧方案，先临时用一用，后面再重构
     * 针对圆弧板进行切割
     * @param br 被切割的板
     * @param clipPls 用于切割的线
     * @问 圆弧板的切割与普通板有何区别？
     * @答 切割位置应变长(因为板弯曲了，而板轮廓没有)，且放样路径也应被切割
     * @着手点 [1]修正板轮廓的切割位置 [2]获取正确的放样路径集
     * @修正位置 通过param进行逆映射，从而得到正确的切割位置
     * @获取路径 首先要明确一件事，路径需要改变，是因为切割后的板的基点(aabb中X最小的点)可能发生变化
     * 所以，我们需要根据新的基点生成新的路径，新基点沿路径方向与旧基点的差值(恒正)作为生成新路径的切割线(垂直X轴)
     * 若切割线与路径平行，则新旧基点一致，无需修改
     */
    private SplitBySweep;
    /** 获得新的刀(多段线) */
    private GetSplitPls;
    /** 获取被切割后的放样路径集 */
    private GetSweepPaths;
}
/** 视图类型 */
export declare enum ViewType {
    Normal = "\u6B63\u89C6\u56FE",
    Front = "\u524D\u89C6\u56FE",
    Back = "\u540E\u89C6\u56FE",
    Left = "\u5DE6\u89C6\u56FE",
    Right = "\u53F3\u89C6\u56FE",
    Down = "\u4FEF\u89C6\u56FE",
    Up = "\u4EF0\u89C6\u56FE",
    Unknown = "\u672A\u77E5\u89C6\u56FE"
}
/** 视图管理器 */
export declare class ViewManager {
    /** 映射: 视图->矩阵 */
    static viewMatrixMap: Map<ViewType, Matrix4>;
    /** 映射: 视图->向量（相机角度） */
    static viewVectorMap: Map<ViewType, Vector3>;
    /** 映射: 视图->法向量（实体朝向） */
    static viewNormalMap: Map<ViewType, Vector3>;
    /** 判断矩阵位于哪个视图 */
    static MatrixIsView(m: Matrix4): ViewType;
    /** 判断向量朝向哪个视图 */
    static VectorIsView(v: Vector3): ViewType;
}
/** 线段管理器  */
export declare class CurveManager {
    /** X轴的平行线 */
    static CreateXLine: (p: Vector3) => Line;
    /** Y轴的平行线 */
    static CreateYLine: (p: Vector3) => Line;
    /** Z轴的平行线 */
    static CreateZLine: (p: Vector3) => Line;
    /** 通过点集生成多段线 */
    static CreatePolyline: (ps: Vector2[]) => Polyline;
    static CreateExpandPl(pl: Polyline): Polyline;
    /** 绘制矩阵所表示的坐标系 */
    static CreateAxis(m: Matrix4): Line[];
    /** 点集转线段簇 */
    static PtsToLines(pts: Vector3[]): Line[];
    /** 线段簇转多段线 */
    static LinesToPl(lines: Line[]): Polyline;
    /** 获取pA-pB之间的曲线 */
    static Get_Pl_InPtAtoPtB(pl: Polyline, pA: Vector3, pB: Vector3): Polyline;
}
//# sourceMappingURL=LinearCuttingForSweep.d.ts.map