Element Builders – Crear elementos SVG en C# con Fluent Builder API

La Aspose.SVG Builder API permite crear y editar elementos SVG mediante programación en C# con sintaxis fluent builder. En lugar de construir XML SVG manualmente o manipular atributos DOM directamente, Element Builders ofrece un enfoque más limpio y mantenible para generar SVG.

La Builder API admite elementos SVG comunes como rectángulos, círculos, rutas, líneas, polígonos, texto y grupos. Con constructores anidados y métodos encadenados, los desarrolladores pueden generar gráficos SVG complejos con menos código repetitivo y mayor legibilidad.

Este artículo explica cómo crear elementos SVG en C#, construir gráficos SVG mediante programación y modificar documentos SVG existentes con Aspose.SVG for .NET. Aprenderá sobre la clase base SVGElementBuilder, la clase SVGSVGElementBuilder, los constructores especializados y cómo simplifican la programación SVG.

¿Qué son los SVG Element Builders?

Element Builders son clases constructoras especializadas que se usan para crear elementos SVG mediante programación. Cada constructor corresponde a un elemento SVG específico y proporciona métodos fuertemente tipados para configurar atributos y estilos SVG.

La Builder API admite:

La sintaxis fluida simplifica la generación de SVG y mejora la mantenibilidad del código en aplicaciones .NET.

SVG Element Builders compatibles

BuilderElemento SVG
SVGSVGElementBuilder<svg>
SVGRectElementBuilder<rect>
SVGCircleElementBuilder<circle>
SVGLineElementBuilder<line>
SVGPathElementBuilder<path>
SVGTextElementBuilder<text>
SVGGElementBuilder<g>
SVGPolygonElementBuilder<polygon>
SVGPolylineElementBuilder<polyline>

Encontrará la lista completa de constructores SVG en la página de referencia de API Aspose.Svg.Builder.

Crear nuevos elementos

Aspose.SVG SVG Builder API emplea Fluent Builder Pattern, una metodología de diseño adecuada para lograr simplicidad, claridad y versatilidad al manipular SVG.

Fluent Builder Pattern

En SVG Builder API, Fluent Builder Pattern se utiliza para simplificar la creación y actualización de elementos SVG, haciendo que el proceso sea intuitivo y menos propenso a errores. La esencia del patrón son métodos que configuran un elemento SVG y devuelven la instancia del constructor para encadenar métodos.

En este contexto, las expresiones lambda mejoran la claridad y concisión de los métodos de configuración. Permiten definir atributos y estilos de elementos SVG de forma detallada y compacta:

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    }

Aquí, circle => circle.Cx(100).Cy(100).R(50).Fill(Color.Red).Stroke(Paint.None).StrokeWidth(2) es una forma compacta de configurar el centro, radio, relleno y trazo del círculo. Este enfoque simplifica la configuración del elemento y mejora la legibilidad y mantenibilidad del código.

Crear SVG desde cero

Aquí veremos un enfoque conciso para crear SVG desde cero con C#.

1using Aspose.Svg.Builder;
2using System.Drawing;
3using System.IO;
 1    // Create SVG from scratch in C# using Builder API
 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}

Visualización del archivo svg-from-scratch.svg

El ejemplo utiliza Fluent Builder Pattern dentro de SVGSVGElementBuilder para construir los elementos SVG. Este patrón proporciona una forma expresiva y fácil de mantener para generar documentos SVG en comparación con el enfoque descrito en el artículo Editar archivo SVG, que depende más de la manipulación del DOM de bajo nivel y de la configuración explícita de atributos. Este enfoque:

Editar SVG

Una técnica eficaz para editar SVG mediante programación es el uso de Element Builders.

Agregar nuevos elementos

Editar SVG con constructores de elementos proporciona un enfoque potente y flexible para manipular gráficos vectoriales mediante programación. En el siguiente ejemplo, se toma un archivo SVG existente, se le agregan elementos y se guarda:

