示例#1
0
        /// <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);
        }
示例#2
0
        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();
        }
示例#3
0
        /// <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);
        }
示例#4
0
 public Connection(ConnectionRouter router, Point startPoint, Point endPoint)
     : base(startPoint, endPoint)
 {
     Router = router;
     router.Reroute(this);
 }