Example #1
0
        internal static Point RestrictRange(Rect rect, Point p)
        {
            var x = ConnectorUtilities.RestrictRange(rect.Left, rect.Right, p.X);
            var y = ConnectorUtilities.RestrictRange(rect.Top, rect.Bottom, p.Y);

            return(new Point(x, y));
        }
Example #2
0
        internal static Point RestrictRange(Rect rect, Point p,
                                            double marginX, double marginY)
        {
            var x = ConnectorUtilities.RestrictRange(rect.Left + marginX, rect.Right - marginX, p.X);
            var y = ConnectorUtilities.RestrictRange(rect.Top - marginY, rect.Bottom + marginY, p.Y);

            return(new Point(x, y));
        }
Example #3
0
        public PathFigure ComputePathFigure(Point start, Point end, LineType lineType, double middlePosition,
                                            out double startAngle, out double endAngle)
        {
            var linePoints = ComputeLinePoints(start, end, lineType, middlePosition, out startAngle, out endAngle);
            var pf         = ConnectorUtilities.GetPathFigureFromPoints(linePoints);

            pf.IsFilled = false;
            pf.IsClosed = false;

            return(pf);
        }
        public IEnumerable <Point> ComputeLinePoints(Point start, Point end, LineType lineType, double middlePosition, out double startAngle, out double endAngle)
        {
            ConnectorDocking startPointDocking = (ConnectorDocking)((int)lineType >> 8);
            ConnectorDocking endPointDocking   = (ConnectorDocking)((int)lineType & 0xFF);

            //var pf = ConnectorUtilities.GetPathFigureFromPoints(new Point[] { start, end });

            startAngle = ConnectorUtilities.ComputeAngle(startPointDocking, end - start);
            endAngle   = ConnectorUtilities.ComputeAngle(endPointDocking, end - start);
            return(new[] { start, end });
        }
Example #5
0
 public ConnectorModel(ConnectionType type,
                       IBoundedSketchItemModel from, IBoundedSketchItemModel to,
                       System.Windows.Point connectorStartHint, System.Windows.Point connectorEndHint,
                       ISketchItemContainer container)
 //:base(new Guid())
 {
     ParentNode                  = container;
     _connectionType             = type;
     MiddlePointRelativePosition = 0.5;
     From = from;
     To   = to;
     _myConnectorStrategy = ConnectorUtilities.GetConnectionType(this, _connectionType, connectorStartHint, connectorEndHint);
     Label     = string.Format("{0}->{1}", from.Label, to.Label);
     LineWidth = 1;
     _geometry.Children.Add(_path);
     Initialize();
 }
Example #6
0
        Point ComputeStartPoint(IConnectable firstPoint, IConnectable nextPoint, ref double startPointRelativePos, ref ConnectorDocking docking, ref ulong connectorStartPort)
        {
            var start = _startPointHint;

            if (docking == ConnectorDocking.Undefined)
            {
                start = firstPoint.GetPreferredConnectorStart(start, out startPointRelativePos, out docking, out connectorStartPort);
                if (connectorStartPort == 0)
                {
                    start = ConnectorUtilities.ComputeCenter(nextPoint.Bounds);
                    start = firstPoint.GetPreferredConnectorStart(start, out startPointRelativePos, out docking, out connectorStartPort);
                }
            }
            else
            {
                start = firstPoint.GetConnectorPoint(docking, startPointRelativePos, connectorStartPort);
            }
            return(start);
        }
