!647 批量固定层板转活动层板

pull/647/MERGE
ZoeLeeFZ 5 years ago committed by ChenX
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();

@ -135,11 +135,11 @@ class BuildLayerNailsTool
let pos1 = lBr.Position.applyMatrix4(this.space.SpaceOCSInv);
let pos2 = rBr.Position.applyMatrix4(this.space.SpaceOCSInv);
if (Math.abs(pos1.x - minX + lBr.Thickness) < refDist)
this.leftBoard = lBr;
// if (Math.abs(pos1.x - minX + lBr.Thickness) < refDist)
this.leftBoard = lBr;
if (Math.abs(pos2.x - maxX) < refDist)
this.rightBoard = rBr;
// if (Math.abs(pos2.x - maxX) < refDist)
this.rightBoard = rBr;
}
}
}
@ -173,13 +173,13 @@ class BuildLayerNailsTool
let pos = br.Position.applyMatrix4(this.space.SpaceOCSInv);
if (dir === xVec)
{
if (Math.abs(pos.y - maxY - br.Thickness) < refDist)
this.backBoard = br;
// if (Math.abs(pos.y - maxY - br.Thickness) < refDist)
this.backBoard = br;
}
else
{
if (Math.abs(pos.y - minY) < refDist)
this.frontBoard = br;
// if (Math.abs(pos.y - minY) < refDist)
this.frontBoard = br;
}
}
}

@ -3,9 +3,8 @@ import { TemplateLayerBoard } from '../../DatabaseServices/Template/ProgramTempa
import { JigUtils } from '../../Editor/JigUtils';
import { LayerBoardOption } from '../../UI/Store/BoardInterface';
import { LayerBoardStore } from '../../UI/Store/BoardStore';
import { BuildLayerBoards, SetTemplatePositioning, FindLeftRightBoard } from './BuildBoardTool';
import { BuildLayerBoards, SetTemplatePositioning } from './BuildBoardTool';
import { DrawBoardTool } from './DrawBoardTool';
import { Board } from '../../DatabaseServices/Entity/Board';
export class DrawLayerBoard extends DrawBoardTool
{
@ -20,7 +19,6 @@ export class DrawLayerBoard extends DrawBoardTool
temp.UseBoardProcessOption = this.store.UseBoardProcessOption;
temp.BoardProcessOption = this.store.BoardProcessOption;
app.Database.TemplateTable.Append(temp);
FindLeftRightBoard(this.space, app.Viewer.VisibleEntitys.filter(b => b instanceof Board) as Board[]);
await SetTemplatePositioning(this.space, temp);
}
else

@ -162,6 +162,8 @@ export namespace CheckoutValid
return "";
case "count":
case "pxlRad":
case "startDist":
case "endDist":
case "wbHoleRad":
case "startDist":
case "endDist":

