将夹点拉伸代码移出 SelectControl, 独立出一个服务. 并且更新支持多点同时拉伸.

pull/1/head
ChenX 7 years ago
parent 18f07031a4
commit 033498db2e

@ -8,7 +8,6 @@ import { commandMachine } from '../Editor/CommandMachine';
import { DatGUI } from '../Editor/DebugDatUi'; import { DatGUI } from '../Editor/DebugDatUi';
import { Editor } from '../Editor/Editor'; import { Editor } from '../Editor/Editor';
import { SelectSetBase } from '../Editor/SelectSet'; import { SelectSetBase } from '../Editor/SelectSet';
import { SnapDrag } from '../Editor/SnapDrag';
import { Viewer } from '../GraphicsSystem/Viewer'; import { Viewer } from '../GraphicsSystem/Viewer';
import { layoutOnsizeEvent } from '../UI/Layout/LayoutOnSizeEventManage'; import { layoutOnsizeEvent } from '../UI/Layout/LayoutOnSizeEventManage';
@ -81,8 +80,6 @@ export class ApplicationService
}) })
regGripEvent(); regGripEvent();
new SnapDrag(this);
xaop.begin(commandMachine, commandMachine.ExecCommand, () => xaop.begin(commandMachine, commandMachine.ExecCommand, () =>
{ {
this.m_Viewer.m_GripScene.visible = false; this.m_Viewer.m_GripScene.visible = false;

@ -35,7 +35,6 @@ export class Line extends Entity
Update() Update()
{ {
super.Update();
for (let [, obj] of this.m_DrawEntity) for (let [, obj] of this.m_DrawEntity)
{ {
let lineObj = (<THREE.Line>obj); let lineObj = (<THREE.Line>obj);

@ -1,6 +1,6 @@
//用户交互编辑工具 //用户交互编辑工具
import { Vector3 } from 'three';
import * as THREE from 'three'; import * as THREE from 'three';
import { Vector3 } from 'three';
import * as xaop from 'xaop'; import * as xaop from 'xaop';
import { app, ApplicationService } from '../ApplicationServices/Application'; import { app, ApplicationService } from '../ApplicationServices/Application';
@ -12,6 +12,7 @@ import { KeyBoardControls } from './KeyBoardControls';
import { MouseControls } from './MouseControls'; import { MouseControls } from './MouseControls';
import { PromptDistendResult, PromptPointResult } from './PromptResult'; import { PromptDistendResult, PromptPointResult } from './PromptResult';
import { SelectControls } from './SelectControls'; import { SelectControls } from './SelectControls';
import { SnapDragServices } from './SnapDragServices';
//TODO: 增加鼠标状态. 鼠标位置. //TODO: 增加鼠标状态. 鼠标位置.
export class Editor export class Editor
@ -25,6 +26,7 @@ export class Editor
private m_GetpointServices: GetPointServices; private m_GetpointServices: GetPointServices;
private m_GetDistanceServices: GetDistanceServices; private m_GetDistanceServices: GetDistanceServices;
m_SnapDragServices: SnapDragServices;
constructor(app: ApplicationService) constructor(app: ApplicationService)
{ {
@ -36,6 +38,8 @@ export class Editor
this.m_GetpointServices = new GetPointServices(); this.m_GetpointServices = new GetPointServices();
this.m_GetDistanceServices = new GetDistanceServices(); this.m_GetDistanceServices = new GetDistanceServices();
this.m_SnapDragServices = new SnapDragServices(this);
xaop.end(this.m_MouseCtrl, this.m_MouseCtrl.onMouseMove, () => xaop.end(this.m_MouseCtrl, this.m_MouseCtrl.onMouseMove, () =>
{ {
app.m_Viewer.m_PreViewer.SerCursorPostion(this.m_MouseCtrl.m_CurMousePointVCS); app.m_Viewer.m_PreViewer.SerCursorPostion(this.m_MouseCtrl.m_CurMousePointVCS);

@ -44,13 +44,7 @@ export class SelectControls
{ {
this.m_Viewer.m_OutlinePass.selectedObjects = this.m_SelectSet.SelectObjectList; this.m_Viewer.m_OutlinePass.selectedObjects = this.m_SelectSet.SelectObjectList;
this.m_Viewer.m_bNeedUpdate = true; this.m_Viewer.m_bNeedUpdate = true;
if (this.m_Viewer.m_OutlinePass.selectedObjects.length > 0)
{
this.SnapGrip();
}
} }
PointPick(pt: THREE.Vector3): THREE.Object3D PointPick(pt: THREE.Vector3): THREE.Object3D
{ {
let raycaster = new THREE.Raycaster(); let raycaster = new THREE.Raycaster();
@ -81,103 +75,15 @@ export class SelectControls
return selectBox.m_SelectList[0]; return selectBox.m_SelectList[0];
} }
} }
removeSnapCall;
SnapGrip()
{
this.removeSnap();
let mouseCtrl = app.m_Editor.m_MouseCtrl;
let snapEvent = () =>
{
if (commandMachine.m_CommandIng)
{
return;
}
for (let ptsObj of app.m_Viewer.m_GripScene.children)
{
if (ptsObj instanceof THREE.Points)
{
let en = ptsObj.userData.userData as Entity;
let pts = en.GetStretchPoints();
for (let i = 0; i < pts.length; i++)
{
let ptC = pts[i];
app.m_Viewer.WorldToScreen(ptC);
if (ptC.distanceToSquared(mouseCtrl.m_CurMousePointVCS) < 100)
{
app.m_Viewer.m_PreViewer.m_LastSnapPoint = ptC;
app.m_Viewer.m_PreViewer.m_LastEntity = ptsObj.userData;
app.m_Viewer.m_PreViewer.m_LastIndex = i;
return;
}
}
}
}
};
snapEvent();
this.removeSnapCall = end(mouseCtrl, mouseCtrl.onMouseMove, snapEvent);
}
removeSnap()
{
if (this.removeSnapCall)
this.removeSnapCall();
}
async GridDrag()
{
this.removeSnap();
app.m_Database.hm.StartCmd("drag");
app.m_Viewer.m_GripScene.Clear();
app.m_Viewer.m_bNeedUpdate = true;
app.m_Editor.m_CommandStore.Prompt("拽拖开始:");
app.m_Editor.m_CommandStore.isCmdIng = true;
let obj = app.m_Viewer.m_PreViewer.m_LastEntity;
let en = obj.userData as Entity;
app.m_Editor.AddNoSnapEntity(obj);
let lastP = app.m_Viewer.m_PreViewer.m_LastSnapPoint.clone();
app.m_Viewer.ScreenToWorld(lastP);
let index = app.m_Viewer.m_PreViewer.m_LastIndex;
let pt = await app.m_Editor.GetPoint({
Msg: "指定下一个点:",
BasePoint: lastP.clone(),
AllowDrawRubberBand: true,
Callback: (callPt: THREE.Vector3) =>
{
let p = en.GetStretchPoints()[index];
en.MoveStretchPoints([index], callPt.sub(en.GetStretchPoints()[index]));
}
})
app.m_Editor.RemoveNoSnapEntity(obj);
app.m_Viewer.m_GripScene.Update(obj);
app.m_Editor.m_CommandStore.isCmdIng = false;
this.SnapGrip();
}
onMouseDown(e: MouseEvent) onMouseDown(e: MouseEvent)
{ {
if (e.button === MouseKey.Left) if (e.button === MouseKey.Left)
{ {
if (this.m_Editor.m_InputState <= 1) if (this.m_Editor.m_InputState <= 1)
{ {
if (app.m_Viewer.m_GripScene.children.length > 0 && app.m_Viewer.m_PreViewer.m_LastSnapPoint && app.m_Editor.m_InputState == 0 && !this.m_SelectIng) //这里判断是否存在夹点拉伸的点,如果存在,则交给夹点拉伸
{ if (this.m_Editor.m_SnapDragServices.lastSnapPoint)
this.GridDrag();
return; return;
}
let pt = this.m_Editor.m_MouseCtrl.m_CurMousePointVCS; let pt = this.m_Editor.m_MouseCtrl.m_CurMousePointVCS;
let isRemove = app.m_Editor.m_KeyCtrl.KeyIsDown(KeyBoard.Shift); let isRemove = app.m_Editor.m_KeyCtrl.KeyIsDown(KeyBoard.Shift);
@ -251,7 +157,6 @@ export class SelectControls
this.m_SelectCss.Hide(); this.m_SelectCss.Hide();
app.m_Viewer.m_PreViewer.ToSelect(); app.m_Viewer.m_PreViewer.ToSelect();
this.m_SelectIng = false; this.m_SelectIng = false;
this.removeSnap();
} }
Cancel() Cancel()
{ {

@ -1,14 +0,0 @@
import { ApplicationService } from '../ApplicationServices/Application';
export class SnapDrag
{
constructor(app: ApplicationService)
{
}
async drag()
{
}
}

@ -0,0 +1,166 @@
import { Vector3 } from 'three';
import * as THREE from 'three';
import { end } from 'xaop';
import { app } from '../ApplicationServices/Application';
import { InputState } from '../Common/InputState';
import { Entity } from '../DatabaseServices/Entity';
import { MouseControls } from './MouseControls';
import { Move } from '../Geometry/GeUtils';
import { Editor } from './Editor';
import { MouseKey } from '../Common/KeyEnum';
export class SnapDragServices
{
preViewLines: THREE.Line[] = [];
lastSnapPoint: Vector3;//Wcs
private mouseCtrl: MouseControls;
constructor(ed: Editor)
{
this.mouseCtrl = ed.m_MouseCtrl;
end(this.mouseCtrl, this.mouseCtrl.onMouseMove, () => this.GripSnap());
end(this.mouseCtrl, this.mouseCtrl.onMouseDown, (e) => this.StartSnap(e));
}
GripSnap()
{
if (app.m_Editor.m_InputState > InputState.None)
return;
if (this.lastSnapPoint)
{
let lastVcs = this.lastSnapPoint.clone();
app.m_Viewer.WorldToScreen(lastVcs);
if (this.mouseCtrl.m_CurMousePointVCS.distanceToSquared(lastVcs) < 100)
return;
}
this.UpdateLastPoint();
this.DestroyPreLine();
//更新光标
this.UpdatePreLine();
}
async StartSnap(e: MouseEvent)
{
if (e.button !== MouseKey.Left)
return;
if (app.m_Editor.m_InputState > InputState.None)
return;
if (!this.lastSnapPoint)
return;
this.DestroyPreLine();
app.m_Viewer.m_bNeedUpdate = true;
app.m_Editor.m_CommandStore.Prompt("拽拖开始:");
app.m_Editor.m_CommandStore.isCmdIng = true;
let snapIndexMap: { ent: Entity, indexArr: number[] }[] = [];
for (let ptsObj of app.m_Viewer.m_GripScene.children)
{
if (ptsObj instanceof THREE.Points)
{
let en = ptsObj.userData.userData as Entity;
let pts = en.GetStretchPoints();
let arr: number[] = [];
for (let i = 0; i < pts.length; i++)
{
let ptW = pts[i];
let ptV = ptW.clone();
app.m_Viewer.WorldToScreen(ptV);
if (ptV.distanceToSquared(this.mouseCtrl.m_CurMousePointVCS) < 100)
{
arr.push(i);
}
}
if (arr.length > 0)
{
snapIndexMap.push({ ent: en, indexArr: arr });
app.m_Editor.AddNoSnapEntity(ptsObj.userData);
}
}
}
app.m_Viewer.m_GripScene.visible = false;
let lastP = this.lastSnapPoint.clone();
let pt = await app.m_Editor.GetPoint({
Msg: "指定下一个点:",
BasePoint: this.lastSnapPoint.clone(),
AllowDrawRubberBand: true,
Callback: (callPt: THREE.Vector3) =>
{
let vec = callPt.clone().sub(lastP);
lastP.copy(callPt);
for (let data of snapIndexMap)
{
data.ent.MoveStretchPoints(data.indexArr, vec);
}
}
})
app.m_Editor.ClearSnapEntity();
app.m_Viewer.m_GripScene.UpdateAll();
app.m_Viewer.m_GripScene.visible = true;
app.m_Editor.m_CommandStore.isCmdIng = false;
}
private UpdateLastPoint()
{
this.lastSnapPoint = undefined;
for (let ptsObj of app.m_Viewer.m_GripScene.children)
{
if (ptsObj instanceof THREE.Points)
{
let en = ptsObj.userData.userData as Entity;
let pts = en.GetStretchPoints();
for (let i = 0; i < pts.length; i++)
{
let ptW = pts[i];
let ptV = ptW.clone();
app.m_Viewer.WorldToScreen(ptV);
if (ptV.distanceToSquared(this.mouseCtrl.m_CurMousePointVCS) < 100)
{
this.lastSnapPoint = ptW;
break;
}
}
}
}
}
private UpdatePreLine()
{
if (this.lastSnapPoint)
{
this.preViewLines = app.m_Viewer.m_PreViewer.DrawCross(10);
let ptV = this.lastSnapPoint.clone();
app.m_Viewer.WorldToScreen(ptV);
app.m_Viewer.m_PreViewer.ScreenPointToViewerPoint(ptV);
let move = Move(ptV);
this.preViewLines.forEach(l =>
{
l.applyMatrix(move);
});
app.m_Viewer.m_PreViewer.Scene.add(...this.preViewLines);
app.m_Viewer.m_PreViewer.render();
}
}
private DestroyPreLine()
{
this.preViewLines.forEach(o =>
{
o.parent.remove(o);
o.geometry.dispose();
});
this.preViewLines.length = 0;
app.m_Viewer.m_PreViewer.render();
}
}

@ -20,22 +20,22 @@ export class GripScene extends THREE.Object3D
}); });
} }
//增加 //增加
Append(en: THREE.Object3D) Append(obj: THREE.Object3D)
{ {
if (this.m_GripMap.has(en)) if (this.m_GripMap.has(obj))
{ {
return; return;
} }
if (en.userData instanceof Entity) if (obj.userData instanceof Entity)
{ {
let pts = en.userData.GetStretchPoints(); let pts = obj.userData.GetStretchPoints();
let geom = new THREE.Geometry(); let geom = new THREE.Geometry();
geom.setFromPoints(pts); geom.setFromPoints(pts);
let ptsObj = new THREE.Points(geom, this.m_GripMaterial); let ptsObj = new THREE.Points(geom, this.m_GripMaterial);
ptsObj.userData = en; ptsObj.userData = obj;
this.add(ptsObj); this.add(ptsObj);
this.m_GripMap.set(en, ptsObj); this.m_GripMap.set(obj, ptsObj);
} }
} }
Remove(obj: THREE.Object3D) Remove(obj: THREE.Object3D)

@ -31,9 +31,6 @@ export class PreViewer
//光标对象 //光标对象
private m_CursorObject: THREE.Group; private m_CursorObject: THREE.Group;
m_LastSnapPoint: THREE.Vector3; m_LastSnapPoint: THREE.Vector3;
m_LastEntity: THREE.Object3D;
m_LastIndex: number;
private m_Width: number; private m_Width: number;
private m_Height: number; private m_Height: number;

Loading…
Cancel
Save