1using Aspose.Svg.Builder;
2using System.Drawing;
3using System.IO;
 1// Add multiple shapes (circle and polyline) to an existing SVG document using SVG Builder
 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}

En este ejemplo:

La figura (a) muestra el archivo circles.svg original, y la figura (b) muestra el archivo circles-edited.svg editado con un círculo y una polilínea agregados.

Visualización del archivo circles.svg original y del archivo circles-edited.svg editado con elementos de círculo y polilínea agregados.

Modificar elementos existentes

En el siguiente ejemplo de C#, actualizamos un documento SVG existente cambiando el color de relleno y trazo del primer elemento SVG <circle> del documento:

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 element in C# using SVG Builder
 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 ofrece el método Build(T element) para actualizar elementos SVG existentes, permitiendo modificar sus atributos o estilos. La figura (a) muestra el archivo circles.svg original, y la figura (b) muestra circles-modified.svg con el primer círculo recoloreado.

Visualización del archivo circles.svg original y del archivo circles-modified.svg modificado con el primer círculo recoloreado.

Ejemplo de uso de Element Builders

El siguiente fragmento de código muestra cómo usar Element Builders para crear un documento SVG con varios elementos de forma SVG.

1using Aspose.Svg;
2using Aspose.Svg.Builder;
3using System.Drawing;
4using Aspose.Svg.Dom.Svg;
5using System.IO;
 1// Create all basic SVG shapes programmatically in C# using SVG Builder
 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}

Visualización del archivo svg-elements.svg con nombres e imágenes de los siete elementos de forma SVG.

Element Builders proporciona una sintaxis fluida y expresiva para construir elementos SVG, mejorando la legibilidad y mantenibilidad del código. En este ejemplo, SVGSVGElementBuilder construye un elemento SVG con atributos width, height y viewBox. Luego, Fluent Builder Pattern se usa para crear rectángulos, círculos, elipses, líneas, polilíneas, polígonos y rutas, posicionados y estilizados dentro de elementos <g>.

¿Por qué usar Fluent SVG Builders?

Manipulación DOMBuilder API
Manejo manual de atributosMétodos fuertemente tipados
Código más verbosoSintaxis fluida encadenada
Más difícil de mantenerMás fácil de leer
Operaciones XML repetidasLógica de constructor reutilizable

FAQ

1. ¿Por qué los desarrolladores usan Builder APIs en lugar de generar XML directamente?
Builder APIs reemplaza la construcción manual de XML por métodos fluidos tipados, haciendo que el código SVG sea más fácil de leer, mantener y extender.

2. ¿El SVG generado cumple los estándares?
Sí. Aspose.SVG genera marcado SVG basado en estándares y compatible con motores modernos de renderizado SVG.

3. ¿Puedo generar gráficos SVG interactivos con Element Builders?
Sí. Los elementos SVG generados pueden diseñarse, animarse o manipularse posteriormente con CSS y JavaScript en aplicaciones web.

4. ¿Los gráficos SVG generados pueden incrustarse directamente en páginas HTML?
Sí. Los documentos SVG creados con Aspose.SVG pueden incrustarse en HTML o usarse como archivos SVG independientes.

Errores comunes y soluciones

ProblemaPosible causaSolución recomendada
El elemento SVG no es visibleFalta relleno o trazoAplique Fill() o Stroke()
Los cambios SVG no se guardanEl documento no se guardó tras modificarLlame a document.Save() después de actualizar
Los elementos aparecen fuera del lienzoCoordenadas o viewBox incorrectosVerifique dimensiones y posiciones SVG
El elemento existente no se actualizaReferencia de elemento incorrectaAsegúrese de recuperar correctamente el elemento objetivo
Las formas aparecen distorsionadasProporciones de viewBox no válidasUse sistemas de coordenadas SVG coherentes

Recursos relacionados

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.