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 { KeyBoard, KeyCode, MouseKey } from '../Common/KeyEnum';
import { BufferGeometryUtils } from '../Geometry/BufferGeometryUtils';
import { isParallelTo } from '../Geometry/GeUtils';
import { CursorMode } from '../GraphicsSystem/Cursor';
import { ModalPosition } from '../UI/Components/Modal/ModalsManage';
import { SnapModal } from '../UI/Components/Modal/SnapModal';
@ -424,6 +425,15 @@ export class GetPointServices implements EditorService
{
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.Point = p;

@ -7,7 +7,7 @@ import { MouseKey } from '../Common/KeyEnum';
import { GetEntity } from '../Common/Utils';
import { Entity } from '../DatabaseServices/Entity';
import { Line } from '../DatabaseServices/Line';
import { SnapPoint } from '../Geometry/GeUtils';
import { isParallelTo, isPerpendicularityTo, SnapPoint } from '../Geometry/GeUtils';
import { DrawMode } from '../GraphicsSystem/PreViewer';
import { commandMachine } from './CommandMachine';
import { Editor, EditorService } from './Editor';
@ -54,6 +54,9 @@ export class GripDragServices implements EditorService
app.m_Editor.Prompt("拽拖开始:");
commandMachine.CommandStart("drag");
let oldEnable = app.m_Editor.transCtrl.Enable;
app.m_Editor.transCtrl.Enable = false;
let oldSelect = app.m_Viewer.m_OutlinePass.selectedObjects;
app.m_Viewer.m_OutlinePass.selectedObjects = [];
app.m_Viewer.Render();
@ -93,6 +96,16 @@ export class GripDragServices implements EditorService
for (let data of snapIndexMap)
{
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);
data.ent.MoveGripPoints(data.indexArr, vec);
data.ent.DeferUpdate();
@ -111,20 +124,38 @@ export class GripDragServices implements EditorService
baseP = snapIndexMap[0].ent.StartPoint;
}
}
//修改UCS
let oldUcs = app.m_Editor.UCSMatrix;
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({
Msg: "指定下一个点:",
BasePoint: baseP,
AllowDrawRubberBand: true,
Callback: (p) => { DragTo(p, snapIndexMapClone, true) }
});
app.m_Editor.UCSMatrix = oldUcs;
if (ptRes.Status === PromptStatus.OK)
DragTo(ptRes.Point, snapIndexMap);
app.m_Editor.UCSMatrix = oldUcs;
app.m_Viewer.m_OutlinePass.selectedObjects = oldSelect;
app.m_Editor.transCtrl.Enable = oldEnable;
this.UpdateSnapPoint();
this.UpdateSnapDraw();

@ -1,8 +1,10 @@
import { Vector3 } from 'three';
import { Curve, Matrix4, Vector3 } from 'three';
import { end } from 'xaop';
import { app } from '../ApplicationServices/Application';
import { InputState } from '../Common/InputState';
import { KeyBoard, KeyCode, MouseKey } from '../Common/KeyEnum';
import { GetEntity } from '../Common/Utils';
import { Entity } from '../DatabaseServices/Entity';
import { GetBox } from '../Geometry/GeUtils';
import { CursorMode } from '../GraphicsSystem/Cursor';
import { Viewer } from '../GraphicsSystem/Viewer';
@ -73,13 +75,23 @@ export class SelectControls implements EditorService
if (this.m_Viewer.m_OutlinePass.selectedObjects.length > 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);
if (box.isEmpty()) return;
mat.setPosition(box.getCenter(new Vector3()));
if (!box.isEmpty())
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.Matrix = mat;
this.m_Editor.transCtrl.Matrix = ocs;
this.m_Editor.transCtrl.Mode = TransMode.Move;
this.m_Editor.transCtrl.Enable = true;
}

@ -11,7 +11,7 @@ import { Editor, EditorService } from '../Editor';
import { JigUtils } from '../JigUtils';
import { PointPick } from '../PointPick';
import { PromptStatus } from '../PromptResult';
import { MatrixToPreViewMat } from '../UCSServices';
import { MatrixToPreViewMat, UCSPsotion } from '../UCSServices';
import { AxisType } from './CoorAxes';
import { RotateAxes } from './RotateAxes';
import { TranslateAxex } from './TranslateAxes';
@ -154,7 +154,7 @@ export class TransformServicess implements EditorService
{
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();
}

@ -4,12 +4,19 @@ import { Viewer } from '../GraphicsSystem/Viewer';
import { Editor } from './Editor';
import { CoorAxes } from './TranstrolControl/CoorAxes';
export enum UCSPsotion
{
Origin = 0,
LeftBottom = 1,
}
//在Editor下的一个服务,提供了UCS轴的显示.
export class UCSServices
{
private m_UCSMatrix: Matrix4 = new Matrix4();
private m_Ed: Editor;
private m_UcsObj: CoorAxes = new CoorAxes();
private _DisplayPosition = UCSPsotion.Origin;
constructor(ed: Editor)
{
this.m_Ed = ed;
@ -30,7 +37,7 @@ export class UCSServices
private Update()
{
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
@ -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);
view.WorldToScreen(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.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);
}

@ -274,7 +274,10 @@ export class Viewer
}
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.m_bNeedUpdate = true;
}

Loading…
Cancel
Save