O engenheiro civil e líder do nosso time de pesquisa e inovação, Rafael Anton, inicia hoje uma nova série e textos sobre programação visual com Dynamo. Vamos ao texto!
A programação está envolvida com o mundo dos projetos de engenharia desde o surgimento dos primeiros softwares de desenho. Além da própria programação necessária para o desenvolvimento do software, grande parte das aplicações também disponibilizavam a possibilidade de desenvolvimento de plugins para a realização de tarefas que não estavam disponíveis no conjunto de comandos padrão.
Quem já projetou em Autocad deve lembrar de algumas aplicações famosas. Um exemplo conhecido é o TigreCAd, que auxiliou muito na produtividade dos projetistas de instalações prediais há um tempo.
Apesar dos plugins serem extremamente úteis, a produção deles dependia de uma menor parcela de profissionais que conhecessem os softwares de engenharia e que possuíssem habilidades para a programação textual.
Com o surgimento das aplicações voltadas para programação visual, o poder da criação de rotinas de programação passou também para as mãos de cada projetista, que hoje tem a possibilidade de criar o exato procedimento que as particularidades do seu projeto exigem.
Mas afinal, o que é programação visual?
Segundo a definição do Wikipedia, programação visual é “qualquer linguagem de programação que permite aos usuários criar programas manipulando elementos do programa graficamente ao invés de especificá-los textualmente”.
As imagens abaixo representam um ótimo exemplo comparativo dos dois tipos de linguagem:
Fonte: primer.dynamobim.org
Este tipo de programação possui uma curva de aprendizado mais rápida que a textual, e é exatamente por isso que um número cada vez maior de engenheiros e arquitetos estão programando suas próprias rotinas.
No mundo do desenvolvimento de projetos em BIM, as duas aplicações de programação visual mais famosas são o Dynamo (voltado para o Revit), e o Grasshopper (voltado para o Archicad).
Neste post, que será o primeiro de uma série sobre o tema, faremos um apanhado geral dos principais conceitos para começar a programar com o Dynamo. Para tanto, utilizaremos como fonte principal a documentação do Dynamo, disponibilizada no site https://primer.dynamobim.org/.
Nós (nodes) no Dynamo
Os Nós, ou nodes, são objetos que executam funções e devem ser conectados entre si para formar a rotina de programação desejada.
A maioria dos nós no Dynamo são compostos por 5 partes:
Fonte: https://primer.dynamobim.org/
1- Nome do node
Nome composto pela Categoria que você está manipulando, e pelo método que você utiliza para a manipulação. No exemplo acima aparece o nó Point.ByCoordinates.
A palavra Point seria a categoria, neste caso estamos criando um Ponto, e o método é ByCoordinates (por coordenadas).
Desta forma, a função deste nó é criar pontos através das coordenadas (x,y e z).
2- Corpo
A parte principal do nó, clicando com o botão direito do mouse você tem acesso às configurações deste nó
3- Portas de entrada e portas de saída
Na parte esquerda temos as portas de entrada. Em nosso nó de exemplo são os pontos x,y e z. E na parte direita do nó temos as portas de saída, que no nosso exemplo representarão os pontos criados.
4- Indicador da amarra
A amarra representa a forma que os inputs serão cruzados, ela pode ser curta, longa ou ser o produto transversal. Nas imagens abaixo tentei exemplificar cada uma das amarras e os seus resultados, pensando em um exemplo simples de multiplicação de uma lista de números por outra.
Por padrão, os nós vêm com a opção automática marcada. Desta forma o Dynamo tentará escolher a melhor amarra para a situação. Porém, é possível alterar a amarra clicando com o botão direito no corpo do nó.
5- Valor padrão
Algumas portas de entrada dispõem de um valor padrão que pode ser usado. É possível ativar ou desativar o valor padrão clicando com o botão direito do mouse na porta.
Nesta lista de itens eu acho válido comentar sobre mais um elemento presente nos nós, que é o Nível, representado por uma setinha ao lado das portas de entrada.
Quando estamos trabalhando com muitas camadas dentro de uma lista no Dynamo, muitas vezes será necessário determinar a camada da lista que você quer fazer determinada ação. Não vamos nos aprofundar no assunto neste post, mas fica o conhecimento da existência deste elemento fundamental.
Codeblock
O codeblock é o elemento no Dynamo que é capaz de unir a programação escrita com a visual. A sintaxe que é utilizada para escrever o código dentro do codeblock disponibiliza todos os nós padrão do Dynamo para serem utilizados também na sua forma escrita. É um elemento muito útil para reduzir o tamanho da rotina e até tornar a sua execução mais rápida.
Dedicaremos um post futuro apenas para explicar a sintaxe de programação utilizada dentro do codeblock, pois trata-se de um elemento com muitas possibilidades, e o conteúdo pode ficar um pouco extenso.
Fios
Os fios são os elementos que realizam a conexão entre os nós, e determinam o fluxo da rotina.
Fonte: https://primer.dynamobim.org/
Interface do Dynamo
Tendo em mente todos os elementos, precisamos aprender como encontrá-los dentro da interface do Dynamo.
Os nós podem ser acessados através do menu esquerdo. Eles estão separados em algumas categorias principais (Dictionary, Display, Geometry, ImportExport, Input, List, Math, Revit, Script e String)
O interessante dessas categorias é explorar todos os nós que cada uma contém. Encorajamos você a abrir o Dynamo e verificar cada função existente neste menu. Abaixo deixarei uma breve explicação sobre alguns nós que serão encontrados nas categorias que eu mais utilizo no dia a dia.
Geometry
Contém toda a parte de criação de geometrias, como a criação de curvas, pontos, sólidos, superfícies, entre outras coisas.
Um exemplo de nó encontrado em geometry é o Circle.ByCenterPointRadius. Como o próprio nome diz, esse nó se propõem a criar um círculo através do seu ponto central e da determinação do seu raio.
Para realizarmos a criação deste círculo precisamos nos atentar para as portas de entrada (os inputs). Passando o mouse por cima das portas, o Dynamo irá mostrar o tipo de entrada que ele espera que você utilize.
Neste caso o ponto central deve ser, obviamente, um Ponto. E o Raio está pedindo o tipo de entrada “double”, que é basicamente uma entrada numérica.
Para encontrarmos as entradas solicitadas, podemos recorrer ao nosso menu lateral novamente. O ponto é uma geometria também, e será encontrado nesta categoria do menu:
Existem alguns métodos para a criação de pontos, como podemos observar na imagem acima. Neste caso iremos utilizar o Point.ByCoordinates (x,y,z)
Para a criação do número que determinará o valor do raio, utilizaremos um codeblock. O mesmo faremos para determinar as coordenadas x,y e z para o nó Point.ByCordinates.
Categoria List
Esta categoria contém todos os nós responsáveis por criar, inspecionar, modificar e organizar uma lista.
Categoria Revit
Nesta categoria que encontramos todos os nós que serão responsáveis pela interação com cada elemento que podemos criar, modificar ou consultar no Revit. Se você está querendo interagir com algum elemento do seu projeto, esta categoria irá lhe auxiliar.
A lista de operações disponíveis é bem extensa, e recomendamos fortemente que você explore cada pedaço desta categoria para avaliar as possibilidades de interação e o formato em que elas ocorrem.
Nesta categoria, por exemplo, podemos realizar a inserção de famílias no projeto.
Vamos imaginar que estamos projetando um auditório, e gostaríamos de posicionar várias cadeiras com um único comando.
Para isso, podemos procurar na categoria Revit algum nó que realize a criação de instâncias de família. Esse nó pode encontrado em:
Revit -> Elements -> FamilyInstance
Existem alguns métodos para a criação de família. Ela pode ser criada por coordenada, por face ou ponto. Para este exemplo iremos utilizar o método de criação por ponto.
Este nó está solicitando duas entradas: o tipo de família que você quer inserir, e o ponto em que ela será inserida.
Para o ponto vamos utilizar o já conhecido Point.ByCoordinates.
E para o FamilyType iremos utilizar o nó Family Types, que lista todos os tipos de família que já estão inseridos em seu projeto. Este nó pode ser encontrado em Revit -> Selection -> Family Types.
Reparem que, como utilizamos um ponto, nós tivemos como resultado apenas um elemento criado. Como a nossa intenção é criar várias cadeiras, é necessário inserir na porta de entrada Point uma lista de pontos, contendo todas as posições que você quer inserir a cadeira.
Um outro desafio que você já deve estar imaginado: como determinar esses pontos sem precisar calcular na mão a posição de cada um?
Para este desafio nós podemos utilizar algum elemento que já existe no seu projeto como referência. Pode ser o piso, as paredes, ou outro elemento a ser escolhido.
Para o nosso exemplo eu utilizei um conjunto de linhas que criei em projeto. Cada linha representa uma fileira de cadeiras. Nós podemos acessar esse conjunto de linhas de várias formas, uma delas é através do nó Select Model Elements. Com este nó é possível selecionar alguns elementos no seu projeto, e trazê-los para dentro do Dynamo.
Na seleção realizada, além das linhas, acabamos selecionando o piso também. Como ele não é um elemento desejável nós podemos utilizar um nó de filtragem para retirá-lo da seleção. Não vamos nos aprofundar sobre esta questão neste momento.
Tendo as linhas selecionadas, nós podemos utilizar o nó Curve.PointsAtEqualSegmentLength, este nó faz a distribuição de pontos equidistantes através dos nossos segmentos de linhas.
Para tanto ele irá solicitar, nas portas de entrada, uma curva (teremos que transformar o nosso elemento linha em uma curva), e também o número de divisões que faremos ao longo da linha.
A fim de não tornar este post mais extenso do que ele já está, não entrarei nos detalhes a respeito de cada elemento presente na rotina. Para facilitar o início do seu aprendizado, deixaremos o download do projeto do auditório e da rotina que estamos construindo, desta forma você pode explorar cada elemento que ela possui e testar, melhorar, e utilizar da maneira que preferir.
Exemplo de utilização da rotina
Packages (Pacotes)
Além dos nós que são disponibilizados por padrão no ato da instalação do Dynamo, também é possível criar seus próprios nós personalizados.
Esses nós personalizados são formados por um conjunto de nós que formam uma ação específica. Essa função pode ser utilizada para ganhar produtividade na produção das rotinas.
Muito usuários criam os seus nós personalizados e os disponibilizam para qualquer projetista. Esse conjunto de nós personalizados disponibilizado na biblioteca do Dynamo é chamado de Pacote. Os pacotes podem ser baixados pelo menu superior.
Python
Além de nós personalizados, é muito comum encontrar a utilização de scripts na linguagem Python dentro dos pacotes. O script em Python é a segunda forma de se produzir programação textual dentro do Dynamo (o primeiro formato é através de codeblocks, como conversamos nos tópicos anteriores). O assunto de python também é extenso e renderá um post futuro.
Se esse conteúdo foi útil para você não deixe de compartilhar. Se inscreva na nossa newsletter abaixo e fique sempre por dentro dos conteúdos recentes.