mirror of https://gitee.com/cf-fz/WebCAD.git
commit
381c616425
@ -0,0 +1,66 @@
|
|||||||
|
import { Matrix4, Vector3 } from 'three';
|
||||||
|
import { app } from '../../ApplicationServices/Application';
|
||||||
|
import { Board, BoardType } from '../../DatabaseServices/Board';
|
||||||
|
import { Box3Ext } from '../../Geometry/Box';
|
||||||
|
import { MoveMatrix } from '../../Geometry/GeUtils';
|
||||||
|
import { BehindHeightPositon, BrRelativePos, BehindBoardOption } from '../../UI/Store/BoardInterface';
|
||||||
|
import { DrawBoardTool } from './DrawBoardTool';
|
||||||
|
|
||||||
|
export class DrawBehindBoard extends DrawBoardTool
|
||||||
|
{
|
||||||
|
protected drawType = BoardType.Behind;
|
||||||
|
protected buildBoard(box: Box3Ext, opt: BehindBoardOption, ro: Matrix4)
|
||||||
|
{
|
||||||
|
let newBox = box.clone();
|
||||||
|
|
||||||
|
//判断延伸
|
||||||
|
let leftExt = parseFloat(opt.leftExt);
|
||||||
|
let rightExt = parseFloat(opt.rightExt);
|
||||||
|
let topExt = parseFloat(opt.topExt);
|
||||||
|
let bottomExt = parseFloat(opt.bottomExt);
|
||||||
|
newBox.max.add(new Vector3(leftExt + rightExt, 0, topExt + bottomExt));
|
||||||
|
newBox.translate(new Vector3(-leftExt, 0, -bottomExt));
|
||||||
|
|
||||||
|
//获取背板高度
|
||||||
|
let size = newBox.getSize(new Vector3());
|
||||||
|
let height = opt.height === "H" ? size.z : parseFloat(opt.height);
|
||||||
|
let moveDist = parseFloat(opt.moveDist);
|
||||||
|
|
||||||
|
//判断背板位置,更新背板高度
|
||||||
|
switch (opt.boardPosition)
|
||||||
|
{
|
||||||
|
case BehindHeightPositon.ForTop:
|
||||||
|
newBox.min.add(new Vector3(0, 0, size.z - height));
|
||||||
|
newBox.translate(new Vector3(0, 0, moveDist));
|
||||||
|
break;
|
||||||
|
case BehindHeightPositon.ForBottom:
|
||||||
|
newBox.max.add(new Vector3(0, 0, height));
|
||||||
|
newBox.translate(new Vector3(0, 0, -moveDist));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let count = parseInt(opt.count);
|
||||||
|
//相对位置
|
||||||
|
let relPos = opt.boardRelative;
|
||||||
|
//单层空间宽度
|
||||||
|
let spaceSize = parseFloat(opt.spaceSize);
|
||||||
|
let thickness = parseFloat(opt.thickness);
|
||||||
|
|
||||||
|
let board = Board.CreateBoard(height, size.x, thickness, BoardType.Behind);
|
||||||
|
|
||||||
|
//构建板件
|
||||||
|
for (let i = 1; i <= count; i++)
|
||||||
|
{
|
||||||
|
let b = board.Clone() as Board;
|
||||||
|
if (relPos === BrRelativePos.Front)
|
||||||
|
b.ApplyMatrix(MoveMatrix(newBox.min.clone().add(new Vector3(0, spaceSize * i, 0))));
|
||||||
|
else if (relPos === BrRelativePos.Back)
|
||||||
|
b.ApplyMatrix(MoveMatrix(newBox.min.clone().add(new Vector3(0, size.y - spaceSize * i - thickness, 0))));
|
||||||
|
else
|
||||||
|
b.ApplyMatrix(MoveMatrix(newBox.min.clone().add(new Vector3(0, size.y / (count + 1) * i - thickness / 2, 0))));
|
||||||
|
|
||||||
|
b.ApplyMatrix(ro);
|
||||||
|
app.m_Database.ModelSpace.Append(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,11 +1,10 @@
|
|||||||
//绘制板件
|
//绘制板件
|
||||||
import * as THREE from 'three';
|
import * as THREE from 'three';
|
||||||
|
import { Command } from '../../Editor/CommandMachine';
|
||||||
import { app } from '../ApplicationServices/Application';
|
import { MaterialNeedUpdateKey } from '../../DatabaseServices/MaterialDictionary';
|
||||||
import { CreateBoardUtil } from '../ApplicationServices/mesh/createBoard';
|
import { MoveMatrix } from '../../Geometry/GeUtils';
|
||||||
import { MaterialNeedUpdateKey } from '../DatabaseServices/MaterialDictionary';
|
import { CreateBoardUtil } from '../../ApplicationServices/mesh/createBoard';
|
||||||
import { Command } from '../Editor/CommandMachine';
|
import { app } from '../../ApplicationServices/Application';
|
||||||
import { MoveMatrix } from '../Geometry/GeUtils';
|
|
||||||
|
|
||||||
export class Command_DrawBoard implements Command
|
export class Command_DrawBoard implements Command
|
||||||
{
|
{
|
@ -0,0 +1,472 @@
|
|||||||
|
import { Matrix4, Mesh, Object3D, Ray, Raycaster, Vector2, Vector3 } from 'three';
|
||||||
|
import { app } from '../../ApplicationServices/Application';
|
||||||
|
import { arrayRemoveIf } from '../../Common/ArrayExt';
|
||||||
|
import { Vec3DTo2D } from '../../Common/CurveUtils';
|
||||||
|
import { Board, BoardType } from '../../DatabaseServices/Board';
|
||||||
|
import { Command } from '../../Editor/CommandMachine';
|
||||||
|
import { PromptStatus } from '../../Editor/PromptResult';
|
||||||
|
import { SelectLine } from '../../Editor/SelectBox';
|
||||||
|
import { Box3Ext } from '../../Geometry/Box';
|
||||||
|
import { equaln } from '../../Geometry/GeUtils';
|
||||||
|
import { GeneralSpaceParse, GeneralSpaceParse2 } from '../../Geometry/SpaceParse/GeneralSpaceParse';
|
||||||
|
import { Viewer } from '../../GraphicsSystem/Viewer';
|
||||||
|
import { BoardModalType } from '../../UI/Components/Board/BoardModal';
|
||||||
|
import { BoardOption, ModalState } from '../../UI/Store/BoardInterface';
|
||||||
|
import { BehindBoardStore, BoardStore, LayerBoardStore, VerticalBoardStore } from '../../UI/Store/BoardStore';
|
||||||
|
|
||||||
|
export abstract class DrawBoardTool implements Command
|
||||||
|
{
|
||||||
|
//画板件类型,默认画层板
|
||||||
|
protected drawType = BoardType.Layer;
|
||||||
|
async exec()
|
||||||
|
{
|
||||||
|
//原来禁用捕捉开启状态
|
||||||
|
let oldSnapState = app.m_Editor.m_GetpointServices.snapServices.m_Disabled;
|
||||||
|
app.m_Editor.m_GetpointServices.snapServices.m_Disabled = true;
|
||||||
|
|
||||||
|
let store: LayerBoardStore | VerticalBoardStore | BehindBoardStore;
|
||||||
|
let modalType: BoardModalType;
|
||||||
|
switch (this.drawType)
|
||||||
|
{
|
||||||
|
case BoardType.Layer:
|
||||||
|
store = LayerBoardStore.Store();
|
||||||
|
modalType = BoardModalType.Ly;
|
||||||
|
break;
|
||||||
|
case BoardType.Vertical:
|
||||||
|
store = VerticalBoardStore.Store();
|
||||||
|
modalType = BoardModalType.Ve;
|
||||||
|
break;
|
||||||
|
case BoardType.Behind:
|
||||||
|
store = BehindBoardStore.Store();
|
||||||
|
modalType = BoardModalType.Be;
|
||||||
|
|
||||||
|
}
|
||||||
|
app.m_Editor.m_ModalManage.RenderBoardModal(store, modalType);
|
||||||
|
|
||||||
|
let state = await store.GetBoardOption();
|
||||||
|
|
||||||
|
if (state !== ModalState.Ok)
|
||||||
|
return;
|
||||||
|
|
||||||
|
await this.SelectPoint(store, modalType)
|
||||||
|
|
||||||
|
//恢复原先状态
|
||||||
|
app.m_Editor.m_GetpointServices.snapServices.m_Disabled = oldSnapState;
|
||||||
|
}
|
||||||
|
private async SelectPoint(store: BoardStore, type: BoardModalType)
|
||||||
|
{
|
||||||
|
// 板件数据
|
||||||
|
let opt = store.m_BoardOption;
|
||||||
|
|
||||||
|
let view = app.m_Viewer;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
let ptRes = await app.m_Editor.GetPoint({
|
||||||
|
Msg: "点选画板区域",
|
||||||
|
KeyWordList: [{ msg: "框选", key: "S" }, { msg: "全选", key: "A" }, { msg: "放弃", key: "U" }]
|
||||||
|
});
|
||||||
|
|
||||||
|
if (ptRes.Status === PromptStatus.OK)
|
||||||
|
{
|
||||||
|
let brs: Board[] = [];
|
||||||
|
|
||||||
|
let mousePt = ptRes.Value.clone();
|
||||||
|
|
||||||
|
view.WorldToScreen(mousePt);
|
||||||
|
|
||||||
|
//是否选到背板
|
||||||
|
let en = this.pointPick(mousePt, view);
|
||||||
|
//选中面法向量
|
||||||
|
let normal: Vector3;
|
||||||
|
//鼠标在面上的交点
|
||||||
|
let origin: Vector3;
|
||||||
|
if (en.pickObj && (<Board>en.pickObj.userData).BoardType === BoardType.Behind)
|
||||||
|
{
|
||||||
|
brs.push(en.pickObj.userData);
|
||||||
|
let res = this.getPtSurroundBoardsByPick(en, view, brs);
|
||||||
|
normal = res.normal;
|
||||||
|
origin = res.origin;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//选择上下左右的板
|
||||||
|
this.getPtSurroundBoardsByMouse(mousePt, view, brs);
|
||||||
|
}
|
||||||
|
//分析点周围的空间
|
||||||
|
if (brs.length > 1)
|
||||||
|
{
|
||||||
|
let spaceParse = new GeneralSpaceParse(brs);
|
||||||
|
await spaceParse.SpaceParse();
|
||||||
|
|
||||||
|
if (spaceParse.Spaces.length === 0)
|
||||||
|
{
|
||||||
|
app.m_Editor.m_CommandStore.Prompt("生成b板件失败,没分析出有效空间");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//柜子旋转矩阵
|
||||||
|
let ro = new Matrix4().extractRotation(spaceParse.OCS);
|
||||||
|
|
||||||
|
//存在的空间
|
||||||
|
let spaces = spaceParse.Spaces;
|
||||||
|
|
||||||
|
if (spaces.length > 1)
|
||||||
|
{
|
||||||
|
let ray: Ray;
|
||||||
|
//构造射线,取和射线相交的空间
|
||||||
|
if (normal)
|
||||||
|
{
|
||||||
|
ray = new Ray(origin, normal);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
let raycaster = new Raycaster();
|
||||||
|
raycaster.setFromCamera({
|
||||||
|
x: (mousePt.x / view.Width) * 2 - 1,
|
||||||
|
y: - (mousePt.y / view.Height) * 2 + 1
|
||||||
|
}, view.Camera);
|
||||||
|
ray = raycaster.ray;
|
||||||
|
ray.origin.sub(raycaster.ray.direction.clone().multiplyScalar(1e5));
|
||||||
|
}
|
||||||
|
arrayRemoveIf(spaces, box =>
|
||||||
|
{
|
||||||
|
let b = box.clone().applyMatrix4(ro);
|
||||||
|
return !Boolean(ray.intersectBox(b, new Vector3()))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (spaces.length > 0)
|
||||||
|
{
|
||||||
|
let box = spaces[0];
|
||||||
|
this.buildBoard(box, opt, ro);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
app.m_Editor.m_CommandStore.Prompt("请选择有效的板件,或者周围没有效板件");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (ptRes.Status === PromptStatus.Keyword)
|
||||||
|
{
|
||||||
|
if (ptRes.StringResult === "S")
|
||||||
|
{
|
||||||
|
await this.SelectBoxes(opt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (ptRes.StringResult === "A")
|
||||||
|
{
|
||||||
|
//TODO:未完善功能
|
||||||
|
await this.DrawInALlBoxes(opt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (ptRes.StringResult === "U")
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
app.m_Editor.m_ModalManage.RenderBoardModal(store, type);
|
||||||
|
let state = await store.GetBoardOption();
|
||||||
|
if (state !== ModalState.Ok) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*获取鼠标点周围的板
|
||||||
|
* @private
|
||||||
|
* @param {Vector3} mousePt
|
||||||
|
* @param {Viewer} view
|
||||||
|
* @param {Board[]} brs
|
||||||
|
* @memberof DrawLayerBoard
|
||||||
|
*/
|
||||||
|
private getPtSurroundBoardsByMouse(mousePt: Vector3, view: Viewer, brs: Board[])
|
||||||
|
{
|
||||||
|
let { vMeshs, lMeshs } = this.getMeshs(view);
|
||||||
|
//获取上下左右的板
|
||||||
|
const getBoard = (pt: Vector2, objs: Object3D[], type: string) =>
|
||||||
|
{
|
||||||
|
let sl = new SelectLine(view, Vec3DTo2D(mousePt), pt);
|
||||||
|
sl.Select(objs);
|
||||||
|
this.selectSurroundBoard(sl.Enlity as Board[], type, brs)
|
||||||
|
}
|
||||||
|
|
||||||
|
let leftPt = Vec3DTo2D(mousePt).setX(0);
|
||||||
|
getBoard(leftPt, vMeshs, "left");
|
||||||
|
|
||||||
|
let rightPt = Vec3DTo2D(mousePt).setX(view.Width);
|
||||||
|
getBoard(rightPt, vMeshs, "right");
|
||||||
|
|
||||||
|
let topPt = Vec3DTo2D(mousePt).setY(0);
|
||||||
|
getBoard(topPt, lMeshs, "top");
|
||||||
|
|
||||||
|
let bottomPt = Vec3DTo2D(mousePt).setY(view.Height);
|
||||||
|
getBoard(bottomPt, lMeshs, "bottom")
|
||||||
|
|
||||||
|
}
|
||||||
|
private getPtSurroundBoardsByPick(en: { pickObj: Object3D, intersect: any }, view: Viewer, brs: Board[])
|
||||||
|
{
|
||||||
|
let { vMeshs, lMeshs } = this.getMeshs(view);
|
||||||
|
let ro = new Matrix4().extractRotation(en.intersect.object.matrix);
|
||||||
|
let normal = en.intersect.face.normal.clone() as Vector3;
|
||||||
|
let leftDir = new Vector3().setX(normal.z);
|
||||||
|
let topDir = new Vector3().setY(normal.z)
|
||||||
|
|
||||||
|
normal.applyMatrix4(ro);
|
||||||
|
leftDir.applyMatrix4(ro);
|
||||||
|
topDir.applyMatrix4(ro);
|
||||||
|
|
||||||
|
let origin = en.intersect.point as Vector3;
|
||||||
|
let leftRay = new Raycaster(origin, leftDir);
|
||||||
|
let rightRay = new Raycaster(origin, leftDir.clone().negate());
|
||||||
|
//原点往法向量方向偏移一点,保证相交
|
||||||
|
let fuzzVec = normal.clone().multiplyScalar(1e-3);
|
||||||
|
let topRay = new Raycaster(origin.clone().add(fuzzVec), topDir);
|
||||||
|
let bottomRay = new Raycaster(origin.clone().add(fuzzVec), topDir.clone().negate());
|
||||||
|
|
||||||
|
const getBoard = (ray, meshs) =>
|
||||||
|
{
|
||||||
|
let ints = ray.intersectObjects(meshs, false);
|
||||||
|
if (ints.length > 0)
|
||||||
|
{
|
||||||
|
brs.push(ints[0].object.userData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getBoard(leftRay, vMeshs);
|
||||||
|
getBoard(rightRay, vMeshs);
|
||||||
|
getBoard(topRay, lMeshs);
|
||||||
|
getBoard(bottomRay, lMeshs);
|
||||||
|
|
||||||
|
return { normal, origin };
|
||||||
|
}
|
||||||
|
private getMeshs(view: Viewer)
|
||||||
|
{
|
||||||
|
let meshs = view.Scene.children.filter(o => o instanceof Mesh && o.userData && o.userData instanceof Board);
|
||||||
|
let vMeshs = meshs.filter(o => (<Board>o.userData).BoardType === BoardType.Vertical);
|
||||||
|
let lMeshs = meshs.filter(o => (<Board>o.userData).BoardType === BoardType.Layer);
|
||||||
|
return { vMeshs, lMeshs }
|
||||||
|
}
|
||||||
|
private selectSurroundBoard(ens: Board[], dir: string, brs: Board[])
|
||||||
|
{
|
||||||
|
if (ens.length === 0) return;
|
||||||
|
|
||||||
|
let boxMap: Map<Board, Vector3> = new Map();
|
||||||
|
ens.forEach(b =>
|
||||||
|
{
|
||||||
|
let pt = b.MinPoint;
|
||||||
|
app.m_Viewer.WorldToScreen(pt);
|
||||||
|
boxMap.set(b, pt);
|
||||||
|
})
|
||||||
|
|
||||||
|
switch (dir)
|
||||||
|
{
|
||||||
|
case "left":
|
||||||
|
ens.sort((a, b) => boxMap.get(b).x - boxMap.get(a).x);
|
||||||
|
break;
|
||||||
|
case "right":
|
||||||
|
ens.sort((a, b) => boxMap.get(a).x - boxMap.get(b).x);
|
||||||
|
break;
|
||||||
|
case "top":
|
||||||
|
ens.sort((a, b) => boxMap.get(b).y - boxMap.get(a).y);
|
||||||
|
break;
|
||||||
|
case "bottom":
|
||||||
|
ens.sort((a, b) => boxMap.get(a).y - boxMap.get(b).y);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let en = ens[0];
|
||||||
|
if (en && !brs.includes(en))
|
||||||
|
{
|
||||||
|
brs.push(en)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private async SelectBoxes(opt: BoardOption)
|
||||||
|
{
|
||||||
|
let exSsRes = await app.m_Editor.GetSelection({ Msg: "请选择对象<全部选择>:", UseSelect: true });
|
||||||
|
if (exSsRes.Status === PromptStatus.Cancel)
|
||||||
|
return;
|
||||||
|
let boardCus = exSsRes.SelectSet.SelectEntityList.filter(en =>
|
||||||
|
en instanceof Board) as Board[];
|
||||||
|
|
||||||
|
if (boardCus.length > 0)
|
||||||
|
{
|
||||||
|
let spaceParse = new GeneralSpaceParse(boardCus);
|
||||||
|
await spaceParse.SpaceParse();
|
||||||
|
|
||||||
|
if (spaceParse.Spaces.length === 0)
|
||||||
|
{
|
||||||
|
app.m_Editor.m_CommandStore.Prompt("生成层板失败");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let ro = new Matrix4().extractRotation(spaceParse.OCS);
|
||||||
|
|
||||||
|
let spaces = spaceParse.Spaces;
|
||||||
|
let box = await this.selectBox(spaces);
|
||||||
|
|
||||||
|
this.buildBoard(box, opt, ro);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
app.m_Editor.m_CommandStore.Prompt("请选择板件")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private async DrawInALlBoxes(opt: BoardOption)
|
||||||
|
{
|
||||||
|
let exSsRes = await app.m_Editor.GetSelection({ Msg: "请选择对象<全部选择>:", UseSelect: true });
|
||||||
|
if (exSsRes.Status === PromptStatus.Cancel)
|
||||||
|
return;
|
||||||
|
let boardCus = exSsRes.SelectSet.SelectEntityList.filter(en =>
|
||||||
|
en instanceof Board) as Board[];
|
||||||
|
|
||||||
|
if (boardCus.length > 0)
|
||||||
|
{
|
||||||
|
let spaceParse = new GeneralSpaceParse2(boardCus);
|
||||||
|
spaceParse.SpaceParse();
|
||||||
|
|
||||||
|
if (spaceParse.Spaces.length === 0)
|
||||||
|
{
|
||||||
|
app.m_Editor.m_CommandStore.Prompt("生成层板失败");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let ro = new Matrix4().extractRotation(spaceParse.OCS);
|
||||||
|
|
||||||
|
let spaces = spaceParse.Spaces;
|
||||||
|
for (let box of spaces)
|
||||||
|
{
|
||||||
|
this.buildBoard(box, opt, ro);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
app.m_Editor.m_CommandStore.Prompt("请选择板件")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private pointPick(ptVcs: Vector3, view: Viewer)
|
||||||
|
{
|
||||||
|
let selectObjects = view.Scene.children;
|
||||||
|
|
||||||
|
selectObjects = selectObjects.filter(o => o instanceof Mesh && o.userData && o.userData instanceof Board);
|
||||||
|
|
||||||
|
let raycaster = new Raycaster();
|
||||||
|
raycaster.setFromCamera({
|
||||||
|
x: (ptVcs.x / view.Width) * 2 - 1,
|
||||||
|
y: - (ptVcs.y / view.Height) * 2 + 1
|
||||||
|
}, view.Camera);
|
||||||
|
raycaster.ray.origin.sub(raycaster.ray.direction.clone().multiplyScalar(1e3));
|
||||||
|
|
||||||
|
let pickObj: Object3D;
|
||||||
|
let minDis: number;
|
||||||
|
let intersect;
|
||||||
|
for (let obj of selectObjects)
|
||||||
|
{
|
||||||
|
let intersects = [];
|
||||||
|
if (!obj.visible) continue;
|
||||||
|
obj.raycast(raycaster, intersects)
|
||||||
|
if (intersects.length > 0)
|
||||||
|
if (!minDis || minDis > intersects[0].distance)
|
||||||
|
{
|
||||||
|
pickObj = obj;
|
||||||
|
minDis = intersects[0].distance
|
||||||
|
intersect = intersects[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return { pickObj, intersect };
|
||||||
|
}
|
||||||
|
async selectBox(spaces: Box3Ext[])
|
||||||
|
{
|
||||||
|
if (spaces.length === 1)
|
||||||
|
return spaces[0];
|
||||||
|
|
||||||
|
spaces.sort((b1, b2) =>
|
||||||
|
{
|
||||||
|
if (equaln(b2.min.z, b1.min.z))
|
||||||
|
{
|
||||||
|
return b1.min.y - b2.min.y;
|
||||||
|
}
|
||||||
|
return b1.min.z - b2.min.z
|
||||||
|
});
|
||||||
|
|
||||||
|
if (spaces.length > 2)
|
||||||
|
{
|
||||||
|
let keyWord = await app.m_Editor.GetKeyWords({
|
||||||
|
Msg: "输入位置:",
|
||||||
|
KeyWordList: [{ key: "1", msg: "靠上" }, { key: "2", msg: "靠下" }]
|
||||||
|
});
|
||||||
|
|
||||||
|
if (keyWord.StringResult == "1")
|
||||||
|
{
|
||||||
|
spaces = spaces.splice(spaces.length / 2, spaces.length / 2)
|
||||||
|
}
|
||||||
|
else if (keyWord.StringResult == "2")
|
||||||
|
{
|
||||||
|
spaces = spaces.splice(0, spaces.length / 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
keyWord = await app.m_Editor.GetKeyWords({
|
||||||
|
Msg: "输入位置:",
|
||||||
|
KeyWordList: [{ key: "3", msg: "靠前" }, { key: "4", msg: "靠后" }]
|
||||||
|
});
|
||||||
|
if (keyWord.StringResult == "3")
|
||||||
|
{
|
||||||
|
spaces[0].min.y < spaces[1].min.y ? spaces.pop() : spaces.shift();
|
||||||
|
}
|
||||||
|
else if (keyWord.StringResult == "4")
|
||||||
|
{
|
||||||
|
spaces[0].min.y > spaces[1].min.y ? spaces.pop() : spaces.shift();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (spaces[0].min.z === spaces[1].min.z)
|
||||||
|
{
|
||||||
|
let KeyWordList = [{ key: "3", msg: "靠前" }, { key: "4", msg: "靠后" }];
|
||||||
|
let tmpPar1 = spaces[0].min.y;
|
||||||
|
let tmpPar2 = spaces[1].min.y;
|
||||||
|
|
||||||
|
if (spaces[0].min.y === spaces[1].min.y)
|
||||||
|
{
|
||||||
|
KeyWordList = [{ key: "3", msg: "靠左" }, { key: "4", msg: "靠右" }];
|
||||||
|
tmpPar1 = spaces[0].min.x;
|
||||||
|
tmpPar2 = spaces[1].min.x;
|
||||||
|
}
|
||||||
|
let keyWord = await app.m_Editor.GetKeyWords({
|
||||||
|
Msg: "输入位置:",
|
||||||
|
KeyWordList
|
||||||
|
});
|
||||||
|
if (keyWord.StringResult == "3")
|
||||||
|
{
|
||||||
|
tmpPar1 < tmpPar2 ? spaces.pop() : spaces.shift();
|
||||||
|
}
|
||||||
|
else if (keyWord.StringResult == "4")
|
||||||
|
{
|
||||||
|
tmpPar1 > tmpPar2 ? spaces.pop() : spaces.shift();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
let keyWord = await app.m_Editor.GetKeyWords({
|
||||||
|
Msg: "输入位置:",
|
||||||
|
KeyWordList: [{ key: "1", msg: "靠上" }, { key: "2", msg: "靠下" }]
|
||||||
|
});
|
||||||
|
|
||||||
|
if (keyWord.StringResult == "1")
|
||||||
|
{
|
||||||
|
spaces = spaces.splice(spaces.length / 2, spaces.length / 2)
|
||||||
|
}
|
||||||
|
else if (keyWord.StringResult == "2")
|
||||||
|
{
|
||||||
|
spaces = spaces.splice(0, spaces.length / 2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return spaces[0];
|
||||||
|
}
|
||||||
|
//构建板件
|
||||||
|
protected buildBoard(box: Box3Ext, opt: BoardOption, ro: Matrix4)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,112 @@
|
|||||||
|
import { Matrix4, Vector3 } from 'three';
|
||||||
|
import { app } from '../../ApplicationServices/Application';
|
||||||
|
import { Board, BoardType } from '../../DatabaseServices/Board';
|
||||||
|
import { Command } from '../../Editor/CommandMachine';
|
||||||
|
import { PromptStatus } from '../../Editor/PromptResult';
|
||||||
|
import { Box3Ext } from '../../Geometry/Box';
|
||||||
|
import { MoveMatrix } from '../../Geometry/GeUtils';
|
||||||
|
import { SpaceParse } from '../../Geometry/SpaceParse/SpaceParse';
|
||||||
|
import { BoardModalType } from '../../UI/Components/Board/BoardModal';
|
||||||
|
import { BrRelativePos, ClosingStripOption, ModalState, StripType } from '../../UI/Store/BoardInterface';
|
||||||
|
import { ClosingStripStore } from '../../UI/Store/BoardStore';
|
||||||
|
|
||||||
|
export class DrawClosingStrip implements Command
|
||||||
|
{
|
||||||
|
async exec()
|
||||||
|
{
|
||||||
|
let exSsRes = await app.m_Editor.GetSelection({ Msg: "请选择对象<全部选择>:", UseSelect: true });
|
||||||
|
if (exSsRes.Status === PromptStatus.Cancel)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let boardCus = exSsRes.SelectSet.SelectEntityList.filter(en =>
|
||||||
|
en instanceof Board) as Board[];
|
||||||
|
|
||||||
|
if (boardCus.length > 0)
|
||||||
|
{
|
||||||
|
let store = ClosingStripStore.Store();
|
||||||
|
app.m_Editor.m_ModalManage.RenderBoardModal(store, BoardModalType.Skt);
|
||||||
|
let state = await store.GetBoardOption();
|
||||||
|
|
||||||
|
if (state !== ModalState.Ok) return;
|
||||||
|
|
||||||
|
let spaceParse = new SpaceParse(boardCus);
|
||||||
|
spaceParse.parseTotalSpace();
|
||||||
|
let rot = new Matrix4().extractRotation(spaceParse.OCS);
|
||||||
|
let totalSpace = spaceParse.TotalSpace;
|
||||||
|
while (state == ModalState.Ok)
|
||||||
|
{
|
||||||
|
let opt = store.m_BoardOption;
|
||||||
|
this.buildClosingStrip(totalSpace, opt, rot);
|
||||||
|
state = await store.GetBoardOption();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//构建收口条,更新总空间
|
||||||
|
buildClosingStrip(totalSpace: Box3Ext, opt: ClosingStripOption, rot: Matrix4)
|
||||||
|
{
|
||||||
|
let size = totalSpace.getSize(new Vector3());
|
||||||
|
let max = totalSpace.max;
|
||||||
|
let min = totalSpace.min;
|
||||||
|
let pos = new Vector3();
|
||||||
|
let thickness = parseFloat(opt.thickness);
|
||||||
|
let width = parseFloat(opt.width);
|
||||||
|
let br: Board;
|
||||||
|
|
||||||
|
//靠上,横板为层板,基点位置为前右上方的点往上移动一个厚度 竖板为背板,基点为前左上方点
|
||||||
|
if (opt.pos === BrRelativePos.Top)
|
||||||
|
{
|
||||||
|
if (opt.type === StripType.H)
|
||||||
|
{
|
||||||
|
br = Board.CreateBoard(size.x, width, thickness,
|
||||||
|
BoardType.Layer);
|
||||||
|
pos.set(max.x, min.y, max.z + thickness);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
br = Board.CreateBoard(width, size.x, thickness,
|
||||||
|
BoardType.Behind);
|
||||||
|
pos.set(min.x, min.y, max.z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
br = Board.CreateBoard(size.z, width, thickness,
|
||||||
|
opt.type === StripType.H ? BoardType.Behind : BoardType.Vertical);
|
||||||
|
|
||||||
|
//靠左,横板为背板,基点为左下角点往x移动一个宽度,竖板为立板,基点为左下角点
|
||||||
|
//靠右,横板基点为右下角点,竖板基点为左下角点右移动一个厚度
|
||||||
|
if (opt.pos === BrRelativePos.Left)
|
||||||
|
{
|
||||||
|
if (opt.type === StripType.H)
|
||||||
|
{
|
||||||
|
pos.set(min.x - width, min.y, min.z);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pos.copy(min);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (opt.type === StripType.H)
|
||||||
|
{
|
||||||
|
pos.set(max.x, min.y, min.z);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pos.copy(min).setX(max.x + thickness);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//收口条颜色
|
||||||
|
br.ColorIndex = 4;
|
||||||
|
br.ApplyMatrix(MoveMatrix(pos));
|
||||||
|
//更新总空间
|
||||||
|
totalSpace.union(br.BoundingBox);
|
||||||
|
|
||||||
|
br.ApplyMatrix(rot);
|
||||||
|
app.m_Database.ModelSpace.Append(br);
|
||||||
|
app.m_Editor.UpdateScreen();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
import { Command } from "../../Editor/CommandMachine";
|
||||||
|
import { app } from "../../ApplicationServices/Application";
|
||||||
|
import { DoorModal } from "../../UI/Components/Board/DoorModal";
|
||||||
|
import { DoorStore } from "../../UI/Store/BoardStore";
|
||||||
|
import { ModalState } from "../../UI/Store/BoardInterface";
|
||||||
|
|
||||||
|
export class DrawDoor implements Command
|
||||||
|
{
|
||||||
|
async exec()
|
||||||
|
{
|
||||||
|
let store = DoorStore.Store();
|
||||||
|
app.m_Editor.m_ModalManage.RenderModal(DoorModal, store);
|
||||||
|
let state = await store.GetBoardOption();
|
||||||
|
if (state !== ModalState.Ok) return;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
import { Matrix4, Vector3 } from 'three';
|
||||||
|
import { app } from '../../ApplicationServices/Application';
|
||||||
|
import { Board, BoardType } from '../../DatabaseServices/Board';
|
||||||
|
import { Box3Ext } from '../../Geometry/Box';
|
||||||
|
import { MoveMatrix } from '../../Geometry/GeUtils';
|
||||||
|
import { LayerBoardOption, BrRelativePos } from '../../UI/Store/BoardInterface';
|
||||||
|
import { DrawBoardTool } from './DrawBoardTool';
|
||||||
|
|
||||||
|
export class DrawLayerBoard extends DrawBoardTool
|
||||||
|
{
|
||||||
|
//构建板件
|
||||||
|
protected buildBoard(box: Box3Ext, opt: LayerBoardOption, ro: Matrix4)
|
||||||
|
{
|
||||||
|
let size = box.getSize(new Vector3());
|
||||||
|
let width = opt.isTotalLength ? size.y : parseFloat(opt.height);
|
||||||
|
let count = parseInt(opt.count);
|
||||||
|
let type = opt.boardRelative;
|
||||||
|
let spaceSize = parseFloat(opt.spaceSize);
|
||||||
|
let frontShrink = parseFloat(opt.frontShrink);
|
||||||
|
let leftShrink = parseFloat(opt.leftShrink);
|
||||||
|
let rightShrink = parseFloat(opt.rightShrink);
|
||||||
|
let thickness = parseFloat(opt.thickness);
|
||||||
|
|
||||||
|
let board = Board.CreateBoard(size.x - leftShrink - rightShrink, width, thickness, BoardType.Layer);
|
||||||
|
|
||||||
|
for (let i = 1; i <= count; i++)
|
||||||
|
{
|
||||||
|
let b = board.Clone() as Board;
|
||||||
|
if (type === BrRelativePos.Top)
|
||||||
|
b.ApplyMatrix(MoveMatrix(box.min.clone().add(new Vector3(size.x - leftShrink, frontShrink, size.z - spaceSize * i))));
|
||||||
|
else if (type === BrRelativePos.Bottom)
|
||||||
|
b.ApplyMatrix(MoveMatrix(box.min.clone().add(new Vector3(size.x - leftShrink, frontShrink, spaceSize * i))));
|
||||||
|
else
|
||||||
|
b.ApplyMatrix(MoveMatrix(box.min.clone().add(new Vector3(size.x - leftShrink, frontShrink, size.z / (count + 1) * i + thickness / 2))));
|
||||||
|
|
||||||
|
b.ApplyMatrix(ro);
|
||||||
|
app.m_Database.ModelSpace.Append(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
import { Vector3 } from 'three';
|
||||||
|
|
||||||
|
import { app } from '../../ApplicationServices/Application';
|
||||||
|
import { Board, BoardType } from '../../DatabaseServices/Board';
|
||||||
|
import { Command } from '../../Editor/CommandMachine';
|
||||||
|
import { PromptStatus } from '../../Editor/PromptResult';
|
||||||
|
import { MoveMatrix } from '../../Geometry/GeUtils';
|
||||||
|
import { BoardModalType } from '../../UI/Components/Board/BoardModal';
|
||||||
|
import { SideBoardStore } from '../../UI/Store/BoardStore';
|
||||||
|
import { ModalState } from '../../UI/Store/BoardInterface';
|
||||||
|
|
||||||
|
|
||||||
|
export class DrawLeftRight implements Command
|
||||||
|
{
|
||||||
|
async exec()
|
||||||
|
{
|
||||||
|
let store = SideBoardStore.Store();
|
||||||
|
|
||||||
|
app.m_Editor.m_ModalManage.RenderBoardModal(store, BoardModalType.LR)
|
||||||
|
|
||||||
|
let state = await store.GetBoardOption();
|
||||||
|
|
||||||
|
if (state === ModalState.Ok)
|
||||||
|
{
|
||||||
|
let data = store.m_BoardOption;
|
||||||
|
let lenght = data.height ? parseFloat(data.height) : 0;
|
||||||
|
let width = data.width ? parseFloat(data.width) : 0;
|
||||||
|
let thickness = data.thickness ? parseFloat(data.thickness) : 0;
|
||||||
|
let spacing = data.spaceSize ? parseFloat(data.spaceSize) : 0;
|
||||||
|
|
||||||
|
let leftBarod = Board.CreateBoard(lenght, width, thickness, BoardType.Vertical)
|
||||||
|
let rightBoard = Board.CreateBoard(lenght, width, thickness, BoardType.Vertical);
|
||||||
|
rightBoard.ApplyMatrix(MoveMatrix(new Vector3(spacing - thickness)));
|
||||||
|
|
||||||
|
app.m_Database.ModelSpace.Append(leftBarod);
|
||||||
|
app.m_Database.ModelSpace.Append(rightBoard);
|
||||||
|
|
||||||
|
let ptRes = await app.m_Editor.GetPoint({
|
||||||
|
Msg: "请拾取基点:",
|
||||||
|
Callback: (v) =>
|
||||||
|
{
|
||||||
|
let currentPt = leftBarod.Position;
|
||||||
|
let vec = v.clone().sub(currentPt);
|
||||||
|
|
||||||
|
leftBarod.ApplyMatrix(MoveMatrix(vec));
|
||||||
|
rightBoard.ApplyMatrix(MoveMatrix(vec))
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (ptRes.Status === PromptStatus.Cancel)
|
||||||
|
{
|
||||||
|
rightBoard.Erase();
|
||||||
|
leftBarod.Erase();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
import { app } from '../../ApplicationServices/Application';
|
||||||
|
import { Board } from '../../DatabaseServices/Board';
|
||||||
|
import { Command } from '../../Editor/CommandMachine';
|
||||||
|
import { PromptStatus } from '../../Editor/PromptResult';
|
||||||
|
import { MoveMatrix } from '../../Geometry/GeUtils';
|
||||||
|
import { BoardModalType } from '../../UI/Components/Board/BoardModal';
|
||||||
|
import { ModalState } from '../../UI/Store/BoardInterface';
|
||||||
|
import { SingleBoardStore } from '../../UI/Store/BoardStore';
|
||||||
|
|
||||||
|
export class DrawSingleBoard implements Command
|
||||||
|
{
|
||||||
|
async exec()
|
||||||
|
{
|
||||||
|
let store = SingleBoardStore.Store();
|
||||||
|
app.m_Editor.m_ModalManage.RenderBoardModal(store, BoardModalType.Sg);
|
||||||
|
let state = await store.GetBoardOption();
|
||||||
|
|
||||||
|
if (state !== ModalState.Ok) return;
|
||||||
|
let opt = store.m_BoardOption;
|
||||||
|
let board = Board.CreateBoard(parseFloat(opt.height), parseFloat(opt.width), parseFloat(opt.thickness), opt.type);
|
||||||
|
app.m_Database.ModelSpace.Append(board);
|
||||||
|
|
||||||
|
let ptRes = await app.m_Editor.GetPoint({
|
||||||
|
Msg: "选择基点",
|
||||||
|
Callback: v =>
|
||||||
|
{
|
||||||
|
let oldPt = board.Position;
|
||||||
|
let vec = v.clone().sub(oldPt);
|
||||||
|
board.ApplyMatrix(MoveMatrix(vec));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (ptRes.Status === PromptStatus.Cancel)
|
||||||
|
{
|
||||||
|
board.Erase();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,94 @@
|
|||||||
|
|
||||||
|
import { Matrix4, Vector3 } from 'three';
|
||||||
|
import { app } from '../../ApplicationServices/Application';
|
||||||
|
import { Board, BoardType } from '../../DatabaseServices/Board';
|
||||||
|
import { Command } from '../../Editor/CommandMachine';
|
||||||
|
import { PromptStatus } from '../../Editor/PromptResult';
|
||||||
|
import { MoveMatrix } from '../../Geometry/GeUtils';
|
||||||
|
import { TopBottomBoardStore } from '../../UI/Store/BoardStore';
|
||||||
|
import { BoardModalType } from '../../UI/Components/Board/BoardModal';
|
||||||
|
import { SurroundSpaceParse } from '../../Geometry/SpaceParse/SurroundSpaceParse';
|
||||||
|
import { ModalState, TBBoardOption } from '../../UI/Store/BoardInterface';
|
||||||
|
|
||||||
|
export class DrawTopBottomBoard implements Command
|
||||||
|
{
|
||||||
|
async exec()
|
||||||
|
{
|
||||||
|
let exSsRes = await app.m_Editor.GetSelection({ Msg: "请选择对象<全部选择>:", UseSelect: true });
|
||||||
|
if (exSsRes.Status === PromptStatus.Cancel)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let boardCus = exSsRes.SelectSet.SelectEntityList.filter(en =>
|
||||||
|
en instanceof Board) as Board[];
|
||||||
|
|
||||||
|
if (boardCus.length >= 2)
|
||||||
|
{
|
||||||
|
let spaceParse = new SurroundSpaceParse(boardCus);
|
||||||
|
|
||||||
|
await spaceParse.SpaceParse();
|
||||||
|
|
||||||
|
if (spaceParse.IsVail)
|
||||||
|
{
|
||||||
|
let store = TopBottomBoardStore.Store();
|
||||||
|
|
||||||
|
app.m_Editor.m_ModalManage.RenderBoardModal(store, BoardModalType.TB);
|
||||||
|
|
||||||
|
let state = await store.GetBoardOption();
|
||||||
|
|
||||||
|
if (state === ModalState.Ok)
|
||||||
|
{
|
||||||
|
let topOpt = store.topBoardOption;
|
||||||
|
let bottomOpt = store.bottomBoardOption;
|
||||||
|
|
||||||
|
topOpt.isDraw && this.buildTBBoard(spaceParse, topOpt, spaceParse.BaseTopUpPoint, spaceParse.BaseTopDownPoint, true)
|
||||||
|
bottomOpt.isDraw && this.buildTBBoard(spaceParse, bottomOpt, spaceParse.BaseBottomDownPoint, spaceParse.BaseBottomUpPoint);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
app.m_Editor.m_CommandStore.Prompt("选择板无效")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
app.m_Editor.m_CommandStore.Prompt("不是选择2块板或者板类型不正确")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buildTBBoard(spaceParse: SurroundSpaceParse, opt: TBBoardOption, wrapPt: Vector3, noWrapPt: Vector3, isTop = false)
|
||||||
|
{
|
||||||
|
let board: Board;
|
||||||
|
let basePt: Vector3;
|
||||||
|
let length: number;
|
||||||
|
let thickness = parseFloat(opt.thickness);
|
||||||
|
let offset = parseFloat(opt.offset);
|
||||||
|
|
||||||
|
let rot = new Matrix4().extractRotation(spaceParse.OCS)
|
||||||
|
|
||||||
|
if (opt.isWrapSide)
|
||||||
|
{
|
||||||
|
length = spaceParse.TotalLength;
|
||||||
|
basePt = wrapPt;
|
||||||
|
isTop && basePt.add(new Vector3(0, 0, thickness));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
length = spaceParse.SpaceLength;
|
||||||
|
basePt = noWrapPt;
|
||||||
|
!isTop && basePt.add(new Vector3(0, 0, thickness));
|
||||||
|
basePt.add(new Vector3(0, 0, offset * (isTop ? -1 : 1)));
|
||||||
|
if (!isTop)
|
||||||
|
{
|
||||||
|
let footBoard = Board.CreateBoard(offset, spaceParse.SpaceLength, parseFloat(opt.footThickness), BoardType.Behind);
|
||||||
|
footBoard.ApplyMatrix(MoveMatrix(spaceParse.BaseFootPoint));
|
||||||
|
footBoard.ApplyMatrix(rot);
|
||||||
|
app.m_Database.ModelSpace.Append(footBoard);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
board = Board.CreateBoard(length, spaceParse.SpaceWidth - parseFloat(opt.forwardDistance) + parseFloat(opt.behindDistance), thickness, BoardType.Layer)
|
||||||
|
board.ApplyMatrix(MoveMatrix(basePt));
|
||||||
|
board.ApplyMatrix(rot);
|
||||||
|
app.m_Database.ModelSpace.Append(board);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
import { Matrix4, Vector3 } from 'three';
|
||||||
|
import { app } from '../../ApplicationServices/Application';
|
||||||
|
import { Board, BoardType } from '../../DatabaseServices/Board';
|
||||||
|
import { Box3Ext } from '../../Geometry/Box';
|
||||||
|
import { MoveMatrix } from '../../Geometry/GeUtils';
|
||||||
|
import { DrawBoardTool } from './DrawBoardTool';
|
||||||
|
import { } from '../../UI/Store/BoardStore';
|
||||||
|
import { VerticalBoardOption, BrRelativePos } from '../../UI/Store/BoardInterface';
|
||||||
|
|
||||||
|
export class DrawVerticalBoard extends DrawBoardTool
|
||||||
|
{
|
||||||
|
protected drawType = BoardType.Vertical;
|
||||||
|
|
||||||
|
protected buildBoard(box: Box3Ext, opt: VerticalBoardOption, ro: Matrix4)
|
||||||
|
{
|
||||||
|
let size = box.getSize(new Vector3());
|
||||||
|
|
||||||
|
let frontShrink = parseFloat(opt.frontShrink);
|
||||||
|
let bottomShink = parseFloat(opt.bottomShrink);
|
||||||
|
let width = opt.isTotalWidth ? size.y : parseFloat(opt.width);
|
||||||
|
let length = opt.isTotalLength ? size.z : parseFloat(opt.height);
|
||||||
|
|
||||||
|
width -= frontShrink;
|
||||||
|
length -= bottomShink;
|
||||||
|
|
||||||
|
let count = parseInt(opt.count);
|
||||||
|
let type = opt.boardRelative;
|
||||||
|
let spaceSize = parseFloat(opt.spaceSize);
|
||||||
|
let thickness = parseFloat(opt.thickness);
|
||||||
|
|
||||||
|
let board = Board.CreateBoard(length, width, thickness, BoardType.Vertical);
|
||||||
|
|
||||||
|
for (let i = 1; i <= count; i++)
|
||||||
|
{
|
||||||
|
let b = board.Clone() as Board;
|
||||||
|
if (type === BrRelativePos.Left)
|
||||||
|
b.ApplyMatrix(MoveMatrix(box.min.clone().add(new Vector3(spaceSize * i, frontShrink, bottomShink))));
|
||||||
|
else if (type === BrRelativePos.Right)
|
||||||
|
b.ApplyMatrix(MoveMatrix(box.min.clone().add(new Vector3(size.x - spaceSize * i, frontShrink, bottomShink))));
|
||||||
|
else
|
||||||
|
b.ApplyMatrix(MoveMatrix(box.min.clone().add(new Vector3(size.x / (count + 1) * i + thickness / 2, frontShrink, bottomShink))));
|
||||||
|
|
||||||
|
b.ApplyMatrix(ro);
|
||||||
|
app.m_Database.ModelSpace.Append(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,24 +0,0 @@
|
|||||||
import { Command } from "../Editor/CommandMachine";
|
|
||||||
import { app } from "../ApplicationServices/Application";
|
|
||||||
import { PromptStatus } from "../Editor/PromptResult";
|
|
||||||
import { Line } from "../DatabaseServices/Line";
|
|
||||||
|
|
||||||
|
|
||||||
export class Command_TestBox implements Command
|
|
||||||
{
|
|
||||||
async exec()
|
|
||||||
{
|
|
||||||
let ss = await app.m_Editor.GetSelection();
|
|
||||||
if (ss.Status != PromptStatus.OK)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (let en of ss.SelectSet.SelectEntityList)
|
|
||||||
{
|
|
||||||
let box = en.BoundingBox;
|
|
||||||
|
|
||||||
let line = new Line(box.min, box.max);
|
|
||||||
|
|
||||||
app.m_Database.ModelSpace.Append(line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
import { Command } from "../Editor/CommandMachine";
|
|
||||||
import { Board } from "../DatabaseServices/Board";
|
|
||||||
import { app } from "../ApplicationServices/Application";
|
|
||||||
|
|
||||||
|
|
||||||
export class Command_DrawBoard2 implements Command
|
|
||||||
{
|
|
||||||
async exec()
|
|
||||||
{
|
|
||||||
let br = new Board();
|
|
||||||
br.InitBoard(1.200, 0.600, 0.018);
|
|
||||||
app.m_Database.ModelSpace.Append(br);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,167 +0,0 @@
|
|||||||
import { Vector3 } from 'three';
|
|
||||||
import { app } from '../ApplicationServices/Application';
|
|
||||||
import { GetPointAtCurveDir } from '../Common/CurveUtils';
|
|
||||||
import { matrixAlignCoordSys } from '../Common/Matrix4Utils';
|
|
||||||
import { copyTextToClipboard } from '../Common/Utils';
|
|
||||||
import { Circle } from '../DatabaseServices/Circle';
|
|
||||||
import { Curve } from '../DatabaseServices/Curve';
|
|
||||||
import { Polyline } from '../DatabaseServices/Polyline';
|
|
||||||
import { Region } from '../DatabaseServices/Region';
|
|
||||||
import { Command } from "../Editor/CommandMachine";
|
|
||||||
import { PromptStatus } from "../Editor/PromptResult";
|
|
||||||
import { IntersectOption } from '../GraphicsSystem/IntersectWith';
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export class Test implements Command
|
|
||||||
{
|
|
||||||
constructor()
|
|
||||||
{
|
|
||||||
app.m_Editor.m_CommandStore.Prompt("载入成功!");
|
|
||||||
}
|
|
||||||
|
|
||||||
async exec1()
|
|
||||||
{
|
|
||||||
let e1Res = await app.m_Editor.GetEntity();
|
|
||||||
let e2Res = await app.m_Editor.GetEntity();
|
|
||||||
|
|
||||||
let e1 = e1Res.Entity as Curve;
|
|
||||||
let e2 = e2Res.Entity as Curve;
|
|
||||||
|
|
||||||
let pts = e1.IntersectWith(e2, IntersectOption.OnBothOperands);
|
|
||||||
for (let p of pts)
|
|
||||||
{
|
|
||||||
let c = new Circle(p, 0.01);
|
|
||||||
app.m_Database.ModelSpace.Append(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
//将多段线转换为cad图形
|
|
||||||
async exec4()
|
|
||||||
{
|
|
||||||
// let d = [["Polyline", 1, 1, 12839, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 24, [256.5228611988947, -38.705370748164505], 0, [372.1955588024039, 31.844231195771492], 0, [372.1955588024039, -31.54297461172431], 0, [450.9819163032461, 37.57414810492366], 0, [423.0485713711294, -54.10452244151095], 0, [589.216161736542, 52.97329979827009], 0, [611.0614699526845, -2.177150452319474], 0, [672.6580767260702, 61.21005535517633], 0, [678.0298738284004, 13.938240854670997], 0, [735.329042919922, 21.100636991111184], 0, [684.1179105443746, -21.515620020708024], 0, [730.6734854312358, -32.61733403219032], 0, [815.1897598412304, 38.29038771856768], 0, [835.6025888300849, -8.981426781937659], 0, [862.1034545349137, 74.4604882075907], 0, [943.4539498526012, 74.46048820759069], 0, [986.972668777612, -29.064785548515978], 0, [924.5022496755805, -66.26627108118637], 0, [1001.0109652050348, -106.27541589934134], 0, [965.9152241364777, -128.73669018321777], 0, [1006.6262837760039, -176.46689803645526], 0, [904.1467198558175, -189.8032796425069], 0, [981.3573502066429, -242.44689124534239], 0, [1004.5205393118904, -256.48518767276516], 0, false]]
|
|
||||||
|
|
||||||
// let cadf = new CADFile();
|
|
||||||
// cadf.Data = d;
|
|
||||||
// let en = cadf.ReadObject() as Entity;
|
|
||||||
// if (en)
|
|
||||||
// {
|
|
||||||
// app.m_Database.ModelSpace.Append(en);
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// let d = [["Polyline", 1, 1, 8987, false, 7, -1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 14, [340.820007357324, -3.870032999900914], 0, [431.6163856609081, 116.2815653567217], 0, [485.54806901416487, 54.84040710617603], 0, [533.3356365423672, 67.81131829240235], 0, [624.1320148459513, 40.504136847715344], 0, [656.9006325795757, 23.43714844478601], -0.783383849320176, [633.0068488154745, -74.86870475608706], 0.4462700081240285, [605.0169878346704, -106.27196341747704], -0.8416099256631104, [529.9222388617812, -128.11770857322662], 0, [510.1245323143834, -22.98506001118185], 0, [430.251026588674, -129.48306764546098], 0, [430.251026588674, -65.99387078656383], 0, [351.74287993519897, -145.86737651227318], 0, [303.2726328708796, -87.83961594231337], 0, true]];
|
|
||||||
// let cadf = new CADFile();
|
|
||||||
// cadf.Data = d;
|
|
||||||
// let en = cadf.ReadObject() as Entity;
|
|
||||||
// if (en)
|
|
||||||
// {
|
|
||||||
// app.m_Database.ModelSpace.Append(en);
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
|
||||||
async execn()
|
|
||||||
{
|
|
||||||
let ssRes = await app.m_Editor.GetEntity();
|
|
||||||
if (ssRes.Status != PromptStatus.OK) return;
|
|
||||||
let ptRes = await app.m_Editor.GetPoint();
|
|
||||||
if (ptRes.Status != PromptStatus.OK) return;
|
|
||||||
|
|
||||||
let cu = ssRes.Entity as Polyline;
|
|
||||||
let p = ptRes.Value;
|
|
||||||
|
|
||||||
console.log(cu.PtOnCurve(p));
|
|
||||||
console.log(cu.PtInCurve(p))
|
|
||||||
|
|
||||||
// if (ssRes.Status === PromptStatus.OK)
|
|
||||||
// {
|
|
||||||
// for (let en of ssRes.SelectSet.SelectEntityList)
|
|
||||||
// {
|
|
||||||
// if (en instanceof Curve)
|
|
||||||
// {
|
|
||||||
// if (en.Length < 0.1)
|
|
||||||
// {
|
|
||||||
// console.log(".....");
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
async exec3()
|
|
||||||
{
|
|
||||||
let en = await app.m_Editor.GetEntity();
|
|
||||||
if (en.Status != PromptStatus.OK)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let pl = en.Entity as Polyline;
|
|
||||||
|
|
||||||
for (let i = 0; i < pl.NumberOfVertices; i++)
|
|
||||||
{
|
|
||||||
let pt = pl.GetPointAtParam(i);
|
|
||||||
|
|
||||||
await app.m_Editor.GetPoint({ BasePoint: pt, AllowDrawRubberBand: true });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
async exec2()
|
|
||||||
{
|
|
||||||
let en = await app.m_Editor.GetEntity();
|
|
||||||
if (en.Status != PromptStatus.OK)
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
|
||||||
let en2Res = await app.m_Editor.GetEntity();
|
|
||||||
if (en2Res.Status != PromptStatus.OK)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let r1 = en.Entity as Region;
|
|
||||||
let r2 = en2Res.Entity as Region;
|
|
||||||
|
|
||||||
|
|
||||||
r2 = r2.Clone() as Region;
|
|
||||||
|
|
||||||
r2.ShapeManager.ApplyMatrix(matrixAlignCoordSys(r2.OCS, r1.OCS));
|
|
||||||
|
|
||||||
r1.ShapeManager.ShapeList.forEach(s => s.Explode().forEach(c => app.m_Database.ModelSpace.Append(c)));
|
|
||||||
r2.ShapeManager.ShapeList.forEach(s => s.Explode().forEach(c => app.m_Database.ModelSpace.Append(c)));
|
|
||||||
}
|
|
||||||
|
|
||||||
async exec()
|
|
||||||
{
|
|
||||||
let e = await app.m_Editor.GetEntity();
|
|
||||||
if (e.Status === PromptStatus.OK)
|
|
||||||
{
|
|
||||||
let box = e.Entity.BoundingBox;
|
|
||||||
|
|
||||||
if (e.Entity instanceof Polyline)
|
|
||||||
{
|
|
||||||
console.log(GetPointAtCurveDir(e.Entity, new Vector3(5, 5.5)));
|
|
||||||
this.drawPtDirTestCir(e.Entity);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private drawPtDirTestCir(pl: Polyline)
|
|
||||||
{
|
|
||||||
let box = pl.BoundingBox;
|
|
||||||
let size = box.getSize(new Vector3());
|
|
||||||
box.min.sub(size.clone().multiplyScalar(0.2));
|
|
||||||
box.max.add(size.clone().multiplyScalar(0.2));
|
|
||||||
size.multiplyScalar(0.05);
|
|
||||||
app.m_Database.ModelSpace.Append(pl);
|
|
||||||
for (let j = 0; j < 14 * 2; j++)
|
|
||||||
{
|
|
||||||
let p = box.min.clone();
|
|
||||||
p.x += j * size.x;
|
|
||||||
for (let k = 0; k < 14 * 2; k++)
|
|
||||||
{
|
|
||||||
p.y += size.y;
|
|
||||||
let c = new Circle(p, 0.1);
|
|
||||||
c.ColorIndex = GetPointAtCurveDir(pl, p) ? 3 : 1;
|
|
||||||
app.m_Database.ModelSpace.Append(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,50 @@
|
|||||||
|
import { Command } from "../../Editor/CommandMachine";
|
||||||
|
import { app } from "../../ApplicationServices/Application";
|
||||||
|
import { PromptStatus } from "../../Editor/PromptResult";
|
||||||
|
import { Line } from "../../DatabaseServices/Line";
|
||||||
|
import { SelectLine, SelectBox } from "../../Editor/SelectBox";
|
||||||
|
import { Vec3DTo2D } from "../../Common/CurveUtils";
|
||||||
|
import { SelectSet } from "../../Editor/SelectSet";
|
||||||
|
|
||||||
|
|
||||||
|
export class Command_TestBox implements Command
|
||||||
|
{
|
||||||
|
async exec()
|
||||||
|
{
|
||||||
|
// let ss = await app.m_Editor.GetSelection();
|
||||||
|
// if (ss.Status != PromptStatus.OK)
|
||||||
|
// return;
|
||||||
|
|
||||||
|
// for (let en of ss.SelectSet.SelectEntityList)
|
||||||
|
// {
|
||||||
|
// let box = en.BoundingBox;
|
||||||
|
|
||||||
|
// let line = new Line(box.min, box.max);
|
||||||
|
|
||||||
|
// app.m_Database.ModelSpace.Append(line);
|
||||||
|
// }
|
||||||
|
let ptRes = await app.m_Editor.GetPoint({ Msg: "选择点" })
|
||||||
|
if (ptRes.Status !== PromptStatus.OK)
|
||||||
|
return;
|
||||||
|
let pt1 = ptRes.Value.clone();
|
||||||
|
app.m_Viewer.WorldToScreen(pt1);
|
||||||
|
|
||||||
|
ptRes = await app.m_Editor.GetPoint({
|
||||||
|
Msg: "选择其他点",
|
||||||
|
BasePoint: ptRes.Value,
|
||||||
|
AllowDrawRubberBand: true,
|
||||||
|
Callback: (v) =>
|
||||||
|
{
|
||||||
|
let sss = new SelectSet();
|
||||||
|
let pt = v.clone();
|
||||||
|
app.m_Viewer.WorldToScreen(pt);
|
||||||
|
let sl = new SelectLine(app.m_Viewer, Vec3DTo2D(pt1), Vec3DTo2D(pt.clone()))
|
||||||
|
sl.Select();
|
||||||
|
sss.AddSelect(sl);
|
||||||
|
console.log(sss.SelectEntityList);
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
import { app } from "../../ApplicationServices/Application";
|
||||||
|
import { Board } from "../../DatabaseServices/Board";
|
||||||
|
import { Command } from "../../Editor/CommandMachine";
|
||||||
|
|
||||||
|
|
||||||
|
export class Command_DrawBoard2 implements Command
|
||||||
|
{
|
||||||
|
async exec()
|
||||||
|
{
|
||||||
|
let br = new Board();
|
||||||
|
br.InitBoard(1.200, 0.600, 0.018, 1);
|
||||||
|
|
||||||
|
app.m_Database.ModelSpace.Append(br);
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
import { Command } from "../Editor/CommandMachine";
|
import { Command } from "../../Editor/CommandMachine";
|
||||||
import { DirectionalLight } from "../DatabaseServices/DirectionalLight";
|
import { DirectionalLight } from "../../DatabaseServices/DirectionalLight";
|
||||||
import { app } from "../ApplicationServices/Application";
|
import { app } from "../../ApplicationServices/Application";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
@ -1,6 +1,6 @@
|
|||||||
import { Command } from '../Editor/CommandMachine';
|
import { Command } from '../../Editor/CommandMachine';
|
||||||
import { PointLight } from '../DatabaseServices/PointLight';
|
import { PointLight } from '../../DatabaseServices/PointLight';
|
||||||
import { app } from '../ApplicationServices/Application';
|
import { app } from '../../ApplicationServices/Application';
|
||||||
|
|
||||||
|
|
||||||
export class TestDrawPointLight implements Command
|
export class TestDrawPointLight implements Command
|
@ -1,6 +1,6 @@
|
|||||||
import { Command } from "../Editor/CommandMachine";
|
import { Command } from "../../Editor/CommandMachine";
|
||||||
import { SpotLight } from "../DatabaseServices/SpotLight";
|
import { SpotLight } from "../../DatabaseServices/SpotLight";
|
||||||
import { app } from "../ApplicationServices/Application";
|
import { app } from "../../ApplicationServices/Application";
|
||||||
import { Matrix4 } from "three";
|
import { Matrix4 } from "three";
|
||||||
/**
|
/**
|
||||||
*
|
*
|
@ -0,0 +1,104 @@
|
|||||||
|
import { app } from '../../ApplicationServices/Application';
|
||||||
|
import { matrixAlignCoordSys } from '../../Common/Matrix4Utils';
|
||||||
|
import { Board } from '../../DatabaseServices/Board';
|
||||||
|
import { Polyline } from '../../DatabaseServices/Polyline';
|
||||||
|
import { Region } from '../../DatabaseServices/Region';
|
||||||
|
import { Command } from "../../Editor/CommandMachine";
|
||||||
|
import { PromptStatus } from "../../Editor/PromptResult";
|
||||||
|
import { MoveMatrix } from '../../Geometry/GeUtils';
|
||||||
|
import * as THREE from 'three';
|
||||||
|
import { testBox3 } from './TestCurve';
|
||||||
|
import { Matrix4, Vector3 } from 'three';
|
||||||
|
|
||||||
|
|
||||||
|
export class Test implements Command
|
||||||
|
{
|
||||||
|
constructor()
|
||||||
|
{
|
||||||
|
app.m_Editor.m_CommandStore.Prompt("载入成功!");
|
||||||
|
}
|
||||||
|
async exec()
|
||||||
|
{
|
||||||
|
let b1 = Board.CreateBoard(1200, 600, 18, 0);
|
||||||
|
let b2 = Board.CreateBoard(1200, 600, 18, 1);
|
||||||
|
let b3 = Board.CreateBoard(1200, 600, 18, 2);
|
||||||
|
// let rotate = new Matrix4().makeRotationY(Math.PI / 4);
|
||||||
|
// b1.ApplyMatrix(MoveMatrix(new Vector3(10, 10, 10)))
|
||||||
|
// b2.ApplyMatrix(MoveMatrix(new Vector3(10, 10, 10)))
|
||||||
|
// b3.ApplyMatrix(MoveMatrix(new Vector3(10, 10, 10)))
|
||||||
|
// b1.ApplyMatrix(rotate)
|
||||||
|
// b2.ApplyMatrix(rotate)
|
||||||
|
// b3.ApplyMatrix(rotate)
|
||||||
|
|
||||||
|
app.m_Database.ModelSpace.Append(b1);
|
||||||
|
app.m_Database.ModelSpace.Append(b2);
|
||||||
|
app.m_Database.ModelSpace.Append(b3);
|
||||||
|
// console.log(b1.MinPoint);
|
||||||
|
// console.log(b2.MinPoint);
|
||||||
|
// console.log(b3.MinPoint);
|
||||||
|
console.log(b1.MaxPoint);
|
||||||
|
console.log(b2.MaxPoint);
|
||||||
|
console.log(b3.MaxPoint);
|
||||||
|
console.log(b1.Position);
|
||||||
|
console.log(b2.Position);
|
||||||
|
console.log(b3.Position);
|
||||||
|
// testBox3([b1.BoundingBox, b2.BoundingBox, b3.BoundingBox])
|
||||||
|
// console.log(b1.BoardOCS);
|
||||||
|
// console.log(b2.BoardOCS);
|
||||||
|
// console.log(b3.BoardOCS);
|
||||||
|
|
||||||
|
// let ssRes = await app.m_Editor.GetSelection({ UseSelect: true });
|
||||||
|
|
||||||
|
// if (ssRes.Status === PromptStatus.OK)
|
||||||
|
// {
|
||||||
|
// for (let en of ssRes.SelectSet.SelectEntityList)
|
||||||
|
// {
|
||||||
|
// if (en instanceof Curve)
|
||||||
|
// {
|
||||||
|
// if (en.Length < 0.1)
|
||||||
|
// {
|
||||||
|
// console.log(".....");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
async exec3()
|
||||||
|
{
|
||||||
|
let en = await app.m_Editor.GetEntity();
|
||||||
|
if (en.Status != PromptStatus.OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let pl = en.Entity as Polyline;
|
||||||
|
|
||||||
|
for (let i = 0; i < pl.NumberOfVertices; i++)
|
||||||
|
{
|
||||||
|
let pt = pl.GetPointAtParam(i);
|
||||||
|
|
||||||
|
await app.m_Editor.GetPoint({ BasePoint: pt, AllowDrawRubberBand: true });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async exec2()
|
||||||
|
{
|
||||||
|
let en = await app.m_Editor.GetEntity();
|
||||||
|
if (en.Status != PromptStatus.OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
let en2Res = await app.m_Editor.GetEntity();
|
||||||
|
if (en2Res.Status != PromptStatus.OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let r1 = en.Entity as Region;
|
||||||
|
let r2 = en2Res.Entity as Region;
|
||||||
|
|
||||||
|
|
||||||
|
r2 = r2.Clone() as Region;
|
||||||
|
|
||||||
|
r2.ShapeManager.ApplyMatrix(matrixAlignCoordSys(r2.OCS, r1.OCS));
|
||||||
|
|
||||||
|
r1.ShapeManager.ShapeList.forEach(s => s.Explode().forEach(c => app.m_Database.ModelSpace.Append(c)));
|
||||||
|
r2.ShapeManager.ShapeList.forEach(s => s.Explode().forEach(c => app.m_Database.ModelSpace.Append(c)));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,118 @@
|
|||||||
|
import * as THREE from 'three';
|
||||||
|
import { Object3D } from 'three';
|
||||||
|
import { Vec2DTo3D } from '../Common/CurveUtils';
|
||||||
|
import { Entity } from '../DatabaseServices/Entity';
|
||||||
|
import { Line } from '../DatabaseServices/Line';
|
||||||
|
import { GripScene } from '../GraphicsSystem/GripScene';
|
||||||
|
import { IntersectOption } from '../GraphicsSystem/IntersectWith';
|
||||||
|
import { PreViewer } from '../GraphicsSystem/PreViewer';
|
||||||
|
import { Viewer } from '../GraphicsSystem/Viewer';
|
||||||
|
import { SelectSetBase } from './SelectSet';
|
||||||
|
|
||||||
|
export class SelectLine extends SelectSetBase
|
||||||
|
{
|
||||||
|
private m_Line;
|
||||||
|
|
||||||
|
constructor(view: Viewer | PreViewer, p1: THREE.Vector2, p2: THREE.Vector2)
|
||||||
|
{
|
||||||
|
super(view);
|
||||||
|
this.m_Line = new Line(Vec2DTo3D(p1), Vec2DTo3D(p2));
|
||||||
|
}
|
||||||
|
get Enlity()
|
||||||
|
{
|
||||||
|
let ens: Entity[] = [];
|
||||||
|
for (let obj of this.m_SelectList)
|
||||||
|
{
|
||||||
|
if (obj.userData && obj.userData instanceof Entity)
|
||||||
|
{
|
||||||
|
ens.push(obj.userData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ens;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 执行该方法 会对场景内部的实体进行选择测试. 如果满足条件 将会添加在选择(渲染)列表中.
|
||||||
|
*
|
||||||
|
* @memberof SelectBox
|
||||||
|
*/
|
||||||
|
Select(selectList?: Object3D[])
|
||||||
|
{
|
||||||
|
selectList = selectList || this.m_Viewer.Scene.children;
|
||||||
|
|
||||||
|
let CheckFunction = (obj) => this.IntersectObject(obj);
|
||||||
|
|
||||||
|
for (let obj of selectList)
|
||||||
|
{
|
||||||
|
if (!obj.visible || obj instanceof GripScene || !obj.userData)
|
||||||
|
continue;
|
||||||
|
if (obj.hasOwnProperty("geometry"))
|
||||||
|
{
|
||||||
|
if (CheckFunction(obj))
|
||||||
|
this.m_SelectList.push(obj);
|
||||||
|
}
|
||||||
|
else if (obj instanceof THREE.Group)
|
||||||
|
{
|
||||||
|
for (let ob of obj.children)
|
||||||
|
{
|
||||||
|
if (CheckFunction(ob))
|
||||||
|
{
|
||||||
|
this.m_SelectList.push(obj);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//判断直接是否和选择线相交.该算法包含了投影裁剪线算法.
|
||||||
|
IntersectLine(index1: number, index2: number, screenPts: Array<THREE.Vector3>, worldPts: Array<THREE.Vector3>)
|
||||||
|
{
|
||||||
|
let p1 = screenPts[index1];
|
||||||
|
let p2 = screenPts[index2];
|
||||||
|
let line = new Line(p1.clone(), p2.clone());
|
||||||
|
|
||||||
|
let ins = this.m_Line.IntersectWith(line, IntersectOption.OnBothOperands);
|
||||||
|
if (ins.length > 0)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
IntersectObject(obj: THREE.Object3D): Boolean
|
||||||
|
{
|
||||||
|
let { pts, faces } = this.GetObjectVertices(obj);
|
||||||
|
//转为为屏幕点
|
||||||
|
let screenPts = new Array<THREE.Vector3>();
|
||||||
|
for (let pt of pts)
|
||||||
|
{
|
||||||
|
let p = pt.clone();
|
||||||
|
this.WorldToScreenPoint(p);
|
||||||
|
p.z = 0;
|
||||||
|
screenPts.push(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (faces.length == 0)
|
||||||
|
{
|
||||||
|
for (let index = 0; index < pts.length - 1; index++)
|
||||||
|
{
|
||||||
|
if (this.IntersectLine(index, index + 1, screenPts, pts))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (let face of faces)
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
this.IntersectLine(face.a, face.b, screenPts, pts) ||
|
||||||
|
this.IntersectLine(face.b, face.c, screenPts, pts) ||
|
||||||
|
this.IntersectLine(face.c, face.a, screenPts, pts))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let c of obj.children)
|
||||||
|
if (this.IntersectObject(c))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,65 @@
|
|||||||
|
import * as THREE from 'three';
|
||||||
|
import { Vector3, Box3 } from 'three';
|
||||||
|
import { BoardType } from '../DatabaseServices/Board';
|
||||||
|
import { equaln } from './GeUtils';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*扩展THREE。Box3,添加切割方法,体积等
|
||||||
|
*
|
||||||
|
* @export
|
||||||
|
* @class Box3Ext
|
||||||
|
* @extends {THREE.Box3}
|
||||||
|
*/
|
||||||
|
export class Box3Ext extends THREE.Box3
|
||||||
|
{
|
||||||
|
//切割类型
|
||||||
|
spliteType: BoardType;
|
||||||
|
constructor(min?: Vector3, max?: Vector3)
|
||||||
|
{
|
||||||
|
super(min, max);
|
||||||
|
}
|
||||||
|
get Volume()
|
||||||
|
{
|
||||||
|
let size = this.getSize(new Vector3());
|
||||||
|
return size.x * size.y * size.z;
|
||||||
|
}
|
||||||
|
substract(b: Box3Ext)
|
||||||
|
{
|
||||||
|
let boxes: Box3Ext[] = [];
|
||||||
|
if (this.intersectsBox(b))
|
||||||
|
{
|
||||||
|
let box1 = this.clone();
|
||||||
|
box1.intersect(b);
|
||||||
|
let max = box1.max;
|
||||||
|
let min = box1.min;
|
||||||
|
|
||||||
|
switch (b.spliteType)
|
||||||
|
{
|
||||||
|
case BoardType.Vertical:
|
||||||
|
boxes = [
|
||||||
|
new Box3Ext(min.clone().setX(this.min.x), max.clone().setX(min.x)),
|
||||||
|
new Box3Ext(min.clone().setX(max.x), max.clone().setX(this.max.x))
|
||||||
|
];
|
||||||
|
break;
|
||||||
|
case BoardType.Behind:
|
||||||
|
boxes = [
|
||||||
|
new Box3Ext(min.clone().setY(this.min.y), max.clone().setY(min.y)),
|
||||||
|
new Box3Ext(min.clone().setY(max.y), max.clone().setY(this.max.y))
|
||||||
|
];
|
||||||
|
break;
|
||||||
|
case BoardType.Layer:
|
||||||
|
boxes = [
|
||||||
|
new Box3Ext(min.clone().setZ(max.z), max.clone().setZ(this.max.z)),
|
||||||
|
new Box3Ext(min.clone().setZ(this.min.z), max.clone().setZ(min.z))
|
||||||
|
];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return boxes.filter(b => !b.isEmpty() && !equaln(b.Volume, 0, 1e-6))
|
||||||
|
}
|
||||||
|
intersectsBox(b: Box3)
|
||||||
|
{
|
||||||
|
return super.intersectsBox(b) && (this.clone().intersect(b) as this).Volume > 0;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,255 @@
|
|||||||
|
import { SpaceParse } from "./SpaceParse";
|
||||||
|
import { Vector3, Matrix4 } from "three";
|
||||||
|
import { BoardType, Board } from "../../DatabaseServices/Board";
|
||||||
|
import { equalv3, equaln } from "../GeUtils";
|
||||||
|
import { PromptStatus } from "../../Editor/PromptResult";
|
||||||
|
import { app } from "../../ApplicationServices/Application";
|
||||||
|
|
||||||
|
/**
|
||||||
|
*外围板空间分析(顶底板,背板)
|
||||||
|
*
|
||||||
|
* @export
|
||||||
|
* @class SurroundSpaceParse
|
||||||
|
* @extends {SpaceParse}
|
||||||
|
*/
|
||||||
|
export class SurroundSpaceParse extends SpaceParse
|
||||||
|
{
|
||||||
|
private m_IsVail: boolean;
|
||||||
|
private m_Spacelength: number;
|
||||||
|
private m_TotalLength: number;
|
||||||
|
private m_SpaceWidth: number;
|
||||||
|
//侧包顶顶板基点
|
||||||
|
private m_BaseTopDownPoint: Vector3;
|
||||||
|
// 顶包侧顶板基点
|
||||||
|
private m_BaseTopUpPoint: Vector3;
|
||||||
|
//侧包底底板基点
|
||||||
|
private m_BaseBottomDownPoint: Vector3;
|
||||||
|
//底包侧底板基点
|
||||||
|
private m_BaseBottomUpPoint: Vector3;
|
||||||
|
|
||||||
|
//背板基点
|
||||||
|
private m_BaseBehindPoint: Vector3;
|
||||||
|
private m_BehindLength: number;
|
||||||
|
private m_BaseFootPoint: Vector3;
|
||||||
|
//是否需要选择标准板
|
||||||
|
protected isSetStandardBoard: boolean = true;
|
||||||
|
constructor(boards: Board[], isSet?: boolean)
|
||||||
|
{
|
||||||
|
super(boards);
|
||||||
|
if (isSet !== undefined)
|
||||||
|
this.isSetStandardBoard = isSet;
|
||||||
|
}
|
||||||
|
get IsVail()
|
||||||
|
{
|
||||||
|
return this.m_IsVail;
|
||||||
|
}
|
||||||
|
get SpaceLength()
|
||||||
|
{
|
||||||
|
return this.m_Spacelength;
|
||||||
|
}
|
||||||
|
get TotalLength()
|
||||||
|
{
|
||||||
|
return this.m_TotalLength;
|
||||||
|
}
|
||||||
|
get SpaceWidth()
|
||||||
|
{
|
||||||
|
return this.m_SpaceWidth
|
||||||
|
}
|
||||||
|
get BehindLength()
|
||||||
|
{
|
||||||
|
return this.m_BehindLength;
|
||||||
|
}
|
||||||
|
get BaseTopDownPoint()
|
||||||
|
{
|
||||||
|
return this.m_BaseTopDownPoint;
|
||||||
|
}
|
||||||
|
get BaseTopUpPoint()
|
||||||
|
{
|
||||||
|
return this.m_BaseTopUpPoint;
|
||||||
|
}
|
||||||
|
get BaseBottomDownPoint()
|
||||||
|
{
|
||||||
|
return this.m_BaseBottomDownPoint;
|
||||||
|
}
|
||||||
|
get BaseBottomUpPoint()
|
||||||
|
{
|
||||||
|
return this.m_BaseBottomUpPoint;
|
||||||
|
}
|
||||||
|
get BaseBehindPoint()
|
||||||
|
{
|
||||||
|
return this.m_BaseBehindPoint;
|
||||||
|
}
|
||||||
|
get BaseFootPoint()
|
||||||
|
{
|
||||||
|
return this.m_BaseFootPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
async SpaceParse()
|
||||||
|
{
|
||||||
|
super.SpaceParse();
|
||||||
|
let lrBoards = this.boardMap.get(BoardType.Vertical);
|
||||||
|
if (lrBoards.length === 2)
|
||||||
|
{
|
||||||
|
let b1 = lrBoards[0].Clone() as Board;
|
||||||
|
let b2 = lrBoards[1].Clone() as Board;
|
||||||
|
|
||||||
|
b1.ApplyMatrix(new Matrix4().extractRotation(b1.BoardOCSInv));
|
||||||
|
b2.ApplyMatrix(new Matrix4().extractRotation(b2.BoardOCSInv));
|
||||||
|
|
||||||
|
[this.m_LeftBoard, this.m_RightBoard, b1, b2] =
|
||||||
|
b1.Position.x < b2.Position.x ? [lrBoards[0], lrBoards[1], b1, b2] : [lrBoards[1], lrBoards[0], b2, b1];
|
||||||
|
|
||||||
|
if (this.ParseLRBoards(b1, b2))
|
||||||
|
{
|
||||||
|
let res = await this.GetStandardBoard(b1, b2);
|
||||||
|
|
||||||
|
//选择基准板错误
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
this.m_IsVail = true;
|
||||||
|
this.ParseGeometry(b1, b2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
this.m_IsVail = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ParseLRBoards(b1: Board, b2: Board)
|
||||||
|
{
|
||||||
|
if (b1 && b2)
|
||||||
|
{
|
||||||
|
// 左右侧板位置相等,无效
|
||||||
|
if (equalv3(b1.Position, b2.Position))
|
||||||
|
return false;
|
||||||
|
//左右侧板不平行,无效
|
||||||
|
if (!equaln(Math.abs(b1.Normal.dot(b2.Normal)), 1, 1e-6))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let lMinPt = b1.MinPoint;
|
||||||
|
let rMinPt = b2.MinPoint;
|
||||||
|
|
||||||
|
return Math.abs(lMinPt.x + rMinPt.x) > Math.max(b1.Thickness, b2.Thickness)
|
||||||
|
&& Math.abs(lMinPt.y - rMinPt.y) + 1e-6 < Math.max(b1.Width, b2.Width)
|
||||||
|
&& Math.abs(lMinPt.z - rMinPt.z) + 1e-6 < Math.max(b1.Lenght, b2.Lenght);
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ParseGeometry(b1: Board, b2: Board)
|
||||||
|
{
|
||||||
|
let lMinPt = b1.MinPoint;
|
||||||
|
let rMinPt = b2.MinPoint;
|
||||||
|
|
||||||
|
let lMaxPt = b1.MaxPoint;
|
||||||
|
let rMaxPt = b2.MaxPoint;
|
||||||
|
|
||||||
|
let sMinPt: Vector3;
|
||||||
|
let sMaxPt: Vector3;
|
||||||
|
|
||||||
|
//左右侧板之间的垂直距离
|
||||||
|
let dist = rMinPt.x - lMinPt.x;
|
||||||
|
|
||||||
|
//空间净长
|
||||||
|
this.m_Spacelength = dist - b1.Thickness;
|
||||||
|
//总宽
|
||||||
|
this.m_TotalLength = dist + b2.Thickness;
|
||||||
|
|
||||||
|
//空间宽度
|
||||||
|
this.m_SpaceWidth = this.m_StandardBoard.Width;
|
||||||
|
|
||||||
|
//顶底板基点位置
|
||||||
|
if (this.m_StandardBoard === this.m_LeftBoard)
|
||||||
|
{
|
||||||
|
[sMinPt, sMaxPt] = [lMinPt, lMaxPt];
|
||||||
|
|
||||||
|
this.m_BaseTopDownPoint = new Vector3(rMinPt.x, lMinPt.y);
|
||||||
|
this.m_BaseTopUpPoint = new Vector3(rMinPt.x + b2.Thickness, lMinPt.y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[sMinPt, sMaxPt] = [rMinPt, rMaxPt];
|
||||||
|
|
||||||
|
this.m_BaseTopDownPoint = new Vector3(rMinPt.x, rMinPt.y);
|
||||||
|
this.m_BaseTopUpPoint = new Vector3(rMinPt.x + b2.Thickness, rMinPt.y)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.m_BaseBottomUpPoint = this.m_BaseTopDownPoint.clone();
|
||||||
|
this.m_BaseBottomDownPoint = this.m_BaseTopUpPoint.clone();
|
||||||
|
|
||||||
|
this.m_BaseTopDownPoint.setZ(Math.min(lMaxPt.z, rMaxPt.z));
|
||||||
|
|
||||||
|
this.m_BaseTopUpPoint.setZ(Math.max(lMaxPt.z, rMaxPt.z));
|
||||||
|
|
||||||
|
this.m_BaseBottomUpPoint.setZ(Math.max(lMinPt.z, rMinPt.z));
|
||||||
|
this.m_BaseBottomDownPoint.setZ(Math.min(lMinPt.z, rMinPt.z));
|
||||||
|
|
||||||
|
//背板基点位置
|
||||||
|
this.m_BaseBehindPoint = new Vector3(b1.Position.x, Math.min(lMaxPt.y, rMaxPt.y), Math.min(lMinPt.z, rMinPt.z));
|
||||||
|
|
||||||
|
//地脚板基点位置
|
||||||
|
this.m_BaseFootPoint = this.m_BaseBottomDownPoint.clone();
|
||||||
|
this.m_BaseFootPoint.setX(b1.Position.x);
|
||||||
|
|
||||||
|
//背板长
|
||||||
|
this.m_BehindLength =
|
||||||
|
Math.min(lMaxPt.z, rMaxPt.z) - Math.min(lMinPt.z, rMinPt.z);
|
||||||
|
|
||||||
|
//分析背板
|
||||||
|
let behindBoards = this.boardMap.get(BoardType.Behind);
|
||||||
|
if (behindBoards && behindBoards.length === 1)
|
||||||
|
{
|
||||||
|
let behindBoard = behindBoards[0];
|
||||||
|
|
||||||
|
let b3 = behindBoard.Clone() as Board;
|
||||||
|
let behindNormal = b3.Normal;
|
||||||
|
let bMinPt = b3.MinPoint;
|
||||||
|
|
||||||
|
//背板和左右侧板垂直
|
||||||
|
if (equaln(behindNormal.angleTo(b1.Normal), Math.PI / 2, 1e-6))
|
||||||
|
{
|
||||||
|
if (bMinPt.y < sMaxPt.y - b3.Thickness && bMinPt.y > sMinPt.y + b3.Thickness)
|
||||||
|
{
|
||||||
|
// 背板在左右侧板上,更新空间的宽度
|
||||||
|
this.m_SpaceWidth = Math.abs(bMinPt.y - sMinPt.y + b3.Thickness)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async GetStandardBoard(b1: Board, b2: Board)
|
||||||
|
{
|
||||||
|
let lMinPt = b1.MinPoint;
|
||||||
|
let rMinPt = b2.MinPoint;
|
||||||
|
if ((equaln(lMinPt.y, rMinPt.y)
|
||||||
|
&& equaln(lMinPt.z, rMinPt.z)
|
||||||
|
&& equaln(b1.Width, b2.Width)
|
||||||
|
&& equaln(b1.Lenght, b2.Lenght))
|
||||||
|
|| !this.isSetStandardBoard
|
||||||
|
)
|
||||||
|
{
|
||||||
|
this.m_StandardBoard = this.m_LeftBoard;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
let ssRes = await app.m_Editor.GetEntity({ Msg: "请选择基准板" });
|
||||||
|
|
||||||
|
if (ssRes.Status === PromptStatus.Cancel) return false;
|
||||||
|
|
||||||
|
let baseBoard = ssRes.Entity;
|
||||||
|
|
||||||
|
if (baseBoard instanceof Board)
|
||||||
|
{
|
||||||
|
if ([this.m_LeftBoard, this.m_RightBoard].includes(baseBoard))
|
||||||
|
{
|
||||||
|
this.m_StandardBoard = baseBoard;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,105 @@
|
|||||||
|
import { observer } from 'mobx-react';
|
||||||
|
import * as React from 'react';
|
||||||
|
import { Classes, Radio, RadioGroup } from '@blueprintjs/core';
|
||||||
|
import { observable } from 'mobx';
|
||||||
|
import { BehindHeightPositon, BrRelativePos } from '../../Store/BoardInterface';
|
||||||
|
import { BehindBoardStore } from '../../Store/BoardStore';
|
||||||
|
import { BoardConfigBlock, BoardModel, SetBoardDataBlock, SetBoardDataItem, SetBoardDataItem2, BoardName } from './BoardCommon';
|
||||||
|
|
||||||
|
@observer
|
||||||
|
export class BehindBoardModal extends React.Component<{ store?: BehindBoardStore }, {}>
|
||||||
|
{
|
||||||
|
private m_ScaleParameter = new Map([
|
||||||
|
["knifeRad", "刀具半径"],
|
||||||
|
["grooveAddLength", "槽加长"], ["grooveAddWidth", "槽加宽"], ["grooveAddDepth", "槽加深"]
|
||||||
|
]);
|
||||||
|
@observable private moveDir = "移动";
|
||||||
|
constructor(props)
|
||||||
|
{
|
||||||
|
super(props);
|
||||||
|
let pos = this.props.store.m_BoardOption.boardPosition;
|
||||||
|
if (pos === BehindHeightPositon.ForTop)
|
||||||
|
this.moveDir = "上移"
|
||||||
|
else if (pos === BehindHeightPositon.ForBottom)
|
||||||
|
this.moveDir = "下移"
|
||||||
|
}
|
||||||
|
render()
|
||||||
|
{
|
||||||
|
let store = this.props.store;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<BoardName store={store} className="br-name" />
|
||||||
|
<div className="process-data">
|
||||||
|
<h6 className={Classes.HEADING}>加工数据</h6>
|
||||||
|
<SetBoardDataBlock
|
||||||
|
pars={this.m_ScaleParameter}
|
||||||
|
opt={store.m_BoardOption}
|
||||||
|
className="flexWrap"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h6 className={Classes.HEADING}>板件高度</h6>
|
||||||
|
<RadioGroup
|
||||||
|
className="boardRadio"
|
||||||
|
onChange={e =>
|
||||||
|
{
|
||||||
|
let value = e.currentTarget.value as BehindHeightPositon
|
||||||
|
store.m_BoardOption.boardPosition = value;
|
||||||
|
let height = store.m_BoardOption.height;
|
||||||
|
if (value === BehindHeightPositon.ForTop)
|
||||||
|
{
|
||||||
|
this.moveDir = "上移";
|
||||||
|
store.m_BoardOption.height = height === "H" ? "0" : height
|
||||||
|
}
|
||||||
|
else if (value === BehindHeightPositon.ForBottom)
|
||||||
|
{
|
||||||
|
store.m_BoardOption.height = height === "H" ? "0" : height
|
||||||
|
this.moveDir = "下移";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
store.m_BoardOption.height = "H"
|
||||||
|
|
||||||
|
}}
|
||||||
|
selectedValue={store.m_BoardOption.boardPosition}
|
||||||
|
>
|
||||||
|
<Radio label="总高" value={BehindHeightPositon.AllHeight} />
|
||||||
|
<Radio label="靠上" value={BehindHeightPositon.ForTop} />
|
||||||
|
<Radio label="靠下" value={BehindHeightPositon.ForBottom} />
|
||||||
|
</RadioGroup>
|
||||||
|
<div className="flexWrap">
|
||||||
|
<SetBoardDataItem
|
||||||
|
k="height"
|
||||||
|
opt={store.m_BoardOption}
|
||||||
|
title="板高"
|
||||||
|
isDisabled={store.m_BoardOption.boardPosition === BehindHeightPositon.AllHeight}
|
||||||
|
/>
|
||||||
|
<SetBoardDataItem
|
||||||
|
k="moveDist"
|
||||||
|
opt={store.m_BoardOption}
|
||||||
|
title={this.moveDir}
|
||||||
|
isDisabled={store.m_BoardOption.boardPosition === BehindHeightPositon.AllHeight}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<BoardConfigBlock
|
||||||
|
opt={store.m_BoardOption}
|
||||||
|
opt1={new Map([[BrRelativePos.Front, "靠前"], [BrRelativePos.Back, "靠后"]])}
|
||||||
|
/>
|
||||||
|
<div>
|
||||||
|
<h6 className={Classes.HEADING}>板件尺寸</h6>
|
||||||
|
<div className="boardSize center">
|
||||||
|
<SetBoardDataItem2 title="上延伸" k="topExt" opt={store.m_BoardOption} />
|
||||||
|
<div>
|
||||||
|
<SetBoardDataItem2 title="左延伸" k="leftExt" opt={store.m_BoardOption} />
|
||||||
|
<BoardModel />
|
||||||
|
<SetBoardDataItem2 title="右延伸" k="rightExt" opt={store.m_BoardOption} />
|
||||||
|
</div>
|
||||||
|
<SetBoardDataItem2 title="下延伸" k="bottomExt" opt={store.m_BoardOption} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,263 @@
|
|||||||
|
import { observer } from 'mobx-react';
|
||||||
|
import * as React from 'react';
|
||||||
|
import { Checkbox, Classes, Radio, RadioGroup } from '@blueprintjs/core';
|
||||||
|
import { BrRelativePos, BoardOption, TBBoardOption } from '../../Store/BoardInterface';
|
||||||
|
import { BoardStore } from '../../Store/BoardStore';
|
||||||
|
|
||||||
|
//设置板件数据组件
|
||||||
|
export const SetBoardDataItem = observer(({ k, opt, title, isDisabled = false }: { k: string, title: string, isDisabled?: boolean, opt: BoardOption }) =>
|
||||||
|
<div className="br-set">
|
||||||
|
<span>
|
||||||
|
{title}:
|
||||||
|
</span>
|
||||||
|
<input
|
||||||
|
className="bp3-input"
|
||||||
|
value={opt[k]}
|
||||||
|
disabled={isDisabled}
|
||||||
|
onChange={e =>
|
||||||
|
{
|
||||||
|
opt[k] = e.target.value;
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
//设置板件数据组件
|
||||||
|
export const SetBoardDataItem2 = observer(({ k, opt, title }: { k: string, title: string, opt: BoardOption }) =>
|
||||||
|
<label className="bp3-label bp3-inline">
|
||||||
|
<span>{title}</span>
|
||||||
|
<input
|
||||||
|
className="bp3-input"
|
||||||
|
value={opt[k]}
|
||||||
|
onChange={e =>
|
||||||
|
{
|
||||||
|
opt[k] = e.target.value;
|
||||||
|
}}
|
||||||
|
dir="auto" />
|
||||||
|
</label>
|
||||||
|
);
|
||||||
|
|
||||||
|
export const SetBoardDataBlock = observer(({ pars, opt, className, isInline = false }: { pars: Map<string, string>, className?: string, isInline?: boolean, opt: BoardOption }) =>
|
||||||
|
<div className={className}>
|
||||||
|
{
|
||||||
|
Array.from(pars.keys()).map(k =>
|
||||||
|
isInline ?
|
||||||
|
<SetBoardDataItem2
|
||||||
|
key={k}
|
||||||
|
k={k}
|
||||||
|
opt={opt}
|
||||||
|
title={pars.get(k)}
|
||||||
|
/> : <SetBoardDataItem
|
||||||
|
key={k}
|
||||||
|
k={k}
|
||||||
|
opt={opt}
|
||||||
|
title={pars.get(k)}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
export const TBBoardDataBlock = observer(({ pars, opt, istop }: { pars: Map<string, string>, opt: TBBoardOption, istop: boolean }) =>
|
||||||
|
<div className="pt-card pt-elevation-0 tb-br">
|
||||||
|
<h6 className={Classes.HEADING}>{istop ? "顶板" : "底板"}</h6>
|
||||||
|
<Checkbox
|
||||||
|
checked={opt.isDraw}
|
||||||
|
label="是否绘制"
|
||||||
|
onChange={() => opt.isDraw = !opt.isDraw}
|
||||||
|
/>
|
||||||
|
<RadioGroup
|
||||||
|
className="flex"
|
||||||
|
onChange={e => opt.isWrapSide = e.currentTarget.value === "1"}
|
||||||
|
selectedValue={opt.isWrapSide ? "1" : "0"}
|
||||||
|
>
|
||||||
|
<Radio className="widthHalf" label={istop ? "侧包顶" : "侧包底"} value="0" />
|
||||||
|
<Radio className="widthHalf" label={istop ? "顶包侧" : "底包侧"} value="1" />
|
||||||
|
</RadioGroup>
|
||||||
|
<div className="flexWrap">
|
||||||
|
{
|
||||||
|
Array.from(pars.keys()).map(k =>
|
||||||
|
<SetBoardDataItem
|
||||||
|
title={pars.get(k)}
|
||||||
|
k={k}
|
||||||
|
key={k}
|
||||||
|
opt={opt}
|
||||||
|
isDisabled={
|
||||||
|
((k === "rightExt" || k === "leftExt") && !opt.isWrapSide) ||
|
||||||
|
((k === "offset" || k === "footThickness") && opt.isWrapSide)
|
||||||
|
} />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
export const BoardModel = () =>
|
||||||
|
{
|
||||||
|
return (
|
||||||
|
<label className="boardModel">
|
||||||
|
<span className="arrow arrowtop"></span>
|
||||||
|
<span className="line"></span>
|
||||||
|
<span className="arrow arrowbottom"></span>
|
||||||
|
</label>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export const BoardConfigBlock = observer(({ opt, opt1 }: { opt: BoardOption, opt1: Map<BrRelativePos, string> }) =>
|
||||||
|
{
|
||||||
|
let pars = new Map(
|
||||||
|
[["spaceSize", "空间"], ["count", "板数"], ["thickness", "板厚"]]);
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h6 className={Classes.HEADING}>配置板块</h6>
|
||||||
|
<RadioGroup
|
||||||
|
className="boardRadio"
|
||||||
|
onChange={e =>
|
||||||
|
{
|
||||||
|
let value = e.currentTarget.value as BrRelativePos;
|
||||||
|
opt.boardRelative = value;
|
||||||
|
}}
|
||||||
|
selectedValue={opt.boardRelative}
|
||||||
|
>
|
||||||
|
{
|
||||||
|
Array.from(opt1.keys()).map((k, i) =>
|
||||||
|
<Radio key={i} label={opt1.get(k)} value={k} />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
<Radio label="等分" value={BrRelativePos.Div} />
|
||||||
|
</RadioGroup>
|
||||||
|
<div className="flexWrap">
|
||||||
|
{
|
||||||
|
Array.from(pars.keys()).map(k =>
|
||||||
|
<SetBoardDataItem
|
||||||
|
key={k}
|
||||||
|
k={k}
|
||||||
|
opt={opt}
|
||||||
|
title={pars.get(k)}
|
||||||
|
isDisabled={(k === "spaceSize" && opt.boardRelative === BrRelativePos.Div)}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
});
|
||||||
|
|
||||||
|
export const BoardInfo = (props: { store?: any }) =>
|
||||||
|
{
|
||||||
|
let pars = new Map([
|
||||||
|
["rootName", "房间名"], ["cupboardName", "柜名"]
|
||||||
|
])
|
||||||
|
let matPars = new Map([
|
||||||
|
["matName", "板材名"], ["mat", "材料"], ["color", "颜色"]
|
||||||
|
])
|
||||||
|
return (
|
||||||
|
<div className="board-info">
|
||||||
|
<SetBoardDataBlock
|
||||||
|
pars={pars}
|
||||||
|
opt={{}}
|
||||||
|
isInline={true}
|
||||||
|
/>
|
||||||
|
<div className="flex br-mat">
|
||||||
|
<SetBoardDataBlock
|
||||||
|
pars={matPars}
|
||||||
|
opt={{}}
|
||||||
|
isInline={true}
|
||||||
|
/>
|
||||||
|
<button className="bp3-button bp3-intent-success">选择</button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label className="bp3-label bp3-inline .modifier">
|
||||||
|
<span>纹路</span>
|
||||||
|
<div className="bp3-select bp3-inline .modifier">
|
||||||
|
<select>
|
||||||
|
<option value="0">正纹</option>
|
||||||
|
<option value="1">反纹</option>
|
||||||
|
<option value="1">可翻转</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
<label className="bp3-label bp3-inline .modifier">
|
||||||
|
<span>大孔面</span>
|
||||||
|
<div className="bp3-select .modifier">
|
||||||
|
<select>
|
||||||
|
<option value="0">正</option>
|
||||||
|
<option value="1">反</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
<label className="bp3-label bp3-inline .modifier">
|
||||||
|
<span>排钻</span>
|
||||||
|
<div className="bp3-select .modifier">
|
||||||
|
<select>
|
||||||
|
<option value="0">三合一</option>
|
||||||
|
<option value="1">二合一</option>
|
||||||
|
<option value="1">不排</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
<label className="bp3-label bp3-inline .modifier">
|
||||||
|
<span>排版面</span>
|
||||||
|
<div className="bp3-select .modifier">
|
||||||
|
<select>
|
||||||
|
<option value="0">正面</option>
|
||||||
|
<option value="1">反面</option>
|
||||||
|
<option value="1">随意面</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<label className="bp3-label bp3-inline .modifier">
|
||||||
|
<span>排孔面</span>
|
||||||
|
<div className="inline hole">
|
||||||
|
<Checkbox checked={true} label="正" />
|
||||||
|
<Checkbox checked={true} label="反" />
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
<h6 className={Classes.HEADING}>材料封边</h6>
|
||||||
|
<div className="boardSize center">
|
||||||
|
<input type="text" className="bp3-input" />
|
||||||
|
<div>
|
||||||
|
<input type="text" className="bp3-input" />
|
||||||
|
<BoardModel />
|
||||||
|
<input type="text" className="bp3-input" />
|
||||||
|
</div>
|
||||||
|
<input type="text" className="bp3-input" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
export const Notes = () =>
|
||||||
|
{
|
||||||
|
let nums = [];
|
||||||
|
for (let i = 0; i < 12; i++)
|
||||||
|
{
|
||||||
|
nums.push(
|
||||||
|
<div key={i} className=" note-item">
|
||||||
|
<input type="text" className="bp3-input" />
|
||||||
|
<input type="text" className="bp3-input" />
|
||||||
|
</div>)
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<div className="notes">
|
||||||
|
<div>
|
||||||
|
<label>备注名</label>
|
||||||
|
<label>备注信息</label>
|
||||||
|
</div>
|
||||||
|
{
|
||||||
|
nums
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const BoardName = observer(({ store, className }: { store?: BoardStore, className?: string }) =>
|
||||||
|
<label className="bp3-label bp3-inline">
|
||||||
|
<span>板名称</span>
|
||||||
|
<input
|
||||||
|
className={"bp3-input " + className}
|
||||||
|
value={store.name}
|
||||||
|
onChange={e =>
|
||||||
|
{
|
||||||
|
store.name = e.target.value;
|
||||||
|
}}
|
||||||
|
dir="auto" />
|
||||||
|
</label>
|
||||||
|
)
|
@ -0,0 +1,325 @@
|
|||||||
|
import { Button, InputGroup, Menu, MenuItem, Popover } from '@blueprintjs/core';
|
||||||
|
import { inject } from 'mobx-react';
|
||||||
|
import * as React from 'react';
|
||||||
|
import { KeyBoard } from '../../../Common/KeyEnum';
|
||||||
|
import { IndexedDbStore, StoreName } from '../../../IndexedDb/IndexedDbStore';
|
||||||
|
import { BoardOption, LayerNailOption, ModalState, TBBoardOption } from '../../Store/BoardInterface';
|
||||||
|
import { BehindBoardStore, BoardStore, ClosingStripStore, LayerBoardStore, SideBoardStore, SingleBoardStore, TopBottomBoardStore, VerticalBoardStore } from '../../Store/BoardStore';
|
||||||
|
import { BehindBoardModal } from './BehindBoardModal';
|
||||||
|
import { BoardInfo, Notes } from './BoardCommon';
|
||||||
|
import { ClosingStripModal } from './ClosingStripModal';
|
||||||
|
import { LayerBoardModal } from './LayerBoardModal';
|
||||||
|
import { LeftRightBoardModal } from './leftRightBoardModal';
|
||||||
|
import { SingleBoardModal } from './SingleBoardModal';
|
||||||
|
import { TopBottomBoardModal } from './TopBottomBoardModal';
|
||||||
|
import { VerticalBoardModal } from './VerticalBoardModal';
|
||||||
|
|
||||||
|
export enum BoardModalType
|
||||||
|
{
|
||||||
|
LR = "lr",//左右侧板
|
||||||
|
TB = "tb",//顶底板
|
||||||
|
Be = "be",//背板
|
||||||
|
Ly = "ly",//层板
|
||||||
|
Ve = "ve",//立板
|
||||||
|
Sg = "sg",//单板
|
||||||
|
Skt = "skt",//收口条
|
||||||
|
}
|
||||||
|
|
||||||
|
interface BoardModalProps
|
||||||
|
{
|
||||||
|
type: string,
|
||||||
|
store: BoardStore
|
||||||
|
}
|
||||||
|
interface BoardModalState
|
||||||
|
{
|
||||||
|
configName: string,
|
||||||
|
configs: Map<string, configOption>,
|
||||||
|
}
|
||||||
|
|
||||||
|
//配置属性
|
||||||
|
interface configOption
|
||||||
|
{
|
||||||
|
boardData?: BoardOption,
|
||||||
|
nailData?: LayerNailOption,
|
||||||
|
topBoardData?: TBBoardOption,
|
||||||
|
bottomBoardData?: TBBoardOption,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*板件模态框父组件
|
||||||
|
*
|
||||||
|
* @param {BoardModalProps} props
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
@inject("store")
|
||||||
|
export class BoardModal extends React.Component<BoardModalProps, BoardModalState>
|
||||||
|
{
|
||||||
|
m_ModalMap: Map<BoardModalType, any>;
|
||||||
|
constructor(props: BoardModalProps)
|
||||||
|
{
|
||||||
|
super(props);
|
||||||
|
let store = this.props.store;
|
||||||
|
this.m_ModalMap = new Map([
|
||||||
|
[BoardModalType.LR, <LeftRightBoardModal store={store as SideBoardStore} />],
|
||||||
|
[BoardModalType.TB, <TopBottomBoardModal store={store as TopBottomBoardStore} />],
|
||||||
|
[BoardModalType.Be, <BehindBoardModal store={store as BehindBoardStore} />],
|
||||||
|
[BoardModalType.Ly, <LayerBoardModal store={store as LayerBoardStore} />],
|
||||||
|
[BoardModalType.Ve, <VerticalBoardModal store={store as VerticalBoardStore} />],
|
||||||
|
[BoardModalType.Sg, <SingleBoardModal store={store as SingleBoardStore} />],
|
||||||
|
[BoardModalType.Skt, <ClosingStripModal store={store as ClosingStripStore} />],
|
||||||
|
])
|
||||||
|
this.state = {
|
||||||
|
configName: "默认",
|
||||||
|
configs: new Map(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//保存配置
|
||||||
|
handleSaveConfig = async () =>
|
||||||
|
{
|
||||||
|
let name = this.state.configName;
|
||||||
|
if (name === "")
|
||||||
|
{
|
||||||
|
alert("输入名称");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let dbstore = await IndexedDbStore.CADStore();
|
||||||
|
let brStore = this.props.store;
|
||||||
|
let type = this.props.type;
|
||||||
|
|
||||||
|
//新的配置
|
||||||
|
let newConfig: configOption;
|
||||||
|
if (type === BoardModalType.TB)
|
||||||
|
{
|
||||||
|
newConfig.topBoardData = (brStore as TopBottomBoardStore).topBoardOption;
|
||||||
|
newConfig.bottomBoardData = (brStore as TopBottomBoardStore).bottomBoardOption;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newConfig = {
|
||||||
|
boardData: brStore.m_BoardOption
|
||||||
|
}
|
||||||
|
if (type === BoardModalType.Ly)
|
||||||
|
{
|
||||||
|
newConfig.nailData = (brStore as LayerBoardStore).layerNailOption;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取数据库中对应板类型的配置
|
||||||
|
let brDataMap = await dbstore.Get(StoreName.ConfigData, type) as Map<string, configOption> || new Map();
|
||||||
|
|
||||||
|
let isContinue = true;
|
||||||
|
if (brDataMap.has(name))
|
||||||
|
{
|
||||||
|
isContinue = confirm("该名字存在,是否覆盖值");
|
||||||
|
}
|
||||||
|
if (isContinue)
|
||||||
|
{
|
||||||
|
// 配置添加到数据库
|
||||||
|
brDataMap.set(name, newConfig);
|
||||||
|
|
||||||
|
dbstore.Put(StoreName.ConfigData, type, brDataMap);
|
||||||
|
this.setState({ configs: brDataMap });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//删除配置
|
||||||
|
handleDeleteConfig = async () =>
|
||||||
|
{
|
||||||
|
// 删除视图中的对应项
|
||||||
|
let configs = this.state.configs;
|
||||||
|
let currentName = this.state.configName;
|
||||||
|
configs.delete(currentName);
|
||||||
|
this.setState({ configs });
|
||||||
|
|
||||||
|
//删除数据库中的对应项
|
||||||
|
let dbstore = await IndexedDbStore.CADStore();
|
||||||
|
let type = this.props.type;
|
||||||
|
let brDataMap = await dbstore.Get(StoreName.ConfigData, type) as Map<string, configOption>;
|
||||||
|
brDataMap.delete(currentName);
|
||||||
|
dbstore.Put(StoreName.ConfigData, type, brDataMap);
|
||||||
|
|
||||||
|
//切换到第一项
|
||||||
|
let confNames = Array.from(brDataMap.keys());
|
||||||
|
let newName = confNames.length > 0 ? confNames[0] : "";
|
||||||
|
this.setState({ configName: newName });
|
||||||
|
await this.changeBoardOption(newName);
|
||||||
|
}
|
||||||
|
//更新配置
|
||||||
|
changeBoardOption = async (k: string) =>
|
||||||
|
{
|
||||||
|
this.setState({ configName: k });
|
||||||
|
let dbstore = await IndexedDbStore.CADStore();
|
||||||
|
let type = this.props.type;
|
||||||
|
let brDataMap = await dbstore.Get(StoreName.ConfigData, type) as Map<string, configOption>;
|
||||||
|
let opt = brDataMap.get(k);
|
||||||
|
let store = this.props.store;
|
||||||
|
if (brDataMap && opt)
|
||||||
|
{
|
||||||
|
if (type === BoardModalType.TB)
|
||||||
|
{
|
||||||
|
let topOpt = (store as TopBottomBoardStore).topBoardOption;
|
||||||
|
let bottomOpt = (store as TopBottomBoardStore).bottomBoardOption;
|
||||||
|
Object.assign(topOpt, opt.topBoardData);
|
||||||
|
Object.assign(bottomOpt, opt.bottomBoardData);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
let brOpt = store.m_BoardOption;
|
||||||
|
Object.assign(brOpt, opt.boardData);
|
||||||
|
if (type === BoardModalType.Ly)
|
||||||
|
{
|
||||||
|
let nailData = (store as LayerBoardStore).layerNailOption;
|
||||||
|
Object.assign(nailData, opt.nailData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async componentWillMount()
|
||||||
|
{
|
||||||
|
let dbstore = await IndexedDbStore.CADStore();
|
||||||
|
let type = this.props.type;
|
||||||
|
let brDataMap = await dbstore.Get(StoreName.ConfigData, type) as Map<string, configOption> || new Map();
|
||||||
|
this.setState({ configs: brDataMap });
|
||||||
|
|
||||||
|
let confNames = Array.from(brDataMap.keys());
|
||||||
|
//如果没保存过配置,添加一个默认
|
||||||
|
if (confNames.length === 0)
|
||||||
|
{
|
||||||
|
this.setState({ configName: "默认" });
|
||||||
|
await this.handleSaveConfig();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.setState({ configName: confNames[0] });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
handleKeydown = (e: React.KeyboardEvent) =>
|
||||||
|
{
|
||||||
|
let store = this.props.store;
|
||||||
|
if (e.keyCode === KeyBoard.Enter)
|
||||||
|
{
|
||||||
|
store.OnOk(ModalState.Ok, this.props.type != BoardModalType.Skt);
|
||||||
|
}
|
||||||
|
else if (e.keyCode === KeyBoard.Escape)
|
||||||
|
{
|
||||||
|
store.OnOk(ModalState.Cancel)
|
||||||
|
}
|
||||||
|
e.stopPropagation()
|
||||||
|
}
|
||||||
|
render()
|
||||||
|
{
|
||||||
|
let store = this.props.store;
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className="bp3-dialog-container"
|
||||||
|
id="boardModal"
|
||||||
|
onKeyDown={e => this.handleKeydown(e)} >
|
||||||
|
<div className="bp3-dialog">
|
||||||
|
<div
|
||||||
|
className="bp3-dialog-header"
|
||||||
|
data-id="dragArea"
|
||||||
|
>
|
||||||
|
<span className="bp3-icon-large bp3-icon-inbox"></span>
|
||||||
|
<h4 className="bp3-heading">{store.title}</h4>
|
||||||
|
<button
|
||||||
|
aria-label="Close" className="bp3-dialog-close-button bp3-icon-small-cross"
|
||||||
|
onClick={() => store.OnOk(ModalState.Cancel)}
|
||||||
|
></button>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className="bp3-dialog-body"
|
||||||
|
>
|
||||||
|
<div className="flex">
|
||||||
|
<div className="bp3-card">
|
||||||
|
{
|
||||||
|
this.m_ModalMap.get(this.props.type as BoardModalType)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
<div className="bp3-card">
|
||||||
|
<BoardInfo />
|
||||||
|
</div>
|
||||||
|
<div className="bp3-card">
|
||||||
|
<Notes />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="bp3-dialog-footer">
|
||||||
|
<label className="bp3-label pt-inline .modifier">
|
||||||
|
<div className="cf-select">
|
||||||
|
<label>选择配置</label>
|
||||||
|
<InputGroup
|
||||||
|
className="input-select"
|
||||||
|
value={this.state.configName}
|
||||||
|
onChange={e =>
|
||||||
|
{
|
||||||
|
this.setState({ configName: e.target.value })
|
||||||
|
}}
|
||||||
|
rightElement={
|
||||||
|
< Popover
|
||||||
|
autoFocus={true}
|
||||||
|
modifiers={{
|
||||||
|
arrow: { enabled: false },
|
||||||
|
flip: { enabled: true },
|
||||||
|
keepTogether: { enabled: true },
|
||||||
|
preventOverflow: { enabled: true, boundariesElement: "scrollParent" }
|
||||||
|
}}
|
||||||
|
content={
|
||||||
|
<Menu>
|
||||||
|
{
|
||||||
|
Array.from(this.state.configs.keys())
|
||||||
|
.map((k, i) =>
|
||||||
|
<MenuItem
|
||||||
|
onClick={e => this.changeBoardOption(e.currentTarget.text)}
|
||||||
|
text={k}
|
||||||
|
key={i} />)
|
||||||
|
}
|
||||||
|
</Menu>}
|
||||||
|
target={
|
||||||
|
<Button
|
||||||
|
minimal={true}
|
||||||
|
rightIcon="caret-down"
|
||||||
|
></Button>} />}
|
||||||
|
/>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="bp3-button bp3-intent-success"
|
||||||
|
onClick={async () =>
|
||||||
|
{
|
||||||
|
await this.handleSaveConfig();
|
||||||
|
}}
|
||||||
|
>保存</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="bp3-button bp3-intent-danger"
|
||||||
|
onClick={async () =>
|
||||||
|
{
|
||||||
|
await this.handleDeleteConfig();
|
||||||
|
}}
|
||||||
|
>删除</button>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div className="bp3-dialog-footer-actions">
|
||||||
|
<Button
|
||||||
|
className="LeftRightBtn bp3-intent-success"
|
||||||
|
text="确定"
|
||||||
|
onClick={() =>
|
||||||
|
{
|
||||||
|
store.OnOk(ModalState.Ok, this.props.type != BoardModalType.Skt);
|
||||||
|
}} />
|
||||||
|
|
||||||
|
<Button className="LeftRightBtn bp3-intent-danger" text="取消" onClick={() =>
|
||||||
|
{
|
||||||
|
store.OnOk(ModalState.Cancel);
|
||||||
|
}} />
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
import { observer } from 'mobx-react';
|
||||||
|
import * as React from 'react';
|
||||||
|
import { ClosingStripStore } from '../../Store/BoardStore';
|
||||||
|
import { Classes, RadioGroup, Radio } from '@blueprintjs/core';
|
||||||
|
import { BrRelativePos, StripType } from '../../Store/BoardInterface';
|
||||||
|
import { SetBoardDataBlock } from './BoardCommon';
|
||||||
|
|
||||||
|
|
||||||
|
export const ClosingStripModal =
|
||||||
|
(observer((props: { store?: ClosingStripStore }) =>
|
||||||
|
{
|
||||||
|
let opt = props.store.m_BoardOption;
|
||||||
|
let pars = new Map([["width", "宽度"], ["thickness", "厚度"]]);
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<h6 className={Classes.HEADING}>横条位置</h6>
|
||||||
|
<RadioGroup
|
||||||
|
onChange={e => opt.pos = e.currentTarget.value as BrRelativePos}
|
||||||
|
selectedValue={opt.pos}
|
||||||
|
>
|
||||||
|
<Radio label="左" value={BrRelativePos.Left} />
|
||||||
|
<Radio label="右" value={BrRelativePos.Right} />
|
||||||
|
<Radio label="上" value={BrRelativePos.Top} />
|
||||||
|
</RadioGroup>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h6 className={Classes.HEADING}>横条类型</h6>
|
||||||
|
<RadioGroup
|
||||||
|
onChange={e => opt.type = e.currentTarget.value as StripType}
|
||||||
|
selectedValue={opt.type}
|
||||||
|
>
|
||||||
|
<Radio label="横放" value={StripType.H} />
|
||||||
|
<Radio label="竖放" value={StripType.V} />
|
||||||
|
</RadioGroup>
|
||||||
|
</div>
|
||||||
|
<h6 className={Classes.HEADING}>横条大小</h6>
|
||||||
|
<SetBoardDataBlock
|
||||||
|
pars={pars}
|
||||||
|
opt={props.store.m_BoardOption}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}));
|
@ -0,0 +1,62 @@
|
|||||||
|
import { inject, observer } from 'mobx-react';
|
||||||
|
import * as React from 'react';
|
||||||
|
import { Button } from '../../../../node_modules/@blueprintjs/core';
|
||||||
|
import { ModalState } from '../../Store/BoardInterface';
|
||||||
|
import { DoorStore } from '../../Store/BoardStore';
|
||||||
|
|
||||||
|
@inject("store")
|
||||||
|
@observer
|
||||||
|
export class DoorModal extends React.Component<{ store?: DoorStore }, {}>
|
||||||
|
{
|
||||||
|
constructor(props)
|
||||||
|
{
|
||||||
|
super(props);
|
||||||
|
}
|
||||||
|
|
||||||
|
render()
|
||||||
|
{
|
||||||
|
let store = this.props.store;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
className="bp3-dialog-container"
|
||||||
|
id="boardModal"
|
||||||
|
>
|
||||||
|
<div className="bp3-dialog">
|
||||||
|
<div
|
||||||
|
className="bp3-dialog-header"
|
||||||
|
data-id="dragArea"
|
||||||
|
>
|
||||||
|
<span className="bp3-icon-large bp3-icon-inbox"></span>
|
||||||
|
<h4 className="bp3-heading">门板设计</h4>
|
||||||
|
<button
|
||||||
|
aria-label="Close" className="bp3-dialog-close-button bp3-icon-small-cross"
|
||||||
|
onClick={() => store.OnOk(ModalState.Cancel)}
|
||||||
|
></button>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className="bp3-dialog-body"
|
||||||
|
>
|
||||||
|
<div className="bp3-card">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="bp3-dialog-footer">
|
||||||
|
<div className="bp3-dialog-footer-actions">
|
||||||
|
<Button
|
||||||
|
className="LeftRightBtn bp3-intent-success"
|
||||||
|
text="确定"
|
||||||
|
onClick={() => store.OnOk(ModalState.Ok)}
|
||||||
|
/>
|
||||||
|
<Button className="LeftRightBtn bp3-intent-danger" text="取消"
|
||||||
|
onClick={() => store.OnOk(ModalState.Cancel)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,117 @@
|
|||||||
|
import { Checkbox, Classes } from '@blueprintjs/core';
|
||||||
|
import { observer } from 'mobx-react';
|
||||||
|
import * as React from 'react';
|
||||||
|
import { BrRelativePos } from '../../Store/BoardInterface';
|
||||||
|
import { LayerBoardStore } from '../../Store/BoardStore';
|
||||||
|
import { BoardConfigBlock, SetBoardDataBlock, SetBoardDataItem, BoardName } from './BoardCommon';
|
||||||
|
|
||||||
|
export const LayerBoardModal =
|
||||||
|
(observer((props: { store?: LayerBoardStore }) =>
|
||||||
|
{
|
||||||
|
const scalePars = new Map([["frontShrink", "前缩"], ["leftShrink", "左缩"], ["height", "板长"], ["rightShrink", "右缩"]]);
|
||||||
|
const nailPars1 = new Map([["addCount", "增"], ["dist", "距离"]]);
|
||||||
|
const nailPars2 = new Map([["front", "前边"], ["behind", "后边"], ["count", "个数"], ["rad", "半径"], ["length", "长度"], ["depth", "深度"]]);
|
||||||
|
|
||||||
|
let brOpt = props.store.m_BoardOption;
|
||||||
|
let nailOpt = props.store.layerNailOption;
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<BoardName store={props.store} className="br-name" />
|
||||||
|
<div>
|
||||||
|
<h6 className={Classes.HEADING}>板件尺寸</h6>
|
||||||
|
<div>
|
||||||
|
<div className="flexWrap">
|
||||||
|
<Checkbox checked={brOpt.isTotalLength} className="widthHalf" label="总深" onChange={() =>
|
||||||
|
{
|
||||||
|
brOpt.isTotalLength = !brOpt.isTotalLength;
|
||||||
|
if (brOpt.isTotalLength)
|
||||||
|
brOpt.height = "L";
|
||||||
|
}} />
|
||||||
|
<Checkbox checked={brOpt.isActive} label="活动" className="widthHalf" onChange={() =>
|
||||||
|
{
|
||||||
|
brOpt.isActive = !brOpt.isActive;
|
||||||
|
if (brOpt.isActive)
|
||||||
|
{
|
||||||
|
brOpt.leftShrink = "1";
|
||||||
|
brOpt.rightShrink = "1";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
brOpt.leftShrink = "0";
|
||||||
|
brOpt.rightShrink = "0";
|
||||||
|
}
|
||||||
|
|
||||||
|
}} />
|
||||||
|
</div>
|
||||||
|
<div className="flexWrap">
|
||||||
|
{
|
||||||
|
Array.from(scalePars.keys()).map(k =>
|
||||||
|
<SetBoardDataItem
|
||||||
|
key={k}
|
||||||
|
k={k}
|
||||||
|
opt={brOpt}
|
||||||
|
title={scalePars.get(k)}
|
||||||
|
isDisabled={(k === "height" && brOpt.isTotalLength)}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h6 className={Classes.HEADING}>层板钉</h6>
|
||||||
|
<div>
|
||||||
|
<Checkbox
|
||||||
|
checked={nailOpt.isDraw}
|
||||||
|
label="是否绘制层板钉"
|
||||||
|
disabled={!brOpt.isActive}
|
||||||
|
onChange={() =>
|
||||||
|
{
|
||||||
|
nailOpt.isDraw = !nailOpt.isDraw;
|
||||||
|
}} />
|
||||||
|
<div className="flexWrap">
|
||||||
|
{
|
||||||
|
Array.from(nailPars1.keys()).map(k =>
|
||||||
|
<SetBoardDataItem
|
||||||
|
key={k}
|
||||||
|
k={k}
|
||||||
|
opt={nailOpt}
|
||||||
|
title={nailPars1.get(k)}
|
||||||
|
isDisabled={(k === "addCount" || k === "dist") && (!brOpt.isActive || !nailOpt.isDraw)}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Checkbox
|
||||||
|
checked={nailOpt.isGroup}
|
||||||
|
label="层板钉和层板编组"
|
||||||
|
disabled={!brOpt.isActive}
|
||||||
|
onChange={() =>
|
||||||
|
{
|
||||||
|
nailOpt.isGroup = !nailOpt.isGroup;
|
||||||
|
}} />
|
||||||
|
<Checkbox
|
||||||
|
checked={nailOpt.isInBack}
|
||||||
|
label="背板绘制层板钉"
|
||||||
|
disabled={!brOpt.isActive}
|
||||||
|
onChange={() =>
|
||||||
|
{
|
||||||
|
nailOpt.isInBack = !nailOpt.isInBack;
|
||||||
|
}} />
|
||||||
|
</div>
|
||||||
|
<SetBoardDataBlock
|
||||||
|
pars={nailPars2}
|
||||||
|
opt={props.store.layerNailOption}
|
||||||
|
className="flexWrap"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<BoardConfigBlock
|
||||||
|
opt={props.store.m_BoardOption}
|
||||||
|
opt1={new Map([[BrRelativePos.Top, "靠上"], [BrRelativePos.Bottom, "靠下"]])}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}))
|
@ -0,0 +1,41 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { observer } from "mobx-react";
|
||||||
|
import { BoardType } from "../../../DatabaseServices/Board";
|
||||||
|
import { SingleBoardStore } from "../../Store/BoardStore";
|
||||||
|
import { BoardName, SetBoardDataBlock } from "./BoardCommon";
|
||||||
|
|
||||||
|
export const SingleBoardModal =
|
||||||
|
(observer((props: { store?: SingleBoardStore }) =>
|
||||||
|
{
|
||||||
|
let pars = new Map([["height", "板高"], ["width", "柜宽"], ["thickness", "板厚"],
|
||||||
|
["spliteHeight", "拆单高"], ["spliteWidth", "拆单宽"], ["spliteThickness", "拆单厚"],
|
||||||
|
["rotateX", "旋转X"], ["rotateY", "旋转Y"], ["rotateZ", "旋转Z"]
|
||||||
|
]);
|
||||||
|
let opt = props.store.m_BoardOption;
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<label className="bp3-label bp3-inline .modifier">
|
||||||
|
<span>板类型</span>
|
||||||
|
<div className="bp3-select bp3-inline .modifier">
|
||||||
|
<select
|
||||||
|
value={opt.type + ""}
|
||||||
|
onChange={e =>
|
||||||
|
{
|
||||||
|
opt.type = parseFloat(e.target.value);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<option value={BoardType.Layer + ""}>层板</option>
|
||||||
|
<option value={BoardType.Vertical + ""}>立板</option>
|
||||||
|
<option value={BoardType.Behind + ""}>背板</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
<BoardName store={props.store} />
|
||||||
|
<SetBoardDataBlock
|
||||||
|
pars={pars}
|
||||||
|
opt={opt}
|
||||||
|
isInline={true}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}));
|
@ -0,0 +1,30 @@
|
|||||||
|
import { observer } from 'mobx-react';
|
||||||
|
import * as React from 'react';
|
||||||
|
import { TopBottomBoardStore } from '../../Store/BoardStore';
|
||||||
|
import { TBBoardDataBlock } from './BoardCommon';
|
||||||
|
|
||||||
|
export const TopBottomBoardModal =
|
||||||
|
(observer((props: { store?: TopBottomBoardStore }) =>
|
||||||
|
{
|
||||||
|
let store = props.store;
|
||||||
|
|
||||||
|
let pars = new Map([
|
||||||
|
["thickness", "板厚"], ["forwardDistance", "前距"], ["behindDistance", "后距"],
|
||||||
|
["leftExt", "左延伸"], ["rightExt", "右延伸"],
|
||||||
|
["offset", "偏移"], ["footThickness", "地脚厚"]
|
||||||
|
]);
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<TBBoardDataBlock
|
||||||
|
opt={store.topBoardOption}
|
||||||
|
pars={pars}
|
||||||
|
istop={true}
|
||||||
|
/>
|
||||||
|
<TBBoardDataBlock
|
||||||
|
opt={store.bottomBoardOption}
|
||||||
|
pars={pars}
|
||||||
|
istop={false}
|
||||||
|
/>
|
||||||
|
</ div>
|
||||||
|
)
|
||||||
|
}))
|
@ -0,0 +1,57 @@
|
|||||||
|
import { Checkbox, Classes } from '@blueprintjs/core';
|
||||||
|
import { observer } from 'mobx-react';
|
||||||
|
import * as React from 'react';
|
||||||
|
import { BrRelativePos } from '../../Store/BoardInterface';
|
||||||
|
import { VerticalBoardStore } from '../../Store/BoardStore';
|
||||||
|
import { BoardConfigBlock, SetBoardDataItem, BoardName } from './BoardCommon';
|
||||||
|
|
||||||
|
export const VerticalBoardModal =
|
||||||
|
(observer((props: { store?: VerticalBoardStore }) =>
|
||||||
|
{
|
||||||
|
const store = props.store;
|
||||||
|
const scalePars = new Map([["frontShrink", "前缩"], ["bottomShrink", "位高"], ["width", "板宽"], ["height", "板高"]]);
|
||||||
|
const brOpt = store.m_BoardOption;
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<BoardName store={props.store} className="br-name" />
|
||||||
|
<div>
|
||||||
|
<h6 className={Classes.HEADING}>立板大小</h6 >
|
||||||
|
<div>
|
||||||
|
<div className="flex">
|
||||||
|
<Checkbox checked={brOpt.isTotalWidth} className="widthHalf" label="总深" onChange={() =>
|
||||||
|
{
|
||||||
|
brOpt.isTotalWidth = !brOpt.isTotalWidth;
|
||||||
|
if (brOpt.isTotalWidth)
|
||||||
|
brOpt.width = "L";
|
||||||
|
}} />
|
||||||
|
<Checkbox checked={brOpt.isTotalLength} className="widthHalf" label="总高" onChange={() =>
|
||||||
|
{
|
||||||
|
brOpt.isTotalLength = !brOpt.isTotalLength;
|
||||||
|
if (brOpt.isTotalLength)
|
||||||
|
brOpt.height = "H";
|
||||||
|
}} />
|
||||||
|
</div>
|
||||||
|
<div className="flexWrap">
|
||||||
|
{
|
||||||
|
Array.from(scalePars.keys()).map(k =>
|
||||||
|
<SetBoardDataItem
|
||||||
|
key={k}
|
||||||
|
k={k}
|
||||||
|
opt={store.m_BoardOption}
|
||||||
|
title={scalePars.get(k)}
|
||||||
|
isDisabled={(k === "width" && store.m_BoardOption.isTotalWidth)
|
||||||
|
|| (k === "height" && store.m_BoardOption.isTotalLength)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<BoardConfigBlock
|
||||||
|
opt={store.m_BoardOption}
|
||||||
|
opt1={new Map([[BrRelativePos.Left, "靠左"], [BrRelativePos.Right, "靠右"]])}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}))
|
@ -0,0 +1,19 @@
|
|||||||
|
import { observer } from 'mobx-react';
|
||||||
|
import * as React from 'react';
|
||||||
|
import { SideBoardStore } from '../../Store/BoardStore';
|
||||||
|
import { SetBoardDataBlock } from './BoardCommon';
|
||||||
|
|
||||||
|
|
||||||
|
export const LeftRightBoardModal =
|
||||||
|
(observer((props: { store?: SideBoardStore }) =>
|
||||||
|
{
|
||||||
|
let pars = new Map([["height", "柜高"], ["width", "柜深"], ["thickness", "板厚"], ["spaceSize", "总宽"]]);
|
||||||
|
return (
|
||||||
|
<SetBoardDataBlock
|
||||||
|
pars={pars}
|
||||||
|
opt={props.store.m_BoardOption}
|
||||||
|
isInline={true}
|
||||||
|
className="lr-br"
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}));
|
@ -0,0 +1,233 @@
|
|||||||
|
#modal{
|
||||||
|
position: fixed;
|
||||||
|
}
|
||||||
|
#modal .bp3-dialog{
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
#lightModal h5{
|
||||||
|
color: #CCCCCC;
|
||||||
|
}
|
||||||
|
#lightModal .bp3-dialog{
|
||||||
|
background: #444444;
|
||||||
|
color: #CCCCCC;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
#lightModal .bp3-dialog-header{
|
||||||
|
background: #394b59
|
||||||
|
}
|
||||||
|
#modal .bp3-dialog>.behind-board>div{
|
||||||
|
margin:10px 0;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
#modal .bp3-dialog-body .twoCol>label{
|
||||||
|
display: inline-block;
|
||||||
|
width: 20%;
|
||||||
|
vertical-align: super;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
#modal .bp3-dialog-body .twoCol>input{
|
||||||
|
vertical-align: super;
|
||||||
|
width: 75%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#lightModal ul{
|
||||||
|
display: inline-block;
|
||||||
|
list-style: none;
|
||||||
|
padding-left: 0;
|
||||||
|
width: 75%;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
#lightModal li{
|
||||||
|
display: inline-block;
|
||||||
|
width: 33.3333%
|
||||||
|
}
|
||||||
|
|
||||||
|
// 输入框高度
|
||||||
|
@inputHeight:1.5rem;
|
||||||
|
@noteInputHeight:2.5rem;
|
||||||
|
@selectWidth:10rem;
|
||||||
|
@inputWidth:6rem;
|
||||||
|
@nameInput:12rem;
|
||||||
|
|
||||||
|
/**************板件模态框样式*************/
|
||||||
|
/* 板件input样式调整 */
|
||||||
|
#boardModal .bp3-dialog-body .bp3-label{
|
||||||
|
line-height: @inputHeight;
|
||||||
|
}
|
||||||
|
#boardModal .bp3-dialog-body .bp3-label>span{
|
||||||
|
display: inline-block;
|
||||||
|
width: 3.5rem;
|
||||||
|
}
|
||||||
|
#boardModal .bp3-dialog-body .bp3-input,#boardModal .bp3-dialog-body .bp3-select>select{
|
||||||
|
height:@inputHeight;
|
||||||
|
}
|
||||||
|
#boardModal .bp3-dialog-body .bp3-select>select{
|
||||||
|
width: @inputWidth;
|
||||||
|
}
|
||||||
|
#boardModal .notes {
|
||||||
|
.bp3-input{
|
||||||
|
height: @noteInputHeight;
|
||||||
|
}
|
||||||
|
.bp3-label{
|
||||||
|
line-height: @noteInputHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#boardModal .bp3-dialog-body .bp3-select::after{
|
||||||
|
top:1px;
|
||||||
|
right: 1px;
|
||||||
|
}
|
||||||
|
/* Radio调整 */
|
||||||
|
#boardModal .bp3-control.bp3-radio .bp3-control-indicator{
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
#boardModal .bp3-control.bp3-radio .bp3-control-indicator::before{
|
||||||
|
background: #137cbd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#boardModal .boardRadio{
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
#boardModal .boardRadio>label{
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
#boardModal .flexWrap{
|
||||||
|
width: 200px;
|
||||||
|
}
|
||||||
|
#boardModal .flexWrap>div{
|
||||||
|
width: 50%;
|
||||||
|
line-height: 15px;
|
||||||
|
}
|
||||||
|
#boardModal .flexWrap>div .bp3-input{
|
||||||
|
padding:0 0 0 5px;
|
||||||
|
width: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 板件模型设置 */
|
||||||
|
#boardModal .boardModel{
|
||||||
|
display: inline-block;
|
||||||
|
width: 35px;
|
||||||
|
height: 50px;
|
||||||
|
border: 1px solid #000;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
#boardModal .boardSize .bp3-label,#boardModal .behind-board .board-info .boardSize .bp3-input{
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0 5px;
|
||||||
|
}
|
||||||
|
#boardModal .boardSize .bp3-inline{
|
||||||
|
line-height: 15px;
|
||||||
|
}
|
||||||
|
#boardModal .boardSize .bp3-label>.bp3-input{
|
||||||
|
display: block;
|
||||||
|
padding: 0;
|
||||||
|
padding-left: 5px;
|
||||||
|
line-height: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#boardModal .br-set{
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
#boardModal .process-data .br-set input{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
#boardModal .br-set>span{
|
||||||
|
display: inline-block;
|
||||||
|
width: 3rem;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
#boardModal .bp3-dialog{
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#boardModal .bp3-dialog-footer{
|
||||||
|
box-shadow: 0 0 0 1px rgba(16, 22, 26, 0.15);
|
||||||
|
background: #ffffff;
|
||||||
|
margin: 0;
|
||||||
|
padding:10px 20px;
|
||||||
|
border-radius:0 0 6px 6px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
#boardModal .bp3-dialog-footer .bp3-label{
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
#boardModal .bp3-dialog-footer .bp3-input{
|
||||||
|
width: @selectWidth;
|
||||||
|
}
|
||||||
|
#boardModal .bp3-dialog-footer .cf-select{
|
||||||
|
vertical-align: middle;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
#boardModal .input-select{
|
||||||
|
display: inline-block;
|
||||||
|
width: @selectWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
#boardModal .input-select>input, #boardModal .input-select span {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
#boardModal .behind-board{
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 板材信息 */
|
||||||
|
#boardModal{
|
||||||
|
.bp3-input,.lr-br .bp3-input{
|
||||||
|
width: @inputWidth;
|
||||||
|
}
|
||||||
|
.boardSize .bp3-input{
|
||||||
|
width: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//板名称输入框大小
|
||||||
|
#boardModal .br-name{
|
||||||
|
width: @nameInput;
|
||||||
|
}
|
||||||
|
/* 排孔选项 */
|
||||||
|
#boardModal .hole{
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
}
|
||||||
|
#boardModal .hole>label{
|
||||||
|
display: inline-block;
|
||||||
|
margin-right: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 备注信息 */
|
||||||
|
#boardModal .notes{
|
||||||
|
width: 20vmin;
|
||||||
|
}
|
||||||
|
#boardModal .notes>div{
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
#boardModal .notes>div>label{
|
||||||
|
border: 1px solid #bfc1c3;
|
||||||
|
height: @noteInputHeight;
|
||||||
|
line-height: @noteInputHeight;
|
||||||
|
}
|
||||||
|
#boardModal .notes>div>label:first-child ,#boardModal .notes>div>input:first-child{
|
||||||
|
width: 30%;
|
||||||
|
}
|
||||||
|
#boardModal .notes>div>label:last-child ,#boardModal .notes>div>input:last-child{
|
||||||
|
width: 70%;
|
||||||
|
}
|
||||||
|
#boardModal .notes>div input:hover{
|
||||||
|
background: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
//选择材质
|
||||||
|
#boardModal{
|
||||||
|
.br-mat{
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
.br-mat>div>label:last-child{
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,162 @@
|
|||||||
|
import { BoardType } from "../../DatabaseServices/Board";
|
||||||
|
|
||||||
|
/**
|
||||||
|
*模态框状态
|
||||||
|
* @export
|
||||||
|
* @enum {number}
|
||||||
|
*/
|
||||||
|
export enum ModalState
|
||||||
|
{
|
||||||
|
Ok = 1,
|
||||||
|
Cancel = -1
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
*背板靠上还是靠下
|
||||||
|
*
|
||||||
|
* @export
|
||||||
|
* @enum {number}
|
||||||
|
*/
|
||||||
|
export enum BehindHeightPositon
|
||||||
|
{
|
||||||
|
ForTop = "top", //靠上
|
||||||
|
ForBottom = "bottom",//靠下
|
||||||
|
AllHeight = "all" //总高
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*板件相对位置
|
||||||
|
*
|
||||||
|
* @export
|
||||||
|
* @enum {number}
|
||||||
|
*/
|
||||||
|
export enum BrRelativePos
|
||||||
|
{
|
||||||
|
Front = "front",
|
||||||
|
Back = "back",
|
||||||
|
Top = "top",
|
||||||
|
Bottom = "bottom",
|
||||||
|
Left = "left",
|
||||||
|
Right = "right",
|
||||||
|
Div = "div"
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*板件参数
|
||||||
|
*
|
||||||
|
* @export
|
||||||
|
* @interface BoardOption
|
||||||
|
*/
|
||||||
|
export interface BoardOption
|
||||||
|
{
|
||||||
|
thickness?: string, //厚度
|
||||||
|
height?: string, //长
|
||||||
|
width?: string //宽
|
||||||
|
spaceSize?: string
|
||||||
|
count?: string,
|
||||||
|
boardRelative?: BrRelativePos
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*背板参数
|
||||||
|
*
|
||||||
|
* @export
|
||||||
|
* @interface BehindBoardOption
|
||||||
|
* @extends {BoardOption}
|
||||||
|
*/
|
||||||
|
export interface BehindBoardOption extends BoardOption
|
||||||
|
{
|
||||||
|
leftExt: string,
|
||||||
|
rightExt: string,
|
||||||
|
topExt: string,
|
||||||
|
bottomExt: string,
|
||||||
|
knifeRad: string,
|
||||||
|
grooveAddLength: string,
|
||||||
|
grooveAddWidth: string,
|
||||||
|
grooveAddDepth: string,
|
||||||
|
boardPosition: BehindHeightPositon,
|
||||||
|
moveDist: string,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*层板参数
|
||||||
|
*
|
||||||
|
* @export
|
||||||
|
* @interface LayerBoardOption
|
||||||
|
* @extends {BoardOption}
|
||||||
|
*/
|
||||||
|
export interface LayerBoardOption extends BoardOption
|
||||||
|
{
|
||||||
|
frontShrink: string,
|
||||||
|
leftShrink: string,
|
||||||
|
rightShrink: string,
|
||||||
|
isTotalLength: boolean,
|
||||||
|
isActive: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*层板钉参数
|
||||||
|
*
|
||||||
|
* @export
|
||||||
|
* @interface LayerNailOption
|
||||||
|
*/
|
||||||
|
export interface LayerNailOption
|
||||||
|
{
|
||||||
|
isDraw: boolean, //是否绘制
|
||||||
|
addCount: string,//增
|
||||||
|
dist: string,
|
||||||
|
isGroup: boolean,
|
||||||
|
isInBack: boolean, //是否在背板绘制
|
||||||
|
front: string,
|
||||||
|
behind: string,
|
||||||
|
count: string,
|
||||||
|
rad: string,
|
||||||
|
length: string,
|
||||||
|
depth: string
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*立板参数
|
||||||
|
*
|
||||||
|
* @export
|
||||||
|
* @interface VerticalBoardOption
|
||||||
|
* @extends {BoardOption}
|
||||||
|
*/
|
||||||
|
export interface VerticalBoardOption extends BoardOption
|
||||||
|
{
|
||||||
|
frontShrink: string, //前缩
|
||||||
|
bottomShrink: string,//底缩
|
||||||
|
isTotalLength: boolean, //是否取总高
|
||||||
|
isTotalWidth: boolean,//是否取总宽
|
||||||
|
}
|
||||||
|
export interface TBBoardOption extends BoardOption
|
||||||
|
{
|
||||||
|
isDraw: boolean,
|
||||||
|
forwardDistance: string,
|
||||||
|
behindDistance: string,
|
||||||
|
isWrapSide: boolean,
|
||||||
|
leftExt: string,
|
||||||
|
rightExt: string,
|
||||||
|
offset: string,
|
||||||
|
footThickness: string
|
||||||
|
}
|
||||||
|
export interface SingleBoardOption extends BoardOption
|
||||||
|
{
|
||||||
|
type: BoardType,
|
||||||
|
rotateX: string,
|
||||||
|
rotateY: string,
|
||||||
|
rotateZ: string,
|
||||||
|
spliteHeight: string,
|
||||||
|
spliteWidth: string,
|
||||||
|
spliteThickness: string
|
||||||
|
}
|
||||||
|
export enum StripType
|
||||||
|
{
|
||||||
|
H = "h",
|
||||||
|
V = "v"
|
||||||
|
}
|
||||||
|
export interface ClosingStripOption extends BoardOption
|
||||||
|
{
|
||||||
|
pos: BrRelativePos,
|
||||||
|
type: StripType
|
||||||
|
}
|
@ -0,0 +1,244 @@
|
|||||||
|
|
||||||
|
import { observable } from 'mobx';
|
||||||
|
import { app } from '../../ApplicationServices/Application';
|
||||||
|
import * as xaop from 'xaop';
|
||||||
|
import { KeyBoard } from '../../Common/KeyEnum';
|
||||||
|
import { ModalState, BoardOption, BehindBoardOption, BehindHeightPositon, BrRelativePos, LayerBoardOption, LayerNailOption, VerticalBoardOption, TBBoardOption, SingleBoardOption, ClosingStripOption, StripType } from './BoardInterface';
|
||||||
|
import { BoardType } from '../../DatabaseServices/Board';
|
||||||
|
|
||||||
|
export class BoardStore
|
||||||
|
{
|
||||||
|
protected m_PromisRes: (res: number) => void;//promis回调;
|
||||||
|
name: string;
|
||||||
|
m_BoardOption: BoardOption;
|
||||||
|
title: string;
|
||||||
|
//事件
|
||||||
|
private events: Function[] = [];
|
||||||
|
//是否连续绘制
|
||||||
|
registerEvent()
|
||||||
|
{
|
||||||
|
this.events.push(
|
||||||
|
xaop.end(app.m_Editor.m_KeyCtrl, app.m_Editor.m_KeyCtrl.OnKeyDown, (e: KeyboardEvent) =>
|
||||||
|
{
|
||||||
|
if (e.keyCode === KeyBoard.Enter || e.keyCode === KeyBoard.Space)
|
||||||
|
{
|
||||||
|
this.OnOk(ModalState.Ok, this.title !== "收口条");
|
||||||
|
}
|
||||||
|
else if (e.keyCode === KeyBoard.Escape)
|
||||||
|
{
|
||||||
|
this.OnOk(ModalState.Cancel);
|
||||||
|
}
|
||||||
|
e.stopPropagation();
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
GetBoardOption()
|
||||||
|
{
|
||||||
|
this.registerEvent();
|
||||||
|
return new Promise<number>((res) =>
|
||||||
|
{
|
||||||
|
this.m_PromisRes = res;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
OnOk(state: number, isClose: boolean = true)
|
||||||
|
{
|
||||||
|
this.events.forEach(f => f())
|
||||||
|
this.events.length = 0;
|
||||||
|
isClose && app.m_Editor.m_ModalManage.Clear();
|
||||||
|
if (this.m_PromisRes) this.m_PromisRes(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
export class SideBoardStore extends BoardStore
|
||||||
|
{
|
||||||
|
//板数据
|
||||||
|
@observable m_BoardOption: BoardOption = {
|
||||||
|
height: "1200",
|
||||||
|
width: "600",
|
||||||
|
thickness: "18",
|
||||||
|
spaceSize: "836"
|
||||||
|
};
|
||||||
|
title = "左右侧板";
|
||||||
|
private static _store: SideBoardStore;
|
||||||
|
static Store()
|
||||||
|
{
|
||||||
|
if (!this._store) this._store = new SideBoardStore();
|
||||||
|
return this._store;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class TopBottomBoardStore extends BoardStore
|
||||||
|
{
|
||||||
|
@observable topBoardOption: TBBoardOption = {
|
||||||
|
isDraw: true,
|
||||||
|
thickness: "18",
|
||||||
|
forwardDistance: "0",
|
||||||
|
behindDistance: "-18",
|
||||||
|
isWrapSide: false,
|
||||||
|
leftExt: "0",
|
||||||
|
rightExt: "0",
|
||||||
|
offset: "0",
|
||||||
|
footThickness: "18"
|
||||||
|
};
|
||||||
|
@observable bottomBoardOption: TBBoardOption = {
|
||||||
|
isDraw: true,
|
||||||
|
thickness: "18",
|
||||||
|
forwardDistance: "0",
|
||||||
|
behindDistance: "-18",
|
||||||
|
isWrapSide: false,
|
||||||
|
leftExt: "0",
|
||||||
|
rightExt: "0",
|
||||||
|
offset: "80",
|
||||||
|
footThickness: "18"
|
||||||
|
};
|
||||||
|
title = "顶底板";
|
||||||
|
private static _store: TopBottomBoardStore;
|
||||||
|
static Store()
|
||||||
|
{
|
||||||
|
if (!this._store) this._store = new TopBottomBoardStore();
|
||||||
|
return this._store;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class BehindBoardStore extends BoardStore
|
||||||
|
{
|
||||||
|
title = "背板";
|
||||||
|
@observable name = "背板";
|
||||||
|
@observable m_BoardOption: BehindBoardOption = {
|
||||||
|
leftExt: "0",
|
||||||
|
rightExt: "0",
|
||||||
|
topExt: "0",
|
||||||
|
bottomExt: "0",
|
||||||
|
thickness: "18",
|
||||||
|
knifeRad: "3",
|
||||||
|
grooveAddLength: "0",
|
||||||
|
grooveAddWidth: "0",
|
||||||
|
grooveAddDepth: "0",
|
||||||
|
boardPosition: BehindHeightPositon.AllHeight,
|
||||||
|
height: "H",
|
||||||
|
moveDist: "0",
|
||||||
|
boardRelative: BrRelativePos.Back,
|
||||||
|
spaceSize: "0",
|
||||||
|
count: "1"
|
||||||
|
};
|
||||||
|
private static _store: BehindBoardStore;
|
||||||
|
static Store()
|
||||||
|
{
|
||||||
|
if (!this._store) this._store = new BehindBoardStore();
|
||||||
|
return this._store;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class LayerBoardStore extends BoardStore
|
||||||
|
{
|
||||||
|
title = "层板";
|
||||||
|
@observable name = "层板"
|
||||||
|
@observable m_BoardOption: LayerBoardOption = {
|
||||||
|
frontShrink: "0",
|
||||||
|
leftShrink: "0",
|
||||||
|
rightShrink: "0",
|
||||||
|
height: "L",
|
||||||
|
isTotalLength: true,
|
||||||
|
boardRelative: BrRelativePos.Div,
|
||||||
|
thickness: "18",
|
||||||
|
count: "1",
|
||||||
|
spaceSize: "0",
|
||||||
|
isActive: false
|
||||||
|
}
|
||||||
|
@observable layerNailOption: LayerNailOption = {
|
||||||
|
isDraw: true,
|
||||||
|
addCount: "0",
|
||||||
|
dist: "50",
|
||||||
|
isGroup: false,
|
||||||
|
isInBack: true,
|
||||||
|
front: "50",
|
||||||
|
behind: "50",
|
||||||
|
count: "2",
|
||||||
|
rad: "5",
|
||||||
|
length: "34",
|
||||||
|
depth: "13.5"
|
||||||
|
}
|
||||||
|
private static _store: LayerBoardStore;
|
||||||
|
static Store()
|
||||||
|
{
|
||||||
|
if (!this._store) this._store = new LayerBoardStore();
|
||||||
|
return this._store;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class VerticalBoardStore extends BoardStore
|
||||||
|
{
|
||||||
|
title = "立板";
|
||||||
|
@observable name = "立板";
|
||||||
|
@observable m_BoardOption: VerticalBoardOption = {
|
||||||
|
frontShrink: "0",
|
||||||
|
bottomShrink: "0",
|
||||||
|
width: "L",
|
||||||
|
height: "H",
|
||||||
|
isTotalLength: true,
|
||||||
|
isTotalWidth: true,
|
||||||
|
boardRelative: BrRelativePos.Div,
|
||||||
|
thickness: "18",
|
||||||
|
count: "1",
|
||||||
|
spaceSize: "0"
|
||||||
|
}
|
||||||
|
private static _store: VerticalBoardStore;
|
||||||
|
static Store()
|
||||||
|
{
|
||||||
|
if (!this._store) this._store = new VerticalBoardStore();
|
||||||
|
return this._store;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SingleBoardStore extends BoardStore
|
||||||
|
{
|
||||||
|
title = "单板";
|
||||||
|
@observable name = "";
|
||||||
|
@observable m_BoardOption: SingleBoardOption = {
|
||||||
|
type: BoardType.Layer,
|
||||||
|
height: "1200",
|
||||||
|
width: "600",
|
||||||
|
thickness: "18",
|
||||||
|
rotateX: "0",
|
||||||
|
rotateY: "0",
|
||||||
|
rotateZ: "0",
|
||||||
|
spliteHeight: "",
|
||||||
|
spliteWidth: "",
|
||||||
|
spliteThickness: ""
|
||||||
|
}
|
||||||
|
private static _store: SingleBoardStore;
|
||||||
|
static Store()
|
||||||
|
{
|
||||||
|
if (!this._store) this._store = new SingleBoardStore();
|
||||||
|
return this._store;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export class ClosingStripStore extends BoardStore
|
||||||
|
{
|
||||||
|
title = "收口条";
|
||||||
|
@observable name = "";
|
||||||
|
@observable m_BoardOption: ClosingStripOption = {
|
||||||
|
type: StripType.H,
|
||||||
|
pos: BrRelativePos.Left,
|
||||||
|
width: "50",
|
||||||
|
thickness: "18"
|
||||||
|
}
|
||||||
|
private static _store: ClosingStripStore;
|
||||||
|
static Store()
|
||||||
|
{
|
||||||
|
if (!this._store) this._store = new ClosingStripStore();
|
||||||
|
return this._store;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export class DoorStore extends BoardStore
|
||||||
|
{
|
||||||
|
title = "门板";
|
||||||
|
@observable name = "";
|
||||||
|
|
||||||
|
private static _store: DoorStore;
|
||||||
|
static Store()
|
||||||
|
{
|
||||||
|
if (!this._store) this._store = new DoorStore();
|
||||||
|
return this._store;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue