Administrar nodos de forma SmartArt en presentaciones en .NET

Agregar un nodo SmartArt

Aspose.Slides for .NET ha proporcionado la API más simple para administrar las formas SmartArt de la manera más fácil. El siguiente código de ejemplo ayuda a agregar un nodo y un nodo hijo dentro de una forma SmartArt.

  • Crear una instancia de Presentation y cargar la presentación con una forma SmartArt.
  • Obtener la referencia de la primera diapositiva mediante su índice.
  • Recorrer cada forma dentro de la primera diapositiva.
  • Verificar si la forma es de tipo SmartArt y convertir el tipo de la forma seleccionada a SmartArt si lo es.
  • Agregar un nuevo nodo a la colección NodeCollection de la forma SmartArt y establecer el texto en TextFrame.
  • Ahora, agregar un nodo hijo al nodo SmartArt recién agregado y establecer el texto en TextFrame.
  • Guardar la presentación.
// Cargar la presentación deseada
Presentation pres = new Presentation("AddNodes.pptx");

// Recorrer cada forma dentro de la primera diapositiva
foreach (IShape shape in pres.Slides[0].Shapes)
{

    // Verificar si la forma es del tipo SmartArt
    if (shape is Aspose.Slides.SmartArt.SmartArt)
    {

        // Convertir la forma a SmartArt
        Aspose.Slides.SmartArt.SmartArt smart = (Aspose.Slides.SmartArt.SmartArt)shape;

        // Agregar un nuevo nodo SmartArt
        Aspose.Slides.SmartArt.SmartArtNode TemNode = (Aspose.Slides.SmartArt.SmartArtNode)smart.AllNodes.AddNode();

        // Agregar texto
        TemNode.TextFrame.Text = "Test";

        // Agregar un nuevo nodo hijo en el nodo padre. Se añadirá al final de la colección
        Aspose.Slides.SmartArt.SmartArtNode newNode = (Aspose.Slides.SmartArt.SmartArtNode)TemNode.ChildNodes.AddNode();

        // Agregar texto
        newNode.TextFrame.Text = "New Node Added";

    }
}

