mirror of https://gitee.com/cf-fz/WebCAD.git
parent
18f07031a4
commit
033498db2e
@ -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();
|
||||
}
|
||||
}
|
Loading…
Reference in new issue