Element Builders – Создание SVG-элементов в C# с Fluent Builder API

Aspose.SVG Builder API позволяет разработчикам создавать и редактировать SVG-элементы программно на C# с помощью fluent builder syntax. Вместо ручного создания SVG XML или прямого изменения DOM-атрибутов Element Builders предлагает более чистый и удобный для сопровождения подход к генерации SVG.

Builder API поддерживает распространенные SVG-элементы: прямоугольники, круги, пути, линии, полигоны, текст и группы. С помощью вложенных builders и цепочек методов разработчики могут создавать сложную SVG-графику с меньшим количеством шаблонного кода и лучшей читаемостью.

В этой статье объясняется, как создавать SVG-элементы в C#, программно строить SVG-графику и изменять существующие SVG-документы с помощью Aspose.SVG for .NET. Вы узнаете о базовом классе SVGElementBuilder, классе SVGSVGElementBuilder, специализированных конструкторах элементов и о том, как они упрощают программирование SVG.

Что такое SVG Element Builders?

Element Builders – это специализированные классы-конструкторы для программного создания SVG-элементов. Каждый builder соответствует определенному SVG-элементу и предоставляет строго типизированные методы для настройки SVG-атрибутов и стилей.

Builder API поддерживает:

Fluent-синтаксис упрощает генерацию SVG и улучшает сопровождаемость кода в .NET-приложениях.

Поддерживаемые SVG Element Builders

BuilderSVG-элемент
SVGSVGElementBuilder<svg>
SVGRectElementBuilder<rect>
SVGCircleElementBuilder<circle>
SVGLineElementBuilder<line>
SVGPathElementBuilder<path>
SVGTextElementBuilder<text>
SVGGElementBuilder<g>
SVGPolygonElementBuilder<polygon>
SVGPolylineElementBuilder<polyline>

Полный список SVG element builders доступен на странице API Reference Aspose.Svg.Builder.

Создание новых элементов

Aspose.SVG SVG Builder API использует Fluent Builder Pattern – подход, который хорошо подходит для простого, понятного и гибкого управления SVG.

Fluent Builder Pattern

В SVG Builder API шаблон Fluent Builder используется для упрощения создания и обновления SVG-элементов, делая процесс более интуитивным и менее подверженным ошибкам. Суть шаблона – методы, которые настраивают SVG-элемент и возвращают экземпляр builder для цепочки вызовов.

Лямбда-выражения повышают ясность и краткость методов настройки. Они позволяют подробно, но компактно задавать атрибуты и стили SVG-элементов:

1    using (SVGDocument document = new SVGDocument())
2    {
3        SVGSVGElement svgElement = new SVGSVGElementBuilder()
4            .AddCircle(circle => circle
5                .Cx(100).Cy(100).R(50)
6                .Fill(Color.Red).Stroke(Paint.None)
7                .StrokeWidth(2))
8            .Build(document);
9    }

Здесь circle => circle.Cx(100).Cy(100).R(50).Fill(Color.Red).Stroke(Paint.None).StrokeWidth(2) – краткий способ настроить центр, радиус, заливку и обводку круга. Такой подход упрощает конфигурацию элемента и повышает читаемость и сопровождаемость кода.

Создание SVG с нуля

Рассмотрим краткий подход к созданию SVG с нуля с помощью C#.

1using Aspose.Svg.Builder;
2using System.Drawing;
3using System.IO;
 1    // Create an SVG document from scratch using the SVG Builder API in C#
 2
 3    // Create an <svg> element with specified width, height and viewBox, and add into it other required elements
 4    SVGSVGElement svg = new SVGSVGElementBuilder()
 5        .Width(700).Height(300)
 6        .ViewBox(0, 0, 700, 300)
 7
 8        .AddG(g => g
 9        .AddCircle(circle => circle.Cx(130).Cy(130).R(60).Fill(Paint.None).Stroke(Color.FromArgb(200, 0, 0)).StrokeWidth(70).StrokeDashArray(2, 14))
10        .AddText("I can create SVG from scratch!", x: 270, y: 140, fontSize: 30, fill: Color.Teal)
11        )
12        .Build(document.FirstChild as SVGSVGElement);
13
14    // Save the document
15    document.Save(Path.Combine(OutputDir, "svg-from-scratch.svg"));
16}

Визуализация файла svg-from-scratch.svg

