Пример #1
0
        public override RenderedSvg RenderColumn()
        {
            RenderedSvg result = base.RenderColumn();

            SvgGroup group = new SvgGroup();

            for (int i = 0; i < vm.Samples.Length; i++)
            {
                SampleVM sample = vm.Samples[i];
                //sample circle sign
                SvgCircle circle = new SvgCircle();
                circle.CenterX = Helpers.dtos(circleXoffset);
                circle.CenterY = Helpers.dtos(sample.Level);
                circle.Radius  = Helpers.dtos(circleRadius);
                circle.Stroke  = blackPaint;
                group.Children.Add(circle);

                //sample depth label
                SvgText depthText = new SvgText(string.Format("{0:0.##} м", sample.Depth));
                depthText.Transforms.Add(new Svg.Transforms.SvgTranslate(textXoffset, (float)(sample.Level + 2.0 * circleRadius + textFontSize * 0.5)));
                depthText.Fill     = blackPaint;
                depthText.FontSize = Helpers.dtos(textFontSize);
                group.Children.Add(depthText);
                //sample comment
                SvgText commentText = new SvgText(sample.Comment);
                commentText.Transforms.Add(new Svg.Transforms.SvgTranslate(textXoffset, (float)(sample.Level + 2.0 * circleRadius + textFontSize * 1.5)));
                commentText.Fill     = blackPaint;
                commentText.FontSize = Helpers.dtos(textFontSize);
                group.Children.Add(commentText);
            }

            result.SVG = group;

            return(result);
        }
Пример #2
0
        public RenderedSvg RenderHeader()
        {
            RenderedSvg result = new RenderedSvg();

            SvgPaintServer blackPaint = new SvgColourServer(System.Drawing.Color.Black);

            string[] spans    = vm.Heading.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray();
            SvgText  text     = new SvgText();
            float    fontSize = 10.0f;

            foreach (var span in spans)
            {
                SvgTextSpan tspan = new SvgTextSpan();
                tspan.Text     = span;
                tspan.FontSize = new SvgUnit(fontSize);
                tspan.Dy.Add(Helpers.dtos(fontSize * 1.2));
                tspan.X.Add(0);
                tspan.Fill = blackPaint;
                text.Children.Add(tspan);
            }
            //text.Transforms.Add(new Svg.Transforms.SvgTranslate(0, (float)(- (fontSize * 1.2) * spans.Length * 0.5)));

            result.RenderedSize = headerView.RenderSize;
            result.SVG          = text;
            return(result);
        }
Пример #3
0
        public override RenderedSvg RenderColumn()
        {
            RenderedSvg result = base.RenderColumn();

            SvgGroup        group      = new SvgGroup();
            SvgColourServer blackPaint = new SvgColourServer(System.Drawing.Color.Black);

            double width = view.RenderSize.Width;

            //drawing layer boundaries
            LayerVM[] layers   = columnVm.Layers.ToArray();
            double    boundary = 0.0;

            for (int i = 0; i < layers.Length; i++)
            {
                LayerVM lVM = layers[i];
                if (i < layers.Length - 1)
                {
                    boundary += lVM.Length;
                    SvgLine line = new SvgLine();
                    line.Stroke = blackPaint;
                    line.StartX = Helpers.dtos(0.0);
                    line.EndX   = Helpers.dtos(width);
                    line.StartY = Helpers.dtos(boundary);
                    line.EndY   = Helpers.dtos(boundary);
                    group.Children.Add(line);
                }
                var layerSvg = layerPainter.Paint(layers[i], width, lVM.Length);
                layerSvg.Transforms.Add(new Svg.Transforms.SvgTranslate(0.0f, (float)(boundary - lVM.Length)));
                group.Children.Add(layerSvg);
            }

            result.SVG = group;
            return(result);
        }
Пример #4
0
        public virtual RenderedSvg RenderColumn()
        {
            RenderedSvg result = new RenderedSvg();

            result.RenderedSize = view.RenderSize;
            result.SVG          = new Svg.SvgGroup();
            return(result);
        }
