Prezentációs alakzatok testreszabása PHP-ben
Áttekintés
Ez a cikk bemutatja, hogyan lehet testre szabni a prezentációs alakzatokat az Aspose.Slides-ben úgy, hogy a alakzatgeometriát szerkesztési pontok és geometriai útvonalak segítségével módosítjuk. Megmutatja, hogyan kell a GeometryPath‑t használni a meglévő alakzatok módosításához, alapvető útvonal‑szerkesztési műveletek végrehajtásához, pontok hozzáadásához vagy eltávolításához, és a frissített geometria visszaalkalmazásához egy alakzatra.
Emellett bemutatja, hogyan hozhatunk létre egyéni és kompozit alakzatokat, hogyan építhetünk görbe sarkokkal rendelkező alakzatokat, hogyan határozhatjuk meg, hogy egy alakzatgeometria zárt‑e, valamint hogyan konvertálhatjuk a GeometryPath‑t és a java.awt.Shape‑t egymásba további geometriai testreszabási helyzetekhez.
Alakzat módosítása szerkesztési pontokkal
Vegyünk egy négyzetet. A PowerPointban a szerkesztési pontok segítségével a következőket teheti:
- a négyzet sarkát befelé vagy kifelé mozgatni
- megadni a görbületet egy sarokhoz vagy ponthoz
- új pontokat hozzáadni a négyzethez
- pontokat kezelni a négyzeten, stb.
Lényegében a leírt feladatokat bármely alakzaton végrehajthatja. A szerkesztési pontok használatával egy alakzatot módosíthat vagy egy új alakzatot hozhat létre egy meglévőből.
Alakzat szerkesztési tippek

Mielőtt elkezdené szerkeszteni a PowerPoint‑alkalmazás alakzatait szerkesztési pontokkal, vegye figyelembe az alábbi szempontokat az alakzatokról:
- Egy alakzat (vagy az útvonala) lehet zárt vagy nyitott.
- Ha egy alakzat zárt, nincs kezdő‑ vagy végpontja. Ha nyitott, van egy kezdeti és egy befejező pontja.
- Minden alakzat legalább 2 horgonypontból áll, amelyeket vonalak kötnek össze.
- Egy vonal lehet egyenes vagy ívelt. A horgonypontok határozzák meg a vonal jellegét.
- A horgonypontok lehetnek sarokpontok, simított pontok vagy egyenes pontok:
- Egy sarokpont olyan pont, ahol 2 egyenes vonal szöggel találkozik.
- Egy simított pont olyan pont, ahol 2 fogantyú egy egyenes vonalon helyezkedik el, és a vonalszakaszok sima ívben csatlakoznak. Ebben az esetben a fogantyúk azonos távolságra vannak a horgonyponttól.
- Egy egyenes pont olyan pont, ahol 2 fogantyú egy egyenes vonalon helyezkedik el, és a vonalszakaszok sima ívben csatlakoznak. Itt a fogantyúknek nem kell azonos távolságra lenniük a horgonyponttól.
- A horgonypontok mozgatásával vagy szerkesztésével (ami a vonalak szögét változtatja) megváltoztathatja az alakzat megjelenését.
A PowerPoint‑alakzatok szerkesztéséhez szerkesztési pontokkal, az Aspose.Slides a GeometryPath osztályt biztosítja.
- Egy GeometryPath példány egy geometriai útvonalat képvisel a GeometryShape objektumban.
- A
GeometryShapepéldányból aGeometryPath‑t a GeometryShape::getGeometryPaths metódussal kérhetjük le. - Egy alakzat
GeometryPath‑jának beállításához használhatja a következő metódusokat: GeometryShape::setGeometryPath szilárd alakzatok esetén és GeometryShape::setGeometryPaths kompozit alakzatok esetén. - Szakaszok hozzáadásához a GeometryPath alatti metódusokat használhatja.
- A GeometryPath::setStroke és a GeometryPath::setFillMode metódusokkal beállíthatja egy geometriai útvonal megjelenését.
- A GeometryPath::getPathData metódussal lekérheti egy
GeometryShapegeometriai útvonalát útvonal‑szegmensek tömbjeként. - További alakzat‑geometriai testreszabási lehetőségekhez konvertálhatja a GeometryPath‑t java.awt.Shape típusra.
- Használja a geometryPathToGraphicsPath és a graphicsPathToGeometryPath metódusokat (a ShapeUtil osztályból) a GeometryPath és a java.awt.Shape közötti konverzióhoz oda‑vissza.
Egyszerű szerkesztési műveletek
Ez a PHP kód azt mutatja, hogyan lehet
Vonal hozzáadása az útvonal végéhez
Vonal hozzáadása egy meghatározott pozícióban az útvonalon:
Köbös Bézier‑görbe hozzáadása az útvonal végéhez:
Köbös Bézier‑görbe hozzáadása egy meghatározott pozícióban az útvonalon:
Parabolikus Bézier‑görbe hozzáadása az útvonal végéhez:
Parabolikus Bézier‑görbe hozzáadása egy meghatározott pozícióban az útvonalon:
Megadott ív hozzáfűzése az útvonalhoz:
Az aktuális alakzat lezárása az útvonalon:
A következő pont pozíciójának beállítása:
Az útvonal‑szegmens eltávolítása egy adott indexnél:
Egyéni pontok hozzáadása egy alakzathoz
- Hozzon létre egy példányt a GeometryShape osztályból, és állítsa be a ShapeType::Rectangle típust.
- Szerezze be a GeometryPath példányt az alakzatról.
- Adjon hozzá egy új pontot a két felső pont között az útvonalon.
- Adjon hozzá egy új pontot a két alsó pont között az útvonalon.
- Alkalmazza az útvonalat az alakzatra.
Ez a PHP kód azt mutatja, hogyan adhat hozzá egyéni pontokat egy alakzathoz:
$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();
}
}

