root/plot/Pybrary.Plot/SeriesCollection.cs

Revision 746, 6.6 kB (checked in by mfenniak, 2 years ago)

--

Line 
1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Text;
5 using System.Drawing;
6 using System.Drawing.Drawing2D;
7
8 namespace Pybrary.Plot
9 {
10     public delegate void SeriesCollectionEventHandler();
11
12     public class SeriesCollection : IEnumerable<KeyValuePair<string, Series>>
13     {
14         private IDictionary<string, Series> seriesByName = new Dictionary<string, Series>();
15
16         private SeriesEventHandler seriesChangedHandler;
17         public event SeriesCollectionEventHandler OnSeriesCollectionChanged;
18
19         private double? minX_gt_Zero = null;
20         private double? minX = null;
21         private double? maxX = null;
22
23         public SeriesCollection()
24         {
25             seriesChangedHandler = new SeriesEventHandler(onSeriesChanged);
26         }
27
28         private void onSeriesChanged()
29         {
30             minX_gt_Zero = minX = maxX = null;
31             raiseChanged();
32         }
33
34         public Series this[string name]
35         {
36             get
37             {
38                 return seriesByName[name];
39             }
40             set
41             {
42                 if (seriesByName.ContainsKey(name))
43                     value.OnSeriesChanged -= seriesChangedHandler;
44                 seriesByName[name] = value;
45                 value.OnSeriesChanged += seriesChangedHandler;
46                 raiseChanged();
47             }
48         }
49
50         public void Clear()
51         {
52             foreach (KeyValuePair<string, Series> kv in this)
53             {
54                 Series s = kv.Value;
55                 s.OnSeriesChanged -= seriesChangedHandler;
56             }
57             seriesByName.Clear();
58             raiseChanged();
59         }
60
61         private void raiseChanged()
62         {
63             SeriesCollectionEventHandler tmp = OnSeriesCollectionChanged;
64             if (tmp != null)
65                 tmp();
66         }
67
68         public double? GetMinYForAxis(string yAxisName)
69         {
70             // fixme - cache value
71             double? minY = null;
72
73             foreach (KeyValuePair<string, Series> s in seriesByName)
74             {
75                 if (s.Value.YAxisName.Equals(yAxisName))
76                 {
77                     double? seriesMinY = s.Value.MinY;
78                     if (minY == null || (seriesMinY != null && seriesMinY.Value < minY.Value))
79                         minY = seriesMinY;
80                 }
81             }
82
83             return minY;
84         }
85
86         public double? GetMaxYForAxis(string yAxisName)
87         {
88             // fixme - cache value
89             double? maxY = null;
90
91             foreach (KeyValuePair<string, Series> s in seriesByName)
92             {
93                 if (s.Value.YAxisName.Equals(yAxisName))
94                 {
95                     double? seriesMaxY = s.Value.MaxY;
96                     if (maxY == null || (seriesMaxY != null && seriesMaxY.Value > maxY.Value))
97                         maxY = seriesMaxY;
98                 }
99             }
100
101             return maxY;
102         }
103
104         public double? GetMinYGtZeroForAxis(string yAxisName)
105         {
106             // fixme - cache value
107             double? retval = null;
108
109             foreach (KeyValuePair<string, Series> s in seriesByName)
110             {
111                 if (s.Value.YAxisName.Equals(yAxisName))
112                 {
113                     double? seriesMinY = s.Value.MinY_gt_Zero;
114                     if (retval == null || (seriesMinY != null && seriesMinY.Value < retval.Value))
115                         retval = seriesMinY;
116                 }
117             }
118
119             return retval;
120         }
121
122         private void calculateMinMaxX()
123         {
124             if (minX != null)
125                 return;
126
127             foreach (KeyValuePair<string, Series> s in seriesByName)
128             {
129                 double? seriesMinX_gt_Zero = s.Value.MinX_gt_Zero;
130                 if (minX_gt_Zero == null || (seriesMinX_gt_Zero != null && seriesMinX_gt_Zero < minX_gt_Zero.Value))
131                     minX_gt_Zero = seriesMinX_gt_Zero;
132                 double? seriesMinX = s.Value.MinX;
133                 if (minX == null || (seriesMinX != null && seriesMinX < minX.Value))
134                     minX = seriesMinX;
135                 double? seriesMaxX = s.Value.MaxX;
136                 if (maxX == null || (seriesMaxX != null && seriesMinX > minX.Value))
137                     maxX = seriesMaxX;
138             }
139         }
140
141         public double? MinX_gt_Zero
142         {
143             get
144             {
145                 calculateMinMaxX();
146                 return minX_gt_Zero;
147             }
148         }
149
150         public double? MinX
151         {
152             get
153             {
154                 calculateMinMaxX();
155                 return minX;
156             }
157         }
158
159         public double? MaxX
160         {
161             get
162             {
163                 calculateMinMaxX();
164                 return maxX;
165             }
166         }
167
168         public void Draw(Graphics g, AxisCollection yAxisCollection, XAxis xAxis, AdvancedRect area)
169         {
170             GraphicsState _s = g.Save();
171             g.SetClip(area.Rect);
172             foreach (KeyValuePair<string, Series> s in seriesByName)
173                 s.Value.Draw(g, yAxisCollection, xAxis, area);
174             g.Restore(_s);
175         }
176
177         public IEnumerator<KeyValuePair<string, Series>> GetEnumerator()
178         {
179             return seriesByName.GetEnumerator();
180         }
181
182         IEnumerator IEnumerable.GetEnumerator()
183         {
184             return seriesByName.GetEnumerator();
185         }
186
187         public string TextExport()
188         {
189             // text
190             List<List<string>> series = new List<List<string>>();
191             List<int> numColumns = new List<int>();
192             foreach (KeyValuePair<string, Series> kv in this)
193             {
194                 List<string> rows = new List<string>();
195                 series.Add(rows);
196                 numColumns.Add(kv.Value.TextExport(rows, kv.Key));
197
198             }
199             int max = 0;
200             foreach (List<string> lst in series)
201                 max = Math.Max(max, lst.Count);
202             string finalValue = "";
203             for (int i = 0; i < max; i++)
204             {
205                 for (int j = 0; j < series.Count; j++)
206                 {
207                     if (i >= series[j].Count)
208                     {
209                         for (int k = 0; k < numColumns[j]; k++)
210                             finalValue += "\t";
211                     }
212                     else
213                         finalValue += series[j][i];
214                 }
215                 finalValue += "\r\n";
216             }
217             return finalValue;
218         }
219     }
220 }
Note: See TracBrowser for help on using the browser.