Path Builder - создание SVG paths в C#

Создание SVG Path с Aspose.SVG

SVG paths - одна из самых мощных возможностей SVG для создания пользовательской векторной графики, кривых, контуров и сложных фигур. С помощью Aspose.SVG Builder API разработчики могут программно создавать SVG path elements в C# с читаемым fluent syntax вместо ручного написания строк SVG path data.

В этой статье объясняется, как создавать SVG paths в C#, программно строить сложную векторную графику и использовать SVG text paths с Aspose.SVG for .NET.

Path Builder

Класс PathBuilder упрощает создание SVG paths, предоставляя методы для распространенных команд SVG path, таких как M (move to - переместить в точку), L (line to - провести линию к точке), C (cubic Bezier curve - кубическая кривая Безье), Q (quadratic Bezier curve - квадратичная кривая Безье), A (arc - дуга) и Z (close path - закрыть контур).

Aspose.SVG Builder API предоставляет класс SVGPathElementBuilder для программного создания SVG-элементов <path>. С помощью PathBuilder разработчики могут задавать команды SVG path через цепочки fluent-методов, которые повышают читаемость кода и упрощают генерацию SVG.

SVG paths обычно используются для:

Builders within Builders

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

Паттерн “builder within a builder” предполагает использование нескольких классов builder, когда один builder вложен в другой, чтобы упростить построение сложных объектов или структур. В этом паттерне внешний builder создает объект или контейнер более высокого уровня, а внутренний builder отвечает за создание компонента или вложенного объекта внутри этого контейнера.

В следующем фрагменте кода PathBuilder является примером builder within a builder и демонстрирует паттерн вложенных builders. Здесь SVGSVGElementBuilder выступает внешним builder, отвечающим за создание элемента <svg>. В SVGSVGElementBuilder экземпляр PathBuilder используется для построения элемента <path>, то есть элемента внутри корневого элемента <svg>.

1using Aspose.Svg.Builder;
2using System.Drawing;
3using System.IO;
 1// Create an SVG path element with line commands programmatically in C# using SVG Path Builder
 2
 3// Initialize an SVG document
 4using (SVGDocument document = new SVGDocument())
 5{
 6    // Create an <svg> element with specified width, height and viewBox, and add a <path> element to it
 7    SVGSVGElement svg = new SVGSVGElementBuilder()
 8        .Width(200).Height(200)
 9        .ViewBox(0, 0, 150, 150)
10
11        .AddPath(p => p
12        // 'D' method defines the 'd' attribute, which contains the path data
13        .D(d => d
14        // 'M' sets the starting point of the path (Move to x=50, y=50)
15        .M(50, 50)
16        // 'L' draws a line from the current point to the new point (Line to x=100, y=50)
17        .L(100, 50)
18        // Another 'L' to draw a line to a new point (Line to x=100, y=100)
19        .L(100, 100)
20        // 'Z' closes the path by drawing a line to the starting point
21        .Z())
22        // Sets the fill color of the path to teal 
23        .Fill(Color.Teal))
24        .Build(document.FirstChild as SVGSVGElement);
25
26    // Save the SVG document
27    document.Save(Path.Combine(OutputDir, "path.svg"));
28}

Как работает Path

В этом примере метод AddPath() SVG builder используется для определения элемента <path>. Метод D() задает SVG path data с помощью команд SVG path. В этом примере:

Fluent syntax упрощает генерацию SVG paths и делает определения path более удобными для чтения и сопровождения.

SVG Path Commands, поддерживаемые PathBuilder

PathBuilder поддерживает абсолютные и относительные SVG path commands для программного создания линий, кривых, дуг и сложной векторной графики. Эти команды можно комбинировать для создания сложных SVG-фигур, плавных кривых, векторных иллюстраций и переиспользуемых графических компонентов в C#.

