Sesuaikan Bentuk Presentasi di C++
Gambaran Umum
Artikel ini menjelaskan cara menyesuaikan bentuk presentasi di Aspose.Slides dengan mengedit geometri bentuk melalui titik edit dan jalur geometris. Artikel ini memperlihatkan cara bekerja dengan GeometryPath dan IGeometryPath untuk memodifikasi bentuk yang ada, melakukan operasi penyuntingan jalur dasar, menambah atau menghapus titik, dan menerapkan geometri yang diperbarui kembali ke sebuah bentuk.
Ubah Bentuk Menggunakan Titik Edit
Pertimbangkan sebuah persegi. Di PowerPoint, menggunakan titik edit, Anda dapat
- memindahkan sudut persegi ke dalam atau ke luar
- menentukan kelengkungan untuk sebuah sudut atau titik
- menambahkan titik baru ke persegi
- memanipulasi titik pada persegi, dll.
Intinya, Anda dapat melakukan tugas yang dijelaskan pada bentuk apa pun. Dengan titik edit, Anda dapat mengubah bentuk atau membuat bentuk baru dari bentuk yang ada.
Tips Penyuntingan Bentuk

Sebelum Anda mulai mengedit bentuk PowerPoint melalui titik edit, Anda mungkin ingin mempertimbangkan poin-poin berikut tentang bentuk:
- Sebuah bentuk (atau jalurnya) dapat berupa tertutup atau terbuka.
- Ketika sebuah bentuk tertutup, ia tidak memiliki titik awal atau akhir. Ketika sebuah bentuk terbuka, ia memiliki awal dan akhir.
- Semua bentuk terdiri dari setidaknya 2 titik jangkar yang terhubung satu sama lain oleh garis
- Sebuah garis dapat lurus atau melengkung. Titik jangkar menentukan sifat garis.
- Titik jangkar ada sebagai titik sudut, titik lurus, atau titik halus:
- Titik sudut adalah titik di mana 2 garis lurus bertemu pada sebuah sudut.
- Titik halus adalah titik di mana 2 pegangan berada pada satu garis lurus dan segmen garis bergabung dalam kurva halus. Dalam hal ini, semua pegangan dipisahkan dari titik jangkar dengan jarak yang sama.
- Titik lurus adalah titik di mana 2 pegangan berada pada satu garis lurus dan segmen garis tersebut bergabung dalam kurva halus. Dalam hal ini, pegangan tidak harus dipisahkan dari titik jangkar dengan jarak yang sama.
- Dengan memindahkan atau menyunting titik jangkar (yang mengubah sudut garis), Anda dapat mengubah tampilan sebuah bentuk.
Untuk mengedit bentuk PowerPoint melalui titik edit, Aspose.Slides menyediakan kelas GeometryPath dan antarmuka IGeometryPath.
- Sebuah instance GeometryPath mewakili jalur geometri dari objek IGeometryShape.
- Untuk mengambil
GeometryPathdari instanceIGeometryShape, Anda dapat menggunakan metode IGeometryShape::GetGeometryPaths. - Untuk mengatur
GeometryPathuntuk sebuah bentuk, Anda dapat menggunakan metode ini: IGeometryShape::SetGeometryPath() untuk bentuk solid dan IGeometryShape::SetGeometryPaths() untuk bentuk komposit. - Untuk menambahkan segmen, Anda dapat menggunakan metode di bawah IGeometryPath.
- Dengan menggunakan metode IGeometryPath::set_Stroke() dan IGeometryPath::set_FillMode(), Anda dapat mengatur tampilan untuk jalur geometri.
- Dengan menggunakan metode IGeometryPath::get_PathData(), Anda dapat mengambil jalur geometri dari
GeometryShapesebagai array segmen jalur. - Untuk mengakses opsi kustomisasi geometri bentuk tambahan, Anda dapat mengonversi GeometryPath menjadi GraphicsPath
- Gunakan metode GeometryPathToGraphicsPath dan GraphicsPathToGeometryPath (dari kelas ShapeUtil) untuk mengonversi GeometryPath ke GraphicsPath bolak-balik.
Operasi Penyuntingan Sederhana
Kode C++ ini menunjukkan cara Anda
Tambahkan garis ke akhir jalur
void LineTo(PointF point);
void LineTo(float x, float y);
Tambahkan garis ke posisi yang ditentukan pada jalur:
void LineTo(PointF point, uint32_t index);
void LineTo(float x, float y, uint32_t index);
Tambahkan kurva Bezier kubik ke akhir jalur:
void CubicBezierTo(PointF point1, PointF point2, PointF point3);
void CubicBezierTo(float x1, float y1, float x2, float y2, float x3, float y3);
Tambahkan kurva Bezier kubik ke posisi yang ditentukan pada jalur:
void CubicBezierTo(PointF point1, PointF point2, PointF point3, uint32_t index);
void CubicBezierTo(float x1, float y1, float x2, float y2, float x3, float y3, uint32_t index);
Tambahkan kurva Bezier kuadratik ke akhir jalur:
void QuadraticBezierTo(PointF point1, PointF point2);
void QuadraticBezierTo(float x1, float y1, float x2, float y2);
Tambahkan kurva Bezier kuadratik ke posisi yang ditentukan pada jalur:
void QuadraticBezierTo(PointF point1, PointF point2, uint32_t index);
void QuadraticBezierTo(float x1, float y1, float x2, float y2, uint32_t index);
Tambahkan lengkungan tertentu ke jalur:
void ArcTo(float width, float heigth, float startAngle, float sweepAngle);
Tutup gambar saat ini dari jalur:
void CloseFigure();
Atur posisi untuk titik berikutnya:
void MoveTo(PointF point);
void MoveTo(float x, float y);
Hapus segmen jalur pada indeks tertentu:
void RemoveAt(int32_t index);
Tambahkan Titik Kustom ke Bentuk
- Buat instance kelas GeometryShape dan atur tipe ShapeType.Rectangle.
- Dapatkan instance kelas GeometryPath dari bentuk.
- Tambahkan titik baru di antara dua titik atas pada jalur.
- Tambahkan titik baru di antara dua titik bawah pada jalur.
- Terapkan jalur ke bentuk.
Kode C++ ini menunjukkan cara menambahkan titik kustom ke sebuah bentuk:
SharedPtr<Presentation> pres = System::MakeObject<Presentation>();
SharedPtr<IShapeCollection> shapes = pres->get_Slides()->idx_get(0)->get_Shapes();
SharedPtr<GeometryShape> shape = System::ExplicitCast<GeometryShape>(shapes->AddAutoShape(ShapeType::Rectangle, 100.0f, 100.0f, 200.0f, 100.0f));
SharedPtr<IGeometryPath> geometryPath = shape->GetGeometryPaths()->idx_get(0);
geometryPath->LineTo(100.0f, 50.0f, 1);
geometryPath->LineTo(100.0f, 50.0f, 4);
shape->SetGeometryPath(geometryPath);

