From 580a08d48ffb369c17169577d3f826fd00c6e010 Mon Sep 17 00:00:00 2001 From: Yourdax Date: Wed, 2 Oct 2024 19:15:15 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=B0=D0=B4=D0=B5=D1=8E=D1=81=D1=8C=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B9=D0=B4=D0=B5=D1=82,=20=D0=BD=D0=BE=20=D0=BC?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BA=D0=B0=D0=B6=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D1=87=D1=82=D0=BE=20=D0=BD=D0=B5=D1=82...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FormLibrary/ComponentHistogramToPdf.cs | 49 +++++++++++++++---- .../{LegendPosition.cs => LegendPositions.cs} | 2 +- KopLab1/Forms/MainForm.cs | 7 +-- 3 files changed, 45 insertions(+), 13 deletions(-) rename KopLab1/FormLibrary/HelperClasses/{LegendPosition.cs => LegendPositions.cs} (87%) diff --git a/KopLab1/FormLibrary/ComponentHistogramToPdf.cs b/KopLab1/FormLibrary/ComponentHistogramToPdf.cs index 0321175..4e674b3 100644 --- a/KopLab1/FormLibrary/ComponentHistogramToPdf.cs +++ b/KopLab1/FormLibrary/ComponentHistogramToPdf.cs @@ -9,6 +9,8 @@ using System; using System.Collections.Generic; using System.ComponentModel; using OxyPlot.WindowsForms; +using OxyPlot.Legends; +using OxyPlot.Annotations; namespace FormLibrary { @@ -25,9 +27,9 @@ namespace FormLibrary InitializeComponent(); } - public void CreateHistogramPdf(string filePath, string documentTitle, string chartTitle, LegendPosition legendPosition, List chartData) + public void CreateHistogramPdf(string filePath, string documentTitle, string chartTitle, LegendPositions legendPosition, List chartData) { - // Проверка на заполненность входных данных + // Проверка входных данных... if (string.IsNullOrEmpty(filePath)) throw new ArgumentException("Путь к файлу не может быть пустым."); if (string.IsNullOrEmpty(documentTitle)) @@ -43,8 +45,9 @@ namespace FormLibrary throw new ArgumentException($"Набор данных для серии '{data.SeriesName}' некорректен."); } - // Создание графика + // создание графика var plotModel = new PlotModel { Title = chartTitle }; + foreach (var data in chartData) { var barSeries = new BarSeries { Title = data.SeriesName }; @@ -55,15 +58,18 @@ namespace FormLibrary plotModel.Series.Add(barSeries); } - // Сохранение графика в изображение - var pngExporter = new PngExporter { Width = 600, Height = 400}; + // Добавление легенды + AddLegend(plotModel, legendPosition); + + // сохранение графика в изображение + var pngExporter = new PngExporter { Width = 600, Height = 400 }; using (var stream = new MemoryStream()) { pngExporter.Export(plotModel, stream); File.WriteAllBytes("chart.png", stream.ToArray()); } - // Создание документа + // создание документа Document document = new Document(); document.Info.Title = documentTitle; document.Info.Subject = "Гистограмма"; @@ -71,18 +77,43 @@ namespace FormLibrary Section section = document.AddSection(); section.AddParagraph(chartTitle, "Heading1"); - // Вставка изображения в PDF + // вставка изображения в PDF var image = section.AddImage("chart.png"); image.Width = Unit.FromCentimeter(15); - // Сохранение документа в PDF PdfDocumentRenderer renderer = new PdfDocumentRenderer(true) { Document = document }; renderer.RenderDocument(); renderer.PdfDocument.Save(filePath); - // Удалите временное изображение, если необходимо File.Delete("chart.png"); } + //добавление легенды + private void AddLegend(PlotModel plotModel, LegendPositions legendPosition) + { + // Создание легенды + var legend = new OxyPlot.Legends.Legend + { + LegendPlacement = LegendPlacement.Outside, + LegendPosition = ConvertLegendPosition(legendPosition), + LegendOrientation = LegendOrientation.Vertical + }; + + plotModel.Legends.Add(legend); + } + + // конвертация позиции легенды + private OxyPlot.Legends.LegendPosition ConvertLegendPosition(LegendPositions legendPosition) + { + return legendPosition switch + { + LegendPositions.Top => OxyPlot.Legends.LegendPosition.TopCenter, + LegendPositions.Bottom => OxyPlot.Legends.LegendPosition.BottomCenter, + LegendPositions.Left => OxyPlot.Legends.LegendPosition.LeftTop, + LegendPositions.Right => OxyPlot.Legends.LegendPosition.RightTop, + _ => OxyPlot.Legends.LegendPosition.TopCenter, // Положение по умолчанию + }; + } + } } diff --git a/KopLab1/FormLibrary/HelperClasses/LegendPosition.cs b/KopLab1/FormLibrary/HelperClasses/LegendPositions.cs similarity index 87% rename from KopLab1/FormLibrary/HelperClasses/LegendPosition.cs rename to KopLab1/FormLibrary/HelperClasses/LegendPositions.cs index b4d4996..5d03e7f 100644 --- a/KopLab1/FormLibrary/HelperClasses/LegendPosition.cs +++ b/KopLab1/FormLibrary/HelperClasses/LegendPositions.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace FormLibrary.HelperClasses { - public enum LegendPosition + public enum LegendPositions { Top, Bottom, diff --git a/KopLab1/Forms/MainForm.cs b/KopLab1/Forms/MainForm.cs index 6007219..433fd34 100644 --- a/KopLab1/Forms/MainForm.cs +++ b/KopLab1/Forms/MainForm.cs @@ -200,15 +200,16 @@ namespace Forms var chartData = new List { - new ChartData { SeriesName = "Серия 1", Data = new Dictionary { { "Категория 1", 5 }, { "Категория 2", 10 } } }, - new ChartData { SeriesName = "Серия 2", Data = new Dictionary { { "Категория 1", 3 }, { "Категория 2", 8 } } } + new ChartData { SeriesName = "Серияd 1", Data = new Dictionary { { "Категорияz 1", 5 }, { "Категорияx 2", 10 } } }, + new ChartData { SeriesName = "Серияs 2", Data = new Dictionary { { "Категорияa 1", 3 }, { "Категорияs 2", 8 } } }, + new ChartData { SeriesName = "Серияs 2", Data = new Dictionary { { "Категорияa 1", 3 }, { "Категорияs 2", 8 } } } }; // Укажите путь, куда хотите сохранить PDF string filePath = "G:\\Гистограмма.pdf"; // Генерация PDF - histogramGenerator.CreateHistogramPdf(filePath, "Название документа", "Заголовок диаграммы", LegendPosition.Top, chartData); + histogramGenerator.CreateHistogramPdf(filePath, "Название документа", "Заголовок диаграммы", LegendPositions.Bottom, chartData); MessageBox.Show("PDF успешно сгенерирован!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); }