ปรับแต่งรูปร่างงานนำเสนอใน PHP

ภาพรวม

บทความนี้อธิบายวิธีปรับแต่งรูปร่างการนำเสนอใน Aspose.Slides โดยการแก้ไขเรขาคณิตของรูปร่างผ่านจุดแก้ไขและเส้นทางเรขาคณิต รวมถึงวิธีใช้ GeometryPath เพื่อแก้ไขรูปร่างที่มีอยู่, ทำการแก้ไขเส้นทางพื้นฐาน, เพิ่มหรือลบจุด, และนำเรขาคณิตที่อัปเดตกลับไปใช้กับรูปร่าง

บทความยังแสดงวิธีสร้างรูปร่างแบบกำหนดเองและแบบผสม, สร้างรูปร่างที่มีมุมโค้ง, ตรวจสอบว่ารูปร่างเรขาคณิตเป็นแบบปิดหรือไม่, และแปลงระหว่าง GeometryPath กับ java.awt.Shape เพื่อใช้ในสถานการณ์การปรับแต่งเรขาคณิตเพิ่มเติม

เปลี่ยนรูปร่างโดยใช้จุดแก้ไข

ให้พิจารณาสี่เหลี่ยมจัตุรัส ใน PowerPoint คุณสามารถใช้ จุดแก้ไข เพื่อ

  • ย้ายมุมของสี่เหลี่ยมเข้าไปหรือออกไป
  • กำหนดความโค้งของมุมหรือจุด
  • เพิ่มจุดใหม่ให้กับสี่เหลี่ยม
  • จัดการกับจุดบนสี่เหลี่ยม ฯลฯ

โดยสรุป คุณสามารถทำงานที่อธิบายไว้กับรูปร่างใดก็ได้ การใช้จุดแก้ไขทำให้คุณสามารถเปลี่ยนรูปร่างหรือสร้างรูปร่างใหม่จากรูปร่างที่มีอยู่ได้

เคล็ดลับการแก้ไขรูปร่าง

overview_image

ก่อนที่คุณจะเริ่มแก้ไขรูปร่าง PowerPoint ผ่านจุดแก้ไข ควรพิจารณาจุดต่อไปนี้เกี่ยวกับรูปร่าง:

  • รูปร่าง (หรือเส้นทางของมัน) สามารถเป็นแบบปิดหรือเปิดได้
  • เมื่อรูปร่างเป็นแบบปิด จะไม่มีจุดเริ่มต้นหรือจุดสิ้นสุด ส่วนเมือเป็นแบบเปิด จะมีจุดเริ่มต้นและจุดสิ้นสุด
  • รูปร่างทั้งหมดประกอบด้วยจุดยึดอย่างน้อย 2 จุดที่เชื่อมต่อกันด้วยเส้น
  • เส้นสามารถเป็นเส้นตรงหรือโค้ง จุดยึดกำหนดลักษณะของเส้น
  • จุดยึดมีอยู่เป็นจุดมุม, จุดตรง, หรือจุดเรียบ:
    • จุดมุมคือจุดที่เส้นตรงสองเส้นมาบรรจบกันที่มุม
    • จุดเรียบคือจุดที่มีแฮนด์สองตัวอยู่บนเส้นตรงและส่วนของเส้นเชื่อมต่อกันเป็นโค้งเรียบ ในกรณีนี้ แฮนด์ทั้งหมดจะห่างจากจุดยึดเท่าๆ กัน
    • จุดตรงคือจุดที่มีแฮนด์สองตัวอยู่บนเส้นตรงและส่วนของเส้นนั้นเชื่อมต่อกันเป็นโค้งเรียบ ในกรณีนี้ แฮนด์ไม่จำเป็นต้องห่างจากจุดยึดเท่าๆ กัน
  • โดยการย้ายหรือแก้ไขจุดยึด (ซึ่งจะเปลี่ยนมุมของเส้น) คุณสามารถเปลี่ยนรูปลักษณ์ของรูปร่างได้