CommandRelative CommandОписание
MmПереместить текущую точку в новую позицию
LlНарисовать прямую линию к точке
HhНарисовать горизонтальную линию
VvНарисовать вертикальную линию
CcНарисовать кубическую кривую Безье
SsНарисовать гладкую кубическую кривую Безье
QqНарисовать квадратичную кривую Безье
TtНарисовать гладкую квадратичную кривую Безье
AaНарисовать эллиптическую дугу
ZzЗакрыть текущий path

Добавление пользовательских SVG Path Data

Path data также можно добавлять напрямую в виде строки с помощью метода AddPathSegment().

1.D(d => d.AddPathSegment(
2    "M199 89 C206 66 235 25 270 30 286 38 298 59 310 73"
3))

Этот подход полезен при импорте существующих SVG path data или при работе с SVG-графикой, сгенерированной внешними средствами.

Создание SVG Curves и Bezier Paths

SVG paths поддерживают квадратичные и кубические кривые Безье для создания плавной векторной графики и сложных контуров.

 1using Aspose.Svg.Builder;
 2using System.Drawing;
 3using System.IO;
 4
 5using (SVGDocument document = new SVGDocument())
 6{
 7    // Создайте элемент <svg> с заданными width, height и viewBox и добавьте в него элемент <path>
 8    SVGSVGElement svg = new SVGSVGElementBuilder()
 9        .Width(500).Height(500)
10        .ViewBox(0, 0, 400, 400)
11
12        .AddPath(p => p
13            .D(d => d
14            .M(80, 210)
15            .Q(95, 110, 200, 200)
16            .T(350, 200)
17        )
18        // Задайте красный цвет заливки для path
19        .Fill(Color.Red))
20        .Build(document.FirstChild as SVGSVGElement);
21
22    // Сохраните SVG-документ
23    document.Save(Path.Combine(OutputDir, "curve-path.svg"));
24}

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

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

SVG TextPath

SVG может размещать текст вдоль path, определенного элементом <path>. Это делается с помощью элемента <textPath> с атрибутом href. Текст, отображаемый вдоль кривой, обычно использует атрибут href со ссылкой на элемент <path>. Ниже приведен пример того, как SVG textPath можно реализовать с помощью SVG Builder API:

1using Aspose.Svg.Builder;
2using System.Drawing;
3using System.IO;
 1// Create SVG text path in C# using SVG Builder
 2
 3// Initialize an SVG document
 4using (SVGDocument document = new SVGDocument())
 5{
 6    // Create an <svg> element with specified width, height, and viewBox, and add into it <path> elements
 7    SVGSVGElement svg = new SVGSVGElementBuilder()
 8        .Width(1200).Height(300)
 9        .ViewBox(0, 0, 1200, 300)
10
11        .AddPath(p => p.Id("Path1")
12            .Fill(f => f.None()).Stroke(Color.IndianRed).Transform(t => t.Translate(-100, 40))
13            .D(d => d.AddPathSegment("M 199 89 C 206 66 235 25 270 30 286 38 298 59 310 73 321 87 338 99 356 103 387 111 396 90 410 85"))
14         )
15
16        .AddPath(p => p.Id("Path2")
17            .Fill(f => f.None()).Stroke(Paint.None).Transform(t => t.Translate(400, -100))
18            .D(d => d.M(80, 210).Q(95, 110, 200, 200).T(400, 200)))
19
20
21         .AddText(t => t.FontSize(30).Fill(Color.Teal)
22             .AddTextPath(tp => tp
23                 .Href("#Path1")
24                 .AddContent("SVG textPath element")
25              )
26             .AddTextPath(tp => tp
27                  .Href("#Path2")
28                  .AddContent("SVG can place text along a path")
29              )
30         )
31
32        .Build(document.FirstChild as SVGSVGElement);
33
34    // Save the SVG document
35    document.Save(Path.Combine(OutputDir, "text-path.svg"));
36}

В примере мы создаем два paths с разными атрибутами id. Paths создаются разными способами: первый path использует метод AddPathSegment(), а второй path использует методы M(), Q() и T(). Кроме того, первый path окрашен, а второй прозрачен. SVG-элемент <textPath> ссылается на атрибут id элемента <path> в SVG-документе, что позволяет отображать текст вдоль этого заранее определенного path:

