/// <summary> /// Converts summary indices to a tracks image, one track for each index. /// </summary> public static Image <Rgb24> DrawImageOfSummaryIndices( Dictionary <string, IndexProperties> listOfIndexProperties, Dictionary <string, double[]> dictionaryOfSummaryIndices, string titleText, TimeSpan indexCalculationDuration, DateTimeOffset?recordingStartDate, List <GapsAndJoins> errors = null, bool verbose = true) { const int trackHeight = DefaultTrackHeight; int scaleLength = 0; var backgroundColour = Color.White; // init list of bitmap images to store image tracks var bitmapList = new List <Tuple <IndexProperties, Image <Rgb24> > >(dictionaryOfSummaryIndices.Keys.Count); // set up strings to store info about which indices are used var s1 = new StringBuilder("Indices not found:"); var s2 = new StringBuilder("Indices not plotted:"); // accumulate the individual tracks in a List foreach (string key in dictionaryOfSummaryIndices.Keys) { if (!listOfIndexProperties.ContainsKey(key)) { s1.Append(" {0},".Format2(key)); continue; } IndexProperties ip = listOfIndexProperties[key]; if (!ip.DoDisplay) { s2.Append(" {0},".Format2(key)); continue; } //string name = ip.Name; double[] array = dictionaryOfSummaryIndices[key]; scaleLength = array.Length; // alternate rows have different colour to make tracks easier to read backgroundColour = backgroundColour == Color.LightGray ? Color.White : Color.LightGray; var bitmap = ip.GetPlotImage(array, backgroundColour, errors); bitmapList.Add(Tuple.Create(ip, bitmap)); } if (verbose) { Logger.Warn(s1.ToString()); Logger.Warn(s2.ToString()); } var listOfBitmaps = bitmapList // .OrderBy(tuple => tuple.Item1.Order) // don't order because want to preserve alternating gray/white rows. .Select(tuple => tuple.Item2) .Where(b => b != null).ToList(); //set up the composite image parameters int x_offset = 2; int graphWidth = x_offset + scaleLength; int imageWidth = x_offset + scaleLength + TrackEndPanelWidth; Image <Rgb24> titleBmp = ImageTrack.DrawTitleTrack(imageWidth, trackHeight, titleText); TimeSpan xAxisPixelDuration = indexCalculationDuration; TimeSpan fullDuration = TimeSpan.FromTicks(xAxisPixelDuration.Ticks * graphWidth); Image <Rgb24> timeBmp1 = ImageTrack.DrawTimeRelativeTrack(fullDuration, graphWidth, trackHeight); Image <Rgb24> timeBmp2 = timeBmp1; DateTimeOffset?dateTimeOffset = recordingStartDate; if (dateTimeOffset.HasValue) { // draw extra time scale with absolute start time. AND THEN Do SOMETHING WITH IT. timeBmp2 = ImageTrack.DrawTimeTrack(fullDuration, dateTimeOffset, graphWidth, trackHeight); } //draw the composite bitmap var imageList = new List <Image <Rgb24> > { titleBmp, timeBmp1, }; foreach (var image in listOfBitmaps) { imageList.Add(image); } imageList.Add(timeBmp2); var compositeBmp = (Image <Rgb24>)ImageTools.CombineImagesVertically(imageList); return(compositeBmp); }
/// <summary> /// Converts summary indices to a tracks image /// </summary> /// <param name="listOfIndexProperties"></param> /// <param name="dictionaryOfSummaryIndices"></param> /// <param name="titleText"></param> /// <param name="indexCalculationDuration"></param> /// <param name="recordingStartDate"></param> /// <param name="sunriseDataFile"></param> /// <param name="errors"></param> public static Bitmap DrawImageOfSummaryIndices( Dictionary <string, IndexProperties> listOfIndexProperties, Dictionary <string, double[]> dictionaryOfSummaryIndices, string titleText, TimeSpan indexCalculationDuration, DateTimeOffset?recordingStartDate, FileInfo sunriseDataFile = null, List <GapsAndJoins> errors = null, bool verbose = false) { // to translate past keys into current keys Dictionary <string, string> translationDictionary = InitialiseIndexProperties.GetKeyTranslationDictionary(); const int trackHeight = DefaultTrackHeight; int scaleLength = 0; var bitmapList = new List <Tuple <IndexProperties, Image> >(dictionaryOfSummaryIndices.Keys.Count); // accumulate the individual tracks in a List foreach (string key in dictionaryOfSummaryIndices.Keys) { string correctKey = key; if (!listOfIndexProperties.ContainsKey(key)) { if (translationDictionary.ContainsKey(key)) { correctKey = translationDictionary[key]; LoggedConsole.WriteWarnLine( "The csv header is an unknown index <{0}>. Translated to <{1}>", key, correctKey); } else { if (verbose) { Logger.Warn( "A index properties configuration could not be found for {0} (not even in the translation directory). Property is ignored and not rendered" .Format2(key)); } continue; } } IndexProperties ip = listOfIndexProperties[correctKey]; if (!ip.DoDisplay) { continue; } string name = ip.Name; double[] array = dictionaryOfSummaryIndices[key]; scaleLength = array.Length; Image bitmap = ip.GetPlotImage(array, errors); bitmapList.Add(Tuple.Create(ip, bitmap)); } var listOfBitmaps = bitmapList .OrderBy(tuple => tuple.Item1.Order) .Select(tuple => tuple.Item2) .Where(b => b != null).ToList(); //set up the composite image parameters int X_offset = 2; int graphWidth = X_offset + scaleLength; int imageWidth = X_offset + scaleLength + TrackEndPanelWidth; TimeSpan scaleDuration = TimeSpan.FromMinutes(scaleLength); int imageHt = trackHeight * (listOfBitmaps.Count + 4); //+3 for title and top and bottom time tracks Bitmap titleBmp = ImageTrack.DrawTitleTrack(imageWidth, trackHeight, titleText); //Bitmap time1Bmp = ImageTrack.DrawTimeTrack(scaleDuration, TimeSpan.Zero, DrawSummaryIndices.TimeScale, graphWidth, TrackHeight, "Time (hours)"); TimeSpan xAxisPixelDuration = indexCalculationDuration; TimeSpan fullDuration = TimeSpan.FromTicks(xAxisPixelDuration.Ticks * graphWidth); Bitmap timeBmp1 = ImageTrack.DrawTimeRelativeTrack(fullDuration, graphWidth, trackHeight); Bitmap timeBmp2 = timeBmp1; Bitmap suntrack = null; DateTimeOffset?dateTimeOffset = recordingStartDate; if (dateTimeOffset.HasValue) { // draw extra time scale with absolute start time. AND THEN Do SOMETHING WITH IT. timeBmp2 = ImageTrack.DrawTimeTrack(fullDuration, dateTimeOffset, graphWidth, trackHeight); suntrack = SunAndMoon.AddSunTrackToImage(scaleLength, dateTimeOffset, sunriseDataFile); } //draw the composite bitmap var imageList = new List <Image>(); imageList.Add(titleBmp); imageList.Add(timeBmp1); for (int i = 0; i < listOfBitmaps.Count; i++) { imageList.Add(listOfBitmaps[i]); } imageList.Add(timeBmp2); imageList.Add(suntrack); Bitmap compositeBmp = (Bitmap)ImageTools.CombineImagesVertically(imageList); return(compositeBmp); }