private Point GetSideMidpoint(Point loc, INode node)
        {
            var outerFrame = node.OuterFrame;
            var bounds     = node.Bounds;
            var dir        = RectUtil.GetNearestLineDirection(bounds, loc);
            var center     = RectUtil.GetCenter(bounds);

            if (EnumUtil.HasAllFlags((int)dir, (int)Mkamo.Common.DataType.Directions.Left))
            {
                return(outerFrame.GetNearestPoint(new Point(bounds.Left, center.Y)));
            }
            else if (EnumUtil.HasAllFlags((int)dir, (int)Mkamo.Common.DataType.Directions.Right))
            {
                return(outerFrame.GetNearestPoint(new Point(bounds.Right, center.Y)));
            }
            else if (EnumUtil.HasAllFlags((int)dir, (int)Mkamo.Common.DataType.Directions.Up))
            {
                return(outerFrame.GetNearestPoint(new Point(center.X, bounds.Top)));
            }
            else
            {
                /// } else if (EnumUtil.HasFlag((int) dir, (int) Mkamo.Common.DataType.Directions.Left)) {
                return(outerFrame.GetNearestPoint(new Point(center.X, bounds.Bottom)));
            }
        }
Example #2
0
        // === AbstractConnectableNode ==========
        protected virtual Point GetExpectedConnectLocationForConnectedAnchor(
            IAnchor anchor, Rectangle oldBounds, Rectangle newBounds
            )
        {
            var locDelta = newBounds.Location - (Size)oldBounds.Location;

            var newAnchorX = anchor.Location.X + locDelta.X;

            newAnchorX = Math.Min(newAnchorX, newBounds.Right - 1);

            var newAnchorY = anchor.Location.Y + locDelta.Y;

            newAnchorY = Math.Min(newAnchorY, newBounds.Bottom - 1);

            var dir = RectUtil.GetNearestLineDirection(oldBounds, anchor.Location);

            if (EnumUtil.HasAllFlags((int)dir, (int)Directions.Left))
            {
                return(new Point(newBounds.Left, newAnchorY));
            }
            if (EnumUtil.HasAllFlags((int)dir, (int)Directions.Right))
            {
                return(new Point(newBounds.Right - 1, newAnchorY));
            }
            if (EnumUtil.HasAllFlags((int)dir, (int)Directions.Up))
            {
                return(new Point(newAnchorX, newBounds.Top));
            }
            if (EnumUtil.HasAllFlags((int)dir, (int)Directions.Down))
            {
                return(new Point(newAnchorX, newBounds.Bottom - 1));
            }

            throw new ArgumentException();
        }
Example #3
0
        private Point[] TargetConnected(IEdge edge)
        {
            var tgt    = edge.Target;
            var srcLoc = GetSourceLocation(edge); //edge.SourceAnchor.Location;
            var tgtLoc = GetTargetLocation(edge); // edge.TargetAnchor.Location;

            var tgtDir = RectUtil.GetNearestLineDirection(tgt.Bounds, tgtLoc);

            var bendPts = default(Point[]);

            if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Left))
            {
                var angle          = 180;
                var tgtTopLeft     = new Point(tgt.Right, tgt.Bottom);
                var tgtBottomRight = new Point(tgt.Left, tgt.Top);
                bendPts = SourceConnectedBase(tgtLoc, srcLoc, tgtTopLeft, tgtBottomRight, angle);
            }
            else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Right))
            {
                var angle          = 0;
                var tgtTopLeft     = tgt.Location;
                var tgtBottomRight = new Point(tgt.Right, tgt.Bottom);
                bendPts = SourceConnectedBase(tgtLoc, srcLoc, tgtTopLeft, tgtBottomRight, angle);
            }
            else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Up))
            {
                var angle          = 90;
                var tgtTopLeft     = new Point(tgt.Left, tgt.Bottom);
                var tgtBottomRight = new Point(tgt.Right, tgt.Top);
                bendPts = SourceConnectedBase(tgtLoc, srcLoc, tgtTopLeft, tgtBottomRight, angle);
            }
            else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Down))
            {
                var angle          = 270;
                var tgtTopLeft     = new Point(tgt.Right, tgt.Top);
                var tgtBottomRight = new Point(tgt.Left, tgt.Bottom);
                bendPts = SourceConnectedBase(tgtLoc, srcLoc, tgtTopLeft, tgtBottomRight, angle);
            }

            return(bendPts.Reverse().ToArray());
        }
