Este é o segundo post da série sobre programação visual, na qual estamos focando no ensino do Dynamo, a interface de programação do Revit.
Se você pretende iniciar os aprendizados em Dynamo mas ainda não leu o nosso primeiro post, recomendamos começar por ele. Lá você encontrará o conteúdo introdutório que auxiliará na compreensão deste post.
Nesta sequência da série, abordaremos funcionalidades e exemplos dos nodes (nós) responsáveis por realizar a criação, modificação e consulta de listas dentro do Dynamo.
Assim como em muitas linguagens de programação, a manipulação de listas é uma tarefa recorrente. Grande parte das rotinas que nós desejamos criar vão recair em muita manipulação de dados antes que tarefa que pretendemos executar possa ser realizada.
Para exemplificar este conceito de manipulação de listas podemos imaginar que estamos pensando em criar uma rotina que realize a inserção de tags nas portas do nosso modelo. Esta nossa tag precisa trazer duas informações:
1ª informação: um código da porta que a categorize pelo tipo
P01 – Porta comum de madeira 80×210
P02 – Porta de correr em vidro, duas folhas 170×210
P03 – Porta de abrir em madeira, duas folhas, 170×210
2ª informação: um código que diferencie cada porta para facilitar a comunicação de projeto
Se existem quatro portas do tipo P01, estas serão nomeadas de: P01-A, P01-B, P01-C e P01-D.
O processo para a produção desta rotina está representado na imagem abaixo:
É possível observar que a parte do meio do nosso código, que está entre a seleção das portas e a inserção da tag no nosso modelo, traz algumas manipulações de listas. Em um primeiro momento é necessário organizar a lista por tipo de porta, e em um segundo momento é necessário criar a lista de códigos que posteriormente serão inseridos no nosso modelo através de uma tag.
Convencidos da importância de utilizar nodes de manipulação de listas no Dynamo?
Espero que sim, pois nos próximos tópicos entraremos na análise das funções que temos disponíveis. Começaremos analisando como estes nodes estão organizados dentro Dynamo.
Navegação Dynamo: Criação, Ação e Consulta
Sempre que realizamos a busca de nodes pelo menu de navegação à esquerda no Dynamo, vamos nos deparar com uma divisão em três símbolos, como os da imagem abaixo:
Esses símbolos representam a função que este node em específico está executando.
Na aba verde estão os nodes que realizam a criação de elementos que ainda não existem. No caso das listas, encontraremos, por exemplo, o node de criação de listas (List.Create).
Na aba vermelha estão os nodes que executam alguma ação em um elemento que já existe. Um exemplo de node que é encontrado nesta classificação é o Join (List.Join), que realiza a junção de duas listas em uma única.
Na aba azul encontramos nodes que realizam consultas em determinado elemento. São nodes que te retornam algum valor, mas não realizam uma ação especificamente.
Estes conceitos servem para que os nodes fiquem visualmente organizados na nossa interface de programação, mas muitas vezes essa determinação do tipo de cada node não é tão objetiva e o conceito pode ficar um pouco confuso. Portanto, não é necessário interpretá-lo literalmente. Apenas saber o porquê destes símbolos estarem posicionados ali já é suficiente para seguirmos.
Explorando as funções disponíveis no Dynamo
Em nosso menu de navegação à esquerda podemos encontrar a categoria List. Abrindo esta categoria encontraremos as seguintes subdivisões:
Todos os nodes presentes dentro destas organizações farão algum tipo de função relacionada a uma lista. Abaixo exploraremos alguns exemplos dentro de cada uma das subdivisões presentes.
List Generate
Contempla os nodes que vão realizar a criação de listas.
Dentre estes nodes, separei alguns que uso com frequência, com um exemplo.
LSist Create
Responsável pela criação de listas. Com este node podemos criar, por exemplo, a nossa lista de códigos para as portas.
Este node é mais utilizado em sua forma textual. Por meio do codeblock podemos executar a mesma função inserindo colchetes e separando os elementos por vírgula, como na imagem abaixo:
List Join
Node responsável por fazer a junção de mais de uma lista em uma única.
List Inspect
Aqui encontraremos nodes de inspeção, que fazem consultas dentro de uma lista fornecida.
List Count
Conta quantos elementos a lista possui.
List Contains
Verifica se a lista contém determinado elemento.
Reparem que no exemplo acima eu verifiquei dois itens (P01-A e XXXX) de uma vez só, transformando-os em uma lista. Como esperado recebi o seguinte retorno:
A lista contém o elemento P01-A, devido à primeira saída estar marcada como true;
A lista não contém o elemento XXXX, devido à segunda saída estar marcada como false;
List Match
Realiza operações matemáticas em determinada lista. Os nodes presentes aqui não são de utilização tão comum. Na grande maioria dos casos acabamos aplicando a função diretamente na lista, sem a intervenção de um node da categoria List Match. Porém, a título de aprendizado, segue um exemplo de utilização abaixo.
List Map
Aplica uma determinada função em cada elemento de uma lista (no exemplo aplicamos o cosseno em cada um dos ângulos presentes na lista).
List Modify
Estes nodes realizam alguma modificação na lista, como a adição de um item, filtros, etc…
FilterByBoolMask
Aplica um filtro na lista através de uma condição de verdadeiro ou falso. Por exemplo: filtrar apenas os números de determinada lista que são maiores que 90.
Este node solicita duas entradas: List e Mask. Em list você precisa entrar com uma lista, e na entrada mask é solicitada uma máscara booleana, ou seja, uma lista que contenha a condição false ou true para cada elemento que foi testado segundo uma determinada condição.
Como saída o FilterByBoolMask retorna tanto os elementos que atendem a esta condição (in) quanto os que não atendem (out), e você pode utilizar as duas saídas como listas separadas, conforme o seu código requisitar.
*Para atender a condição de máscara booleana na porta Mask, utilizei o node “>”, que faz a verificação de “maior que”.
List Organize
Aqui você encontrará nodes responsáveis por reorganizar uma determinada lista. Você pode, por exemplo, agrupar uma lista por determinada chave, ordenar por algum critério estabelecido, entre outras funções.
GroupByKey
Realiza o agrupamento da lista por uma determinada chave. Voltando ao nosso exemplo das portas mostrado no início deste post, nós podemos utilizar o GroupByKey para fazer o agrupamento de portas pelo seu tipo.
Este node solicita uma entrada de lista. No nosso exemplo foi uma lista de portas retirada direto do modelo.
E na outra porta o node solicita as Keys, que são as chaves utilizadas. Em nosso exemplo foi utilizado o tipo da porta que retiramos por meio do node Element.Type.
Dando estas entradas o List.GroupByKey nos retornou a saída groups, que separou as portas em várias listas, sendo que cada lista possui um tipo distinto de porta.
Também temos a saída Unique Keys. Nesta saída é possível visualizar quantos tipos únicos de portas nós temos.
Conclusão
Neste post da nossa série, exploramos a relevância que a manipulação de listas possui dentro de uma rotina, também verificamos alguns nodes que são bastante utilizados, juntamente com um exemplo de execução.
Aconselhamos quem está iniciando seus estudos no Dynamo a tentar replicar todos esses exemplos. Temos certeza de que a prática irá auxiliar bastante no aprendizado.
Se esse texto foi útil para você, não deixe de compartilhar e se inscrever na nossa newsletter aqui embaixo!