Визуализация файла text-path.svg с текстом, следующим вдоль SVG-кривых.

В этом примере мы также используем builders within builders. Внешний builder SVGSVGElementBuilder отвечает за построение элемента <svg>, а вложенные builders используются для добавления элементов <path> и <text> с элементами <textPath> внутри них. Паттерн builders within builders упрощает построение сложных SVG-документов, разбивая процесс на иерархические уровни builders. Этот паттерн способствует инкапсуляции, читаемости и гибкости, упрощая разработчикам эффективное создание SVG-документов и управление ими.

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

ПроблемаВозможная причинаРекомендуемое исправление
SVG path не виденОтсутствуют стили fill или strokeПримените Fill() или Stroke() к элементу path
Форма path выглядит незавершеннойPath не закрытИспользуйте команду Z(), чтобы закрыть path
Текст не следует вдоль кривойНеверная ссылка на pathУбедитесь, что Href() соответствует значению Id()
Кривые выглядят искаженнымиНеверные координаты контрольных точекНастройте контрольные точки кривой Безье
Импортированные SVG path data отображаются неверноНедопустимый синтаксис SVG pathПроверьте строку SVG path перед импортом

Краткие рецепты

1. Создать простой треугольник

 1using (SVGDocument document = new SVGDocument())
 2{
 3    SVGSVGElement svg = new SVGSVGElementBuilder()
 4        .Width(200).Height(200)
 5        .ViewBox(0, 0, 150, 150)
 6        .AddPath(p => p
 7            .D(d => d
 8            .M(50, 150)
 9            .L(150, 150)
10            .L(100, 50)
11            .Z())
12        .Fill(Color.Teal))
13        .Build(document.FirstChild as SVGSVGElement);
14    document.Save("triangle.svg");
15}

2. Добавить сегмент path

1    .AddPath(p => p
2        .Fill(Color.IndianRed)
3        .D(d => d.AddPathSegment("M10 75 Q150 0 290 75"))
4        )

3. Объединить несколько сегментов path

 1    .AddPath(p => p
 2    .Fill(Color.CadetBlue)
 3    .Stroke(Color.Red)
 4    .StrokeWidth(2)
 5    .D(d => d
 6        .AddPathSegment("M40 120")
 7        .AddPathSegment("C70 20 140 20 170 120")
 8        .AddPathSegment("S270 220 300 120")
 9        .AddPathSegment("Q250 180 170 170")
10        .AddPathSegment("Q90 160 40 120")
11        )
12    )

Примечание: Первый рецепт является полным примером. Остальные рецепты - это фрагменты, которые следует включать в полный процесс создания SVG-документа.

FAQ

1. PathBuilder лучше, чем ручное написание строк SVG path?
Для сложной SVG-графики PathBuilder обычно проще сопровождать и отлаживать, чем вручную объединять строки SVG path. Fluent-команды path повышают читаемость и снижают риск некорректного синтаксиса SVG path.

2. Почему SVG paths часто используются вместо базовых фигур?
SVG paths обеспечивают гораздо большую гибкость, чем простые элементы, такие как <rect> или <circle>. Один path может представлять очень сложную векторную графику, кривые и составные фигуры.

3. Можно ли преобразовать существующие SVG path data в команды PathBuilder?
Да. Существующие значения атрибута SVG d можно преобразовать во fluent-команды PathBuilder или вставить напрямую с помощью методов path segment.

4. SVG paths не зависят от разрешения?
Да. SVG paths являются векторными и масштабируются без потери качества, поэтому они подходят для адаптивной графики, дисплеев высокого разрешения и печатных процессов.

5. Может ли SVG path содержать несколько несвязанных фигур?
Да. Один SVG path может содержать несколько subpaths, если использовать несколько команд M (move to) в одном определении path.

6. В чем разница между относительными и абсолютными командами SVG path?
Абсолютные команды используют фиксированные SVG-координаты, а относительные команды вычисляют позиции относительно текущей точки рисования. Относительные команды часто используются для создания более компактной 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.