Hapus Titik dari Bentuk
- Buat instance kelas GeometryShape dan atur tipe ShapeType.Heart.
- Dapatkan instance kelas GeometryPath dari bentuk.
- Hapus segmen untuk jalur.
- Terapkan jalur ke bentuk.
Kode C++ ini menunjukkan cara menghapus titik dari sebuah bentuk:
SharedPtr<Presentation> pres = System::MakeObject<Presentation>();
SharedPtr<IShapeCollection> shapes = pres->get_Slides()->idx_get(0)->get_Shapes();
SharedPtr<GeometryShape> shape = System::ExplicitCast<GeometryShape>(shapes->AddAutoShape(ShapeType::Heart, 100.0f, 100.0f, 300.0f, 300.0f));
SharedPtr<IGeometryPath> path = shape->GetGeometryPaths()->idx_get(0);
path->RemoveAt(2);
shape->SetGeometryPath(path);

Buat Bentuk Kustom
- Hitung titik-titik untuk bentuk.
- Buat instance kelas GeometryPath.
- Isi jalur dengan titik-titik.
- Buat instance kelas GeometryShape.
- Terapkan jalur ke bentuk.
Kode C++ ini menunjukkan cara membuat bentuk kustom:
SharedPtr<List<PointF>> points = System::MakeObject<List<PointF>>();
float R = 100.0f, r = 50.0f;
int32_t step = 72;
for (int32_t angle = -90; angle < 270; angle += step)
{
double radians = angle * (Math::PI / 180.f);
double x = outerRadius * Math::Cos(radians);
double y = outerRadius * Math::Sin(radians);
points->Add(PointF((float)x + outerRadius, (float)y + outerRadius));
radians = Math::PI * (angle + step / 2) / 180.0;
x = innerRadiusr * Math::Cos(radians);
y = innerRadiusr * Math::Sin(radians);
points->Add(PointF((float)x + outerRadius, (float)y + outerRadius));
}
SharedPtr<GeometryPath> starPath = System::MakeObject<GeometryPath>();
starPath->MoveTo(points->idx_get(0));
for (int32_t i = 1; i < points->get_Count(); i++)
{
starPath->LineTo(points->idx_get(i));
}
starPath->CloseFigure();
SharedPtr<Presentation> pres = System::MakeObject<Presentation>();
SharedPtr<IShapeCollection> shapes = pres->get_Slides()->idx_get(0)->get_Shapes();
SharedPtr<GeometryShape> shape = System::ExplicitCast<GeometryShape>(shapes->AddAutoShape(ShapeType::Rectangle, 100.0f, 100.0f, R * 2, R * 2));
shape->SetGeometryPath(starPath);

