SVG Builder API – Эффективное создание и редактирование SVG на C#

Управление SVG с помощью Aspose.SVG Builder API

Изучите Aspose.SVG Builder API, предназначенный для упрощенного создания и обновления элементов SVG на C#.

В этой статье мы рассмотрим возможности Aspose.SVG Builder API для создания и изменения элементов SVG на C#, продемонстрируем эффективность шаблона Fluent Builder и миксинов (mixins) при манипуляциях с SVG. Вы узнаете о классе SVGElementBuilder, его специализированных сборщиках (builders) и о том, как они упрощают программирование SVG.

Обоснование использования SVG Builder

В сфере веб-разработки и графической разработки управление масштабируемой векторной графикой (SVG) может оказаться сложной задачей, требующей баланса между точностью и эффективностью. SVG Builder API от Aspose.SVG был разработан для решения этой проблемы, предлагая разработчикам мощный инструмент для упрощенного создания и обновления SVG элементов.

Разработка конструктора SVG была мотивирована несколькими ключевыми факторами:

Для достижения этих целей SVG Builder API использует шаблон Fluent Builder – методологию проектирования, которая идеально соответствует требованиям простоты, ясности и универсальности при манипулировании SVG.

Конструкторы элементов – Element Builders – оптимизация создания и редактирования SVG

В Aspose.SVG Builder API все конструкторы элементов, такие как SVGSVGElementBuilder, SVGGElementBuilder и другие, наследуются от основного класса SVGElementBuilder. Эта структура наследования упрощает процесс создания и изменения элементов SVG, обеспечивая согласованность и эффективность для различных типов элементов.

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

Конструкторы элементов предоставляют метод Build(Document document), позволяющий создавать новые элементы SVG и добавлять их в документ SVG.

Пример. Создание новых элементов SVG:

 1using (var document = new SVGDocument())
 2{
 3    // Create a new 'g' (group) element using SVGGElementBuilder
 4    var gElement = new SVGGElementBuilder()
 5        // Additional element configurations
 6        // ...
 7        .Build(document);
 8    // Append the newly created 'g' element to the root 'svg' element
 9    document.RootElement.AppendChild(gElement);
10}

В этом примере SVGGElementBuilder используется для создания нового элемента группы <g>. Метод Build() генерирует элемент, который затем добавляется к корневому элементу <svg>.

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

Конструкторы элементов также предлагают метод Build(T element) для обновления существующих элементов SVG, позволяя изменять их атрибуты или стили.

Пример: Обновление элементов SVG:

 1using (var document = new SVGDocument())
 2{
 3    // Assume an existing SVG element is part of the document
 4    var existingSvgElement = document.FirstChild as SVGSVGElement;
 5
 6    // Update the existing SVG element using SVGSVGElementBuilder
 7    new SVGSVGElementBuilder()
 8        // Additional element configurations
 9        // ...
10        // The existingSvgElement is now updated with new configurations
11        .Build(existingSvgElement);
12}

В этом примере SVGSVGElementBuilder используется для обновления существующего элемента SVG. Метод Build() применяет новые конфигурации к предоставленному элементу, обновляя его в документе SVG.

Больше C# примеров использования Aspose.SVG Builder API для создания и редактирования элементов вы найдете в статье Element Builders. Вы узнаете о классе SVGElementBuilder, его специализированных конструкторах и о том, как они упрощают программирование SVG.

Понимание Fluent Builders

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

Суть этого шаблона – это методы, которые настраивают элемент SVG, а затем возвращают builder object. Такая конструкция обеспечивает последовательное и линейное связывание методов, что особенно эффективно для снижения сложности, связанной с созданием элементов SVG и управлением ими. В этом контексте лямбда-выражения используются для повышения ясности и краткости методов настройки компоновщика. Лямбда-выражения позволяют детально, но компактно определять атрибуты и стили элементов SVG. Например, при добавлении элемента круга лямбда-выражение предоставляет встроенную читаемую конфигурацию:

1var svgElement = new SVGSVGElementBuilder()
2    .AddCircle(circle => circle
3        .Cx(50).Cy(50).R(20)
4        .Fill(Color.Blue).Stroke(Paint.None)
5        .StrokeWidth(2))
6    .Build();

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

Реализация шаблона Fluent Builder с использованием миксинов (mixins)

В Aspose.SVG Builder API шаблон Fluent Builder дополнительно улучшен за счет использования миксинов.

Понимание mixins

