空间分析,侧板背板立板等板件模态框和绘制

pull/93/head
Zoe 6 years ago
commit 381c616425

14
package-lock.json generated

@ -4504,7 +4504,7 @@
"dev": true,
"optional": true,
"requires": {
"safer-buffer": "^2.1.0"
"safer-buffer": "2.1.2"
}
},
"ignore-walk": {
@ -4609,9 +4609,9 @@
"dev": true,
"optional": true,
"requires": {
"debug": "^2.1.2",
"iconv-lite": "^0.4.4",
"sax": "^1.2.4"
"debug": "2.6.9",
"iconv-lite": "0.4.21",
"sax": "1.2.4"
}
},
"node-pre-gyp": {
@ -4818,7 +4818,7 @@
"dev": true,
"optional": true,
"requires": {
"safe-buffer": "~5.1.0"
"safe-buffer": "5.1.1"
}
},
"strip-ansi": {
@ -10821,8 +10821,8 @@
"integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
"dev": true,
"requires": {
"micromatch": "^3.1.4",
"normalize-path": "^2.1.1"
"micromatch": "3.1.10",
"normalize-path": "2.1.1"
}
},
"minimist": {

@ -1,4 +1,4 @@
import { Vector3 } from "../../node_modules/@types/three";
import { Vector3 } from "three";
import { app } from "../ApplicationServices/Application";
import { Circle } from "../DatabaseServices/Circle";
import { Curve } from "../DatabaseServices/Curve";

@ -58,7 +58,6 @@ export class CMD_Divide implements Command
let cu = enRes.Entity;
let len = cu.Length;
let divLen = len / numRes.Value;
console.log(cu.IsClose);
if (cu.IsClose) //闭合曲线分割点+1
{
divCount += 1;

@ -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 { app } from '../ApplicationServices/Application';
import { CreateBoardUtil } from '../ApplicationServices/mesh/createBoard';
import { MaterialNeedUpdateKey } from '../DatabaseServices/MaterialDictionary';
import { Command } from '../Editor/CommandMachine';
import { MoveMatrix } from '../Geometry/GeUtils';
import { Command } from '../../Editor/CommandMachine';
import { MaterialNeedUpdateKey } from '../../DatabaseServices/MaterialDictionary';
import { MoveMatrix } from '../../Geometry/GeUtils';
import { CreateBoardUtil } from '../../ApplicationServices/mesh/createBoard';
import { app } from '../../ApplicationServices/Application';
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);
}
}
}

@ -10,6 +10,7 @@ export class Open implements Command
let store = await IndexedDbStore.CADStore();
let fid = window.sessionStorage.getItem("fid");
store.m_CurrentFileId = fid;
if (fid)
{
let file = await store.Get(StoreName.Dwg, fid);

@ -1,7 +1,5 @@
import { Command } from '../Editor/CommandMachine';
import { Viewer } from '../GraphicsSystem/Viewer';
import { app } from '../ApplicationServices/Application';
import * as THREE from 'three';
import { Command } from '../Editor/CommandMachine';

@ -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);
}
})
}
}

@ -1,4 +1,4 @@
import { Vector3 } from "three";
import { Vector3, Box3 } from "three";
import { app } from "../../ApplicationServices/Application";
import { arrayLast, arrayRemoveIf, arraySortByNumber } from "../../Common/ArrayExt";
import { Circle } from "../../DatabaseServices/Circle";
@ -9,6 +9,8 @@ import { Command } from "../../Editor/CommandMachine";
import { PromptStatus } from "../../Editor/PromptResult";
import { equaln } from "../../Geometry/GeUtils";
import { IsPtsAllOutOrOnReg } from "../../GraphicsSystem/BoolOperateUtils";
import { Line } from "../../DatabaseServices/Line";
import { Box3Ext } from "../../Geometry/Box";
export class TestTargeOnCurve implements Command
{
@ -128,3 +130,12 @@ export function testCurve(cons: Curve[], color: number = 2)
});
}
export function testBox3(box3: Array<Box3 | Box3Ext>, color: number = 2)
{
box3.forEach(b =>
{
let l = new Line(b.min, b.max);
l.ColorIndex = color;
app.m_Database.ModelSpace.Append(l);
})
}

