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))); } }
// === 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(); }
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()); }
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); }
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); }
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)); } }