Пример #5
0
        public RenderedSvg RenderHeader()
        {
            RenderedSvg result = new RenderedSvg();
            SvgText     text   = new SvgText(vm.Heading);

            text.FontSize       = new SvgUnit((float)10);
            text.Fill           = new SvgColourServer(System.Drawing.Color.Black);
            result.RenderedSize = headerView.RenderSize;
            result.SVG          = text;
            return(result);
        }
        public override RenderedSvg RenderColumn()
        {
            RenderedSvg result = base.RenderColumn();

            Svg.SvgGroup group = new Svg.SvgGroup();

            foreach (Intervals.PhotoRegion region in vm.ImageRegions)
            {
                Svg.SvgImage image = new Svg.SvgImage();

                string base64;

                using (MemoryStream ms = new MemoryStream())
                {
                    WriteableBitmap wbm = new WriteableBitmap(region.BitmapImage);

                    PngBitmapEncoder encoder = new PngBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(wbm));
                    encoder.Save(ms);

                    byte[] bytes = ms.ToArray();
                    base64 = Convert.ToBase64String(bytes);
                }

                image.Href  = string.Format("data:image/png;base64,{0}", base64);
                image.Width = Helpers.dtos(region.WpfWidth);

                Size imSize = region.ImageSize;

                //how many WPF units in one image unit
                //double wpfScaleFactor = region.WpfWidth / imSize.Width;

                double h = (region.ImageLowerDepth - region.ImageUpperDepth) * vm.CurrentScaleFactor;

                image.Height = Helpers.dtos(h);
                //System.Diagnostics.Trace.WriteLine(string.Format("svg image height is {0}({1})", image.Height, h));

                //home many real meters in one image unit
                double depthScaleFactor = (region.ImageLowerDepth - region.ImageUpperDepth) / imSize.Height;

                image.Y = Helpers.dtos((region.ImageUpperDepth - vm.UpperBound) * vm.CurrentScaleFactor);
                //Helpers.dtos((region.ImageUpperDepth - vm.UpperBound) / depthScaleFactor * wpfScaleFactor);
                //System.Diagnostics.Trace.WriteLine(string.Format("svg image top is {0}({1})", image.Y, (region.ImageUpperDepth - vm.UpperBound) * vm.CurrentScaleFactor));
                group.Children.Add(image);
            }
            result.SVG = group;
            return(result);
        }
        public override RenderedSvg RenderColumn()
        {
            RenderedSvg result     = base.RenderColumn();
            double      width      = result.RenderedSize.Width;
            SvgGroup    linesGroup = new SvgGroup();

            SvgColourServer blackPaint = new SvgColourServer(System.Drawing.Color.Black);

            int minRank = int.MaxValue;

            LayerBoundary[] boundaries = vm.Boundaries.OrderBy(b => b.Level).ToArray();

            var rank = boundaries.Select(b => b.Rank).Min();

            for (int i = 0; i < boundaries.Length; i++)
            {
                LayerBoundary boundary = boundaries[i];
                SvgLine       line     = new SvgLine();
                line.StartX = Helpers.dtos(0.0);
                line.EndX   = Helpers.dtos(width);
                line.StartY = Helpers.dtos(boundary.Level);
                line.EndY   = Helpers.dtos(boundary.Level);
                line.Stroke = blackPaint;
                linesGroup.Children.Add(line);

                minRank = Math.Min(minRank, boundary.Rank);

                string textStr = string.Format("{0}", boundary.Numbers[rank]);

                //putting layer number as well
                SvgText text2 = new SvgText(textStr);
                text2.Transforms.Add(new Svg.Transforms.SvgTranslate(labelXoffset, (float)(boundary.Level + labelYoffset)));
                text2.FontSize = Helpers.dtos(10.0);
                text2.Fill     = blackPaint;
                linesGroup.Children.Add(text2);
            }
            result.SVG = linesGroup;
            return(result);
        }
        public override RenderedSvg RenderColumn()
        {
            RenderedSvg result = base.RenderColumn();
            SvgGroup    group  = new SvgGroup();

            SvgColourServer blackPiant = new SvgColourServer(System.Drawing.Color.Black);

            //first adding ticks
            double tickStep = Math.Pow(10.0, TickDepthResolutionOrder);
            double tickStart;

            if (TickDepthResolutionOrder <= 0)
            {
                tickStart = Math.Round(vm.UpperBound, -TickDepthResolutionOrder);
            }
            else
            {
                tickStart = Math.Round(vm.UpperBound / tickStep) * tickStep;
            }

            if (tickStart < vm.UpperBound)
            {
                tickStart += tickStart;
            }

            double tick = tickStart;

            //How many WPF units in 1 real meter of depth
            double depthScaleFactor = vm.ColumnHeight / (vm.LowerBound - vm.UpperBound);

            Func <double, double> depthToY = depth => (depth - vm.UpperBound) * depthScaleFactor;

            while (tick < vm.LowerBound)
            {
                SvgLine line = new SvgLine();
                line.Stroke = blackPiant;
                line.StartX = Helpers.dtos(0);
                line.EndX   = Helpers.dtos(labelXoffset);
                line.StartY = Helpers.dtos(depthToY(tick));
                line.EndY   = Helpers.dtos(depthToY(tick));
                group.Children.Add(line);

                tick += tickStep;

                //SvgText text = new SvgText(string.Format("{0}",tick));
                //text.Transforms.Add(new Svg.Transforms.SvgTranslate());
            }

            //now adding labels
            double labelStep = Math.Pow(10.0, LabelDepthResolutionOrder);
            double labelStart;

            if (LabelDepthResolutionOrder <= 0)
            {
                labelStart = Math.Round(vm.UpperBound, -LabelDepthResolutionOrder);
            }
            else
            {
                labelStart = Math.Round(vm.UpperBound / labelStep) * labelStep;
            }

            if (labelStart < vm.UpperBound)
            {
                labelStart += labelStep;
            }

            double label = labelStart;


            while (label < vm.LowerBound)
            {
                SvgText text = new SvgText(string.Format("{0}", label));
                text.Transforms.Add(new Svg.Transforms.SvgTranslate(labelXoffset, (float)depthToY(label) + labelYoffset));
                text.Fill     = blackPiant;
                text.FontSize = Helpers.dtos(labelSize);
                group.Children.Add(text);

                label += labelStep;
            }

            result.SVG = group;
            return(result);
        }
