Dostosuj kształty prezentacji w .NET
Przegląd
Ten artykuł wyjaśnia, jak dostosować kształty w prezentacji w Aspose.Slides, edytując geometrię kształtu za pomocą punktów edycji i ścieżek geometrycznych. Pokazuje, jak pracować z GeometryPath i IGeometryPath, aby modyfikować istniejące kształty, wykonywać podstawowe operacje edycji ścieżki, dodawać lub usuwać punkty oraz zastosować zaktualizowaną geometrię z powrotem do kształtu.
Pokazuje również, jak tworzyć niestandardowe i złożone kształty, budować kształty z zaokrąglonymi narożnikami, określać, czy geometria kształtu jest zamknięta, oraz konwertować między GeometryPath a GraphicsPath w dodatkowych scenariuszach dostosowywania geometrii.
Zmienianie kształtu za pomocą punktów edycji
Rozważmy kwadrat. W programie PowerPoint, używając punktów edycji, możesz
- przesunąć róg kwadratu do środka lub na zewnątrz
- określić krzywiznę rogu lub punktu
- dodać nowe punkty do kwadratu
- manipulować punktami na kwadracie itd.
Zasadniczo możesz wykonywać opisane czynności na dowolnym kształcie. Korzystając z punktów edycji, możesz zmienić kształt lub utworzyć nowy kształt z istniejącego.
Wskazówki dotyczące edycji kształtów

Zanim rozpoczniesz edycję kształtów PowerPoint za pomocą punktów edycji, warto rozważyć następujące kwestie dotyczące kształtów:
- Kształt (lub jego ścieżka) może być zamknięty lub otwarty.
- Wszystkie kształty składają się z co najmniej 2 punktów kotwiczących połączonych ze sobą liniami.
- Linia może być prosta lub krzywa. Punkty kotwiczące określają charakter linii.
- Punkty kotwiczące występują jako punkty narożne, proste lub płynne:
- Punkt narożny to punkt, w którym dwie proste linie łączą się pod kątem.
- Punkt płynny to punkt, w którym dwa uchwyty znajdują się na jednej prostej, a odcinki linii łączą się w płynną krzywą. W tym przypadku wszystkie uchwyty są oddalone od punktu kotwiczącego o równą odległość.
- Punkt prosty to punkt, w którym dwa uchwyty znajdują się na jednej prostej, a odcinki tej linii łączą się w płynną krzywą. W tym przypadku uchwyty nie muszą być oddalone od punktu kotwiczącego o równą odległość.
- Przesuwając lub edytując punkty kotwiczące (co zmienia kąt linii), możesz zmienić wygląd kształtu.
Aby edytować kształty PowerPoint za pomocą punktów edycji, Aspose.Slides udostępnia klasę GeometryPath oraz interfejs IGeometryPath.
- Instancja GeometryPath reprezentuje ścieżkę geometryczną obiektu IGeometryShape.
- Aby pobrać
GeometryPathz instancjiIGeometryShape, możesz użyć metody IGeometryShape.GetGeometryPaths. - Aby ustawić
GeometryPathdla kształtu, możesz użyć następujących metod: IGeometryShape.SetGeometryPath dla kształtów stałych oraz IGeometryShape.SetGeometryPaths dla kształtów złożonych. - Aby dodać segmenty, możesz użyć metod dostępnych w IGeometryPath.
- Korzystając z właściwości IGeometryPath.Stroke i IGeometryPath.FillMode, możesz ustawić wygląd ścieżki geometrycznej.
- Używając właściwości IGeometryPath.PathData, możesz pobrać ścieżkę geometryczną
GeometryShapejako tablicę segmentów ścieżki. - Aby uzyskać dostęp do dodatkowych opcji dostosowywania geometrii kształtu, możesz konwertować GeometryPath na GraphicsPath.
- Użyj metod GeometryPathToGraphicsPath i GraphicsPathToGeometryPath (z klasy ShapeUtil), aby konwertować GeometryPath na GraphicsPath i odwrotnie.
Proste operacje edycji
Ten kod C# pokazuje, jak Dodaj linię na końcu ścieżki
void LineTo(PointF point);
void LineTo(float x, float y);
Dodaj linię do określonej pozycji na ścieżce:
void LineTo(PointF point, uint index);
void LineTo(float x, float y, uint index);
Dodaj krzywą Beziera stopnia trzeciego na końcu ścieżki:
void CubicBezierTo(PointF point1, PointF point2, PointF point3);
void CubicBezierTo(float x1, float y1, float x2, float y2, float x3, float y3);
Dodaj krzywą Beziera stopnia trzeciego do określonej pozycji na ścieżce:
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);
Dodaj krzywą Beziera stopnia drugiego na końcu ścieżki:
void QuadraticBezierTo(PointF point1, PointF point2);
void QuadraticBezierTo(float x1, float y1, float x2, float y2);
Dodaj krzywą Beziera stopnia drugiego do określonej pozycji na ścieżce:
void QuadraticBezierTo(PointF point1, PointF point2, uint index);
void QuadraticBezierTo(float x1, float y1, float x2, float y2, uint index);
Dołącz dany łuk do ścieżki:
void ArcTo(float width, float heigth, float startAngle, float sweepAngle);
Zamknij bieżącą figurę ścieżki:
void CloseFigure();
Ustaw pozycję dla następnego punktu:
void MoveTo(PointF point);
void MoveTo(float x, float y);
Usuń segment ścieżki o podanym indeksie:
void RemoveAt(int index);
Dodaj własne punkty do kształtu
- Utwórz instancję klasy GeometryShape i ustaw typ ShapeType.Rectangle.
- Pobierz instancję klasy GeometryPath z kształtu.
- Dodaj nowy punkt pomiędzy dwoma górnymi punktami na ścieżce.
- Dodaj nowy punkt pomiędzy dwoma dolnymi punktami na ścieżce.
- Zastosuj ścieżkę do kształtu.
Ten kod C# pokazuje, jak dodać własne punkty do kształtu:
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);
}