Миксины в объектно-ориентированном программировании – это способ включения в класс дополнительных свойств или методов. Они позволяют комбинировать и повторно использовать несколько вариантов поведения или атрибутов, не прибегая к традиционной иерархии классов. Это особенно полезно в сценариях, где несколько объектов имеют общие функции, но не обязательно принадлежат к одной и той же иерархии классов.

Мixins в Aspose.SVG SVG Builder

SVG Builder использует mixins для создания гибкого и модульного подхода к созданию элементов SVG. Используя интерфейсы в качестве mixins, API позволяет комбинировать и настраивать различные аспекты элемента SVG по мере необходимости.

Пример реализации миксина:

Рассмотрим следующий фрагмент кода из Aspose.SVG Builder API:

 1public static partial class SVGBuilderExtensions
 2{
 3    public static TBuilder Id<TBuilder>(this TBuilder builder, string value)
 4        where TBuilder : ISVGElementBuilder, ICoreAttributeSetter
 5    {
 6        return builder.SetAttribute("id", value);
 7    }
 8}
 9
10public interface ICompositeAttributeSetter:
11    IConditionalProcessingAttributeSetter, 
12    ICoreAttributeSetter,
13    IGlobalEventAttributeSetter, 
14    IDocumentElementEventAttributeSetter,
15    IGraphicalEventAttributeSetter,
16    IPresentationAttributeSetter { }
17
18public class SVGAElementBuilder : SVGElementBuilder<SVGAElement>,
19    ICompositeElementBuilder,
20    ICompositeAttributeSetter
21{
22    // Example usage
23    .AddA(a => a.Id("one"))
24}

В этом примере SVGBuilderExtensions определяет расширение Id метода, который устанавливает атрибут id элемента SVG. Параметр типа TBuilder ограничен типами, которые реализуют как ISVGElementBuilder, так и ICompositeAttributeSetter. Этот подход обеспечивает высокий уровень настройки и гибкости, поскольку ICompositeAttributeSetter сам по себе представляет собой миксин, состоящий из различных интерфейсов установки атрибутов.

Syntax Sugar в Aspose.SVG Builder API: повышение элегантности и эффективности

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

Строители внутри строителей – Builders within Builders


Построитель путей – класс PathBuilder

Класс PathBuilder предлагает тонкий способ создания элементов пути SVG <path>. Он позволяет определять сложные пути, используя свободный синтаксис:

 1.AddPath(p => p
 2    // 'D' method defines the 'd' attribute, which contains the path data.
 3    .D(d => d
 4        // 'M' sets the starting point of the path (Move to x=5, y=0).
 5        .M(5, 0)
 6        // 'L' draws a line from the current point to the new point (Line to x=10, y=10).
 7        .L(10, 10)
 8        // Another 'L' to draw a line to a new point (Line to x=0, y=10).
 9        .L(0, 10)
10        // 'Z' closes the path by drawing a line to the starting point.
11        .Z())
12    // Sets the fill color of the path to blue and removes the stroke (border).
13    .Fill(Color.Blue).Stroke(pt => pt.None())
14)

В этом примере метод AddPath() конструктора SVG используется для определения элемента пути. Лямбда-выражение, передаваемое в D() метод PathBuilder класса, определяет форму пути с помощью команд пути SVG, таких как M (move to), L (line to) и Z (close path).

Кроме того, пути <path> могут быть определены как строки, что позволяет напрямую интегрировать данные пути SVG:

1.D(d => d.AddPathSegment("M199 89.3 C206.6 66.6 235.8 13.2 270 30.3 286.6 38.6 298.9 59.4 310 73.3 ..."))

Примеры использования Aspose.SVG Builder API для создания и редактирования элементов SVG <path> можно найти в статье Path Builder. В статье показано, как Path Builder предлагает интуитивно понятный синтаксис для программного определения путей SVG, что позволяет разработчикам упростить процесс создания сложных фигур и кривых.

Построитель преобразований – класс TransformBuilder

Класс TransformBuilder упрощает применение преобразований к элементам SVG:

 1.AddG(g => g
 2    // 'Transform' method applies transformations to the group element.
 3    .Transform(t => t
 4        // 'Translate' moves the element by x=130 and y=40 units.
 5        .Translate(130, 40)
 6        // 'Scale' uniformly scales the element by a factor of 8.
 7        .Scale(8)
 8        // Another 'Scale' to adjust the scaling differently in x and y directions.
 9        .Scale(.2, .2)
10        // Final 'Translate' to move the element by x=-5 and y=-5 units.
11        .Translate(-5, -5))
12)

