Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        /// <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);
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        /// <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);
            }
        }