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

overview_image

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.

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

  1. Buat instance kelas GeometryShape dan atur tipe ShapeType.Rectangle.
  2. Dapatkan instance kelas GeometryPath dari bentuk.
  3. Tambahkan titik baru di antara dua titik atas pada jalur.
  4. Tambahkan titik baru di antara dua titik bawah pada jalur.
  5. 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);

example1_image

Hapus Titik dari Bentuk

  1. Buat instance kelas GeometryShape dan atur tipe ShapeType.Heart.
  2. Dapatkan instance kelas GeometryPath dari bentuk.
  3. Hapus segmen untuk jalur.
  4. 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);

example2_image

Buat Bentuk Kustom

  1. Hitung titik-titik untuk bentuk.
  2. Buat instance kelas GeometryPath.
  3. Isi jalur dengan titik-titik.
  4. Buat instance kelas GeometryShape.
  5. 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);

example3_image

Buat Bentuk Kustom Komposit

  1. Buat instance kelas GeometryShape.
  2. Buat instance pertama kelas GeometryPath.
  3. Buat instance kedua kelas GeometryPath.
  4. 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 }));

example4_image

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

  1. Buat instance kelas GeometryShape.
  2. Buat instance kelas GraphicsPath dari namespace System.Drawing.Drawing2D.
  3. Konversi instance GraphicsPath ke instance GeometryPath menggunakan ShapeUtil.
  4. 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 }));

example5_image

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.