Example #4
0
        private Point[] SourceConnected(IEdge edge)
        {
            var src    = edge.Source;
            var srcLoc = GetSourceLocation(edge); //edge.SourceAnchor.Location;
            var tgtLoc = GetTargetLocation(edge); // edge.TargetAnchor.Location;

            var srcDir = RectUtil.GetNearestLineDirection(src.Bounds, srcLoc);

            var bendPts = default(Point[]);

            if (EnumUtil.HasAllFlags((int)srcDir, (int)Directions.Left))
            {
                var angle          = 180;
                var srcTopLeft     = new Point(src.Right, src.Bottom);
                var srcBottomRight = new Point(src.Left, src.Top);
                bendPts = SourceConnectedBase(srcLoc, tgtLoc, srcTopLeft, srcBottomRight, angle);
            }
            else if (EnumUtil.HasAllFlags((int)srcDir, (int)Directions.Right))
            {
                var angle          = 0;
                var srcTopLeft     = src.Location;
                var srcBottomRight = new Point(src.Right, src.Bottom);
                bendPts = SourceConnectedBase(srcLoc, tgtLoc, srcTopLeft, srcBottomRight, angle);
            }
            else if (EnumUtil.HasAllFlags((int)srcDir, (int)Directions.Up))
            {
                var angle          = 90;
                var srcTopLeft     = new Point(src.Left, src.Bottom);
                var srcBottomRight = new Point(src.Right, src.Top);
                bendPts = SourceConnectedBase(srcLoc, tgtLoc, srcTopLeft, srcBottomRight, angle);
            }
            else if (EnumUtil.HasAllFlags((int)srcDir, (int)Directions.Down))
            {
                var angle          = 270;
                var srcTopLeft     = new Point(src.Right, src.Top);
                var srcBottomRight = new Point(src.Left, src.Bottom);
                bendPts = SourceConnectedBase(srcLoc, tgtLoc, srcTopLeft, srcBottomRight, angle);
            }

            return(bendPts);
        }
