Los organigramas son esenciales para visualizar la estructura de equipos, departamentos y relaciones de reporte dentro de una empresa. Ayudan a la dirección y a los empleados a comprender la jerarquía y las relaciones entre los roles en una organización. Automatizar la creación de estos diagramas en C# permite a los desarrolladores generar dinámicamente visualizaciones a partir de bases de datos de recursos humanos, equipos de proyecto o directorios corporativos sin necesidad de diseñarlos manualmente en Visio u otras herramientas de diagramación.

Este tutorial explica cómo crear un organigrama en C# programáticamente usando una biblioteca de diagramación. Aprenderá a agregar nodos jerárquicos, conectar formas mediante conectores y organizar automáticamente el diagrama usando el algoritmo CompactTree para obtener una apariencia limpia y profesional.

¿Por qué crear un organigrama programáticamente?

  • Automatizar flujos de trabajo de recursos humanos para generar y actualizar diagramas cuando se produzcan cambios de personal o de estructura.
  • Crear diagramas de jerarquía claros y estandarizados sin necesidad de dibujarlos manualmente en Visio.
  • Ahorrar tiempo integrando la generación de diagramas en sistemas existentes, como la gestión de empleados o paneles de informes.
  • Garantizar un diseño coherente aplicando programáticamente estilos de forma, conectores y reglas de disposición.
  • Exportar diagramas directamente al formato Visio (VSDX) para compartir y editar posteriormente si es necesario.

Crear organigrama en C#

  1. Añade la biblioteca de diagramación a tu proyecto C# para acceder a las API de creación y diseño de Visio.
  2. Inicializa un nuevo objeto Diagram y carga formas básicas y conectores desde un archivo de plantilla Visio.
  3. Define una estructura jerárquica o conjunto de datos que represente las relaciones organizacionales.
  4. Añade formas dinámicamente para cada nodo de la jerarquía y almacena sus ID para el mapeo de conexiones.
  5. Utiliza conectores para enlazar las formas hijas con sus nodos padre, formando el árbol jerárquico.
  6. Aplica un algoritmo de diseño automático (como CompactTree) para organizar los nodos de forma ordenada.
  7. Guarda el diagrama resultante en formato Visio VSDX.
// Load masters from any existing diagram, stencil or template
string visioStencil = dataDir + "BasicShapes.vss";
const string rectangleMaster = "Rectangle";
const string connectorMaster = "Dynamic connector";
const int pageNumber = 0;
const double width = 1;
const double height = 1;
double pinX = 4.25;
double pinY = 9.5;

// Define values to construct the hierarchy
List<string> listPos = new List<string>(new string[] { 
    "0", "0:0", "0:1", "0:2", "0:3", "0:4", "0:5", "0:6", 
    "0:0:0", "0:0:1", "0:3:0", "0:3:1", "0:3:2", "0:6:0", "0:6:1" 
});

// Define a Hashtable to map the string name to long shape id
System.Collections.Hashtable shapeIdMap = new System.Collections.Hashtable();

// Create a new diagram
Aspose.Diagram.Diagram diagram = new Aspose.Diagram.Diagram(visioStencil);
diagram.Pages[pageNumber].PageSheet.PageProps.PageWidth.Value = 11;

// Add shapes for each hierarchy node
foreach (string orgnode in listPos)
{
    long rectangleId = diagram.AddShape(pinX++, pinY++, width, height, rectangleMaster, pageNumber);
    Aspose.Diagram.Shape shape = diagram.Pages[pageNumber].Shapes.GetShape(rectangleId);
    shape.Text.Value.Add(new Aspose.Diagram.Txt(orgnode));
    shape.Name = orgnode;
    shapeIdMap.Add(orgnode, rectangleId);
}

// Create connections between parent and child nodes
foreach (string orgName in listPos)
{
    int lastColon = orgName.LastIndexOf(':');
    if (lastColon > 0)
    {
        string parendName = orgName.Substring(0, lastColon);
        long shapeId = (long)shapeIdMap[orgName];
        long parentId = (long)shapeIdMap[parendName];
        Aspose.Diagram.Shape connector1 = new Aspose.Diagram.Shape();
        long connecter1Id = diagram.AddShape(connector1, connectorMaster, pageNumber);
        diagram.Pages[pageNumber].ConnectShapesViaConnector(parentId,
            Aspose.Diagram.Manipulation.ConnectionPointPlace.Right,
            shapeId, Aspose.Diagram.Manipulation.ConnectionPointPlace.Left,
            connecter1Id);
    }
}

// Auto layout CompactTree chart
Aspose.Diagram.AutoLayout.LayoutOptions compactTreeOptions = new Aspose.Diagram.AutoLayout.LayoutOptions
{
    LayoutStyle = Aspose.Diagram.AutoLayout.LayoutStyle.CompactTree,
    Direction = Aspose.Diagram.AutoLayout.LayoutDirection.DownThenRight,
    EnlargePage = false
};

diagram.Pages[pageNumber].Layout(compactTreeOptions);

// Save diagram
diagram.Save(dataDir + "ORGChart_out.vsdx", Aspose.Diagram.SaveFileFormat.Vsdx);

Este ejemplo de código crea una jerarquía organizacional, conecta nodos padre e hijo mediante conectores dinámicos y aplica un diseño automático CompactTree para una estructura limpia. Cada forma representa un nodo organizacional etiquetado según la lista de jerarquía, y el resultado final se guarda como un archivo Visio VSDX.

Conclusión

Crear organigramas en C# proporciona una forma dinámica de visualizar estructuras de equipos, jerarquías de reporte y relaciones departamentales sin dibujar manualmente en Visio. Con diseño automático y gestión de conexiones, puedes generar diagramas limpios y legibles directamente a partir de fuentes de datos. El enfoque mostrado arriba simplifica los informes de RR.HH., mejora la consistencia y permite la integración con flujos de trabajo de automatización empresarial.

See Also