|
|
@ -1,4 +1,4 @@
|
|
|
|
import { Button, Classes, ContextMenu, H5, Intent, ITreeNode, Menu, MenuItem, Tree } from "@blueprintjs/core";
|
|
|
|
import { Button, Classes, ContextMenu, H5, Intent, ITreeNode, Menu, MenuItem, Tree, NumericInput } 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";
|
|
|
@ -18,6 +18,8 @@ import { TemplateRecord } from "../../../DatabaseServices/Template/TemplateRecor
|
|
|
|
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 { INeedUpdateParams } from "../Template/TemplateComponent";
|
|
|
|
|
|
|
|
import { SelectSetBase } from "../../../Editor/SelectBase";
|
|
|
|
|
|
|
|
import { KeyBoard } from "../../../Common/KeyEnum";
|
|
|
|
|
|
|
|
|
|
|
|
interface TemplateParamState
|
|
|
|
interface TemplateParamState
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -28,6 +30,11 @@ interface TemplateParamProps
|
|
|
|
{
|
|
|
|
{
|
|
|
|
selectTemplateId: number;
|
|
|
|
selectTemplateId: number;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
enum OutlineType
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
This = 0,
|
|
|
|
|
|
|
|
Child = 1,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@observer
|
|
|
|
@observer
|
|
|
|
export class TemplateParamPanel extends React.Component<TemplateParamProps, TemplateParamState>
|
|
|
|
export class TemplateParamPanel extends React.Component<TemplateParamProps, TemplateParamState>
|
|
|
@ -41,6 +48,9 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
|
|
|
|
@observable private currentProps: INeedUpdateParams[] = [];
|
|
|
|
@observable private currentProps: INeedUpdateParams[] = [];
|
|
|
|
//移除注入
|
|
|
|
//移除注入
|
|
|
|
private removeFuncs: Function[] = [];
|
|
|
|
private removeFuncs: Function[] = [];
|
|
|
|
|
|
|
|
private scrollFollow: boolean;
|
|
|
|
|
|
|
|
private scrollCard: HTMLElement;
|
|
|
|
|
|
|
|
private selectedNodeOrder: number = 0;
|
|
|
|
constructor(props: Readonly<TemplateParamProps>)
|
|
|
|
constructor(props: Readonly<TemplateParamProps>)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
super(props);
|
|
|
|
super(props);
|
|
|
@ -83,6 +93,7 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (prevProps.selectTemplateId !== this.props.selectTemplateId)
|
|
|
|
if (prevProps.selectTemplateId !== this.props.selectTemplateId)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
this.scrollFollow = true;
|
|
|
|
this.currentTemplateId = this.props.selectTemplateId;
|
|
|
|
this.currentTemplateId = this.props.selectTemplateId;
|
|
|
|
this.displayTemplateRootId = undefined;
|
|
|
|
this.displayTemplateRootId = undefined;
|
|
|
|
|
|
|
|
|
|
|
@ -130,9 +141,17 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let n = allnodes[i];
|
|
|
|
let n = allnodes[i];
|
|
|
|
n.isSelected = n.nodeData === temp;
|
|
|
|
n.isSelected = n.nodeData === temp;
|
|
|
|
|
|
|
|
if (n.isSelected)
|
|
|
|
|
|
|
|
this.selectedNodeOrder = i;
|
|
|
|
allnodes.push(...n.childNodes);
|
|
|
|
allnodes.push(...n.childNodes);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.setState({ nodes });
|
|
|
|
this.setState({ nodes });
|
|
|
|
|
|
|
|
if (this.scrollFollow && this.scrollCard)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let treeEl = this.scrollCard.firstElementChild;
|
|
|
|
|
|
|
|
treeEl.scrollTop = (this.selectedNodeOrder * 30);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
this.scrollFollow = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Template2TreeNode = (template: TemplateRecord): ITreeNode =>
|
|
|
|
Template2TreeNode = (template: TemplateRecord): ITreeNode =>
|
|
|
@ -167,9 +186,13 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
|
|
|
|
<Menu>
|
|
|
|
<Menu>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
<>
|
|
|
|
<>
|
|
|
|
|
|
|
|
<MenuItem
|
|
|
|
|
|
|
|
text="亮显本节点"
|
|
|
|
|
|
|
|
onClick={() => { this.OutlineSpace(node, OutlineType.This) }}
|
|
|
|
|
|
|
|
/>
|
|
|
|
<MenuItem
|
|
|
|
<MenuItem
|
|
|
|
text="亮显空间子层"
|
|
|
|
text="亮显空间子层"
|
|
|
|
onClick={() => { this.OutlineSpaceChild(node) }}
|
|
|
|
onClick={() => { this.OutlineSpace(node, OutlineType.Child) }}
|
|
|
|
/>
|
|
|
|
/>
|
|
|
|
<MenuItem
|
|
|
|
<MenuItem
|
|
|
|
text="删除节点"
|
|
|
|
text="删除节点"
|
|
|
@ -257,24 +280,39 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
|
|
|
|
}, "删除模板节点");
|
|
|
|
}, "删除模板节点");
|
|
|
|
app.Editor.UpdateScreen();
|
|
|
|
app.Editor.UpdateScreen();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//亮显节点
|
|
|
|
//亮显空间子层
|
|
|
|
OutlineSpace = (node: ITreeNode, type: OutlineType) =>
|
|
|
|
OutlineSpaceChild = (node: ITreeNode) =>
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
app.Editor.SelectCtrl.Cancel();
|
|
|
|
app.Editor.SelectCtrl.Cancel();
|
|
|
|
let tr = node.nodeData as TemplateRecord;
|
|
|
|
let tr = node.nodeData as TemplateRecord;
|
|
|
|
let treeNodes = this.GetAllChildFromThisTemplate(tr);
|
|
|
|
|
|
|
|
let outlineObj3ds: Object3D[] = [];
|
|
|
|
let outlineObj3ds: Object3D[] = [];
|
|
|
|
for (let tn of treeNodes)
|
|
|
|
switch (type)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
for (let t of tn.Objects)
|
|
|
|
case OutlineType.This:
|
|
|
|
{
|
|
|
|
for (let t of tr.Objects)
|
|
|
|
let obj3d = t.Object as Entity;
|
|
|
|
{
|
|
|
|
outlineObj3ds.push(obj3d.DrawObject);
|
|
|
|
let obj3d = t.Object as Entity;
|
|
|
|
}
|
|
|
|
outlineObj3ds.push(obj3d.DrawObject);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case OutlineType.Child:
|
|
|
|
|
|
|
|
let treeNodes = this.GetAllChildFromThisTemplate(tr);
|
|
|
|
|
|
|
|
for (let tn of treeNodes)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
for (let t of tn.Objects)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let obj3d = t.Object as Entity;
|
|
|
|
|
|
|
|
outlineObj3ds.push(obj3d.DrawObject);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
app.Viewer.OutlinePass.selectedObjects = outlineObj3ds;
|
|
|
|
let selectData = new SelectSetBase(app.Viewer);
|
|
|
|
app.Editor.UpdateScreen();
|
|
|
|
selectData.m_SelectList = outlineObj3ds;
|
|
|
|
|
|
|
|
app.Editor.SelectCtrl.AddSelect(selectData);
|
|
|
|
|
|
|
|
app.Editor.SelectCtrl.UpdateView();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//切割空间 待完善
|
|
|
|
//切割空间 待完善
|
|
|
@ -307,6 +345,7 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
|
|
|
|
<div id="templateParam">
|
|
|
|
<div id="templateParam">
|
|
|
|
{/* 模板树 */}
|
|
|
|
{/* 模板树 */}
|
|
|
|
<div
|
|
|
|
<div
|
|
|
|
|
|
|
|
ref={el => this.scrollCard = el}
|
|
|
|
className="template-tree"
|
|
|
|
className="template-tree"
|
|
|
|
>
|
|
|
|
>
|
|
|
|
<Tree
|
|
|
|
<Tree
|
|
|
@ -335,9 +374,42 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
|
|
|
|
|
|
|
|
|
|
|
|
const POSITION_PAR = ["PX", "PY", "PZ"];
|
|
|
|
const POSITION_PAR = ["PX", "PY", "PZ"];
|
|
|
|
const ROTATION_PAR = ["RX", "RY", "RZ"];
|
|
|
|
const ROTATION_PAR = ["RX", "RY", "RZ"];
|
|
|
|
|
|
|
|
let ot = 0;
|
|
|
|
@observer
|
|
|
|
@observer
|
|
|
|
export class TemplateParamDetail extends React.Component<{ updateParams: INeedUpdateParams[], currentShowTemplate: TemplateRecord, callback: Function }> {
|
|
|
|
export class TemplateParamDetail extends React.Component<{ updateParams: INeedUpdateParams[], currentShowTemplate: TemplateRecord, callback: Function }> {
|
|
|
|
|
|
|
|
@observable basePtVals = { PX: "0", PY: "0", PZ: "0" };
|
|
|
|
|
|
|
|
@observable rotateVals = { RX: "0", RY: "0", RZ: "0" };
|
|
|
|
|
|
|
|
private paramdef = this.props.currentShowTemplate.GetParameterDefinition();;
|
|
|
|
|
|
|
|
componentDidMount()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
this.basePtVals = { PX: this.paramdef.PX, PY: this.paramdef.PY, PZ: this.paramdef.PZ };
|
|
|
|
|
|
|
|
this.rotateVals = { RX: this.paramdef.RX, RY: this.paramdef.RY, RZ: this.paramdef.RZ };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
componentDidUpdate(prevProps)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (prevProps.currentShowTemplate !== this.props.currentShowTemplate)
|
|
|
|
|
|
|
|
if (this.props.currentShowTemplate instanceof TemplateRecord)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
this.paramdef = this.props.currentShowTemplate.GetParameterDefinition();
|
|
|
|
|
|
|
|
this.basePtVals = { PX: this.paramdef.PX, PY: this.paramdef.PY, PZ: this.paramdef.PZ };
|
|
|
|
|
|
|
|
this.rotateVals = { RX: this.paramdef.RX, RY: this.paramdef.RY, RZ: this.paramdef.RZ };
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private onKeydown = async (e: React.KeyboardEvent<HTMLInputElement>, par: INeedUpdateParams) =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (e.keyCode === KeyBoard.Enter)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let dt = new Date().getTime();
|
|
|
|
|
|
|
|
if (dt - ot < 200 && dt - ot > 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (this.handleOnBlur(par))
|
|
|
|
|
|
|
|
await this.ApplyNewValue();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
ot = dt;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
e.stopPropagation()
|
|
|
|
|
|
|
|
}
|
|
|
|
ApplyNewValue = async () =>
|
|
|
|
ApplyNewValue = async () =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const { currentShowTemplate, callback } = this.props;
|
|
|
|
const { currentShowTemplate, callback } = this.props;
|
|
|
@ -347,7 +419,7 @@ export class TemplateParamDetail extends React.Component<{ updateParams: INeedUp
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let param = currentShowTemplate.GetParam(par.name);
|
|
|
|
let param = currentShowTemplate.GetParam(par.name);
|
|
|
|
param.expr = par.expr;
|
|
|
|
param.expr = par.expr;
|
|
|
|
});
|
|
|
|
})
|
|
|
|
await currentShowTemplate.UpdateTemplateTree();
|
|
|
|
await currentShowTemplate.UpdateTemplateTree();
|
|
|
|
}, "应用参数修改");
|
|
|
|
}, "应用参数修改");
|
|
|
|
callback();
|
|
|
|
callback();
|
|
|
@ -371,6 +443,25 @@ export class TemplateParamDetail extends React.Component<{ updateParams: INeedUp
|
|
|
|
return "Z";
|
|
|
|
return "Z";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
handleOnBlur = (par: INeedUpdateParams) =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (par.expr !== "")
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let newVal = safeEval(par.expr as string, this.paramdef);
|
|
|
|
|
|
|
|
let param = this.props.currentShowTemplate.GetParam(par.name);
|
|
|
|
|
|
|
|
if (!isNaN(newVal))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
param.expr = par.expr;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
app.Editor.Prompt(`表达式 ${par.name}: ${par.expr} 中存在未定义值`);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
public render()
|
|
|
|
public render()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const { currentShowTemplate } = this.props;
|
|
|
|
const { currentShowTemplate } = this.props;
|
|
|
@ -393,9 +484,18 @@ export class TemplateParamDetail extends React.Component<{ updateParams: INeedUp
|
|
|
|
<span>{FixedNotZero(par.value, 2)}</span>
|
|
|
|
<span>{FixedNotZero(par.value, 2)}</span>
|
|
|
|
<span>{par.description}</span>
|
|
|
|
<span>{par.description}</span>
|
|
|
|
<input
|
|
|
|
<input
|
|
|
|
|
|
|
|
onKeyDown={(e) => { this.onKeydown(e, par) }}
|
|
|
|
className={Classes.INPUT}
|
|
|
|
className={Classes.INPUT}
|
|
|
|
value={par.expr as string}
|
|
|
|
value={par.expr as string}
|
|
|
|
onChange={e => par.expr = e.target.value as string}
|
|
|
|
onChange={e => par.expr = e.target.value as string}
|
|
|
|
|
|
|
|
onBlur={(e) =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let res = this.handleOnBlur(par);
|
|
|
|
|
|
|
|
if (!res)
|
|
|
|
|
|
|
|
e.target.classList.add("bp3-intent-danger");
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
e.target.classList.remove("bp3-intent-danger");
|
|
|
|
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
/>
|
|
|
|
</li>
|
|
|
|
</li>
|
|
|
|
)
|
|
|
|
)
|
|
|
@ -415,9 +515,24 @@ export class TemplateParamDetail extends React.Component<{ updateParams: INeedUp
|
|
|
|
<label style={{ margin: "0 5px" }} onKeyDown={e => e.stopPropagation()}>
|
|
|
|
<label style={{ margin: "0 5px" }} onKeyDown={e => e.stopPropagation()}>
|
|
|
|
{par.name[1]}:
|
|
|
|
{par.name[1]}:
|
|
|
|
<input
|
|
|
|
<input
|
|
|
|
|
|
|
|
onKeyDown={(e) => { this.onKeydown(e, par) }}
|
|
|
|
className={Classes.INPUT}
|
|
|
|
className={Classes.INPUT}
|
|
|
|
value={par.expr as string}
|
|
|
|
value={par.name === "PX" ? this.basePtVals.PX : (par.name === "PY" ? this.basePtVals.PY : this.basePtVals.PZ) as string}
|
|
|
|
onChange={e => par.expr = e.target.value}
|
|
|
|
onFocus={e => e.target.setSelectionRange(0, e.target.value.length)}
|
|
|
|
|
|
|
|
onChange={e =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
par.expr = e.target.value;
|
|
|
|
|
|
|
|
par.name === "PX" ? this.basePtVals.PX = e.target.value :
|
|
|
|
|
|
|
|
(par.name === "PY" ? this.basePtVals.PY = e.target.value : this.basePtVals.PZ = e.target.value);
|
|
|
|
|
|
|
|
}}
|
|
|
|
|
|
|
|
onBlur={(e) =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let res = this.handleOnBlur(par);
|
|
|
|
|
|
|
|
if (!res)
|
|
|
|
|
|
|
|
e.target.classList.add("bp3-intent-danger");
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
e.target.classList.remove("bp3-intent-danger");
|
|
|
|
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
/>
|
|
|
|
</label>
|
|
|
|
</label>
|
|
|
|
)
|
|
|
|
)
|
|
|
@ -425,7 +540,7 @@ export class TemplateParamDetail extends React.Component<{ updateParams: INeedUp
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<H5>旋转角度表达式</H5>
|
|
|
|
<H5>旋转角度表达式</H5>
|
|
|
|
<div>
|
|
|
|
<div className="rotateExpress">
|
|
|
|
{
|
|
|
|
{
|
|
|
|
this.props.updateParams.map(par =>
|
|
|
|
this.props.updateParams.map(par =>
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -433,10 +548,29 @@ export class TemplateParamDetail extends React.Component<{ updateParams: INeedUp
|
|
|
|
return (
|
|
|
|
return (
|
|
|
|
<label style={{ margin: "0 5px" }} onKeyDown={e => e.stopPropagation()}>
|
|
|
|
<label style={{ margin: "0 5px" }} onKeyDown={e => e.stopPropagation()}>
|
|
|
|
{par.name[1]}:
|
|
|
|
{par.name[1]}:
|
|
|
|
<input
|
|
|
|
<NumericInput
|
|
|
|
|
|
|
|
min={0}
|
|
|
|
|
|
|
|
max={360}
|
|
|
|
|
|
|
|
stepSize={90}
|
|
|
|
|
|
|
|
onKeyDown={(e) => { this.onKeydown(e, par) }}
|
|
|
|
className={Classes.INPUT}
|
|
|
|
className={Classes.INPUT}
|
|
|
|
value={par.expr as string}
|
|
|
|
value={par.name === "RX" ? this.rotateVals.RX : (par.name === "RY" ? this.rotateVals.RY : this.rotateVals.RZ) as string}
|
|
|
|
onChange={e => par.expr = e.target.value}
|
|
|
|
selectAllOnFocus={true}
|
|
|
|
|
|
|
|
onValueChange={(valueAsNumber: number, valueAsString: string) =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
par.expr = valueAsString;
|
|
|
|
|
|
|
|
par.name === "RX" ? this.rotateVals.RX = valueAsString :
|
|
|
|
|
|
|
|
(par.name === "RY" ? this.rotateVals.RY = valueAsString : this.rotateVals.RZ = valueAsString);
|
|
|
|
|
|
|
|
}}
|
|
|
|
|
|
|
|
onButtonClick={async () => { await this.ApplyNewValue() }}
|
|
|
|
|
|
|
|
onBlur={(e) =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let res = this.handleOnBlur(par);
|
|
|
|
|
|
|
|
if
|
|
|
|
|
|
|
|
(!res) e.target.classList.add("bp3-intent-danger");
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
e.target.classList.remove("bp3-intent-danger");
|
|
|
|
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
/>
|
|
|
|
</label>
|
|
|
|
</label>
|
|
|
|
)
|
|
|
|
)
|
|
|
|