@ -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 { DirectionalLight } from "../DatabaseServices/DirectionalLight";
import { app } from "../ApplicationServices/Application";
import { Command } from "../../Editor/CommandMachine";
import { DirectionalLight } from "../../DatabaseServices/DirectionalLight";
import { app } from "../../ApplicationServices/Application";
/**
*

@ -1,6 +1,6 @@
import { Command } from '../Editor/CommandMachine';
import { PointLight } from '../DatabaseServices/PointLight';
import { app } from '../ApplicationServices/Application';
import { Command } from '../../Editor/CommandMachine';
import { PointLight } from '../../DatabaseServices/PointLight';
import { app } from '../../ApplicationServices/Application';
export class TestDrawPointLight implements Command

@ -1,6 +1,6 @@
import { Command } from "../Editor/CommandMachine";
import { SpotLight } from "../DatabaseServices/SpotLight";
import { app } from "../ApplicationServices/Application";
import { Command } from "../../Editor/CommandMachine";
import { SpotLight } from "../../DatabaseServices/SpotLight";
import { app } from "../../ApplicationServices/Application";
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)));
}
}

@ -13,7 +13,7 @@ export class WebSocketClientServer
constructor()
{
this.wsConnect();
// this.wsConnect();
}
//ws连接.
@ -63,4 +63,4 @@ export class WebSocketClientServer
}, 1000 * 60)
}
}
}

@ -4,13 +4,10 @@
* @param {Array<any>} arr
* @param {*} el
*/
export function arrayRemove<T>(arr: Array<T>, el: T): Array<T>
{
export function arrayRemove<T>(arr: Array<T>, el: T): Array<T> {
let j = 0;
for (let i = 0, l = arr.length; i < l; i++)
{
if (arr[i] !== el)
{
for (let i = 0, l = arr.length; i < l; i++) {
if (arr[i] !== el) {
arr[j++] = arr[i];
}
}
@ -20,14 +17,11 @@ export function arrayRemove<T>(arr: Array<T>, el: T): Array<T>
}
export function arrayRemoveOnce<T>(arr: Array<T>, el: T): Array<T>
{
export function arrayRemoveOnce<T>(arr: Array<T>, el: T): Array<T> {
let j = 0;
let isErase = false;
for (let i = 0, l = arr.length; i < l; i++)
{
if (isErase || arr[i] !== el)
{
for (let i = 0, l = arr.length; i < l; i++) {
if (isErase || arr[i] !== el) {
arr[j++] = arr[i];
}
else isErase = true;
@ -42,13 +36,10 @@ export function arrayRemoveOnce<T>(arr: Array<T>, el: T): Array<T>
*
* @param {(e: T) => boolean} checkFuntion
*/
export function arrayRemoveIf<T>(arr: Array<T>, checkFuntion: (e: T) => boolean): Array<T>
{
export function arrayRemoveIf<T>(arr: Array<T>, checkFuntion: (e: T) => boolean): Array<T> {
let j = 0;
for (let i = 0, l = arr.length; i < l; i++)
{
if (!checkFuntion(arr[i]))
{
for (let i = 0, l = arr.length; i < l; i++) {
if (!checkFuntion(arr[i])) {
arr[j++] = arr[i];
}
}
@ -57,13 +48,11 @@ export function arrayRemoveIf<T>(arr: Array<T>, checkFuntion: (e: T) => boolean)
return arr;
}
export function arrayFirst<T>(arr: Array<T>): T
{
export function arrayFirst<T>(arr: Array<T>): T {
return arr[0];
}
export function arrayLast<T>(arr: Array<T>): T
{
export function arrayLast<T>(arr: Array<T>): T {
return arr[arr.length - 1];
}
@ -75,8 +64,7 @@ export function arrayLast<T>(arr: Array<T>): T
* @param {Array<T>} arr
* @returns {Array<T>}
*/
export function arraySortByNumber<T>(arr: Array<T>): Array<T>
{
export function arraySortByNumber<T>(arr: Array<T>): Array<T> {
arr.sort(sortNumberCompart);
return arr;
}
@ -87,8 +75,7 @@ export function arraySortByNumber<T>(arr: Array<T>): Array<T>
* @param {(e1, e2) => boolean} [checkFuction]
* @returns {Array<T>}
*/
export function arrayRemoveDuplicateBySort<T>(arr: Array<T>, checkFuction: (e1, e2) => boolean = checkEqual): Array<T>
{
export function arrayRemoveDuplicateBySort<T>(arr: Array<T>, checkFuction: (e1, e2) => boolean = checkEqual): Array<T> {
if (arr.length < 2) return arr;
let j = 1;
for (let i = 1, l = arr.length; i < l; i++)
@ -98,12 +85,24 @@ export function arrayRemoveDuplicateBySort<T>(arr: Array<T>, checkFuction: (e1,
return arr;
}
function sortNumberCompart(e1, e2)
{
function sortNumberCompart(e1, e2) {
return e1 - e2;
}
function checkEqual(e1, e2): boolean
{
function checkEqual(e1, e2): boolean {
return e1 === e2;
}
/**
*target
*
* @export
* @param {*} target
* @returns
*/
export function toArray(target: any) {
return target ? (!Array.isArray(target) ? [target] : target) : [];
}

@ -1,15 +1,22 @@
import * as THREE from 'three';
import { ExtrudeGeometry, Matrix4, Mesh, Object3D, Vector3 } from 'three';
import { CoordinateSystem } from '../Geometry/CoordinateSystem';
import { ColorMaterial } from '../Common/ColorPalette';
import { Box3Ext } from '../Geometry/Box';
import { RenderType } from '../GraphicsSystem/Enum';
import { Factory } from './CADFactory';
import { CADFile } from './CADFile';
import { CADObject } from './CADObject';
import { Contour } from './Contour';
import { Entity } from './Entity';
import { Line } from './Line';
import { DbPhysicalMaterial } from './PhysicalMaterial';
import { Region } from './Region';
import { Shape } from './Shape';
export enum BoardType
{
Layer = 0, //层板
Vertical = 1, //立板
Behind = 2 //背板
}
/**
*
@ -18,56 +25,184 @@ import { Region } from './Region';
* @extends {Entity}
*/
@Factory
export class Board extends Entity
{
//板件厚度
private m_Height: number = 18;
private m_Region: Region;
private m_Thickness: number;
private m_Length: number;
private m_Width: number;
private m_Shape: Shape;
private m_BoardType: BoardType;
private m_Name: string = "";
constructor(reg?: Region, height?: number)
constructor(shape?: Shape, thickness?: number)
{
super();
this.m_Region = reg;
this.m_Height = height || this.m_Height;
this.m_Shape = shape || new Shape();
this.m_Thickness = thickness || 0;
}
//初始化板件 来自长宽高
InitBoard(length: number, width: number, height: number)
InitBoard(length: number, width: number, thickness: number, boardType: BoardType = BoardType.Layer)
{
this.m_Height = height;
let px1 = new Vector3(0, 0, 0);
let px3 = new Vector3(length, width, 0);
let px2 = new Vector3(px3.x, px1.y);
let px4 = new Vector3(px1.x, px3.y);
this.m_BoardType = boardType;
this.m_Length = length;
this.m_Width = width;
this.m_Thickness = thickness;
let l1 = new Line();
let l2 = new Line();
let l3 = new Line();
let l4 = new Line();
let p1 = new Vector3();
let p2 = new Vector3(width, 0);
let p3 = new Vector3(width, length);
let p4 = new Vector3(0, length);
l1.StartPoint = px1;
l1.EndPoint = px2;
let l1 = new Line(p1, p2);
let l2 = new Line(p2, p3);
let l3 = new Line(p3, p4);
let l4 = new Line(p4, p1);
l2.StartPoint = px2;
l2.EndPoint = px3;
this.m_Shape = new Shape(new Contour([l1, l2, l3, l4]))
}
static CreateBoard(length: number, width: number, thickness: number, boardType: BoardType = BoardType.Layer)
{
let board = new Board();
board.InitBoard(length, width, thickness, boardType);
l3.StartPoint = px3;
l3.EndPoint = px4;
let roMat = board.getRotateMatrix4(boardType);
l4.StartPoint = px1;
l4.EndPoint = px4;
board.ApplyMatrix(roMat);
board.ColorIndex = boardType + 1;
return board;
}
getRotateMatrix4(boardType: BoardType)
{
let roMat = new Matrix4();
this.m_Region = Region.CreateFromCurves([l1, l2, l3, l4]);
switch (boardType)
{
case BoardType.Layer:
roMat.makeBasis(
new Vector3(0, 1, 0),
new Vector3(-1, 0, 0),
new Vector3(0, 0, 1)
)
break;
case BoardType.Vertical:
roMat.makeBasis(
new Vector3(0, 1, 0),
new Vector3(0, 0, 1),
new Vector3(1, 0, 0)
)
break;
case BoardType.Behind:
roMat.makeBasis(
new Vector3(1, 0, 0),
new Vector3(0, 0, 1),
new Vector3(0, -1, 0)
);
}
return roMat;
}
get Thickness()
{
return this.m_Thickness;
}
get Lenght()
{
return this.m_Length
}
get Width()
{
return this.m_Width;
}
get BoardType(): BoardType
{
return this.m_BoardType;
}
this.Update();
//最左下角的点
get MinPoint(): Vector3
{
let pt;
switch (this.m_BoardType)
{
case BoardType.Layer:
pt = new Vector3(0, this.m_Length, -this.m_Thickness);
break;
case BoardType.Vertical:
pt = new Vector3(0, 0, -this.m_Thickness);
break;
case BoardType.Behind:
pt = new Vector3(0, 0, 0);
}
pt.applyMatrix4(this.OCS)
return pt;
}
Draw(renderType: RenderType): Object3D
get MaxPoint(): Vector3
{
let obj = super.Draw(renderType);
if (obj) return obj;
let pt = new Vector3(this.m_Width, this.m_Length, -this.m_Thickness);
pt.applyMatrix4(this.OCS);
return pt;
}
get BoardOCS()
{
let roMat = this.getRotateMatrix4(this.BoardType);
return this.OCS.multiply(new Matrix4().getInverse(roMat))
}
get BoardOCSInv()
{
return new Matrix4().getInverse(this.BoardOCS);
}
get BoundingBox()
{
let box = new Box3Ext(new Vector3(0, 0, -this.m_Thickness), new Vector3(this.m_Width, this.m_Length));
box.applyMatrix4(this.OCS);
return box;
}
get Name()
{
return this.m_Name;
}
GetSnapPoints(): Array<THREE.Vector3>
{
let pts = this.m_Shape.GetSnapPoints();
pts = pts.concat(pts.map(p =>
{
let vec = this.Normal.applyMatrix4(new Matrix4().extractRotation(this.OCSInv)).multiplyScalar(-this.m_Thickness);
return p.clone().add(vec);
}))
return pts.map(p => p.applyMatrix4(this.m_Matrix));
}
MoveSnapPoints(indexList: Array<number>, vec: Vector3)
{
this.WriteAllObjectRecord();
let vl = vec.clone();
vl.applyMatrix4(this.OCSInv);
if (!this.m_Region)
let pts = this.m_Shape.Outline.Curve.GetSnapPoints();
indexList = indexList.map(i =>
{
if (i > pts.length - 1)
{
return i -= pts.length;
}
return i;
})
this.m_Shape.MoveSnapPoints([indexList[0]], vl);
this.Update();
}
InitDrawObject(renderType: RenderType = RenderType.Wireframe): Object3D
{
let mat = ColorMaterial.GetBasicMaterial(this.ColorIndex);
return new THREE.Mesh(this.UpdateGeometry(), mat);
}
private UpdateGeometry()
{
if (!this.m_Shape)
{
//避免空的板件生成
this.InitBoard(1e-5, 1e-5, 1e-5);
@ -76,87 +211,56 @@ export class Board extends Entity
let extrudeSettings = {
steps: 1,
bevelEnabled: false,
amount: this.m_Height
depth: this.m_Thickness
};
let extGeo = new ExtrudeGeometry(this.m_Region.ShapeManager.ShapeList[0].Shape, extrudeSettings);
let mesh = new Mesh(extGeo);
mesh.userData = this;
let geo = new ExtrudeGeometry(this.m_Shape.Shape, extrudeSettings);
geo.translate(0, 0, -this.m_Thickness);
return geo;
}
UpdateDrawObject(type: RenderType, obj: Object3D)
{
let mesh = obj as Mesh;
mesh.geometry.dispose();
mesh.geometry = this.UpdateGeometry();
if (this.m_MaterialId && this.m_MaterialId.Object)
if (this.m_MaterialId)
{
let material = this.m_MaterialId.Object as DbPhysicalMaterial;
mesh.material = material.Material;
}
this.m_DrawEntity.set(renderType, mesh);
this.Update();
return mesh;
this.UpdatePostion(mesh);
}
Update()
private UpdatePostion(obj: Object3D)
{
super.Update();
for (let [, obj] of this.m_DrawEntity)
{
let mesh = obj as Mesh;
mesh.geometry.dispose();
let extrudeSettings = {
steps: 1,
bevelEnabled: false,
amount: this.m_Height
};
mesh.geometry = new ExtrudeGeometry(this.m_Region.ShapeManager.ShapeList[0].Shape, extrudeSettings);
mesh.geometry.computeBoundingSphere();
if (this.m_MaterialId)
{
let material = this.m_MaterialId.Object as DbPhysicalMaterial;
mesh.material = material.Material;
}
this.UpdatePostion();
}
}
let p = new Vector3().setFromMatrixColumn(this.m_Matrix, 3);
obj.position.copy(p);
obj.quaternion.setFromRotationMatrix(this.m_Matrix);
private UpdatePostion()
{
for (let [, obj] of this.m_DrawEntity)
{
let p = new Vector3().setFromMatrixColumn(this.m_Matrix, 3);
obj.position.copy(p);
obj.quaternion.setFromRotationMatrix(this.m_Matrix);
}
}
//#region -------------------------File-------------------------
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
//对象从文件中读取数据,初始化自身
ReadFile(file: CADFile)
{
super.ReadFile(file);
let ver = file.Read();
this.m_Region = file.ReadObject(this._db) as Region;
this.m_Height = file.Read();
this.m_Matrix.fromArray(file.Read())
this.m_Shape = new Shape();
this.m_Shape.ReadFile(file);
this.m_Length = file.Read();
this.m_Width = file.Read();
this.m_Thickness = file.Read();
this.m_Matrix.fromArray(file.Read());
this.m_BoardType = file.Read();
this.Update();
}
//对象将自身数据写入到文件.
WriteFile(file: CADFile)
{
super.WriteFile(file);
file.Write(1);
file.WriteObject(this.m_Region);
file.Write(this.m_Height);
this.m_Shape.WriteFile(file);
file.Write(this.m_Length);
file.Write(this.m_Width);
file.Write(this.m_Thickness);
file.Write(this.m_Matrix.toArray())
file.Write(this.m_BoardType);
}
//局部撤销
ApplyPartialUndo(undoData: CADObject)
{
super.ApplyPartialUndo(undoData);
}
//#endregion
}

@ -87,12 +87,12 @@ export class Entity extends CADObject
}
/**
* .
*
* @param {Entity} e
* @returns {boolean}
* @memberof Entity
*/
* .
*
* @param {Entity} e
* @returns {boolean}
* @memberof Entity
*/
IsCoplaneTo(e: Entity): boolean
{
return matrixIsCoplane(this.m_Matrix, e.OCS);

@ -1,7 +1,7 @@
import * as THREE from 'three';
import { Box3, Group, Object3D, ShapeBufferGeometry, Matrix4 } from 'three';
import { Box3, Group, Matrix4, Object3D, ShapeBufferGeometry } from 'three';
import { ColorMaterial } from '../Common/ColorPalette';
import { equaln, isParallelTo } from '../Geometry/GeUtils';
import { matrixAlignCoordSys } from '../Common/Matrix4Utils';
import { BoolOpeartionType } from '../GraphicsSystem/BoolOperateUtils';
import { RenderType } from '../GraphicsSystem/Enum';
import { Factory } from './CADFactory';
@ -11,7 +11,6 @@ import { Curve } from './Curve';
import { Entity } from './Entity';
import { Shape } from './Shape';
import { ShapeManager } from './ShapeManager';
import { matrixAlignCoordSys } from '../Common/Matrix4Utils';
@Factory
export class Region extends Entity

@ -4,6 +4,7 @@ import { CADFile } from './CADFile';
import { Contour } from './Contour';
import { Curve } from './Curve';
import { Polyline } from './Polyline';
import { Vector3 } from 'three';
export class Shape
{
@ -48,6 +49,15 @@ export class Shape
this.UpdateShape();
return this.m_Shape;
}
GetSnapPoints(): Array<THREE.Vector3>
{
return this.Outline.Curve.GetSnapPoints();
}
MoveSnapPoints(indexList: Array<number>, vec: Vector3)
{
this.m_Outline.Curve.MoveSnapPoints(indexList, vec);
this.UpdateShape();
}
Explode()
{
let cus: Curve[] = [];

@ -10,7 +10,15 @@ import { CustomUcs } from '../Add-on/CostumUCS';
import { Union } from '../Add-on/CSGUnion';
import { CMD_Divide } from '../Add-on/Divide';
import { DrawArc } from '../Add-on/DrawArc';
import { Command_DrawBoard } from '../Add-on/DrawBoard';
import { DrawBehindBoard } from '../Add-on/DrawBoard/DrawBehindBoard';
import { Command_DrawBoard } from '../Add-on/DrawBoard/DrawBoard';
import { DrawClosingStrip } from '../Add-on/DrawBoard/DrawClosingStrip';
import { DrawDoor } from '../Add-on/DrawBoard/DrawDoor';
import { DrawLayerBoard } from '../Add-on/DrawBoard/DrawLayerBoard';
import { DrawLeftRight } from '../Add-on/DrawBoard/DrawLeftRightBoard';
import { DrawSingleBoard } from '../Add-on/DrawBoard/DrawSingleBoard';
import { DrawTopBottomBoard } from '../Add-on/DrawBoard/DrawTopBottomBoard';
import { DrawVerticalBoard } from '../Add-on/DrawBoard/DrawVerticalBoard';
import { DrawAlignedDimension } from '../Add-on/DrawDim/DrawAlignedDimension';
import { DrawLineAngularDimension } from '../Add-on/DrawDim/DrawLineAngularDimension';
import { DrawLinearDimension } from '../Add-on/DrawDim/DrawLinearDimension';
@ -58,12 +66,12 @@ import { Command_SwitchPass } from '../Add-on/SwitchPass';
// import { DrawFloor } from '../Add-on/DrawFloor';
// import { RevTarget, SaveTarget } from '../Add-on/RenderTarget';
import { TestIntersect } from '../Add-on/test/testIntersect';
import { Command_TestBox } from '../Add-on/TestBox';
import { Command_DrawBoard2 } from '../Add-on/TestDrawBoard';
import { TestDrawDirectionalLight } from '../Add-on/TestDrawDirectionalLight';
import { TestDrawPointLight } from '../Add-on/TestDrawPointLight';
import { TestDrawSpotLight } from '../Add-on/TestDrawSpotLight';
import { Command_TestBox } from '../Add-on/testEntity/TestBox';
import { TestTargeOnCurve } from '../Add-on/testEntity/TestCurve';
import { Command_DrawBoard2 } from '../Add-on/testEntity/TestDrawBoard';
import { TestDrawDirectionalLight } from '../Add-on/testEntity/TestDrawDirectionalLight';
import { TestDrawPointLight } from '../Add-on/testEntity/TestDrawPointLight';
import { TestDrawSpotLight } from '../Add-on/testEntity/TestDrawSpotLight';
import { Command_Trim } from '../Add-on/Trim';
import { Redo, Undo } from '../Add-on/Undo';
import { ViewToFront, ViewToRight, ViewToTop } from '../Add-on/ViewChange';
@ -174,8 +182,19 @@ export function registerCommand()
commandMachine.RegisterCommand("union", new UnionOperation());
commandMachine.RegisterCommand("sub", new SubsractOperation());
commandMachine.RegisterCommand("pe", new Pedit());
commandMachine.RegisterCommand("join", new Command_Join());
commandMachine.RegisterCommand("sw", new Sweep());
//画板件命令
commandMachine.RegisterCommand("zyc", new DrawLeftRight());
commandMachine.RegisterCommand("dd", new DrawTopBottomBoard());
commandMachine.RegisterCommand("bb", new DrawBehindBoard());
commandMachine.RegisterCommand("cb", new DrawLayerBoard());
commandMachine.RegisterCommand("lb", new DrawVerticalBoard());
commandMachine.RegisterCommand("db", new DrawSingleBoard());
commandMachine.RegisterCommand("skt", new DrawClosingStrip());
commandMachine.RegisterCommand("mb", new DrawDoor());
/*******test ↓↓↓*********/
commandMachine.RegisterCommand("pltest", new Command_PLTest());
@ -194,7 +213,6 @@ export function registerCommand()
commandMachine.RegisterCommand("outcur", new TestTargeOnCurve());
commandMachine.RegisterCommand("join", new Command_Join());
commandMachine.RegisterCommand("testInt", new TestIntersect());
commandMachine.RegisterCommand("copyclip", new CopyClip());

@ -29,8 +29,8 @@ export class GetPointServices implements EditorService
}
return false;
}
private promisResolve: (res: PromptPointResult) => void;//promis回调
protected removeCalls: Function[] = []; //结束回调
public snapServices = new SnapServices();

@ -19,7 +19,7 @@ export class SelectBox extends SelectSetBase
{
private m_SelectBox: THREE.Box2 = new THREE.Box2();
private m_Frustom: THREE.Frustum = new THREE.Frustum();
private m_Frustum: THREE.Frustum = new THREE.Frustum();
private m_bIsPerCamera;
@ -49,7 +49,7 @@ export class SelectBox extends SelectSetBase
let _projScreenMatrix = new THREE.Matrix4();
_projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
this.m_Frustom.setFromMatrix(_projScreenMatrix);
this.m_Frustum.setFromMatrix(_projScreenMatrix);
camera.clearViewOffset();
}
@ -85,14 +85,14 @@ export class SelectBox extends SelectSetBase
continue;
if (obj.hasOwnProperty("geometry"))
{
if (this.m_Frustom.intersectsObject(obj) && CheckFunction(obj))
if (this.m_Frustum.intersectsObject(obj) && CheckFunction(obj))
this.m_SelectList.push(obj);
}
else if (obj instanceof THREE.Group)
{
for (let ob of obj.children)
{
if (this.m_Frustom.intersectsObject(ob) && CheckFunction(ob))
if (this.m_Frustum.intersectsObject(ob) && CheckFunction(ob))
{
this.m_SelectList.push(obj);
break;
@ -119,7 +119,7 @@ export class SelectBox extends SelectSetBase
{
if (!obj.visible) return false;
if (obj.hasOwnProperty("geometry"))
return this.m_Frustom.intersectsObject(obj);
return this.m_Frustum.intersectsObject(obj);
return true;
}
@ -133,7 +133,7 @@ export class SelectBox extends SelectSetBase
//如果是透视相机,则需要 裁剪算法. 保证线在视图内部
if (this.m_bIsPerCamera)
{
let nearPlan = this.m_Frustom.planes[5];
let nearPlan = this.m_Frustum.planes[5];
let px1 = worldPts[index1];
let px2 = worldPts[index2];
@ -226,3 +226,4 @@ export class SelectBox extends SelectSetBase
return this.m_SelectBox.containsPoint(new THREE.Vector2(ptVcs.x, ptVcs.y));
}
}

@ -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';
/**
*THREEBox3,,
*
* @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,474 @@
import { Matrix4, Vector3 } from "three";
import { arrayLast } from "../../Common/ArrayExt";
import { Board, BoardType } from "../../DatabaseServices/Board";
import { Box3Ext } from "../Box";
import { equaln, MoveMatrix } from "../GeUtils";
import { SpaceParse } from "./SpaceParse";
/**
*
*TODO:
* @export
* @class GeneralSpaceParse
* @extends {SpaceParse}
*/
export class GeneralSpaceParse extends SpaceParse
{
get Spaces()
{
return this.m_Spaces;
}
/**
*
*
*
* @memberof GeneralSpaceParse
*/
async SpaceParse()
{
await super.SpaceParse();
let unionBoxes: Box3Ext[] = [];
let spliteBoxes: Box3Ext[] = [];
for (let key of this.boardMap.keys())
{
let boards = this.boardMap.get(key);
if (boards.length > 1)
{
this.parseBoards(boards, unionBoxes);
}
else if (boards.length === 1)
{
let b = boards[0].Clone() as Board;
b.ApplyMatrix(new Matrix4().extractRotation(b.BoardOCSInv))
let box = b.BoundingBox;
box.spliteType = boards[0].BoardType;
spliteBoxes.push(box);
}
}
let spaces = this.MergeSpaces(unionBoxes) as Box3Ext;
spaces && this.SpliteBoxs(spaces, spliteBoxes);
}
/**
*
*3
* @private
* @param {Box3Ext[]} spaces
* @returns
* @memberof GeneralSpaceParse
*/
private MergeSpaces(spaces: Box3Ext[])
{
if (spaces.length === 0) return undefined;
let b1 = spaces.shift();
let isInt = false;
for (let box of spaces)
{
if (b1.intersectsBox(box))
{
isInt = true;
b1.intersect(box);
}
}
if (!isInt && spaces.length === 2)
{
b1 = spaces[0];
let b2 = spaces[1];
if (b1.intersectsBox(b2))
{
return b1.intersect(b2);
}
return undefined;
}
return b1;
}
/**
*
*
* @private
* @param {Box3Ext} box
* @param {Box3Ext[]} spliteBoxes
* @memberof GeneralSpaceParse
*/
private SpliteBoxs(box: Box3Ext, spliteBoxes: Box3Ext[])
{
if (spliteBoxes.length === 0)
this.m_Spaces = [box];
else
{
let boxes = [box];
for (let i = 0; i < boxes.length; i++)
{
let box = boxes[i];
for (let j = 0; j < spliteBoxes.length; j++)
{
let bs = box.substract(spliteBoxes[j]);
if (bs.some(b => b === undefined))
{
debugger;
}
if (bs.length > 0)
{
boxes.splice(i, 1, ...bs);
i -= (bs.length - 1);
if (i === boxes.length - 1)
{
this.m_Spaces.push(...bs);
}
break;
}
else if (j === spliteBoxes.length - 1)
{
this.m_Spaces.push(box);
}
}
}
}
}
/**
*2
* @private
* @param {Box3Ext} b1
* @param {Box3Ext} b2
* @param {BoardType} boardType
* @returns
* @memberof GeneralSpaceParse
*/
private parseBox3(b1: Box3Ext, b2: Box3Ext, boardType: BoardType)
{
let dist: number;
switch (boardType)
{
case BoardType.Layer:
return this.getSpace(b1, b2, "z");
case BoardType.Vertical:
return this.getSpace(b1, b2, "x");
case BoardType.Behind:
return this.getSpace(b1, b2, "y");
}
}
//获取2个盒子之间的空间
getSpace(b1: Box3Ext, b2: Box3Ext, axis: string)
{
[b1, b2] = b1.min[axis] < b2.min[axis] ? [b1, b2] : [b2, b1];
let dist = b2.min[axis] - b1.min[axis];
if (dist <= b1.getSize(new Vector3())[axis])
{
return new Box3Ext();
}
let vec = new Vector3();
vec[axis] = -dist;
b2.applyMatrix4(MoveMatrix(vec));
if (b1.intersectsBox(b2))
{
b1.intersect(b2);
}
else
{
b1.union(b2);
}
let vec1 = new Vector3();
vec1[axis] = b1.getSize(new Vector3())[axis];
let vec2 = new Vector3();
vec2[axis] = dist - b2.getSize(new Vector3())[axis];
return new Box3Ext(b1.min.add(vec1), b1.max.add(vec2));
}
/**
*,
*2,22
* @private
* @param {Board[]} boards
* @param {Box3Ext[]} uniSpaces
* @memberof GeneralSpaceParse
*/
private parseBoards(boards: Board[], uniSpaces: Box3Ext[])
{
let boxMap: Map<Board, Box3Ext> = new Map();
for (let br of boards)
{
let b = br.Clone() as Board;
b.ApplyMatrix(new Matrix4().extractRotation(br.BoardOCSInv))
let box = b.BoundingBox;
boxMap.set(br, box);
}
switch (boards[0].BoardType)
{
case BoardType.Layer:
this.sortAndMerge(boards, boxMap, "z");
break;
case BoardType.Vertical:
this.sortAndMerge(boards, boxMap, "x");
break;
case BoardType.Behind:
this.sortAndMerge(boards, boxMap, "y");
}
if (boards.length >= 2)
{
let b1 = boards[0];
let box1 = boxMap.get(b1).clone();
let b2 = arrayLast(boards);
let box2 = boxMap.get(b2).clone();
let box = this.parseBox3(box1, box2, b1.BoardType);
if (!box.isEmpty())
{
uniSpaces.push(box);
}
}
}
//排序归并板件
private sortAndMerge(boards: Board[], boxMap: Map<Board, Box3Ext>, type: string)
{
boards.sort((a, b) => boxMap.get(a).min[type] - boxMap.get(b).min[type]);
for (let i = 0; i < boards.length; i++)
{
let b1 = boards[i];
let box1 = boxMap.get(b1);
for (let j = i + 1; j < boards.length; j++)
{
let b2 = boards[j];
let box2 = boxMap.get(b2);
if (equaln(box1.min[type], box2.min[type]))
{
let b = box1.clone();
box1.union(box2)
boards.splice(j, 1);
j--;
}
else
{
i = j - 1;
break;
}
}
}
}
}
/**
*
*
* @export
* @class GeneralSpaceParse2
* @extends {SpaceParse}
*/
export class GeneralSpaceParse2 extends SpaceParse
{
get Spaces()
{
return this.m_Spaces;
}
async SpaceParse()
{
super.SpaceParse();
let unionBoxes: Box3Ext[] = [];
let spliteBoxes: Box3Ext[] = [];
for (let key of this.boardMap.keys())
{
let boards = this.boardMap.get(key);
if (boards.length > 1)
{
this.parseBoards(boards, unionBoxes, spliteBoxes);
}
else if (boards.length === 1)
{
let box = boards[0].BoundingBox as Box3Ext;
box.spliteType = boards[0].BoardType;
spliteBoxes.push(box);
}
}
this.SpliteBoxs(unionBoxes, spliteBoxes);
}
private SpliteBoxs(boxes: Box3Ext[], spliteBoxes: Box3Ext[])
{
if (spliteBoxes.length === 0)
this.m_Spaces = boxes;
else
for (let i = 0; i < boxes.length; i++)
{
let box = boxes[i];
for (let j = 0; j < spliteBoxes.length; j++)
{
let bs = box.substract(spliteBoxes[j]);
if (bs.length > 1)
{
boxes.splice(i, 1, ...bs);
i -= (bs.length - 1);
break;
}
else if (j === spliteBoxes.length - 1)
{
this.m_Spaces.push(box);
}
}
}
}
//分析2个盒子之间的空间
private parseBox3(b1: Box3Ext, b2: Box3Ext, boardType: BoardType)
{
let dist: number;
switch (boardType)
{
case BoardType.Layer:
return this.getSpace(b1, b2, "z");
case BoardType.Vertical:
return this.getSpace(b1, b2, "x");
case BoardType.Behind:
return this.getSpace(b1, b2, "y");
}
}
//获取2个盒子之间的空间
getSpace(b1: Box3Ext, b2: Box3Ext, axis: string)
{
[b1, b2] = b1.min[axis] < b2.min[axis] ? [b1, b2] : [b2, b1];
let dist = b2.min[axis] - b1.min[axis];
if (dist <= b1.getSize(new Vector3())[axis])
{
return new Box3Ext();
}
let vec = new Vector3();
vec[axis] = -dist;
b2.applyMatrix4(MoveMatrix(vec));
if (b1.intersectsBox(b2))
{
b1.intersect(b2);
}
else
{
b1.union(b2);
}
let vec1 = new Vector3();
vec1[axis] = b1.getSize(new Vector3())[axis];
let vec2 = new Vector3();
vec2[axis] = dist - b2.getSize(new Vector3())[axis];
return new Box3Ext(b1.min.add(vec1), b1.max.add(vec2));
}
//分析多块板
private parseBoards(boards: Board[], uniSpaces: Box3Ext[], spliteSPs: Box3Ext[])
{
let boxMap: Map<Board, Box3Ext> = new Map();
for (let br of boards)
{
let box = br.BoundingBox as Box3Ext;
box.applyMatrix4(new Matrix4().extractRotation(br.BoardOCSInv));
boxMap.set(br, box);
}
switch (boards[0].BoardType)
{
case BoardType.Layer:
this.sortAndMerge(boards, boxMap, "z");
break;
case BoardType.Vertical:
this.sortAndMerge(boards, boxMap, "x");
break;
case BoardType.Behind:
this.sortAndMerge(boards, boxMap, "y");
}
if (boards.length === 1)
{
let box = boxMap.get(boards[0]);
box.spliteType = boards[0].BoardType;
spliteSPs.push(box);
}
if (uniSpaces.length === 0)
{
for (let i = 0; i < boards.length - 1; i++)
{
let b1 = boards[i];
let box1 = boxMap.get(b1);
let b2 = boards[i + 1];
let box2 = boxMap.get(b2).clone();
let box = this.parseBox3(box1, box2, b1.BoardType)
if (!box.isEmpty())
{
box.spliteType = b1.BoardType;
uniSpaces.push(box);
}
}
}
else
{
for (let i = 0; i < boards.length - 1; i++)
{
let b1 = boards[i];
let box1 = boxMap.get(b1);
let b2 = boards[i + 1];
let box2 = boxMap.get(b2).clone();
let box = this.parseBox3(box1.clone(), box2.clone(), b1.BoardType)
if (!box.isEmpty())
{
if (uniSpaces.every(b => !b.intersectsBox(box)))
{
this.m_Spaces.push(box);
continue;
}
box1.spliteType = b1.BoardType;
spliteSPs.push(box1)
}
if (i === boards.length - 2)
{
box2.spliteType = b1.BoardType;
spliteSPs.push(box2)
}
}
}
}
//排序归并板件
private sortAndMerge(boards: Board[], boxMap: Map<Board, Box3Ext>, type: string)
{
boards.sort((a, b) => boxMap.get(a).min[type] - boxMap.get(b).min[type]);
for (let i = 0; i < boards.length; i++)
{
let b1 = boards[i];
let box1 = boxMap.get(b1);
for (let j = i + 1; j < boards.length; j++)
{
let b2 = boards[j];
let box2 = boxMap.get(b2);
if (equaln(box1.min[type], box2.min[type]))
{
let b = box1.clone();
box1.union(box2)
boards.splice(j, 1);
j--;
}
else
{
i = j - 1;
break;
}
}
}
}
}

@ -0,0 +1,139 @@
import { Matrix4, Vector3 } from "three";
import { app } from "../../ApplicationServices/Application";
import { Board, BoardType } from "../../DatabaseServices/Board";
import { PromptStatus } from "../../Editor/PromptResult";
import { Box3Ext } from "../Box";
/**
*
*
* 1
* ,2,
* //TODO:暂不考虑名称,排钻,封边.....
* @export
* @class SpaceParse
*/
export class SpaceParse
{
protected m_Boards: Board[];
protected m_BoardGName: string;
protected m_Length: number;
protected m_Width: number;
protected m_Height: number;
protected m_LeftBoard: Board;
protected m_RightBoard: Board;
protected m_TopBoard: Board;
protected m_BottomBoard: Board;
protected m_FrontBoard: Board;
protected m_BehindBoard: Board;
protected boardMap: Map<BoardType, Board[]> = new Map();
protected m_StandardBoard: Board;
protected m_Spaces: Box3Ext[] = [];
protected m_TotalSpace: Box3Ext = new Box3Ext();
constructor(boards: Board[])
{
this.m_Boards = boards || [];
}
//取数组第一块板板的板件矩阵做参考矩阵
get OCS()
{
return this.m_Boards[0] ? this.m_Boards[0].BoardOCS : new Matrix4();
}
get TotalSpace()
{
return this.m_TotalSpace;
}
async SpaceParse()
{
if (this.m_Boards.length === 1)
{
await this.parseSingleBoard(this.m_Boards[0]);
}
else
{
//区分开每种板
for (let b of this.m_Boards)
{
let tmpList = this.boardMap.get(b.BoardType);
if (!tmpList)
{
this.boardMap.set(b.BoardType, [b])
}
else
{
tmpList.push(b);
}
}
}
}
parseTotalSpace()
{
this.m_Boards.forEach(br =>
{
let b = br.Clone() as Board;
b.ApplyMatrix(new Matrix4().extractRotation(b.BoardOCSInv))
let box = b.BoundingBox;
this.m_TotalSpace.union(box);
})
}
/**
*
* @param {Board} br
* @memberof SpaceParse
*/
async parseSingleBoard(br: Board)
{
let dtRes = await app.m_Editor.GetDistance({ Msg: "只有一块板,请输入延伸距离:", Default: 300 });
if (dtRes.Status !== PromptStatus.Cancel)
{
let dist = dtRes.Value;
let b = br.Clone() as Board;
b.ApplyMatrix(new Matrix4().extractRotation(br.BoardOCSInv));
let box = b.BoundingBox;
let min = box.min.clone();
let max = box.max.clone();
switch (br.BoardType)
{
case BoardType.Layer:
this.m_Spaces.push(new Box3Ext(
min.clone().add(new Vector3(0, 0, -dist)),
max.clone().add(new Vector3(0, 0, -br.Thickness))
));
this.m_Spaces.push(new Box3Ext(
min.clone().add(new Vector3(0, 0, br.Thickness)),
max.clone().add(new Vector3(0, 0, dist))
));
break;
case BoardType.Vertical:
this.m_Spaces.push(new Box3Ext(
min.clone().add(new Vector3(br.Thickness)),
max.clone().add(new Vector3(dist))
));
this.m_Spaces.push(new Box3Ext(
min.clone().add(new Vector3(-dist)),
max.clone().add(new Vector3(-br.Thickness))
));
break;
case BoardType.Behind:
this.m_Spaces.push(new Box3Ext(
min.clone().add(new Vector3(0, -dist)),
max.clone().add(new Vector3(0, -br.Thickness))
));
this.m_Spaces.push(new Box3Ext(
min.clone().add(new Vector3(0, br.Thickness)),
max.clone().add(new Vector3(0, dist))
));
}
}
}
}

@ -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

@ -12,13 +12,13 @@ export enum StoreName
Texture = "Texture",
Dwg = "Dwg",
Data = "Data",
FileId = "fileId"
FileId = "fileId",
ConfigData = "configData"
}
export class IndexedDbStore
{
private dbRequest: IDBOpenDBRequest;
private isOK: boolean = true;;
private db: IDBDatabase;
m_CurrentFileId: string;
@ -93,6 +93,11 @@ export class IndexedDbStore
(db: IDBDatabase) =>
{
db.createObjectStore(StoreName.FileId);
},
// ver5.
(db: IDBDatabase) =>
{
db.createObjectStore(StoreName.ConfigData);
}
];
}

@ -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"
/>
)
}));

@ -108,14 +108,14 @@ export class LightModal extends React.Component<LightModalProps, LightModalState
{
let light = this.props.selectedObj as PointLight;
return (
<div className="bp3-dialog-container" onKeyDown={(e) => e.stopPropagation()} >
<div id="lightModal" className="bp3-dialog-container" onKeyDown={(e) => e.stopPropagation()} >
<div className="bp3-dialog">
<div
className="bp3-dialog-header"
id="dragArea"
data-id="dragArea"
>
<span className="bp3-icon-large bp3-icon-lightbulb"></span>
<h5 className="bp3-dialog-header-title"></h5>
<h4 className="bp3-heading"></h4>
<button
aria-label="Close" className="bp3-dialog-close-button bp3-icon-small-cross"
onClick={() => this.props.clear()}

@ -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;
}
}

@ -8,9 +8,10 @@ import { PointLight } from '../../../DatabaseServices/PointLight';
import { Text } from '../../../DatabaseServices/Text/Text';
import { Editor } from '../../../Editor/Editor';
import { PointPick } from '../../../Editor/PointPick';
import { BoardStore } from '../../Store/BoardStore';
import { BoardModal } from '../Board/BoardModal';
import { LightModal } from './LightModal';
import './Modal.css';
import './Modal.less';
export class ModalManage
@ -24,6 +25,7 @@ export class ModalManage
this.m_ModalContainer = document.createElement("div");
this.m_ModalContainer.id = "modal";
document.getElementById("Webgl").parentNode.appendChild(this.m_ModalContainer);
this.RegisterEvent();
}
// 注册事件
@ -35,12 +37,34 @@ export class ModalManage
{
this.Clear();
}
e.stopPropagation();
})
xaop.end(this.m_ed.m_MouseCtrl, this.m_ed.m_MouseCtrl.onDBMouseDown, () =>
{
this.OnMouseDbClick()
})
}
RenderBoardModal(store: BoardStore, type: string)
{
//命令栏高度
let commandHeight = document.getElementsByClassName("lm_item lm_row")[0].clientHeight;
ReactDOM.render(
<BoardModal type={type} store={store} />,
this.m_ModalContainer);
// this.m_ModalContainer.style.left = `calc( 50% - ${this.m_ModalContainer.clientWidth / 2}px)`;
this.m_ModalContainer.style.right = "0";
this.m_ModalContainer.style.top = `calc( 50% - ${(this.m_ModalContainer.clientHeight + commandHeight - 40) / 2}px)`;
this.m_ModalContainer.style.width = "auto";
this.UpdateModalPosition();
}
RenderModal(Component: any, store: BoardStore)
{
ReactDOM.render(<Component store={store} />, this.m_ModalContainer);
//设置初始位置
this.m_ModalContainer.style.right = "0";
this.m_ModalContainer.style.top = "40px";
}
OnMouseDbClick()
{
let en = PointPick(app.m_Editor.m_MouseCtrl.m_CurMousePointVCS, app.m_Viewer)[0];
@ -54,56 +78,63 @@ export class ModalManage
clear={this.Clear}
update={this.UpdateView} />,
this.m_ModalContainer)
//设置初始位置
this.m_ModalContainer.style.right = "0";
this.m_ModalContainer.style.top = "40px";
this.m_ModalContainer.style.width = "200px";
this.UpdateModalPosition()
} else if (en && en.userData instanceof Text)
}
else if (en && en.userData instanceof Text)
{
en.userData.toggleTextArea();
}
}
UpdateModalPosition()
{
let dragArea = document.querySelector('#modal [data-id=dragArea]') as HTMLElement;
if (!dragArea) return;
let modal = this.m_ModalContainer;
//鼠标在模态框的位置
let modalX;
let modalY;
//命令栏高度
let commandHeight = document.getElementsByClassName("lm_item lm_row")[0].clientHeight;
//底部面板高度
let downHeight = document.getElementById("DownPanel").offsetHeight;
let dragArea = document.getElementById("dragArea");
if (!dragArea) return;
let topHeight = 40;
dragArea.onmousedown = (e) =>
{
dragArea.onmousedown = (e) =>
//底部边界
let maxBottom = window.innerHeight - commandHeight - modal.offsetHeight + downHeight;
modalX = e.clientX - modal.offsetLeft;
modalY = e.clientY - modal.offsetTop;
modal.style.cursor = "move";
document.onmousemove = (e) =>
{
//命令栏高度
let commandHeight = document.getElementsByClassName("lm_item lm_row")[0].clientHeight;
//底部边界
let maxBottom = window.innerHeight - commandHeight - modal.offsetHeight + downHeight;
modalX = e.clientX - modal.offsetLeft;
modalY = e.clientY - modal.offsetTop;
modal.style.cursor = "move";
document.onmousemove = (e) =>
{
let moveX = e.clientX - modalX;
if (moveX < 0) moveX = 0;
else if
(moveX > window.innerWidth - modal.offsetWidth) moveX = window.innerWidth - modal.offsetWidth;
let moveX = e.clientX - modalX;
if (moveX < 0) moveX = 0;
else if
(moveX > window.innerWidth - modal.offsetWidth) moveX = window.innerWidth - modal.offsetWidth;
let moveY = e.clientY - modalY;
if (moveY < 40) moveY = 40;
else if (moveY > maxBottom) moveY = maxBottom;
let moveY = e.clientY - modalY;
if (moveY < topHeight) moveY = topHeight;
else if (moveY > maxBottom) moveY = maxBottom;
modal.style.left = moveX + "px";
modal.style.top = moveY + "px";
modalX = e.clientX - modal.offsetLeft;
modalY = e.clientY - modal.offsetTop;
}
}
document.onmouseup = (e) =>
{
modal.style.cursor = "default";
document.onmousemove = null;
modal.style.left = moveX + "px";
modal.style.top = moveY + "px";
modalX = e.clientX - modal.offsetLeft;
modalY = e.clientY - modal.offsetTop;
}
}
document.onmouseup = (e) =>
{
modal.style.cursor = "default";
document.onmousemove = null;
}
}
UpdateView()
{

@ -6,7 +6,6 @@ import { SettingPanel } from './SettingPanel/SettingPanel';
import Login from './signComponent/login';
import SoucePanel from './SourceManage/SoucePanel';
interface TopPanelState
{
isLogin: boolean,//是否登录

@ -6,7 +6,7 @@ body {
html,
body {
background: gray;
background: #5C7080;
height: 100%;
padding: 0;
margin: 0;
@ -414,9 +414,16 @@ div {
float: right;
;
}
.inline{
display: inline-block
}
.flex {
display: flex;
justify-content: space-between;
}
.flexWrap{
display: flex;
flex-wrap: wrap
}
.ul-unstyle {
@ -454,3 +461,30 @@ img {
align-content: stretch;
align-items: stretch;
}
.center{
text-align: center;
}
.widthHalf{
width: 50%;
}
.arrow{
display: block;
border: 10px solid transparent;
width: 0;
height: 0px;
margin: 0 auto;
}
.arrowtop{
border-bottom: 10px solid #000;
margin-top: -3px;
}
.arrowbottom{
border-top: 10px solid #000;
}
.line{
display: block;
border: 2px solid #000;
width: 0;
height: 16px;
margin: 0 auto;
}

@ -37,7 +37,6 @@ export class AngleDynamicInput extends RealDynamicInput
super.Destroy();
this.angleSymbolEl.remove();
}
//TODO:设置角度输入框位置
SetPosition(x, y)
{
super.SetPosition(x, y);

@ -44,6 +44,8 @@ export class DynamicInput
case KeyBoard.Space:
case KeyBoard.Enter:
case KeyBoard.Tab:
case KeyBoard.Alt:
case KeyBoard.Control:
e.preventDefault();
return;
case KeyBoard.Alt:

@ -76,7 +76,6 @@ export class WebCAD
top.id = "TopPanel";
appContainer.appendChild(top);
top.style.flexBasis = "50px";
top.style.overflow = "hidden";
//content
var content = document.createElement('div');

@ -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;
}
}

@ -17,14 +17,14 @@ window.onload = function ()
//-----热模块替换的代码.
async function loadFirst()
{
let cmd = (await import("./Add-on/test")).Test;
let cmd = (await import("./Add-on/testEntity/test")).Test;
commandMachine.RegisterCommand("tt", new cmd());
}
loadFirst();//必须先加载一次,否则无法触发热模块替换
if (module.hot)
{
module.hot.accept('./Add-on/test', loadFirst)
module.hot.accept('./Add-on/testEntity/test', loadFirst)
}
};

Loading…
Cancel
Save