- Timestamp:
- 01/11/09 19:30:54 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/CEDMA-Refactoring-Ticket419/HeuristicLab.CEDMA.Charting/BubbleChart.cs
r1106 r1108 31 31 namespace HeuristicLab.CEDMA.Charting { 32 32 public class BubbleChart : Chart { 33 private const string X_JITTER = "__X_JITTER"; 34 private const string Y_JITTER = "__Y_JITTER"; 33 35 private const double maxXJitterPercent = 0.05; 34 36 private const double maxYJitterPercent = 0.05; … … 50 52 private double maxX = double.NegativeInfinity; 51 53 private double maxY = double.NegativeInfinity; 52 private List<Re cord> records;54 private List<ResultsEntry> records; 53 55 private Results results; 54 private Dictionary<IPrimitive, Re cord> primitiveToRecordDictionary;55 private Dictionary<Re cord, IPrimitive> recordToPrimitiveDictionary;56 private Dictionary<IPrimitive, ResultsEntry> primitiveToEntryDictionary; 57 private Dictionary<ResultsEntry, IPrimitive> entryToPrimitiveDictionary; 56 58 private Random random = new Random(); 57 59 private Group points; … … 59 61 public BubbleChart(Results results, PointD lowerLeft, PointD upperRight) 60 62 : base(lowerLeft, upperRight) { 61 records = new List<Re cord>();62 primitiveTo RecordDictionary = new Dictionary<IPrimitive, Record>();63 recordToPrimitiveDictionary = new Dictionary<Record, IPrimitive>();63 records = new List<ResultsEntry>(); 64 primitiveToEntryDictionary = new Dictionary<IPrimitive, ResultsEntry>(); 65 entryToPrimitiveDictionary = new Dictionary<ResultsEntry, IPrimitive>(); 64 66 this.results = results; 65 foreach(Record r in results.Records) {66 records.Add(r);67 }68 results.OnRecordAdded += new EventHandler<RecordAddedEventArgs>(results_OnRecordAdded);69 results.Changed += new EventHandler(results_Changed);70 67 } 71 68 … … 75 72 } 76 73 77 public BubbleChart(Result Listresults, double x1, double y1, double x2, double y2)74 public BubbleChart(Results results, double x1, double y1, double x2, double y2) 78 75 : this(results, new PointD(x1, y1), new PointD(x2, y2)) { 79 76 } 80 77 81 void results_OnRecordAdded(object sender, RecordAddedEventArgs e) {82 lock(records) {83 records.Add(e.Record);84 }85 }78 //void results_OnRecordAdded(object sender, RecordAddedEventArgs e) { 79 // lock(records) { 80 // records.Add(e.Record); 81 // } 82 //} 86 83 87 84 public void SetBubbleSizeDimension(string dimension, bool inverted) { … … 93 90 94 91 public void ShowXvsY(string xDimension, string yDimension) { 95 if (this.xDimension != xDimension || this.yDimension != yDimension) {92 if (this.xDimension != xDimension || this.yDimension != yDimension) { 96 93 this.xDimension = xDimension; 97 94 this.yDimension = yDimension; 95 96 foreach (var resultsEntry in results.SelectRows()) { 97 resultsEntry.Set(X_JITTER, random.NextDouble() * 2.0 - 1.0); 98 resultsEntry.Set(Y_JITTER, random.NextDouble() * 2.0 - 1.0); 99 records.Add(resultsEntry); 100 } 98 101 ResetViewSize(); 99 102 Repaint(); … … 110 113 111 114 private void Repaint() { 112 if(xDimension == null || yDimension == null) return; 113 lock(records) { 114 double maxSize = 1; 115 double minSize = 1; 116 if(sizeDimension != null) { 117 var sizes = records.Select(r => r.Get(sizeDimension)).Where(x => !double.IsInfinity(x) && x != double.MaxValue && x != double.MinValue).OrderBy(x=>x); 115 if (xDimension == null || yDimension == null) return; 116 double maxSize = 1; 117 double minSize = 1; 118 try { 119 if (sizeDimension != null && Results.OrdinalVariables.Contains(sizeDimension)) { 120 var sizes = records 121 .Select(x => Convert.ToDouble(x.Get(sizeDimension))) 122 .Where(size => !double.IsInfinity(size) && size != double.MaxValue && size != double.MinValue) 123 .OrderBy(r => r); 118 124 minSize = sizes.ElementAt((int)(sizes.Count() * 0.1)); 119 125 maxSize = sizes.ElementAt((int)(sizes.Count() * 0.9)); 120 126 } 121 UpdateEnabled = false; 122 Group.Clear(); 123 primitiveToRecordDictionary.Clear(); 124 recordToPrimitiveDictionary.Clear(); 125 points = new Group(this); 126 Group.Add(new Axis(this, 0, 0, AxisType.Both)); 127 UpdateViewSize(0, 0, 5); 128 foreach(Record r in records) { 129 double x = r.Get(xDimension) + r.Get(Record.X_JITTER) * xJitterFactor; 130 double y = r.Get(yDimension) + r.Get(Record.Y_JITTER) * yJitterFactor; 131 int size = CalculateSize(r.Get(sizeDimension), minSize, maxSize); 132 133 if(double.IsInfinity(x) || x == double.MaxValue || x == double.MinValue) x = double.NaN; 134 if(double.IsInfinity(y) || y == double.MaxValue || y == double.MinValue) y = double.NaN; 135 if(!double.IsNaN(x) && !double.IsNaN(y)) { 136 UpdateViewSize(x, y, size); 137 int alpha = CalculateAlpha(size); 138 Pen pen = new Pen(Color.FromArgb(alpha, r.Selected ? selectionColor : defaultColor)); 139 Brush brush = pen.Brush; 140 FixedSizeCircle c = new FixedSizeCircle(this, x, y, size, pen, brush); 141 c.ToolTipText = r.GetToolTipText(); 142 points.Add(c); 143 if(!r.Selected) c.IntoBackground(); 144 primitiveToRecordDictionary[c] = r; 145 recordToPrimitiveDictionary[r] = c; 146 } 147 } 148 Group.Add(points); 149 UpdateEnabled = true; 150 } 127 } 128 catch (InvalidCastException) { 129 minSize = 1; 130 maxSize = 1; 131 } 132 UpdateEnabled = false; 133 Group.Clear(); 134 primitiveToEntryDictionary.Clear(); 135 entryToPrimitiveDictionary.Clear(); 136 points = new Group(this); 137 Group.Add(new Axis(this, 0, 0, AxisType.Both)); 138 UpdateViewSize(0, 0, 5); 139 foreach (ResultsEntry r in records) { 140 double x, y; 141 int size; 142 try { 143 x = Convert.ToDouble(r.Get(xDimension)) + (double)r.Get(X_JITTER) * xJitterFactor; 144 y = Convert.ToDouble(r.Get(yDimension)) + (double)r.Get(Y_JITTER) * yJitterFactor; 145 size = CalculateSize(Convert.ToDouble(r.Get(sizeDimension)), minSize, maxSize); 146 } 147 catch (InvalidCastException) { 148 x = double.NaN; 149 y = double.NaN; 150 size = minBubbleSize; 151 } 152 if (double.IsInfinity(x) || x == double.MaxValue || x == double.MinValue) x = double.NaN; 153 if (double.IsInfinity(y) || y == double.MaxValue || y == double.MinValue) y = double.NaN; 154 if (!double.IsNaN(x) && !double.IsNaN(y)) { 155 UpdateViewSize(x, y, size); 156 int alpha = CalculateAlpha(size); 157 Pen pen = new Pen(Color.FromArgb(alpha, r.Selected ? selectionColor : defaultColor)); 158 Brush brush = pen.Brush; 159 FixedSizeCircle c = new FixedSizeCircle(this, x, y, size, pen, brush); 160 c.ToolTipText = r.GetToolTipText(); 161 points.Add(c); 162 if (!r.Selected) c.IntoBackground(); 163 primitiveToEntryDictionary[c] = r; 164 entryToPrimitiveDictionary[r] = c; 165 } 166 } 167 Group.Add(points); 168 UpdateEnabled = true; 151 169 } 152 170 153 171 private int CalculateSize(double size, double minSize, double maxSize) { 154 if(double.IsNaN(size) || double.IsInfinity(size) || size == double.MaxValue || size == double.MinValue) return minBubbleSize; 155 if(size > maxSize) size = maxSize; 156 if(size < minSize) size = minSize; 172 if (double.IsNaN(size) || double.IsInfinity(size) || size == double.MaxValue || size == double.MinValue) return minBubbleSize; 173 if (size > maxSize) size = maxSize; 174 if (size < minSize) size = minSize; 175 if (Math.Abs(maxSize - minSize) < 1.0E-10) return minBubbleSize; 157 176 double sizeDifference = ((size - minSize) / (maxSize - minSize) * (maxBubbleSize - minBubbleSize)); 158 if (invertSize) return maxBubbleSize - (int)sizeDifference;177 if (invertSize) return maxBubbleSize - (int)sizeDifference; 159 178 else return minBubbleSize + (int)sizeDifference; 160 179 } … … 165 184 166 185 private void ZoomToViewSize() { 167 if (minX < maxX && minY < maxY) {186 if (minX < maxX && minY < maxY) { 168 187 // enlarge view by 5% on each side 169 188 double width = maxX - minX; … … 178 197 179 198 private void UpdateViewSize(double x, double y, double size) { 180 if (x - size < minX) minX = x - size;181 if (x + size > maxX) maxX = x + size;182 if (y - size < minY) minY = y + size;183 if (y + size > maxY) maxY = y + size;199 if (x - size < minX) minX = x - size; 200 if (x + size > maxX) maxX = x + size; 201 if (y - size < minY) minY = y + size; 202 if (y + size > maxY) maxY = y + size; 184 203 } 185 204 … … 191 210 } 192 211 193 internal Re cord GetRecord(Point point) {194 Re cordr = null;212 internal ResultsEntry GetResultsEntry(Point point) { 213 ResultsEntry r = null; 195 214 IPrimitive p = points.GetPrimitive(TransformPixelToWorld(point)); 196 if (p != null) {197 primitiveTo RecordDictionary.TryGetValue(p, out r);215 if (p != null) { 216 primitiveToEntryDictionary.TryGetValue(p, out r); 198 217 } 199 218 return r; … … 202 221 203 222 public override void MouseDrag(Point start, Point end, MouseButtons button) { 204 if (button == MouseButtons.Left && Mode == ChartMode.Select) {223 if (button == MouseButtons.Left && Mode == ChartMode.Select) { 205 224 PointD a = TransformPixelToWorld(start); 206 225 PointD b = TransformPixelToWorld(end); … … 214 233 primitives.AddRange(points.Primitives); 215 234 216 foreach (FixedSizeCircle p in primitives) {217 if (rect.ContainsPoint(p.Point)) {218 Re cordr;219 primitiveTo RecordDictionary.TryGetValue(p, out r);220 if (r != null) r.ToggleSelected();235 foreach (FixedSizeCircle p in primitives) { 236 if (rect.ContainsPoint(p.Point)) { 237 ResultsEntry r; 238 primitiveToEntryDictionary.TryGetValue(p, out r); 239 if (r != null) r.ToggleSelected(); 221 240 } 222 241 } 223 results.FireChanged();242 // results.FireChanged(); 224 243 } else { 225 244 base.MouseDrag(start, end, button); … … 228 247 229 248 public override void MouseClick(Point point, MouseButtons button) { 230 if (button == MouseButtons.Left) {231 Re cord r = GetRecord(point);232 if (r != null) r.ToggleSelected();233 results.FireChanged();249 if (button == MouseButtons.Left) { 250 ResultsEntry r = GetResultsEntry(point); 251 if (r != null) r.ToggleSelected(); 252 // results.FireChanged(); 234 253 } else { 235 254 base.MouseClick(point, button); … … 237 256 } 238 257 239 public override void MouseDoubleClick(Point point, MouseButtons button) {240 if(button == MouseButtons.Left) {241 Record r = GetRecord(point);242 if(r != null) r.OpenModel();243 } else {244 base.MouseDoubleClick(point, button);245 }246 }258 //public override void MouseDoubleClick(Point point, MouseButtons button) { 259 // if(button == MouseButtons.Left) { 260 // Record r = GetRecord(point); 261 // if(r != null) r.OpenModel(); 262 // } else { 263 // base.MouseDoubleClick(point, button); 264 // } 265 //} 247 266 } 248 267 }
Note: See TracChangeset
for help on using the changeset viewer.