3 компонент

This commit is contained in:
bekodeg 2024-10-28 20:24:52 +04:00
parent 098e5a1d3c
commit 2d50eff660
12 changed files with 292 additions and 13 deletions

View File

@ -0,0 +1,36 @@
namespace Cop.Borovkov.Var3.Components
{
partial class CustomPdfHistogram
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором компонентов
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@ -0,0 +1,68 @@
using Cop.Borovkov.Var3.Models;
using PIHelperSh.PdfCreator;
using PIHelperSh.PdfCreator.Enums;
using PIHelperSh.PdfCreator.Models.PieChartModel;
using System.ComponentModel;
using static System.Runtime.InteropServices.Marshalling.IIUnknownCacheStrategy;
namespace Cop.Borovkov.Var3.Components
{
public partial class CustomPdfHistogram : Component
{
public CustomPdfHistogram()
{
InitializeComponent();
}
public CustomPdfHistogram(IContainer container)
{
container.Add(this);
InitializeComponent();
}
/// <summary>
/// Сохранить гистограмму в пдф
/// </summary>
/// <param name="histogramInfo"></param>
public void SaveToPdf(PdfHistigramInfo histogramInfo)
{
if (string.IsNullOrEmpty(histogramInfo.FilePath))
throw new ArgumentException("Путь к файлу не должен быть пустым.");
if (string.IsNullOrEmpty(histogramInfo.DocumentTitle))
throw new ArgumentException("Название документа не должно быть пустым.");
if (string.IsNullOrEmpty(histogramInfo.HistogramTitle))
throw new ArgumentException("Заголовок диаграммы не должен быть пустым.");
if (histogramInfo.Values == null || histogramInfo.Values.Count() == 0)
throw new ArgumentException("Набор данных не должен быть пустым.");
foreach (var data in histogramInfo.Values)
{
if (string.IsNullOrEmpty(data.Name) || data.Values == null || data.Values.Count() == 0)
throw new ArgumentException($"Набор данных для серии '{data.Name}' некорректен.");
}
PdfCreator creator = new PdfCreator();
creator.AddParagraph(new()
{
Style = PdfStyleType.Title,
Text = histogramInfo.DocumentTitle,
MarginAfter = PdfMargin.Smal,
});
creator.AddHistogram(new()
{
ChartName = histogramInfo.HistogramTitle,
LegendPosition = histogramInfo.LegendPosition,
DataSet = histogramInfo.Values.Select(l => new PdfHistogramData()
{
DisplayName = l.Name,
Value = l.Values
}).ToList()
});
creator.SavePdf(histogramInfo.FilePath);
}
}
}

View File

@ -0,0 +1,35 @@
using PIHelperSh.PdfCreator.Enums;
namespace Cop.Borovkov.Var3.Models
{
/// <summary>
/// Параметры для создания линейной диограммы
/// </summary>
public record PdfHistigramInfo
{
/// <summary>
/// Имя файла (включая путь до файла)
/// </summary>
public string FilePath { get; init; } = @"C:\pdfTable.pdf";
/// <summary>
/// Заголовок документа
/// </summary>
public string DocumentTitle { get; init; } = "Гистограмма";
/// <summary>
/// Заголовок диограммы
/// </summary>
public string HistogramTitle { get; init; } = "Гистограмма";
/// <summary>
/// Расположение легенды
/// </summary>
public PdfLegendPosition LegendPosition { get; init; } = PdfLegendPosition.Bottom;
/// <summary>
/// Значения
/// </summary>
public required IEnumerable<PdfHistogramLineInfo> Values { get; init; }
}
}

View File

@ -0,0 +1,15 @@
namespace Cop.Borovkov.Var3.Models
{
public record PdfHistogramLineInfo
{
/// <summary>
/// Название графика
/// </summary>
public required string Name { get; init; }
/// <summary>
/// Значения
/// </summary>
public required IEnumerable<double> Values { get; init; }
}
}

View File

@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PIHelperSh.PdfCreator.Enums
namespace PIHelperSh.PdfCreator.Enums
{
/// <summary>
/// Варианты расположения легенды

View File

@ -0,0 +1,42 @@
using System.Drawing;
namespace PIHelperSh.PdfCreator.Models.PieChartModel
{
/// <summary>
/// Элемент данных. Одно значение для диаграммы.
/// </summary>
public class PdfHistogramData
{
/// <summary>
/// Название варианта
/// </summary>
public string DisplayName { get; set; } = null!;
/// <summary>
/// Значение варианта(по ним строят диаграмму)
/// </summary>
public IEnumerable<double> Value { get; set; }
/// <summary>
/// Цвет области на диаграме. При null будет использоватсся выдача цветов по умолчанию)
/// </summary>
public Color? Color { get; set; } = null;
/// <summary>
/// </summary>
public PdfHistogramData()
{
Value = [];
}
/// <summary>
/// </summary>
/// <param name="displayName"></param>
/// <param name="value"></param>
public PdfHistogramData(string displayName, IEnumerable<double> value)
{
DisplayName = displayName;
Value = value;
}
}
}

View File

@ -0,0 +1,13 @@
namespace PIHelperSh.PdfCreator.Models.PieChartModel
{
/// <summary>
/// Модель линейной диограммы
/// </summary>
public class PdfHistogramModel : PdfPieChartModel
{
/// <summary>
/// Набор данных для создания диаграммы
/// </summary>
public new List<PdfHistogramData> DataSet { get; set; } = [];
}
}

View File

@ -1,9 +1,4 @@
using PIHelperSh.PdfCreator.Enums;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PIHelperSh.PdfCreator.Models.PieChartModel
{

View File

@ -505,6 +505,47 @@ namespace PIHelperSh.PdfCreator
_section?.Add(chart);
}
/// <summary>
/// Создаёт линейную диаграмму.
/// </summary>
/// <param name="pieHistogram">Модель для круговой диаграммы</param>
public void AddHistogram(PdfHistogramModel pieHistogram)
{
if (_document == null)
{
return;
}
Chart chart = new Chart(ChartType.Line);
ConfiguratePieChart(chart, pieHistogram);
XSeries xseries = chart.XValues.AddXSeries();
foreach (var item in pieHistogram.DataSet)
{
Series series = chart.SeriesCollection.AddSeries();
series.Name = item.DisplayName;
series.Add(item.Value.ToArray());
xseries.Add(item.DisplayName);
if (item.Color.HasValue)
{
series.FillFormat.Color = new Color((uint)item.Color.Value.ToArgb());
}
}
chart.XAxis.MajorTickMark = TickMarkType.Outside;
chart.XAxis.Title.Caption = "X";
chart.XAxis.Title.Alignment = HorizontalAlignment.Right;
chart.YAxis.MajorTickMark = TickMarkType.Outside;
chart.YAxis.Title.Caption = "Y";
chart.YAxis.HasMajorGridlines = true;
_section?.Add(chart);
}
/// <summary>
/// Добавляем на лист изображение. Можно по пути, можно по потоку, можно по Base64 строке
/// </summary>

View File

@ -33,6 +33,8 @@
button1 = new Button();
button2 = new Button();
customPdfTableWithGrouping1 = new Cop.Borovkov.Var3.Components.CustomPdfTableWithGrouping(components);
button3 = new Button();
customPdfHistogram1 = new Cop.Borovkov.Var3.Components.CustomPdfHistogram(components);
SuspendLayout();
//
// button1
@ -56,11 +58,22 @@
button2.UseVisualStyleBackColor = true;
button2.Click += button2_Click;
//
// button3
//
button3.Location = new Point(206, 18);
button3.Name = "button3";
button3.Size = new Size(94, 29);
button3.TabIndex = 2;
button3.Text = "button3";
button3.UseVisualStyleBackColor = true;
button3.Click += button3_Click;
//
// Form2
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(914, 600);
Controls.Add(button3);
Controls.Add(button2);
Controls.Add(button1);
Margin = new Padding(3, 4, 3, 4);
@ -75,5 +88,7 @@
private Button button1;
private Button button2;
private Cop.Borovkov.Var3.Components.CustomPdfTableWithGrouping customPdfTableWithGrouping1;
private Button button3;
private Cop.Borovkov.Var3.Components.CustomPdfHistogram customPdfHistogram1;
}
}

View File

@ -1,4 +1,6 @@
using Newtonsoft.Json.Serialization;
using Cop.Borovkov.Var3.Components;
using Newtonsoft.Json.Serialization;
using PIHelperSh.PdfCreator.Enums;
using TestCustomComponents.Models;
namespace TestCustomComponents.Forms
@ -107,5 +109,25 @@ namespace TestCustomComponents.Forms
HeaderHeight = 100f,
});
}
private void button3_Click(object sender, EventArgs e)
{
customPdfHistogram1.SaveToPdf(new()
{
FilePath = @"E:\test\test.pdf",
DocumentTitle = "Текст заголовка",
HistogramTitle = "Заголовок диограммы",
Values = [
new(){
Name = "Линия1",
Values = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89],
},
new(){
Name = "Линия1",
Values = [1, 100, 10, 80, 30, 60, 50],
}
],
});
}
}
}

View File

@ -123,4 +123,7 @@
<metadata name="customPdfTableWithGrouping1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>185, 17</value>
</metadata>
<metadata name="customPdfHistogram1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>446, 17</value>
</metadata>
</root>