Python e Civil 3D

Embora o Dynamo seja extremamente poderoso como uma ferramenta de programação visual, também é possível ir além dos nós e fios e escrever código em forma textual. Há duas maneiras de fazer isso:

  1. Escrever DesignScript usando um bloco de código

  2. Escrever Python usando um nó Python

Esta seção se concentrará em como aproveitar o Python no ambiente do Civil 3D para tirar proveito das APIs .NET do AutoCAD e do Civil 3D.

Dê uma olhada na seção Python para obter informações mais gerais sobre como usar o Python no Dynamo.

Documentação das APIs

O AutoCAD e o Civil 3D têm várias APIs disponíveis que permitem que desenvolvedores como você estendam o produto principal com funcionalidade personalizada. No contexto do Dynamo, são as APIs .NET gerenciadas que são relevantes. Os links a seguir são essenciais para entender a estrutura das APIs e como elas funcionam.

Guia do Desenvolvedor da API .NET do AutoCAD

Guia de Referência da API .NET do AutoCAD

Guia do Desenvolvedor de API .NET do Civil 3D

Guia de Referência da API .NET do Civil 3D

Ao longo desta seção, pode haver alguns conceitos com os quais você não está familiarizado, como bancos de dados, transações, métodos, propriedades etc. Muitos desses conceitos são fundamentais para trabalhar com as APIs .NET e não são específicos do Dynamo ou do Python. Está além do escopo desta seção do Manual discutir esses itens em detalhes; portanto, recomendamos consultar os links acima com frequência para obter mais informações.

Modelo de código

Quando você editar um novo nó Python pela primeira vez, ele será preenchido previamente com o código do modelo para começar. Veja a seguir um detalhamento do modelo com explicações sobre cada bloco.

  1. Importa os módulos sys e clr, que são necessários para que o interpretador Python funcione corretamente. Em particular, o módulo clr permite que os namespaces .NET sejam tratados essencialmente como pacotes Python.

  2. Carrega as montagens padrão (ou seja, DLLs) para trabalhar com as APIs .NET gerenciadas para o AutoCAD e o Civil 3D.

  3. Adiciona referências aos namespaces padrão do AutoCAD e do Civil 3D. Isso é equivalente às diretivas using ou Imports em C# ou VB.NET (respectivamente).

  4. As portas de entrada do nó são acessíveis usando uma lista predefinida chamada IN. É possível acessar os dados em uma porta específica usando seu número de índice, por exemplo, dataInFirstPort = IN[0].

  5. Obtém o documento e o editor ativos.

  6. Bloqueia o documento e inicia uma transação do banco de dados.

  7. Aqui você deve colocar a maior parte da lógica do script.

  8. Retire o comentário dessa linha para confirmar a transação após seu trabalho principal ter sido concluído.

  9. Se desejar gerar dados do nó, atribua-os à variável OUT no final do script.

Deseja personalizar? É possível modificar o modelo Python padrão editando o arquivo PythonTemplate.py localizado em C:\ProgramData\Autodesk\C3D <versão>\Dynamo.

Exemplo

Vamos analisar um exemplo para demonstrar alguns dos conceitos essenciais de escrever scripts Python no Dynamo for Civil 3D.

Objetivo

🎯 Obter a geometria de limite de todas as áreas de contribuição em um desenho.

Conjunto de dados

Veja a seguir arquivos de exemplos que você pode consultar para este exercício.

Visão geral da solução

Apresentamos a seguir uma visão geral da lógica no gráfico.

  1. Revisar a documentação da API do Civil 3D

  2. Selecionar todas as áreas de contribuição no documento por nome de camada

  3. “Expandir” os objetos do Dynamo para acessar os membros internos da API do Civil 3D

  4. Criar pontos do Dynamo com base em pontos do AutoCAD

  5. Criar PolyCurves com base em pontos

Vamos começar

Revisar a documentação da API

Antes de começarmos a criar nosso gráfico e escrever código, é uma boa ideia dar uma olhada na documentação da API do Civil 3D e ter uma ideia do que a API disponibiliza para nós. Neste caso, há uma propriedade na classe Área de contribuição que retornará os pontos de limite da área de contribuição. Observe que essa propriedade retorna um objeto Point3dCollection, que o Dynamo não saberá como tratar. Em outras palavras, não poderemos criar uma PolyCurve com base em um objeto Point3dCollection; portanto, acabaremos precisando converter tudo em pontos do Dynamo. Haverá mais informações sobre isso mais tarde.

Obter todas as áreas de contribuição

Agora podemos começar a criar nossa lógica do gráfico. A primeira coisa a fazer é obter uma lista de todas as áreas de contribuição no documento. Há nós disponíveis para isso; portanto, não precisamos incluí-los no script Python. O uso de nós oferece uma melhor visibilidade para outra pessoa que possa ler o gráfico (em vez de encher o script Python de código) e também mantém o script Python focado em uma coisa: retornar os pontos de limite das áreas de contribuição.

Observe aqui que a saída do nó Todos os objetos na camada é uma lista de CivilObjects. Isso ocorre porque o Dynamo for Civil 3D não tem nós atualmente para trabalhar com áreas de contribuição, o que é a razão pela qual precisamos acessar a API por meio do Python.

