private void Plane_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            PlaneVM vm = e.NewValue as PlaneVM;

            if (vm != null)
            {
                vm.DragReferenceElem = AnnoGrid.LowerGrid;
                vm.SaveImageCommand  = new DelegateCommand(() =>
                {
                    var dialog        = new Microsoft.Win32.SaveFileDialog();
                    dialog.DefaultExt = "svg";
                    dialog.Filter     = "Scalable Vector Graphics (.svg)|*.svg";
                    var res           = dialog.ShowDialog();
                    if (res.HasValue && res.Value)
                    {
                        string filepath = dialog.FileName;

                        List <Reports.SVG.ISvgRenderableColumn> columnRenderers = new List <Reports.SVG.ISvgRenderableColumn>();

                        int idx = 0;

                        List <Tuple <Reports.SVG.LegendItemKey, Reports.SVG.ILegendItem> > foundLegendItems = new List <Tuple <Reports.SVG.LegendItemKey, Reports.SVG.ILegendItem> >();

                        foreach (UIElement elem in AnnoGrid.HeadersGrid.Children)
                        {
                            var colVm = vm.AnnoGridVM.Columns[idx];
                            //gathering column SVG representation ...
                            columnRenderers.Add(Reports.SVG.ColumnPainterFactory.Create(elem, AnnoGrid.ColumnsGrid.Children[idx] as ColumnView, colVm));
                            //... and possible appearence in the legend
                            if (colVm is ILayerColumn)
                            {
                                ILayerColumn lcVM = colVm as ILayerColumn;
                                foundLegendItems.AddRange(lcVM.Layers.SelectMany(l => Reports.SVG.LegendFactory.GetLegendItemsForLayer(l)));
                            }
                            if (colVm is Columns.VisualColumnVM)
                            {
                                Columns.VisualColumnVM vcVM = (Columns.VisualColumnVM)colVm;
                                foundLegendItems.AddRange(vcVM.Layers.SelectMany(l => Reports.SVG.LegendFactory.GetLegendItemsForVisualLayer(l)));
                            }
                            idx++;
                        }

                        //the legend items are split into groups
                        Dictionary <Tuple <string, Reports.SVG.PropertyRepresentation>, List <Reports.SVG.ILegendItem> > groupsData
                            = new Dictionary <Tuple <string, Reports.SVG.PropertyRepresentation>, List <Reports.SVG.ILegendItem> >();
                        foreach (var item in foundLegendItems)
                        {
                            Tuple <string, Reports.SVG.PropertyRepresentation> key = Tuple.Create(item.Item1.PropID, item.Item1.Representation);
                            if (!groupsData.ContainsKey(key))
                            {
                                groupsData.Add(key, new List <Reports.SVG.ILegendItem>());
                            }
                            groupsData[key].Add(item.Item2);
                        }

                        //groups are transformed into ILegnedGroups
                        List <Reports.SVG.ILegendGroup> legendGroups = new List <Reports.SVG.ILegendGroup>();
                        foreach (var kvp in groupsData)
                        {
                            Reports.SVG.ILegendGroup group = new Reports.SVG.LegendGroup(
                                kvp.Key.Item1,
                                kvp.Value.ToArray());
                            legendGroups.Add(group);
                        }



                        var svg = Reports.SVG.Report.Generate(columnRenderers.ToArray(), legendGroups.ToArray());
                        using (XmlTextWriter writer = new XmlTextWriter(filepath, Encoding.UTF8))
                        {
                            svg.Write(writer);
                        }

                        MessageBox.Show(string.Format("SVG отчет успешно сохранен в файл {0}", filepath), "Успешно", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                });
            }
        }
Example #2
0
 public LayeredColumnPainter(UIElement headerView, ColumnView view, ColumnVM vm, ILayerColumn columnVm, ILayerPainter layerPainter) : base(headerView, view, vm)
 {
     this.columnVm     = columnVm;
     this.layerPainter = layerPainter;
 }