Python e Civil 3D
Last updated
Last updated
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:
Escrever DesignScript usando um bloco de código
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.
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.
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.
Importa os módulos
sys
eclr
, que são necessários para que o interpretador Python funcione corretamente. Em particular, o móduloclr
permite que os namespaces .NET sejam tratados essencialmente como pacotes Python.Carrega as montagens padrão (ou seja, DLLs) para trabalhar com as APIs .NET gerenciadas para o AutoCAD e o Civil 3D.
Adiciona referências aos namespaces padrão do AutoCAD e do Civil 3D. Isso é equivalente às diretivas
using
ouImports
em C# ou VB.NET (respectivamente).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]
.Obtém o documento e o editor ativos.
Bloqueia o documento e inicia uma transação do banco de dados.
Aqui você deve colocar a maior parte da lógica do script.
Retire o comentário dessa linha para confirmar a transação após seu trabalho principal ter sido concluído.
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
.
Vamos analisar um exemplo para demonstrar alguns dos conceitos essenciais de escrever scripts Python no Dynamo for Civil 3D.
🎯 Obter a geometria de limite de todas as áreas de contribuição em um desenho.
Veja a seguir arquivos de exemplos que você pode consultar para este exercício.
Apresentamos a seguir uma visão geral da lógica no gráfico.
Revisar a documentação da API do Civil 3D
Selecionar todas as áreas de contribuição no documento por nome de camada
“Expandir” os objetos do Dynamo para acessar os membros internos da API do Civil 3D
Criar pontos do Dynamo com base em pontos do AutoCAD
Criar PolyCurves com base em pontos
Vamos começar
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.
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.
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
.
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.
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.
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.
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.
E aqui está a geometria final do Dynamo.
🎉 Missão cumprida.
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.
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.
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.