添加背板,优化顶底板,添加地脚板

pull/93/head
Zoe 6 years ago
parent e2cfeb67f4
commit 24be219cb5

@ -0,0 +1,56 @@
import { Matrix4, Vector3 } from 'three';
import { TopBottomBoardStore, ModalState, BehindBoardStore } from '../../UI/Store/BoardStore';
import { app } from '../../ApplicationServices/Application';
import { PromptStatus } from '../../Editor/PromptResult';
import { Board, BoardType } from '../../DatabaseServices/Board';
import { TopAndBottomSpaceParse } from '../../Geometry/SpaceParse';
import { Command } from '../../Editor/CommandMachine';
import { MoveMatrix } from '../../Geometry/GeUtils';
import { BehindBoardModal } from '../../UI/Components/Board/BehindBoardModal';
export class DrawBehindBoard 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 TopAndBottomSpaceParse(boardCus, false);
await spaceParse.SpaceParse();
if (spaceParse.IsVail)
{
let store = BehindBoardStore.Store();
app.m_Editor.m_ModalManage.RenderBoardModal(store, BehindBoardModal);
let state = await store.GetBoardOption();
if (state === ModalState.Ok)
{
let board = Board.CreateBoard(spaceParse.BehindLength, spaceParse.SpaceLength, parseFloat(store.behindBoardOption.thickness), BoardType.Behind);
spaceParse.BaseBehindPoint.add(new Vector3(0, -parseFloat(store.behindBoardOption.thickness)))
board.ApplyMatrix(MoveMatrix(spaceParse.BaseBehindPoint));
let rot = new Matrix4().extractRotation(spaceParse.OCS)
board.ApplyMatrix(rot);
app.m_Database.ModelSpace.Append(board);
}
}
else
{
app.m_Editor.m_CommandStore.Prompt("选择板无效")
}
}
else
{
app.m_Editor.m_CommandStore.Prompt("不是选择2块板或者板类型不正确")
}
}
}

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

