Personalizza le forme di presentazione in PHP

Panoramica

Questo articolo spiega come personalizzare le forme delle presentazioni in Aspose.Slides modificando la geometria delle forme tramite punti di modifica e percorsi geometrici. Mostra come lavorare con GeometryPath per modificare forme esistenti, eseguire operazioni di modifica di base sui percorsi, aggiungere o rimuovere punti e applicare la geometria aggiornata a una forma.

Dimostra inoltre come creare forme personalizzate e composite, costruire forme con angoli curvi, determinare se la geometria di una forma è chiusa e convertire tra GeometryPath e java.awt.Shape per scenari aggiuntivi di personalizzazione geometrica.

Modifica una forma usando i punti di modifica

Considera un quadrato. In PowerPoint, usando punti di modifica, puoi

  • spostare l’angolo del quadrato verso l’interno o verso l’esterno
  • specificare la curvatura per un angolo o un punto
  • aggiungere nuovi punti al quadrato
  • manipolare i punti del quadrato, ecc.

Essenzialmente, puoi eseguire le attività descritte su qualsiasi forma. Usando i punti di modifica, puoi cambiare una forma o crearne una nuova a partire da una forma esistente.

Suggerimenti per la modifica delle forme

overview_image

Prima di iniziare a modificare le forme di PowerPoint tramite punti di modifica, potresti voler considerare questi aspetti delle forme:

  • Una forma (o il suo percorso) può essere chiusa o aperta.
  • Quando una forma è chiusa, non ha un punto di inizio o di fine. Quando è aperta, ha un inizio e una fine.
  • Tutte le forme sono composte da almeno 2 punti di ancoraggio collegati tra loro da linee
  • Una linea è dritta o curva. I punti di ancoraggio determinano la natura della linea.
  • I punti di ancoraggio possono essere punti d’angolo, punti dritti o punti levigati:
    • Un punto d’angolo è un punto in cui 2 linee rette si uniscono formando un angolo.
    • Un punto levigato è un punto in cui 2 maniglie sono su una linea retta e i segmenti della linea si uniscono in una curva levigata. In questo caso, tutte le maniglie sono separate dal punto di ancoraggio di una distanza uguale.
    • Un punto dritto è un punto in cui 2 maniglie sono su una linea retta e i segmenti di quella linea si uniscono in una curva levigata. In questo caso, le maniglie non devono essere separate dal punto di ancoraggio di una distanza uguale.
  • Spostando o modificando i punti di ancoraggio (che cambia l’angolo delle linee), è possibile modificare l’aspetto di una forma.

Per modificare le forme di PowerPoint tramite punti di modifica, Aspose.Slides fornisce la classe GeometryPath.

Operazioni di modifica semplici

Questo codice PHP mostra come

Aggiungi una linea alla fine di un percorso


Aggiungi una linea a una posizione specifica su un percorso:


Aggiungi una curva Bézier cubica alla fine di un percorso:


Aggiungi una curva Bézier cubica alla posizione specificata su un percorso:


Aggiungi una curva Bézier quadratica alla fine di un percorso:


Aggiungi una curva Bézier quadratica a una posizione specifica su un percorso:


Aggiungi un arco specificato a un percorso:


Chiudi la figura corrente di un percorso:


Imposta la posizione per il punto successivo:


Rimuovi il segmento di percorso a un indice specificato:


Aggiungi punti personalizzati a una forma

  1. Crea un’istanza della classe GeometryShape e imposta il tipo ShapeType::Rectangle.
  2. Ottieni un’istanza della classe GeometryPath dalla forma.
  3. Aggiungi un nuovo punto tra i due punti superiori del percorso.
  4. Aggiungi un nuovo punto tra i due punti inferiori del percorso.
  5. Applica il percorso alla forma.

Questo codice PHP mostra come aggiungere punti personalizzati a una forma:

  $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

Rimuovi punti da una forma

  1. Crea un’istanza della classe GeometryShape e imposta il tipo ShapeType::Heart.
  2. Ottieni un’istanza della classe GeometryPath dalla forma.
  3. Rimuovi il segmento del percorso.
  4. Applica il percorso alla forma.

Questo codice PHP mostra come rimuovere punti da una forma:

  $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

Crea una forma personalizzata

  1. Calcola i punti per la forma.
  2. Crea un’istanza della classe GeometryPath.
  3. Riempisci il percorso con i punti.
  4. Crea un’istanza della classe GeometryShape.
  5. Applica il percorso alla forma.

Questo esempio Java mostra come creare una forma personalizzata:

  $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

Crea una forma personalizzata composita

  1. Crea un’istanza della classe GeometryShape.
  2. Crea una prima istanza della classe GeometryPath.
  3. Crea una seconda istanza della classe GeometryPath.
  4. Applica i percorsi alla forma.

Questo codice PHP mostra come creare una forma personalizzata composita:

  $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

Crea una forma personalizzata con angoli curvi

Questo codice PHP mostra come creare una forma personalizzata con angoli curvi (verso l’interno):

  $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();
    }
  }

Scopri se la geometria di una forma è chiusa

Una forma chiusa è definita come una forma le cui estremità sono tutte connesse, formando un unico contorno senza spazi. Tale forma può essere una semplice figura geometrica o un contorno personalizzato complesso. L’esempio di codice seguente mostra come verificare se la geometria di una forma è chiusa:

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;
}

Converti GeometryPath in java.awt.Shape

  1. Crea un’istanza della classe GeometryShape.
  2. Crea un’istanza della classe java.awt.Shape.
  3. Converte l’istanza java.awt.Shape nell’istanza GeometryPath usando ShapeUtil.
  4. Applica i percorsi alla forma.

Questo codice PHP—un’implementazione dei passaggi sopra—dimostra il processo di conversione da GeometryPath a GraphicsPath:

  $pres = new Presentation();
  try {
    # Crea una nuova forma
    $shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 100);
    # Ottieni il percorso geometrico della forma
    $originalPath = $shape->getGeometryPaths()[0];
    $originalPath->setFillMode(PathFillModeType::None);
    # Crea un nuovo percorso grafico con testo
    $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();
    }
    # Converti il percorso grafico in percorso geometrico
    $textPath = ShapeUtil->graphicsPathToGeometryPath($graphicsPath);
    $textPath->setFillMode(PathFillModeType::Normal);
    # Imposta la combinazione del nuovo percorso geometrico e del percorso geometrico originale sulla forma
    $shape->setGeometryPaths(array($originalPath, $textPath ));
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

example5_image

FAQ

Cosa accade al riempimento e al contorno dopo aver sostituito la geometria?

Lo stile rimane associato alla forma; solo il contorno cambia. Il riempimento e il contorno vengono applicati automaticamente alla nuova geometria.

Come ruoto correttamente una forma personalizzata insieme alla sua geometria?

Usa il metodo setRotation della forma; la geometria ruota con la forma perché è legata al sistema di coordinate della forma stessa.

Posso convertire una forma personalizzata in un’immagine per “bloccare” il risultato?

Sì. Esporta l’area della slide o la shape stessa in un formato raster; questo semplifica il lavoro successivo con geometrie complesse.