Buat Bentuk Kustom Komposit
- Buat instance kelas GeometryShape.
- Buat instance pertama kelas GeometryPath.
- Buat instance kedua kelas GeometryPath.
- Terapkan jalur ke bentuk.
Kode C++ ini menunjukkan cara membuat bentuk kustom komposit:
SharedPtr<Presentation> pres = System::MakeObject<Presentation>();
SharedPtr<IShapeCollection> shapes = pres->get_Slides()->idx_get(0)->get_Shapes();
SharedPtr<GeometryShape> shape = System::ExplicitCast<GeometryShape>(shapes->AddAutoShape(ShapeType::Rectangle, 100.0f, 100.0f, 200.0f, 100.0f));
SharedPtr<IGeometryPath> geometryPath0 = System::MakeObject<GeometryPath>();
geometryPath0->MoveTo(0.0f, 0.0f);
geometryPath0->LineTo(shape->get_Width(), 0.0f);
geometryPath0->LineTo(shape->get_Width(), shape->get_Height() / 3);
geometryPath0->LineTo(0.0f, shape->get_Height() / 3);
geometryPath0->CloseFigure();
SharedPtr<IGeometryPath> geometryPath1 = System::MakeObject<GeometryPath>();
geometryPath1->MoveTo(0.0f, shape->get_Height() / 3 * 2);
geometryPath1->LineTo(shape->get_Width(), shape->get_Height() / 3 * 2);
geometryPath1->LineTo(shape->get_Width(), shape->get_Height());
geometryPath1->LineTo(0.0f, shape->get_Height());
geometryPath1->CloseFigure();
shape->SetGeometryPaths(System::MakeArray<SharedPtr<IGeometryPath>>({ geometryPath0, geometryPath1 }));

