API SVG Builder – Création et modification avancées de SVG – C#

Gestion SVG efficace avec l’API Builder d’Aspose.SVG

Explorez l’API Aspose.SVG Builder conçue pour rationaliser la création et la mise à jour d’éléments SVG en C#.

Cet article se penche sur le modèle Fluent Builder et les mixins utilisés dans l’API Builder d’Aspose.SVG, démontrant son efficacité dans la manipulation SVG. Vous découvrirez la classe SVGElementBuilder, ses constructeurs spécialisés et comment ils simplifient la programmation SVG.

Justification derrière le SVG Builder

Dans le domaine du développement Web et graphique, la gestion des graphiques vectoriels évolutifs (SVG) peut être une tâche complexe, exigeant un équilibre entre précision et efficacité. L’SVG Builder API a été développée pour relever ce défi, offrant aux développeurs un outil puissant pour créer et mettre à jour des éléments SVG de manière rationalisée.

Le développement du SVG Builder a été motivé par plusieurs facteurs clés :

Pour atteindre ces objectifs, l’API SVG Builder d’Aspose.SVG utilise le Fluent Builder Pattern, une méthodologie de conception qui correspond parfaitement au besoin de simplicité, de clarté et de polyvalence dans la manipulation SVG.

Générateurs d’éléments dans Aspose.SVG: rationalisation de la création et de la modification de SVG

Dans l’API Aspose.SVG Builder, tous les générateurs d’éléments, tels que SVGSVGElementBuilder, SVGGElementBuilder et d’autres, héritent de la classe principale SVGElementBuilder. Cette structure d’héritage rationalise le processus de création et de modification des éléments SVG, garantissant ainsi la cohérence et l’efficacité entre les différents types d’éléments.

Création de nouveaux éléments

Les constructeurs d’éléments fournissent une méthode Build(Document document), permettant la création de nouveaux éléments SVG et leur ajout à un document SVG.

Exemple: Création de nouveaux éléments 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}

Dans cet exemple, SVGGElementBuilder est utilisé pour créer un nouvel élément de groupe <g>. La méthode Build() génère l’élément, qui est ensuite ajouté à l’élément racine <svg>.

Modification d’éléments existants

Les constructeurs d’éléments proposent également une méthode Build(T element) pour mettre à jour les éléments SVG existants, permettant de modifier leurs attributs ou styles.

Exemple: Mise à jour des éléments 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}

Dans cet exemple, SVGSVGElementBuilder est utilisé pour mettre à jour un élément SVG existant. La méthode Build() applique de nouvelles configurations à l’élément fourni, en le mettant à jour dans le document SVG.

Comprendre les Fluent Builders

Dans l’SVG Builder API d’Aspose.SVG, le modèle Fluent Builder est utilisé pour simplifier la construction et la mise à jour des éléments SVG, rendant le processus intuitif et moins sujet aux erreurs.

L’essence de ce modèle dans l’API Aspose.SVG réside dans les méthodes qui configurent un élément SVG puis renvoient l’objet générateur. Cette conception permet un chaînage de méthodes de manière cohérente et linéaire, ce qui est particulièrement efficace pour réduire la complexité associée à la création et à la manipulation des éléments SVG.

Dans ce contexte, les expressions lambda sont utilisées pour améliorer la clarté et la concision des méthodes de configuration du constructeur. Les expressions Lambda permettent de définir de manière détaillée mais compacte les attributs et les styles des éléments SVG. Par exemple, lors de l’ajout d’un élément cercle, une expression lambda fournit une configuration en ligne et lisible:

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();

Ici, circle => circle.Cx(50).Cy(50).R(20).Fill(Color.Blue).Stroke(Paint.None).StrokeWidth(2) est une manière succincte de configurer le cercle. propriétés, telles que son centre, son rayon, son remplissage et son contour. Cette approche simplifie non seulement la configuration des éléments, mais améliore également la lisibilité et la maintenabilité du code.

Implémentation d’un modèle Fluent Builder à l’aide de mixins

Dans l’SVG Builder API d’Aspose.SVG, le modèle Fluent Builder est encore amélioré par l’utilisation de mixins.

Comprendre les mixins

Les mixins dans la programmation orientée objet sont un moyen d’inclure des propriétés ou des méthodes supplémentaires dans une classe. Ils permettent la combinaison et la réutilisation de plusieurs comportements ou attributs sans recourir à la hiérarchie de classes traditionnelle. Ceci est particulièrement avantageux dans les scénarios où plusieurs objets partagent des fonctionnalités communes, mais n’appartiennent pas nécessairement à la même hiérarchie de classes.

Mixins dans Aspose.SVG Builder

Le Aspose.SVG Builder utilise des mixins pour créer une approche flexible et modulaire pour créer des éléments SVG. En utilisant des interfaces comme mixins, l’API permet de combiner et de personnaliser différents aspects d’un élément SVG selon les besoins.