เพื่อแก้ไขรูปร่าง PowerPoint ผ่านจุดแก้ไข Aspose.Slides ให้บริการคลาส GeometryPath

  • อินสแตนซ์ของGeometryPath แทนเส้นทางเรขาคณิตของอ็อบเจกต์GeometryShape .
  • เพื่อดึงGeometryPathจากอินสแตนซ์GeometryShapeคุณสามารถใช้เมธอดGeometryShape::getGeometryPaths.
  • เพื่อกำหนดGeometryPathให้กับรูปร่าง คุณสามารถใช้เมธอดเหล่านี้: GeometryShape::setGeometryPath สำหรับ solid shapes และ GeometryShape::setGeometryPaths สำหรับ composite shapes.
  • เพื่อเพิ่มเซกเมนต์ คุณสามารถใช้เมธอดภายใต้GeometryPath.
  • ด้วยเมธอดGeometryPath::setStroke และ GeometryPath::setFillMode คุณสามารถตั้งค่าการแสดงผลของเส้นทางเรขาคณิตได้
  • ด้วยเมธอดGeometryPath::getPathData คุณสามารถดึงข้อมูลเส้นทางของGeometryShapeเป็นอาร์เรย์ของเซกเมนต์เส้นทาง
  • เพื่อเข้าถึงตัวเลือกการปรับแต่งเรขาคณิตของรูปร่างเพิ่มเติม คุณสามารถแปลงGeometryPathเป็นjava.awt.Shape
  • ใช้เมธอดgeometryPathToGraphicsPath และgraphicsPathToGeometryPath (จากคลาสShapeUtil) เพื่อแปลงGeometryPathเป็นjava.awt.Shape ไปกลับ

การดำเนินการแก้ไขอย่างง่าย

โค้ด PHP นี้แสดงวิธี

เพิ่มเส้น to the end of a path


เพิ่มเส้น to a specified position on a path:


เพิ่มเส้นโค้งคิวบิกเบเซียร์ at the end of a path:


เพิ่มเส้นโค้งคิวบิกเบเซียร์ to the specified position on a path:


เพิ่มเส้นโค้งควอดราติกเบเซียร์ at the end of a path:


เพิ่มเส้นโค้งควอดราติกเบเซียร์ to a specified position on a path:


ต่อส่วนโค้งที่กำหนด to a path:


ปิดรูปทรงปัจจุบัน of a path:


ตั้งค่าตำแหน่งสำหรับจุดถัดไป:


ลบส่วนของเส้นทาง at a given index:


เพิ่มจุดกำหนดเองให้กับรูปร่าง

  1. สร้างอินสแตนซ์ของคลาสGeometryShapeและตั้งค่าประเภทShapeType::Rectangle.
  2. ดึงอินสแตนซ์ของคลาสGeometryPathจากรูปร่าง
  3. เพิ่มจุดใหม่ระหว่างสองจุดบนสุดของเส้นทาง
  4. เพิ่มจุดใหม่ระหว่างสองจุดล่างของเส้นทาง
  5. นำเส้นทางไปใช้กับรูปร่าง

โค้ด PHP นี้แสดงวิธีเพิ่มจุดกำหนดเองให้กับรูปร่าง:

  $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

ลบจุดจากรูปร่าง

  1. สร้างอินสแตนซ์ของคลาสGeometryShapeและตั้งค่าประเภทShapeType::Heart.
  2. ดึงอินสแตนซ์ของคลาสGeometryPathจากรูปร่าง
  3. ลบเซกเมนต์ของเส้นทาง
  4. นำเส้นทางไปใช้กับรูปร่าง

โค้ด PHP นี้แสดงวิธีลบจุดจากรูปร่าง:

  $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

สร้างรูปร่างกำหนดเอง

  1. คำนวณจุดสำหรับรูปร่าง
  2. สร้างอินสแตนซ์ของคลาสGeometryPath
  3. เติมเส้นทางด้วยจุดต่างๆ
  4. สร้างอินสแตนซ์ของคลาสGeometryShape
  5. นำเส้นทางไปใช้กับรูปร่าง

