From 5a8a0503894da9f2dac52ece4e0c53e3aec6008d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=82=96=E8=AF=97=E9=9B=85?= Date: Thu, 27 Feb 2020 10:20:48 +0800 Subject: [PATCH] =?UTF-8?q?!742=20=E5=8F=B3=E4=BE=A7=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E6=A0=91=E5=8F=B3=E9=94=AE=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Add-on/Template/RotateTemplateSpace.ts | 121 +++++++++--------- .../RightPanel/TemplateParamPanel.tsx | 90 +++++++++++-- src/UI/DynamicPrompt/PromptBlock.ts | 6 +- 3 files changed, 147 insertions(+), 70 deletions(-) diff --git a/src/Add-on/Template/RotateTemplateSpace.ts b/src/Add-on/Template/RotateTemplateSpace.ts index a6e0995dc..c40035c6b 100644 --- a/src/Add-on/Template/RotateTemplateSpace.ts +++ b/src/Add-on/Template/RotateTemplateSpace.ts @@ -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个轴方向确定空间姿态 diff --git a/src/UI/Components/RightPanel/TemplateParamPanel.tsx b/src/UI/Components/RightPanel/TemplateParamPanel.tsx index 8495355b4..acbb74333 100644 --- a/src/UI/Components/RightPanel/TemplateParamPanel.tsx +++ b/src/UI/Components/RightPanel/TemplateParamPanel.tsx @@ -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 { this.InitData(); + this.displayTemplateRootId = undefined; }), ); } @@ -165,12 +168,19 @@ export class TemplateParamPanel extends React.Component @@ -268,13 +280,35 @@ export class TemplateParamPanel extends React.Component { this.SeparateSpace(node); }} /> { this.BatchModifyCurrentLayerCabinetName(node); }} - /> - { this.BatchModifyCurrentChildrenCabinetName(node); }} + text="旋转空间" + onClick={() => { this.RotateSpace(curTemp); }} /> + { + curTemp instanceof TemplateVisualSpace ? + + (curParent && curParent.SplitType !== -1) ? + [["左", "右"], ["前", "后"], ["上", "下"]][curParent.SplitType].map((char, i) => + { + return ( + { await this.AddSpace(i, curParent, curTemp as TemplateVisualSpace); }} + /> + ); + }) + : null + : + <> + { this.BatchModifyCurrentLayerCabinetName(node); }} + /> + { this.BatchModifyCurrentChildrenCabinetName(node); }} + /> + + } } , @@ -285,6 +319,34 @@ export class TemplateParamPanel extends React.Component + { + 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 { 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 { 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) => { diff --git a/src/UI/DynamicPrompt/PromptBlock.ts b/src/UI/DynamicPrompt/PromptBlock.ts index f9eebff4c..03bccce03 100644 --- a/src/UI/DynamicPrompt/PromptBlock.ts +++ b/src/UI/DynamicPrompt/PromptBlock.ts @@ -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(); }