Personnaliser les formes de présentation dans .NET

Modifier une forme à l’aide des points d’édition

Considérez un carré. Dans PowerPoint, en utilisant points d’édition, vous pouvez

  • déplacer le coin du carré vers l’intérieur ou l’extérieur
  • spécifier la courbure d’un coin ou d’un point
  • ajouter de nouveaux points au carré
  • manipuler les points du carré, etc.

Essentiellement, vous pouvez effectuer les tâches décrites sur n’importe quelle forme. En utilisant les points d’édition, vous pouvez modifier une forme ou créer une nouvelle forme à partir d’une forme existante.

Conseils pour l’édition de formes

overview_image

Avant de commencer à éditer les formes PowerPoint via les points d’édition, vous pourriez vouloir considérer ces aspects des formes :

  • Une forme (ou son tracé) peut être fermée ou ouverte.
  • Toutes les formes sont composées d’au moins 2 points d’ancrage reliés entre eux par des lignes
  • Une ligne est soit droite, soit courbe. Les points d’ancrage déterminent la nature de la ligne.
  • Les points d’ancrage existent sous forme de points de coin, points droits ou points lisses :
    • Un point de coin est un point où 2 lignes droites se rejoignent à un angle.
    • Un point lisse est un point où 2 poignées existent sur une ligne droite et les segments de la ligne se rejoignent dans une courbe douce. Dans ce cas, toutes les poignées sont séparées du point d’ancrage par une même distance.
    • Un point droit est un point où 2 poignées existent sur une ligne droite et les segments de cette ligne se rejoignent dans une courbe douce. Dans ce cas, les poignées n’ont pas besoin d’être séparées du point d’ancrage par une même distance.
  • En déplaçant ou en modifiant les points d’ancrage (ce qui change l’angle des lignes), vous pouvez modifier l’apparence d’une forme.

Pour éditer les formes PowerPoint via les points d’édition, Aspose.Slides fournit la classe GeometryPath et l’interface IGeometryPath.

Opérations d’édition simples

Ce code C# vous montre comment

Ajouter une ligne à la fin d’un tracé

void LineTo(PointF point);
void LineTo(float x, float y);

Ajouter une ligne à une position spécifiée sur un tracé :

void LineTo(PointF point, uint index);
void LineTo(float x, float y, uint index);

Ajouter une courbe de Bézier cubique à la fin d’un tracé :

void CubicBezierTo(PointF point1, PointF point2, PointF point3);
void CubicBezierTo(float x1, float y1, float x2, float y2, float x3, float y3);

Ajouter une courbe de Bézier cubique à la position spécifiée sur un tracé :

void CubicBezierTo(PointF point1, PointF point2, PointF point3, uint index);
void CubicBezierTo(float x1, float y1, float x2, float y2, float x3, float y3, uint index);

Ajouter une courbe de Bézier quadratique à la fin d’un tracé :

void QuadraticBezierTo(PointF point1, PointF point2);
void QuadraticBezierTo(float x1, float y1, float x2, float y2);

Ajouter une courbe de Bézier quadratique à la position spécifiée sur un tracé :

void QuadraticBezierTo(PointF point1, PointF point2, uint index);
void QuadraticBezierTo(float x1, float y1, float x2, float y2, uint index);

Ajouter un arc donné à un tracé :

void ArcTo(float width, float heigth, float startAngle, float sweepAngle);

Fermer la figure actuelle d’un tracé :

void CloseFigure();

Définir la position du point suivant :

void MoveTo(PointF point);
void MoveTo(float x, float y);

Supprimer le segment du tracé à un indice donné :

void RemoveAt(int index);

Ajouter des points personnalisés à une forme

  1. Créez une instance de la classe GeometryShape et définissez le type ShapeType.Rectangle.
  2. Obtenez une instance de la classe GeometryPath à partir de la forme.
  3. Ajoutez un nouveau point entre les deux points supérieurs du tracé.
  4. Ajoutez un nouveau point entre les deux points inférieurs du tracé.
  5. Appliquez le tracé à la forme.