Exemple d’implémentation de mixin:

Considérez l’extrait de code suivant de l’SVG Builder API d’Aspose.SVG :

 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}

Dans cet exemple, SVGBuilderExtensions définit une méthode d’extension Id qui définit l’attribut id d’un élément SVG. Le paramètre de type TBuilder est limité aux types qui implémentent à la fois ISVGElementBuilder et ICompositeAttributeSetter. Cette approche permet un haut niveau de personnalisation et de flexibilité, car ICompositeAttributeSetter lui-même est un mixin composé de diverses interfaces de définition d’attributs.

Syntax Sugar dans l’API Builder d’Aspose.SVG : améliorer l’élégance et l’efficacité

L’SVG Builder API Aspose.SVG introduit du sucre de syntaxe pour affiner davantage le processus de création et de manipulation SVG. Cela inclut des générateurs imbriqués pour divers éléments SVG, offrant un moyen plus intuitif et efficace de définir des structures SVG complexes.

Constructeurs dans les Constructeurs


Générateur de chemin (classe PathBuilder)

La classe PathBuilder offre une manière nuancée de créer des éléments de chemin. Il permet de définir des chemins complexes en utilisant une syntaxe fluide:

 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()))

Dans cet exemple, la méthode AddPath du constructeur SVG est utilisée pour définir un élément path. L’expression lambda passée à la méthode D de la classe PathBuilder spécifie la forme du chemin à l’aide de commandes de chemin SVG telles que M (move to), L (line to) et Z (close path).

De plus, les chemins peuvent être définis sous forme de chaînes, permettant une intégration directe des données de chemin 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 ..."))

Générateur de transformation (classe TransformBuilder)

La classe TransformBuilder facilite l’application de transformations aux éléments 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)))

Ici, plusieurs transformations comme la traduction et la mise à l’échelle sont enchaînées pour manipuler un élément de groupe <g>.

Générateur de règles (classe RuleBuilder)

La classe RuleBuilder joue un rôle déterminant dans la définition des styles dans 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)

Cet exemple montre comment ajouter une règle CSS pour @font-face dans le SVG.

Paint Builder (classe PaintBuilder)

PaintBuilder est utilisé pour spécifier les attributs stroke et 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")))

Dans cet exemple, un motif est d’abord défini à l’aide de AddPattern, où divers rectangles colorés sont combinés pour créer un motif de remplissage complexe. Le motif reçoit un identifiant “Pat3a”. Par la suite, ce motif est appliqué à un élément rectangle à l’aide de la méthode Fill avec PaintServerId("Pat3a"), qui fait référence au motif défini précédemment.

Utilisation d’énumérations pour les valeurs d’attribut prédéfinies

Les énumérations jouent un rôle important dans l’API Aspose.SVG Builder. Ils fournissent des valeurs prédéfinies pour certains attributs, réduisant ainsi le risque d’erreurs dues à des fautes d’orthographe et offrant une liste pratique d’options valides. Par exemple:

 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))

Ici, l’énumération CoordinateUnits fournit des valeurs spécifiques pour l’attribut clipPathUnits, garantissant une entrée correcte et standardisée.

Exemple supplémentaire pour une meilleure compréhension de l’utilisation des générateurs SVG

Pour illustrer davantage les capacités et la polyvalence de l’API Aspose.SVG Builder, examinons quelques exemples pratiques qui présentent les fonctionnalités et techniques avancées de création et de manipulation d’éléments SVG.

Création d’un filtre

Voici un exemple de création d’un filtre complexe à l’aide de l’API Aspose.SVG Builder:

 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}

Dans cet extrait de code, nous définissons un filtre Spotlight qui comprend une image, un remplissage et un effet de fusion. Ce filtre est ensuite appliqué à un élément rectangle.

Création de détourages et de masques

La création de chemins de détourage et de masques vous permet de contrôler la visibilité de certaines parties des éléments SVG. Voici comment procéder:

 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}

Dans cet exemple, deux éléments SVG sont créés: un avec un chemin de détourage et un autre avec un masque. Le chemin de détourage et le masque sont définis à l’aide de cercles, qui déterminent la zone visible des rectangles auxquels ils sont appliqués.

Approche simplifiée alternative pour la création d’éléments SVG

L’API Aspose.SVG Builder comprend également une méthode alternative simplifiée pour créer et ajouter des éléments SVG, offrant efficacité et facilité d’utilisation avec les paramètres par défaut.

Exemple de API SVG Builder simplifiée:

 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}

Dans cet exemple, l’API Builder SVG est utilisée pour construire une structure SVG complète en utilisant une approche plus simple et plus efficace. L’utilisation de paramètres par défaut pour les attributs courants tels que la taille, la couleur et la position permet un développement rapide d’éléments SVG standard, tout en offrant la possibilité de les personnaliser selon les besoins.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.