Buat Bentuk Kustom dengan Sudut Melengkung
Kode C++ ini menunjukkan cara membuat bentuk kustom dengan sudut melengkung (ke dalam);
float shapeX = 20.f;
float shapeY = 20.f;
float shapeWidth = 300.f;
float shapeHeight = 200.f;
float leftTopSize = 50.f;
float rightTopSize = 20.f;
float rightBottomSize = 40.f;
float leftBottomSize = 10.f;
auto presentation = System::MakeObject<Presentation>();
auto childShape = presentation->get_Slides()->idx_get(0)->get_Shapes()->AddAutoShape(ShapeType::Custom, shapeX, shapeY, shapeWidth, shapeHeight);
auto geometryPath = System::MakeObject<GeometryPath>();
PointF point1(leftTopSize, 0.0f);
PointF point2(shapeWidth - rightTopSize, 0.0f);
PointF point3(shapeWidth, shapeHeight - rightBottomSize);
PointF point4(leftBottomSize, shapeHeight);
PointF point5(0.0f, leftTopSize);
geometryPath->MoveTo(point1);
geometryPath->LineTo(point2);
geometryPath->ArcTo(rightTopSize, rightTopSize, 180.0f, -90.0f);
geometryPath->LineTo(point3);
geometryPath->ArcTo(rightBottomSize, rightBottomSize, -90.0f, -90.0f);
geometryPath->LineTo(point4);
geometryPath->ArcTo(leftBottomSize, leftBottomSize, 0.0f, -90.0f);
geometryPath->LineTo(point5);
geometryPath->ArcTo(leftTopSize, leftTopSize, 90.0f, -90.0f);
geometryPath->CloseFigure();
childShape->SetGeometryPath(geometryPath);
presentation->Save(u"output.pptx", SaveFormat::Pptx);
Temukan Apakah Geometri Bentuk Tertutup
Sebuah bentuk tertutup didefinisikan sebagai bentuk di mana semua sisinya terhubung, membentuk batas tunggal tanpa celah. Bentuk semacam itu dapat berupa bentuk geometris sederhana atau outline kustom yang kompleks. Contoh kode berikut menunjukkan cara memeriksa apakah geometri bentuk tertutup:
bool IsGeometryClosed(SharedPtr<IGeometryShape> geometryShape)
{
bool isClosed = false;
for (auto&& geometryPath : geometryShape->GetGeometryPaths())
{
auto dataLength = geometryPath->get_PathData()->get_Length();
if (dataLength == 0)
continue;
auto lastSegment = geometryPath->get_PathData()[dataLength - 1];
isClosed = lastSegment->get_PathCommand() == PathCommandType::Close;
if (!isClosed)
return false;
}
return isClosed;
}
Konversi GeometryPath ke GraphicsPath
- Buat instance kelas GeometryShape.
- Buat instance kelas GraphicsPath dari namespace System.Drawing.Drawing2D.
- Konversi instance GraphicsPath ke instance GeometryPath menggunakan ShapeUtil.
- Terapkan jalur ke bentuk.
Kode C++—implementasi langkah-langkah di atas—menunjukkan proses konversi GeometryPath ke GraphicsPath:
SharedPtr<Presentation> pres = System::MakeObject<Presentation>();
SharedPtr<IShapeCollection> shapes = pres->get_Slides()->idx_get(0)->get_Shapes();
SharedPtr<GeometryShape> shape = System::ExplicitCast<GeometryShape>(shapes->AddAutoShape(ShapeType::Rectangle, 100.0f, 100.0f, 300.0f, 100.0f));
SharedPtr<IGeometryPath> originalPath = shape->GetGeometryPaths()->idx_get(0);
originalPath->set_FillMode(PathFillModeType::None);
SharedPtr<Drawing2D::GraphicsPath> graphicsPath = System::MakeObject<Drawing2D::GraphicsPath>();
graphicsPath->AddString(u"Text in shape", System::MakeObject<FontFamily>(u"Arial"), 1, 40.0f, PointF(10.0f, 10.0f), StringFormat::get_GenericDefault());
SharedPtr<IGeometryPath> textPath = ShapeUtil::GraphicsPathToGeometryPath(graphicsPath);
textPath->set_FillMode(PathFillModeType::Normal);
shape->SetGeometryPaths(System::MakeArray<SharedPtr<IGeometryPath>>({ originalPath, textPath }));

FAQ
Apa yang akan terjadi pada isi dan garis tepi setelah mengganti geometri?
Gaya tetap melekat pada bentuk; hanya kontur yang berubah. Isi dan garis tepi secara otomatis diterapkan pada geometri baru.
Bagaimana cara memutar bentuk kustom dengan benar bersama geometri nya?
Gunakan properti rotation pada bentuk; geometri akan berputar bersama bentuk karena terikat pada sistem koordinat bentuk itu sendiri.
Apakah saya dapat mengonversi bentuk kustom menjadi gambar untuk “mengunci” hasilnya?
Ya. Ekspor area slide yang diperlukan atau bentuk itu sendiri ke format raster; ini mempermudah pekerjaan selanjutnya dengan geometri yang kompleks.