Ce code C# vous montre comment ajouter des points personnalisés à une forme :

using (Presentation pres = new Presentation())
{
    GeometryShape shape = pres.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 200, 100) as GeometryShape;
    IGeometryPath geometryPath = shape.GetGeometryPaths()[0];

    geometryPath.LineTo(100, 50, 1);
    geometryPath.LineTo(100, 50, 4);
    shape.SetGeometryPath(geometryPath);
}

example1_image

Supprimer des points d’une forme

  1. Créez une instance de la classe GeometryShape et définissez le type ShapeType.Heart.
  2. Obtenez une instance de la classe GeometryPath à partir de la forme.
  3. Supprimez le segment du tracé.
  4. Appliquez le tracé à la forme.

Ce code C# vous montre comment supprimer des points d’une forme :

using (Presentation pres = new Presentation())
{
	GeometryShape shape = pres.Slides[0].Shapes.AddAutoShape(ShapeType.Heart, 100, 100, 300, 300) as GeometryShape;

	IGeometryPath path = shape.GetGeometryPaths()[0];
	path.RemoveAt(2);
	shape.SetGeometryPath(path);
}

example2_image

Créer une forme personnalisée

  1. Calculez les points de la forme.
  2. Créez une instance de la classe GeometryPath.
  3. Remplissez le tracé avec les points.
  4. Créez une instance de la classe GeometryShape.
  5. Appliquez le tracé à la forme.

Ce code C# vous montre comment créer une forme personnalisée :

List<PointF> points = new List<PointF>();

float R = 100, r = 50;
int step = 72;

for (int angle = -90; angle < 270; angle += step)
{
    double radians = angle * (Math.PI / 180f);
    double x = R * Math.Cos(radians);
    double y = R * Math.Sin(radians);
    points.Add(new PointF((float)x + R, (float)y + R));

    radians = Math.PI * (angle + step / 2) / 180.0;
    x = r * Math.Cos(radians);
    y = r * Math.Sin(radians);
    points.Add(new PointF((float)x + R, (float)y + R));
}

GeometryPath starPath = new GeometryPath();
starPath.MoveTo(points[0]);

for (int i = 1; i < points.Count; i++)
{
    starPath.LineTo(points[i]);
}

starPath.CloseFigure();

using (Presentation pres = new Presentation())
{
    GeometryShape shape = pres.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, R * 2, R * 2) as GeometryShape;

    shape.SetGeometryPath(starPath);
}

example3_image

Créer une forme personnalisée composite

  1. Créez une instance de la classe GeometryShape.
  2. Créez une première instance de la classe GeometryPath.
  3. Créez une seconde instance de la classe GeometryPath.
  4. Appliquez les tracés à la forme.

Ce code C# vous montre comment créer une forme personnalisée composite :

using (Presentation pres = new Presentation())
{
    GeometryShape shape = pres.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 200, 100) as GeometryShape;

    GeometryPath geometryPath0 = new GeometryPath();
    geometryPath0.MoveTo(0, 0);
    geometryPath0.LineTo(shape.Width, 0);
    geometryPath0.LineTo(shape.Width, shape.Height/3);
    geometryPath0.LineTo(0, shape.Height / 3);
    geometryPath0.CloseFigure();

    GeometryPath geometryPath1 = new GeometryPath();
    geometryPath1.MoveTo(0, shape.Height/3 * 2);
    geometryPath1.LineTo(shape.Width, shape.Height / 3 * 2);
    geometryPath1.LineTo(shape.Width, shape.Height);
    geometryPath1.LineTo(0, shape.Height);
    geometryPath1.CloseFigure();

    shape.SetGeometryPaths(new GeometryPath[] { geometryPath0, geometryPath1});
}

example4_image

Créer une forme personnalisée avec des coins arrondis

Ce code C# vous montre comment créer une forme personnalisée avec des coins arrondis (vers l’intérieur) ;

var shapeX = 20f;
var shapeY = 20f;
var shapeWidth = 300f;
var shapeHeight = 200f;

var leftTopSize = 50f;
var rightTopSize = 20f;
var rightBottomSize = 40f;
var leftBottomSize = 10f;