Example #5
0
        private Point[] BothConnected(IEdge edge)
        {
            var src    = edge.Source;
            var srcLoc = GetSourceLocation(edge); //edge.SourceAnchor.Location;

            var tgt    = edge.Target;
            var tgtLoc = GetTargetLocation(edge); // edge.TargetAnchor.Location;

            var srcDir = RectUtil.GetNearestLineDirection(src.Bounds, srcLoc);
            var tgtDir = RectUtil.GetNearestLineDirection(tgt.Bounds, tgtLoc);

            var bendPts = default(Point[]);

            if (EnumUtil.HasAllFlags((int)srcDir, (int)Directions.Left))
            {
                var angle          = 180;
                var srcTopLeft     = new Point(src.Right, src.Bottom);
                var srcBottomRight = new Point(src.Left, src.Top);
                var tgtTopLeft     = new Point(tgt.Right, tgt.Bottom);
                var tgtBottomRight = new Point(tgt.Left, tgt.Top);

                if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Right))
                {
                    /// 横同士,向き合う方向
                    bendPts = FacedDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
                else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Left))
                {
                    /// 横同士,同じ方向
                    bendPts = SameDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
                else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Up))
                {
                    bendPts = LeftBendingDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
                else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Down))
                {
                    bendPts = RightBendingDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
            }
            else if (EnumUtil.HasAllFlags((int)srcDir, (int)Directions.Right))
            {
                var angle          = 0;
                var srcTopLeft     = src.Location;
                var srcBottomRight = new Point(src.Right, src.Bottom);
                var tgtTopLeft     = tgt.Location;
                var tgtBottomRight = new Point(tgt.Right, tgt.Bottom);

                if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Left))
                {
                    /// 横同士,向き合う方向
                    bendPts = FacedDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
                else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Right))
                {
                    /// 横同士,同じ方向
                    bendPts = SameDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
                else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Up))
                {
                    bendPts = RightBendingDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
                else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Down))
                {
                    bendPts = LeftBendingDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
            }
            else if (EnumUtil.HasAllFlags((int)srcDir, (int)Directions.Up))
            {
                var angle          = 90;
                var srcTopLeft     = new Point(src.Left, src.Bottom);
                var srcBottomRight = new Point(src.Right, src.Top);
                var tgtTopLeft     = new Point(tgt.Left, tgt.Bottom);
                var tgtBottomRight = new Point(tgt.Right, tgt.Top);

                if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Down))
                {
                    /// 縦同士,向き合う方向
                    bendPts = FacedDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
                else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Up))
                {
                    /// 縦同士,同じ方向
                    bendPts = SameDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
                else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Left))
                {
                    bendPts = RightBendingDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
                else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Right))
                {
                    bendPts = LeftBendingDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
            }
            else if (EnumUtil.HasAllFlags((int)srcDir, (int)Directions.Down))
            {
                var angle          = 270;
                var srcTopLeft     = new Point(src.Right, src.Top);
                var srcBottomRight = new Point(src.Left, src.Bottom);
                var tgtTopLeft     = new Point(tgt.Right, tgt.Top);
                var tgtBottomRight = new Point(tgt.Left, tgt.Bottom);

                if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Up))
                {
                    /// 縦同士,向き合う方向
                    bendPts = FacedDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
                else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Down))
                {
                    /// 縦同士,同じ方向
                    bendPts = SameDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
                else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Left))
                {
                    bendPts = LeftBendingDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
                else if (EnumUtil.HasAllFlags((int)tgtDir, (int)Directions.Right))
                {
                    bendPts = RightBendingDirection(
                        srcLoc,
                        tgtLoc,
                        srcTopLeft,
                        srcBottomRight,
                        tgtTopLeft,
                        tgtBottomRight,
                        angle
                        );
                }
            }

            return(bendPts);
        }
