From 9d21568c45672249b921ff06f2ca73562d3b7f05 Mon Sep 17 00:00:00 2001 From: ChenX Date: Wed, 10 Jan 2018 11:01:23 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=B8=85=E7=90=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81.=20=20(=E5=8A=A8=E6=80=81=E8=BE=93=E5=85=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/KeyEnum.ts | 2 + src/Editor/GetPointServices.ts | 141 ++++++++++++-------- src/Geometry/GeUtils.ts | 2 +- src/UI/DynamicPrompt/DynamicInputBase.ts | 19 ++- src/UI/DynamicPrompt/DynamicInputManage.ts | 9 +- src/UI/DynamicPrompt/GetPointPromptBlock.ts | 4 +- src/UI/DynamicPrompt/RealDynamicInput.ts | 5 +- 7 files changed, 115 insertions(+), 67 deletions(-) diff --git a/src/Common/KeyEnum.ts b/src/Common/KeyEnum.ts index 312c9b96f..d9e77c25b 100644 --- a/src/Common/KeyEnum.ts +++ b/src/Common/KeyEnum.ts @@ -52,6 +52,7 @@ export enum KeyBoard * 逗号 */ Comma = 188, + CommaChrome = 229, /** * 句号 */ @@ -110,6 +111,7 @@ export enum KeyBoard ContextMenu = 93, Enter = 13, Space = 32, + Backspace = 8, Tab = 9, Delete = 46, End = 35, diff --git a/src/Editor/GetPointServices.ts b/src/Editor/GetPointServices.ts index 4693e40e6..55f78f1fc 100644 --- a/src/Editor/GetPointServices.ts +++ b/src/Editor/GetPointServices.ts @@ -4,7 +4,7 @@ import * as xaop from 'xaop'; import { app } from '../ApplicationServices/Application'; import { GetPointPrompt, InputState } from '../Common/InputState'; import { MouseKey, KeyBoard } from '../Common/KeyEnum'; -import { angle, equaln, fixAngle, Intersect } from '../Geometry/GeUtils'; +import { polar, equaln, fixAngle, Intersect } from '../Geometry/GeUtils'; import { PromptPointResult, PromptStatus } from './PromptResult'; import { GetPointPromptBlock } from '../UI/DynamicPrompt/GetPointPromptBlock'; import { DynamicInputManage } from '../UI/DynamicPrompt/DynamicInputManage'; @@ -17,40 +17,34 @@ import { DynamicInputManage } from '../UI/DynamicPrompt/DynamicInputManage'; */ export class GetPointServices { + + private promisResolve: (PromptPointResult) => void;//promis回调 + private removeCalls: Function[] = []; //结束回调 Doit(prompt?: GetPointPrompt): Promise { - app.m_Editor.m_InputState = InputState.GetPoint; - prompt = prompt ? prompt : {}; - app.m_Viewer.m_PreViewer.ToGetpoint(); - let retValue = new PromptPointResult(); - - let removeCalls = []; //删除回调列表 - - removeCalls.push(this.Snap()); - removeCalls.push(() => { this.DestroySnapLine() }); - - + this.initAppState(); + this.initPtSnap(); return new Promise((resolve, reject) => { - + this.promisResolve = resolve; //消息显示. if (prompt.Msg) { app.m_Editor.m_CommandStore.commandPrompt = prompt.Msg; - removeCalls.push(() => + this.removeCalls.push(() => { app.m_Editor.m_CommandStore.commandPrompt = ""; }) } //动态输入框. let dynPrompt = new GetPointPromptBlock(DynamicInputManage.GetManage()); - removeCalls.push(() => + this.removeCalls.push(() => { dynPrompt.Destroy(); }) - removeCalls.push(xaop.end(app.m_Editor.m_MouseCtrl, app.m_Editor.m_MouseCtrl.onMouseMove, () => + this.removeCalls.push(xaop.end(app.m_Editor.m_MouseCtrl, app.m_Editor.m_MouseCtrl.onMouseMove, () => { dynPrompt.SetPostion(app.m_Editor.m_MouseCtrl.m_CurMousePointVCS); dynPrompt.Value = this.GetNowPoint(); @@ -62,14 +56,14 @@ export class GetPointServices app.m_Editor.m_CommandStore.keyWordList.length = 0; app.m_Editor.m_CommandStore.keyWordList.push(...prompt.KeyWordList); - removeCalls.push(() => + this.removeCalls.push(() => { app.m_Editor.m_CommandStore.keyWordList.length = 0; }) } //处理用户输入 - removeCalls.push( + this.removeCalls.push( xaop.begin(app.m_Editor.m_CommandStore, app.m_Editor.m_CommandStore.HandleInput, (inputData: string) => { inputData = inputData.toUpperCase(); @@ -79,9 +73,7 @@ export class GetPointServices { if (keyword.key == inputData) { - retValue.Status = PromptStatus.Keyword; - retValue.StringResult = inputData.toUpperCase(); - _return(); + this._return(inputData.toUpperCase()); return; } } @@ -105,13 +97,20 @@ export class GetPointServices let p = new THREE.Vector3(); p.fromArray(vlist); - retValue.Status = PromptStatus.OK; - retValue.Value = p; - _return(); + this._return(p); } } }) ) + //处理动态输入 + let dynManage = DynamicInputManage.GetManage(); + this.removeCalls.push( + xaop.end(dynManage, dynManage.HandleInputEvent, () => + { + let p = dynPrompt.Value; + if (p) this._return(p); + }) + ) //如果有基点,那么绘制直线 if (prompt.BasePoint && prompt.AllowDrawRubberBand) @@ -129,7 +128,7 @@ export class GetPointServices let geo = line.geometry as THREE.Geometry; preView.Scene.add(line); - removeCalls.push( + this.removeCalls.push( () => { preView.Scene.remove(line); @@ -156,10 +155,10 @@ export class GetPointServices ); } } - //调用回调 + //鼠标移动 if (prompt.Callback) { - removeCalls.push( + this.removeCalls.push( xaop.end(app.m_Editor.m_MouseCtrl, app.m_Editor.m_MouseCtrl.onMouseMove, () => { let p = this.GetNowPoint(); @@ -169,48 +168,68 @@ export class GetPointServices ); } //鼠标按下 - removeCalls.push( + this.removeCalls.push( xaop.end(app.m_Editor.m_MouseCtrl, app.m_Editor.m_MouseCtrl.onMouseDown, (e: MouseEvent) => { if (e.button == MouseKey.Left) { - retValue.Status = PromptStatus.OK; - retValue.Value = this.GetNowPoint(); - _return(); + this._return(this.GetNowPoint()); } }) ); //键盘按下 - removeCalls.push( + this.removeCalls.push( xaop.begin(app.m_Editor.m_KeyCtrl, app.m_Editor.m_KeyCtrl.OnKeyDown, (e: KeyboardEvent) => { if (e.keyCode == KeyBoard.Escape) - { - retValue.Status = PromptStatus.Cancel; - _return(); - } + this._return() }) ); + }); + } - //返回 - let _return = () => - { - app.m_Editor.m_InputState = InputState.None; - this.noSnapList.clear(); + //调用promis的回调. + private _return(v?: THREE.Vector3 | string) + { + this.restAppState(); - //清理所有的注入函数. - for (let destroyFunc of removeCalls) - { - destroyFunc(); - } - app.m_Viewer.m_PreViewer.ToSelect(); + let retValue = new PromptPointResult(); + if (!v) + { + retValue.Status = PromptStatus.Cancel; + } + else if (v instanceof THREE.Vector3) + { + retValue.Status = PromptStatus.OK; + retValue.Value = v; + } + else + { + retValue.Status = PromptStatus.Keyword; + retValue.StringResult = v; + } + this.promisResolve(retValue); + } - resolve(retValue); - app.m_Editor.UpdateScreen(); - } - }); + //初始化设置 程序的状态 + private initAppState() + { + app.m_Editor.m_InputState = InputState.GetPoint; + app.m_Viewer.m_PreViewer.ToGetpoint(); } + //还原状态 + private restAppState() + { + app.m_Editor.m_InputState = InputState.None; + app.m_Viewer.m_PreViewer.ToSelect(); + + app.m_Editor.UpdateScreen(); + + this.removeCalls.forEach(f => f()); + this.removeCalls.length = 0; + this.noSnapList.clear(); + } //极轴捕捉的线列表 m_SnapAxisBlueLine: THREE.Line[] = []; @@ -222,7 +241,7 @@ export class GetPointServices l.parent.remove(l); l.geometry.dispose(); } - this.m_SnapAxisBlueLine = []; + this.m_SnapAxisBlueLine.length = 0; } /** * @@ -400,7 +419,7 @@ export class GetPointServices * @returns * @memberof Editor */ - Snap() + initPtSnap() { this.m_SnapPtList.length = 0; let testSnap = () => @@ -463,15 +482,21 @@ export class GetPointServices } } testSnap(); - return xaop.end(app.m_Editor.m_MouseCtrl, app.m_Editor.m_MouseCtrl.onMouseMove, testSnap); + let removeCall = xaop.end(app.m_Editor.m_MouseCtrl, app.m_Editor.m_MouseCtrl.onMouseMove, testSnap); + this.removeCalls.push(() => + { + removeCall(); + this.DestroySnapLine(); + }) } /** * - * 轴捕捉 + * * @param {any} basePoint + * @param {number} fixAn * @returns {THREE.Vector3} 返回捕捉的点 如果捕捉不到 那么返回空 - * @memberof Editor + * @memberof GetPointServices */ AxisSnap(basePoint, fixAn: number): THREE.Vector3 { @@ -488,12 +513,12 @@ export class GetPointServices { //dis. let v0 = new THREE.Vector3(0, 0, 0); - angle(v0, newan, 1); + polar(v0, newan, 1); let dis = v0.dot(wcs.sub(basePoint)); let retP = basePoint.clone(); - angle(retP, newan, dis); + polar(retP, newan, dis); return retP; } diff --git a/src/Geometry/GeUtils.ts b/src/Geometry/GeUtils.ts index 84873340e..32afe14ba 100644 --- a/src/Geometry/GeUtils.ts +++ b/src/Geometry/GeUtils.ts @@ -31,7 +31,7 @@ export function fixAngle(an: number, fixAngle: number, fuzz: number = 0.1) } return an; } -export function angle(v: THREE.Vector3, an: number, dis: number) +export function polar(v: THREE.Vector3, an: number, dis: number) { v.x += Math.cos(an) * dis; v.y += Math.sin(an) * dis; diff --git a/src/UI/DynamicPrompt/DynamicInputBase.ts b/src/UI/DynamicPrompt/DynamicInputBase.ts index 3c976eff3..a4d491d20 100644 --- a/src/UI/DynamicPrompt/DynamicInputBase.ts +++ b/src/UI/DynamicPrompt/DynamicInputBase.ts @@ -1,5 +1,6 @@ import { KeyBoard } from "../../Common/KeyEnum"; import { IsChar, IsNumble } from "../../Common/Utils"; +import { DynamicInputManage } from "./DynamicInputManage"; /** @@ -22,11 +23,25 @@ export class DynamicInput { if (IsChar(e.keyCode) || IsNumble(e.keyCode)) { - e.stopPropagation() + e.stopPropagation(); } else { - e.preventDefault(); + switch (e.keyCode) + { + case KeyBoard.Enter: + DynamicInputManage.GetManage().HandleInputEvent(""); + e.stopPropagation(); + break; + case KeyBoard.CommaChrome://TODO:逗号时切换..失败. + e.preventDefault(); + break; + case KeyBoard.Backspace: + break; + default://阻止其他的事件 + e.preventDefault(); + break; + } } }; container.appendChild(this.inputEl); diff --git a/src/UI/DynamicPrompt/DynamicInputManage.ts b/src/UI/DynamicPrompt/DynamicInputManage.ts index 21ce26a20..e957c3b4b 100644 --- a/src/UI/DynamicPrompt/DynamicInputManage.ts +++ b/src/UI/DynamicPrompt/DynamicInputManage.ts @@ -80,13 +80,18 @@ export class DynamicInputManage case KeyBoard.Enter: case KeyBoard.Space: let enableInputValue = this.inputCollection[this.focusIndex].Value; - this.HandleInput(enableInputValue); + this.HandleInputEvent(enableInputValue); break; default: break; } } - public HandleInput(cmd: any) + public SendInput() + { + + } + // + public HandleInputEvent(cmd: any) { return cmd; } diff --git a/src/UI/DynamicPrompt/GetPointPromptBlock.ts b/src/UI/DynamicPrompt/GetPointPromptBlock.ts index f64e49343..679cff171 100644 --- a/src/UI/DynamicPrompt/GetPointPromptBlock.ts +++ b/src/UI/DynamicPrompt/GetPointPromptBlock.ts @@ -40,6 +40,8 @@ export class GetPointPromptBlock extends PromptBlock } get Value() { - return new Vector3().fromArray(this.pointValueDynInput.map(o => o.Value)); + let arr = this.pointValueDynInput.map(o => o.Value); + if (!arr.some(n => isNaN(n))) + return new Vector3().fromArray(arr); } } \ No newline at end of file diff --git a/src/UI/DynamicPrompt/RealDynamicInput.ts b/src/UI/DynamicPrompt/RealDynamicInput.ts index 452dc7015..9c6112ed4 100644 --- a/src/UI/DynamicPrompt/RealDynamicInput.ts +++ b/src/UI/DynamicPrompt/RealDynamicInput.ts @@ -12,7 +12,7 @@ export class RealDynamicInput extends DynamicInput } set Value(v: number) { - super.Value = v; + super.Value = v.toFixed(4); this.OnInput(); } //返回一个计算完成的实数结果. @@ -20,8 +20,7 @@ export class RealDynamicInput extends DynamicInput { try { - console.log('super.Value: ', super.Value); - return this.parse.evaluate(super.Value) + return this.parse.evaluate(super.Value); } catch (error) { return NaN;