Здесь несколько преобразований, таких как трансляция и масштабирование, объединены в цепочку для управления элементом группы <g>.

Построитель правил – класс RuleBuilder

Класс RuleBuilder играет важную роль в определении стилей в SVG:

1.AddStyle(st => st
2    .Type("text/css")
3    .AddRule("@font-face", r => r
4        .Opacity(.5)
5        .FontFamily("FreeSansWoff")
6        .Attribute("src", "url(woffs/FreeSans.woff) format(\"woff\")")
7    )
8)

В этом примере показано, как добавить правило CSS для @font-face в SVG.

В статье Rule Builder вы найдете больше C# примеров использования Aspose.SVG Builder API для применения CSS правил к элементам SVG. Вы узнаете о классе RuleBuilder, который используется для динамического создания строки стилей CSS путем установки различных атрибутов и их значений.

Paint Builder – класс PaintBuilder

PaintBuilder используется для указания атрибутов stroke и fill:

1.AddPattern(p => p.Id("Pat3a")
2    .Rect(0, 0, 20, 20)
3    .PatternUnits(CoordinateUnits.UserSpaceOnUse)
4    .AddRect(r => r.Rect(0, 0, 10, 10).Fill(Color.FromArgb(0x99, 0x33, 0xdd)))
5    .AddRect(r => r.Rect(10, 0, 10, 10).Fill(Color.Green))
6    .AddRect(r => r.Rect(0, 10, 10, 10).Fill(Color.Blue))
7    .AddRect(r => r.Rect(10, 10, 10, 10).Fill(Color.Yellow))
8)
9.AddRect(r => r.Rect(20, 20, 440, 80).Fill(f => f.PaintServerId("Pat3a")))

В этом примере узор сначала определяется с помощью метода AddPattern(), где прямоугольники разного цвета комбинируются для создания сложного узора заливки. Узору присвоен идентификатор «Pat3a». Впоследствии он применяется к прямоугольному элементу с помощью метода Fill() с PaintServerId("Pat3a"), который ссылается на ранее определенный узор.

В статье Paint Builder вы найдете больше примеров C# использования Aspose.SVG Builder API для настройки свойств рисования элементов SVG. Вы узнаете о классе PaintBuilder, который используется для указания значения атрибутов stroke или fill для различных фигур и элементов SVG при заполнении их краской, узором или градиентом.

Использование перечислений для предопределенных значений атрибутов

Перечисления играют важную роль в Aspose.SVG Builder API. Они предоставляют предопределенные значения для определенных атрибутов, снижая риск ошибок из-за орфографических ошибок и предлагая удобный список допустимых параметров. Например:

 1[PublicAPI(TargetProduct.SVG)]
 2public enum CoordinateUnits
 3{
 4    [Description("userSpaceOnUse")]
 5    UserSpaceOnUse,
 6
 7    [Description("objectBoundingBox")]
 8    ObjectBoundingBox,
 9}
10
11// Using the enum in a builder
12.AddClipPath(cp => cp.Id("one")
13    .ClipPathUnits(CoordinateUnits.ObjectBoundingBox))

Здесь перечисление CoordinateUnits предоставляет конкретные значения для атрибута clipPathUnits, обеспечивая правильный и стандартизированный ввод.

Дополнительный пример для лучшего понимания использования SVG Builders

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

Создание фильтра

Вот пример создания сложного фильтра с использованием Aspose.SVG Builder API:

 1using (var document = new SVGDocument())
 2{
 3    var svg = new SVGSVGElementBuilder()
 4        .WithXlink()
 5        .Width(200).Height(200)
 6        .AddDefs(d => d
 7            // Defining a filter with the ID 'spotlight'
 8            .AddFilter(f => f.Id("spotlight")
 9                // Adding an feImage, a filter primitive used for image processing
10                .AddFeImage(i => i
11                    .ColorInterpolationFilters(ColorInterpolation.SRGB)
12                    .Href("normal.png") // Source of the image
13                    .Result("img")) // Resultant image after applying filter
14                // Adding an feFlood, used to fill the filter subregion with a single color
15                .AddFeFlood(fl => fl
16                    .ColorInterpolationFilters(ColorInterpolation.SRGB)
17                    .Result("floodFill") // Resultant graphic of the flood fill
18                    .X(0).Y(0).Width(100, LengthType.Percentage).Height(100, LengthType.Percentage)
19                    .FloodColor(Color.FromArgb(0, 210, 2)).FloodOpacity(1))
20                // Adding an feBlend to blend the two previous results
21                .AddFeBlend(bl => bl
22                    .In("img").In2("floodFill") // Inputs to be blended
23                    .Mode(BlendMode.Color))) // Blend mode
24        )
25        // Applying the filter to a rectangle
26        .AddRect(r => r
27            .Rect(0, 0, 100, 100)
28            .Filter(fl => fl.FilterId("spotlight"))) // Reference to the defined filter
29        .Build(document.FirstChild as SVGSVGElement);
30}

