From eb1d06cb6f9517b362b878796c65256352a04f9b Mon Sep 17 00:00:00 2001 From: ChenX Date: Wed, 31 Jul 2019 11:58:56 +0800 Subject: [PATCH] =?UTF-8?q?fix=20#IXWMX=20=E4=BF=AE=E5=A4=8D=E7=9B=B4?= =?UTF-8?q?=E7=BA=BF=E6=8B=BD=E6=8B=96=E9=94=99=E8=AF=AF=E7=9A=84=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=9B=B8=E5=AF=B9=E5=9F=BA=E7=82=B9(=E4=BF=9D?= =?UTF-8?q?=E8=AF=81=E5=88=87=E7=BA=BF=E6=8D=95=E6=8D=89=E6=AD=A3=E5=B8=B8?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Editor/GripDragServices.ts | 5 +++-- src/Editor/SnapServices.ts | 20 ++++++++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Editor/GripDragServices.ts b/src/Editor/GripDragServices.ts index 52d52a984..654d4ccf9 100644 --- a/src/Editor/GripDragServices.ts +++ b/src/Editor/GripDragServices.ts @@ -118,10 +118,11 @@ export class GripDragServices implements EditorService if (snapIndexMap[0].indexArr.length === 1) { let i = snapIndexMap[0].indexArr[0]; + let snapServices = this.ed.GetPointServices.snapServices; if (i === 0) - baseP = snapIndexMap[0].ent.EndPoint; + snapServices.TanBasePoint = snapIndexMap[0].ent.EndPoint; else if (i === 2) - baseP = snapIndexMap[0].ent.StartPoint; + snapServices.TanBasePoint = snapIndexMap[0].ent.StartPoint; } } diff --git a/src/Editor/SnapServices.ts b/src/Editor/SnapServices.ts index fcd4de6ef..d53ca32e9 100644 --- a/src/Editor/SnapServices.ts +++ b/src/Editor/SnapServices.ts @@ -79,6 +79,9 @@ export class SnapServices private m_IsZAxis = false; private m_SupportSnapPoints: SupportSnapPoint[] = [];//辅助捕捉点WCS private m_UCS: Matrix4; + + /** 切线捕捉时使用的基点 */ + TanBasePoint: Vector3; //开始捕捉 Start(prompt: GetPointPrompt) { @@ -98,7 +101,7 @@ export class SnapServices Entitys: [], }); - //当基点在圆上或者圆弧上的时候,支持切线捕捉 + //#region 当基点在圆上或者圆弧上的时候,支持切线捕捉 let sel = new SelectPick(app.Viewer, app.Viewer.WorldToScreen(prompt.BasePoint.clone())); sel.Select(app.Viewer.VisibleObjects, { filterTypes: [Circle, Arc] }); let cirs = sel.SelectEntityList as (Circle | Arc)[]; @@ -117,6 +120,7 @@ export class SnapServices Point: prompt.BasePoint.clone(), Entitys: ents, }); + //#endregion this.UpdateCrossCursor(); this.m_HasBasePoint = true; @@ -135,6 +139,7 @@ export class SnapServices this.m_DelaySupportSnapId = undefined; } + this.TanBasePoint = undefined; this.m_SupportSnapPoints.length = 0; this.SnapPoint = undefined; this.m_SupportExtLinePts.length = 0; @@ -221,13 +226,15 @@ export class SnapServices let selectEns = PointPick(vcsP, app.Viewer, { filterErase: true }, app.Viewer.VisibleObjects).map(GetEntity).filter(e => e !== undefined); + let viewXform = new Matrix3().setFromMatrix4(app.Viewer.Camera.matrix); + //如果只有切线捕捉 if (this.SnapModeEnable === ObjectSnapMode.Tan && !this.m_HasBasePoint) for (let e of selectEns) { if (e instanceof Circle || e instanceof Arc) { - let sps = e.GetObjectSnapPoints(ObjectSnapMode.Nea, wcsP, baseP); + let sps = e.GetObjectSnapPoints(ObjectSnapMode.Nea, wcsP, baseP, viewXform); for (let p of sps) { @@ -241,9 +248,6 @@ export class SnapServices } } - - let viewXform = new Matrix3().setFromMatrix4(app.Viewer.Camera.matrix); - //#region 实体点捕捉(端点,中点,圆心,垂点,切点) for (let mode of [ ObjectSnapMode.End, @@ -257,7 +261,11 @@ export class SnapServices if ((mode & this.SnapModeEnable) === 0) continue; - let snapData = this.CalcClosestSnapPoint(selectEns, mode, wcsP, vcsP, baseP, viewXform); + let bp = baseP; + if (mode === ObjectSnapMode.Tan && this.TanBasePoint) + bp = this.TanBasePoint; + + let snapData = this.CalcClosestSnapPoint(selectEns, mode, wcsP, vcsP, bp, viewXform); if (snapData.Point) {