Estrutura de dados em árvore para objetos do AutoCAD usando pyautocad (Python)

Em um dos meus posts anteriores, discuti como podemos usar listas e dicionários para armazenar objetos AutoCAD criados. Neste post quero apresentar algumas estruturas de dados mais eficientes que podemos usar para organizar objetos do AutoCAD de acordo com suas propriedades. Um deles é uma estrutura de dados em árvore.

Estrutura de dados em árvore para organizar objetos do AutoCAD

Uma estrutura de dados em árvore é uma estrutura de dados não linear porque não armazena dados de maneira sequencial. É uma estrutura hierárquica, pois os elementos de uma árvore são organizados em vários níveis e assumem a forma de nós. Os nós podem conter qualquer tipo de dados. No caso do pyautocad, precisarei buscar strings, inteiros, floats, etc.

Cada nó contém alguns dados e o link ou referência de outros nós. Esses nós associados são nós pai ou filho, dependendo de sua posição na hierarquia de dados em forma de árvore.

Tree
Figura 1: Estrutura de dados em árvore

Por exemplo, conforme ilustrado na figura acima, o nó A é o nó raiz. O nó raiz é o nó superior na árvore e representa o primeiro nó na árvore. Neste caso, o nó raiz A tem três (3) nós filhos: B, F e J. Em outras palavras, o nó A é um nó pai para esses nós.

A organização de objetos do AutoCAD em uma estrutura de dados hierárquica em forma de árvore auxilia no armazenamento, manutenção, rastreamento e manipulação de dados.

Aplicando estruturas de dados em árvore ao trabalhar com pyautocad em Python

Às vezes, precisamos interligar dados ao criar ou editar desenhos. Por exemplo, vamos considerar um exemplo em que estou projetando uma pequena estrutura de piso de concreto contendo vigas e colunas.

Eu poderia armazenar cada objeto como um nó separado. No exemplo de codificação exibido abaixo, crio um nó chamado Column, tendo 4 filhos. Esses filhos contêm os dados de um elemento estrutural do AutoCAD como seus respectivos filhos.

    column = TreeNode("Column")

    c1 = TreeNode("Column1")
    c2 = TreeNode("Column2")
    c3 = TreeNode("Column3")
    c4 = TreeNode("Column4")

    column.add_child(c1)
    column.add_child(c2)
    column.add_child(c3)
    column.add_child(c4)   

    c1.add_child(TreeNode(acad.model.AddPolyline(aDouble(0, 0, 0, 100, 0, 0, 100, 100, 0, 0, 100, 0, 0, 0, 0))))
    c2.add_child(TreeNode(acad.model.AddPolyline(aDouble(500, 0, 0, 600, 0, 0, 600, 100, 0, 500, 100, 0, 500, 0, 0))))
    c3.add_child(TreeNode(acad.model.AddPolyline(aDouble(500, 500, 0, 600, 500, 0, 600, 600, 0, 500, 600, 0, 500, 500, 0))))
    c4.add_child(TreeNode(acad.model.AddPolyline(aDouble(0, 500, 0, 100, 500, 0, 100, 600, 0, 0, 600, 0, 0, 500, 0))))

A árvore de dados acima estrutura os elementos de coluna que foram criados e adicionados ao desenho do AutoCAD. Os elementos são criados e adicionados com pyautocad, um módulo para script de fluxos de trabalho do AutoCAD em Python. Posso estruturar elementos de viga da mesma maneira. Dessa forma, combino ambos em uma estrutura geral de dados em forma de árvore que organiza e armazena os dados de todo o edifício.

Para este exemplo, prossigo implementando um método de nó para imprimir o conteúdo de um nó e seus filhos. O método pode ser chamado para o nó raiz. Além disso, o método também imprimirá a área de superfície associada a cada conteúdo, viga ou coluna de nó filho. Aqui está o código para isso:

# função para imprimir a estrutura e o conteúdo de uma árvore de dados
def print_tree(self):
        space = "   " * self.get_level()
        prefix = space + "|--" if self.parent else ""
        print(prefix, end="")
        try:
            print("Area = " +  str(round(self.data.Area,2)))
        except:
            print(self.data)
        if self.children:
            for child in self.children:
                child.print_tree()  

Neste exemplo, trabalho com o framework estrutural do AutoCAD exibida na figura abaixo.

Figura 2.1: Framework estrutural usando pyautocad

Para este exemplo, o método “print_tree” criou a seguinte saída:

Figura 2.2: Saída para a árvore de dados criada em Python usando pyautocad

Vantagens de usar estrutura de dados em árvore ao trabalhar com pyautocad

Devido a alguns problemas técnicos ou devido à necessidade de projeto estrutural, pode ser necessário alterar as dimensões de uma estrutura. Nesse caso, alguns membros interligados serão afetados. Portanto, as dimensões para esses membros devem ser ajustadas de acordo. Para evitar um esforço manual extenso, posso simplesmente ajustar as dimensões de um membro e outros membros serão alterados de acordo.

Isso pode ser feito usando uma combinação de uma árvore de dados e uma lista vinculada. Por exemplo, se eu alterar a dimensão de um objeto, posso pesquisar a propriedade de dimensão desse objeto específico na lista vinculada. Este objeto também deve ser vinculado aos objetos de conexão, que podem ser modificados automaticamente com base nas alterações feitas com as dimensões do elemento de conexão. Desta forma, posso manter a hierarquia de objetos, bem como vinculá-los também.

Outro caso de uso é em termos de blockchain, ou seja, podemos rastrear o local onde as alterações foram feitas se fizermos o hash dos dados armazenados em cada nó. Ou podemos fazer o hash de todo o documento e rastrear as alterações feitas no mesmo.

Pode haver vários casos de uso dependendo do setor, domínio ou trabalho realizado no AutoCAD. Para saber mais sobre o AutoCAD, você também pode verificar a documentação oficial do AutoCAD.

Leave a Reply

Deixe um comentário

O seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Close

Meta