|
|
@ -1,4 +1,4 @@
|
|
|
|
import { Vector3, Matrix4, Raycaster } from 'three';
|
|
|
|
import { Vector3, Matrix4, Raycaster, Vector2, Mesh } from 'three';
|
|
|
|
import { app } from '../../ApplicationServices/Application';
|
|
|
|
import { app } from '../../ApplicationServices/Application';
|
|
|
|
import { Board, BoardType } from '../../DatabaseServices/Board';
|
|
|
|
import { Board, BoardType } from '../../DatabaseServices/Board';
|
|
|
|
import { Command } from '../../Editor/CommandMachine';
|
|
|
|
import { Command } from '../../Editor/CommandMachine';
|
|
|
@ -8,38 +8,20 @@ import { GeneralSpaceParse } from '../../Geometry/SpaceParse/GeneralSpaceParse';
|
|
|
|
import { LayerBoardStore, ModalState, LayerPosType, LayerBoardOption } from '../../UI/Store/BoardStore';
|
|
|
|
import { LayerBoardStore, ModalState, LayerPosType, LayerBoardOption } from '../../UI/Store/BoardStore';
|
|
|
|
import { BoardModalType } from '../../UI/Components/Board/BoardModal';
|
|
|
|
import { BoardModalType } from '../../UI/Components/Board/BoardModal';
|
|
|
|
import { Box3Ext } from '../../Geometry/Box';
|
|
|
|
import { Box3Ext } from '../../Geometry/Box';
|
|
|
|
|
|
|
|
import { SelectSet } from '../../Editor/SelectSet';
|
|
|
|
|
|
|
|
import { SelectLine } from '../../Editor/SelectBox';
|
|
|
|
|
|
|
|
import { Vec3DTo2D } from '../../Common/CurveUtils';
|
|
|
|
|
|
|
|
import { SortEntityByBox } from '../../Geometry/SortEntityByBox';
|
|
|
|
|
|
|
|
import { PointPick } from '../../Editor/PointPick';
|
|
|
|
|
|
|
|
|
|
|
|
export class DrawLayerBoard implements Command
|
|
|
|
export class DrawLayerBoard implements Command
|
|
|
|
{
|
|
|
|
{
|
|
|
|
async exec()
|
|
|
|
async exec()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
this.SelectBoards();
|
|
|
|
// await this.SelectBoxes();
|
|
|
|
|
|
|
|
await this.SelectPoint();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
buildBoard(box: Box3Ext, opt: LayerBoardOption, ro: Matrix4)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let size = box.getSize(new Vector3());
|
|
|
|
|
|
|
|
let width = opt.isTotalWidth ? size.y : parseFloat(opt.width);
|
|
|
|
|
|
|
|
let count = parseInt(opt.count);
|
|
|
|
|
|
|
|
let type = opt.posType;
|
|
|
|
|
|
|
|
let dist = parseFloat(opt.dist);
|
|
|
|
|
|
|
|
let frontShrink = parseFloat(opt.frontShrink);
|
|
|
|
|
|
|
|
let board = Board.CreateBoard(size.x, width, parseFloat(opt.thickness), BoardType.Layer);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (let i = 1; i <= count; i++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let b = board.Clone() as Board;
|
|
|
|
|
|
|
|
if (type === LayerPosType.Top)
|
|
|
|
|
|
|
|
b.ApplyMatrix(MoveMatrix(box.min.clone().add(new Vector3(size.x, frontShrink, size.z - (dist / 100 * i)))));
|
|
|
|
|
|
|
|
else if (type === LayerPosType.Bottom)
|
|
|
|
|
|
|
|
b.ApplyMatrix(MoveMatrix(box.min.clone().add(new Vector3(size.x, frontShrink, (dist / 100) * i))));
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
b.ApplyMatrix(MoveMatrix(box.min.clone().add(new Vector3(size.x, frontShrink, size.z / (count + 1) * i))));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b.ApplyMatrix(ro);
|
|
|
|
|
|
|
|
app.m_Database.ModelSpace.Append(b);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
async selectBox(spaces: Box3Ext[])
|
|
|
|
async selectBox(spaces: Box3Ext[])
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (spaces.length === 1)
|
|
|
|
if (spaces.length === 1)
|
|
|
@ -119,27 +101,133 @@ export class DrawLayerBoard implements Command
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return spaces[0];
|
|
|
|
return spaces[0];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
async PointSelect()
|
|
|
|
async SelectPoint()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let ptRes = await app.m_Editor.GetPoint({ Msg: "点选画板区域" });
|
|
|
|
app.m_Editor.m_GetpointServices.snapServices.m_Disabled = true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let store = LayerBoardStore.Store();
|
|
|
|
|
|
|
|
app.m_Editor.m_ModalManage.RenderBoardModal(store, BoardModalType.Ly);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let state = await store.GetBoardOption();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (state !== ModalState.Ok)
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
let view = app.m_Viewer;
|
|
|
|
let view = app.m_Viewer;
|
|
|
|
|
|
|
|
while (true)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let ptRes = await app.m_Editor.GetPoint({ Msg: "点选画板区域" });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let meshs = view.Scene.children.filter(o => o instanceof Mesh);
|
|
|
|
|
|
|
|
|
|
|
|
if (ptRes.Status !== PromptStatus.Cancel)
|
|
|
|
if (ptRes.Status !== PromptStatus.Cancel)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let pt = ptRes.Value;
|
|
|
|
let brs: Board[] = [];
|
|
|
|
let raycaster = new Raycaster();
|
|
|
|
|
|
|
|
raycaster.setFromCamera({
|
|
|
|
|
|
|
|
x: (pt.x / view.Width) * 2 - 1, //-1 到 1 所以 (x-(w/2))/(w/2) =>
|
|
|
|
|
|
|
|
y: - (pt.y / view.Height) * 2 + 1 //y轴相反
|
|
|
|
|
|
|
|
}, view.Camera);
|
|
|
|
|
|
|
|
raycaster.ray.origin.sub(raycaster.ray.direction.clone().multiplyScalar(1e3));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let br: Board;
|
|
|
|
|
|
|
|
let startPt = ptRes.Value.clone();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
view.WorldToScreen(startPt);
|
|
|
|
|
|
|
|
//是否选到背板
|
|
|
|
|
|
|
|
let en = PointPick(startPt, view).map(o =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (o.userData && o.userData instanceof Board && o.userData.BoardType === BoardType.Behind)
|
|
|
|
|
|
|
|
return o.userData
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
if (en && en.length > 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
brs.push(en[0])
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//选择上下左右的板
|
|
|
|
|
|
|
|
let leftPt = Vec3DTo2D(startPt).setX(0);
|
|
|
|
|
|
|
|
let sl = new SelectLine(view, Vec3DTo2D(startPt), leftPt);
|
|
|
|
|
|
|
|
sl.Select(meshs);
|
|
|
|
|
|
|
|
br = this.selectFitBoard(sl.Enlity.filter(b => b instanceof Board && b.BoardType === BoardType.Vertical) as Board[], "left")
|
|
|
|
|
|
|
|
br && brs.push(br);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let rightPt = Vec3DTo2D(startPt).setX(view.Width);
|
|
|
|
|
|
|
|
sl = new SelectLine(view, Vec3DTo2D(startPt), rightPt);
|
|
|
|
|
|
|
|
sl.Select(meshs);
|
|
|
|
|
|
|
|
br = this.selectFitBoard(sl.Enlity.filter(b => b instanceof Board && b.BoardType === BoardType.Vertical) as Board[], "right")
|
|
|
|
|
|
|
|
br && brs.push(br);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let topPt = Vec3DTo2D(startPt).setY(0);
|
|
|
|
|
|
|
|
sl = new SelectLine(view, Vec3DTo2D(startPt), topPt);
|
|
|
|
|
|
|
|
sl.Select(meshs);
|
|
|
|
|
|
|
|
br = this.selectFitBoard(sl.Enlity.filter(b => b instanceof Board && b.BoardType === BoardType.Layer) as Board[], "top")
|
|
|
|
|
|
|
|
br && brs.push(br);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let bottomPt = Vec3DTo2D(startPt).setY(view.Height);
|
|
|
|
|
|
|
|
sl = new SelectLine(view, Vec3DTo2D(startPt), bottomPt);
|
|
|
|
|
|
|
|
sl.Select(meshs);
|
|
|
|
|
|
|
|
br = this.selectFitBoard(sl.Enlity.filter(b => b instanceof Board && b.BoardType === BoardType.Layer) as Board[], "bottom")
|
|
|
|
|
|
|
|
br && brs.push(br);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//分析点周围的空间
|
|
|
|
|
|
|
|
if (brs.length > 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let spaceParse = new GeneralSpaceParse(brs);
|
|
|
|
|
|
|
|
spaceParse.SpaceParse();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (spaceParse.Spaces.length === 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
app.m_Editor.m_CommandStore.Prompt("生成层板失败");
|
|
|
|
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let opt = store.layerBoardOption;
|
|
|
|
|
|
|
|
let ro = new Matrix4().extractRotation(spaceParse.OCS);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let spaces = spaceParse.Spaces;
|
|
|
|
|
|
|
|
if (spaces.length > 1)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
spaces.sort((b1, b2) =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return b1.min.y - b2.min.y;
|
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let box = spaces[0];
|
|
|
|
|
|
|
|
this.buildBoard(box, opt, ro);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
app.m_Editor.m_CommandStore.Prompt("请选择板件");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} else break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
app.m_Editor.m_GetpointServices.snapServices.m_Disabled = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
selectFitBoard(brs: Board[], dir: string)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (brs.length === 0) return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let boxMap: Map<Board, Vector3> = new Map();
|
|
|
|
|
|
|
|
brs.forEach(b =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let pt = b.MinPoint;
|
|
|
|
|
|
|
|
app.m_Viewer.WorldToScreen(pt);
|
|
|
|
|
|
|
|
boxMap.set(b, pt);
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
async SelectBoards()
|
|
|
|
switch (dir)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
case "left":
|
|
|
|
|
|
|
|
brs.sort((a, b) => boxMap.get(b).x - boxMap.get(a).x);
|
|
|
|
|
|
|
|
return brs[0];
|
|
|
|
|
|
|
|
case "right":
|
|
|
|
|
|
|
|
brs.sort((a, b) => boxMap.get(a).x - boxMap.get(b).x);
|
|
|
|
|
|
|
|
return brs[0];
|
|
|
|
|
|
|
|
case "top":
|
|
|
|
|
|
|
|
brs.sort((a, b) => boxMap.get(b).y - boxMap.get(a).y);
|
|
|
|
|
|
|
|
return brs[0];
|
|
|
|
|
|
|
|
case "bottom":
|
|
|
|
|
|
|
|
brs.sort((a, b) => boxMap.get(a).y - boxMap.get(b).y);
|
|
|
|
|
|
|
|
return brs[0];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
async SelectBoxes()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let exSsRes = await app.m_Editor.GetSelection({ Msg: "请选择对象<全部选择>:", UseSelect: true });
|
|
|
|
let exSsRes = await app.m_Editor.GetSelection({ Msg: "请选择对象<全部选择>:", UseSelect: true });
|
|
|
|
if (exSsRes.Status === PromptStatus.Cancel)
|
|
|
|
if (exSsRes.Status === PromptStatus.Cancel)
|
|
|
@ -183,4 +271,28 @@ export class DrawLayerBoard implements Command
|
|
|
|
app.m_Editor.m_CommandStore.Prompt("请选择板件")
|
|
|
|
app.m_Editor.m_CommandStore.Prompt("请选择板件")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
buildBoard(box: Box3Ext, opt: LayerBoardOption, ro: Matrix4)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let size = box.getSize(new Vector3());
|
|
|
|
|
|
|
|
let width = opt.isTotalWidth ? size.y : parseFloat(opt.width);
|
|
|
|
|
|
|
|
let count = parseInt(opt.count);
|
|
|
|
|
|
|
|
let type = opt.posType;
|
|
|
|
|
|
|
|
let dist = parseFloat(opt.dist);
|
|
|
|
|
|
|
|
let frontShrink = parseFloat(opt.frontShrink);
|
|
|
|
|
|
|
|
let board = Board.CreateBoard(size.x, width, parseFloat(opt.thickness), BoardType.Layer);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (let i = 1; i <= count; i++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let b = board.Clone() as Board;
|
|
|
|
|
|
|
|
if (type === LayerPosType.Top)
|
|
|
|
|
|
|
|
b.ApplyMatrix(MoveMatrix(box.min.clone().add(new Vector3(size.x, frontShrink, size.z - (dist / 100 * i)))));
|
|
|
|
|
|
|
|
else if (type === LayerPosType.Bottom)
|
|
|
|
|
|
|
|
b.ApplyMatrix(MoveMatrix(box.min.clone().add(new Vector3(size.x, frontShrink, (dist / 100) * i))));
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
b.ApplyMatrix(MoveMatrix(box.min.clone().add(new Vector3(size.x, frontShrink, size.z / (count + 1) * i))));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b.ApplyMatrix(ro);
|
|
|
|
|
|
|
|
app.m_Database.ModelSpace.Append(b);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|