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