@ -569,7 +569,7 @@ export function MergeCurvelist(cus: Curve[])
let nextI = FixIndex(i + 1, cus);
let c2 = cus[nextI];
let status = c1.Join(c2);
let status = c1.Join(c2, false, 1e-4);
if (status === Status.True)
{
cus.splice(nextI, 1);

@ -1,10 +1,11 @@
import { observable } from "mobx";
import { IUiOption } from "../UI/Store/BoardInterface";
export class DataAdapter
{
static ConvertUIData(obj: Object, isobser: boolean = true): Object
static ConvertUIData<T extends Object>(obj: T, isobser: boolean = true): IUiOption<T>
{
let uiObj = {};
let uiObj: any = {};
for (let i in obj)
{
if (typeof obj[i] === "number")

@ -56,14 +56,10 @@ export class TemplateBoardRecord extends TemplateRecord
protected async Update()
{
await super.Update();
let space = new ISpaceParse();
space.SpaceOCS = this._CacheSpaceCS;
space.ParseOK = true;
space.SpaceBox = new Box3Ext(new Vector3(), this._CacheSpaceSize);
let thickness = this.GetParam("BH")?.value as number;
if (thickness)
this._option.thickness = thickness;
let nbrs = this.GeneralBoardList(space);
let nbrs = this.GeneralBoardList(this.SpaceParse);
let sbrs = this.PositioningSupportBoards;

@ -6,10 +6,7 @@ import { TemplateBoardRecord } from "./TemplateBoard";
import { DefaultLayerBoardConfig, DefaultNailOption } from "../../../Editor/DefaultConfig";
import { CADFiler } from "../../CADFiler";
import { Board } from "../../Entity/Board";
import { buildLayerNailTool } from "../../../Add-on/DrawBoard/BuildLayerNailTool";
import { Box3Ext } from "../../../Geometry/Box";
import { Vector3 } from "three";
import { ObjectId } from "../../ObjectId";
import { activityLayerBoardTool } from "../../../Add-on/DrawBoard/ActivityLayerBoardTool";
/**
*
@ -41,9 +38,6 @@ export class TemplateLayerBoard extends TemplateBoardRecord
protected async Update()
{
await super.Update();
let space = new ISpaceParse(this.PositioningSupportBoards, this._CacheSpaceCS);
space.ParseOK = true;
space.SpaceBox = new Box3Ext(new Vector3(), this._CacheSpaceSize);
let brs: Board[] = [];
@ -55,7 +49,8 @@ export class TemplateLayerBoard extends TemplateBoardRecord
brs.push(b);
}
}
buildLayerNailTool.Start(brs, this._option, this._nailOption, space);
if (this._option.isActive)
activityLayerBoardTool.Start(brs, this._nailOption);
}
ReadFile(file: CADFiler)
{

@ -1039,3 +1039,21 @@ export async function EditorOnlineTemplate(template: TemplateRecord, module_id:
app.Editor.ModalManage.RenderModeless(TemplateEditor, ModalPosition.Center, { store, tid: module_id, isCheck });
}, "编辑模板");
}
/**仅移除模块节点 */
export function RemoveTemplate(temp: TemplateRecord)
{
if (temp.Parent)
{
let parTemp = temp.Parent.Object as TemplateRecord;
arrayRemoveOnce(parTemp.Children, temp.Id);
temp.Parent = null;
}
for (let id of temp.Children)
{
(id.Object as TemplateRecord).Parent = null;
}
for (let id of temp.Objects)
(id.Object as Entity).Template = null;
temp.Children.length = 0;
}

@ -148,6 +148,7 @@ import { commandMachine } from './CommandMachine';
import { Command_ExportData } from "../Add-on/ExportData";
import { Command_TestYHWorker } from "../Nest/Test/TestYH3";
import { Command_ExportView } from "../Add-on/Export2View";
import { ActicityLayerBoard } from "../Add-on/ActivityLayerBoard";
export function registerCommand()
{
@ -315,6 +316,8 @@ export function registerCommand()
commandMachine.RegisterCommand("reversedrillface", new ReverseDrillFace());
commandMachine.RegisterCommand("editorboardTemplate", new EditorBoardTemplate());
commandMachine.RegisterCommand("acticitylayerboard", new ActicityLayerBoard());
//修改颜色命令
for (let i = 0; i < 24; i++) commandMachine.RegisterCommand((i + 1).toString(), new ChangeColor(i + 1));

@ -405,7 +405,7 @@ export const DefaultNailOption: LayerNailOption = {
front: 50,
behind: 50,
count: 2,
rad: 5,
rad: 2.5,
length: 34,
depth: 13.5
};

@ -7,6 +7,7 @@ import { Region } from "../../DatabaseServices/Entity/Region";
import { DrillType } from "../../UI/Store/BoardInterface";
import { equaln, equalv3, ZAxis } from "../GeUtils";
import { Face } from "./Face";
import { MergeCurvelist } from "../../Common/CurveUtils";
export enum BoardFaceType
{
@ -120,6 +121,31 @@ export class BoardGetFace
}
return collisionFaces;
}
static GetAllSidesFaces(br: Board, isMergeFace = false)
{
let faces: Face[] = [];
let con = br.ContourCurve;
let inverseZ = con.Area2 < 0;
let cus = con.Explode() as Curve[];
if (isMergeFace)
MergeCurvelist(cus);
for (let i = 0; i < cus.length; i++)
{
let cu = cus[i];
let length = cu.Length;
let mtx = GetSideFaceMtx(cu, inverseZ);
faces.push(new Face({
type: BoardFaceType.Side,
localBoard: br,
isPositiveFace: true,
matrix4: new Matrix4().multiplyMatrices(br.OCS.clone(), mtx),
length,
width: br.Thickness,
}));
}
return faces;
}
}
//坐标系共面且法线相反

@ -62,6 +62,10 @@ export class Face
{
return new Matrix4().getInverse(this.OCS);
}
get Normal()
{
return new Vector3().setFromMatrixColumn(this.OCS, 2);
}
Intersect(f: Face): Face[]
{
//获得侧面和非侧面

@ -35,6 +35,7 @@ export enum BoardModalType
Lat = "lattice", // 格子抽
TempDes = "templatedesign",
Ct = "drawer", //抽屉
ActLr = "activelr", //活动层板
}
export interface BoardModalProps
{

@ -39,8 +39,8 @@ export const LayerBoardModal =
brOpt.isActive = !brOpt.isActive;
if (brOpt.isActive)
{
uiOption['leftShrink'] = "1";
uiOption['rightShrink'] = "1";
uiOption.leftShrink = "1";
uiOption.rightShrink = "1";
brOpt.leftShrink = 1;
brOpt.rightShrink = 1;
brOpt.isTotalLength = false;

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

@ -226,3 +226,9 @@
#commonModal .tb-check-input input {
width: 45px;
}
#commonModal .activity-board {
.flexWrap {
width: 300px;
}
}

@ -19,13 +19,13 @@ export class DrawConfigPanel extends React.Component<IConfigProps, {}> {
userConfig.openDrillingReactor = !userConfig.openDrillingReactor;
app._drillingReactor.Enable = userConfig.openDrillingReactor;
localStorage.setItem(StoreageKeys.DrillReactor, userConfig.openDrillingReactor ? "1" : "");
}
};
private toggleAutoCuttingReactor = () =>
{
const userConfig = this.props.store;
userConfig.openAutoCuttingReactor = !userConfig.openAutoCuttingReactor;
app._autoCuttingReactor.Enable = userConfig.openAutoCuttingReactor;
}
};
public render()
{
const userConfig = this.props.store;

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

@ -252,3 +252,24 @@ export interface IGrooveOption extends IBaseOption
grooveAddDepth: string;
knifeRadius: string;
}
export interface IShinkOption extends IBaseOption
{
left: number;
right: number;
front: number;
back: number;
isLREqual: boolean;
isFBEqual: boolean;
}
export type IUiOption<T> = {
[P in (keyof T)]: T[P] extends number ? string : T[P]
};
export interface INailRule extends IBaseOption
{
startDist: number;
endDist: number;
count: number;
}

@ -12,7 +12,7 @@ import { DefaultBehindBoardConfig, DefaultLayerBoardConfig, DefaultVerticalBoard
import { userConfig } from '../../Editor/UserConfig';
import { IConfigOption } from '../Components/Board/UserConfig';
import { ModalState } from '../Components/Modal/ModalsManage';
import { BehindBoardOption, BoardConfigOption, IBaseOption, BoardProcessOption, BrRelativePos, ClosingStripOption, ComposingType, DrillType, FaceDirection, IGrooveOption, LayerBoardOption, LayerNailOption, LinesType, SideBoardOption, SingleBoardOption, StripType, TBBoardOption, VerticalBoardOption } from './BoardInterface';
import { BehindBoardOption, BoardConfigOption, IBaseOption, BoardProcessOption, BrRelativePos, ClosingStripOption, ComposingType, DrillType, FaceDirection, IGrooveOption, LayerBoardOption, LayerNailOption, LinesType, SideBoardOption, SingleBoardOption, StripType, TBBoardOption, VerticalBoardOption, IUiOption } from './BoardInterface';
import { begin } from 'xaop';
@ -262,7 +262,7 @@ export class LayerBoardStore extends BoardStore
title = "层板";
@observable m_Option: LayerBoardOption = Object.assign({}, DefaultLayerBoardConfig);
@observable layerNailOption: LayerNailOption = Object.assign({}, DefaultNailOption);
uiLayerNailOption: any;
uiLayerNailOption: IUiOption<LayerNailOption>;
constructor()
{
super();

Loading…
Cancel
Save