mirror of https://gitee.com/cf-fz/WebCAD.git
parent
aa11f8af1f
commit
7978186036
@ -0,0 +1,42 @@
|
||||
import { PointPick } from "./PointPick";
|
||||
import { PointLight } from "../DatabaseServices/PointLight";
|
||||
import { app } from "../ApplicationServices/Application";
|
||||
import { LightModal } from "../UI/Components/Modal/LightModal";
|
||||
import { ModalPosition } from "../UI/Components/Modal/ModalsManage";
|
||||
import { Text } from "../DatabaseServices/Text/Text";
|
||||
import { Board } from "../DatabaseServices/Board";
|
||||
import { BoardOptionModal } from "../UI/Components/Board/BoardOptionModal";
|
||||
import { Singleton } from "../Common/Singleton";
|
||||
import { TextArea } from "../DatabaseServices/Text/TextArea";
|
||||
|
||||
export class DbClickManager
|
||||
{
|
||||
OnDbClick()
|
||||
{
|
||||
let en = PointPick(app.m_Editor.m_MouseCtrl.m_CurMousePointVCS, app.m_Viewer)[0];
|
||||
if (!en)
|
||||
return;
|
||||
//双击实体取消选中状态
|
||||
app.m_Editor.m_SelectCtrl.Cancel();
|
||||
//双击应防止触发实体移动
|
||||
app.m_Editor.transCtrl.Cancel();
|
||||
|
||||
if (en.userData instanceof PointLight)
|
||||
{
|
||||
app.m_Editor.m_ModalManage.RenderModeless(LightModal, ModalPosition.Right, { selectedObj: en.userData });
|
||||
}
|
||||
else if (en.userData instanceof Text)
|
||||
{
|
||||
let textarea = Singleton.GetInstance(TextArea);
|
||||
textarea.StartEditorText(en);
|
||||
}
|
||||
else if (en.userData instanceof Board)
|
||||
{
|
||||
app.m_Editor.m_ModalManage.RenderModeless(
|
||||
BoardOptionModal,
|
||||
ModalPosition.Right,
|
||||
{ board: en.userData }
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
import { Button, Checkbox } from "@blueprintjs/core";
|
||||
import { observer } from "mobx-react";
|
||||
import * as React from 'react';
|
||||
import { BoardData } from '../../Store/BoardInterface';
|
||||
import { BoardName, BoardTypeComponent, SetBoardDataBlock } from "./BoardCommon";
|
||||
|
||||
export const BoardConfigModal =
|
||||
(observer((data: BoardData) =>
|
||||
{
|
||||
let pars = new Map([["height", "显示高"], ["width", "显示宽"], ["thickness", "显示厚"],
|
||||
]);
|
||||
let groovePars = new Map([
|
||||
["spliteHeight", "拆单高"], ["spliteWidth", "拆单宽"], ["spliteThickness", "拆单厚"],
|
||||
["knifeRad", "刀具半径"],
|
||||
["grooveAddLength", "槽加长"], ["grooveAddWidth", "槽加宽"], ["grooveAddDepth", "槽加深"]
|
||||
]);
|
||||
let rotatePars = new Map([
|
||||
["rotateX", "旋转X"], ["rotateY", "旋转Y"], ["rotateZ", "旋转Z"]
|
||||
]);
|
||||
return (
|
||||
<div>
|
||||
<BoardTypeComponent opt={data.boardConfig} />
|
||||
<BoardName opt={data.boardConfig} />
|
||||
<SetBoardDataBlock
|
||||
className="flexWrap"
|
||||
pars={pars}
|
||||
opt={data.boardConfig}
|
||||
/>
|
||||
<SetBoardDataBlock
|
||||
className="flexWrap"
|
||||
pars={rotatePars}
|
||||
opt={data.boardConfig}
|
||||
/>
|
||||
<SetBoardDataBlock
|
||||
className="flexWrap"
|
||||
pars={groovePars}
|
||||
opt={data.boardProcess}
|
||||
/>
|
||||
<div>
|
||||
<Checkbox checked={true} label="异型" inline={true} />
|
||||
<Button className="bp3-intent-primary" text="提取" />
|
||||
<Button className="bp3-intent-primary" text="修改" />
|
||||
<Button className="bp3-intent-primary" text="切割" />
|
||||
</div>
|
||||
<div>
|
||||
<Checkbox checked={true} label="造型" inline={true} />
|
||||
<Button className="bp3-intent-primary" text="造型提取" />
|
||||
<Button className="bp3-intent-primary" text="造型修改" />
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}));
|
@ -0,0 +1,166 @@
|
||||
import { Button, Classes } from '@blueprintjs/core';
|
||||
import { observable } from 'mobx';
|
||||
import * as React from 'react';
|
||||
import { Euler, Math, Matrix4 } from 'three';
|
||||
import { app } from '../../../ApplicationServices/Application';
|
||||
import { Board } from '../../../DatabaseServices/Board';
|
||||
import { equaln } from '../../../Geometry/GeUtils';
|
||||
import { BoardProcessOption, SingleBoardOption } from '../../Store/BoardInterface';
|
||||
import { Notes } from './BoardCommon';
|
||||
import { BoardConfigModal } from './BoardConfigModal';
|
||||
import { BoardProcessModal } from './BoardProcessModal';
|
||||
import { FixedNotZero } from '../../../Common/Utils';
|
||||
|
||||
export class BoardOptionModal extends React.Component<{ board: Board }, {}>
|
||||
{
|
||||
@observable private m_ConfigOption: SingleBoardOption;
|
||||
@observable private m_ProcessOption: BoardProcessOption;
|
||||
private m_BoardMap: Map<string, Board> = new Map();
|
||||
constructor(props)
|
||||
{
|
||||
super(props);
|
||||
let br = this.props.board;
|
||||
this.SetBrConfig(br);
|
||||
this.m_ProcessOption = Object.assign({}, br.m_BoardProcessOption);
|
||||
}
|
||||
SetBrConfig = (br: Board) =>
|
||||
{
|
||||
let rotaMat = new Matrix4().extractRotation(br.BoardOCS);
|
||||
let euler = new Euler().setFromRotationMatrix(rotaMat);
|
||||
let newConfig = {
|
||||
name: br.Name,
|
||||
type: br.BoardType,
|
||||
height: FixedNotZero(br.Length, 2),
|
||||
width: FixedNotZero(br.Width, 2),
|
||||
thickness: FixedNotZero(br.Thickness, 2),
|
||||
rotateX: FixedNotZero(Math.radToDeg(euler.x), 2),
|
||||
rotateY: FixedNotZero(Math.radToDeg(euler.y), 2),
|
||||
rotateZ: FixedNotZero(Math.radToDeg(euler.z), 2),
|
||||
}
|
||||
if (this.m_ConfigOption)
|
||||
{
|
||||
Object.assign(this.m_ConfigOption, newConfig);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.m_ConfigOption = newConfig;
|
||||
}
|
||||
}
|
||||
handleComfirmOption = () =>
|
||||
{
|
||||
let board = this.props.board;
|
||||
Object.assign(board.m_BoardProcessOption, this.m_ProcessOption);
|
||||
board.Name = this.m_ConfigOption.name;
|
||||
board.Length = parseFloat(this.m_ConfigOption.height);
|
||||
board.Width = parseFloat(this.m_ConfigOption.width);
|
||||
board.Thickness = parseFloat(this.m_ConfigOption.thickness);
|
||||
board.BoardType = this.m_ConfigOption.type;
|
||||
|
||||
//应用旋转分量
|
||||
let oldEuler = new Euler().setFromRotationMatrix(new Matrix4().extractRotation(board.BoardOCS));
|
||||
let newEuler = new Euler(
|
||||
Math.degToRad(parseFloat(this.m_ConfigOption.rotateX)),
|
||||
Math.degToRad(parseFloat(this.m_ConfigOption.rotateY)),
|
||||
Math.degToRad(parseFloat(this.m_ConfigOption.rotateZ))
|
||||
)
|
||||
if (!equaln(oldEuler.x, newEuler.x)
|
||||
|| !equaln(oldEuler.y, newEuler.y)
|
||||
|| !equaln(oldEuler.z, newEuler.z))
|
||||
{
|
||||
let pos = board.Position;
|
||||
board
|
||||
.ApplyMatrix(board.BoardOCSInv)
|
||||
.ApplyMatrix(new Matrix4().makeRotationFromEuler(newEuler))
|
||||
.ApplyMatrix(new Matrix4().setPosition(pos));
|
||||
}
|
||||
app.m_Editor.UpdateScreen();
|
||||
app.m_Editor.m_ModalManage.Clear()
|
||||
}
|
||||
componentWillMount()
|
||||
{
|
||||
app.m_Viewer.Scene.children.forEach(en =>
|
||||
{
|
||||
let br = en.userData;
|
||||
if (br
|
||||
&& br instanceof Board && br.Id
|
||||
&& br.m_BoardProcessOption.roomName === this.props.board.m_BoardProcessOption.roomName)
|
||||
{
|
||||
this.m_BoardMap.set(br.Id.Index.toString(), br);
|
||||
}
|
||||
})
|
||||
}
|
||||
render()
|
||||
{
|
||||
return (
|
||||
<div
|
||||
className="bp3-dialog-container"
|
||||
id="boardModal"
|
||||
>
|
||||
<div className="bp3-dialog board-config">
|
||||
<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={() => app.m_Editor.m_ModalManage.Clear()}
|
||||
></button>
|
||||
</div>
|
||||
<div
|
||||
className="bp3-dialog-body"
|
||||
>
|
||||
<div className="bp3-card">
|
||||
<div className="bp3-select .modifier">
|
||||
<select style={{ width: "15rem" }}
|
||||
onChange={e =>
|
||||
{
|
||||
let br = this.m_BoardMap.get(e.target.value);
|
||||
this.SetBrConfig(br);
|
||||
Object.assign(this.m_ProcessOption, br.m_BoardProcessOption);
|
||||
}}
|
||||
>
|
||||
{
|
||||
Array.from(this.m_BoardMap.values()).map(b =>
|
||||
<option key={b.Id.Index.toString()} value={b.Id.Index.toString()} selected={b === this.props.board}>
|
||||
板件名:{b.Name}
|
||||
柜名:{b.m_BoardProcessOption.boardName}
|
||||
</option>
|
||||
)
|
||||
}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex">
|
||||
<div className="bp3-card">
|
||||
<h6 className={Classes.HEADING}>板件尺寸</h6>
|
||||
<BoardConfigModal boardConfig={this.m_ConfigOption} boardProcess={this.m_ProcessOption} />
|
||||
</div>
|
||||
<div className="bp3-card">
|
||||
<h6 className={Classes.HEADING}>封边信息</h6>
|
||||
<BoardProcessModal opt={this.m_ProcessOption} />
|
||||
</div>
|
||||
<div className="bp3-card">
|
||||
<Notes />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="bp3-dialog-footer">
|
||||
<div className="bp3-dialog-footer-actions">
|
||||
<Button
|
||||
className="bp3-intent-success"
|
||||
text="确定"
|
||||
onClick={this.handleComfirmOption}
|
||||
/>
|
||||
<Button className="bp3-intent-danger" text="取消"
|
||||
onClick={() => app.m_Editor.m_ModalManage.Clear()}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div >
|
||||
);
|
||||
}
|
||||
}
|
@ -1,42 +1,33 @@
|
||||
import * as React from 'react';
|
||||
import { observer } from "mobx-react";
|
||||
import { BoardType } from "../../../DatabaseServices/Board";
|
||||
import * as React from 'react';
|
||||
import { SingleBoardStore } from "../../Store/BoardStore";
|
||||
import { BoardName, SetBoardDataBlock } from "./BoardCommon";
|
||||
import { BoardName, BoardTypeComponent, 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 processPars = new Map([
|
||||
["spliteHeight", "拆单高"], ["spliteWidth", "拆单宽"], ["spliteThickness", "拆单厚"]
|
||||
])
|
||||
let opt = props.store.m_BoardOption;
|
||||
let processOpt = props.store.m_BoardProcessOption;
|
||||
return (
|
||||
<div>
|
||||
<label className="bp3-label bp3-inline .modifier">
|
||||
<span>板类型</span>
|
||||
<div className="bp3-select bp3-inline .modifier">
|
||||
<select
|
||||
value={opt.type + ""}
|
||||
onChange={e =>
|
||||
{
|
||||
props.store.m_BoardOption.name = e.target.options[e.target.selectedIndex].label;
|
||||
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} />
|
||||
<BoardTypeComponent opt={opt} />
|
||||
<BoardName opt={opt} />
|
||||
<SetBoardDataBlock
|
||||
pars={pars}
|
||||
opt={opt}
|
||||
isInline={true}
|
||||
/>
|
||||
<SetBoardDataBlock
|
||||
pars={processPars}
|
||||
opt={processOpt}
|
||||
isInline={true}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
}));
|
||||
|
Loading…
Reference in new issue