// Guardar la presentación
pres.Save("AddSmartArtNode_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);

Agregar un nodo SmartArt en una posición específica

En el siguiente código de ejemplo explicamos cómo agregar los nodos hijos que pertenecen a los respectivos nodos de la forma SmartArt en una posición concreta.

  • Crear una instancia de la clase Presentation.
  • Obtener la referencia de la primera diapositiva mediante su índice.
  • Agregar una forma SmartArt de tipo StackedList en la diapositiva accedida.
  • Acceder al primer nodo de la forma SmartArt agregada.
  • Ahora, agregar el nodo hijo para el nodo seleccionado en la posición 2 y establecer su texto.
  • Guardar la presentación.
// Crear una instancia de presentación
Presentation pres = new Presentation();

// Acceder a la diapositiva de la presentación
ISlide slide = pres.Slides[0];

// Agregar IShape Smart Art
ISmartArt smart = slide.Shapes.AddSmartArt(0, 0, 400, 400, SmartArtLayoutType.StackedList);

// Acceder al nodo SmartArt en el índice 0
ISmartArtNode node = smart.AllNodes[0];

// Agregar un nuevo nodo hijo en la posición 2 del nodo padre
SmartArtNode chNode = (SmartArtNode)((SmartArtNodeCollection)node.ChildNodes).AddNodeByPosition(2);

// Agregar texto
chNode.TextFrame.Text = "Sample Text Added";

// Guardar presentación
pres.Save("AddSmartArtNodeByPosition_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);

Acceder a un nodo SmartArt

El siguiente código de ejemplo ayuda a acceder a los nodos dentro de una forma SmartArt. Tenga en cuenta que no puede cambiar el LayoutType del SmartArt, ya que es de solo lectura y se establece únicamente cuando se agrega la forma SmartArt.

  • Crear una instancia de la clase Presentation y cargar la presentación con una forma SmartArt.
  • Obtener la referencia de la primera diapositiva mediante su índice.
  • Recorrer cada forma dentro de la primera diapositiva.
  • Verificar si la forma es de tipo SmartArt y convertir la forma seleccionada a SmartArt si lo es.
  • Recorrer todos los nodos dentro de la forma SmartArt.
  • Acceder y mostrar información como la posición del nodo SmartArt, nivel y texto.
  // Cargar la presentación deseada
   Presentation pres = new Presentation("AccessSmartArt.pptx");
  
  // Recorrer cada forma dentro de la primera diapositiva
  foreach (IShape shape in pres.Slides[0].Shapes)
  {
      // Verificar si la forma es del tipo SmartArt
      if (shape is Aspose.Slides.SmartArt.SmartArt)
      {
  
          // Convertir la forma a SmartArt
          Aspose.Slides.SmartArt.SmartArt smart = (Aspose.Slides.SmartArt.SmartArt)shape;
  
          // Recorrer todos los nodos dentro de SmartArt
          for (int i = 0; i < smart.AllNodes.Count; i++)
          {
              // Acceder al nodo SmartArt en el índice i
              Aspose.Slides.SmartArt.SmartArtNode node = (Aspose.Slides.SmartArt.SmartArtNode)smart.AllNodes[i];
  
              // Imprimir los parámetros del nodo SmartArt
              string outString = string.Format("i = {0}, Text = {1},  Level = {2}, Position = {3}", i, node.TextFrame.Text, node.Level, node.Position);
              Console.WriteLine(outString);
          }
      }
  }

Acceder a un nodo hijo SmartArt

El siguiente código de ejemplo ayuda a acceder a los nodos hijos que pertenecen a los respectivos nodos de la forma SmartArt.

  • Crear una instancia de la clase PresentationEx y cargar la presentación con una forma SmartArt.
  • Obtener la referencia de la primera diapositiva mediante su índice.
  • Recorrer cada forma dentro de la primera diapositiva.
  • Verificar si la forma es de tipo SmartArt y convertir la forma seleccionada a SmartArtEx si lo es.
  • Recorrer todos los nodos dentro de la forma SmartArt.
  • Para cada nodo de forma SmartArt seleccionado, recorrer todos los nodos hijos dentro del nodo particular.
  • Acceder y mostrar información como la posición del nodo hijo, nivel y texto.
 // Cargar la presentación deseada
Presentation pres = new Presentation("AccessChildNodes.pptx");

// Recorrer cada forma dentro de la primera diapositiva
foreach (IShape shape in pres.Slides[0].Shapes)
{

    // Verificar si la forma es del tipo SmartArt
    if (shape is Aspose.Slides.SmartArt.SmartArt)
    {

        // Convertir la forma a SmartArt
        Aspose.Slides.SmartArt.SmartArt smart = (Aspose.Slides.SmartArt.SmartArt)shape;

        // Recorrer todos los nodos dentro de SmartArt
        for (int i = 0; i < smart.AllNodes.Count; i++)
        {
            // Acceder al nodo SmartArt en el índice i
            Aspose.Slides.SmartArt.SmartArtNode node0 = (Aspose.Slides.SmartArt.SmartArtNode)smart.AllNodes[i];

            // Recorrer los nodos hijos del nodo SmartArt en el índice i
            for (int j = 0; j < node0.ChildNodes.Count; j++)
            {
                // Acceder al nodo hijo en el nodo SmartArt
                Aspose.Slides.SmartArt.SmartArtNode node = (Aspose.Slides.SmartArt.SmartArtNode)node0.ChildNodes[j];

                // Imprimiendo los parámetros del nodo hijo SmartArt
                string outString = string.Format("j = {0}, Text = {1},  Level = {2}, Position = {3}", j, node.TextFrame.Text, node.Level, node.Position);
                Console.WriteLine(outString);
            }
        }
    }
}

Acceder a un nodo hijo SmartArt en una posición específica

En este ejemplo, aprenderemos a acceder a los nodos hijos en una posición determinada que pertenecen a los respectivos nodos de la forma SmartArt.

  • Crear una instancia de la clase Presentation.
  • Obtener la referencia de la primera diapositiva mediante su índice.
  • Agregar una forma SmartArt de tipo StackedList.
  • Acceder a la forma SmartArt agregada.
  • Acceder al nodo con índice 0 de la forma SmartArt accedida.
  • Ahora, acceder al nodo hijo en la posición 1 del nodo SmartArt accedido usando el método GetNodeByPosition().
  • Acceder y mostrar información como la posición del nodo hijo, nivel y texto.
// Instanciar la presentación
Presentation pres = new Presentation();

// Accediendo a la primera diapositiva
ISlide slide = pres.Slides[0];

// Agregando la forma SmartArt en la primera diapositiva
ISmartArt smart = slide.Shapes.AddSmartArt(0, 0, 400, 400, SmartArtLayoutType.StackedList);

// Accediendo al nodo SmartArt en el índice 0
ISmartArtNode node = smart.AllNodes[0];

// Accediendo al nodo hijo en la posición 1 del nodo padre
int position = 1;
SmartArtNode chNode = (SmartArtNode)node.ChildNodes[position]; 

// Imprimiendo los parámetros del nodo hijo SmartArt
string outString = string.Format("j = {0}, Text = {1},  Level = {2}, Position = {3}", position, chNode.TextFrame.Text, chNode.Level, chNode.Position);
Console.WriteLine(outString);

Eliminar un nodo SmartArt

En este ejemplo, aprenderemos a eliminar los nodos dentro de la forma SmartArt.

  • Crear una instancia de la clase Presentation y cargar la presentación con una forma SmartArt.
  • Obtener la referencia de la primera diapositiva mediante su índice.
  • Recorrer cada forma dentro de la primera diapositiva.
  • Verificar si la forma es de tipo SmartArt y convertir la forma seleccionada a SmartArt si lo es.
  • Verificar si el SmartArt tiene más de 0 nodos.
  • Seleccionar el nodo SmartArt que se eliminará.
  • Ahora, eliminar el nodo seleccionado usando el método RemoveNode() y guardar la presentación.
// Cargar la presentación deseada
using (Presentation pres = new Presentation("RemoveNode.pptx"))
{

    // Recorrer cada forma dentro de la primera diapositiva
    foreach (IShape shape in pres.Slides[0].Shapes)
    {

        // Verificar si la forma es de tipo SmartArt
        if (shape is ISmartArt)
        {
            // Convertir la forma a SmartArtEx
            ISmartArt smart = (ISmartArt)shape;

            if (smart.AllNodes.Count > 0)
            {
                // Accediendo al nodo SmartArt en el índice 0
                ISmartArtNode node = smart.AllNodes[0];

                // Eliminando el nodo seleccionado
                smart.AllNodes.RemoveNode(node);

            }
        }
    }

    // Guardar la presentación
    pres.Save("RemoveSmartArtNode_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);
}

Eliminar un nodo SmartArt en una posición específica

En este ejemplo, aprenderemos a eliminar los nodos dentro de la forma SmartArt en una posición concreta.

  • Crear una instancia de la clase Presentation y cargar la presentación con una forma SmartArt.
  • Obtener la referencia de la primera diapositiva mediante su índice.
  • Recorrer cada forma dentro de la primera diapositiva.
  • Verificar si la forma es de tipo SmartArt y convertir la forma seleccionada a SmartArt si lo es.
  • Seleccionar el nodo de la forma SmartArt en el índice 0.
  • Ahora, verificar si el nodo SmartArt seleccionado tiene más de 2 nodos hijos.
  • Ahora, eliminar el nodo en la posición 1 usando el método RemoveNodeByPosition().
  • Guardar la presentación.
// Cargar la presentación deseada
Presentation pres = new Presentation("RemoveNodeSpecificPosition.pptx");

// Recorrer cada forma dentro de la primera diapositiva
foreach (IShape shape in pres.Slides[0].Shapes)
{
    // Verificar si la forma es de tipo SmartArt
    if (shape is Aspose.Slides.SmartArt.SmartArt)
    {
        // Convertir la forma a SmartArt
        Aspose.Slides.SmartArt.SmartArt smart = (Aspose.Slides.SmartArt.SmartArt)shape;

        if (smart.AllNodes.Count > 0)
        {
            // Accediendo al nodo SmartArt en el índice 0
            Aspose.Slides.SmartArt.ISmartArtNode node = smart.AllNodes[0];

            if (node.ChildNodes.Count >= 2)
            {
                // Eliminando el nodo hijo en la posición 1
                ((Aspose.Slides.SmartArt.SmartArtNodeCollection)node.ChildNodes).RemoveNode(1);
            }

        }
    }
}

// Guardar la presentación
pres.Save("RemoveSmartArtNodeByPosition_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);

Establecer una posición personalizada para un nodo hijo en un objeto SmartArt

Ahora Aspose.Slides for .NET admite la configuración de las propiedades X e Y de SmartArtShape. El fragmento de código a continuación muestra cómo establecer una posición, tamaño y rotación personalizados para SmartArtShape; también tenga en cuenta que agregar nuevos nodos provoca un recálculo de las posiciones y tamaños de todos los nodos.

// Cargar la presentación deseada
Presentation pres = new Presentation("AccessChildNodes.pptx");

{
	ISmartArt smart = pres.Slides[0].Shapes.AddSmartArt(20, 20, 600, 500, SmartArtLayoutType.OrganizationChart);

	// Mover la forma SmartArt a una nueva posición
	ISmartArtNode node = smart.AllNodes[1];
	ISmartArtShape shape = node.Shapes[1];
	shape.X += (shape.Width * 2);
	shape.Y -= (shape.Height / 2);

	// Cambiar el ancho de la forma SmartArt
	node = smart.AllNodes[2];
	shape = node.Shapes[1];
	shape.Width += (shape.Width / 2);

	// Cambiar la altura de la forma SmartArt
	node = smart.AllNodes[3];
	shape = node.Shapes[1];
	shape.Height += (shape.Height / 2);

	// Cambiar la rotación de la forma SmartArt
	node = smart.AllNodes[4];
	shape = node.Shapes[1];
	shape.Rotation = 90;

	pres.Save("SmartArt.pptx", SaveFormat.Pptx);
}

Comprobar un nodo asistente

En el siguiente código de ejemplo investigaremos cómo identificar los nodos asistente en la colección de nodos SmartArt y modificarlos.

  • Crear una instancia de la clase PresentationEx y cargar la presentación con una forma SmartArt.
  • Obtener la referencia de la segunda diapositiva mediante su índice.
  • Recorrer cada forma dentro de la primera diapositiva.
  • Verificar si la forma es de tipo SmartArt y convertir la forma seleccionada a SmartArtEx si lo es.
  • Recorrer todos los nodos dentro de la forma SmartArt y comprobar si son nodos asistente.
  • Cambiar el estado del nodo asistente a nodo normal.
  • Guardar la presentación.
// Crear una instancia de presentación
using (Presentation pres = new Presentation("AssistantNode.pptx"))
{
    // Recorrer cada forma dentro de la primera diapositiva
    foreach (IShape shape in pres.Slides[0].Shapes)
    {
        // Verificar si la forma es de tipo SmartArt
        if (shape is Aspose.Slides.SmartArt.ISmartArt)
        {
            // Convertir la forma a SmartArtEx
            Aspose.Slides.SmartArt.ISmartArt smart = (Aspose.Slides.SmartArt.SmartArt)shape;
            // Recorrer todos los nodos de la forma SmartArt

            foreach (Aspose.Slides.SmartArt.ISmartArtNode node in smart.AllNodes)
            {
                String tc = node.TextFrame.Text;
                // Verificar si el nodo es asistente
                if (node.IsAssistant)
                {
                    // Establecer el nodo asistente a false y convertirlo en nodo normal
                    node.IsAssistant = false;
                }
            }
        }
    }
    // Guardar la presentación
    pres.Save("ChangeAssitantNode_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);
}

Establecer el formato de relleno de un nodo

Aspose.Slides for .NET permite agregar formas SmartArt personalizadas y establecer sus formatos de relleno. Este artículo explica cómo crear y acceder a formas SmartArt y establecer su formato de relleno usando Aspose.Slides for .NET.

  • Crear una instancia de la clase Presentation.
  • Obtener la referencia de una diapositiva usando su índice.
  • Agregar una forma SmartArt configurando su LayoutType.
  • Establecer el FillFormat para los nodos de la forma SmartArt.
  • Guardar la presentación modificada como un archivo PPTX.
using (Presentation presentation = new Presentation())
{
    // Accediendo a la diapositiva
    ISlide slide = presentation.Slides[0];

    // Añadiendo forma SmartArt y nodos
    var chevron = slide.Shapes.AddSmartArt(10, 10, 800, 60, SmartArtLayoutType.ClosedChevronProcess);
    var node = chevron.AllNodes.AddNode();
    node.TextFrame.Text = "Some text";

    // Estableciendo color de relleno del nodo
    foreach (var item in node.Shapes)
    {
        item.FillFormat.FillType = FillType.Solid;
        item.FillFormat.SolidFillColor.Color = Color.Red;
    }

    // Guardando presentación
    presentation.Save("FillFormat_SmartArt_ShapeNode_out.pptx", SaveFormat.Pptx);
}

Generar una miniatura de un nodo hijo SmartArt

Los desarrolladores pueden generar una miniatura del nodo hijo de un SmartArt siguiendo los pasos a continuación:

  • Instanciar la clase Presentation que representa el archivo PPTX.
  • Agregar SmartArt.
  • Obtener la referencia de un nodo usando su índice.
  • Obtener la imagen de miniatura.
  • Guardar la imagen de miniatura en cualquier formato de imagen deseado.

El ejemplo a continuación genera una miniatura del nodo hijo de SmartArt.

using (Presentation presentation = new Presentation())
{
    ISlide slide = presentation.Slides[0];

    ISmartArt smartArt = slide.Shapes.AddSmartArt(10, 10, 400, 300, SmartArtLayoutType.BasicCycle);
    ISmartArtNode node = smartArt.Nodes[1];

    using (IImage image = node.Shapes[0].GetImage())
    {
        image.Save("SmartArt_ChildNote_Thumbnail_out.jpeg", ImageFormat.Jpeg);
    }
}

FAQ

¿Se admite la animación de SmartArt?

Sí. SmartArt se trata como una forma normal, por lo que puede aplicar animaciones estándar (entrada, salida, énfasis, trayectorias de movimiento) y ajustar el tiempo. También puede animar las formas dentro de los nodos SmartArt cuando sea necesario.

¿Cómo puedo localizar de forma fiable un SmartArt específico en una diapositiva si su ID interno es desconocido?

Asigne y busque por texto alternativo. Configurar un AltText distintivo en el SmartArt le permite encontrarlo programáticamente sin depender de identificadores internos.

¿Se conservará la apariencia de SmartArt al convertir la presentación a PDF?

Sí. Aspose.Slides renderiza SmartArt con alta fidelidad visual durante la exportación a PDF, conservando el diseño, los colores y los efectos.

¿Puedo extraer una imagen de todo el SmartArt (para vistas previas o informes)?

Sí. Puede renderizar una forma SmartArt a formatos rasterizados o a SVG para obtener una salida vectorial escalable, lo que lo hace adecuado para miniaturas, informes o uso web.