Anpassa presentationsformer i .NET

Översikt

Den här artikeln förklarar hur du anpassar presentationsformer i Aspose.Slides genom att redigera formgeometri via redigeringspunkter och geometriska banor. Den visar hur du arbetar med GeometryPath och IGeometryPath för att ändra befintliga former, utföra grundläggande bana‑redigeringsoperationer, lägga till eller ta bort punkter och applicera uppdaterad geometri på en form.

Den demonstrerar också hur du skapar anpassade och sammansatta former, bygger former med kurvade hörn, avgör om en formgeometri är sluten, samt konverterar mellan GeometryPath och GraphicsPath för ytterligare scenarier med geometrisk anpassning.

Ändra en form med redigeringspunkter

Tänk dig en kvadrat. I PowerPoint kan du med redigeringspunkter

  • flytta kvadratens hörn inåt eller utåt
  • ange krökningen för ett hörn eller en punkt
  • lägga till nya punkter i kvadraten
  • manipulera punkter på kvadraten osv.

I princip kan du utföra dessa uppgifter på vilken form som helst. Med redigeringspunkter kan du ändra en form eller skapa en ny form från en befintlig.

Tips för formredigering

overview_image

Innan du börjar redigera PowerPoint‑former via redigeringspunkter kan du tänka på följande om former:

  • En form (eller dess bana) kan antingen vara sluten eller öppen.
  • Alla former består av minst två ankarnpunkter som är länkade till varandra med linjer.
  • En linje är antingen rak eller kurvig. Ankarnpunkter bestämmer linjens natur.
  • Ankarnpunkter finns som hörnpunkter, raka punkter eller släta punkter:
    • En hörnpunkt är en punkt där två raka linjer möts i en vinkel.
    • En slät punkt är en punkt där två handtag ligger i en rak linje och linjesegmenten möts i en mjuk kurva. I detta fall är alla handtag separerade från ankarnpunkten med lika avstånd.
    • En rak punkt är en punkt där två handtag ligger i en rak linje och linjesegmenten möts i en mjuk kurva. I detta fall behöver handtagen inte vara separerade från ankarnpunkten med lika avstånd.
  • Genom att flytta eller redigera ankarnpunkter (vilket ändrar vinkeln på linjerna) kan du förändra hur en form ser ut.

För att redigera PowerPoint‑former via redigeringspunkter erbjuder Aspose.Slides klassen GeometryPath och gränssnittet IGeometryPath.

Enkla redigeringsoperationer

Denna C#‑kod visar hur du

Lägger till en linje i slutet av en bana

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

Lägger till en linje på en angiven position i en bana:

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

Lägger till en kubisk Bézier‑kurva i slutet av en bana:

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

Lägger till en kubisk Bézier‑kurva på en angiven position i en bana:

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

Lägger till en kvadratisk Bézier‑kurva i slutet av en bana:

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

Lägger till en kvadratisk Bézier‑kurva på en angiven position i en bana:

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

Lägger till en given båge till en bana:

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

Stänger den aktuella figuren i en bana:

void CloseFigure();

Anger positionen för nästa punkt:

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

Tar bort bansegmentet på ett givet index:

void RemoveAt(int index);

Lägg till anpassade punkter i en form

  1. Skapa en instans av klassen GeometryShape och sätt typen ShapeType.Rectangle.
  2. Hämta en instans av klassen GeometryPath från formen.
  3. Lägg till en ny punkt mellan de två övre punkterna i banan.
  4. Lägg till en ny punkt mellan de två nedre punkterna i banan.
  5. Applicera banan på formen.

Denna C#‑kod visar hur du lägger till anpassade punkter i en form:

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

Ta bort punkter från en form

  1. Skapa en instans av klassen GeometryShape och sätt typen ShapeType.Heart.
  2. Hämta en instans av klassen GeometryPath från formen.
  3. Ta bort segmentet för banan.
  4. Applicera banan på formen.

Denna C#‑kod visar hur du tar bort punkter från en form:

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

Skapa en anpassad form

  1. Beräkna punkterna för formen.
  2. Skapa en instans av klassen GeometryPath.
  3. Fyll banan med punkterna.
  4. Skapa en instans av klassen GeometryShape.
  5. Applicera banan på formen.

Denna C#‑kod visar hur du skapar en anpassad form:

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

Skapa en sammansatt anpassad form

  1. Skapa en instans av klassen GeometryShape.
  2. Skapa en första instans av klassen GeometryPath.
  3. Skapa en andra instans av klassen GeometryPath.
  4. Applicera banorna på formen.

Denna C#‑kod visar hur du skapar en sammansatt anpassad form:

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

Skapa en anpassad form med kurvade hörn

Denna C#‑kod visar hur du skapar en anpassad form med kurvade hörn (inåtriktade);

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

Ta reda på om en formgeometri är sluten

En sluten form definieras som en där alla sidor är sammankopplade och bildar en enda omkrets utan hål. En sådan form kan vara en enkel geometrisk figur eller en komplex anpassad kontur. Följande kodexempel visar hur du kontrollerar om en formgeometri är sluten:

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;
}

Konvertera GeometryPath till GraphicsPath (System.Drawing.Drawing2D)

  1. Skapa en instans av klassen GeometryShape.
  2. Skapa en instans av klassen GraphicsPath från namnrymden System.Drawing.Drawing2D.
  3. Konvertera GraphicsPath-instansen till en GeometryPath-instans med hjälp av ShapeUtil.
  4. Applicera banorna på formen.

Denna C#‑kod – en implementering av stegen ovan – demonstrerar konverteringsprocessen från GeometryPath till 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

Vad händer med fyllning och kontur efter att geometri har ersatts?

Stilen förblir på formen; endast konturen ändras. Fyllning och kontur appliceras automatiskt på den nya geometrin.

Hur roterar jag en anpassad form korrekt tillsammans med dess geometri?

Använd formens rotation‑egenskap; geometrin roterar med formen eftersom den är bunden till formens eget koordinatsystem.

Kan jag konvertera en anpassad form till en bild för att ”låsa” resultatet?

Ja. Exportera det önskade slide-området eller själva shape till ett rasterformat; det förenklar vidare arbete med tunga geometrier.