using (var presentation = new Presentation())
{
    var childShape = presentation.Slides[0].Shapes.AddAutoShape(
        ShapeType.Custom, shapeX, shapeY, shapeWidth, shapeHeight);

    var geometryPath = new GeometryPath();

    var point1 = new PointF(leftTopSize, 0);
    var point2 = new PointF(shapeWidth - rightTopSize, 0);
    var point3 = new PointF(shapeWidth, shapeHeight - rightBottomSize);
    var point4 = new PointF(leftBottomSize, shapeHeight);
    var point5 = new PointF(0, leftTopSize);

    geometryPath.MoveTo(point1);
    geometryPath.LineTo(point2);
    geometryPath.ArcTo(rightTopSize, rightTopSize, 180, -90);
    geometryPath.LineTo(point3);
    geometryPath.ArcTo(rightBottomSize, rightBottomSize, -90, -90);
    geometryPath.LineTo(point4);
    geometryPath.ArcTo(leftBottomSize, leftBottomSize, 0, -90);
    geometryPath.LineTo(point5);
    geometryPath.ArcTo(leftTopSize, leftTopSize, 90, -90);

    geometryPath.CloseFigure();

    childShape.SetGeometryPath(geometryPath);

    presentation.Save("output.pptx", SaveFormat.Pptx);
}

Déterminer si la géométrie d’une forme est fermée

Une forme fermée est définie comme une forme dont tous les côtés sont connectés, formant une seule frontière sans lacunes. Une telle forme peut être une forme géométrique simple ou un contour personnalisé complexe. L’exemple de code suivant montre comment vérifier si la géométrie d’une forme est fermée :

bool IsGeometryClosed(IGeometryShape geometryShape)
{
    bool? isClosed = null;

    foreach (var geometryPath in geometryShape.GetGeometryPaths())
    {
        var dataLength = geometryPath.PathData.Length;
        if (dataLength == 0)
            continue;

        var lastSegment = geometryPath.PathData[dataLength - 1];
        isClosed = lastSegment.PathCommand == PathCommandType.Close;

        if (isClosed == false)
            return false;
    }
    
    return isClosed == true;
}

Convertir GeometryPath en GraphicsPath (System.Drawing.Drawing2D)

  1. Créez une instance de la classe GeometryShape.
  2. Créez une instance de la classe GraphicsPath du namespace System.Drawing.Drawing2D.
  3. Convertissez l’instance GraphicsPath en instance GeometryPath à l’aide de ShapeUtil.
  4. Appliquez les tracés à la forme.

Ce code C#—une implémentation des étapes ci‑dessus—dé montre le processus de conversion GeometryPath en GraphicsPath :

using (Presentation pres = new Presentation())
{
    GeometryShape shape = pres.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 300, 100) as GeometryShape;

    IGeometryPath originalPath = shape.GetGeometryPaths()[0];
    originalPath.FillMode = PathFillModeType.None;

    GraphicsPath gPath = new GraphicsPath();

    gPath.AddString("Text in shape", new FontFamily("Arial"), 1, 40, new PointF(10, 10), StringFormat.GenericDefault);

    IGeometryPath textPath = ShapeUtil.GraphicsPathToGeometryPath(gPath);
    textPath.FillMode = PathFillModeType.Normal;

    shape.SetGeometryPaths(new[] {originalPath, textPath}) ;
}

example5_image

FAQ

Que se passe-t-il du remplissage et du contour après le remplacement de la géométrie ?

Le style reste associé à la forme ; seul le contour change. Le remplissage et le contour sont appliqués automatiquement à la nouvelle géométrie.

Comment faire pivoter correctement une forme personnalisée avec sa géométrie ?

Utilisez la propriété rotation de la forme ; la géométrie pivote avec la forme car elle est liée au système de coordonnées de la forme.

Puis-je convertir une forme personnalisée en image pour « verrouiller » le résultat ?

Oui. Exportez la zone slide requise ou la shape elle‑même vers un format raster ; cela simplifie le travail ultérieur avec des géométries lourdes.