diff --git a/src/Add-on/DrawLine.ts b/src/Add-on/DrawLine.ts index 2d578d138..094908fae 100644 --- a/src/Add-on/DrawLine.ts +++ b/src/Add-on/DrawLine.ts @@ -220,28 +220,18 @@ export class DrawCircle implements Command KeyWordList: [{ key: "3P", msg: "三点" }, { key: "2P", msg: "二点" }, { key: "T", msg: "切点、切点、半径" }] }); if (ptRes.Status != PromptStatus.OK) - { return; - } app.m_Database.ModelSpace.Append(cir); app.m_Editor.AddNoSnapEntity(cir.Draw(RenderType.Wireframe)); - app.m_Editor.m_CommandStore.Prompt("指定圆的半径:"); - ptRes = await app.m_Editor.GetPoint( - { - Msg: "指定圆的半径:", - KeyWordList: [{ key: "D", msg: "直径" }], - BasePoint: ptRes.Value, - Callback: (p) => - { - cir.Radius = p.distanceTo(cir.Center); - }, - AllowDrawRubberBand: true - } - ); - + let disRes = await app.m_Editor.GetDistend({ + Msg: "指定圆的半径:", + Default: 10, + BasePoint: ptRes.Value, + Callback: (v) => cir.Radius = v, + }); app.m_Database.hm.EndCmd(); } } diff --git a/src/Common/InputState.ts b/src/Common/InputState.ts index 7704a2076..b94818d95 100644 --- a/src/Common/InputState.ts +++ b/src/Common/InputState.ts @@ -15,11 +15,22 @@ export interface KeyWord msg: string; key: string; } -export interface GetPointPrompt +interface GetAnyPrompt { Msg?: string + KeyWordList?: KeyWord[] +} + +export interface GetPointPrompt extends GetAnyPrompt +{ BasePoint?: Vector3 Callback?: (pt: THREE.Vector3) => void AllowDrawRubberBand?: Boolean; - KeyWordList?: KeyWord[] +} + +export interface GetDistendPrompt extends GetAnyPrompt +{ + BasePoint?: Vector3 + Callback?: (pt: number) => void + Default?: number } \ No newline at end of file diff --git a/src/Editor/Editor.ts b/src/Editor/Editor.ts index 6c8dac2cc..0d5e6c473 100644 --- a/src/Editor/Editor.ts +++ b/src/Editor/Editor.ts @@ -1,16 +1,16 @@ //用户交互编辑工具 -import * as THREE from 'three'; import { Vector3 } from 'three'; +import * as THREE from 'three'; import * as xaop from 'xaop'; import { app, ApplicationService } from '../ApplicationServices/Application'; -import { GetPointPrompt, InputState } from '../Common/InputState'; +import { GetDistendPrompt, GetPointPrompt, InputState } from '../Common/InputState'; import { Entity } from '../DatabaseServices/Entity'; import { CommandStore } from '../UI/Store/CommandStore'; -import { GetPointServices } from './GetPointServices'; +import { GetDistendsServices, GetPointServices } from './GetPointServices'; import { KeyBoardControls } from './KeyBoardControls'; import { MouseControls } from './MouseControls'; -import { PromptPointResult } from './PromptResult'; +import { PromptDistendResult, PromptPointResult } from './PromptResult'; import { SelectControls } from './SelectControls'; //TODO: 增加鼠标状态. 鼠标位置. @@ -24,6 +24,7 @@ export class Editor m_CommandStore: CommandStore; private m_GetpointServices: GetPointServices; + private m_GetDistendsServices: GetDistendsServices; constructor(app: ApplicationService) { @@ -33,15 +34,20 @@ export class Editor this.m_SelectCtrl = new SelectControls(app.m_Viewer, this) this.m_CommandStore = new CommandStore(this); this.m_GetpointServices = new GetPointServices(); + this.m_GetDistendsServices = new GetDistendsServices(); xaop.end(this.m_MouseCtrl, this.m_MouseCtrl.onMouseMove, () => { app.m_Viewer.m_PreViewer.SerCursorPostion(this.m_MouseCtrl.m_CurMousePointVCS); }) } - GetPoint(prompt?: GetPointPrompt): Promise + GetPoint(prompt?: GetPointPrompt, showDyn: boolean = true): Promise + { + return this.m_GetpointServices.Doit(prompt, showDyn); + } + GetDistend(prompt?: GetDistendPrompt): Promise { - return this.m_GetpointServices.Doit(prompt); + return this.m_GetDistendsServices.Doit(prompt); } AddNoSnapEntity(e) { diff --git a/src/Editor/GetPointServices.ts b/src/Editor/GetPointServices.ts index b350fff91..683d8afd1 100644 --- a/src/Editor/GetPointServices.ts +++ b/src/Editor/GetPointServices.ts @@ -1,14 +1,15 @@ -import * as THREE from 'three'; import { Vector3 } from 'three'; +import * as THREE from 'three'; import * as xaop from 'xaop'; import { app } from '../ApplicationServices/Application'; -import { GetPointPrompt, InputState } from '../Common/InputState'; +import { GetDistendPrompt, GetPointPrompt, InputState } from '../Common/InputState'; import { KeyBoard, MouseKey } from '../Common/KeyEnum'; -import { equaln, fixAngle, Intersect, polar } from '../Geometry/GeUtils'; +import { equaln, fixAngle, Intersect, midPoint, polar } from '../Geometry/GeUtils'; import { DynamicInputManage } from '../UI/DynamicPrompt/DynamicInputManage'; +import { GetDistancePromptBlock } from '../UI/DynamicPrompt/GetDistancePromptBlock'; import { GetPointPromptBlock } from '../UI/DynamicPrompt/GetPointPromptBlock'; -import { PromptPointResult, PromptStatus } from './PromptResult'; +import { PromptDistendResult, PromptPointResult, PromptStatus } from './PromptResult'; /** * 为拾取点提供服务,提供一个类以供Editor引用. @@ -20,8 +21,8 @@ export class GetPointServices { private promisResolve: (PromptPointResult) => void;//promis回调 - private removeCalls: Function[] = []; //结束回调 - Doit(prompt?: GetPointPrompt): Promise + protected removeCalls: Function[] = []; //结束回调 + Doit(prompt?: GetPointPrompt, showDyn: boolean = false): Promise { prompt = prompt ? prompt : {}; //程序状态 @@ -33,7 +34,7 @@ export class GetPointServices //消息显示. this.initPrompt(prompt); //动态输入框. - this.initDynInput(prompt); + if (showDyn) this.initDynInput(prompt); //设置关键字 this.initKeyword(prompt); //处理用户输入 @@ -203,7 +204,7 @@ export class GetPointServices } //初始化动态输入框,包括处理事件 - private initDynInput(prompt: GetPointPrompt) + protected initDynInput(prompt: GetPointPrompt) { let dynPrompt = new GetPointPromptBlock(DynamicInputManage.GetManage()); dynPrompt.updatePrompt(prompt.Msg); @@ -227,7 +228,7 @@ export class GetPointServices } //调用promis的回调. - private _return(v?: THREE.Vector3 | string) + protected _return(v?: THREE.Vector3 | string) { this.restAppState(); @@ -561,4 +562,103 @@ export class GetPointServices } return undefined; } -} \ No newline at end of file +} + +export class GetDistendsServices +{ + private removeCalls: Function[] = []; + private promisResolve: (PromptDistendResult) => void; + + Doit(prompt?: GetDistendPrompt): Promise + { + prompt = prompt || {}; + let dynInput = this.initDynInput(prompt); + return new Promise(async (resolve, reject) => + { + this.promisResolve = resolve; + let p1 = prompt.BasePoint; + if (!p1) + { + let ptRes = await app.m_Editor.GetPoint( + { + Msg: "请输入距离或者点取距离:", + BasePoint: prompt.BasePoint, + Callback: (p) => + { + dynInput.SetPostion(app.m_Editor.m_MouseCtrl.m_CurMousePointVCS); + } + }, false); + if (ptRes.Status == PromptStatus.OK) + p1 = ptRes.Value; + else + { + this._return(); + return; + } + } + let ptRes = await app.m_Editor.GetPoint({ + Msg: "请输入距离或者点取距离:", + BasePoint: p1, + AllowDrawRubberBand: true, + Callback: (p) => + { + let midp = midPoint(p1, p); + app.m_Viewer.WorldToScreen(midp); + + dynInput.SetPostion(app.m_Editor.m_MouseCtrl.m_CurMousePointVCS); + dynInput.ValuePostion = midp; + dynInput.Value = p1.distanceTo(p); + + if (prompt.Callback) + prompt.Callback(dynInput.Value); + } + }, false); + if (ptRes.Status == PromptStatus.OK) + this._return(p1.distanceTo(ptRes.Value)); + else + this._return(); + }); + } + //初始化动态输入框,包括处理事件 + protected initDynInput(prompt: GetDistendPrompt) + { + let dynManage = DynamicInputManage.GetManage(); + let dynInput = new GetDistancePromptBlock(dynManage); + dynInput.Value = prompt.Default; + dynInput.updatePrompt(prompt.Msg); + this.removeCalls.push(() => + { + dynInput.Destroy(); + }); + + this.removeCalls.push( + xaop.end(dynManage, dynManage.HandleInputEvent, () => + { + let v = dynInput.Value; + if (!isNaN(v)) + this._return(v); + }) + ) + return dynInput; + } + protected _return(v?: number | string) + { + this.removeCalls.forEach(f => f()); + + let res = new PromptDistendResult(); + if (!v) + { + res.Status = PromptStatus.Cancel; + } + else if (v instanceof Number) + { + res.Status = PromptStatus.OK + } + else + { + res.Status = PromptStatus.Keyword + res.StringResult = v; + } + this.promisResolve(res); + } +} diff --git a/src/Editor/PromptResult.ts b/src/Editor/PromptResult.ts index 9f3d26faf..ec5e2e78b 100644 --- a/src/Editor/PromptResult.ts +++ b/src/Editor/PromptResult.ts @@ -40,4 +40,17 @@ export class PromptPointResult extends PromptResult super(); this._value = new THREE.Vector3(); } -} \ No newline at end of file +} + +export class PromptDistendResult extends PromptResult +{ + private _value: number; + get Value() + { + return this._value; + } + set Value(v) + { + this._value = v; + } +} diff --git a/src/UI/DynamicPrompt/GetDistancePromptBlock.ts b/src/UI/DynamicPrompt/GetDistancePromptBlock.ts new file mode 100644 index 000000000..0f92c8f83 --- /dev/null +++ b/src/UI/DynamicPrompt/GetDistancePromptBlock.ts @@ -0,0 +1,39 @@ +import { PromptBlock } from "./PromptBlock"; +import { DynamicInputManage } from "./DynamicInputManage"; +import { RealDynamicInput } from "./RealDynamicInput"; + +export class GetDistancePromptBlock extends PromptBlock +{ + + private valueDynIpt: RealDynamicInput; + constructor(dynamicInputManage: DynamicInputManage) + { + super(dynamicInputManage); + this.valueDynIpt = new RealDynamicInput(this.promptContainer); + dynamicInputManage.AddDynamicInput(this.valueDynIpt); + this.updatePrompt("请点击或者输入距离:"); + } + + //设置输入距离的位置 + set ValuePostion(v: THREE.Vector3) + { + this.valueDynIpt.Fixed = true; + this.valueDynIpt.SetPosition(v.x, v.y); + } + + set Value(v: number) + { + if (v && !isNaN(v)) + this.valueDynIpt.Value = v; + } + get Value(): number + { + return this.valueDynIpt.Value; + } + + Destroy() + { + super.Destroy(); + this.dynamicInputManage.RemoveDynamicInput(this.valueDynIpt); + } +} diff --git a/src/UI/DynamicPrompt/GetPointPromptBlock.ts b/src/UI/DynamicPrompt/GetPointPromptBlock.ts index 39c4243e6..93b159f75 100644 --- a/src/UI/DynamicPrompt/GetPointPromptBlock.ts +++ b/src/UI/DynamicPrompt/GetPointPromptBlock.ts @@ -4,7 +4,6 @@ import { DynamicInputManage } from './DynamicInputManage'; import { PromptBlock } from './PromptBlock'; import { RealDynamicInput } from './RealDynamicInput'; - /** * 拾取点的动态提示框,包括了一个提示字符串和三个值. * @@ -43,4 +42,4 @@ export class GetPointPromptBlock extends PromptBlock if (!arr.some(n => isNaN(n))) return new Vector3().fromArray(arr); } -} \ No newline at end of file +} diff --git a/src/UI/DynamicPrompt/PromptBlock.ts b/src/UI/DynamicPrompt/PromptBlock.ts index 3cbe0810b..981830c81 100644 --- a/src/UI/DynamicPrompt/PromptBlock.ts +++ b/src/UI/DynamicPrompt/PromptBlock.ts @@ -14,7 +14,7 @@ export class PromptBlock public promptContainer: HTMLElement; //提示信息 private promptEl: HTMLElement; - private dynamicInputManage: DynamicInputManage; + protected dynamicInputManage: DynamicInputManage; private dynInputList: DynamicInput[] = []; constructor(dynamicInputManage: DynamicInputManage) {