В примере используется Fluent Builder Pattern внутри SVGSVGElementBuilder для построения SVG-элементов. Этот шаблон обеспечивает выразительный и удобный для сопровождения способ создания SVG-документов по сравнению с подходом из статьи Редактировать SVG-файл, который больше опирается на низкоуровневую работу с DOM и явную установку атрибутов. Этот подход:

Редактирование SVG

Один из мощных способов программного редактирования SVG – использование Element Builders.

Добавление новых элементов

Редактирование SVG с помощью Element Builders предоставляет гибкий подход к программному управлению векторной графикой. В следующем примере существующий SVG-файл открывается, дополняется новыми элементами и сохраняется:

1using Aspose.Svg.Builder;
2using System.Drawing;
3using System.IO;
 1// Add circle and polyline elements to an existing SVG using SVG Builder in C#
 2
 3string documentPath = Path.Combine(DataDir, "circles.svg");
 4
 5// Initialize an SVG document
 6using (SVGDocument document = new SVGDocument(documentPath))
 7{
 8    // Create a <circle> element with attributes
 9    SVGCircleElement circle = new SVGCircleElementBuilder()
10     .Cx(350).Cy(70).R(50).Fill(Paint.None).Stroke(Color.FromArgb(80, 132, 132)).StrokeWidth(10)
11     .Build(document);
12
13    // Append the newly created <circle> element to the root <svg> element
14    document.RootElement.AppendChild(circle);
15
16    // Create a <polyline> element with attributes
17    SVGPolylineElement polyline = new SVGPolylineElementBuilder()
18    .Points(new double[] { 125, 130, 275, 180, 425, 130 }).Stroke(Color.FromArgb(80, 132, 132)).Fill(Paint.None).StrokeWidth(10)
19    .Build(document);
20
21    // Append the newly created <polyline> element to the root <svg> element
22    document.RootElement.AppendChild(polyline);
23
24    // Save the document
25    document.Save(Path.Combine(OutputDir, "circles-edited.svg"));
26}

В этом примере:

На рисунке (a) показан исходный файл circles.svg, а на рисунке (b) – отредактированный файл circles-edited.svg с добавленными кругом и полилинией.

Визуализация исходного файла circles.svg и отредактированного файла circles-edited.svg с добавленными элементами circle и polyline.

Изменение существующих элементов

В следующем C# примере мы обновляем существующий SVG-документ, изменяя цвет заливки и обводки первого SVG-элемента <circle> в документе:

1using Aspose.Svg;
2using Aspose.Svg.Builder;
3using System.Drawing;
4using Aspose.Svg.Dom.Svg;
5using System.Linq;
6using System.IO;
 1// Modify an existing SVG circle element using SVG Builder in C#
 2
 3string documentPath = Path.Combine(DataDir, "circles.svg");
 4
 5// Initialize an SVG document
 6using (SVGDocument document = new SVGDocument(documentPath))
 7{
 8    // Assume an existing SVG element is part of the document
 9    SVGCircleElement circle = document.GetElementsByTagName("circle").First() as SVGCircleElement;
10
11    // Modify the first <circle> element using SVGCircleElementBuilder
12    new SVGCircleElementBuilder()
13        .Stroke(Color.DarkRed).Fill(Color.LightGray)
14
15        // The first <circle> element is now updated with new configurations
16        .Build(circle);
17
18    // Save the document
19    document.Save(Path.Combine(OutputDir, "circles-modified.svg"));
20}

Element Builders предоставляет метод Build(T element) для обновления существующих SVG-элементов и изменения их атрибутов или стилей. На рисунке (a) показан исходный файл circles.svg, а на рисунке (b) – circles-modified.svg с перекрашенным первым кругом.

Визуализация исходного файла circles.svg и измененного файла circles-modified.svg с перекрашенным первым элементом circle.

Пример использования Element Builders

Следующий фрагмент кода показывает, как использовать Element Builders для создания SVG-документа с различными SVG-фигурами.

