Os organogramas são essenciais para visualizar a estrutura de equipes, departamentos e relações de reporte dentro de uma empresa. Eles ajudam a gestão e os funcionários a compreender a hierarquia e as relações entre cargos em uma organização. Automatizar a criação desses diagramas em C# permite que os desenvolvedores gerem dinamicamente visualizações a partir de bancos de dados de RH, equipes de projeto ou diretórios corporativos sem esforço manual de design no Visio ou em outras ferramentas de diagramas.

Este tutorial explica como criar um organograma em C# programaticamente usando uma biblioteca de diagramas. Você aprenderá a adicionar nós hierárquicos, conectar formas usando conectores e organizar automaticamente o diagrama usando o algoritmo CompactTree para uma aparência limpa e profissional.

Por que criar um organograma programaticamente?

  • Automatize fluxos de trabalho de RH para gerar e atualizar diagramas quando ocorrerem alterações de pessoal ou de estrutura.
  • Produza diagramas de hierarquia claros e padronizados sem a necessidade de desenhá-los manualmente no Visio.
  • Economize tempo integrando a geração de diagramas aos sistemas existentes, como gerenciamento de funcionários ou painéis de relatórios.
  • Garanta um design consistente aplicando programaticamente estilos de formas, conectores e regras de layout.
  • Exporte diagramas diretamente para o formato Visio (VSDX) para compartilhamento e edição adicional, se necessário.

Criar organograma em C#

  1. Adicione a biblioteca de diagramas ao seu projeto C# para acessar as APIs de criação e layout do Visio.
  2. Inicialize um novo objeto Diagram e carregue formas básicas e conectores de um arquivo de estêncil do Visio.
  3. Defina uma estrutura hierárquica ou conjunto de dados que represente as relações organizacionais.
  4. Adicione formas dinamicamente para cada nó na hierarquia e armazene seus IDs para mapeamento de conexões.
  5. Use conectores para ligar as formas filhas aos seus nós pais, formando a árvore hierárquica.
  6. Aplique um algoritmo de layout automático (como CompactTree) para organizar os nós de forma ordenada.
  7. Salve o diagrama resultante no 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 exemplo de código cria uma hierarquia organizacional, conecta nós pai e filho usando conectores dinâmicos e aplica um layout automático CompactTree para uma estrutura limpa. Cada forma representa um nó organizacional rotulado de acordo com a lista de hierarquia, e o resultado final é salvo como um arquivo Visio VSDX.

Conclusão

Criar organogramas em C# oferece uma maneira dinâmica de visualizar estruturas de equipe, hierarquias de reporte e relações departamentais sem a necessidade de desenhar manualmente no Visio. Com layout automático e gerenciamento de conexões, você pode gerar diagramas limpos e legíveis diretamente a partir de fontes de dados. A abordagem mostrada acima simplifica o relatório de RH, melhora a consistência e permite a integração com fluxos de trabalho de automação empresarial.

Veja Também