โค้ด Java นี้แสดงวิธีสร้างรูปร่างกำหนดเอง:

  $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

สร้างรูปร่างผสมกำหนดเอง

  1. สร้างอินสแตนซ์ของคลาสGeometryShape
  2. สร้างอินสแตนซ์แรกของคลาสGeometryPath
  3. สร้างอินสแตนซ์ที่สองของคลาสGeometryPath
  4. นำเส้นทางไปใช้กับรูปร่าง

โค้ด PHP นี้แสดงวิธีสร้างรูปร่างผสมกำหนดเอง:

  $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

สร้างรูปร่างกำหนดเองที่มีมุมโค้ง

โค้ด PHP นี้แสดงวิธีสร้างรูปร่างกำหนดเองที่มีมุมโค้ง (ด้านใน):

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

ตรวจสอบว่ารูปร่างเรขาคณิตเป็นแบบปิดหรือไม่

รูปร่างแบบปิดหมายถึงรูปร่างที่ทุกด้านเชื่อมต่อกันเป็นเส้นรอบเดียวโดยไม่มีช่องว่าง รูปร่างนี้อาจเป็นรูปทรงเรขาคณิตง่ายหรือรูปร่างกำหนดเองที่ซับซ้อน ตัวอย่างโค้ดต่อไปนี้แสดงวิธีตรวจสอบว่ารูปร่างเรขาคณิตเป็นแบบปิดหรือไม่:

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 เป็น java.awt.Shape

  1. สร้างอินสแตนซ์ของคลาสGeometryShape
  2. สร้างอินสแตนซ์ของคลาสjava.awt.Shape
  3. แปลงอินสแตนซ์java.awt.Shapeเป็นอินสแตนซ์GeometryPathโดยใช้ShapeUtil
  4. นำเส้นทางไปใช้กับรูปร่าง

โค้ด PHP นี้—เป็นการนำขั้นตอนข้างต้นมาปฏิบัติ—แสดงกระบวนการแปลง GeometryPath ไปเป็น GraphicsPath:

  $pres = new Presentation();
  try {
    # สร้างรูปร่างใหม่
    $shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 100);
    # ดึงเส้นทางเรขาคณิตของรูปร่าง
    $originalPath = $shape->getGeometryPaths()[0];
    $originalPath->setFillMode(PathFillModeType::None);
    # สร้าง graphics path ใหม่ด้วยข้อความ
    $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();
    }
    # แปลง graphics path เป็น geometry path
    $textPath = ShapeUtil->graphicsPathToGeometryPath($graphicsPath);
    $textPath->setFillMode(PathFillModeType::Normal);
    # ตั้งค่าการรวมกันของ geometry path ใหม่และ geometry path ต้นฉบับให้กับรูปร่าง
    $shape->setGeometryPaths(array($originalPath, $textPath ));
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

example5_image

FAQ

อะไรจะเกิดขึ้นกับสีเติมและเส้นขอบหลังจากเปลี่ยนเรขาคณิต?

สไตล์จะคงอยู่กับรูปร่าง; เพียงแค่พิมรษะเปลี่ยนไป สีเติมและเส้นขอบจะถูกนำไปใช้กับเรขาคณิตใหม่โดยอัตโนมัติ

ฉันจะหมุนรูปร่างกำหนดเองพร้อมกับเรขาคณิตได้อย่างถูกต้องอย่างไร?

ใช้เมธอดshape::setRotationของรูปร่าง; เรขาคณิตจะหมุนตามรูปร่างเนื่องจากถูกผูกไว้กับระบบพิกัดของรูปร่างเอง

ฉันสามารถแปลงรูปร่างกำหนดเองเป็นภาพเพื่อ “ล็อค” ผลลัพธ์ได้หรือไม่?

ได้. สามารถส่งออกslide หรือshape ที่ต้องการเป็นรูปแบบเรสเตอร์; วิธีนี้ทำให้การทำงานต่อกับเรขาคณิตที่ซับซ้อนเป็นเรื่องง่ายกว่า