Přizpůsobení tvarů prezentace v PHP
Přehled
Tento článek vysvětluje, jak přizpůsobit tvary prezentace v Aspose.Slides úpravou geometrie tvaru pomocí editačních bodů a geometrických cest. Ukazuje, jak pracovat s GeometryPath k úpravě existujících tvarů, provádět základní operace úpravy cesty, přidávat nebo odebírat body a aplikovat aktualizovanou geometrii zpět na tvar.
Také demonstruje, jak vytvořit vlastní a složené tvary, stavět tvary s zakřivenými rohy, určit, zda je geometrie tvaru uzavřená, a převádět mezi GeometryPath a java.awt.Shape pro další scénáře přizpůsobení geometrie.
Změna tvaru pomocí editačních bodů
Uvažujme čtverec. V PowerPointu můžete pomocí edit points:
- posunout roh čtverce dovnitř nebo ven
- specifikovat zakřivení rohu nebo bodu
- přidat nové body do čtverce
- manipulovat body na čtverci atd.
V podstatě můžete provádět popsané úkoly na libovolném tvaru. Pomocí editačních bodů můžete měnit tvar nebo vytvořit nový tvar z existujícího tvaru.
Tipy pro úpravu tvarů

Před tím, než začnete upravovat tvary PowerPointu pomocí editačních bodů, můžete zvážit následující body o tvarech:
- Tvar (nebo jeho cesta) může být buď uzavřený, nebo otevřený.
- Když je tvar uzavřený, postrádá počáteční nebo koncový bod. Když je otevřený, má začátek i konec.
- Všechny tvary se skládají alespoň ze 2 kotevních bodů propojených čarami
- Čára je buď přímá, nebo zakřivená. Kotevní body určují povahu čáry.
- Kotevní body existují jako rohové body, přímé body nebo hladké body:
- Rohový bod je bod, kde se dva přímé úseky setkají pod úhlem.
- Hladký bod je bod, kde jsou dva úchyty v jedné přímce a segmenty čáry se spojují do hladké křivky. V tomto případě jsou všechny úchyty od kotevního bodu vzdáleny stejnou vzdáleností.
- Přímý bod je bod, kde jsou dva úchyty v jedné přímce a segmenty čáry se spojují do hladké křivky. V tomto případě nemusí být úchyty od kotevního bodu vzdáleny stejně.
- Přesouváním nebo úpravou kotevních bodů (což mění úhel čar) můžete změnit vzhled tvaru.
Pro úpravu tvarů PowerPointu pomocí editačních bodů poskytuje Aspose.Slides třídu GeometryPath.
- Instance GeometryPath představuje geometrickou cestu objektu GeometryShape .
- Pro získání
GeometryPathz instanceGeometryShapemůžete použít metodu GeometryShape::getGeometryPaths. - Pro nastavení
GeometryPathpro tvar můžete použít tyto metody: GeometryShape::setGeometryPath pro plné tvary a GeometryShape::setGeometryPaths pro složité tvary. - Pro přidání segmentů můžete použít metody v rámci GeometryPath .
- Pomocí metod GeometryPath::setStroke a GeometryPath::setFillMode můžete nastavit vzhled geometrické cesty.
- Metodou GeometryPath::getPathData můžete získat geometrickou cestu
GeometryShapejako pole segmentů cesty. - Pro přístup k dalším možnostem přizpůsobení geometrie tvaru můžete převést GeometryPath na java.awt.Shape
- Použijte geometryPathToGraphicsPath a graphicsPathToGeometryPath (z třídy ShapeUtil ) k převodu GeometryPath na java.awt.Shape a zpět.
Jednoduché operace úpravy
Tento PHP kód vám ukazuje, jak
Přidat čáru na konec cesty
Přidat čáru na určenou pozici v cestě:
Přidat kubickou Bézierovu křivku na konec cesty:
Přidat kubickou Bézierovu křivku na určenou pozici v cestě:
Přidat kvadratickou Bézierovu křivku na konec cesty:
Přidat kvadratickou Bézierovu křivku na určenou pozici v cestě:
Připojit daný oblouk k cestě:
Uzavřít aktuální útvar cesty:
Nastavit pozici pro další bod:
Odstranit segment cesty na daném indexu:
Přidat vlastní body do tvaru
- Vytvořte instanci třídy GeometryShape a nastavte typ ShapeType::Rectangle .
- Získejte instanci třídy GeometryPath ze tvaru.
- Přidejte nový bod mezi dvěma horními body v cestě.
- Přidejte nový bod mezi dvěma spodními body v cestě.
- Aplikujte cestu na tvar.
Tento PHP kód vám ukazuje, jak přidat vlastní body do tvaru:
$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();
}
}

