import { Matrix4, Vector3 } from "three";
import { ISpaceParse } from "../../Geometry/SpaceParse/ISpaceParse";
import { CADFiler } from "../CADFiler";
import { Board } from "../Entity/Board";
import { Entity } from "../Entity/Entity";
import { ObjectId } from "../ObjectId";
import { PhysicalMaterialRecord } from "../PhysicalMaterialRecord";
import { SymbolTableRecord } from "../SymbolTableRecord";
import { TemplateParam } from "./Param/TemplateParam";
import { Positioning } from "./Positioning/Positioning";
import { TemplateSplitType, TemplateType } from "./TemplateType";
export declare const TempateDefaultParamCount: number;
/**
 * ### 模板记录
 * 模版与实体总是互相关联的,所以添加实体进入模版的时候,应该保证这个记录已经加入到数据库
 *
 * 保留参数名称列表: L W H RX RY RZ X Y Z
 * 保留参数前缀: _ $
 *
 * #### 批量修改参数值.
 * 程序应该只传入expr的值,(禁止直接编辑value).传入后,交由模版进行计算更新.
 * 模版内部消化,决定是否保留expr.(当纯数字将被直接计算成value而不保存expr).
 *
 * 由于`DIV`变量的计算机制,`LWH`变量将不能依赖同层变量,(这可能会导致一些错误)
 *
 * 当模块节点处于切割空间内时,如果想重新绑定空间,那么空间树的位置将发生变更(实际上不管是不是在切割空间内,空间位置都可能发生变更)
 *
 */
export declare class TemplateRecord extends SymbolTableRecord {
    Type: TemplateType;
    SplitType: TemplateSplitType;
    private _Parent;
    Children: ObjectId<TemplateRecord>[];
    EffectTemplates: ObjectId<TemplateRecord>[];
    Params: TemplateParam[];
    Objects: ObjectId<Entity>[];
    private _Positioning;
    goodMaterial: ObjectId<PhysicalMaterialRecord>;
    isExpanded: boolean;
    constructor();
    get Name(): string;
    set Name(name: string);
    get Parent(): ObjectId<TemplateRecord>;
    set Parent(id: ObjectId<TemplateRecord>);
    get Root(): TemplateRecord;
    get IsRoot(): boolean;
    get Entitys(): Entity[];
    get AllEntitys(): Entity[];
    GetProperty(p: TemplateType): boolean;
    SetProperty(p: TemplateType, v: boolean): void;
    get IsClear(): boolean;
    set IsClear(isClear: boolean);
    get IsSign(): boolean;
    set IsSign(isSign: boolean);
    get IsHidden(): boolean;
    set IsHidden(isHidden: boolean);
    get IsHiddenChildren(): boolean;
    set IsHiddenChildren(isHidden: boolean);
    Purge(): void;
    Traverse(callback: (arg0: this) => void): void;
    TraverseAsync(callback: (arg0: this) => Promise<void>): Promise<void>;
    private _NodeDepthCache;
    /** 节点深度,根节点=0 */
    get NodeDepth(): number;
    get NodeIndex(): number;
    /** 模版定位 */
    get Positioning(): Positioning;
    /**
     * 当存在夹层空间定位时,辅助定位表达式将使用夹层空间作为相对空间.
     */
    set Positioning(p: Positioning);
    /** 初始化基础参数 */
    InitBaseParams(): this;
    AppendTemplateParam(name: string, value: number, des: string, expr?: string): void;
    get LParam(): TemplateParam;
    get WParam(): TemplateParam;
    get HParam(): TemplateParam;
    get PXParam(): TemplateParam;
    get PYParam(): TemplateParam;
    get PZParam(): TemplateParam;
    get RXParam(): TemplateParam;
    get RYParam(): TemplateParam;
    get RZParam(): TemplateParam;
    GetParam(paramName: string): TemplateParam | undefined;
    SetParamExpr(paramName: string, expr: string | number): void;
    DeleteParam(paramName: string): this;
    /**
     * 通常UI操作的时候,都需要更新整个树,所以隐藏这个API.
     * see `UpdateTemplateTree`
     *
     * 更新当前节点
     *
     * ### 定位 (大小,方位)
     *
     * - (放弃)如果当前节点是更新树的最高层(但当前节点不是根节点)
     *   那么当存在夹层空间定位的时候,可以不重复进行夹层空间定位,因为此时该空间不会发生变化.
     *   补充:如果夹层空间的板件都在上层,那么可以做这个优化,如果定位的板件没在模块中,那么不能进行这个优化.
     *
     * - [更新优先]在没有实现变量依赖收集(类似mobx)时,我们认为`positioning`的优先级最高.
     *   所以`positioning`会被优先更新. `LWH`,`XYZ`.
     *
     * - 在使用变量定位时,需要传入上层的坐标系,以便进行相对定位.
     *   使用空间分析时,已经不需要上层坐标系.
     *
     * - 辅助定位:帮助空间坐标系进行旋转
     *   辅助定位的参数变量将暴露出来.{RX RY RZ}
     *   辅助定位作为参数变量时,用户使用值时很难正确的计算值,应~加入交互选择.(辅助计算)
     *
     * ### 变量表达式计算
     *
     * - `LWH`将被`positioning`替代,但变量定义仍然正常存在.
     *
     * - 变量大部分时候都是被批量更新,(同时传入许多参数).
     *
     */
    protected Update(): Promise<void>;
    protected UpdateEntitys(): void;
    protected UpdateOther(): Promise<void>;
    /**
     * 使用PXPYPZ更新空间位置
     */
    private UpdatePosition;
    /**
     * 旋转空间定位,如果旋转成功,那么SpaceSize和SpaceCS都可能被更新
     */
    private RotateSpaceCS;
    /** 以广度搜索优先更新节点树 */
    UpdateTemplateTree(): any;
    /** 缓存本节点的变量定义值,当子层需要本层的参数时,可以直接获取 */
    protected _CacheParamVars: any;
    protected _CacheSpaceCS: Matrix4;
    protected _CacheSpaceSize: Vector3;
    protected _CatchRootParam: Set<TemplateParam>;
    /**
     * 本节点可用的所有变量定义.(包括变量继承)
     * @param [useCache=true] 当更新当前节点的时候,我们不希望使用缓存,(因为父节点的参数可能已经被更新)
     * @returns
     */
    GetParameterDefinition(useCache?: boolean): any;
    ClearParameterDefinitionCache(): void;
    /**
     * 变量继承
     * - 每继承一层,前缀增加一个`_`
     * - 顶层前缀`$`
     *
     * @returns 继承于父空间的变量定义列表
     */
    private GetParentParams;
    get SpaceParse(): ISpaceParse;
    /**
     * 获得当前的模版空间的相对坐标系
     * - 存在父节点的时候使用父节点的模版空间坐标系
     * - 不存在父节点的时候使用自身的模版空间坐标系
     *
     * - 空间坐标系将被定位更新
     *
     * @param [useCache=true] 当更新当前节点的时候,我们不希望使用缓存,(因为父节点的参数可能已经被更新)
     */
    private GetTemplateSpaceCS;
    /**
     * 获得当前模块的实际位置坐标系.
     * 使用 GetTemplateSpaceCS 可能会得到不准确的位置.(得到Parent或者已经缓存的位置)
     */
    GetTemplateRealitySpaceCS(): Matrix4;
    get NeedUpdateParent(): boolean;
    protected get PositioningSupportBoards(): Board[];
    protected _Version: number;
    ReadFile(file: CADFiler): void;
    WriteFile(file: CADFiler): void;
}
//# sourceMappingURL=TemplateRecord.d.ts.map