Esempio n. 1
0
        private void ShowAdditionalLinesY(Canvas canvas, List <TargetInfo> allYTargetInfos)
        {
            if (allYTargetInfos.Count > 1)
            {
                var additionalAlignments = allYTargetInfos
                                           .GroupBy(ti => ti.TargetVertex)
                                           .Select(g => g.MinBy(ti => Math.Abs(ti.TargetVertex.Y - ti.SnapPoint.Y)))
                                           .Skip(1);

                foreach (var source in additionalAlignments)
                {
                    var guideLine = CreateGuideLine();
                    guideLine.StartPoint = source.SnapPoint;
                    guideLine.EndPoint   = source.TargetVertex;
                    guideLine.IsVisible  = true;

                    _guideLines.Add(guideLine);
                    canvas.AddAdornerFigure(guideLine);
                }
            }
        }
Esempio n. 2
0
        public override void OnDragStart(Canvas canvas, float startPosX, float startPosY, float dx, float dy, bool isShiftKey,
                                         bool isCtrlKey)
        {
            var hitFigure = canvas.GetBestFigure(startPosX, startPosY, new List <Type> {
                typeof(Selectionbox)
            },
                                                 new List <Type>());

            if (hitFigure != null && hitFigure.IsSelectable)
            {
                base.OnDragStart(canvas, startPosX, startPosY, dx, dy, isShiftKey, isCtrlKey);
                return;
            }

            _x = startPosX;
            _y = startPosY;

            //Console.WriteLine($"Drag start: {_x}, {_y}");
            _selectBox           = new Selectionbox(_x, _y, 10, 10);
            _selectBox.FillColor = Colors.Black.AdjustOpacity(0.2);
            _absoluteBoundingBox = _selectBox.BoundingBox.Clone();

            canvas.AddAdornerFigure(_selectBox);
        }
Esempio n. 3
0
 public void Show(Canvas canvas)
 {
     canvas.AddAdornerFigure(this);
     BringToFront();
 }
Esempio n. 4
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);
        }