Usuń punkty z kształtu
- Utwórz instancję klasy GeometryShape i ustaw typ ShapeType.Heart.
- Pobierz instancję klasy GeometryPath z kształtu.
- Usuń segment ścieżki.
- Zastosuj ścieżkę do kształtu.
Ten kod C# pokazuje, jak usunąć punkty z kształtu:
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);
}

Utwórz własny kształt
- Oblicz punkty dla kształtu.
- Utwórz instancję klasy GeometryPath.
- Wypełnij ścieżkę punktami.
- Utwórz instancję klasy GeometryShape.
- Zastosuj ścieżkę do kształtu.
Ten kod C# pokazuje, jak utworzyć własny kształt:
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);
}

Utwórz złożony własny kształt
- Utwórz instancję klasy GeometryShape.
- Utwórz pierwszą instancję klasy GeometryPath.
- Utwórz drugą instancję klasy GeometryPath.
- Zastosuj ścieżki do kształtu.
Ten kod C# pokazuje, jak utworzyć złożony własny kształt:
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});
}

Utwórz własny kształt z zaokrąglonymi narożnikami
Ten kod C# pokazuje, jak utworzyć własny kształt z zaokrąglonymi narożnikami (do wewnątrz);
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);
}
Sprawdź, czy geometria kształtu jest zamknięta
Zamknięty kształt definiuje się jako taki, w którym wszystkie jego boki łączą się, tworząc jedną granicę bez przerw. Taki kształt może być prostą formą geometryczną lub złożonym, niestandardowym konturem. Poniższy przykład kodu pokazuje, jak sprawdzić, czy geometria kształtu jest zamknięta:
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;
}
Konwertuj GeometryPath na GraphicsPath (System.Drawing.Drawing2D)
- Utwórz instancję klasy GeometryShape.
- Utwórz instancję klasy GraphicsPath z przestrzeni nazw System.Drawing.Drawing2D.
- Skonwertuj instancję GraphicsPath na instancję GeometryPath przy użyciu ShapeUtil.
- Zastosuj ścieżki do kształtu.
Ten kod C# — implementacja powyższych kroków — demonstruje proces konwersji GeometryPath na 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}) ;
}

FAQ
Co się stanie z wypełnieniem i obrysem po zastąpieniu geometrii?
Styl pozostaje przypisany do kształtu; zmienia się jedynie kontur. Wypełnienie i obrys są automatycznie stosowane do nowej geometrii.
Jak prawidłowo obrócić własny kształt wraz z jego geometrią?
Użyj właściwości rotation kształtu; geometria obraca się wraz z kształtem, ponieważ jest związana z własnym układem współrzędnych kształtu.
Czy mogę przekonwertować własny kształt na obraz, aby „zablokować” wynik?
Tak. Wyeksportuj wymaganą slide (obszar) lub sam shape do formatu rastrowego; ułatwia to dalszą pracę z złożonymi geometriami.