!742 右侧模板树右键菜单

pull/742/MERGE
肖诗雅 5 years ago committed by ChenX
parent 36ee406bad
commit 5a8a050389

@ -18,80 +18,83 @@ export class Command_RotateTemplateSpace
let t = await SelectTempate();
if (!t) return;
if (t.Parent?.Object?.IsErase !== false)
{
Log("顶层模块使用Rotate命令直接旋转!");
return;
}
await RotateTemplateSpace(t);
}
}
let cs = await GetSpaceCSFrom3Point();
if (!cs) return;
export async function RotateTemplateSpace(t: TemplateRecord)
{
if (t.Parent?.Object?.IsErase !== false)
{
Log("顶层模块使用Rotate命令直接旋转!");
return;
}
let isNoPos = t.PXParam.value === 0 && t.PYParam.value === 0 && t.PZParam.value === 0;
let parent = t.Parent.Object as TemplateRecord;
if (parent.Children.length === 1 && isNoPos)
{
let tcs = parent.GetTemplateSpaceCS(true);
let tcsInv = new Matrix4().getInverse(tcs);
let cs = await GetSpaceCSFrom3Point();
if (!cs) return;
cs.multiply(tcsInv);
let isNoPos = t.PXParam.value === 0 && t.PYParam.value === 0 && t.PZParam.value === 0;
let parent = t.Parent.Object as TemplateRecord;
if (parent.Children.length === 1 && isNoPos)
{
let tcs = parent.GetTemplateSpaceCS(true);
let tcsInv = new Matrix4().getInverse(tcs);
let cds = new CoordinateSystem().CopyForm(cs);
let ro = getEulerAngle(cds.XAxis, cds.YAxis, cds.ZAxis);
t.RXParam.expr = ro.roX;
t.RYParam.expr = ro.roY;
t.RZParam.expr = ro.roZ;
await t.UpdateTemplateTree();
}
else
{
cs.multiply(tcsInv);
let cds = new CoordinateSystem().CopyForm(cs);
let ro = getEulerAngle(cds.XAxis, cds.YAxis, cds.ZAxis);
t.RXParam.expr = ro.roX;
t.RYParam.expr = ro.roY;
t.RZParam.expr = ro.roZ;
}
else
{
let tcs = t.GetTemplateSpaceCS(true);
let tcsInv = new Matrix4().getInverse(tcs);
let tcs = t.GetTemplateSpaceCS(true);
let tcsInv = new Matrix4().getInverse(tcs);
cs.multiply(tcsInv);
cs.multiply(tcsInv);
let cds = new CoordinateSystem().CopyForm(cs);
let ro = getEulerAngle(cds.XAxis, cds.YAxis, cds.ZAxis);
let cds = new CoordinateSystem().CopyForm(cs);
let ro = getEulerAngle(cds.XAxis, cds.YAxis, cds.ZAxis);
//判断子层空间是否被旋转过,如果是,那么直接修改子层空间
if (t.Children.length === 1)
//判断子层空间是否被旋转过,如果是,那么直接修改子层空间
if (t.Children.length === 1)
{
let ct = t.Children[0].Object as TemplateRecord;
if (ct instanceof TemplateVisualSpace)
{
let ct = t.Children[0].Object as TemplateRecord;
if (ct instanceof TemplateVisualSpace)
{
ct.LParam.expr = "_L";
ct.WParam.expr = "_W";
ct.HParam.expr = "_H";
ct.RXParam.expr = ro.roX;
ct.RYParam.expr = ro.roY;
ct.RZParam.expr = ro.roZ;
await t.UpdateTemplateTree();
return;
}
ct.LParam.expr = "_L";
ct.WParam.expr = "_W";
ct.HParam.expr = "_H";
ct.RXParam.expr = ro.roX;
ct.RYParam.expr = ro.roY;
ct.RZParam.expr = ro.roZ;
await t.UpdateTemplateTree();
return;
}
}
let nt = new TemplateVisualSpace().InitBaseParams();
nt.Name = "旋转空间";
nt.LParam.expr = "_L";
nt.WParam.expr = "_W";
nt.HParam.expr = "_H";
nt.RXParam.expr = ro.roX;
nt.RYParam.expr = ro.roY;
nt.RZParam.expr = ro.roZ;
let nt = new TemplateVisualSpace().InitBaseParams();
nt.Name = "旋转空间";
nt.LParam.expr = "_L";
nt.WParam.expr = "_W";
nt.HParam.expr = "_H";
//如果有子层空间,那么移植到下一层
nt.Children.push(...t.Children);
t.Children.length = 0;
nt.RXParam.expr = ro.roX;
nt.RYParam.expr = ro.roY;
nt.RZParam.expr = ro.roZ;
app.Database.TemplateTable.Append(nt);
t.Children.push(nt.Id);
//如果有子层空间,那么移植到下一层
nt.Children.push(...t.Children);
t.Children.length = 0;
await t.UpdateTemplateTree();
}
app.Database.TemplateTable.Append(nt);
t.Children.push(nt.Id);
}
await t.UpdateTemplateTree();
}
//拾取一个基点2个轴方向确定空间姿态

