public override void MoveSelectedPointsFromStored(DrawContext dc, Vector3d delta) { CadVertex cp = StoreList[0]; if (cp.Selected) { mPointList[0] = cp + delta; mPointList[1] = StoreList[1] + delta; mPointList[2] = StoreList[2] + delta; mPointList[3] = StoreList[3] + delta; mPointList[4] = StoreList[4] + delta; return; } StackArray <CadVertex> vt = default; vt[0] = StoreList[1] - cp; vt[1] = StoreList[2] - cp; vt[2] = StoreList[3] - cp; vt[3] = StoreList[4] - cp; vt.Length = 4; if (vt[0].Norm() < 0.01) { return; } int ai = -1; for (int i = 0; i < 4; i++) { if (StoreList[i + 1].Selected) { ai = i; break; } } if (ai < 0) { return; } int bi = (ai + 1) % 4; int ci = (ai + 2) % 4; int di = (ai + 3) % 4; Vector3d normal = CadMath.CrossProduct(vt[ai].vector, vt[bi].vector); normal = normal.UnitVector(); vt[ai] += delta; CadVertex uva = vt[ai].UnitVector(); CadVertex uvb = vt[bi].UnitVector(); if (!uva.EqualsThreshold(uvb)) { normal = CadMath.CrossProduct(vt[ai].vector, vt[bi].vector); if (normal.IsZero()) { return; } normal = normal.UnitVector(); } CadQuaternion q = CadQuaternion.RotateQuaternion(normal, Math.PI / 2.0); CadQuaternion r = q.Conjugate(); CadQuaternion qp = CadQuaternion.FromPoint(vt[ai].vector); qp = r * qp; qp = qp * q; vt[bi] = (CadVertex)qp.ToPoint(); vt[ci] = -vt[ai]; vt[di] = -vt[bi]; CadVertex tmp; for (int i = 0; i < vt.Length; i++) { tmp = vt[i]; tmp.Selected = false; vt[i] = tmp; } tmp = vt[ai]; tmp.Selected = true; vt[ai] = tmp; mPointList[1] = vt[0] + cp; mPointList[2] = vt[1] + cp; mPointList[3] = vt[2] + cp; mPointList[4] = vt[3] + cp; }
public RulerInfo Capture(DrawContext dc, CadCursor cursor, double range) { RulerInfo ret = default(RulerInfo); Vector3d cwp = dc.DevPointToWorldPoint(cursor.Pos); Vector3d xfaceNormal = dc.DevVectorToWorldVector(cursor.DirX); Vector3d yfaceNormal = dc.DevVectorToWorldVector(cursor.DirY); Vector3d cx = CadMath.CrossPlane(P0, P1, cwp, xfaceNormal); Vector3d cy = CadMath.CrossPlane(P0, P1, cwp, yfaceNormal); if (!cx.IsValid() && !cy.IsValid()) { return(ret); } Vector3d p = VectorExt.InvalidVector3d; double mind = Double.MaxValue; StackArray <Vector3d> vtbl = default; vtbl[0] = cx; vtbl[1] = cy; vtbl.Length = 2; for (int i = 0; i < vtbl.Length; i++) { Vector3d v = vtbl[i]; if (!v.IsValid()) { continue; } Vector3d devv = dc.WorldPointToDevPoint(v); double td = (devv - cursor.Pos).Norm(); if (td < mind) { mind = td; p = v; } } if (!p.IsValid()) { return(ret); } if (mind > range) { return(ret); } ret.IsValid = true; ret.CrossPoint = p; ret.Distance = mind; ret.Ruler = this; return(ret); }
private void CheckSeg(DrawContext dc, CadLayer layer, FigureSegment fseg) { CadFigure fig = fseg.Figure; int idxA = fseg.Index0; int idxB = fseg.Index1; Vector3d a = fseg.Point0.vector; Vector3d b = fseg.Point1.vector; if (fig.StoreList != null && fig.StoreList.Count > 1) { if (!CheckStorePoint) { return; } a = fseg.StoredPoint0.vector; b = fseg.StoredPoint1.vector; } Vector3d cwp = dc.DevPointToWorldPoint(Target.Pos); Vector3d xfaceNormal = dc.DevVectorToWorldVector(Target.DirX); Vector3d yfaceNormal = dc.DevVectorToWorldVector(Target.DirY); Vector3d cx = CadMath.CrossSegPlane(a, b, cwp, xfaceNormal); Vector3d cy = CadMath.CrossSegPlane(a, b, cwp, yfaceNormal); if (!cx.IsValid() && !cy.IsValid()) { return; } Vector3d p = VectorExt.InvalidVector3d; double mind = double.MaxValue; Vector3d dcenter = dc.WorldPointToDevPoint(CadMath.CenterPoint(a, b)); double centerDist = (dcenter - Target.Pos).Norm(); if (CheckPriority == Priority.NONE || centerDist < Range) { StackArray <Vector3d> vtbl = default; vtbl[0] = cx; vtbl[1] = cy; vtbl.Length = 2; for (int i = 0; i < vtbl.Length; i++) { Vector3d v = vtbl[i]; if (!v.IsValid()) { continue; } Vector3d devv = dc.WorldPointToDevPoint(v); double td = (devv - Target.Pos).Norm(); if (td < mind) { mind = td; p = v; } } } else { if (CheckPriority == Priority.PRIORITY_X) { p = cx; } else if (CheckPriority == Priority.PRIORITY_Y) { p = cy; } if (p.IsInvalid()) { return; } Vector3d devv = dc.WorldPointToDevPoint(p); mind = (devv - Target.Pos).Norm(); } if (!p.IsValid()) { return; } if (mind > Range) { return; } if (mind < MinDist) { MarkSeg.Layer = layer; MarkSeg.FigSeg = fseg; MarkSeg.CrossPoint = p; MarkSeg.CrossPointScrn = dc.WorldPointToDevPoint(p); MarkSeg.Distance = mind; MinDist = mind; } }