GetPoint在视图与UCS平行状态下不捕捉Z轴,拽拖夹点时优化UCS位置和捕捉Z轴

pull/333/head
ChenX 5 years ago
parent 9371eff824
commit 4e0b927714

@ -7,6 +7,7 @@ import { DisposeThreeObj } from '../Common/Dispose';
import { InputState, KeyWord, MenuDividerKWD } from '../Common/InputState'; import { InputState, KeyWord, MenuDividerKWD } from '../Common/InputState';
import { KeyBoard, KeyCode, MouseKey } from '../Common/KeyEnum'; import { KeyBoard, KeyCode, MouseKey } from '../Common/KeyEnum';
import { BufferGeometryUtils } from '../Geometry/BufferGeometryUtils'; import { BufferGeometryUtils } from '../Geometry/BufferGeometryUtils';
import { isParallelTo } from '../Geometry/GeUtils';
import { CursorMode } from '../GraphicsSystem/Cursor'; import { CursorMode } from '../GraphicsSystem/Cursor';
import { ModalPosition } from '../UI/Components/Modal/ModalsManage'; import { ModalPosition } from '../UI/Components/Modal/ModalsManage';
import { SnapModal } from '../UI/Components/Modal/SnapModal'; import { SnapModal } from '../UI/Components/Modal/SnapModal';
@ -424,6 +425,15 @@ export class GetPointServices implements EditorService
{ {
let retValue = new PromptPointResult(); let retValue = new PromptPointResult();
//如果UCS和视图平行,则不捕捉Z轴
if (isParallelTo(app.m_Viewer.m_CameraCtrl.Direction,
new Vector3().setFromMatrixColumn(app.m_Editor.UCSMatrix, 2)))
{
p.applyMatrix4(app.m_Editor.UCSMatrixInv)
.setZ(0)
.applyMatrix4(app.m_Editor.UCSMatrix);
}
retValue.Status = PromptStatus.OK; retValue.Status = PromptStatus.OK;
retValue.Point = p; retValue.Point = p;

@ -7,7 +7,7 @@ import { MouseKey } from '../Common/KeyEnum';
import { GetEntity } from '../Common/Utils'; import { GetEntity } from '../Common/Utils';
import { Entity } from '../DatabaseServices/Entity'; import { Entity } from '../DatabaseServices/Entity';
import { Line } from '../DatabaseServices/Line'; import { Line } from '../DatabaseServices/Line';
import { SnapPoint } from '../Geometry/GeUtils'; import { isParallelTo, isPerpendicularityTo, SnapPoint } from '../Geometry/GeUtils';
import { DrawMode } from '../GraphicsSystem/PreViewer'; import { DrawMode } from '../GraphicsSystem/PreViewer';
import { commandMachine } from './CommandMachine'; import { commandMachine } from './CommandMachine';
import { Editor, EditorService } from './Editor'; import { Editor, EditorService } from './Editor';
@ -54,6 +54,9 @@ export class GripDragServices implements EditorService
app.m_Editor.Prompt("拽拖开始:"); app.m_Editor.Prompt("拽拖开始:");
commandMachine.CommandStart("drag"); commandMachine.CommandStart("drag");
let oldEnable = app.m_Editor.transCtrl.Enable;
app.m_Editor.transCtrl.Enable = false;
let oldSelect = app.m_Viewer.m_OutlinePass.selectedObjects; let oldSelect = app.m_Viewer.m_OutlinePass.selectedObjects;
app.m_Viewer.m_OutlinePass.selectedObjects = []; app.m_Viewer.m_OutlinePass.selectedObjects = [];
app.m_Viewer.Render(); app.m_Viewer.Render();
@ -93,6 +96,16 @@ export class GripDragServices implements EditorService
for (let data of snapIndexMap) for (let data of snapIndexMap)
{ {
let entDrawP = data.ent.GetGripPoints()[data.indexArr[0]]; let entDrawP = data.ent.GetGripPoints()[data.indexArr[0]];
let viewDir = app.m_Viewer.m_CameraCtrl.Direction;
let z = new Vector3();
if (isParallelTo(viewDir, z.setFromMatrixColumn(app.m_Editor.UCSMatrix, 2)))
{
entDrawP.applyMatrix4(app.m_Editor.UCSMatrixInv)
.setZ(0)
.applyMatrix4(app.m_Editor.UCSMatrix);
}
let vec = p.clone().sub(entDrawP); let vec = p.clone().sub(entDrawP);
data.ent.MoveGripPoints(data.indexArr, vec); data.ent.MoveGripPoints(data.indexArr, vec);
data.ent.DeferUpdate(); data.ent.DeferUpdate();
@ -111,20 +124,38 @@ export class GripDragServices implements EditorService
baseP = snapIndexMap[0].ent.StartPoint; baseP = snapIndexMap[0].ent.StartPoint;
} }
} }
//修改UCS
let oldUcs = app.m_Editor.UCSMatrix; let oldUcs = app.m_Editor.UCSMatrix;
if (snapIndexMap[0] && !(snapIndexMap[0].ent instanceof Line)) if (snapIndexMap[0] && !(snapIndexMap[0].ent instanceof Line))
app.m_Editor.UCSMatrix = snapIndexMap[0].ent.OCS; {
let ocs = snapIndexMap[0].ent.OCS;
let viewDir = app.m_Viewer.m_CameraCtrl.Direction;
let z = new Vector3();
//如果对象坐标系和视图坐标系垂直,则修正坐标系
if (isPerpendicularityTo(z.setFromMatrixColumn(ocs, 2),
viewDir))
{
let xv = z;
let yv = viewDir.clone().cross(xv);
let p = new Vector3().setFromMatrixPosition(ocs);
ocs.makeBasis(xv, yv, viewDir).setPosition(p);
}
app.m_Editor.UCSMatrix = ocs;
}
let ptRes = await app.m_Editor.GetPoint({ let ptRes = await app.m_Editor.GetPoint({
Msg: "指定下一个点:", Msg: "指定下一个点:",
BasePoint: baseP, BasePoint: baseP,
AllowDrawRubberBand: true, AllowDrawRubberBand: true,
Callback: (p) => { DragTo(p, snapIndexMapClone, true) } Callback: (p) => { DragTo(p, snapIndexMapClone, true) }
}); });
app.m_Editor.UCSMatrix = oldUcs;
if (ptRes.Status === PromptStatus.OK) if (ptRes.Status === PromptStatus.OK)
DragTo(ptRes.Point, snapIndexMap); DragTo(ptRes.Point, snapIndexMap);
app.m_Editor.UCSMatrix = oldUcs;
app.m_Viewer.m_OutlinePass.selectedObjects = oldSelect; app.m_Viewer.m_OutlinePass.selectedObjects = oldSelect;
app.m_Editor.transCtrl.Enable = oldEnable;
this.UpdateSnapPoint(); this.UpdateSnapPoint();
this.UpdateSnapDraw(); this.UpdateSnapDraw();

