private List <string> RenderAsText(GroupFilter gl, PhotoDetailCollection input = null) { var result = new List <string>(); if (gl.IsLast) { result.Add(RenderRow(gl, input)); } else { foreach (var pv in gl.ParameterValues.SelectedValues) { var renderedRows = RenderAsText(gl.NextGroupFilter, gl.Filter(pv as string, input)) as List <string>; foreach (var row in renderedRows) { result.Add(string.Format("{0} | {1}", (pv as string).PadLeft(20), row)); } } // parallel execution might destroy the sort order defined by the user //Parallel.ForEach( // gf.ParameterValues.SelectedValues, // x => // { // var pv = x; // var renderedRows = RenderAsText(gf.NextGroupFilter, gf.Filter(pv as string, input)); // foreach (var row in renderedRows) // { // result.Add(string.Format("{0} | {1}", (pv as string).PadLeft(30), row)); // } // }); } return(result); }
/// <summary> /// Renders a group. The selected parameter names are written (-90° ccw) at the left, the images /// are displayed on the right. /// </summary> /// <param name="f">The filter</param> /// <param name="input">The input image details</param> /// <returns></returns> private Image RenderGroup(GroupFilter f, PhotoDetailCollection input = null) { //Console.Out.WriteLine("rendering " + f); if (f.IsLast) { return(RenderRow(f, input)); } // otherwise: render sub-groups and combine into one image var rowImages = new List <Image>(); // render row for each value of the filter parameter foreach (var pv in f.ParameterValues.SelectedValues) { // Console.Out.WriteLine("--> " + f.Parameter + "=" + pv); var renderedRows = RenderGroup(f.NextGroupFilter, f.Filter(pv, input)); rowImages.Add(renderedRows); } // calculate total size of group var h = rowImages.Sum(rowImage => rowImage.Height) + (Padding * (rowImages.Count + 1)); var w = rowImages.Max(rowImage => rowImage.Width); // create destination bitmap: text | rowImage var tableSize = new Size(TextHeight + (3 * Padding) + w, h); Bitmap b = new Bitmap(tableSize.Width, tableSize.Height); using (Graphics g = Graphics.FromImage(b)) { g.FillRectangle(new SolidBrush(Color.White), new Rectangle(new Point(0, 0), tableSize)); var destRect = new Rectangle(Padding, Padding, TextHeight, 1); for (int i = 0; i < f.ParameterValues.SelectedValues.Count; i++) { // draw text var text = f.ParameterValues.SelectedValues[i]; destRect.Height = rowImages[i].Height; RenderLabel(g, text, destRect, true); // draw strips destRect.Offset(TextHeight + Padding, 0); g.DrawImage(rowImages[i], destRect.Location); rowImages[i].Dispose(); // move to next row (left edge and down) destRect.Offset((-1 * destRect.X) + Padding, destRect.Height + Padding); } var strip = (Image)b; return(strip); } }
private string RenderRow(GroupFilter gl, PhotoDetailCollection input) { string s = string.Empty; foreach (var pv in gl.ParameterValues.SelectedValues) { string tileText = string.Empty; var tiles = gl.Filter(pv as string, input); if (tiles.Count == 0) { tileText = "-"; } else if (tiles.Count > 1) { tileText = pv + ": " + tiles.Count + " matches"; } else { tileText = tiles[0].ToString(); } s += string.Format("[{0}] ", tileText.PadLeft(20)); } return(s); }
/// <summary> /// Renders last group level in horizontal direction, as a strip of detail tiles /// </summary> /// <param name="f">The f.</param> /// <param name="input">The input.</param> /// <returns></returns> private Image RenderRow(GroupFilter f, PhotoDetailCollection input) { var boxes = f.ParameterValues.SelectedValues.Count; // calc size of individual images, fit into configured bounding box var boxSize = ScaleToBoundingBox ? ImageConverter.FitInto(TileSize, BoundingBox, true) : TileSize; var stripSize = new Size(boxes * (boxSize.Width + Padding), boxSize.Height); Bitmap b = new Bitmap(stripSize.Width, stripSize.Height); using (Graphics g = Graphics.FromImage(b)) { g.FillRectangle(new SolidBrush(Color.White), new Rectangle(new Point(0, 0), stripSize)); var destRect = new Rectangle(new Point(0, 0), boxSize); // fill the image tiles in X-direction foreach (var pv in f.ParameterValues.SelectedValues) { // g.FillRectangle(new SolidBrush(Color.GreenYellow), destRect); var tileLabel = string.Empty; var tiles = f.Filter(pv, input); if (tiles.Count == 0) { // no matching tile image, leave empty } else if (tiles.Count > 1) { // more than one matching image, write warning tileLabel = pv + ": " + tiles.Count + " matches"; } else { // exactly one matching image var photoDetail = tiles[0]; using (var tileImg = photoDetail.Image) { using (var scaledTileImg = ImageConverter.ResizeImage(tileImg, boxSize)) { g.DrawImage(scaledTileImg, destRect.Location); } } tileLabel = pv; } if (!string.IsNullOrEmpty(tileLabel)) { RenderLabel(g, tileLabel, destRect, false); } // move target rect to the left destRect.Offset(boxSize.Width + Padding, 0); MainWindow.Instance.Progress++; } var strip = (Image)b; return(strip); } }