Пример #9
0
        public static SvgDocument Generate(ISvgRenderableColumn[] columns, ILegendGroup[] legend)
        {
            //generating headers
            SvgGroup       headerGroup      = new SvgGroup();
            SvgPaintServer blackPaint       = new SvgColourServer(System.Drawing.Color.Black);
            double         horizontalOffset = 0.0;
            double         headerHeight     = 0;

            for (int i = 0; i < columns.Length; i++)
            {
                RenderedSvg  heading = columns[i].RenderHeader();
                SvgRectangle rect    = new SvgRectangle();
                headerHeight = heading.RenderedSize.Height;
                rect.Width   = Helpers.dtos(heading.RenderedSize.Width);
                rect.Height  = Helpers.dtos(heading.RenderedSize.Height);
                rect.X       = Helpers.dtos(horizontalOffset);
                rect.Y       = Helpers.dtos(0.0);
                rect.Stroke  = blackPaint;

                heading.SVG.Transforms.Add(new SvgTranslate((float)(horizontalOffset + heading.RenderedSize.Width * 0.5), (float)heading.RenderedSize.Height * 0.9f));
                heading.SVG.Transforms.Add(new SvgRotate((float)-90.0));

                headerGroup.Children.Add(rect);
                headerGroup.Children.Add(heading.SVG);
                horizontalOffset += heading.RenderedSize.Width;
            }
            //generating columns
            SvgGroup columnsGroup = new SvgGroup();
            double   columnHeight = 0.0;

            horizontalOffset = 0.0;
            columnsGroup.Transforms.Add(new SvgTranslate(0.0f, (float)headerHeight));
            for (int i = 0; i < columns.Length; i++)
            {
                RenderedSvg  column = columns[i].RenderColumn();
                SvgRectangle rect   = new SvgRectangle();
                columnHeight = column.RenderedSize.Height;
                rect.Width   = Helpers.dtos(column.RenderedSize.Width);
                rect.Height  = Helpers.dtos(column.RenderedSize.Height);
                rect.X       = Helpers.dtos(horizontalOffset);
                rect.Y       = Helpers.dtos(0.0);
                rect.Stroke  = blackPaint;

                column.SVG.Transforms.Add(new SvgTranslate((float)(horizontalOffset)));

                columnsGroup.Children.Add(rect);
                columnsGroup.Children.Add(column.SVG);

                horizontalOffset += column.RenderedSize.Width;
            }

            //generating legend group
            SvgGroup legendGroup = new SvgGroup();

            const float legendYGap    = 30.0f;
            const float legendXOffset = 10.0f;


            legendGroup.Transforms.Add(new SvgTranslate(legendXOffset, Helpers.dtos(headerHeight + columnHeight + legendYGap)));

            const float titleYoffset    = 60.0f;
            const float itemsYoffset    = 20.0f;
            const float itemYgap        = 20.0f;
            const float interGroupYgap  = 15.0f;
            const float itemImageWidth  = 64.0f;
            const float itemImageHeight = 32.0f;
            const float descrXoffset    = 150.0f;

            SvgText legendTitle = new SvgText("Условные обозначения");

            legendTitle.FontSize = 22;
            legendTitle.Fill     = new SvgColourServer(System.Drawing.Color.Black);
            legendTitle.Transforms.Add(new SvgTranslate(30.0f, Helpers.dtos(titleYoffset * 0.25f)));
            legendGroup.Children.Add(legendTitle);

            float currGroupOffset = 0.0f;
            int   k = 0;

            foreach (ILegendGroup group in legend)
            {
                //title
                SvgText groupTitle = new SvgText(group.GroupName);
                groupTitle.FontSize = new SvgUnit((float)18);
                groupTitle.Fill     = new SvgColourServer(System.Drawing.Color.Black);
                groupTitle.Transforms.Add(new SvgTranslate(0.0f, currGroupOffset + titleYoffset));
                legendGroup.Children.Add(groupTitle);

                //items
                var items = group.Items;

                int j = 0;

                SvgElement[] fragments = items.Select(item => item.GetPresentation(itemImageWidth, itemImageHeight)).ToArray();

                foreach (var item in items)
                {
                    if (fragments[j] == null)
                    {
                        continue;
                    }

                    float yOffset = currGroupOffset + titleYoffset + itemsYoffset + j * (itemYgap + itemImageHeight);

                    if (fragments[j] is SvgFragment)
                    {
                        SvgFragment fragment = (SvgFragment)fragments[j];
                        fragment.X = 0;
                        fragment.Y = yOffset;
                    }
                    else
                    {
                        fragments[j].Transforms.Add(new SvgTranslate(0, yOffset));
                    }

                    legendGroup.Children.Add(fragments[j]);

                    SvgText text = new SvgText(item.Description);
                    text.FontSize = new SvgUnit((float)14);
                    text.Fill     = new SvgColourServer(System.Drawing.Color.Black);
                    text.Transforms.Add(new SvgTranslate(descrXoffset, yOffset + itemImageHeight * 0.5f));
                    legendGroup.Children.Add(text);
                    j++;
                }
                currGroupOffset += titleYoffset + itemsYoffset + (itemYgap + itemImageHeight) * items.Length + interGroupYgap;
                k++;
            }


            //gathering definitions
            SvgDefinitionList allDefs = new SvgDefinitionList();

            for (int i = 0; i < columns.Length; i++)
            {
                SvgDefinitionList defs = columns[i].Definitions;
                foreach (SvgPatternServer def in defs.Children)
                {
                    //overridings tile size
                    allDefs.Children.Add(def);
                }
            }

            SvgDocument result = new SvgDocument();

            result.Children.Add(allDefs);
            result.Width  = Helpers.dtos(horizontalOffset);
            result.Height = Helpers.dtos((headerHeight + columnHeight + legendYGap + currGroupOffset));
            result.Fill   = new SvgColourServer(System.Drawing.Color.White);
            result.Children.Add(headerGroup);
            result.Children.Add(columnsGroup);
            result.Children.Add(legendGroup);

            return(result);
        }