Dostosowywanie kształtów prezentacji w PHP
Overview
Ten artykuł wyjaśnia, jak dostosować kształty prezentacji w Aspose.Slides poprzez edycję geometrii kształtu przy użyciu punktów kontrolnych i ścieżek geometrycznych. Pokazuje, jak korzystać z GeometryPath do modyfikacji istniejących kształtów, wykonywania podstawowych operacji edycji ścieżek, dodawania lub usuwania punktów oraz zastosowania zaktualizowanej geometrii do kształtu.
Pokazuje również, jak tworzyć kształty niestandardowe i złożone, budować kształty z zaokrąglonymi narożnikami, określać, czy geometria kształtu jest zamknięta, oraz konwertować pomiędzy GeometryPath a java.awt.Shape w dodatkowych scenariuszach dostosowywania geometrii.
Change a Shape Using Edit Points
Rozważmy kwadrat. W PowerPoint, korzystając z punktów kontrolnych, możesz
- przesunąć róg kwadratu do wewnątrz lub na zewnątrz
- określić stopień krzywizny rogu lub punktu
- dodać nowe punkty do kwadratu
- manipulować punktami na kwadracie itp.
W zasadzie możesz wykonywać opisane zadania na dowolnym kształcie. Korzystając z punktów kontrolnych, możesz zmienić kształt lub utworzyć nowy kształt na podstawie istniejącego.
Shape Editing Tips

Zanim zaczniesz edytować kształty PowerPoint za pomocą punktów kontrolnych, 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.
- Gdy kształt jest zamknięty, nie ma punktu początkowego ani końcowego. Gdy jest otwarty, posiada początek i koniec.
- 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 zakrzywiona. 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 2 proste linie łączą się pod kątem.
- Punkt płynny to punkt, w którym 2 uchwyty znajdują się w 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 2 uchwyty znajdują się w jednej prostej, a odcinki 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 kontrolnych, Aspose.Slides udostępnia klasę GeometryPath.
- Instancja GeometryPath reprezentuje ścieżkę geometryczną obiektu GeometryShape.
- Aby pobrać
GeometryPathz instancjiGeometryShape, możesz użyć metody GeometryShape::getGeometryPaths. - Aby ustawić
GeometryPathdla kształtu, możesz użyć następujących metod: GeometryShape::setGeometryPath dla kształtów jednorodnych oraz GeometryShape::setGeometryPaths dla kształtów złożonych. - Aby dodać segmenty, możesz użyć metod dostępnych w GeometryPath.
- Korzystając z metod GeometryPath::setStroke oraz GeometryPath::setFillMode, możesz określić wygląd ścieżki geometrycznej.
- Korzystając z metody GeometryPath::getPathData, możesz pobrać ścieżkę geometryczną
GeometryShapejako tablicę segmentów. - Aby uzyskać dodatkowe opcje dostosowywania geometrii kształtu, możesz przekonwertować GeometryPath na java.awt.Shape.
- Użyj metod geometryPathToGraphicsPath i graphicsPathToGeometryPath (z klasy ShapeUtil), aby konwertować GeometryPath na java.awt.Shape i z powrotem.
Simple Editing Operations
Ten kod PHP pokazuje, jak
Dodaj linię na koniec ścieżki
Dodaj linię do określonej pozycji w ścieżce:
Dodaj krzywą Beziera stopnia trzeciego na koniec ścieżki:
Dodaj krzywą Beziera stopnia trzeciego do określonej pozycji w ścieżce:
Dodaj krzywą Beziera stopnia drugiego na koniec ścieżki:
Dodaj krzywą Beziera stopnia drugiego do określonej pozycji w ścieżce:
Dołącz podany łuk do ścieżki:
Zamknij bieżącą figurę ścieżki:
Ustaw pozycję następnego punktu:
Usuń segment ścieżki o podanym indeksie:
Add Custom Points to a Shape
- 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 ścieżki.
- Dodaj nowy punkt pomiędzy dwoma dolnymi punktami ścieżki.
- Zastosuj ścieżkę do kształtu.
Ten kod PHP pokazuje, jak dodać własne punkty do kształtu:
$pres = new Presentation();
try {
$shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 200, 100);
$geometryPath = $shape->getGeometryPaths()[0];
$geometryPath->lineTo(100, 50, 1);
$geometryPath->lineTo(100, 50, 4);
$shape->setGeometryPath($geometryPath);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}

Remove Points from a Shape
- 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 PHP pokazuje, jak usunąć punkty z kształtu:
$pres = new Presentation();
try {
$shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Heart, 100, 100, 300, 300);
$path = $shape->getGeometryPaths()[0];
$path->removeAt(2);
$shape->setGeometryPath($path);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}

Create a Custom Shape
- 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 Java pokazuje, jak utworzyć własny kształt:
$points = new Java("java.util.ArrayList");
$R = 100;
$r = 50;
$step = 72;
for($angle = -90; $angle < 270; $angle += $step) {
$radians = $angle * java("java.lang.Math")->PI / 180.0;
$x = $R * java("java.lang.Math")->cos($radians);
$y = $R * java("java.lang.Math")->sin($radians);
$points->add(new Point2DFloat($x + $R, $y + $R));
$radians = java("java.lang.Math")->PI * $angle . $step / 2 / 180.0;
$x = $r * java("java.lang.Math")->cos($radians);
$y = $r * java("java.lang.Math")->sin($radians);
$points->add(new Point2DFloat($x + $R, $y + $R));
}
$starPath = new GeometryPath();
$starPath->moveTo($points->get(0));
for($i = 1; $i < java_values($points->size()) ; $i++) {
$starPath->lineTo($points->get($i));
}
$starPath->closeFigure();
$pres = new Presentation();
try {
$shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, $R * 2, $R * 2);
$shape->setGeometryPath($starPath);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}

