C++ を使用して PowerPoint プレゼンテーションの SmartArt を管理する
概要
SmartArt は、ノード、ノードシェイプ、レイアウトで構成された PowerPoint の図です。Aspose.Slides for C++ を使用すると、SmartArt の作成、ノードからのテキストの取得、レイアウトの変更、非表示ノードの検査、組織図レイアウトの構成、画像組織図の作成ができます。
SmartArt オブジェクトからテキストを取得する
SmartArt のノードには 1 つ以上のシェイプを含めることができます。ノードシェイプからテキストを取得するには、ISmartArt::get_AllNodes を反復処理し、ISmartArtShape::get_TextFrame が返す ITextFrame を読み取ります。
この例では、少なくとも 1 枚のスライドが含まれ、該当スライドの最初のシェイプとして SmartArt オブジェクトが配置されたプレゼンテーションが必要です。利用可能な各テキストフレームをコンソールに出力します。
#include <DOM/ISlide.h>
#include <DOM/ITextFrame.h>
#include <DOM/Presentation.h>
#include <DOM/SmartArt/ISmartArt.h>
#include <DOM/SmartArt/ISmartArtNode.h>
#include <DOM/SmartArt/ISmartArtNodeCollection.h>
#include <DOM/SmartArt/ISmartArtShape.h>
#include <DOM/SmartArt/ISmartArtShapeCollection.h>
#include <system/console.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::SmartArt;
using namespace System;
auto presentation = MakeObject<Presentation>(u"sample.pptx");
auto slide = presentation->get_Slide(0);
auto smartArt = ExplicitCast<ISmartArt>(slide->get_Shape(0));
for (auto nodeIndex = 0; nodeIndex < smartArt->get_AllNodes()->get_Count(); nodeIndex++)
{
auto node = smartArt->get_AllNodes()->idx_get(nodeIndex);
for (auto shapeIndex = 0; shapeIndex < node->get_Shapes()->get_Count(); shapeIndex++)
{
auto nodeShape = node->get_Shape(shapeIndex);
if (nodeShape->get_TextFrame() != nullptr)
{
Console::WriteLine(nodeShape->get_TextFrame()->get_Text());
}
}
}
presentation->Dispose();
SmartArt オブジェクトのレイアウトタイプを変更する
SmartArt のレイアウトは、ノードの配置と接続方法を制御します。以下の例では、SmartArtLayoutType の BasicBlockList 値で SmartArt オブジェクトを作成し、BasicProcess 値に変更してプレゼンテーションを保存します。IShapeCollection::AddSmartArt に渡す位置とサイズはポイント単位です。レイアウトを変更するには ISmartArt::set_Layout を使用します。
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/SmartArt/ISmartArt.h>
#include <DOM/SmartArt/SmartArtLayoutType.h>
#include <Export/SaveFormat.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace Aspose::Slides::SmartArt;
using namespace System;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto smartArt = slide->get_Shapes()->AddSmartArt(10.0f, 10.0f, 400.0f, 300.0f, SmartArtLayoutType::BasicBlockList);
smartArt->set_Layout(SmartArtLayoutType::BasicProcess);
presentation->Save(u"ChangeSmartArtLayout.pptx", SaveFormat::Pptx);
presentation->Dispose();
SmartArt ノードが非表示かどうかを確認する
ISmartArtNode::get_IsHidden は、ノードが SmartArt データモデルで非表示かどうかを示します。選択されたレイアウトで可視の図要素として表示されなくても、非表示ノードは構造内に存在する可能性があります。
以下の例では、SmartArtLayoutType の RadialCycle 値を使用する SmartArt オブジェクトにノードを追加し、追加したノードの非表示状態を確認します。ノードが非表示の場合はメッセージを出力し、図を保存します。
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/SmartArt/ISmartArt.h>
#include <DOM/SmartArt/ISmartArtNode.h>
#include <DOM/SmartArt/ISmartArtNodeCollection.h>
#include <DOM/SmartArt/SmartArtLayoutType.h>
#include <Export/SaveFormat.h>
#include <system/console.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace Aspose::Slides::SmartArt;
using namespace System;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto smartArt = slide->get_Shapes()->AddSmartArt(10.0f, 10.0f, 400.0f, 300.0f, SmartArtLayoutType::RadialCycle);
auto node = smartArt->get_AllNodes()->AddNode();
auto isHidden = node->get_IsHidden();
if (isHidden)
{
Console::WriteLine(u"The node is hidden in the SmartArt data model.");
}
presentation->Save(u"CheckSmartArtHiddenProperty.pptx", SaveFormat::Pptx);
presentation->Dispose();
組織図レイアウトの取得または設定
組織図レイアウトを使用する SmartArt 図の場合、ISmartArtNode::get_OrganizationChartLayout と ISmartArtNode::set_OrganizationChartLayout は、親ノードの下で子ノードがどのように配置されるかを定義します。たとえば、選択された OrganizationChartLayoutType に応じて、子ノードを左側、右側、または両側に吊り下げるように設定できます。
以下の例では、組織図を作成し、最初のノードのレイアウトを OrganizationChartLayoutType の LeftHanging 値に設定します。0 ベースのインデックス 0 が最上位ノードを選択し、子ノードは選択された配置を使用します。変更されたプレゼンテーションは保存されます。
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/SmartArt/ISmartArt.h>
#include <DOM/SmartArt/ISmartArtNode.h>
#include <DOM/SmartArt/OrganizationChartLayoutType.h>
#include <DOM/SmartArt/SmartArtLayoutType.h>
#include <Export/SaveFormat.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace Aspose::Slides::SmartArt;
using namespace System;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto smartArt = slide->get_Shapes()->AddSmartArt(10.0f, 10.0f, 400.0f, 300.0f, SmartArtLayoutType::OrganizationChart);
auto rootNode = smartArt->get_Node(0);
rootNode->set_OrganizationChartLayout(OrganizationChartLayoutType::LeftHanging);
presentation->Save(u"OrganizationChartLayout.pptx", SaveFormat::Pptx);
presentation->Dispose();
画像組織図の作成
画像組織図は、画像プレースホルダーを含む階層図用に設計された SmartArt レイアウトです。スライドに SmartArt オブジェクトを追加する際に、SmartArtLayoutType の PictureOrganizationChart 値を使用します。この例では画像プレースホルダー付きの図を保存しますが、プレースホルダーに画像は設定しません。
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/Presentation.h>
#include <DOM/SmartArt/SmartArtLayoutType.h>
#include <Export/SaveFormat.h>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace Aspose::Slides::SmartArt;
using namespace System;
auto presentation = MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto smartArt = slide->get_Shapes()->AddSmartArt(0.0f, 0.0f, 400.0f, 400.0f, SmartArtLayoutType::PictureOrganizationChart);
presentation->Save(u"PictureOrganizationChart.pptx", SaveFormat::Pptx);
presentation->Dispose();
レガシー図をシェイプのグループに変換する
既存のプレゼンテーションを最新化する際、PowerPoint 97–2003 で作成された組織図を更新する必要がある場合があります。Aspose.Slides はこれらのレガシー図を ILegacyDiagram オブジェクトとして表します。ILegacyDiagram::ConvertToGroupShape を使用して図をシェイプのグループに変換すれば、個々のビジュアル要素を編集できます。詳細は LegacyDiagram API Reference を参照してください。
変換により、元の図を削除せずにシェイプコレクションに新しいグループが追加されます。変換が成功したら、重複コンテンツを防ぐために IShapeCollection::Remove で元の図を削除します。シェイプの追加・削除で反復が乱れないよう、変換前にレガシー図をベクターに収集しておきます。
以下の例では、プレゼンテーションを開き、すべてのスライドを検索して図をシェイプのグループに変換し、更新されたプレゼンテーションを PPTX として保存します。
#include <DOM/ILegacyDiagram.h>
#include <DOM/IGroupShape.h>
#include <DOM/IShapeCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ISlideCollection.h>
#include <DOM/Presentation.h>
#include <Export/SaveFormat.h>
#include <vector>
using namespace Aspose::Slides;
using namespace Aspose::Slides::Export;
using namespace System;
auto presentation = MakeObject<Presentation>(u"legacy-diagrams.ppt");
for (auto slideIndex = 0; slideIndex < presentation->get_Slides()->get_Count(); slideIndex++)
{
auto slide = presentation->get_Slide(slideIndex);
std::vector<SharedPtr<ILegacyDiagram>> legacyDiagrams;
for (auto shapeIndex = 0; shapeIndex < slide->get_Shapes()->get_Count(); shapeIndex++)
{
auto shape = slide->get_Shape(shapeIndex);
if (ObjectExt::Is<ILegacyDiagram>(shape))
{
auto legacyDiagram = ExplicitCast<ILegacyDiagram>(shape);
legacyDiagrams.push_back(legacyDiagram);
}
}
for (auto legacyDiagram : legacyDiagrams)
{
auto groupShape = legacyDiagram->ConvertToGroupShape();
if (groupShape != nullptr)
{
slide->get_Shapes()->Remove(legacyDiagram);
}
}
}
presentation->Save(u"modernized.pptx", SaveFormat::Pptx);
presentation->Dispose();
保存されたプレゼンテーションには、変換されたレガシー図の代わりに編集可能なシェイプのグループが含まれ、元の図は残っていません。PowerPoint で PPTX を開くと、各グループ内のテキスト、塗り、位置など個々の要素を編集できます。
よくある質問
SmartArt は RTL 言語向けのミラーリングまたは反転をサポートしていますか?
はい。選択された SmartArt レイアウトが反転をサポートしている場合、SmartArt::set_IsReversed メソッドは図の方向を左から右へ、または右から左へ切り替えます。
SmartArt を同じスライドまたは別のプレゼンテーションにコピーして書式を保持するにはどうすればよいですか?
SmartArt が含まれるシェイプを ShapeCollection::AddClone を使用して SmartArt シェイプをクローン するか、SmartArt を含むスライド全体をクローン できます。どちらの方法もサイズ、位置、書式を保持します。
プレビューやウェブ出力のために SmartArt をラスタ画像としてレンダリングするにはどうすればよいですか?
スライドをレンダリング するか、プレゼンテーション全体を PNG または JPEG に変換してください。SmartArt はスライドの一部としてレンダリングされます。
スライドに複数の SmartArt がある場合、特定の SmartArt オブジェクトを見つけるにはどうすればよいですか?
SmartArt シェイプに固有の Shape::set_AlternativeText または Shape::set_Name 値を設定し、BaseSlide::get_Shapes でその値を検索し、該当シェイプが ISmartArt であることを確認します。