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#
- Añade la biblioteca de diagramación a tu proyecto C# para acceder a las API de creación y diseño de Visio.
- Inicializa un nuevo objeto
Diagramy carga formas básicas y conectores desde un archivo de plantilla Visio. - Define una estructura jerárquica o conjunto de datos que represente las relaciones organizacionales.
- Añade formas dinámicamente para cada nodo de la jerarquía y almacena sus ID para el mapeo de conexiones.
- Utiliza conectores para enlazar las formas hijas con sus nodos padre, formando el árbol jerárquico.
- Aplica un algoritmo de diseño automático (como CompactTree) para organizar los nodos de forma ordenada.
- 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.
