type LinkType = 'in' | 'out' | 'center' interface CurrentMouseInfo { /** * 当前鼠标所在的设计图 */ viewport: any /** * 鼠标在设计图上的 X 坐标 */ x: number /** * 鼠标在设计图上的 Y 坐标 */ z: number /** * 鼠标在设计图上的坐标, 归一化到 [0, 1] 范围 */ mouse: any isShiftKey: boolean isCtrlKey: boolean isAltKey: boolean isMetaKey: boolean } interface InitThreeOption { stateManagerId: string } interface InteractionCudOption { } /** * 渲染器操作选项 */ interface RendererCudOption { createFromInteraction?: boolean /** * 是否是模拟时创建的实体 */ isRuntime?: boolean //THREE.Vector3 position?: any //THREE.Quaternion rotation?: any } /** * 实体操作选项 */ interface EntityCudOption { /** * 原始实体对象 */ originEntity?: ItemJson } interface IGridHelper { /** * 启用坐标轴 */ axesEnabled: boolean; /** * 坐标轴大小, 单位米 */ axesSize: number; /** * 坐标轴颜色, 十六进制颜色值 */ axesColor: number; /** * 坐标轴透明度 */ axesWidth: number; /** * 启用网格 */ gridEnabled: boolean; /** * 网格大小, 单位米 */ gridSize: number; /** * 网格分割数 */ gridDivisions: number; /** * 网格颜色, 十六进制颜色值 */ gridColor: number; /** * 网格透明度 */ gridOpacity: number; /** * 背景颜色, 十六进制颜色值 */ backgroundColor: number; /** * 启用吸附 */ snapEnabled: boolean; /** * 吸附距离, 单位米 */ snapDistance: number; } interface ItemMetrix { /** * 物体ID, 唯一标识 */ id: string /** * 变换矩阵, 3x3矩阵, X轴正增长向右, Y轴正增长向屏幕外, Z轴正增长向下。右手坐标系 */ tf: [ /** * 平移向量 position, 三维坐标 * [0]=x轴向右, [1]=y轴高度向屏幕外, [2]=z轴向下 */ [number, number, number], /** * 旋转向量 rotation, 单位为度 * [0]=X轴逆向旋转角度, [1]=Y轴逆向旋转角度, [2]=Z轴逆向旋转角度 * 对应 three.js 应进行"角度"转"弧度"的换算 */ [number, number, number], /** * 缩放向量 scale, 三维缩放比例, [0]=X宽度, [1]=Y高度, [2]=Z长度 */ [number, number, number], ] } /** * 物体单元(点) * 举例: * { * id: 'p1', // 物体唯一ID * t: 'measure', // 物体类型, measure表示测量, 需交给 itemType.name == 'measure' 的组件处理 * tf: [ // 变换矩阵, 3x3矩阵, 采用Y轴向上为正, X轴向右, Z轴向前的右手坐标系 * [-9.0, 0, -1.0], // 平移向量 position * [0, 0, 0], // 旋转向量 rotation, 表示绕Y轴旋转的角度, 单位为度。对应 three.js 应进行"角度"转"弧度"的换算 * [0.25, 0.1, 0.25] // 缩放向量 scale * ], * dt: { // 实体的自定义数据 * label: '测量1', // 标签名称, 显示用 * color: '#ff0000', // 颜色, 显示用. 十六进制颜色值 * center: ['p2'], // S连线(又称逻辑连线), 与其他点之间的无方向性关联, 关系的起点需要在他的 dt.center[] 数组中添加目标点的id, 关系的终点需要在他的 dt.center[] 数组中添加起点的 id * in: [], // A连线(又称物体流动线)的输入, 关系的终点需要在 dt.in[] 数组中添加起点的 id * out: [] // A连线(又称物体流动线)的输出, 关系的起点需要在 dt.out[] 数组中添加目标点的 id * ...其他属性 * } * } */ interface ItemJson extends ItemMetrix { /** * 物体名称, 显示用, 最后初始化到 three.js 的 name 中, 可以不设置, 可以不唯一, 但他的查找速度是 O(N) */ name?: string /** * "点"的物体单元类型, 最终对应到 measure / conveyor / task 等不同的单元处理逻辑中 */ t: string /** * 可见行, 对应 THREE.Object3D 的 visible */ v: boolean /** * 用户数据, 可自定义, 一般用在 three.js 的 userData 中 */ dt: { /** * 标签名称, 显示用, 每个单元类型的 renderer 有自己的渲染逻辑 */ label?: string /** * 颜色, 每个单元类型的 renderer 有自己的渲染逻辑 */ color?: string /** * S连线(又称逻辑连线), 与其他点之间的无方向性关联, 关系的起点需要在他的 dt.center[] 数组中添加目标点的id, 关系的终点需要在他的 dt.center[] 数组中添加起点的 id */ center?: string[] /** * A连线(又称物体流动线)的输入, 关系的终点需要在 dt.in[] 数组中添加起点的 id */ in?: string[] /** * A连线(又称物体流动线)的输出, 关系的起点需要在 dt.out[] 数组中添加目标点的 id */ out?: string[] /** * 是否可以被选中, 默认 true */ selectable?: boolean /** * 是否受保护, 不可在图形编辑器中拖拽, 默认 false */ protected?: boolean /** * 物品所在的存储位置 */ storeAt?: { item: string, // 货架(地堆货位)ID bay?: number, // 货架(地堆货位)的列 level?: number // 货架(地堆货位)的层 cell?: number // 货架(地堆货位)的格 } bays?: { bayWidth: number, levelHeight: number[] }[] /** * 其他自定义数据, 可以存储任何数据 */ [key: string]: any }, } /** * Object3D 与 Mesh / Geometry 都能存储的用户相关数据 */ interface UserData { /** * 类型, 用于哪个模块处理该对象 */ t: string /** * 实体 ID, 用于标识该对象对应的 ItemJson 的 id */ entityId: string /** * createType='line' 时, 起点 ID */ startId?: string /** * createType='line' 时, 终点 ID */ endId?: string /** * 关联显示文本标签的 ID */ labelObjectId?: string /** * 创建类型, 用于区分是点还是线 */ createType: 'point' | 'line' /** * 是否可拖拽, 用于图形编辑器中拖拽操作 */ draggable: boolean /** * 是否可选中, 用于图形编辑器中选中操作 */ selectable: boolean [key: string]: any } /** * 三维物体对象 */ type Object3DIF = any /** * 被搬运物体 */ interface Loadable { /** * 拿起物体 */ pickupItem(item: string) /** * 卸下物体 */ dropItem(item: ItemJson, storeItemId: string, bay?: number, level?: number, cell?: number): void } /** * 搬运能力 */ interface Carry { /** * 是否正在搬运物体 */ isCarrying: boolean /** * 是否正在装载 */ isLoading: boolean /** * 是否正在卸载 */ isUnloading: boolean /** * 装载 */ addLoad(item: string): void /** * 卸载 */ addUnload(item: string, rack: string, bay?: number, level?: number): void } /** * 行走能力 */ interface Walk { isWalking: boolean /** * 行走到指定位置 */ addTravel(pos: Vector3IF | string): void /** * 旋转到指定角度 */ addRotation(angle: number): void } /** * 叉臂能力 */ interface ForkArm { isArmExtended: boolean /** * 升出叉臂 */ addArmExtender(): void /** * 收回叉臂 */ addArmRetractor(): void } /** * 升降塔能力 */ interface LiftingArm { isArmRaised: boolean /** * 升起叉臂 */ addArmRaise(hight: number): void /** * 降下叉臂 */ addArmLower(): void } interface EntityIf { id: string t: string item: ItemJson object: Object3DIF /** * 取消所有任务 */ cancelTask(): void /** * 暂停任务 */ taskPause(): void /** * 恢复任务 */ taskResume(): void /** * 开始执行任务 */ taskStartRun(): void /** * 是否已暂停 */ isPaused: boolean /** * 当前任务数 */ taskCount: number /** * 当前任务是否正在运行 */ taskIsRunning: boolean } /** * CL2 叉车接口 */ interface Cl2If extends EntityIf, Carry, Walk, ForkArm, LiftingArm { } /** * CLX 叉车接口 */ interface ClxIf extends EntityIf, Carry, Walk, ForkArm, LiftingArm { }