@ -1,24 +1,26 @@
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 { ModalState, SideBoardStore } from '../UI/Store/BoardStore';
import { SideBoardStore, ModalState } from '../../UI/Store/BoardStore';
import { BoardType, Board } from '../../DatabaseServices/Board';
import { Command } from '../../Editor/CommandMachine';
import { app } from '../../ApplicationServices/Application';
import { MoveMatrix } from '../../Geometry/GeUtils';
import { PromptStatus } from '../../Editor/PromptResult';
import { LeftRightBoardModal } from '../../UI/Components/Board/leftRightBoardModal';
export class DrawLeftRight implements Command
{
async exec()
{
app.m_Editor.m_ModalManage.RenderLeftRightBoard();
let sideBoardStore = SideBoardStore.Store();
let store = SideBoardStore.Store();
let state = await sideBoardStore.GetBoardOption();
app.m_Editor.m_ModalManage.RenderBoardModal(store, LeftRightBoardModal);
let state = await store.GetBoardOption();
if (state === ModalState.Ok)
{
let data = sideBoardStore.boardOption;
let data = store.boardOption;
let lenght = data.lenght ? parseFloat(data.lenght) : 0;
let width = data.width ? parseFloat(data.width) : 0;
let thickness = data.thickness ? parseFloat(data.thickness) : 0;

@ -1,11 +1,13 @@
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 { TopAndBottomSpaceParse } from '../Geometry/SpaceParse';
import { ModalState, TopBottomBoardStore } from '../UI/Store/BoardStore';
import { Matrix4, Vector3 } from 'three';
import { TopBottomBoardStore, ModalState } from '../../UI/Store/BoardStore';
import { app } from '../../ApplicationServices/Application';
import { PromptStatus } from '../../Editor/PromptResult';
import { Board, BoardType } from '../../DatabaseServices/Board';
import { TopAndBottomSpaceParse } from '../../Geometry/SpaceParse';
import { Command } from '../../Editor/CommandMachine';
import { MoveMatrix } from '../../Geometry/GeUtils';
import { TopBottomBoardModal } from '../../UI/Components/Board/TopBottomBoardModal';
export class DrawTopBottomBoard implements Command
{
@ -16,9 +18,9 @@ export class DrawTopBottomBoard implements Command
return;
let boardCus = exSsRes.SelectSet.SelectEntityList.filter(en =>
en instanceof Board && en.BoardType === BoardType.Vertical) as Board[];
en instanceof Board) as Board[];
if (boardCus.length === 2)
if (boardCus.length >= 2)
{
let spaceParse = new TopAndBottomSpaceParse(boardCus);
@ -26,9 +28,12 @@ export class DrawTopBottomBoard implements Command
if (spaceParse.IsVail)
{
app.m_Editor.m_ModalManage.RenderTopBottomBoard();
let store = TopBottomBoardStore.Store();
app.m_Editor.m_ModalManage.RenderBoardModal(store, TopBottomBoardModal);
let state = await store.GetBoardOption();
if (state === ModalState.Ok)
{
let topOpt = store.topBoardOption;
@ -49,12 +54,14 @@ export class DrawTopBottomBoard implements Command
app.m_Editor.m_CommandStore.Prompt("不是选择2块板或者板类型不正确")
}
}
buildTBBoard(spaceParse: TopAndBottomSpaceParse, opt, wrapPt: Vector3, noWrapPt: Vector3, isTop = false)
buildTBBoard(spaceParse: TopAndBottomSpaceParse, opt: any, wrapPt: Vector3, noWrapPt: Vector3, isTop = false)
{
let board: Board;
let basePt: Vector3;
let length;
let rot = new Matrix4().extractRotation(spaceParse.OCS)
if (opt.isWrapSide)
{
length = spaceParse.TotalLength;
@ -67,12 +74,17 @@ export class DrawTopBottomBoard implements Command
basePt = noWrapPt;
!isTop && basePt.add(new Vector3(0, 0, parseFloat(opt.thickness)));
basePt.add(new Vector3(0, 0, parseFloat(opt.offset) * (isTop ? -1 : 1)));
if (!isTop)
{
let footBoard = Board.CreateBoard(parseFloat(opt.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), parseFloat(opt.thickness), BoardType.Layer)
board.ApplyMatrix(MoveMatrix(basePt));
let rot = new Matrix4().extractRotation(spaceParse.OCS)
board.ApplyMatrix(rot);
app.m_Database.ModelSpace.Append(board);
}

@ -25,9 +25,9 @@ export class Test implements Command
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)
// b1.ApplyMatrix(rotate)
// b2.ApplyMatrix(rotate)
// b3.ApplyMatrix(rotate)
app.m_Database.ModelSpace.Append(b1);
app.m_Database.ModelSpace.Append(b2);

@ -8,6 +8,7 @@ import { Entity } from './Entity';
import { Line } from './Line';
import { DbPhysicalMaterial } from './PhysicalMaterial';
import { Shape } from './Shape';
import { ColorMaterial } from '../Common/ColorPalette';
@ -86,6 +87,7 @@ export class Board extends Entity
let roMat = board.getRotateMatrix4(boardType);
board.ApplyMatrix(roMat);
board.ColorIndex = boardType + 1;
return board;
}
getRotateMatrix4(boardType: BoardType)
@ -201,7 +203,7 @@ export class Board extends Entity
}
InitDrawObject(renderType: RenderType = RenderType.Wireframe): Object3D
{
return new THREE.Mesh(this.UpdateGeometry());
return new THREE.Mesh(this.UpdateGeometry(), ColorMaterial.GetLineMaterial(this.ColorIndex));
}
private UpdateGeometry()
{

@ -7,7 +7,7 @@ import { CopyClip } from '../Add-on/CopyClip';
import { Command_CopyPoint } from '../Add-on/CopyPoint';
import { CustomUcs } from '../Add-on/CostumUCS';
import { DrawArc } from '../Add-on/DrawArc';
import { Command_DrawBoard } from '../Add-on/DrawBoard';
import { Command_DrawBoard } from '../Add-on/DrawBoard/DrawBoard';
import { DrawAlignedDimension } from '../Add-on/DrawDim/DrawAlignedDimension';
import { DrawLineAngularDimension } from '../Add-on/DrawDim/DrawLineAngularDimension';
import { DrawLinearDimension } from '../Add-on/DrawDim/DrawLinearDimension';
@ -64,8 +64,9 @@ import { Command_DimTest } from '../DatabaseServices/Dimension/dimTest';
import { commandMachine } from './CommandMachine';
import { Union } from '../Add-on/CSGUnion';
import { Command_Ssget } from '../Add-on/ssget';
import { DrawLeftRight } from '../Add-on/DrawLeftRightBoard';
import { DrawTopBottomBoard } from '../Add-on/DrawTopBottomBoard';
import { DrawLeftRight } from '../Add-on/DrawBoard/DrawLeftRightBoard';
import { DrawTopBottomBoard } from '../Add-on/DrawBoard/DrawTopBottomBoard';
import { DrawBehindBoard } from '../Add-on/DrawBoard/DrawBehindBoard';
export function registerCommand()
{
@ -166,6 +167,7 @@ export function registerCommand()
commandMachine.RegisterCommand("pe", new Pedit());
commandMachine.RegisterCommand("zyc", new DrawLeftRight());
commandMachine.RegisterCommand("dd", new DrawTopBottomBoard());
commandMachine.RegisterCommand("bb", new DrawBehindBoard());
/*******test ↓↓↓*********/

@ -29,11 +29,13 @@ export class SpaceParse
private m_BehindBoard: Board;
protected boardMap: Map<BoardType, Board[]> = new Map();
protected m_StandardBoard: Board;
protected isSetStandardBoard: boolean = true;
constructor(boards: Board[])
constructor(boards: Board[], isSet?: boolean)
{
this.m_Boards = boards || [];
if (isSet !== undefined)
this.isSetStandardBoard = isSet;
}
SpaceParse()
{
@ -77,10 +79,11 @@ export class TopAndBottomSpaceParse extends SpaceParse
//底包侧底板基点
private m_BaseBottomUpPoint: Vector3;
constructor(boards: Board[])
{
super(boards);
}
//背板基点
private m_BaseBehindPoint: Vector3;
private m_BehindLength: number;
private m_BaseFootPoint: Vector3;
get IsVail()
{
return this.m_IsVail;
@ -97,6 +100,10 @@ export class TopAndBottomSpaceParse extends SpaceParse
{
return this.m_SpaceWidth
}
get BehindLength()
{
return this.m_BehindLength;
}
get BaseTopDownPoint()
{
return this.m_BaseTopDownPoint;
@ -113,6 +120,14 @@ export class TopAndBottomSpaceParse extends SpaceParse
{
return this.m_BaseBottomUpPoint;
}
get BaseBehindPoint()
{
return this.m_BaseBehindPoint;
}
get BaseFootPoint()
{
return this.m_BaseFootPoint;
}
get OCS()
{
return this.m_StandardBoard ? this.m_StandardBoard.BoardOCS : new Matrix4();
@ -174,9 +189,14 @@ export class TopAndBottomSpaceParse extends SpaceParse
{
let lMinPt = b1.MinPoint;
let rMinPt = b2.MinPoint;
let lMaxPt = b1.MaxPoint;
let rMaxPt = b2.MaxPoint;
let sMinPt: Vector3;
let sMaxPt: Vector3;
//左右侧板之间的垂直距离
let vec = rMinPt.clone().sub(lMinPt);
let ang = b1.Normal.angleTo(vec);
let dist = vec.length() * Math.cos(ang);
@ -189,25 +209,42 @@ export class TopAndBottomSpaceParse extends SpaceParse
//空间宽度
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_BaseTopDownPoint.setZ(lMaxPt.z < rMaxPt.z ? lMaxPt.z : rMaxPt.z);
this.m_BaseTopUpPoint.setZ(lMaxPt.z > rMaxPt.z ? lMaxPt.z : rMaxPt.z);
this.m_BaseBottomUpPoint = this.m_BaseTopDownPoint.clone();
this.m_BaseBottomDownPoint = this.m_BaseTopUpPoint.clone();
this.m_BaseBottomUpPoint.setZ(lMinPt.z > rMinPt.z ? lMinPt.z : rMinPt.z);
this.m_BaseBottomDownPoint.setZ(lMinPt.z < rMinPt.z ? lMinPt.z : rMinPt.z)
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);
@ -215,21 +252,36 @@ export class TopAndBottomSpaceParse extends SpaceParse
{
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)
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
else
{
while (true)
{

@ -0,0 +1,75 @@
import { Button, Dialog } from '@blueprintjs/core';
import { inject, observer } from 'mobx-react';
import * as React from 'react';
import { KeyBoard } from '../../../Common/KeyEnum';
import { BehindBoardStore, ModalState } from '../../Store/BoardStore';
@inject("store")
@observer
export class BehindBoardModal extends React.Component<{ store?: BehindBoardStore }, {}> {
constructor(props)
{
super(props);
}
render()
{
let store = this.props.store;
return (
<Dialog
iconName="inbox"
isOpen={true}
onClose={() => store.OnOk(ModalState.Cancel)}
canOutsideClickClose={false}
enforceFocus={false}
title="背板"
>
<div className="pt-dialog-body" onKeyDown={e =>
{
if (e.keyCode === KeyBoard.Enter)
{
store.OnOk(ModalState.Ok);
}
e.stopPropagation();
}
}>
{
Array.from(store.m_Parameter.keys()).map(k =>
{
return (
<div key={k}>
<label htmlFor="">{store.m_Parameter.get(k)}:</label>
<input
type="number"
value={store.behindBoardOption[k]}
onChange={e =>
{
store.behindBoardOption[k] = e.target.value;
}}
/>
</div>
)
})
}
</div>
<div className="pt-dialog-footer">
<div className="pt-dialog-footer-actions">
<Button className="LeftRightBtn" text="确定" onClick={() =>
{
store.OnOk(ModalState.Ok);
}} />
<Button className="LeftRightBtn" text="取消" onClick={() =>
{
store.OnOk(ModalState.Cancel);
}} />
</div>
</div>
</ Dialog>
);
}
}

@ -5,7 +5,11 @@ import { inject, observer } from 'mobx-react';
@inject("store")
@observer
export class TopBottomBaordDiaLog extends React.Component<{ store?: TopBottomBoardStore }> {
export class TopBottomBoardModal extends React.Component<{ store?: TopBottomBoardStore }> {
constructor(props)
{
super(props);
}
render()
{
let store = this.props.store;

@ -4,27 +4,13 @@ import * as React from 'react';
import { KeyBoard } from '../../../Common/KeyEnum';
import { ModalState, SideBoardStore } from '../../Store/BoardStore';
interface LRState
{
lenght: string,
width: string,
thickness: string,
spacing: string
}
@inject("store")
@observer
export class LeftRightBaordDialog extends React.Component<{ store?: SideBoardStore }, LRState> {
export class LeftRightBoardModal extends React.Component<{ store?: SideBoardStore }, {}> {
constructor(props)
{
super(props);
let store = this.props.store;
this.state = {
lenght: store.boardOption.lenght + "",
width: store.boardOption.width + "",
thickness: store.boardOption.thickness + "",
spacing: store.boardOption.spacing + ""
}
}
render()
{

@ -9,11 +9,12 @@ import { PointLight } from '../../../DatabaseServices/PointLight';
import { Text } from '../../../DatabaseServices/Text/Text';
import { Editor } from '../../../Editor/Editor';
import { PointPick } from '../../../Editor/PointPick';
import { SideBoardStore, TopBottomBoardStore } from '../../Store/BoardStore';
import { LeftRightBaordDialog } from '../Board/leftRightBaordDlg';
import { SideBoardStore, TopBottomBoardStore, BoardStore, BehindBoardStore } from '../../Store/BoardStore';
import { LeftRightBoardModal } from '../Board/leftRightBoardModal';
import { LightModal } from './LightModal';
import './Modal.css';
import { TopBottomBaordDiaLog } from '../Board/TopBottomBaord';
import { TopBottomBoardModal } from '../Board/TopBottomBoardModal';
import { BehindBoardModal } from '../Board/BehindBoardModal';
export class ModalManage
@ -44,19 +45,11 @@ export class ModalManage
this.OnMouseDbClick()
})
}
RenderLeftRightBoard()
RenderBoardModal(store: BoardStore, Com: any)
{
ReactDOM.render(
<Provider store={SideBoardStore.Store()}>
<LeftRightBaordDialog />
</Provider>,
this.m_ModalContainer);
}
RenderTopBottomBoard()
{
ReactDOM.render(
<Provider store={TopBottomBoardStore.Store()}>
<TopBottomBaordDiaLog />
<Provider store={store}>
<Com />
</Provider>,
this.m_ModalContainer);
}

@ -21,7 +21,7 @@ export enum ModalState
Cancel = -1
}
class BoardStore
export class BoardStore
{
protected m_PromisRes;
constructor()
@ -106,3 +106,24 @@ export class TopBottomBoardStore extends BoardStore
return this._store;
}
}
export class BehindBoardStore extends BoardStore
{
@observable behindBoardOption = {
leftExt: "0",
rightExt: "0",
topExt: "0",
bottomExt: "0",
thickness: "0.18",
};
m_Parameter = new Map([
["leftExt", "左延伸"], ["rightExt", "右延伸"], ["topExt", "顶延伸"],
["bottomExt", "底延伸"], ["thickness", "板厚"],
]);
private static _store: BehindBoardStore;
static Store()
{
if (!this._store) this._store = new BehindBoardStore();
return this._store;
}
}

Loading…
Cancel
Save