@ -1,8 +1,10 @@
import { Vector3 } from 'three'; import { Curve, Matrix4, Vector3 } from 'three';
import { end } from 'xaop'; import { end } from 'xaop';
import { app } from '../ApplicationServices/Application'; import { app } from '../ApplicationServices/Application';
import { InputState } from '../Common/InputState'; import { InputState } from '../Common/InputState';
import { KeyBoard, KeyCode, MouseKey } from '../Common/KeyEnum'; import { KeyBoard, KeyCode, MouseKey } from '../Common/KeyEnum';
import { GetEntity } from '../Common/Utils';
import { Entity } from '../DatabaseServices/Entity';
import { GetBox } from '../Geometry/GeUtils'; import { GetBox } from '../Geometry/GeUtils';
import { CursorMode } from '../GraphicsSystem/Cursor'; import { CursorMode } from '../GraphicsSystem/Cursor';
import { Viewer } from '../GraphicsSystem/Viewer'; import { Viewer } from '../GraphicsSystem/Viewer';
@ -73,13 +75,23 @@ export class SelectControls implements EditorService
if (this.m_Viewer.m_OutlinePass.selectedObjects.length > 0) if (this.m_Viewer.m_OutlinePass.selectedObjects.length > 0)
{ {
let obj = this.m_Viewer.m_OutlinePass.selectedObjects[0]; let obj = this.m_Viewer.m_OutlinePass.selectedObjects[0];
let mat = obj.matrixWorld.clone();
let ocs: Matrix4;
let ent = GetEntity(obj);
if (ent instanceof Curve)
{
ocs = ent.OCS;
let box = GetBox(obj); let box = GetBox(obj);
if (box.isEmpty()) return; if (!box.isEmpty())
mat.setPosition(box.getCenter(new Vector3())); ocs.setPosition(box.getCenter(new Vector3()));
}
else if (ent instanceof Entity)
ocs = ent.OCS;
else
ocs = obj.matrixWorld.clone();
this.m_Editor.transCtrl.m_Ents = this.SelectSet.SelectEntityList; this.m_Editor.transCtrl.m_Ents = this.SelectSet.SelectEntityList;
this.m_Editor.transCtrl.Matrix = mat; this.m_Editor.transCtrl.Matrix = ocs;
this.m_Editor.transCtrl.Mode = TransMode.Move; this.m_Editor.transCtrl.Mode = TransMode.Move;
this.m_Editor.transCtrl.Enable = true; this.m_Editor.transCtrl.Enable = true;
} }

