Free cookie consent management tool by TermsFeed Policy Generator

source: addons/HeuristicLab.FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/BoxChart/BoxChartCreator.cs @ 16573

Last change on this file since 16573 was 16573, checked in by gkronber, 5 years ago

#2520: changed HeuristicLab.FLA addon to compile with new HL.Persistence

File size: 7.9 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Drawing;
4using System.Drawing.Imaging;
5using System.IO;
6using System.IO.Compression;
7using System.Linq;
8using HeuristicLab.Collections;
9using HeuristicLab.Common;
10using HeuristicLab.Core;
11using HeuristicLab.Data;
12using HeuristicLab.Optimization;
13using HeuristicLab.Parameters;
14using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
15using HEAL.Attic;
16
17namespace HeuristicLab.Analysis.FitnessLandscape.BoxCharts {
18
19  [Item("Box Chart Creator", "Visualizes essential run information by creating an overview chart.")]
20  [StorableType("C6897D24-4E02-411E-B92D-43CC055D7C9C")]
21  public class BoxChartCreator : ParameterizedNamedItem, IRunCollectionModifier {
22
23    public enum AppendModes { None, Horizontal, Vertical };
24
25    #region Parameters
26    public ValueParameter<StringValue> ChartNameParameter {
27      get { return (ValueParameter<StringValue>)Parameters["ChartName"]; }
28    }
29    public ValueParameter<CheckedItemList<IBoxChartElementGenerator>> ElementsParameter {
30      get { return (ValueParameter<CheckedItemList<IBoxChartElementGenerator>>)Parameters["Elements"]; }
31    }
32    public ValueParameter<IntValue> SizeParameter {
33      get { return (ValueParameter<IntValue>)Parameters["Size"]; }
34    }
35    public ValueParameter<IntValue> PaddingParameter {
36      get { return (ValueParameter<IntValue>)Parameters["Padding"]; }
37    }
38    public ValueParameter<StringValue> ZipFileNameParameter {
39      get { return (ValueParameter<StringValue>)Parameters["ZipFileName"]; }
40    }
41    public IConstrainedValueParameter<StringValue> AppendModeParameter {
42      get { return (IConstrainedValueParameter<StringValue>)Parameters["AppendMode"]; }
43    }
44    #endregion
45
46    #region Parameter Values
47    protected string ChartName { get { return ChartNameParameter.Value.Value; } }
48    protected string ZipFileName { get { return ZipFileNameParameter.Value.Value; } }
49    protected int Size { get { return SizeParameter.Value.Value; } }
50    protected int Padding { get { return PaddingParameter.Value.Value; } }
51    protected AppendModes AppendMode { get { return (AppendModes)Enum.Parse(typeof(AppendModes), AppendModeParameter.Value.Value); } }
52    protected List<IBoxChartElementGenerator> Generators {
53      get {
54        return ElementsParameter.Value.CheckedItems.Select(i => i.Value).ToList();
55      }
56    }
57    #endregion
58
59    #region Construction & Cloning
60    [StorableConstructor]
61    protected BoxChartCreator(StorableConstructorFlag _) : base(_) { }
62    protected BoxChartCreator(BoxChartCreator original, Cloner cloner)
63      : base(original, cloner) {
64      RegisterEvents();
65    }
66    public BoxChartCreator() {
67      Parameters.Add(new ValueParameter<StringValue>("ChartName", "The result name of the chart.", new StringValue("Chart")));
68      Parameters.Add(new ValueParameter<CheckedItemList<IBoxChartElementGenerator>>("Elements", "List of patient chart element generators.", new CheckedItemList<IBoxChartElementGenerator>()));
69      Parameters.Add(new ValueParameter<IntValue>("Size", "The size of one box in pixels.", new IntValue(50)));
70      Parameters.Add(new ValueParameter<IntValue>("Padding", "The padding inside the boxes", new IntValue(1)));
71      Parameters.Add(new ValueParameter<StringValue>("ZipFileName", "The name of the zip file that will contain all generated charts.", new StringValue("")));
72      Parameters.Add(new ConstrainedValueParameter<StringValue>("AppendMode", "Determines how coordinates of new elements are calculated.",
73        new ItemSet<StringValue>(Enum.GetNames(typeof(AppendModes)).Select(v => new StringValue(v)))));
74      AppendModeParameter.Value = AppendModeParameter.ValidValues.SingleOrDefault(v => v.Value == AppendModes.Horizontal.ToString());
75      RegisterEvents();
76    }
77    public override IDeepCloneable Clone(Cloner cloner) {
78      return new BoxChartCreator(this, cloner);
79    }
80    [StorableHook(HookType.AfterDeserialization)]
81    private void AfterDeserialization() {
82      if (!Parameters.ContainsKey("ZipFileName"))
83        Parameters.Add(new ValueParameter<StringValue>("ZipFileName", "The name of the zip file that will contain all generated charts.", new StringValue("")));
84      if (!Parameters.ContainsKey("AppendMode")) {
85        Parameters.Add(new ConstrainedValueParameter<StringValue>("AppendMode", "Determines how coordinates of new elements are calculated.",
86          new ItemSet<StringValue>(Enum.GetNames(typeof(AppendModes)).Select(v => new StringValue(v)))));
87        AppendModeParameter.Value = AppendModeParameter.ValidValues.SingleOrDefault(v => v.Value == AppendModes.Horizontal.ToString());
88      }
89      RegisterEvents();
90    }
91    #endregion
92
93    private void RegisterEvents() {
94      ElementsParameter.ValueChanged += ElementsParameter_ValueChanged;
95      ElementsParameter.Value.ItemsAdded += ElementsParameter_Value_ItemsAdded;
96    }
97
98    private void ElementsParameter_ValueChanged(object sender, EventArgs e) {
99      ElementsParameter.Value.ItemsAdded += ElementsParameter_Value_ItemsAdded;
100    }
101
102    private void ElementsParameter_Value_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IBoxChartElementGenerator>> e) {
103      if (sender != ElementsParameter.Value) {
104        var oldParameter = sender as ICheckedItemList<IBoxChartElementGenerator>;
105        if (oldParameter != null)
106          oldParameter.ItemsAdded -= ElementsParameter_Value_ItemsAdded;
107      } else {
108        var generators = Generators;
109        var newItems = e.Items.Select(kvp => kvp.Value).ToList();
110        switch (AppendMode) {
111          case AppendModes.Horizontal:
112            foreach (var generator in newItems) {
113              generator.Y = generators.Max(g => g.Y + g.RowSpan - 1);
114              generator.X = generators.Where(g => g.Y + g.RowSpan - 1 == generator.Y).Max(g => g.X + g.ColSpan);
115            }
116            break;
117          case AppendModes.Vertical:
118            foreach (var generator in newItems) {
119              generator.X = generators.Max(g => g.X + g.ColSpan - 1);
120              generator.Y = generators.Where(g => g.X + g.ColSpan - 1 == generator.X).Max(g => g.Y + g.RowSpan);
121            }
122            break;
123        }
124      }
125    }
126
127    #region IRunCollectionModifier Members
128
129    public void Modify(List<IRun> runs) {
130      var bitmaps = new Dictionary<string, Bitmap>();
131      var generators = Generators;
132      var maxX = generators.Max(g => g.X + g.ColSpan);
133      var maxY = generators.Max(g => g.Y + g.RowSpan);
134      for (int i = 0; i < runs.Count; i++) {
135        var run = runs[i];
136        var b = new Bitmap(maxX * Size, maxY * Size);
137        using (var g = Graphics.FromImage(b)) {
138          g.FillRectangle(SystemBrushes.Control, 0, 0, b.Width, b.Height);
139          foreach (var gen in generators) {
140            g.SetClip(new Rectangle(gen.X * Size + Padding, gen.Y * Size + Padding, gen.ColSpan * Size - 2 * Padding, gen.RowSpan * Size - 2 * Padding));
141            gen.Draw(run, g);
142            g.ResetClip();
143          }
144        }
145        run.Results[ChartName] = new BitmapItem(b);
146        bitmaps.Add(string.Format("{0}.png", run.Name), (Bitmap)b.Clone());
147      }
148      SaveAllBitmaps(bitmaps);
149    }
150
151    private void SaveAllBitmaps(Dictionary<string, Bitmap> bitmaps) {
152      if (ZipFileNameParameter.Value == null && string.IsNullOrEmpty(ZipFileName))
153        return;
154      var filename = ZipFileName;
155      if (!filename.ToLowerInvariant().EndsWith("zip"))
156        filename = string.Format("{0}.zip", filename);
157      using (var stream = File.Create(filename)) {
158        using (var zipArchive = new ZipArchive(stream, ZipArchiveMode.Create)) {
159          foreach (var bitmap in bitmaps) {
160            var entry = zipArchive.CreateEntry(bitmap.Key);
161            using (var s = entry.Open()) {
162              bitmap.Value.Save(s, ImageFormat.Png);
163            }
164          }
165        }
166      }
167    }
168    #endregion
169  }
170}
Note: See TracBrowser for help on using the repository browser.