1using Aspose.Svg;
2using Aspose.Svg.Builder;
3using System.Drawing;
4using Aspose.Svg.Dom.Svg;
5using System.IO;
 1// Create basic SVG shapes programmatically using SVG Builder in C#
 2
 3string svgContent = "<svg xmlns=\"http://www.w3.org/2000/svg\"></svg>";
 4using (SVGDocument document = new SVGDocument(svgContent, "."))
 5{
 6    SVGSVGElement svg = new SVGSVGElementBuilder()
 7        .Width(100, LengthType.Percentage).Height(100, LengthType.Percentage)
 8        .ViewBox(0, 0, 800, 800)
 9
10            .AddG(g => g.FontSize(20).TextAnchor(TextAnchor.End)
11                .AddText("<rect>", y: 30)
12                .AddText("<circle>", y: 70)
13                .AddText("<ellipse>", y: 110)
14                .AddText("<line>", y: 150)
15                .AddText("<polyline>", x: 300, y: 30)
16                .AddText("<polygon>", x: 300, y: 70)
17                .AddText("<path>", x: 300, y: 110)
18                )
19
20            .AddG(gg => gg.Fill(Color.Teal).StrokeWidth(3)
21                .AddRect(r => r.X(35).Y(5).Width(30).Height(30))
22                .AddCircle(c => c.Cx(50).Cy(60).R(17))
23                .AddEllipse(e => e.Cx(50).Cy(100).Rx(25).Ry(12))
24                .AddLine(l => l.X1(30).X2(70).Y1(140).Y2(140).Stroke(Color.Teal))
25                )
26            .AddG(ggg => ggg.Fill(Paint.None).StrokeWidth(3).Stroke(Color.Teal).Transform(t => t.Translate(300, -160))
27                .AddPolygon(points: new double[] { 30, 215, 90, 215, 120, 230, 70, 240, 30, 215 }, fill: Color.Teal)
28                .AddPolyline(points: new double[] { 30, 200, 65, 170, 90, 190, 120, 180 })
29                .AddPath(d: path => path.M(30, 275).Q(55, 250, 70, 250).T(80, 275).T(120, 260))
30                )
31
32        .Build(document.FirstChild as SVGSVGElement);
33    document.Save(Path.Combine(OutputDir, "svg-elements.svg"));
34}

Визуализация файла svg-elements.svg с названиями и изображениями семи SVG-фигур.

Element Builders предоставляет fluent и выразительный синтаксис для построения SVG-элементов, улучшая читаемость и сопровождаемость кода. В этом примере SVGSVGElementBuilder создает SVG-элемент с атрибутами width, height и viewBox. Затем Fluent Builder Pattern используется для создания прямоугольников, кругов, эллипсов, линий, полилиний, полигонов и путей, размещенных и стилизованных внутри элементов <g>.

Зачем использовать Fluent SVG Builders?

DOM-манипуляцииBuilder API
Ручная работа с атрибутамиСтрого типизированные методы
Более многословный кодFluent-цепочки вызовов
Сложнее сопровождатьЛегче читать
Повторяющиеся XML-операцииПереиспользуемая builder-логика

FAQ

1. Почему разработчики используют Builder APIs вместо прямой генерации XML?
Builder APIs заменяет ручное создание XML типизированными fluent-методами, делая SVG-код более читаемым, сопровождаемым и расширяемым.

2. Соответствует ли сгенерированный SVG стандартам?
Да. Aspose.SVG генерирует SVG-разметку на основе стандартов, совместимую с современными SVG-рендерерами.

3. Можно ли создавать интерактивную SVG-графику с Element Builders?
Да. Сгенерированные SVG-элементы можно позже стилизовать, анимировать или изменять с помощью CSS и JavaScript в веб-приложениях.

4. Можно ли встроить сгенерированную SVG-графику прямо в HTML-страницы?
Да. SVG-документы, созданные с Aspose.SVG, можно встраивать inline в HTML или использовать как самостоятельные SVG-файлы.

Частые ошибки и исправления

ПроблемаВозможная причинаРекомендуемое исправление
SVG-элемент не виденОтсутствует заливка или обводкаПримените Fill() или Stroke()
Изменения SVG не сохраняютсяДокумент не сохранен после измененияВызовите document.Save() после обновлений
Элементы находятся за пределами холстаНеверные координаты или viewBoxПроверьте размеры и позиции SVG
Существующий элемент не обновляетсяНеверная ссылка на элементУбедитесь, что целевой элемент получен правильно
Фигуры выглядят искаженнымиНеверные пропорции viewBoxИспользуйте согласованные SVG-системы координат

Смотрите также

Close
Loading

Analyzing your prompt, please hold on...

An error occurred while retrieving the results. Please refresh the page and try again.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.