Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
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.
Класс
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 обычно используются для:
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}В этом примере метод
AddPath() SVG builder используется для определения элемента <path>. Метод
D() задает SVG path data с помощью команд SVG path. В этом примере:
Fluent syntax упрощает генерацию SVG paths и делает определения path более удобными для чтения и сопровождения.
PathBuilder поддерживает абсолютные и относительные SVG path commands для программного создания линий, кривых, дуг и сложной векторной графики. Эти команды можно комбинировать для создания сложных SVG-фигур, плавных кривых, векторных иллюстраций и переиспользуемых графических компонентов в C#.
| Command | Relative Command | Описание |
|---|---|---|
M | m | Переместить текущую точку в новую позицию |
L | l | Нарисовать прямую линию к точке |
H | h | Нарисовать горизонтальную линию |
V | v | Нарисовать вертикальную линию |
C | c | Нарисовать кубическую кривую Безье |
S | s | Нарисовать гладкую кубическую кривую Безье |
Q | q | Нарисовать квадратичную кривую Безье |
T | t | Нарисовать гладкую квадратичную кривую Безье |
A | a | Нарисовать эллиптическую дугу |
Z | z | Закрыть текущий path |
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 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}В этом примере:
Q() создает квадратичную кривую Безье;T() автоматически продолжает гладкую кривую.Команды кривых часто используются для иллюстраций, графиков, подписей и декоративной SVG-графики.
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:

В этом примере мы также используем 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-документа.
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-разметки.
stroke или fill для различных SVG-фигур и элементов при их заполнении paint, pattern или gradient.Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.