В этом фрагменте кода мы определяем фильтр прожектора, который включает в себя изображение, заливку и эффект наложения. Затем этот фильтр применяется к прямоугольному элементу.

Создание обрезки и масок

Создание обтравочных контуров и масок позволяет контролировать видимость определенных частей элементов SVG. Вот как это можно сделать:

 1using (var document = new SVGDocument())
 2{
 3    var svg = new SVGSVGElementBuilder()
 4        .Width(100, LengthType.Percentage).Height(100, LengthType.Percentage)
 5        .ViewBox(0, 0, 480, 360)
 6        .WithXlink()
 7        // ... additional setup ...
 8        .AddDefs(df => df
 9            // Defining a clipPath with ID 'one'
10            .AddClipPath(cp => cp.Id("one")
11                .ClipPathUnits(CoordinateUnits.ObjectBoundingBox)
12                // Adding circles to define the clipping area
13                .AddCircle(c => c.Cx(.3).Cy(.5).R(.2).Fill(p => p.None()).StrokeWidth(.15).Stroke(Color.Red))
14                .AddCircle(c => c.Cx(.7).Cy(.5).R(.2).Fill(p => p.None()).StrokeWidth(.15).Stroke(p => p.None())))
15            // Applying the clipPath to a rectangle
16            .AddRect(r => r.Rect(150, 0, 200, 200).Fill(Color.DarkBlue).ClipPath(p => p.ClipSourceId("one")))
17        )
18        .AddDefs(df => df
19            // Defining a mask with ID 'two'
20            .AddMask(m => m.Id("two")
21                .MaskUnits(CoordinateUnits.ObjectBoundingBox)
22                .MaskContentUnits(CoordinateUnits.ObjectBoundingBox)
23                .ColorInterpolation(ColorInterpolation.LinearRGB)
24                // Adding circles to define the mask area
25                .AddCircle(c => c.Cx(.3).Cy(.5).R(.2).Fill(Color.Blue).StrokeWidth(.15).Stroke(Color.Red))
26                .AddCircle(c => c.Cx(.7).Cy(.5).R(.2).Fill(Color.Blue).StrokeWidth(.15).Stroke(p => p.None())))
27            // Applying the mask to a rectangle
28            .AddRect(r => r.Rect(150, 150, 200, 200).Fill(Color.DarkBlue).Mask(p => p.MaskSourceId("two")))
29        )
30        .Build(document.FirstChild as SVGSVGElement);
31}

В этом примере создаются два элемента SVG: один с контуром обрезки, а другой с маской. И контур обрезки, и маска определяются с помощью кругов, которые определяют видимую область прямоугольников, к которым они применяются.

Альтернативный упрощенный подход к созданию элементов SVG

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

Пример упрощенного SVG Builder API:

 1// Initialize a new SVG document
 2using (var document = new SVGDocument())
 3{
 4    // Start building the main SVG element using the simplified approach
 5    var svg = new SVGSVGElementBuilder()
 6        // Adding a group element with default fill and stroke properties
 7        .AddG(g => g.FontSize(20)
 8            .AddText("<rect>", y: 30)
 9            .AddText("<circle>", y: 70)
10            .AddText("<ellipse>", y: 110)
11            .AddText("<line>", y: 150)
12            )
13        // Adding a group element with four base SVG shapes
14        .AddG(gg => gg.Fill(Color.Green)
15            .AddRect(r => r.X(105).Y(5).Width(30).Height(30))
16            .AddCircle(c => c.Cx(120).Cy(65).R(17))
17            .AddEllipse(e => e.Cx(120).Cy(105).Rx(25).Ry(13))
18            .AddLine(l => l.X1(100).X2(150).Y1(145).Y2(145).Stroke(Color.Green))
19            )
20        // Build and append the SVG element to the document
21        .Build(document.FirstChild as SVGSVGElement);
22    document.Save("example.svg");
23}

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

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.