|
|
@ -1,4 +1,4 @@
|
|
|
|
import { Button, Classes, ContextMenu, H5, Intent, ITreeNode, Menu, MenuItem, Tree, NumericInput } from "@blueprintjs/core";
|
|
|
|
import { Button, Classes, ContextMenu, H5, Intent, ITreeNode, Menu, MenuItem, NumericInput, Tree } from "@blueprintjs/core";
|
|
|
|
import { observable } from "mobx";
|
|
|
|
import { observable } from "mobx";
|
|
|
|
import { observer } from "mobx-react";
|
|
|
|
import { observer } from "mobx-react";
|
|
|
|
import React from "react";
|
|
|
|
import React from "react";
|
|
|
@ -8,8 +8,10 @@ import { app } from "../../../ApplicationServices/Application";
|
|
|
|
import { arrayRemoveOnce } from "../../../Common/ArrayExt";
|
|
|
|
import { arrayRemoveOnce } from "../../../Common/ArrayExt";
|
|
|
|
import { EBoardKeyList } from "../../../Common/BoardKeyList";
|
|
|
|
import { EBoardKeyList } from "../../../Common/BoardKeyList";
|
|
|
|
import { safeEval } from "../../../Common/eval";
|
|
|
|
import { safeEval } from "../../../Common/eval";
|
|
|
|
|
|
|
|
import { KeyBoard } from "../../../Common/KeyEnum";
|
|
|
|
import { FixedNotZero } from "../../../Common/Utils";
|
|
|
|
import { FixedNotZero } from "../../../Common/Utils";
|
|
|
|
import { CommandHistoryRecord } from "../../../DatabaseServices/CommandHistoryRecord";
|
|
|
|
import { CommandHistoryRecord } from "../../../DatabaseServices/CommandHistoryRecord";
|
|
|
|
|
|
|
|
import { CreateObjectData } from "../../../DatabaseServices/CreateObjectData";
|
|
|
|
import { Board } from "../../../DatabaseServices/Entity/Board";
|
|
|
|
import { Board } from "../../../DatabaseServices/Entity/Board";
|
|
|
|
import { Entity } from "../../../DatabaseServices/Entity/Entity";
|
|
|
|
import { Entity } from "../../../DatabaseServices/Entity/Entity";
|
|
|
|
import { PositioningClampSpace } from "../../../DatabaseServices/Template/Positioning/PositioningClampSpace";
|
|
|
|
import { PositioningClampSpace } from "../../../DatabaseServices/Template/Positioning/PositioningClampSpace";
|
|
|
@ -17,9 +19,8 @@ import { DeleteTempate } from "../../../DatabaseServices/Template/TempateUtils";
|
|
|
|
import { TemplateRecord } from "../../../DatabaseServices/Template/TemplateRecord";
|
|
|
|
import { TemplateRecord } from "../../../DatabaseServices/Template/TemplateRecord";
|
|
|
|
import { TemplateSplitType } from "../../../DatabaseServices/Template/TemplateType";
|
|
|
|
import { TemplateSplitType } from "../../../DatabaseServices/Template/TemplateType";
|
|
|
|
import { CommandWrap } from "../../../Editor/CommandMachine";
|
|
|
|
import { CommandWrap } from "../../../Editor/CommandMachine";
|
|
|
|
import { INeedUpdateParams } from "../Template/TemplateComponent";
|
|
|
|
|
|
|
|
import { SelectSetBase } from "../../../Editor/SelectBase";
|
|
|
|
import { SelectSetBase } from "../../../Editor/SelectBase";
|
|
|
|
import { KeyBoard } from "../../../Common/KeyEnum";
|
|
|
|
import { INeedUpdateParams } from "../Template/TemplateComponent";
|
|
|
|
|
|
|
|
|
|
|
|
interface TemplateParamState
|
|
|
|
interface TemplateParamState
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -50,7 +51,7 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
|
|
|
|
private removeFuncs: Function[] = [];
|
|
|
|
private removeFuncs: Function[] = [];
|
|
|
|
private scrollFollow: boolean;
|
|
|
|
private scrollFollow: boolean;
|
|
|
|
private scrollCard: HTMLElement;
|
|
|
|
private scrollCard: HTMLElement;
|
|
|
|
private selectedNodeOrder: number = 0;
|
|
|
|
private templateObjIdSet: Set<number> = new Set();
|
|
|
|
constructor(props: Readonly<TemplateParamProps>)
|
|
|
|
constructor(props: Readonly<TemplateParamProps>)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
super(props);
|
|
|
|
super(props);
|
|
|
@ -61,31 +62,70 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
|
|
|
|
|
|
|
|
|
|
|
|
componentDidMount()
|
|
|
|
componentDidMount()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const drawingCommands = ["draw", "DD", "左右侧板", "立板", "层板", "背板", "DOOR"];
|
|
|
|
let template = this.GetCurrentTemplate();
|
|
|
|
const redoCommands = ["删除模板节点", "应用参数修改", "分离空间", ...drawingCommands];
|
|
|
|
if (template)
|
|
|
|
|
|
|
|
this.displayTemplateRootId = template.Root.Id.Index;
|
|
|
|
let tem = this.GetCurrentTemplate();
|
|
|
|
|
|
|
|
if (tem)
|
|
|
|
|
|
|
|
this.displayTemplateRootId = tem.Root.Id.Index;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.InitData();
|
|
|
|
this.InitData();
|
|
|
|
this.removeFuncs.push(
|
|
|
|
this.removeFuncs.push(
|
|
|
|
end(app.Database.hm, app.Database.hm.RedoEvent, (cmdName: string, historyRec: CommandHistoryRecord) =>
|
|
|
|
end(app.Database.hm, app.Database.hm.RedoEvent, (cmdName: string, historyRec: CommandHistoryRecord) =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (redoCommands.includes(cmdName))
|
|
|
|
for (let [h, hs] of historyRec.HistoryList)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (this.templateObjIdSet.has(h.Index))
|
|
|
|
this.InitData();
|
|
|
|
this.InitData();
|
|
|
|
|
|
|
|
else if (h === app.Database.TemplateTable.Id)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
for (let h of hs)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (h.redoData instanceof CreateObjectData)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (this.templateObjIdSet.has(h.redoData.Object.Id.Index))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
this.InitData();
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
}),
|
|
|
|
end(app.Database.hm, app.Database.hm.UndoEvent, (cmdName: string, historyRec: CommandHistoryRecord) =>
|
|
|
|
end(app.Database.hm, app.Database.hm.UndoEvent, (cmdName: string, historyRec: CommandHistoryRecord) =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (redoCommands.includes(cmdName))
|
|
|
|
if (!this.GetCurrentTemplate())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
this.InitData();
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
for (let [h] of historyRec.HistoryList)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (this.templateObjIdSet.has(h.Index))
|
|
|
|
|
|
|
|
{
|
|
|
|
this.InitData();
|
|
|
|
this.InitData();
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
app.CommandReactor.OnCommandEnd((cmdName, changeObjects, createObjects) =>
|
|
|
|
app.CommandReactor.OnCommandEnd((cmdName, changeObjects, createObjects) =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!drawingCommands.includes(cmdName)) return;
|
|
|
|
for (let e of changeObjects)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (this.templateObjIdSet.has(e.Id.Index))
|
|
|
|
|
|
|
|
{
|
|
|
|
this.InitData();
|
|
|
|
this.InitData();
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
for (let e of createObjects)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (this.templateObjIdSet.has(e.Id.Index))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
this.InitData();
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -126,14 +166,14 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
|
|
|
|
//初始化所有展示数据
|
|
|
|
//初始化所有展示数据
|
|
|
|
InitData()
|
|
|
|
InitData()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let temp = this.GetCurrentTemplate();
|
|
|
|
let template = this.GetCurrentTemplate();
|
|
|
|
if (!temp)
|
|
|
|
if (!template)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
this.setState({ nodes: [] });
|
|
|
|
this.setState({ nodes: [] });
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
this.templateObjIdSet.clear();
|
|
|
|
observable(this.currentProps).replace(temp.Params.map((p) =>
|
|
|
|
observable(this.currentProps).replace(template.Params.map((p) =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return {
|
|
|
|
return {
|
|
|
|
name: p.name,
|
|
|
|
name: p.name,
|
|
|
@ -142,21 +182,23 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
|
|
|
|
expr: p.expr,
|
|
|
|
expr: p.expr,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
}));
|
|
|
|
let nodes = [this.Template2TreeNode(temp.Root)];
|
|
|
|
let nodes = [this.Template2TreeNode(template.Root)];
|
|
|
|
let allnodes: ITreeNode[] = [...nodes];
|
|
|
|
let allnodes: ITreeNode[] = [...nodes];
|
|
|
|
|
|
|
|
let selectedNodeOrder: number;
|
|
|
|
for (let i = 0; i < allnodes.length; i++)
|
|
|
|
for (let i = 0; i < allnodes.length; i++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let n = allnodes[i];
|
|
|
|
let n = allnodes[i];
|
|
|
|
n.isSelected = n.nodeData === temp;
|
|
|
|
this.templateObjIdSet.add(n.id as number);
|
|
|
|
|
|
|
|
n.isSelected = n.nodeData === template;
|
|
|
|
if (n.isSelected)
|
|
|
|
if (n.isSelected)
|
|
|
|
this.selectedNodeOrder = i;
|
|
|
|
selectedNodeOrder = i;
|
|
|
|
allnodes.push(...n.childNodes);
|
|
|
|
allnodes.push(...n.childNodes);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.setState({ nodes });
|
|
|
|
this.setState({ nodes });
|
|
|
|
if (this.scrollFollow && this.scrollCard)
|
|
|
|
if (this.scrollFollow && this.scrollCard)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let treeEl = this.scrollCard.firstElementChild;
|
|
|
|
let treeEl = this.scrollCard.firstElementChild;
|
|
|
|
treeEl.scrollTop = (this.selectedNodeOrder * 30);
|
|
|
|
treeEl.scrollTop = (selectedNodeOrder * 30);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.scrollFollow = false;
|
|
|
|
this.scrollFollow = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -407,17 +449,12 @@ export class TemplateParamDetail extends React.Component<{ updateParams: INeedUp
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (e.keyCode === KeyBoard.Enter)
|
|
|
|
if (e.keyCode === KeyBoard.Enter)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let dt = new Date().getTime();
|
|
|
|
if (this.CheckParamExpr(par))
|
|
|
|
if (dt - ot < 200 && dt - ot > 0)
|
|
|
|
await this.ApplyParamExpr();
|
|
|
|
{
|
|
|
|
|
|
|
|
if (this.handleOnBlur(par))
|
|
|
|
|
|
|
|
await this.ApplyNewValue();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
ot = dt;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
e.stopPropagation()
|
|
|
|
e.stopPropagation()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ApplyNewValue = async () =>
|
|
|
|
ApplyParamExpr = async () =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const { currentShowTemplate, callback } = this.props;
|
|
|
|
const { currentShowTemplate, callback } = this.props;
|
|
|
|
await CommandWrap(async () =>
|
|
|
|
await CommandWrap(async () =>
|
|
|
@ -450,17 +487,13 @@ export class TemplateParamDetail extends React.Component<{ updateParams: INeedUp
|
|
|
|
return "Z";
|
|
|
|
return "Z";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
handleOnBlur = (par: INeedUpdateParams) =>
|
|
|
|
CheckParamExpr = (par: INeedUpdateParams) =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (par.expr !== "")
|
|
|
|
if (par.expr !== "")
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let newVal = safeEval(par.expr as string, this.paramdef);
|
|
|
|
let newVal = safeEval(par.expr as string, this.paramdef);
|
|
|
|
let param = this.props.currentShowTemplate.GetParam(par.name);
|
|
|
|
|
|
|
|
if (!isNaN(newVal))
|
|
|
|
if (!isNaN(newVal))
|
|
|
|
{
|
|
|
|
|
|
|
|
param.expr = par.expr;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
app.Editor.Prompt(`表达式 ${par.name}: ${par.expr} 中存在未定义值`);
|
|
|
|
app.Editor.Prompt(`表达式 ${par.name}: ${par.expr} 中存在未定义值`);
|
|
|
@ -504,7 +537,7 @@ export class TemplateParamDetail extends React.Component<{ updateParams: INeedUp
|
|
|
|
onChange={e => par.expr = e.target.value as string}
|
|
|
|
onChange={e => par.expr = e.target.value as string}
|
|
|
|
onBlur={(e) =>
|
|
|
|
onBlur={(e) =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let res = this.handleOnBlur(par);
|
|
|
|
let res = this.CheckParamExpr(par);
|
|
|
|
if (!res)
|
|
|
|
if (!res)
|
|
|
|
e.target.classList.add("bp3-intent-danger");
|
|
|
|
e.target.classList.add("bp3-intent-danger");
|
|
|
|
else
|
|
|
|
else
|
|
|
@ -541,7 +574,7 @@ export class TemplateParamDetail extends React.Component<{ updateParams: INeedUp
|
|
|
|
}}
|
|
|
|
}}
|
|
|
|
onBlur={(e) =>
|
|
|
|
onBlur={(e) =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let res = this.handleOnBlur(par);
|
|
|
|
let res = this.CheckParamExpr(par);
|
|
|
|
if (!res)
|
|
|
|
if (!res)
|
|
|
|
e.target.classList.add("bp3-intent-danger");
|
|
|
|
e.target.classList.add("bp3-intent-danger");
|
|
|
|
else
|
|
|
|
else
|
|
|
@ -576,10 +609,10 @@ export class TemplateParamDetail extends React.Component<{ updateParams: INeedUp
|
|
|
|
par.name === "RX" ? this.rotateVals.RX = valueAsString :
|
|
|
|
par.name === "RX" ? this.rotateVals.RX = valueAsString :
|
|
|
|
(par.name === "RY" ? this.rotateVals.RY = valueAsString : this.rotateVals.RZ = valueAsString);
|
|
|
|
(par.name === "RY" ? this.rotateVals.RY = valueAsString : this.rotateVals.RZ = valueAsString);
|
|
|
|
}}
|
|
|
|
}}
|
|
|
|
onButtonClick={async () => { await this.ApplyNewValue() }}
|
|
|
|
onButtonClick={async () => { await this.ApplyParamExpr() }}
|
|
|
|
onBlur={(e) =>
|
|
|
|
onBlur={(e) =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let res = this.handleOnBlur(par);
|
|
|
|
let res = this.CheckParamExpr(par);
|
|
|
|
if
|
|
|
|
if
|
|
|
|
(!res) e.target.classList.add("bp3-intent-danger");
|
|
|
|
(!res) e.target.classList.add("bp3-intent-danger");
|
|
|
|
else
|
|
|
|
else
|
|
|
@ -598,7 +631,7 @@ export class TemplateParamDetail extends React.Component<{ updateParams: INeedUp
|
|
|
|
<Button
|
|
|
|
<Button
|
|
|
|
text="应用数据修改"
|
|
|
|
text="应用数据修改"
|
|
|
|
intent={Intent.SUCCESS}
|
|
|
|
intent={Intent.SUCCESS}
|
|
|
|
onClick={async () => { await this.ApplyNewValue(); }}
|
|
|
|
onClick={async () => { await this.ApplyParamExpr(); }}
|
|
|
|
/>
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
</>
|
|
|
|