public void TrySnapConnectCrvToRectShape(ICanvas canvas, IConnectionCurve crv) { if (crv == null) { return; } List <IDrawObject> allSelectObjs = GetHitObjects(canvas, ((IDrawObject)crv).GetBoundingRect(canvas), true); foreach (var curObj in allSelectObjs) { DrawTools.RectBase rectBase = curObj as DrawTools.RectBase; if (rectBase == null) { continue; } DrawTools.RectBase.eVertexId vid = rectBase.GetVertexIdFromPoint(crv.StartPoint.GetPosition()); if (vid != DrawTools.RectBase.eVertexId.None) { rectBase.AttachConnectionCrvNode(crv.StartPoint); } vid = rectBase.GetVertexIdFromPoint(crv.EndPoint.GetPosition()); if (vid != DrawTools.RectBase.eVertexId.None) { rectBase.AttachConnectionCrvNode(crv.EndPoint); } } }
public eDrawObjectMouseDown OnMouseDown(ICanvas canvas, UnitPoint point, ISnapPoint snappoint) { if (snappoint is SnapPointBase && snappoint.Owner is RectBase) { NodePointMultiConnectionLine.ePoint pointType = HitUtil.Distance(point, m_p1) < HitUtil.Distance(point, m_p2) ? NodePointMultiConnectionLine.ePoint.P1 : NodePointMultiConnectionLine.ePoint.P2; RectBase rect = snappoint.Owner as RectBase; rect.AttachConnectionCrvNode(new NodePointMultiConnectionLine(this, pointType)); if (pointType == NodePointMultiConnectionLine.ePoint.P1) { m_p1 = point; } else { m_p2 = point; } return(eDrawObjectMouseDown.Done); } OnMouseMove(canvas, point); Selected = false; if (m_allPts == null || m_allPts.Count < 2) { return(eDrawObjectMouseDown.Cancel); } return(eDrawObjectMouseDown.Done); }
public eDrawObjectMouseDown OnMouseDown(ICanvas canvas, UnitPoint point, ISnapPoint snappoint) { Selected = false; OnMouseMove(canvas, point); if (snappoint is PerpendicularSnapPoint && snappoint.Owner is Line) { Line src = snappoint.Owner as Line; m_p2 = HitUtil.NearestPointOnLine(src.P1, src.P2, m_p1, true); return(eDrawObjectMouseDown.DoneRepeat); } if (snappoint is PerpendicularSnapPoint && snappoint.Owner is Arc) { Arc src = snappoint.Owner as Arc; m_p2 = HitUtil.NearestPointOnCircle(src.Center, src.Radius, m_p1, 0); return(eDrawObjectMouseDown.DoneRepeat); } if (snappoint is SnapPointBase && snappoint.Owner is RectBase) { NodePointCubicBezier.ePoint pointType = HitUtil.Distance(point, m_p1) < HitUtil.Distance(point, m_p2) ? NodePointCubicBezier.ePoint.P1 : NodePointCubicBezier.ePoint.P2; RectBase rect = snappoint.Owner as RectBase; rect.AttachConnectionCrvNode(new NodePointCubicBezier(this, pointType)); if (pointType == NodePointCubicBezier.ePoint.P1) { m_p1 = point; } else { m_p2 = point; } UpdateCtrlPts(); return(eDrawObjectMouseDown.Done); } if (Control.ModifierKeys == Keys.Control) { point = HitUtil.OrthoPointD(m_p1, point, 45); } m_p2 = point; UpdateCtrlPts(); return(eDrawObjectMouseDown.Done); }