Example #6
0
        public Point GetConnectionPoint(IAnchor anchor, INode node, Point location)
        {
            var outerFrame = node.OuterFrame;

            switch (_connectionMethod)
            {
            case ConnectionMethodKind.Intersect: {
                var nextLoc = anchor.Kind == ConnectionAnchorKind.Source?
                              FirstRef.Next.EdgePoint:
                              LastRef.Prev.EdgePoint;
                var line = new Line(location, nextLoc);
                if (outerFrame.IntersectsWith(line))
                {
                    return(outerFrame.GetIntersectionPoint(line));
                }
                else
                {
                    /// 交わってなければ仕方がないのでNearestを返しておく
                    return(outerFrame.GetNearestPoint(line.Start));
                }
            }

            case ConnectionMethodKind.UpperSideMidpoint: {
                var bounds = node.Bounds;
                var center = RectUtil.GetCenter(bounds);
                return(anchor.Kind == ConnectionAnchorKind.Source ?
                       outerFrame.GetNearestPoint(new Point(center.X, bounds.Top)):
                       outerFrame.GetNearestPoint(new Point(center.X, bounds.Bottom)));
            }

            case ConnectionMethodKind.LowerSideMidpoint: {
                var bounds = node.Bounds;
                var center = RectUtil.GetCenter(bounds);
                return(anchor.Kind == ConnectionAnchorKind.Source ?
                       outerFrame.GetNearestPoint(new Point(center.X, bounds.Bottom)):
                       outerFrame.GetNearestPoint(new Point(center.X, bounds.Top)));
            }

            case ConnectionMethodKind.LeftSideMidpoint: {
                var bounds = node.Bounds;
                var center = RectUtil.GetCenter(bounds);
                return(anchor.Kind == ConnectionAnchorKind.Source ?
                       outerFrame.GetNearestPoint(new Point(bounds.Left, center.Y)):
                       outerFrame.GetNearestPoint(new Point(bounds.Right, center.Y)));
            }

            case ConnectionMethodKind.RightSideMidpoint: {
                var bounds = node.Bounds;
                var center = RectUtil.GetCenter(bounds);
                return(anchor.Kind == ConnectionAnchorKind.Source ?
                       outerFrame.GetNearestPoint(new Point(bounds.Right, center.Y)):
                       outerFrame.GetNearestPoint(new Point(bounds.Left, center.Y)));
            }

            case ConnectionMethodKind.SideMidpointOfOpposite: {
                var oppositeLoc = anchor.Kind == ConnectionAnchorKind.Source?
                                  LastRef.EdgePoint:
                                  FirstRef.EdgePoint;
                var bounds = node.Bounds;
                var dir    = RectUtil.GetDirectionStraightlyFromCenter(bounds, oppositeLoc);
                var center = RectUtil.GetCenter(bounds);
                if (EnumUtil.HasAllFlags((int)dir, (int)Mkamo.Common.DataType.Directions.Left))
                {
                    return(outerFrame.GetNearestPoint(new Point(bounds.Left, center.Y)));
                }
                else if (EnumUtil.HasAllFlags((int)dir, (int)Mkamo.Common.DataType.Directions.Right))
                {
                    return(outerFrame.GetNearestPoint(new Point(bounds.Right, center.Y)));
                }
                else if (EnumUtil.HasAllFlags((int)dir, (int)Mkamo.Common.DataType.Directions.Up))
                {
                    return(outerFrame.GetNearestPoint(new Point(center.X, bounds.Top)));
                }
                else
                {
                    /// } else if (EnumUtil.HasFlag((int) dir, (int) Mkamo.Common.DataType.Directions.Left)) {
                    return(outerFrame.GetNearestPoint(new Point(center.X, bounds.Bottom)));
                }
            }

            case ConnectionMethodKind.SideMidpointOfNearest: {
                //var nearestLoc = outerFrame.GetNearestPoint(location);
                var bounds = node.Bounds;
                //var dir = RectUtil.GetDirectionStraightlyFromCenter(bounds, nearestLoc);
                var dir    = RectUtil.GetNearestLineDirection(bounds, location);
                var center = RectUtil.GetCenter(bounds);
                if (EnumUtil.HasAllFlags((int)dir, (int)Mkamo.Common.DataType.Directions.Left))
                {
                    return(outerFrame.GetNearestPoint(new Point(bounds.Left, center.Y)));
                }
                else if (EnumUtil.HasAllFlags((int)dir, (int)Mkamo.Common.DataType.Directions.Right))
                {
                    return(outerFrame.GetNearestPoint(new Point(bounds.Right, center.Y)));
                }
                else if (EnumUtil.HasAllFlags((int)dir, (int)Mkamo.Common.DataType.Directions.Up))
                {
                    return(outerFrame.GetNearestPoint(new Point(center.X, bounds.Top)));
                }
                else
                {
                    /// } else if (EnumUtil.HasFlag((int) dir, (int) Mkamo.Common.DataType.Directions.Left)) {
                    return(outerFrame.GetNearestPoint(new Point(center.X, bounds.Bottom)));
                }
            }

            case ConnectionMethodKind.Nearest:
                return(outerFrame.GetNearestPoint(location));

            case ConnectionMethodKind.Center:
                // todo: ちゃんと実装
                // とりあえずこれでもCentralRouterが設定されていればすぐルーティングされるので問題なく動く
                return(outerFrame.GetNearestPoint(location));

            case ConnectionMethodKind.Comment:
                if (anchor.Kind == ConnectionAnchorKind.Source)
                {
                    var leftMiddle = new Point(node.Left, node.Top + node.Height / 2);
                    return(outerFrame.GetNearestPoint(leftMiddle));
                    //return outerFrame.GetNearestPoint(location);
                }
                else
                {
                    var pt = node.GetConnectionPoint(_targetConnectionOption);
                    if (pt.HasValue)
                    {
                        return(pt.Value);
                    }
                    else
                    {
                        return(outerFrame.GetNearestPoint(location));
                    }
                }

            default:
                return(outerFrame.GetNearestPoint(location));
            }
        }