|
|
|
@ -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<PromptPointResult>
|
|
|
|
|
{
|
|
|
|
|
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<PromptPointResult>((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 = () =>
|
|
|
|
|
//调用promis的回调.
|
|
|
|
|
private _return(v?: THREE.Vector3 | string)
|
|
|
|
|
{
|
|
|
|
|
app.m_Editor.m_InputState = InputState.None;
|
|
|
|
|
this.noSnapList.clear();
|
|
|
|
|
this.restAppState();
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//清理所有的注入函数.
|
|
|
|
|
for (let destroyFunc of removeCalls)
|
|
|
|
|
//初始化设置 程序的状态
|
|
|
|
|
private initAppState()
|
|
|
|
|
{
|
|
|
|
|
destroyFunc();
|
|
|
|
|
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();
|
|
|
|
|
|
|
|
|
|
resolve(retValue);
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|