Create a Composite Custom Shape
- 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 PHP pokazuje, jak utworzyć złożony własny kształt:
$pres = new Presentation();
try {
$shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 200, 100);
$geometryPath0 = new GeometryPath();
$geometryPath0->moveTo(0, 0);
$geometryPath0->lineTo($shape->getWidth(), 0);
$geometryPath0->lineTo($shape->getWidth(), $shape->getHeight() / 3);
$geometryPath0->lineTo(0, $shape->getHeight() / 3);
$geometryPath0->closeFigure();
$geometryPath1 = new GeometryPath();
$geometryPath1->moveTo(0, $shape->getHeight() / 3 * 2);
$geometryPath1->lineTo($shape->getWidth(), $shape->getHeight() / 3 * 2);
$geometryPath1->lineTo($shape->getWidth(), $shape->getHeight());
$geometryPath1->lineTo(0, $shape->getHeight());
$geometryPath1->closeFigure();
$shape->setGeometryPaths(array($geometryPath0, $geometryPath1 ));
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}

Create a Custom Shape with Curved Corners
Ten kod PHP pokazuje, jak utworzyć własny kształt z zaokrąglonymi narożnikami (do wnętrza);
$shapeX = 20.0;
$shapeY = 20.0;
$shapeWidth = 300.0;
$shapeHeight = 200.0;
$leftTopSize = 50.0;
$rightTopSize = 20.0;
$rightBottomSize = 40.0;
$leftBottomSize = 10.0;
$pres = new Presentation();
try {
$childShape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Custom, $shapeX, $shapeY, $shapeWidth, $shapeHeight);
$geometryPath = new GeometryPath();
$point1 = new Point2DFloat($leftTopSize, 0);
$point2 = new Point2DFloat($shapeWidth - $rightTopSize, 0);
$point3 = new Point2DFloat($shapeWidth, $shapeHeight - $rightBottomSize);
$point4 = new Point2DFloat($leftBottomSize, $shapeHeight);
$point5 = new Point2DFloat(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);
$pres->save("output.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Find Out If a Shape Geometry Is Closed
Kształt zamknięty definiuje się jako taki, w którym wszystkie jego boki łączą się, tworząc jednolitą granicę bez przerw. Taki kształt może być prostą formą geometryczną lub złożonym, własnym konturem. Poniższy przykład kodu pokazuje, jak sprawdzić, czy geometria kształtu jest zamknięta:
function isGeometryClosed($geometryShape)
{
$isClosed = null;
foreach ($geometryShape->getGeometryPaths() as $geometryPath) {
$dataLength = count(java_values($geometryPath->getPathData()));
if ($dataLength === 0) {
continue;
}
$lastSegment = java_values($geometryPath->getPathData())[$dataLength - 1];
$isClosed = $lastSegment->getPathCommand() === PathCommandType::Close;
if ($isClosed === false) {
return false;
}
}
return $isClosed === true;
}
Convert GeometryPath to java.awt.Shape
- Utwórz instancję klasy GeometryShape.
- Utwórz instancję klasy java.awt.Shape.
- Przekonwertuj instancję java.awt.Shape na instancję GeometryPath, używając klasy ShapeUtil.
- Zastosuj ścieżki do kształtu.
Ten kod PHP — implementacja powyższych kroków — demonstruje proces konwersji GeometryPath na GraphicsPath:
$pres = new Presentation();
try {
# Utwórz nowy kształt
$shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 100);
# Pobierz ścieżkę geometryczną kształtu
$originalPath = $shape->getGeometryPaths()[0];
$originalPath->setFillMode(PathFillModeType::None);
# Utwórz nową ścieżkę graficzną z tekstem
$graphicsPath;
$font = new Font("Arial", Font->PLAIN, 40);
$text = "Text in shape";
$img = new BufferedImage(100, 100, BufferedImage->TYPE_INT_ARGB);
$g2 = $img->createGraphics();
try {
$glyphVector = $font->createGlyphVector($g2->getFontRenderContext(), $text);
$graphicsPath = $glyphVector->getOutline(20.0, -$glyphVector->getVisualBounds()->getY() + 10);
} finally {
$g2->dispose();
}
# Konwertuj ścieżkę graficzną na ścieżkę geometryczną
$textPath = ShapeUtil->graphicsPathToGeometryPath($graphicsPath);
$textPath->setFillMode(PathFillModeType::Normal);
# Ustaw kombinację nowej ścieżki geometrycznej i oryginalnej ścieżki geometrycznej dla kształtu
$shape->setGeometryPaths(array($originalPath, $textPath ));
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}

FAQ
Co się stanie z wypełnieniem i obramowaniem po zamianie geometrii?
Styl pozostaje przypisany do kształtu; zmienia się tylko kontur. Wypełnienie i obramowanie są automatycznie stosowane do nowej geometrii.
Jak poprawnie obrócić własny kształt razem z jego geometrią?
Użyj metody setRotation kształtu; geometria obraca się razem 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 odpowiedni obszar slajdu lub sam kształt do formatu rastrowego; ułatwia to dalszą pracę z rozbudowanymi geometriami.