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ů

overview_image

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.

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

  1. Vytvořte instanci třídy GeometryShape a nastavte typ ShapeType::Rectangle .
  2. Získejte instanci třídy GeometryPath ze tvaru.
  3. Přidejte nový bod mezi dvěma horními body v cestě.
  4. Přidejte nový bod mezi dvěma spodními body v cestě.
  5. 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();
    }
  }

example1_image

Odstranit body z tvaru

  1. Vytvořte instanci třídy GeometryShape a nastavte typ ShapeType::Heart .
  2. Získejte instanci třídy GeometryPath ze tvaru.
  3. Odstraňte segment cesty.
  4. 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();
    }
  }

example2_image

Vytvořit vlastní tvar

  1. Vypočítejte body pro tvar.
  2. Vytvořte instanci třídy GeometryPath .
  3. Naplněte cestu body.
  4. Vytvořte instanci třídy GeometryShape .
  5. 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();
    }
  }

example3_image

Vytvořit složený vlastní tvar

  1. Vytvořte instanci třídy GeometryShape .
  2. Vytvořte první instanci třídy GeometryPath .
  3. Vytvořte druhou instanci třídy GeometryPath .
  4. 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();
    }
  }

example4_image

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

  1. Vytvořte instanci třídy GeometryShape .
  2. Vytvořte instanci třídy java.awt.Shape .
  3. Převést instanci java.awt.Shape na instanci GeometryPath pomocí ShapeUtil .
  4. 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();
    }
  }

example5_image

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.