615 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			615 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Drawing;
 | |
| using DevComponents.DotNetBar.Charts.Style;
 | |
| 
 | |
| namespace DevComponents.DotNetBar.Charts
 | |
| {
 | |
|     class RadialAlign
 | |
|     {
 | |
|         #region Private variables
 | |
| 
 | |
|         private List<PieLabel> _PieLabels;
 | |
| 	
 | |
|         #endregion
 | |
| 
 | |
|         public RadialAlign(List<PieLabel> pieLabels)
 | |
|         {
 | |
|             _PieLabels = pieLabels;
 | |
| 
 | |
|             foreach (PieLabel pl in _PieLabels)
 | |
|                 pl.Bounds = Rectangle.Empty;
 | |
|         }
 | |
| 
 | |
|         #region Iterate
 | |
| 
 | |
|         public bool Iterate(Graphics g, PieChart pieChart, Rectangle bounds)
 | |
|         {
 | |
|             if (_PieLabels.Count > 0)
 | |
|             {
 | |
|                 PositionLabels(pieChart, bounds);
 | |
| 
 | |
|                 List<PieLabel>[] plist = SortLabels();
 | |
| 
 | |
|                 for (int i = 0; i < plist.Length; i++)
 | |
|                 {
 | |
|                     List<PieLabel> pls = plist[i];
 | |
| 
 | |
|                     if (pls.Count > 0)
 | |
|                     {
 | |
|                         if (IsAnyOverlap(pieChart, pls) == true)
 | |
|                         {
 | |
|                             AdjustDownwards(pieChart, pls, bounds);
 | |
| 
 | |
|                             if (IsAnyOverlap(pieChart, pls) == true)
 | |
|                                 AdjustUpwards(pieChart, pls, bounds);
 | |
|                         }
 | |
| 
 | |
|                         AdjustLabelSizes(g, pieChart, pls, bounds);
 | |
| 
 | |
|                         if (IsAnyOverlap(pieChart, pls) == true)
 | |
|                         {
 | |
|                             AdjustDownwards(pieChart, pls, bounds);
 | |
| 
 | |
|                             if (IsAnyOverlap(pieChart, pls) == true)
 | |
|                                 AdjustUpwards(pieChart, pls, bounds);
 | |
|                         }
 | |
| 
 | |
|                         if (pieChart.SliceLabelOverlapMode != SliceLabelOverlapMode.ShowOverlapping)
 | |
|                         {
 | |
|                             if (IsAnyOverlap(pieChart, pls) == true)
 | |
|                                 HideOverLapping(pls, bounds);
 | |
|                         }
 | |
| 
 | |
|                         UpdateBoxPoints(pieChart, pls);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return (true);
 | |
|         }
 | |
| 
 | |
|         #region PositionLabels
 | |
| 
 | |
|         private void PositionLabels(PieChart pieChart, Rectangle bounds)
 | |
|         {
 | |
|             foreach (PieLabel pl in _PieLabels)
 | |
|             {
 | |
|                 PieSeriesPoint psp = pl.PieSeriesPoint;
 | |
|                 PieSeriesPointCollection spc = psp.Parent as PieSeriesPointCollection;
 | |
| 
 | |
|                 if (spc != null)
 | |
|                 {
 | |
|                     bool showWhiteSpace = psp.ShowSliceWhiteSpaceEx;
 | |
| 
 | |
|                     int width = psp.OuterRadius - psp.InnerRadius;
 | |
| 
 | |
|                     int outerRadius = (psp.ShowSliceWhiteSpaceEx == true)
 | |
|                         ? psp.OuterRadius : (int)(psp.InnerRadius + psp.SliceExtent * width);
 | |
| 
 | |
|                     pl.LabelStyle = psp.GetEffectiveSliceStyle(pieChart, psp.ChartSeries).SliceOuterLabelStyle;
 | |
| 
 | |
|                     pl.OuterRadius = outerRadius;
 | |
|                     pl.Radius = outerRadius + pl.LabelStyle.ConnectorLength;
 | |
| 
 | |
|                     UpdateBoundingRect(pieChart, psp, pl, psp.CenterAngle);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             AdjustForChartBounds(pieChart, _PieLabels);
 | |
|         }
 | |
| 
 | |
|         #region UpdateBoundingRect
 | |
| 
 | |
|         private void UpdateBoundingRect(PieChart pieChart, PieSeriesPoint psp, PieLabel pl, double angle)
 | |
|         {
 | |
|             pl.PtSliceEdge = psp.GetRayEndPoint(angle, pl.OuterRadius);
 | |
| 
 | |
|             Point pt = psp.GetRayEndPoint(angle, pl.Radius);
 | |
| 
 | |
|             Rectangle r = new Rectangle(pt, pl.LabelSize);
 | |
|             r.Y -= (r.Size.Height / 2);
 | |
| 
 | |
|             angle = (angle + 360000) % 360;
 | |
| 
 | |
|             int n = (pl.LabelStyle.DrawConnector == Tbool.True)
 | |
|                 ? Dpi.Width(pl.LabelStyle.ConnectorTickLength) : 0;
 | |
| 
 | |
|             r.X += ((angle >= 270 || angle <= 90) ? n : -(r.Size.Width + n));
 | |
| 
 | |
|             pl.Bounds = r;
 | |
| 
 | |
|             AdjustForPieIntersect(pl);
 | |
|         }
 | |
| 
 | |
|         #region AdjustForPieIntersect
 | |
| 
 | |
|         private void AdjustForPieIntersect(PieLabel pl)
 | |
|         {
 | |
|             PieSeriesPoint psp = pl.PieSeriesPoint;
 | |
| 
 | |
|             Point pto = GetClosestOffset(psp.SliceCenter, pl.Bounds);
 | |
| 
 | |
|             Point ptr = psp.SliceCenter;
 | |
|             ptr.X += pto.X;
 | |
|             ptr.Y += pto.Y;
 | |
| 
 | |
|             if (Intersects(psp, ptr, pl) == true)
 | |
|             {
 | |
|                 Rectangle r = pl.Bounds;
 | |
| 
 | |
|                 double ihyp = Math.Sqrt(pto.X * pto.X + pto.Y * pto.Y);
 | |
|                 double ohyp = (psp.OuterRadius + pl.LabelStyle.LabelMargin) - ihyp;
 | |
| 
 | |
|                 double scale = ohyp / ihyp;
 | |
| 
 | |
|                 int dx = (int)(pto.X * scale);
 | |
|                 int dy = (int)(pto.Y * scale);
 | |
| 
 | |
|                 r.X += dx;
 | |
|                 r.Y += dy;
 | |
| 
 | |
|                 pl.Bounds = r;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #region GetClosestOffset
 | |
| 
 | |
|         private Point GetClosestOffset(Point ptc, Rectangle r)
 | |
|         {
 | |
|             Point pt = new Point();
 | |
| 
 | |
|             int dx1 = r.X - ptc.X;
 | |
|             int dx2 = r.Right - ptc.X;
 | |
| 
 | |
|             int dy1 = r.Y - ptc.Y;
 | |
|             int dy2 = r.Bottom - ptc.Y;
 | |
| 
 | |
|             pt.X = Math.Abs(dx1) < Math.Abs(dx2) ? dx1 : dx2;
 | |
|             pt.Y = Math.Abs(dy1) < Math.Abs(dy2) ? dy1 : dy2;
 | |
| 
 | |
|             return (pt);
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Intersects
 | |
| 
 | |
|         private bool Intersects(
 | |
|             PieSeriesPoint psp, Point ptr, PieLabel pl)
 | |
|         {
 | |
|             int radius = psp.OuterRadius + pl.LabelStyle.LabelMargin;
 | |
| 
 | |
|             int dx = psp.SliceCenter.X - ptr.X;
 | |
|             int dy = psp.SliceCenter.Y - ptr.Y;
 | |
| 
 | |
|             float dsq = (dx * dx) + (dy * dy);
 | |
| 
 | |
|             return (dsq < (radius * radius));
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region AdjustForChartBounds
 | |
| 
 | |
|         private void AdjustForChartBounds(PieChart pieChart, List<PieLabel> pls)
 | |
|         {
 | |
|             Rectangle r = pieChart.ContentBoundsEx;
 | |
| 
 | |
|             for (int i = 0; i < pls.Count; i++)
 | |
|             {
 | |
|                 PieLabel pl = pls[i];
 | |
| 
 | |
|                 if (pl.Bounds.IsEmpty == false)
 | |
|                 {
 | |
|                     int margin = Dpi.Width(pl.LabelStyle.LabelMargin);
 | |
| 
 | |
|                     if (pl.Bounds.Bottom + margin > r.Bottom)
 | |
|                     {
 | |
|                         Rectangle t = pl.Bounds;
 | |
|                         t.Y = (r.Bottom - t.Height - margin);
 | |
|                         pl.Bounds = t;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region SortLabels
 | |
| 
 | |
|         private List<PieLabel>[] SortLabels()
 | |
|         {
 | |
|             List<PieLabel>[] plist = new List<PieLabel>[2];
 | |
| 
 | |
|             plist[0] = new List<PieLabel>();
 | |
|             plist[1] = new List<PieLabel>();
 | |
| 
 | |
|             foreach (PieLabel pl in _PieLabels)
 | |
|             {
 | |
|                 double angle = pl.PieSeriesPoint.CenterAngle % 360;
 | |
| 
 | |
|                 pl.IsRightlabel = (angle >= 270 || angle <= 90);
 | |
| 
 | |
|                 if (pl.IsRightlabel == true)
 | |
|                     plist[1].Add(pl);
 | |
|                 else
 | |
|                     plist[0].Add(pl);
 | |
|             }
 | |
| 
 | |
|             plist[0].Sort(new PieLabelYComparer());
 | |
|             plist[1].Sort(new PieLabelYComparer());
 | |
| 
 | |
|             return (plist);
 | |
|         }
 | |
| 
 | |
|         #region PieLabelYComparer
 | |
| 
 | |
|         private class PieLabelYComparer : IComparer<PieLabel>
 | |
|         {
 | |
|             public int Compare(PieLabel pl1, PieLabel pl2)
 | |
|             {
 | |
|                 return (pl1.PtSliceEdge.Y - pl2.PtSliceEdge.Y);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region IsAnyOverlap
 | |
| 
 | |
|         private bool IsAnyOverlap(PieChart pieChart, List<PieLabel> pls)
 | |
|         {
 | |
|             if (pls.Count <= 0)
 | |
|                 return (false);
 | |
| 
 | |
|             PieSeriesPoint psp = pls[0].PieSeriesPoint;
 | |
| 
 | |
|             if (psp.SliceLabelVisibilityEx == SliceLabelVisibility.SliceMouseOver)
 | |
|                 return (false);
 | |
| 
 | |
|             int maxy = 0;
 | |
| 
 | |
|             for (int i = 0; i < pls.Count; i++)
 | |
|             {
 | |
|                 PieLabel pl = pls[i];
 | |
| 
 | |
|                 if (pl.Bounds.IsEmpty == false)
 | |
|                 {
 | |
|                     if (maxy > pl.Bounds.Y)
 | |
|                         return (IsAnyOverlapEx(pieChart, pls));
 | |
| 
 | |
|                     int margin = Dpi.Width(pl.LabelStyle.LabelMargin);
 | |
| 
 | |
|                     if (pl.Bounds.Bottom + margin > maxy)
 | |
|                         maxy = pl.Bounds.Bottom + margin;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return (false);
 | |
|         }
 | |
| 
 | |
|         #region IsAnyOverlapEx
 | |
| 
 | |
|         private bool IsAnyOverlapEx(PieChart pieChart, List<PieLabel> pls)
 | |
|         {
 | |
|             for (int i = 0; i < pls.Count; i++)
 | |
|             {
 | |
|                 PieLabel pl = pls[i];
 | |
| 
 | |
|                 if (pl.Bounds.IsEmpty == false)
 | |
|                 {
 | |
|                     int margin = pl.LabelStyle.LabelMargin;
 | |
| 
 | |
|                     Rectangle r = pl.Bounds;
 | |
|                     r.Inflate(margin, margin);
 | |
| 
 | |
|                     for (int j = i + 1; j < pls.Count; j++)
 | |
|                     {
 | |
|                         PieLabel pl2 = pls[j];
 | |
| 
 | |
|                         if (r.IntersectsWith(pl2.Bounds) == true)
 | |
|                             return (true);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return (false);
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region HideOverLapping
 | |
| 
 | |
|         private void HideOverLapping(List<PieLabel> pls, Rectangle bounds)
 | |
|         {
 | |
|             for (int i = 0; i < pls.Count; i++)
 | |
|             {
 | |
|                 PieLabel pl = pls[i];
 | |
| 
 | |
|                 if (pl.Bounds.IsEmpty == false)
 | |
|                 {
 | |
|                     for (int j = i + 1; j < pls.Count; j++)
 | |
|                     {
 | |
|                         PieLabel pl2 = pls[j];
 | |
| 
 | |
|                         if (pl.Bounds.IntersectsWith(pl2.Bounds) == true)
 | |
|                             pl2.Bounds = Rectangle.Empty;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region AdjustUpwards
 | |
| 
 | |
|         private void AdjustUpwards(PieChart pieChart, List<PieLabel> pls, Rectangle bounds)
 | |
|         {
 | |
|             for (int i = pls.Count - 1; i > 0; i--)
 | |
|             {
 | |
|                 PieLabel pl0 = pls[i];
 | |
|                 PieLabel pl1 = pls[i - 1];
 | |
| 
 | |
|                 int margin = Dpi.Width(pl0.LabelStyle.LabelMargin);
 | |
| 
 | |
|                 Rectangle t = pl0.Bounds;
 | |
|                 t.Inflate(margin, margin);
 | |
| 
 | |
|                 if (pl1.Bounds.Bottom > t.Y)
 | |
|                 {
 | |
|                     if ((pl1.Bounds.X < t.Right) && (t.X < pl1.Bounds.Right))
 | |
|                     {
 | |
|                         Rectangle r = pl1.Bounds;
 | |
| 
 | |
|                         r.Y = Math.Max(bounds.Y + margin, pl0.Bounds.Y - pl1.Bounds.Height - margin);
 | |
| 
 | |
|                         pl1.Bounds = r;
 | |
| 
 | |
|                         AdjustForPieIntersect(pl1);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region AdjustDownwards
 | |
| 
 | |
|         private void AdjustDownwards(PieChart pieChart, List<PieLabel> pls, Rectangle bounds)
 | |
|         {
 | |
|             for (int i = 0; i < pls.Count - 1; i++)
 | |
|             {
 | |
|                 PieLabel pl0 = pls[i];
 | |
|                 PieLabel pl1 = pls[i + 1];
 | |
| 
 | |
|                 int margin = Dpi.Width(pl0.LabelStyle.LabelMargin) + 4;
 | |
| 
 | |
|                 Rectangle t = pl0.Bounds;
 | |
|                 t.Inflate(margin, margin);
 | |
| 
 | |
|                 if (pl1.Bounds.Bottom < t.Bottom)
 | |
|                 {
 | |
|                     if ((pl1.Bounds.X < t.Right) && (t.X < pl1.Bounds.Right))
 | |
|                     {
 | |
|                         Rectangle r = pl1.Bounds;
 | |
| 
 | |
|                         r.Y = Math.Min(bounds.Bottom - r.Height - margin, t.Bottom);
 | |
| 
 | |
|                         pl1.Bounds = r;
 | |
| 
 | |
|                         AdjustForPieIntersect(pl1);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region AdjustSpread
 | |
| 
 | |
|         private void AdjustSpread(List<PieLabel> pls, Rectangle bounds)
 | |
|         {
 | |
|             int height = 0;
 | |
| 
 | |
|             for (int i = 0; i < pls.Count; i++)
 | |
|                 height += pls[i].Bounds.Height;
 | |
| 
 | |
|             int margin = bounds.Height - height;
 | |
| 
 | |
|             if (pls.Count > 1)
 | |
|                 margin /= (pls.Count - 1);
 | |
| 
 | |
|             int y = bounds.Y;
 | |
| 
 | |
|             for (int i = 0; i < pls.Count; i++)
 | |
|             {
 | |
|                 PieLabel pl = pls[i];
 | |
| 
 | |
|                 Rectangle r = pl.Bounds;
 | |
| 
 | |
|                 r.Y = y;
 | |
|                 pl.Bounds = r;
 | |
| 
 | |
|                 y = (pl.Bounds.Bottom + margin);
 | |
| 
 | |
|                 AdjustForPieIntersect(pl);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region AdjustLabelSizes
 | |
| 
 | |
|         private void AdjustLabelSizes(Graphics g,
 | |
|             PieChart pieChart, List<PieLabel> pls, Rectangle bounds)
 | |
|         {
 | |
|             Rectangle r = pieChart.ContentBoundsEx;
 | |
| 
 | |
|             foreach (PieLabel pl in pls)
 | |
|             {
 | |
|                 PieSeriesPoint psp = pl.PieSeriesPoint;
 | |
| 
 | |
|                 ChartSliceVisualStyle sstyle =
 | |
|                     psp.GetEffectiveSliceStyle(pieChart, psp.ChartSeries);
 | |
| 
 | |
|                 Rectangle t = GetChartBounds(pieChart, pl);
 | |
| 
 | |
|                 if (pl.LabelSize.Width != t.Width)
 | |
|                 {
 | |
|                     PieSeries series = psp.ChartSeries;
 | |
| 
 | |
|                     Size size = series.MeasurePieLabel(g,
 | |
|                         pieChart, psp, pl, t.Width, sstyle.SliceOuterLabelStyle);
 | |
| 
 | |
|                     if (size != pl.Bounds.Size)
 | |
|                     {
 | |
|                         if (t.X != pl.Bounds.X && size.Width < t.Size.Width)
 | |
|                             t.X += (t.Size.Width - size.Width);
 | |
| 
 | |
|                         if (size.Height > t.Size.Height)
 | |
|                             t.Y -= (size.Height - t.Size.Height) / 2;
 | |
| 
 | |
|                         t.Size = size;
 | |
|                     }
 | |
| 
 | |
|                     pl.Bounds = t;
 | |
| 
 | |
|                     AdjustForPieIntersect(pl);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #region GetChartBounds
 | |
| 
 | |
|         private Rectangle GetChartBounds(PieChart pieChart, PieLabel pl)
 | |
|         {
 | |
|             Rectangle r = pl.Bounds;
 | |
| 
 | |
|             r.Inflate(4, 4);
 | |
| 
 | |
|             if (r.X < pieChart.ContentBoundsEx.X)
 | |
|             {
 | |
|                 r.Width -= (pieChart.ContentBoundsEx.X - r.X);
 | |
|                 r.X = pieChart.ContentBoundsEx.X;
 | |
| 
 | |
|                 if (r.Width <= 0)
 | |
|                     return (Rectangle.Empty);
 | |
|             }
 | |
| 
 | |
|             if (r.Right >= pieChart.ContentBoundsEx.Right)
 | |
|             {
 | |
|                 r.Width -= (r.Right - pieChart.ContentBoundsEx.Right + 1);
 | |
| 
 | |
|                 if (r.Width <= 0)
 | |
|                     return (Rectangle.Empty);
 | |
|             }
 | |
| 
 | |
|             if (r.Y < pieChart.ContentBoundsEx.Y)
 | |
|             {
 | |
|                 r.Height -= (pieChart.ContentBoundsEx.Y - r.Y);
 | |
|                 r.Y = pieChart.ContentBoundsEx.Y;
 | |
| 
 | |
|                 if (r.Height <= 0)
 | |
|                     return (Rectangle.Empty);
 | |
|             }
 | |
| 
 | |
|             if (r.Bottom >= pieChart.ContentBoundsEx.Bottom)
 | |
|             {
 | |
|                 int n = (r.Bottom - pieChart.ContentBoundsEx.Bottom + 1);
 | |
| 
 | |
|                 r.Y -= n;
 | |
|                 r.Width++;
 | |
| 
 | |
|                 if (r.Height <= 0)
 | |
|                     return (Rectangle.Empty);
 | |
|             }
 | |
| 
 | |
|             r.Inflate(-4, -4);
 | |
| 
 | |
|             return (r);
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region UpdateBoxPoints
 | |
| 
 | |
|         private void UpdateBoxPoints(PieChart pieChart, List<PieLabel> pls)
 | |
|         {
 | |
|             foreach (PieLabel pl in pls)
 | |
|             {
 | |
|                 Rectangle t = new Rectangle();
 | |
| 
 | |
|                 Rectangle r = pl.Bounds;
 | |
| 
 | |
|                 if (r.IsEmpty == false)
 | |
|                 {
 | |
|                     if (pl.LabelStyle.DrawConnector == Tbool.True)
 | |
|                     {
 | |
|                         int tick = pl.LabelStyle.ConnectorTickLength;
 | |
| 
 | |
|                         if (pl.IsLeftlabel == true)
 | |
|                         {
 | |
|                             pl.PtBoxEdge = new Point(r.Right, r.Y + r.Height / 2);
 | |
|                             pl.PtBoxBend = new Point(pl.PtBoxEdge.X + tick, pl.PtBoxEdge.Y);
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             pl.PtBoxEdge = new Point(r.X, r.Y + r.Height / 2);
 | |
|                             pl.PtBoxBend = new Point(pl.PtBoxEdge.X - tick, pl.PtBoxEdge.Y);
 | |
|                         }
 | |
| 
 | |
|                         Point ptMin = new Point();
 | |
|                         Point ptMax = new Point();
 | |
| 
 | |
|                         if (pl.PtBoxEdge.X < pl.PtSliceEdge.X)
 | |
|                         {
 | |
|                             ptMin.X = pl.PtBoxEdge.X;
 | |
|                             ptMax.X = pl.PtSliceEdge.X;
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             ptMin.X = pl.PtSliceEdge.X;
 | |
|                             ptMax.X = pl.PtBoxEdge.X;
 | |
|                         }
 | |
| 
 | |
|                         if (pl.PtBoxEdge.Y < pl.PtSliceEdge.Y)
 | |
|                         {
 | |
|                             ptMin.Y = pl.PtBoxEdge.Y;
 | |
|                             ptMax.Y = pl.PtSliceEdge.Y;
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             ptMin.Y = pl.PtSliceEdge.Y;
 | |
|                             ptMax.Y = pl.PtBoxEdge.Y;
 | |
|                         }
 | |
| 
 | |
|                         t.Location = ptMin;
 | |
|                         t.Width = ptMax.X - ptMin.X + 1;
 | |
|                         t.Height = ptMax.Y - ptMin.Y + 1;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 pl.Bounds = r;
 | |
|                 pl.ConnectorBounds = t;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #endregion
 | |
|     }
 | |
| }
 | |
| 
 |