Example #7
0
        Point ComputeEndPoint(IConnectable firstPoint, IConnectable nextPoint, ref double relativePos, ref ConnectorDocking docking, ref ulong connectorEndPort)
        {
            var end = _endPointHint;

            if (docking == ConnectorDocking.Undefined)
            {
                end = nextPoint.GetPreferredConnectorEnd(end, out relativePos, out docking, out connectorEndPort);
                if (connectorEndPort == 0)
                {
                    nextPoint.GetPreferredConnectorEnd(ConnectorUtilities.ComputeCenter(firstPoint.Bounds),
                                                       out relativePos, out docking, out connectorEndPort);
                }
            }
            else
            {
                end = nextPoint.GetConnectorPoint(docking, relativePos, connectorEndPort);
            }
            return(end);
        }
        void ComputeConnectorLine()
        {
            _myPath.Clear();

            if (_model.StartPointDocking == ConnectorDocking.Undefined &&
                _model.EndPointDocking == ConnectorDocking.Undefined)
            {
                _model.StartPointDocking           = ConnectorDocking.Top;
                _model.StartPointRelativePosition  = 0.20;
                _model.EndPointDocking             = ConnectorDocking.Top;
                _model.EndPointRelativePosition    = 0.80;
                _model.MiddlePointRelativePosition = 0.30;
            }

            _start = ConnectorUtilities.ComputePoint(_model.From.Bounds, _model.StartPointDocking, _model.StartPointRelativePosition);
            _end   = ConnectorUtilities.ComputePoint(_model.To.Bounds, _model.EndPointDocking, _model.EndPointRelativePosition);
            var lt = GetLineTypeFromDocking(_model.EndPointDocking);

            ComputePath(lt, _start, _end, _model.MiddlePointRelativePosition);
        }
 public void Commit(ConnectorDocking movePointDocking, ConnectorDocking otherPointDocking, Point newMovePointPosition, Point newOtherPointPosition, double newDistance)
 {
     if (_moveType == Types.MoveType.MoveStartPoint)
     {
         _model.StartPointDocking          = movePointDocking;
         _model.EndPointDocking            = otherPointDocking;
         _model.StartPointRelativePosition = ConnectorUtilities.ComputeRelativePosition(_model.From.Bounds, newMovePointPosition, _model.StartPointDocking);
         _model.EndPointRelativePosition   = ConnectorUtilities.ComputeRelativePosition(_model.To.Bounds, newOtherPointPosition, _model.EndPointDocking);
     }
     else if (MoveType == Types.MoveType.MoveMiddlePoint)
     {
         _model.MiddlePointRelativePosition = newDistance;
     }
     else if (MoveType == Types.MoveType.MoveEndPoint)
     {
         _model.StartPointDocking          = otherPointDocking;
         _model.EndPointDocking            = movePointDocking;
         _model.StartPointRelativePosition = ConnectorUtilities.ComputeRelativePosition(_model.From.Bounds, newOtherPointPosition, _model.StartPointDocking);
         _model.EndPointRelativePosition   = ConnectorUtilities.ComputeRelativePosition(_model.To.Bounds, newMovePointPosition, _model.EndPointDocking);
     }
 }
Example #10
0
 public void Commit(ConnectorDocking movePointDocking, ConnectorDocking otherPointDocking, Point newMovePointPosition, Point newOtherPointPosition, double newDistance)
 {
     if (_moveType == MoveType.MoveStartPoint)
     {
         _startingFrom.OutgoingDocking = movePointDocking;
         _endingAt.IncomingDocking     = otherPointDocking;
         if (movePointDocking != ConnectorDocking.Undefined)
         {
             _startingFrom.OutgoingRelativePosition = ConnectorUtilities.ComputeRelativePosition(_startingFrom.Bounds, newMovePointPosition, movePointDocking);
         }
         else
         {
             _startingFrom.OutgoingRelativePosition = 0.5;
             _endingAt.IncomingRelativePosition     = 0.5;
             _endingAt.MiddlePosition = 0.5;
         }
         //_model.EndPointRelativePosition = ConnectorUtilities.ComputeRelativePosition(_model.To.Bounds, newOtherPointPosition, _model.EndPointDocking);
     }
     else if (MoveType == MoveType.MoveMiddlePoint)
     {
         _startingFrom.MiddlePosition = newDistance;
     }
     else if (MoveType == MoveType.MoveEndPoint)
     {
         _startingFrom.OutgoingDocking = otherPointDocking;
         _endingAt.IncomingDocking     = movePointDocking;
         if (movePointDocking != ConnectorDocking.Undefined)
         {
             //_model.StartPointRelativePosition = ConnectorUtilities.ComputeRelativePosition(_model.From.Bounds, newOtherPointPosition, _model.StartPointDocking);
             _endingAt.IncomingRelativePosition = ConnectorUtilities.ComputeRelativePosition(_endingAt.Bounds, newMovePointPosition, movePointDocking);
         }
         else
         {
             _startingFrom.OutgoingRelativePosition = 0.5;
             _endingAt.IncomingRelativePosition     = 0.5;
             _endingAt.MiddlePosition = 0.5;
         }
     }
 }