Expandir objetos

Antes de avançarmos, temos de abordar brevemente um conceito importante. Na seção Biblioteca de nós, discutimos como Objetos e CivilObjects são relacionados. Para adicionar um pouco mais de detalhes a isso, um Objeto do Dynamo é um wrapper em torno de uma Entidade do AutoCAD. De forma similar, um CivilObject do Dynamo é um wrapper em torno de uma Entidade do Civil 3D. É possível “expandir” um objeto acessando suas propriedades InternalDBObject ou InternalObjectId.

Tipo do DynamoPacotes

Objeto Autodesk.AutoCAD.DynamoNodes.Object

Entidade Autodesk.AutoCAD.DatabaseServices.Entity

CivilObject Autodesk.Civil.DynamoNodes.CivilObject

Entidade Autodesk.Civil.DatabaseServices.Entity

Como regra geral, é mais seguro obter a ID de objeto usando a propriedade InternalObjectId e, em seguida, acessar o objeto empacotado em uma transação. Isso ocorre porque a propriedade InternalDBObject retornará um DBObject do AutoCAD que não está em um estado gravável.

Script Python

Aqui está o script Python completo que faz o trabalho de acessar os objetos de área de contribuição internos que estão obtendo seus pontos de limite. As linhas realçadas representam as que são modificadas/adicionadas do código do modelo padrão.

Clique no texto sublinhado no script para obter uma explicação sobre cada linha.

# Carregar as bibliotecas Standard e do DesignScript do Python
import sys
import clr

# Adicionar montagens para o AutoCAD e o Civil 3D
clr.AddReference('AcMgd')
clr.AddReference('AcCoreMgd')
clr.AddReference('AcDbMgd')
clr.AddReference('AecBaseMgd')
clr.AddReference('AecPropDataMgd')
clr.AddReference('AeccDbMgd')



# Importar referências do AutoCAD
from Autodesk.AutoCAD.Runtime import *
from Autodesk.AutoCAD.ApplicationServices import *
from Autodesk.AutoCAD.EditorInput import *
from Autodesk.AutoCAD.DatabaseServices import *
from Autodesk.AutoCAD.Geometry import *

# Importar referências do Civil3D
from Autodesk.Civil.ApplicationServices import *
from Autodesk.Civil.DatabaseServices import *

from Autodesk.DesignScript.Geometry import Point as DynPoint

# As entradas para esse nó serão armazenadas como uma lista nas variáveis IN.
 = IN[0]

 

if objs is None:
    

if not isinstance(objs, list):
    
    
adoc = Application.DocumentManager.MdiActiveDocument
editor = adoc.Editor

with adoc.LockDocument():
    with adoc.Database as db:
        
        with db.TransactionManager.StartTransaction() as t:
            for obj in objs:              
                
                aeccObj = t.GetObject(id, OpenMode.ForRead)                
                
                    catchment = aeccObj
                                        
                    dynPnts = []
                    
                        pnt = DynPoint.ByCoordinates(acPnt.X, acPnt.Y, acPnt.Z)
                        
                    output.append(dynPnts)
            
            # Confirmar antes de finalizar a transação
            
            pass
            
# Atribua a saída à variável OUT.
OUT = output

Como regra geral, é recomendável incluir a maior parte da lógica do script dentro de uma transação. Isso garante o acesso seguro aos objetos que o script está lendo/gravando. Em muitos casos, a omissão de uma transação pode causar um erro fatal.

Criar PolyCurves

Nesta fase, o script Python deve gerar uma lista de pontos do Dynamo que você pode ver na visualização do plano de fundo. A última etapa é simplesmente criar PolyCurves com base nos pontos. Observe que isso também pode ser feito diretamente no script Python, mas nós o colocamos intencionalmente fora do script em um nó para que ele fique mais visível. Veja a seguir a aparência final do gráfico.

Resultado

E aqui está a geometria final do Dynamo.

🎉 Missão cumprida.

IronPython versus CPython

Apenas uma rápida observação aqui antes de finalizarmos. Dependendo de qual versão do Civil 3D você está usando, o nó Python pode ser configurado de forma diferente. No Civil 3D 2020 e 2021, o Dynamo usava uma ferramenta chamada IronPython para mover dados entre objetos .NET e scripts Python. No entanto, no Civil 3D 2022, o Dynamo fez a transição para usar o interpretador Python nativo padrão (também conhecido como CPython), que usa o Python 3. Os benefícios dessa transição incluem o acesso a bibliotecas modernas e populares, além de novos recursos de plataforma, manutenção essencial e patches de segurança.

Você pode ler mais sobre essa transição e sobre como atualizar os scripts herdados no Blog do Dynamo. Se você desejar continuar usando o IronPython, basta instalar o pacote DynamoIronPython2.7 usando o Dynamo Package Manager.

  1. Essa linha obtém a classe específica que precisamos da biblioteca de geometria do Dynamo. Observe que especificamos import Point as DynPoint aqui em vez de import *, pois introduziria interferências de nomenclatura.

  2. Aqui especificamos exatamente qual porta de entrada contém os dados que desejamos em vez do padrão IN, que faz referência à lista inteira de todas as entradas.

Last updated