Gérer SmartArt dans les présentations PowerPoint avec C++

Vue d’ensemble

SmartArt est un diagramme PowerPoint composé de nœuds, de formes de nœuds et d’une disposition. Avec Aspose.Slides pour C++, vous pouvez créer des SmartArt, lire le texte de leurs nœuds, modifier leur disposition, inspecter les nœuds masqués, configurer les dispositions de graphiques d’organisation et créer des graphiques d’organisation illustrés.

Obtenir le texte d’un objet SmartArt

Un nœud SmartArt peut contenir une ou plusieurs formes. Pour lire le texte des formes du nœud, parcourez ISmartArt::get_AllNodes, puis lisez le ITextFrame renvoyé par ISmartArtShape::get_TextFrame.

L’exemple nécessite une présentation contenant au moins une diapositive et un objet SmartArt comme première forme de cette diapositive. Il affiche chaque trame de texte disponible dans la console.

#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();

Modifier le type de disposition d’un objet SmartArt

La disposition SmartArt détermine comment les nœuds sont organisés et reliés. L’exemple suivant crée un objet SmartArt avec la valeur BasicBlockList de SmartArtLayoutType , la change en valeur BasicProcess, puis enregistre la présentation. La position et la taille passées à IShapeCollection::AddSmartArt sont exprimées en points. Utilisez ISmartArt::set_Layout pour modifier la disposition.

#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();

Vérifier si un nœud SmartArt est masqué

ISmartArtNode::get_IsHidden indique si le nœud est masqué dans le modèle de données SmartArt. Les nœuds masqués peuvent exister dans la structure même lorsque la disposition sélectionnée ne les affiche pas comme éléments visibles du diagramme.

L’exemple suivant ajoute un nœud à un objet SmartArt qui utilise la valeur RadialCycle de SmartArtLayoutType , puis vérifie l’état masqué du nœud ajouté. Il affiche un message si le nœud est masqué et enregistre le diagramme.

#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();

Obtenir ou définir la disposition du graphique d’organisation

Pour les diagrammes SmartArt qui utilisent une disposition de graphique d’organisation, ISmartArtNode::get_OrganizationChartLayout et ISmartArtNode::set_OrganizationChartLayout définissent comment les nœuds enfants sont disposés sous un nœud parent. Par exemple, vous pouvez faire pendre les nœuds enfants à gauche, à droite ou des deux côtés, selon le OrganizationChartLayoutType sélectionné.

L’exemple suivant crée un graphique d’organisation et définit la disposition du premier nœud sur la valeur LeftHanging de OrganizationChartLayoutType . L’index basé sur zéro 0 sélectionne le premier nœud de niveau supérieur ; ses nœuds enfants utilisent l’arrangement choisi. La présentation modifiée est ensuite enregistrée.

#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();

Créer un graphique d’organisation illustré

Un graphique d’organisation illustré est une disposition SmartArt conçue pour les diagrammes hiérarchiques incluant des espaces réservés d’image. Utilisez la valeur PictureOrganizationChart de SmartArtLayoutType lors de l’ajout de l’objet SmartArt à une diapositive. Cet exemple enregistre un diagramme avec des espaces réservés d’image ; il ne remplit pas les espaces réservés avec des images.

#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();

Convertir les diagrammes hérités en groupes de formes

Lors de la modernisation d’une présentation existante, il peut être nécessaire de mettre à jour un graphique d’organisation créé à l’origine dans PowerPoint 97–2003. Aspose.Slides représente ces diagrammes hérités comme des objets ILegacyDiagram . Utilisez ILegacyDiagram::ConvertToGroupShape pour convertir un diagramme en un groupe de formes afin de pouvoir modifier les éléments visuels individuels. Consultez la LegacyDiagram API Reference pour plus de détails.

La conversion ajoute un nouveau groupe à la collection de formes sans supprimer le diagramme original. Après une conversion réussie, supprimez l’original avec IShapeCollection::Remove pour éviter le contenu dupliqué. Regroupez les diagrammes hérités dans un vecteur avant de les convertir afin que l’ajout et la suppression de formes n’interrompent pas l’itération.

L’exemple suivant ouvre une présentation, parcourt chaque diapositive, convertit les diagrammes en groupes de formes et enregistre la présentation mise à jour au format 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();

La présentation enregistrée contient des groupes de formes modifiables à la place des diagrammes hérités convertis, sans aucun diagramme original restant à côté. Ouvrez le PPTX dans PowerPoint pour modifier les éléments individuels de chaque groupe, comme le texte, le remplissage ou la position.

FAQ

SmartArt prend‑il en charge le miroir ou l’inversion pour les langues RTL ?

Oui. La méthode SmartArt::set_IsReversed inverse la direction du diagramme de gauche à droite à droite à gauche, ou inversement, lorsque la disposition SmartArt sélectionnée prend en charge l’inversion.

Comment copier un SmartArt vers la même diapositive ou vers une autre présentation tout en conservant la mise en forme ?

Vous pouvez cloner la forme SmartArt avec ShapeCollection::AddClone ou cloner toute la diapositive qui contient le SmartArt. Les deux approches conservent la taille, la position et la mise en forme.

Comment rendre le SmartArt en image matricielle pour l’aperçu ou l’exportation web ?

Rendre la diapositive ou l’ensemble de la présentation en PNG ou JPEG. Le SmartArt est rendu comme partie de la diapositive.

Comment trouver un objet SmartArt spécifique sur une diapositive s’il y en a plusieurs ?

Attribuez une valeur distinctive à Shape::set_AlternativeText ou à Shape::set_Name sur la forme SmartArt, recherchez cette valeur dans BaseSlide::get_Shapes , puis vérifiez que la forme correspondante est un ISmartArt.