@ -4,6 +4,7 @@ import { observer } from "mobx-react";
import React from "react";
import { Object3D } from "three";
import { end } from "xaop";
import { RotateTemplateSpace } from "../../../Add-on/Template/RotateTemplateSpace";
import { app } from "../../../ApplicationServices/Application";
import { arrayRemoveOnce } from "../../../Common/ArrayExt";
import { EBoardKeyList } from "../../../Common/BoardKeyList";
@ -15,6 +16,7 @@ import { CreateObjectData } from "../../../DatabaseServices/CreateObjectData";
import { Board } from "../../../DatabaseServices/Entity/Board";
import { Entity } from "../../../DatabaseServices/Entity/Entity";
import { PositioningClampSpace } from "../../../DatabaseServices/Template/Positioning/PositioningClampSpace";
import { TemplateVisualSpace } from "../../../DatabaseServices/Template/ProgramTempate/TemplateVisualSpace";
import { DeleteTempate } from "../../../DatabaseServices/Template/TempateUtils";
import { TemplateRecord } from "../../../DatabaseServices/Template/TemplateRecord";
import { TemplateSplitType } from "../../../DatabaseServices/Template/TemplateType";
@ -126,6 +128,7 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
end(app.Database, app.Database.FileRead, () =>
{
this.InitData();
this.displayTemplateRootId = undefined;
}),
);
}
@ -165,12 +168,19 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
//当前选中的模块记录
GetCurrentTemplate(): TemplateRecord | undefined
{
let record: TemplateRecord;
let curId = app.Database.GetObjectId(this.currentTemplateId);
if (curId === undefined || curId.IsErase)
curId = app.Database.GetObjectId(this.displayTemplateRootId);
else
{
record = curId.Object as TemplateRecord;
if (this.displayTemplateRootId === undefined)
this.displayTemplateRootId = record.Root ? record.Root.Id.Index : record.Id.Index;
}
if (!curId || curId.IsErase)
return;
let record = curId.Object as TemplateRecord;
record = curId.Object as TemplateRecord;
if (record instanceof TemplateRecord)
return record;
@ -246,6 +256,8 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
{
//亮显节点
this.HandleNodeSelect(node);
let curTemp = this.GetCurrentTemplate();
let curParent = (curTemp.Parent?.Object) as TemplateRecord;
ContextMenu.show(
<Menu>
@ -268,13 +280,35 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
onClick={() => { this.SeparateSpace(node); }}
/>
<MenuItem
text="批量修改当前层的柜体名为节点名称"
onClick={() => { this.BatchModifyCurrentLayerCabinetName(node); }}
/>
<MenuItem
text="批量修改当前层及下的柜体名为节点名称"
onClick={() => { this.BatchModifyCurrentChildrenCabinetName(node); }}
text="旋转空间"
onClick={() => { this.RotateSpace(curTemp); }}
/>
{
curTemp instanceof TemplateVisualSpace ?
(curParent && curParent.SplitType !== -1) ?
[["左", "右"], ["前", "后"], ["上", "下"]][curParent.SplitType].map((char, i) =>
{
return (
<MenuItem
text={`${char}边添加空间`}
onClick={async () => { await this.AddSpace(i, curParent, curTemp as TemplateVisualSpace); }}
/>
);
})
: null
:
<>
<MenuItem
text="批量修改当前层的柜体名为节点名称"
onClick={() => { this.BatchModifyCurrentLayerCabinetName(node); }}
/>
<MenuItem
text="批量修改当前层及下的柜体名为节点名称"
onClick={() => { this.BatchModifyCurrentChildrenCabinetName(node); }}
/>
</>
}
</>
}
</Menu>,
@ -285,6 +319,34 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
e.preventDefault();
};
//添加空间
//0: 左 前 上
//1: 右 后 下
private AddSpace = async (type: number, tParent: TemplateRecord, tThis: TemplateVisualSpace) =>
{
let tc = new TemplateVisualSpace().InitBaseParams();
tc.LParam.expr = "_L";
tc.WParam.expr = "_W";
tc.HParam.expr = "_H";
tc.Params[tParent.SplitType].expr = "_DIV";
tc.Params[3 + tParent.SplitType].expr = "_POS";
app.Database.TemplateTable.Append(tc);
let index = tParent.Children.findIndex((t) => t.Index === tThis.Id.Index);
type ? tParent.Children.splice(index + 1, 0, tc.Id) : tParent.Children.splice(index, 0, tc.Id);
await tParent.UpdateTemplateTree();
this.InitData();
};
private RotateSpace = async (t: TemplateRecord) =>
{
CommandWrap(async () =>
{
await RotateTemplateSpace(t);
}, "旋转空间");
};
//批量修改当前层的柜体名为节点名称
private BatchModifyCurrentLayerCabinetName = (node: ITreeNode) =>
{
@ -355,6 +417,8 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
CommandWrap(() =>
{
DeleteTempate(tr);
if (tr.Parent)
(tr.Parent.Object as TemplateRecord).UpdateTemplateTree();
this.InitData();
}, "删除模板节点");
app.Editor.UpdateScreen();
@ -370,8 +434,12 @@ export class TemplateParamPanel extends React.Component<TemplateParamProps, Temp
case OutlineType.This:
for (let t of tr.Objects)
{
let obj3d = t.Object as Entity;
outlineObj3ds.push(obj3d.DrawObject);
if (t && !t.IsErase)
{
let en = t.Object as Entity;
if (en.Visible)
outlineObj3ds.push(en.DrawObject);
}
}
break;
case OutlineType.Child:
@ -686,7 +754,9 @@ export class TemplateParamDetail extends React.Component<{ updateParams: INeedUp
stepSize={90}
onKeyDown={(e) => { this.onKeydown(e, par); }}
className={Classes.INPUT}
value={par.name === "RX" ? this.rotateParam.RX.expr : (par.name === "RY" ? this.rotateParam.RY.expr : this.rotateParam.RZ.expr) as string}
value={par.name === "RX" ? (this.rotateParam.RX.expr ? this.rotateParam.RX.expr : this.rotateParam.RX.val)
: (par.name === "RY" ? (this.rotateParam.RY.expr ? this.rotateParam.RY.expr : this.rotateParam.RY.val)
: this.rotateParam.RZ.expr ? this.rotateParam.RZ.expr : this.rotateParam.RZ.val) as string}
selectAllOnFocus={true}
onValueChange={(valueAsNumber: number, valueAsString: string) =>
{

@ -4,6 +4,7 @@ import { Vector3 } from "three";
import { app } from '../../ApplicationServices/Application';
const MINUS_HEIGHT = 46;
const MINUS_WIDTH = 120;
/**
* , .
*/
@ -60,7 +61,10 @@ export class PromptBlock
else
this.promptContainer.style.top = promptElY + "px";
this.promptContainer.style.left = promptElX + "px";
if (promptElX > app.Viewer.Width - MINUS_WIDTH)
this.promptContainer.style.left = mousePos.x - MINUS_WIDTH + "px";
else
this.promptContainer.style.left = promptElX + "px";
this.dynamicInputManage.Focus();
}

Loading…
Cancel
Save