Odstranit body z tvaru
- Vytvořte instanci třídy GeometryShape a nastavte typ ShapeType::Heart .
- Získejte instanci třídy GeometryPath ze tvaru.
- Odstraňte segment cesty.
- Aplikujte cestu na tvar.
Tento PHP kód vám ukazuje, jak odstranit body z tvaru:
$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();
}
}

Vytvořit vlastní tvar
- Vypočítejte body pro tvar.
- Vytvořte instanci třídy GeometryPath .
- Naplněte cestu body.
- Vytvořte instanci třídy GeometryShape .
- Aplikujte cestu na tvar.
Tento Java vám ukazuje, jak vytvořit vlastní tvar:
$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();
}
}

Vytvořit složený vlastní tvar
- Vytvořte instanci třídy GeometryShape .
- Vytvořte první instanci třídy GeometryPath .
- Vytvořte druhou instanci třídy GeometryPath .
- Aplikujte cesty na tvar.
Tento PHP kód vám ukazuje, jak vytvořit složený vlastní tvar:
$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();
}
}

Vytvořit vlastní tvar s zakřivenými rohy
Tento PHP kód vám ukazuje, jak vytvořit vlastní tvar s zakřivenými rohy (dovnitř);
$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();
}
}
Zjistit, zda je geometrie tvaru uzavřená
Uzavřený tvar je definován jako takový, kde se všechny jeho strany spojují a tvoří jedinou hranici bez mezer. Takový tvar může být jednoduchý geometrický útvar nebo složitý vlastní obrys. Následující ukázka kódu ukazuje, jak zkontrolovat, zda je geometrie tvaru uzavřená:
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;
}
Převést GeometryPath na java.awt.Shape
- Vytvořte instanci třídy GeometryShape .
- Vytvořte instanci třídy java.awt.Shape .
- Převést instanci java.awt.Shape na instanci GeometryPath pomocí ShapeUtil .
- Aplikujte cesty na tvar.
Tento PHP kód — implementace výše uvedených kroků — ukazuje proces konverze GeometryPath na GraphicsPath:
$pres = new Presentation();
try {
# Vytvořit nový tvar
$shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 100);
# Získat geometrickou cestu tvaru
$originalPath = $shape->getGeometryPaths()[0];
$originalPath->setFillMode(PathFillModeType::None);
# Vytvořit novou grafickou cestu s textem
$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();
}
# Převést grafickou cestu na geometrickou cestu
$textPath = ShapeUtil->graphicsPathToGeometryPath($graphicsPath);
$textPath->setFillMode(PathFillModeType::Normal);
# Nastavit kombinaci nové geometrické cesty a původní geometrické cesty pro tvar
$shape->setGeometryPaths(array($originalPath, $textPath ));
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}

FAQ
Co se stane s výplní a obrysem po nahrazení geometrie?
Styl zůstane u tvaru; mění se pouze kontura. Výplň a obrys jsou automaticky aplikovány na novou geometrii.
Jak správně otočit vlastní tvar spolu s jeho geometrií?
Použijte metodu setRotation tvaru; geometrie se otáčí s tvarem, protože je svázána s vlastním souřadnicovým systémem tvaru.
Mohu převést vlastní tvar na obrázek, aby byl „uzamčen“ výsledek?
Ano. Exportujte požadovanou slide oblast nebo samotný shape do rastrového formátu; to usnadní další práci s těžkými geometriemi.