Pontok eltávolítása egy alakzatról
- Hozzon létre egy példányt a GeometryShape osztályból, és állítsa be a ShapeType::Heart típust.
- Szerezze be a GeometryPath példányt az alakzatról.
- Távolítsa el a szegmenst az útvonalból.
- Alkalmazza az útvonalat az alakzatra.
Ez a PHP kód azt mutatja, hogyan távolíthat el pontokat egy alakzatról:
$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();
}
}

Egyéni alakzat létrehozása
- Számolja ki az alakzat pontjait.
- Hozzon létre egy példányt a GeometryPath osztályból.
- Töltse fel az útvonalat a pontokkal.
- Hozzon létre egy példányt a GeometryShape osztályból.
- Alkalmazza az útvonalat az alakzatra.
Ez a Java azt mutatja, hogyan hozhat létre egy egyéni alakzatot:
$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();
}
}

Kompozit egyéni alakzat létrehozása
- Hozzon létre egy példányt a GeometryShape osztályból.
- Hozzon létre egy első példányt a GeometryPath osztályból.
- Hozzon létre egy második példányt a GeometryPath osztályból.
- Alkalmazza a két útvonalat az alakzatra.
Ez a PHP kód azt mutatja, hogyan hozhat létre egy kompozit egyéni alakzatot:
$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();
}
}

Egyéni alakzat létrehozása görbe sarkokkal
Ez a PHP kód azt mutatja, hogyan hozhat létre egy egyéni alakzatot görbe sarkokkal (befelé):
$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();
}
}
Megállapítás, hogy egy alakzatgeometria zárt‑e
A zárt alakzat olyan, amelynek minden oldala összekapcsolódik, egyetlen határolóvonalat alkotva rések nélkül. Ilyen alakzat lehet egyszerű geometriai forma vagy bonyolult egyéni kontúr. Az alábbi kódrészlet bemutatja, hogyan ellenőrizhető, hogy egy alakzatgeometria zárt‑e:
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;
}
GeometryPath átalakítása java.awt.Shape típusra
- Hozzon létre egy példányt a GeometryShape osztályból.
- Hozzon létre egy példányt a java.awt.Shape osztályból.
- A ShapeUtil segítségével konvertálja a java.awt.Shape példányt a GeometryPath példányra.
- Alkalmazza az útvonalakat az alakzatra.
Ez a PHP kód – a fenti lépések megvalósítása – bemutatja a GeometryPath‑tól GraphicsPath‑ig terjedő konverziós folyamatot:
$pres = new Presentation();
try {
# Új alakzat létrehozása
$shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 100);
# Az alakzat geometriai útvonalának lekérése
$originalPath = $shape->getGeometryPaths()[0];
$originalPath->setFillMode(PathFillModeType::None);
# Új grafikus útvonal létrehozása szöveggel
$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();
}
# Grafikus útvonal konvertálása geometriai útvonalra
$textPath = ShapeUtil->graphicsPathToGeometryPath($graphicsPath);
$textPath->setFillMode(PathFillModeType::Normal);
# Új geometriai útvonal és az eredeti geometriai útvonal kombinációjának beállítása az alakzatra
$shape->setGeometryPaths(array($originalPath, $textPath ));
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}

GYIK
Mi történik a kitöltéssel és a kontúrral a geometria cseréje után?
A stílus az alakzatnál marad; csak a kontúr változik. A kitöltés és a kontúr automatikusan az új geometriára kerülnek alkalmazásra.
Hogyan tudom helyesen elforgatni egy egyéni alakzatot a geometriai adataival együtt?
Használja az alakzat setRotation metódusát; a geometria az alakzattal együtt forgó, mivel az az alakzat saját koordináta‑rendszeréhez van kötve.
Átalakíthatom‑e egy egyéni alakzatot képpé a végeredmény „lezárásához”?
Igen. Exportálja a szükséges slide területet vagy a shape saját magát raszteres formátumba; ez egyszerűsíti a nehéz geometriai elemekkel való további munkát.