mirror of https://gitee.com/cf-fz/WebCAD.git
!647 批量固定层板转活动层板
parent
8a19cefcd0
commit
01088b9cdd
@ -0,0 +1,91 @@
|
||||
import { Intent } from "@blueprintjs/core";
|
||||
import { app } from "../ApplicationServices/Application";
|
||||
import { log } from "../Common/Utils";
|
||||
import { Board, BoardType } from "../DatabaseServices/Entity/Board";
|
||||
import { RemoveTemplate } from "../DatabaseServices/Template/TempateUtils";
|
||||
import { Command } from "../Editor/CommandMachine";
|
||||
import { PromptStatus } from "../Editor/PromptResult";
|
||||
import { ActivityLayerBoard } from "../UI/Components/Modal/ActivityLayerBoard";
|
||||
import { ModalPosition, ModalState } from "../UI/Components/Modal/ModalsManage";
|
||||
import { AppToaster } from "../UI/Components/Toaster";
|
||||
import { ActivityLayerBoardStore } from "../UI/Store/ActivityLayerBoardStore";
|
||||
import { activityLayerBoardTool } from "./DrawBoard/ActivityLayerBoardTool";
|
||||
import { TemplateRecord } from "../DatabaseServices/Template/TemplateRecord";
|
||||
|
||||
export class ActicityLayerBoard implements Command
|
||||
{
|
||||
async exec()
|
||||
{
|
||||
const store = ActivityLayerBoardStore.GetInstance() as ActivityLayerBoardStore;
|
||||
app.Editor.ModalManage.RenderModal(ActivityLayerBoard, ModalPosition.Center, { store });
|
||||
|
||||
let res = await app.Editor.ModalManage.Wait();
|
||||
if (res.Status === ModalState.Ok)
|
||||
{
|
||||
let brRes = await app.Editor.GetSelection({
|
||||
Msg: "选择修改的层板",
|
||||
Filter: {
|
||||
filterFunction: (obj, ent) =>
|
||||
{
|
||||
return ent instanceof Board && ent.BoardType === BoardType.Layer && ent.LayerNails.length === 0;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (brRes.Status === PromptStatus.Cancel) return;
|
||||
|
||||
let shinkOption = store.m_Option;
|
||||
let nailOption = store.nailOption;
|
||||
let rules = store.rules;
|
||||
if (rules.length === 0)
|
||||
{
|
||||
nailOption.count = 0;
|
||||
log("错误:层板钉数量为空");
|
||||
}
|
||||
|
||||
let brs = brRes.SelectSet.SelectEntityList as Board[];
|
||||
|
||||
let noTempBrs: Board[] = [];
|
||||
let tempBrsMap: Map<TemplateRecord, Board[]> = new Map();
|
||||
|
||||
for (let br of brs)
|
||||
{
|
||||
if (br.Template)
|
||||
{
|
||||
let temp = br.Template.Object as TemplateRecord;
|
||||
let tempBrs = tempBrsMap.get(temp);
|
||||
if (!tempBrs)
|
||||
{
|
||||
tempBrs = [];
|
||||
tempBrsMap.set(temp, tempBrs);
|
||||
}
|
||||
tempBrs.push(br);
|
||||
}
|
||||
else
|
||||
noTempBrs.push(br);
|
||||
}
|
||||
|
||||
let needRemoveTempBrs: Board[] = [];
|
||||
|
||||
for (let [temp, brs] of tempBrsMap)
|
||||
{
|
||||
RemoveTemplate(temp);
|
||||
needRemoveTempBrs.push(...brs);
|
||||
temp = null;
|
||||
}
|
||||
|
||||
if (needRemoveTempBrs.length > 0)
|
||||
{
|
||||
AppToaster.show({
|
||||
message: "选择的层板中存在模板,将会被移除",
|
||||
timeout: 5000,
|
||||
intent: Intent.WARNING,
|
||||
});
|
||||
noTempBrs.push(...needRemoveTempBrs);
|
||||
}
|
||||
|
||||
noTempBrs.forEach(br => br.ClearAllDrillList());
|
||||
activityLayerBoardTool.Start(noTempBrs, nailOption, rules, shinkOption);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,287 @@
|
||||
import { Board, BoardType } from "../../DatabaseServices/Entity/Board";
|
||||
import { LayerNailOption, IShinkOption, INailRule } from "../../UI/Store/BoardInterface";
|
||||
import { Matrix4, Vector3, Raycaster, Object3D, Intersection, Box3, Box2, Vector2 } from "three";
|
||||
import { MoveMatrix, equalv3, isParallelTo, AsVector2, AsVector3 } from "../../Geometry/GeUtils";
|
||||
import { app } from "../../ApplicationServices/Application";
|
||||
import { CylinderHole, GangDrillType } from "../../DatabaseServices/3DSolid/CylinderHole";
|
||||
import { BoardGetFace, BoardFaceType } from "../../Geometry/DrillParse/BoardGetFace";
|
||||
import { Raycast } from "../../Editor/PointPick";
|
||||
import { RenderType } from "../../GraphicsSystem/RenderType";
|
||||
import { Face } from "../../Geometry/DrillParse/Face";
|
||||
import { GetEntity } from "../../Common/Utils";
|
||||
import { ObjectId } from "../../DatabaseServices/ObjectId";
|
||||
import { Polyline } from "../../DatabaseServices/Entity/Polyline";
|
||||
import { Shape } from "../../DatabaseServices/Shape";
|
||||
import { Contour } from "../../DatabaseServices/Contour";
|
||||
|
||||
class ActivityLayerBoardTool
|
||||
{
|
||||
NailRules: INailRule[];
|
||||
private GetBoardIntersection(face: Face, objects: Object3D[], br: Board)
|
||||
{
|
||||
for (let s of [0.5, 0.1, 0.9])
|
||||
{
|
||||
let center = new Vector3(face.Length * s, face.Width * s).applyMatrix4(face.OCS).add(face.Normal.negate());
|
||||
|
||||
let intersection = this.RayPoint(center, face.Normal, objects);
|
||||
if (intersection && intersection.object)
|
||||
{
|
||||
let en = GetEntity(intersection.object) as Board;
|
||||
if (en.BoardProcessOption.roomName === br.BoardProcessOption.roomName && en.BoardProcessOption.cabinetName === br.BoardProcessOption.cabinetName)
|
||||
return intersection;
|
||||
}
|
||||
}
|
||||
}
|
||||
private IntersectFace(otherBoard: Board, face: Face)
|
||||
{
|
||||
let size: Vector3 | Vector2 = new Vector3();
|
||||
let min = new Vector3();
|
||||
if (otherBoard.IsSpecialShape)
|
||||
{
|
||||
let rect = new Polyline().RectangleFrom2Pt(new Vector3(), new Vector3(face.Length, face.Width));
|
||||
let con = otherBoard.ContourCurve.Clone().ApplyMatrix(otherBoard.OCS).ApplyMatrix(face.OCSInv);
|
||||
con.Z0();
|
||||
let shape1 = new Shape(Contour.CreateContour([rect]));
|
||||
let shape2 = new Shape(Contour.CreateContour([con]));
|
||||
|
||||
let shapes = shape1.IntersectionBoolOperation(shape2);
|
||||
if (shapes.length > 0)
|
||||
{
|
||||
let box = shapes[0].BoundingBox;
|
||||
min.copy(box.min);
|
||||
size = box.getSize(new Vector3);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
let pts = [new Vector3(), new Vector3(otherBoard.Width, otherBoard.Height)];
|
||||
pts.forEach(p => p.applyMatrix4(otherBoard.OCS).applyMatrix4(face.OCSInv));
|
||||
let box = new Box2().setFromPoints(pts.map(p => AsVector2(p)));
|
||||
let box2 = new Box2(new Vector2(), new Vector2(face.Length, face.Width));
|
||||
|
||||
box2.intersect(box);
|
||||
|
||||
size = box2.getSize(new Vector2);
|
||||
min.set(box2.min.x, box2.min.y, 0);
|
||||
}
|
||||
|
||||
face.Length = size.x;
|
||||
face.Width = size.y;
|
||||
face.OCS.multiply(MoveMatrix(min));
|
||||
}
|
||||
private GetShrinkDist(face: Face, br: Board, option: IShinkOption)
|
||||
{
|
||||
let fNoarmal = face.Normal;
|
||||
let xVec = new Vector3().setFromMatrixColumn(br.OCS, 0);
|
||||
let yVec = new Vector3().setFromMatrixColumn(br.OCS, 1);
|
||||
|
||||
let shrink = 0;
|
||||
if (isParallelTo(fNoarmal, xVec))
|
||||
{
|
||||
if (equalv3(fNoarmal, xVec, 1e-5))
|
||||
shrink = option.back;
|
||||
else
|
||||
shrink = option.front;
|
||||
}
|
||||
else if (isParallelTo(fNoarmal, yVec))
|
||||
{
|
||||
if (equalv3(fNoarmal, yVec, 1e-5))
|
||||
shrink = option.left;
|
||||
else
|
||||
shrink = option.right;
|
||||
}
|
||||
return shrink;
|
||||
}
|
||||
private GetShrinkBoardIndexesMap(face: Face, br: Board, shrink: number, indexMap: Map<Vector3, number[]>)
|
||||
{
|
||||
if (shrink)
|
||||
{
|
||||
const FUZZ = 0.1;
|
||||
let scaleBox = new Box3().setFromPoints([new Vector3(-FUZZ, -FUZZ, -FUZZ).applyMatrix4(face.OCS), new Vector3(face.Length + FUZZ, face.Width + FUZZ, FUZZ).applyMatrix4(face.OCS)]);
|
||||
let pts = br.GetStretchPoints();
|
||||
let stretchIndexs: number[] = [];
|
||||
for (let i = 0, length = pts.length; i < length; i++)
|
||||
{
|
||||
let p = pts[i];
|
||||
if (scaleBox.containsPoint(p))
|
||||
stretchIndexs.push(i);
|
||||
}
|
||||
indexMap.set(face.Normal.negate().multiplyScalar(shrink), stretchIndexs);
|
||||
}
|
||||
}
|
||||
private GetRuleCount(width: number, rules: INailRule[])
|
||||
{
|
||||
if (this.NailRules)
|
||||
rules = this.NailRules;
|
||||
for (let rule of rules)
|
||||
{
|
||||
if (width > rule.startDist && width <= rule.endDist + 1e-6)
|
||||
{
|
||||
return rule.count;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
private BuildNails(initNail: CylinderHole, nailOpt: LayerNailOption, face: Face)
|
||||
{
|
||||
let fXVec = new Vector3().setFromMatrixColumn(face.OCS, 0);
|
||||
let fYVec = new Vector3().setFromMatrixColumn(face.OCS, 1);
|
||||
let addCount = nailOpt.addCount;
|
||||
let count = nailOpt.count;
|
||||
let dist = nailOpt.dist;
|
||||
let frontDist = nailOpt.front;
|
||||
let backDist = nailOpt.behind;
|
||||
let singleDist: number;
|
||||
//绘制数量为1时,层板钉在中间位置
|
||||
if (count === 1)
|
||||
singleDist = face.Length / 2 - frontDist;
|
||||
else
|
||||
singleDist = (face.Length - frontDist - backDist) / (count - 1);
|
||||
|
||||
let buildNails: CylinderHole[] = [];
|
||||
|
||||
//构建层板钉
|
||||
for (let i = 0; i < count; i++)
|
||||
{
|
||||
if (count === 1)
|
||||
{
|
||||
initNail.ApplyMatrix(MoveMatrix(fXVec.multiplyScalar(singleDist)));
|
||||
buildNails.push(initNail);
|
||||
}
|
||||
else
|
||||
{
|
||||
let nail = initNail.Clone();
|
||||
nail.ApplyMatrix(MoveMatrix(fXVec.clone().multiplyScalar(i * singleDist)));
|
||||
buildNails.push(nail);
|
||||
}
|
||||
}
|
||||
|
||||
//增加的层板钉
|
||||
let addNails: CylinderHole[] = [];
|
||||
for (let i = 1; i <= addCount; i++)
|
||||
{
|
||||
for (let nail of buildNails)
|
||||
{
|
||||
addNails.push(nail.Clone().ApplyMatrix(MoveMatrix(fYVec.clone().multiplyScalar(dist * i))));
|
||||
addNails.push(nail.Clone().ApplyMatrix(MoveMatrix(fYVec.clone().negate().multiplyScalar(dist * i))));
|
||||
}
|
||||
}
|
||||
buildNails.push(...addNails);
|
||||
return buildNails;
|
||||
}
|
||||
private RayPoint(p: Vector3, n: Vector3, brs: Object3D[]): Intersection
|
||||
{
|
||||
let ray = new Raycaster(p, n);
|
||||
let intersection = Raycast(ray, brs);
|
||||
return intersection;
|
||||
}
|
||||
Start(brs: Board[], nailOption: LayerNailOption, rules: INailRule[] = [], option?: IShinkOption)
|
||||
{
|
||||
let brMap: Map<BoardType, Board[]> = new Map();
|
||||
let objects: Object3D[] = [];
|
||||
//如果层板和左右板得距离大于这个值,则这边不绘制层板钉
|
||||
let refDist = nailOption.length - nailOption.depth;
|
||||
|
||||
for (let br of app.Viewer.VisibleEntitys)
|
||||
{
|
||||
if (br instanceof Board)
|
||||
{
|
||||
objects.push(br.GetDrawObjectFromRenderType(RenderType.Physical));
|
||||
let bs = brMap.get(br.BoardType);
|
||||
if (!bs)
|
||||
{
|
||||
bs = [];
|
||||
brMap.set(br.BoardType, bs);
|
||||
}
|
||||
bs.push(br);
|
||||
}
|
||||
}
|
||||
for (let br of brs)
|
||||
{
|
||||
let faces = BoardGetFace.GetAllSidesFaces(br, true);
|
||||
let vecIndexMap: Map<Vector3, number[]> = new Map();
|
||||
let xVec = new Vector3().setFromMatrixColumn(br.OCS, 0);
|
||||
|
||||
let nailBoardMap = new WeakMap();
|
||||
let allNails: CylinderHole[] = [];
|
||||
for (let face of faces)
|
||||
{
|
||||
if (face.type === BoardFaceType.Side)
|
||||
{
|
||||
if (option)
|
||||
{
|
||||
let shrink = this.GetShrinkDist(face, br, option);
|
||||
this.GetShrinkBoardIndexesMap(face, br, shrink, vecIndexMap);
|
||||
}
|
||||
if (!nailOption.isDraw) continue;
|
||||
if (!nailOption.isInBack && isParallelTo(face.Normal, xVec)) continue;
|
||||
|
||||
let intersection = this.GetBoardIntersection(face, objects, br);
|
||||
if (intersection)
|
||||
{
|
||||
//防止板件悬空
|
||||
// if (intersection.distance - 1 + shrink >= refDist)
|
||||
// continue;
|
||||
|
||||
let otherBoard = GetEntity(intersection.object) as Board;
|
||||
|
||||
this.IntersectFace(otherBoard, face);
|
||||
|
||||
let nail = CylinderHole.CreateCylHole(nailOption.rad, nailOption.length, GangDrillType.Nail);
|
||||
nail.ApplyMatrix(face.OCS);
|
||||
let roMat = new Matrix4().extractRotation(face.OCS);
|
||||
nail.Position = nail.Position.add(new Vector3(nailOption.front, -nailOption.rad, intersection.distance - 1 - nail.Height + nailOption.depth).applyMatrix4(roMat));
|
||||
if (option || this.NailRules)
|
||||
nailOption.count = this.GetRuleCount(face.Length, rules);
|
||||
let nails = this.BuildNails(nail, nailOption, face);
|
||||
for (let nail of nails)
|
||||
nailBoardMap.set(nail, otherBoard);
|
||||
allNails.push(...nails);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.AppendBoard(br, nailBoardMap, allNails);
|
||||
for (let [vec, indexes] of vecIndexMap)
|
||||
{
|
||||
br.MoveStretchPoints(indexes, vec);
|
||||
vec = null;
|
||||
}
|
||||
}
|
||||
this.NailRules = null;
|
||||
}
|
||||
private AppendBoard(br: Board, brNailMap: WeakMap<CylinderHole, Board>, nails: CylinderHole[])
|
||||
{
|
||||
let oldNailIds = br.LayerNails;
|
||||
for (let i = nails.length; i < oldNailIds.length; i++)
|
||||
oldNailIds[i].Object.Erase();
|
||||
|
||||
for (let i = 0; i < nails.length; i++)
|
||||
{
|
||||
let nId: ObjectId;
|
||||
if (i < oldNailIds.length)
|
||||
{
|
||||
let nail = oldNailIds[i].Object as CylinderHole;
|
||||
if (nail.IsErase)
|
||||
nail.Erase(false);
|
||||
if (!equalv3(nail.Normal, nails[i].Normal))
|
||||
nail.OCS = nails[i].OCS;
|
||||
nail.Radius = nails[i].Radius;
|
||||
nail.Height = nails[i].Height;
|
||||
nail.Position = nails[i].Position;
|
||||
nId = nail.Id;
|
||||
}
|
||||
else
|
||||
{
|
||||
app.Database.ModelSpace.Append(nails[i]);
|
||||
nId = nails[i].Id;
|
||||
br.AppendNails([nId]);
|
||||
let otherBoard = brNailMap.get(nails[i]);
|
||||
nails[i].MId = br.Id;
|
||||
nails[i].FId = otherBoard.Id;
|
||||
otherBoard.AppendNails([nId]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const activityLayerBoardTool = new ActivityLayerBoardTool();
|
@ -0,0 +1,282 @@
|
||||
import * as React from 'react';
|
||||
import { Button, Classes, Icon, H5, Checkbox, RadioGroup, Radio, Intent, UL, Colors } from '@blueprintjs/core';
|
||||
import { IconNames } from '@blueprintjs/icons';
|
||||
import { UserConfig } from '../Board/UserConfig';
|
||||
import { BoardModalType } from '../Board/BoardModal';
|
||||
import { app } from '../../../ApplicationServices/Application';
|
||||
import { observer } from 'mobx-react';
|
||||
import { hot } from 'react-hot-loader/root';
|
||||
import { ActivityLayerBoardStore } from '../../Store/ActivityLayerBoardStore';
|
||||
import { SetBoardDataItem, SetBoardDataBlock } from '../Board/BoardCommon';
|
||||
import { CheckObjectType } from '../../../Common/CheckoutVaildValue';
|
||||
import { ToasterInput, AppToaster } from '../Toaster';
|
||||
import { ModalState } from './ModalsManage';
|
||||
interface IActivityLayerBoardProps
|
||||
{
|
||||
store: ActivityLayerBoardStore;
|
||||
}
|
||||
|
||||
const SelectStyle: React.CSSProperties = {
|
||||
background: Colors.BLUE1,
|
||||
color: "#fff"
|
||||
};
|
||||
|
||||
@hot
|
||||
@observer
|
||||
export class ActivityLayerBoard extends React.Component<IActivityLayerBoardProps> {
|
||||
public render()
|
||||
{
|
||||
const { store } = this.props;
|
||||
const scalePars = [["front", "前缩"], ["back", "后缩"], ["left", "左缩"], ["right", "右缩"]];
|
||||
const nailPars1 = [["addCount", "增"], ["dist", "距离"]];
|
||||
const nailPars2 = [["front", "前边"], ["behind", "后边"], ["rad", "半径"], ["length", "长度"], ["depth", "深度"]];
|
||||
|
||||
const shrinkOption = store.m_Option;
|
||||
const uiShrinkOption = store.UIOption;
|
||||
|
||||
let nailOpt = this.props.store.nailOption;
|
||||
let uiNailOption = this.props.store.UINailOption;
|
||||
|
||||
let rule = store.currentRule;
|
||||
let uiRule = store.UIRule;
|
||||
|
||||
return (
|
||||
<div
|
||||
className={Classes.DIALOG_CONTAINER}
|
||||
id="commonModal"
|
||||
>
|
||||
<div className={Classes.DIALOG}>
|
||||
<div
|
||||
className={Classes.DIALOG_HEADER}
|
||||
data-id="dragArea"
|
||||
>
|
||||
<Icon icon={IconNames.COMPARISON} iconSize={18} />
|
||||
<h4 className="bp3-heading">修改活动层板</h4>
|
||||
<Button
|
||||
aria-label="Close"
|
||||
minimal
|
||||
icon="cross"
|
||||
className={Classes.DIALOG_CLOSE_BUTTON}
|
||||
onClick={this.cancel}
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
className={Classes.DIALOG_BODY + " activity-board " + Classes.CARD}
|
||||
onClick={() => store.currentIndex = -1}
|
||||
>
|
||||
<div className="flex">
|
||||
<SetBoardDataBlock
|
||||
type={CheckObjectType.BR}
|
||||
pars={scalePars}
|
||||
option={shrinkOption}
|
||||
uiOption={uiShrinkOption}
|
||||
className="flexWrap"
|
||||
onChange={this.changeShrink}
|
||||
/>
|
||||
<div>
|
||||
<Checkbox
|
||||
checked={shrinkOption.isFBEqual}
|
||||
label="等比例"
|
||||
onChange={() =>
|
||||
{
|
||||
shrinkOption.isFBEqual = !shrinkOption.isFBEqual;
|
||||
}} />
|
||||
<Checkbox
|
||||
checked={shrinkOption.isLREqual}
|
||||
label="等比例"
|
||||
onChange={() =>
|
||||
{
|
||||
shrinkOption.isLREqual = !shrinkOption.isLREqual;
|
||||
}} />
|
||||
</div>
|
||||
</div>
|
||||
<h6 className={Classes.HEADING}>层板钉</h6>
|
||||
<div>
|
||||
<Checkbox
|
||||
checked={nailOpt.isDraw}
|
||||
label="是否绘制层板钉"
|
||||
onChange={() =>
|
||||
{
|
||||
nailOpt.isDraw = !nailOpt.isDraw;
|
||||
}} />
|
||||
<div className="flexWrap">
|
||||
{
|
||||
nailPars1.map(([k, v]) =>
|
||||
<SetBoardDataItem
|
||||
type={CheckObjectType.BR}
|
||||
key={k}
|
||||
optKey={k}
|
||||
option={nailOpt}
|
||||
uiOption={uiNailOption}
|
||||
title={v}
|
||||
isDisabled={(k === "addCount" || k === "dist") && (!nailOpt.isDraw)}
|
||||
/>
|
||||
)
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex">
|
||||
<Checkbox
|
||||
checked={nailOpt.isGroup}
|
||||
label="层板钉和层板编组"
|
||||
disabled={!nailOpt.isDraw}
|
||||
onChange={() =>
|
||||
{
|
||||
nailOpt.isGroup = !nailOpt.isGroup;
|
||||
}} />
|
||||
<Checkbox
|
||||
style={{ marginLeft: 30 }}
|
||||
checked={nailOpt.isInBack}
|
||||
label="背板绘制层板钉"
|
||||
disabled={!nailOpt.isDraw}
|
||||
onChange={() =>
|
||||
{
|
||||
nailOpt.isInBack = !nailOpt.isInBack;
|
||||
}} />
|
||||
</div>
|
||||
<SetBoardDataBlock
|
||||
type={CheckObjectType.BR}
|
||||
pars={nailPars2}
|
||||
option={nailOpt}
|
||||
uiOption={uiNailOption}
|
||||
className="flexWrap"
|
||||
disabled={!nailOpt.isDraw}
|
||||
/>
|
||||
<H5>层板钉计算规则</H5>
|
||||
<div className="flex" style={{ alignItems: "center" }}>
|
||||
<div>
|
||||
<ToasterInput
|
||||
type={CheckObjectType.DR}
|
||||
optKey="startDist"
|
||||
option={rule}
|
||||
uiOption={uiRule}
|
||||
/>
|
||||
{"<距离<"}
|
||||
<ToasterInput
|
||||
type={CheckObjectType.DR}
|
||||
optKey="endDist"
|
||||
option={rule}
|
||||
uiOption={uiRule}
|
||||
/>
|
||||
个数
|
||||
<ToasterInput
|
||||
type={CheckObjectType.DR}
|
||||
optKey="count"
|
||||
option={rule}
|
||||
uiOption={uiRule}
|
||||
/>
|
||||
</div>
|
||||
<div style={{ textAlign: "right" }}>
|
||||
<Button
|
||||
style={{ marginLeft: 30 }}
|
||||
text="写入"
|
||||
intent={Intent.SUCCESS}
|
||||
onClick={() =>
|
||||
{
|
||||
store.AppendRule();
|
||||
}}
|
||||
/>
|
||||
<Button
|
||||
text="删除"
|
||||
intent={Intent.DANGER}
|
||||
onClick={(e) =>
|
||||
{
|
||||
store.RemoveRule();
|
||||
e.stopPropagation();
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<UL className={Classes.LIST_UNSTYLED} style={{ height: 150, background: Colors.GRAY5, overflow: "auto" }}>
|
||||
{
|
||||
store.rules.map((rule, index) =>
|
||||
<li
|
||||
style={store.currentIndex === index
|
||||
? SelectStyle : {}}
|
||||
onClick={(e) =>
|
||||
{
|
||||
store.currentIndex = index;
|
||||
e.stopPropagation();
|
||||
}}
|
||||
>{rule.startDist}{" < 距离 <= "}{rule.endDist} 层板钉个数:{rule.count}</li>
|
||||
)
|
||||
}
|
||||
</UL>
|
||||
</div>
|
||||
<div className={Classes.DIALOG_FOOTER} >
|
||||
<UserConfig store={store} type={BoardModalType.ActLr} />
|
||||
<div className={Classes.DIALOG_FOOTER_ACTIONS}>
|
||||
<Button
|
||||
text="确定"
|
||||
intent={Intent.SUCCESS}
|
||||
onClick={this.ok}
|
||||
/>
|
||||
<Button
|
||||
text="取消"
|
||||
intent={Intent.DANGER}
|
||||
onClick={this.cancel}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
private changeShrink = (k: string) =>
|
||||
{
|
||||
const shrinkOption = this.props.store.m_Option;
|
||||
const uiShrinkOption = this.props.store.UIOption;
|
||||
|
||||
if (shrinkOption.isFBEqual)
|
||||
{
|
||||
if (k === "front")
|
||||
{
|
||||
shrinkOption.back = shrinkOption.front;
|
||||
uiShrinkOption.back = uiShrinkOption.front;
|
||||
}
|
||||
else if (k === "back")
|
||||
{
|
||||
shrinkOption.front = shrinkOption.back;
|
||||
uiShrinkOption.front = uiShrinkOption.back;
|
||||
}
|
||||
}
|
||||
|
||||
if (shrinkOption.isLREqual)
|
||||
{
|
||||
if (k === "left")
|
||||
{
|
||||
shrinkOption.right = shrinkOption.left;
|
||||
uiShrinkOption.right = uiShrinkOption.left;
|
||||
}
|
||||
else if (k === "right")
|
||||
{
|
||||
shrinkOption.left = shrinkOption.right;
|
||||
uiShrinkOption.left = uiShrinkOption.right;
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
private ok = () =>
|
||||
{
|
||||
const nailOption = this.props.store.nailOption;
|
||||
if (nailOption.depth >= nailOption.length)
|
||||
{
|
||||
AppToaster.show({
|
||||
message: "层板钉深度不能大于长度",
|
||||
timeout: 3000,
|
||||
intent: Intent.DANGER
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
app.Editor.ModalManage.Clear();
|
||||
app.Editor.ModalManage.m_PromisRes({ Status: ModalState.Ok });
|
||||
app.Editor.ModalManage.EndCmd();
|
||||
};
|
||||
private cancel = () =>
|
||||
{
|
||||
app.Editor.ModalManage.Clear();
|
||||
app.Editor.ModalManage.m_PromisRes({ Status: ModalState.Cancel });
|
||||
app.Editor.ModalManage.EndCmd();
|
||||
};
|
||||
}
|
@ -0,0 +1,110 @@
|
||||
import { BoardStore } from "./BoardStore";
|
||||
import { LayerNailOption, IShinkOption, IUiOption, INailRule } from "./BoardInterface";
|
||||
import { DefaultNailOption } from "../../Editor/DefaultConfig";
|
||||
import { DataAdapter } from "../../Common/DataAdapter";
|
||||
import { observable, toJS } from "mobx";
|
||||
import { IConfigOption } from "../Components/Board/UserConfig";
|
||||
|
||||
export class ActivityLayerBoardStore extends BoardStore
|
||||
{
|
||||
@observable m_Option: IShinkOption = {
|
||||
front: 1,
|
||||
back: 1,
|
||||
left: 1,
|
||||
right: 1,
|
||||
isLREqual: true,
|
||||
isFBEqual: true,
|
||||
};
|
||||
@observable nailOption: LayerNailOption = { ...DefaultNailOption, count: 0 };
|
||||
@observable private uiNailOption: IUiOption<LayerNailOption>;
|
||||
@observable currentRule: INailRule = {
|
||||
startDist: 0,
|
||||
endDist: 0,
|
||||
count: 0,
|
||||
};
|
||||
@observable currentIndex = -1;
|
||||
@observable rules: INailRule[] = [];
|
||||
@observable uiRule: IUiOption<INailRule>;
|
||||
get UINailOption()
|
||||
{
|
||||
if (!this.uiNailOption)
|
||||
this.uiNailOption = DataAdapter.ConvertUIData(this.nailOption);
|
||||
return this.uiNailOption;
|
||||
}
|
||||
get UIRule()
|
||||
{
|
||||
if (!this.uiRule)
|
||||
this.uiRule = DataAdapter.ConvertUIData(this.currentRule);
|
||||
return this.uiRule;
|
||||
}
|
||||
AppendRule()
|
||||
{
|
||||
if (this.rules.some(rule =>
|
||||
{
|
||||
return rule.startDist === this.currentRule.startDist
|
||||
&& rule.endDist === this.currentRule.endDist
|
||||
&& rule.count === this.currentRule.count;
|
||||
}))
|
||||
return;
|
||||
this.rules.push(toJS(this.currentRule));
|
||||
}
|
||||
RemoveRule()
|
||||
{
|
||||
if (this.rules[this.currentIndex])
|
||||
{
|
||||
this.rules.splice(this.currentIndex, 1);
|
||||
this.currentIndex = 0;
|
||||
}
|
||||
}
|
||||
InitOption()
|
||||
{
|
||||
Object.assign(this.m_Option, {
|
||||
front: 1,
|
||||
back: 1,
|
||||
left: 1,
|
||||
right: 1,
|
||||
isLREqual: true,
|
||||
isFBEqual: true,
|
||||
});
|
||||
this.rules.length = 0;
|
||||
this.rules.push({
|
||||
startDist: 0,
|
||||
endDist: 180,
|
||||
count: 1,
|
||||
}, {
|
||||
startDist: 180,
|
||||
endDist: 2500,
|
||||
count: 2,
|
||||
});
|
||||
|
||||
this.currentIndex = -1;
|
||||
|
||||
Object.assign(this.nailOption, DefaultNailOption);
|
||||
if (this.uiNailOption)
|
||||
Object.assign(this.uiNailOption, DataAdapter.ConvertUIData(this.nailOption));
|
||||
|
||||
super.InitOption();
|
||||
}
|
||||
SaveConfig()
|
||||
{
|
||||
let newConfig: IConfigOption = {};
|
||||
newConfig.option = {
|
||||
option: toJS(this.m_Option),
|
||||
rules: toJS(this.rules)
|
||||
};
|
||||
newConfig.nailData = toJS(this.nailOption);
|
||||
return newConfig;
|
||||
}
|
||||
UpdateOption(cof: IConfigOption)
|
||||
{
|
||||
let { option, rules } = cof.option as { option: IShinkOption, rules: INailRule[]; };
|
||||
Object.assign(this.m_Option, option);
|
||||
observable(this.rules).replace(rules);
|
||||
Object.assign(this.nailOption, cof.nailData);
|
||||
|
||||
if (this.uiNailOption)
|
||||
Object.assign(this.uiNailOption, DataAdapter.ConvertUIData(this.nailOption));
|
||||
if (this.m_UiOption)
|
||||
Object.assign(this.m_UiOption, DataAdapter.ConvertUIData(option));
|
||||
}
|
||||
}
|
Loading…
Reference in new issue