@ -11,7 +11,7 @@ import { Editor, EditorService } from '../Editor';
import { JigUtils } from '../JigUtils'; import { JigUtils } from '../JigUtils';
import { PointPick } from '../PointPick'; import { PointPick } from '../PointPick';
import { PromptStatus } from '../PromptResult'; import { PromptStatus } from '../PromptResult';
import { MatrixToPreViewMat } from '../UCSServices'; import { MatrixToPreViewMat, UCSPsotion } from '../UCSServices';
import { AxisType } from './CoorAxes'; import { AxisType } from './CoorAxes';
import { RotateAxes } from './RotateAxes'; import { RotateAxes } from './RotateAxes';
import { TranslateAxex } from './TranslateAxes'; import { TranslateAxex } from './TranslateAxes';
@ -154,7 +154,7 @@ export class TransformServicess implements EditorService
{ {
for (let a of this.m_CtrlAxes) for (let a of this.m_CtrlAxes)
{ {
MatrixToPreViewMat(this.m_Matrix, this.m_Editor.m_App.m_Viewer, a); MatrixToPreViewMat(this.m_Matrix, this.m_Editor.m_App.m_Viewer, a, UCSPsotion.Origin);
} }
this.m_Editor.m_App.m_Viewer.m_PreViewer.UpdateScreen(); this.m_Editor.m_App.m_Viewer.m_PreViewer.UpdateScreen();
} }

@ -4,12 +4,19 @@ import { Viewer } from '../GraphicsSystem/Viewer';
import { Editor } from './Editor'; import { Editor } from './Editor';
import { CoorAxes } from './TranstrolControl/CoorAxes'; import { CoorAxes } from './TranstrolControl/CoorAxes';
export enum UCSPsotion
{
Origin = 0,
LeftBottom = 1,
}
//在Editor下的一个服务,提供了UCS轴的显示. //在Editor下的一个服务,提供了UCS轴的显示.
export class UCSServices export class UCSServices
{ {
private m_UCSMatrix: Matrix4 = new Matrix4(); private m_UCSMatrix: Matrix4 = new Matrix4();
private m_Ed: Editor; private m_Ed: Editor;
private m_UcsObj: CoorAxes = new CoorAxes(); private m_UcsObj: CoorAxes = new CoorAxes();
private _DisplayPosition = UCSPsotion.Origin;
constructor(ed: Editor) constructor(ed: Editor)
{ {
this.m_Ed = ed; this.m_Ed = ed;
@ -30,7 +37,7 @@ export class UCSServices
private Update() private Update()
{ {
let view = this.m_Ed.m_App.m_Viewer; let view = this.m_Ed.m_App.m_Viewer;
MatrixToPreViewMat(this.m_Ed.UCSMatrix, view, this.m_UcsObj); MatrixToPreViewMat(this.m_Ed.UCSMatrix, view, this.m_UcsObj, this._DisplayPosition);
} }
get UCSMatrix(): Matrix4 get UCSMatrix(): Matrix4
@ -45,19 +52,23 @@ export class UCSServices
} }
export function MatrixToPreViewMat(mat: Matrix4, view: Viewer, obj: Object3D) export function MatrixToPreViewMat(mat: Matrix4, view: Viewer, obj: Object3D, displayPosition: UCSPsotion)
{ {
if (displayPosition === UCSPsotion.Origin)
{
let p = new Vector3().setFromMatrixColumn(mat, 3); let p = new Vector3().setFromMatrixColumn(mat, 3);
view.WorldToScreen(p); view.WorldToScreen(p);
view.m_PreViewer.ScreenPointToViewerPoint(p); view.m_PreViewer.ScreenPointToViewerPoint(p);
obj.position.copy(p);
if (Math.abs(p.x) > view.Width / 2 || Math.abs(p.y) > view.Height / 2)
obj.position.set(-view.Width / 2 + 180, -view.Height / 2 + 130, 0);
}
else
obj.position.set(-view.Width / 2 + 180, -view.Height / 2 + 130, 0);
let tempMat = new Matrix4().copy(mat); let tempMat = mat.clone();
tempMat.multiplyMatrices(view.Camera.matrixWorldInverse, tempMat); tempMat.multiplyMatrices(view.Camera.matrixWorldInverse, tempMat);
tempMat.multiplyMatrices(view.m_PreViewer.Camera.matrixWorld, tempMat); tempMat.multiplyMatrices(view.m_PreViewer.Camera.matrixWorld, tempMat);
//坐标系显示在坐标系原点的位置.
// obj.position.copy(p);
//坐标系显示在左下角
obj.position.set(-view.Width / 2 + 180, -view.Height / 2 + 130, 0);
obj.quaternion.setFromRotationMatrix(tempMat); obj.quaternion.setFromRotationMatrix(tempMat);
} }

@ -274,7 +274,10 @@ export class Viewer
} }
ZoomAll() ZoomAll()
{ {
this.m_CameraCtrl.ZoomExtensBox3(GetBox(this.m_Scene, true)); let box = GetBox(this.m_Scene, true);
if (box.isEmpty())
box.set(new Vector3(), new Vector3(1000 * (this.Width / this.Height), 1000, 1000));
this.m_CameraCtrl.ZoomExtensBox3(box);
this.Zoom(1.2); this.Zoom(1.2);
this.m_bNeedUpdate = true; this.m_bNeedUpdate = true;
} }

Loading…
Cancel
Save