Example #11
0
        public IEnumerable <Point> ComputeLinePoints(Point start, Point end, LineType lineType, double middlePosition,
                                                     out double startAngle, out double endAngle)
        {
            //var lineType = (LineType)((int)startDocking << 8 | (int)endDocking);
            var linePoints = _routingAssistent.GetLinePoints(lineType,
                                                             start, end, middlePosition);

            var inVector = new Vector
            {
                X = linePoints.ElementAt(1).X - linePoints.ElementAt(0).X,
                Y = linePoints.ElementAt(1).Y - linePoints.ElementAt(0).Y
            };

            startAngle = ConnectorUtilities.ComputeAngle(_model.StartPointDocking, inVector);
            var outVector = new Vector
            {
                X = linePoints.Last().X - linePoints.ElementAt(linePoints.Count() - 2).X,
                Y = linePoints.Last().Y - linePoints.ElementAt(linePoints.Count() - 2).Y
            };

            endAngle = ConnectorUtilities.ComputeAngle(_model.EndPointDocking, outVector);
            return(linePoints);
        }
Example #12
0
 public void ComputeDockingDuringMove(Rect rect, Point p, ref ConnectorDocking currentDocking, ref Point lastPos)
 {
     ConnectorUtilities.ComputeDockingDuringMove(rect, p, ref currentDocking, ref lastPos);
 }
 public PathFigure ComputePathFigure(Point start, Point end, LineType lineType, double middlePosition, out double startAngle, out double endAngle)
 {
     return(ConnectorUtilities.GetPathFigureFromPoints(
                ComputeLinePoints(start, end, lineType, middlePosition, out startAngle, out endAngle)));
 }
Example #14
0
        //readonly GeometryGroup _geometry = new GeometryGroup();

        public ConnectorMoveHelper(ConnectorModel connectorModel, IConnectorStrategy parent, Point p)
        {
            _routingStrategy = parent;
            _model           = connectorModel;
            _moveType        = MoveType.MoveTypeNone;
            _startingFrom    = new ToWaypointAdapter(_model, connectorModel.From);
            _endingAt        = new ToWaypointAdapter(_model, connectorModel.To);
            List <double> middlePointInfo = new List <double>()
            {
                _model.MiddlePointRelativePosition
            };
            List <IWaypoint> connectionPoints = new List <IWaypoint> {
                _startingFrom
            };

            connectionPoints.AddRange(_model.Waypoints);
            connectionPoints.Add(_endingAt);

            double[] relativePositions = new double[connectionPoints.Count];
            for (int i = 0; i < relativePositions.Length; i++)
            {
                relativePositions[i] = 0.5;
            }
            relativePositions[0] = _model.StartPointRelativePosition;
            relativePositions[relativePositions.Length - 1] = _model.EndPointRelativePosition;

            middlePointInfo.AddRange(_model.Waypoints.Select <IWaypoint, double>((x) => x.MiddlePosition));

            foreach (var pf in _routingStrategy.ConnectorPath)
            {
                var nrOfSegments = pf.Segments.Count();
                if (ConnectorUtilities.HitLineSegment(p, pf, out int index, out _startPoint, out _endPoint))
                {
                    _distance = middlePointInfo[_pathIndex];
                    _startPointRelativePosition = relativePositions[_pathIndex];
                    _endPointRelativePosition   = relativePositions[_pathIndex + 1];
                    if (index == 0 && nrOfSegments == 1)
                    {
                        var d1 = Point.Subtract(p, _startPoint).Length;
                        var d2 = Point.Subtract(p, _endPoint).Length;
                        _moveType = MoveType.MoveStartPoint;
                        if (d1 > d2)
                        {
                            _moveType = MoveType.MoveEndPoint;
                            //_moveStart = _startPoint;
                        }
                    }
                    else if (index == 0 && nrOfSegments > 1)
                    {
                        _moveType = MoveType.MoveStartPoint;
                        //_moveStart = StartPoint;
                    }
                    else if ((index == 1 && nrOfSegments == 3) || (index == 2 && nrOfSegments == 7) || (index == 3))
                    {
                        _moveType = MoveType.MoveMiddlePoint;
                    }

                    else if (index == 2 || (index == 1 && nrOfSegments == 2) || (index == 6))
                    {
                        _moveType   = MoveType.MoveEndPoint;
                        _startPoint = _endPoint;
                    }

                    _startingFrom = connectionPoints[_pathIndex];
                    _endingAt     = connectionPoints[_pathIndex + 1];
                    break;
                }
                _pathIndex++;
            }
        }
 void ComputePath(LineType lineType, Point start, Point end, double distance)
 {
     _myPath.Clear();
     _myPath.Add(
         ConnectorUtilities.GetPathFigureFromPoints(ComputeLinePoints(start, end, lineType, distance, out _startAngle, out _endAngle)));
 }