/// <summary> /// Snap to grid points of the canvas grid. /// </summary> /// <returns>True, if there was a snap. Grid snap always finds a snap.</returns> /// <remarks>Do not rely on the delta and snapPoint results if there was no snap.</remarks> public bool Snap(Canvas canvas, Point figurePos, float dx, float dy, float dxSum, float dySum, out Point snapPosition, out Point delta, IEnumerable <Figure> blackList) { delta = new Point(dx, dy); snapPosition = figurePos + new Point(dx, dy); if (_startSnapPoints.Count == 0) { return(false); } var isFirst = true; var dist = new Point(dxSum, dySum); for (int i = 0; i < _startSnapPoints.Count(); i++) { //Console.WriteLine("SnapPoint:" + _startSnapPoints[i]); var newPos = _startSnapPoints[i] + dist; var nearestGridPoint = canvas.Grid.GetNearestPoint(newPos); //Check for new minimum delta. if (isFirst) { isFirst = false; delta = nearestGridPoint - _ghostSnapPoints[i]; snapPosition = nearestGridPoint; } else if ((nearestGridPoint - _ghostSnapPoints[i]).SquareLength < delta.SquareLength) { delta = nearestGridPoint - _ghostSnapPoints[i]; snapPosition = nearestGridPoint; } } _snapPointCross.ForceSetPositionOfCenter(snapPosition.X, snapPosition.Y); _snapPointCross.IsVisible = true; _snapPointCross.BringToFront(); //Update the ghost snap points. foreach (var ghostSnapPoint in _ghostSnapPoints) { ghostSnapPoint.Translate(delta.X, delta.Y); } return(true); }
public override void Render(DrawingContext dc) { var brush = new SolidColorBrush(StrokeColor); brush.Freeze(); var formattedtext = new FormattedText(Message, System.Globalization.CultureInfo.GetCultureInfo(CultureInfo), Direction, new Typeface(Font), FontSize, brush); formattedtext.MaxTextWidth = Width; formattedtext.MaxTextHeight = Height; var screenPoint = Canvas.CoordinateSystem.ToScreenSpace(Position); var offset = new Point((float)(screenPoint[0] - X), (float)(screenPoint[1] - Y - Height)); dc.PushTransform(new TranslateTransform(offset.X, offset.Y)); dc.DrawText(formattedtext, new Point(X, Y)); dc.Pop(); }
/// <summary> /// Snaps to Element snap points. /// </summary> /// <returns>True, if there was a snap.</returns> /// <remarks>Do not rely on the delta and snapPoint results if there was no snap.</remarks> public bool Snap(Canvas canvas, Point figurePos, float dx, float dy, float dxSum, float dySum, out Point snapPosition, out Point delta, IEnumerable <Figure> blackList) { DeleteGuideLines(canvas); snapPosition = new Point(dxSum, dySum); if (_startSnapPoints.Count == 0) { delta = new Point(dx, dy); return(false); } var sumDelta = new Point(dxSum, dySum); delta = new Point(dx, dy); var targetInfos = new List <TargetInfo>(); for (int i = 0; i < _startSnapPoints.Count; i++) { var newPosition = _startSnapPoints[i] + sumDelta; var nearestXNeighbour = canvas.SnapCluster.GetXNodes(newPosition.X, _blacklist) .OrderBy(n => Math.Abs(newPosition.Y - n.Point.Y)) .FirstOrDefault(); if (nearestXNeighbour != null) { targetInfos.Add(new TargetInfo() { SnapPoint = new Point(nearestXNeighbour.Position, _ghostSnapPoints[i].Y), SourcePoint = _ghostSnapPoints[i].Clone(), TargetVertex = nearestXNeighbour.Point.Clone() }); } var nearestYNeighbour = canvas.SnapCluster.GetYNodes(newPosition.Y, _blacklist) .OrderBy(n => Math.Abs(newPosition.X - n.Point.X)) .FirstOrDefault(); if (nearestYNeighbour != null) { targetInfos.Add(new TargetInfo() { SnapPoint = new Point(_ghostSnapPoints[i].X, nearestYNeighbour.Position), SourcePoint = _ghostSnapPoints[i].Clone(), TargetVertex = nearestYNeighbour.Point.Clone() }); } } if (targetInfos.Count == 0) { foreach (var ghostSnapPoint in _ghostSnapPoints) { ghostSnapPoint.Translate(delta.X, delta.Y); } return(false); } var orderedTargetsX = targetInfos.Where(ti => ti.IsInXDirection) .OrderBy(ti => Math.Abs(ti.SourcePoint.X - ti.SnapPoint.X)) .ThenBy(ti => Math.Abs(ti.SourcePoint.X - ti.TargetVertex.X)) .ToList(); var orderedTargetsY = targetInfos.Where(ti => !ti.IsInXDirection) .OrderBy(ti => Math.Abs(ti.SourcePoint.Y - ti.SnapPoint.Y)) .ThenBy(ti => Math.Abs(ti.SourcePoint.Y - ti.TargetVertex.Y)) .ToList(); TargetInfo minTargetX = null; if (orderedTargetsX.Any()) { minTargetX = orderedTargetsX.First(); } TargetInfo minTargetY = null; if (orderedTargetsY.Any()) { minTargetY = orderedTargetsY.First(); //Console.WriteLine(minY.SourcePoint); } if (minTargetX != null) { delta.Y = minTargetX.SnapPoint.Y - minTargetX.SourcePoint.Y; snapPosition.Y = minTargetX.SnapPoint.Y; } if (minTargetY != null) { delta.X = minTargetY.SnapPoint.X - minTargetY.SourcePoint.X; snapPosition.X = minTargetY.SnapPoint.X; } //Console.WriteLine("snapPosition: " + snapPosition); foreach (var ghostSnapPoint in _ghostSnapPoints) { ghostSnapPoint.Translate(delta.X, delta.Y); } if (minTargetX != null) { if (ShowAdditionalLines) { ShowAdditionalLinesX(canvas, orderedTargetsX); } var guideLine = CreateGuideLine(); //guideLine.StrokeColor = Colors.CornflowerBlue; guideLine.StartPoint = minTargetX.SnapPoint; guideLine.EndPoint = minTargetX.TargetVertex; guideLine.IsVisible = true; _guideLines.Add(guideLine); canvas.AddAdornerFigure(guideLine); } if (minTargetY != null) { if (ShowAdditionalLines) { ShowAdditionalLinesY(canvas, orderedTargetsY); } var guideLine = CreateGuideLine(); //guideLine.StrokeColor = Colors.CornflowerBlue; guideLine.StartPoint = minTargetY.SnapPoint; guideLine.EndPoint = minTargetY.TargetVertex; guideLine.IsVisible = true; //Console.WriteLine(guideLine); _guideLines.Add(guideLine); canvas.AddAdornerFigure(guideLine); } return(true); }
public Connection(ConnectionRouter router, Point startPoint, Point endPoint) : base(startPoint, endPoint) { Router = router; router.Reroute(this); }