| 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 |
} |
|---|