Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
O Dynamo é um projeto ativo de desenvolvimento de código aberto. Descubra a lista de softwares compatíveis com o Dynamo.
O Dynamo vem pré-instalado com softwares como o Revit3D, o FormIt, o Civil3D etc.
Para obter mais orientações sobre o uso do Dynamo com um software específico, recomendamos consultar as seguintes seções:
Se você desejar usar o Dynamo como um aplicativo independente, continue lendo para obter orientações sobre como fazer o download do Sandbox.
O aplicativo do Dynamo está disponível no site do Dynamo. As versões oficiais, anteriores ou de pré-lançamento, estão disponíveis na página de download. Visite a página Como obter o Dynamo e clique em Download para obter a versão oficial lançada.
Se você estiver procurando versões de desenvolvimento anteriores ou as mais avançadas, todas as versões poderão ser encontradas na seção inferior da mesma página.
O desenvolvimento mais avançado pode incluir alguns recursos novos e experimentais que ainda não foram totalmente testados; portanto, pode ser instável. Se você usar esse desenvolvimento, poderá detectar erros ou problemas, e poderá nos ajudar a aprimorar o aplicativo informando os problemas à nossa equipe.
Recomenda-se que os iniciantes façam o download da versão estável oficial.
Antes de iniciar qualquer versão transferida por download, é necessário descompactar o conteúdo para a pasta escolhida.
Faça o download e instale o 7zip no computador para esta etapa.
Clique com o botão direito do mouse no arquivo zip e selecione Extrair tudo...
Escolha um destino para descompactar todos os arquivos.
Na pasta de destino, clique duas vezes em DynamoSandbox.exe para iniciá-lo
Você verá a tela de inicialização do DynamoSandbox, como mostrado a seguir.
Parabéns. Você terminou a configuração para usar o DynamoSandbox.
Geometria é uma funcionalidade adicional no Dynamo Sandbox que está disponível somente para usuários que têm uma assinatura ou licença atual para os seguintes softwares da Autodesk: Revit, Robot Structural Analysis, FormIt e Civil 3D. A funcionalidadeGeometria permite que os usuários importem, criem, editem e exportem a geometria do Dynamo Sandbox.
O Dynamo é um aplicativo de programação visual que pode ser obtido por download e executado no modo independente “Sandbox” ou como um plug-in para outros softwares como o Revit, o FormIt ou o Civil 3D.
Saiba mais sobre a diferença entre Dynamo Core/Revit/Sandbox.
O Dynamo permite trabalhar em um processo de programação visual, no qual conectamos os elementos para definir as relações e as sequências de ações que compõem os algoritmos personalizados. Podemos usar nossos algoritmos para uma ampla gama de aplicativos, desde o processamento de dados até a geração de geometria, tudo em tempo real e sem escrever nenhum código.
Os nós e fios são os componentes principais do Dynamo para oferecer suporte ao processo de programação visual. Eles ajudam a estabelecer relações visuais e sistêmicas fortes entre as partes de um projeto. Com um simples clique do mouse, conecte os nós com facilidade, enquanto desenvolve e otimiza o fluxo de trabalho do projeto.
Desde o uso da programação visual para fluxos de trabalho do projeto até o desenvolvimento de ferramentas personalizadas, o Dynamo é um aspecto essencial de uma ampla variedade de aplicativos interessantes.
O Dynamo é uma plataforma de programação visual de código aberto para projetistas.
Você acabou de abrir o Dynamo Primer, um guia abrangente para a programação visual no Autodesk Dynamo. Este manual é um projeto contínuo para compartilhar os fundamentos da programação. Os tópicos incluem trabalhar com geometria computacional, as melhores práticas para projetos baseados em regras, aplicativos de programação interdisciplinar e muito mais com a plataforma Dynamo.
O poder do Dynamo pode ser encontrado em uma ampla variedade de atividades relacionadas ao projeto. O Dynamo permite uma lista ampliada de maneiras prontamente acessíveis para você começar:
Explorar a programação visual pela primeira vez
Conectar fluxos de trabalho em vários softwares
Envolver uma comunidade ativa de usuários, colaboradores e desenvolvedores
Desenvolver uma plataforma de código aberto para aprimoramento contínuo
No âmbito dessa atividade e da empolgante oportunidade de trabalhar com o Dynamo, precisamos de um documento do mesmo calibre, o Dynamo Primer.
Consulte o Guia do Usuário do Primer para saber o que você pode esperar aprender com este manual.
Estamos continuamente aprimorando o Dynamo; portanto, alguns recursos podem parecer diferentes da representação neste manual. No entanto, todas as alterações de funcionalidade serão representadas corretamente.
O projeto Dynamo Primer é de código aberto. Estamos empenhados em fornecer conteúdo de qualidade e agradecemos se enviar seus comentários sobre o projeto. Se você quiser reportar um problema, publique a questão na página de problemas do GitHub: https://github.com/DynamoDS/DynamoPrimer/issues
Se você desejar contribuir com uma nova seção, edições ou qualquer outra coisa para este projeto, confira o repositório GitHub para começar: https://github.com/DynamoDS/DynamoPrimer.
O Dynamo Primer é um projeto de código aberto, iniciado por Matt Jezyk e a equipe de desenvolvimento do Dynamo na Autodesk.
A Mode Lab foi contratada para elaborar a primeira edição do manual. Agradecemos por todos seus esforços no estabelecimento desse recurso valioso.
A John Pierson of Parallax Team foi contratada para atualizar o manual para refletir as revisões do Dynamo 2.0.
A Matterlab foi contratada para atualizar o manual para refletir as revisões do Dynamo 2.13.
A Archilizer foi contratada para atualizar o manual para refletir as revisões do Dynamo 2.17.
A Wood Rodgers foi contratada para atualizar o manual com conteúdo para o Dynamo for Civil 3D.
Um agradecimento especial a Ian Keough por iniciar e orientar o projeto do Dynamo.
Obrigado a Matt Jezyk, Ian Keough, Zach Kron, Racel Amour e Colin McCrone pela colaboração entusiástica e pela oportunidade de participar de uma grande variedade de projetos do Dynamo.
Dynamo Consulte os seguintes sites para obter a versão estável mais atual do Dynamo.
http://dynamobim.com/download/ ou http://dynamobuilds.com
*Observação: A partir do Revit 2020, o Dynamo é fornecido com as versões do Revit; portanto, não é necessário fazer a instalação manual. Mais informações estão disponíveis neste post do blog.
DynamoBIM A melhor fonte para obter informações adicionais, conteúdo de aprendizagem e fóruns é o site do DynamoBIM.
http://dynamobim.org
Dynamo GitHub O Dynamo é um projeto de desenvolvimento de código aberto no GitHub. Para contribuir, confira o DynamoDS.
https://github.com/DynamoDS/Dynamo
Contato Informe-nos sobre quaisquer problemas com este documento.
Dynamo@autodesk.com
Copyright 2023 Autodesk
Licenciado com base na licença Apache, versão 2.0 (“Licença”); não é possível usar esse arquivo, exceto em conformidade com a licença. Você pode obter uma cópia da licença em:
http://www.apache.org/licenses/LICENSE-2.0
A menos que seja exigido pela lei aplicável ou estabelecido em acordo por escrito, o software distribuído sob a Licença é distribuído NO ESTADO EM QUE SE ENCONTRA, SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, expressas ou implícitas. Consulte a licença para o idioma específico que controla as permissões e limitações sob a licença.
A interface do usuário (IU) do Dynamo é organizada em cinco regiões principais. Abordaremos brevemente a visão geral aqui e explicaremos melhor sobre o espaço de trabalho e a biblioteca nas seções a seguir.
Menus
Barra de ferramentas
Biblioteca
Área de trabalho
Barra de execução
Confira aqui os menus para a funcionalidade básica do aplicativo Dynamo. Como a maioria dos softwares do Windows, os dois primeiros menus estão relacionados ao gerenciamento de arquivos, às operações de seleção e à edição de conteúdos. Os menus restantes são mais específicos do Dynamo.
As informações gerais e configurações podem ser encontradas no menu suspenso do Dynamo.
Sobre – Descubra a versão do Dynamo instalada no computador.
Contrato para coletar dados de usabilidade – Isso permite que você aceite, ou não, o compartilhamento dos dados de usuário para aprimorar o Dynamo.
Preferências – Inclui configurações como a definição da precisão decimal do aplicativo e a qualidade de renderização da geometria.
Sair do Dynamo
Se você tiver dúvidas, confira o menu Ajuda. Você pode acessar um dos sites de referência do Dynamo através do navegador da Internet.
Introdução – Uma breve introdução sobre o uso do Dynamo.
Guias interativos –
Amostras – Arquivos de exemplo de referência.
Dicionário do Dynamo – Recurso com a documentação sobre todos os nós.
Site do Dynamo – Visualizar o projeto do Dynamo no GitHub.
Wiki do projeto do Dynamo – Visite a wiki para saber como desenvolver usando a API do Dynamo, com suporte a bibliotecas e ferramentas.
Exibir a página inicial – Retorna para a página inicial do Dynamo quando dentro de um documento.
Relatório de um bug – Abre um problema no GitHub.
A barra de ferramentas do Dynamo contém uma série de botões para acesso rápido ao trabalho com arquivos, bem como os comandos Desfazer [Ctrl + Z] e Refazer [Ctrl + Y]. Na parte mais à direita, há outro botão que exporta um instantâneo do espaço de trabalho, o que é extremamente útil para fins de documentação e compartilhamento.
A biblioteca do Dynamo é um conjunto de bibliotecas funcionais e cada biblioteca contém nós agrupados por categoria. Trata-se de bibliotecas básicas que são adicionadas durante a instalação padrão do Dynamo. À medida que desenvolvemos seu uso, demonstraremos como estender a funcionalidade básica com nós personalizados e pacotes adicionais. A seção Biblioteca oferece uma orientação mais detalhada sobre esse uso.
O espaço de trabalho é onde desenvolvemos nossos programas visuais. Também é possível alterar aqui a configuração de visualização para visualizar as geometrias 3D. Consulte Área de trabalho para obter mais detalhes.
Execute o script do Dynamo daqui. Clique no ícone do menu suspenso no botão Executar para alternar entre os diferentes modos.
Automático: executa o script automaticamente. As alterações são atualizadas em tempo real.
Manual: o script somente é executado ao clicar no botão “Executar”. Isso é útil para fazer alterações em scripts “pesados” e complicados.
Periódico: essa opção está desativada por padrão. Somente está disponível quando o nó DateTime.Now é usado. É possível definir o gráfico para ser executado automaticamente em um intervalo especificado.
Este manual inclui capítulos desenvolvidos com a Mode Lab. Esses capítulos têm como foco os elementos essenciais que você precisará para começar a trabalhar desenvolvendo seus próprios programas visuais com o Dynamo e informações importantes sobre como tirar o máximo proveito do Dynamo.
Esse guia foi projetado para atender aos leitores de diferentes níveis de conhecimento e experiência. Uma introdução geral sobre a configuração do Dynamo, a interface do usuário e os principais conceitos pode ser encontrada nas seções a seguir. Recomendamos que os novos usuários consultem os seguintes tópicos:
Para os usuários que desejam desenvolver uma compreensão mais profunda de cada elemento, como um nó específico e o conceito por trás dele, abordamos os fundamentos em um capítulo próprio.
Se você quiser ver a demonstração dos fluxos de trabalho do Dynamo, incluímos alguns gráficos na seção Exemplos de fluxos de trabalho. Siga as instruções anexadas para criar seus próprios gráficos do Dynamo.
Há mais exercícios específicos de tópicos que podem ser encontrados em capítulos posteriores, pois abordamos diferentes tópicos sobre o Dynamo. Os exercícios podem ser encontrados normalmente na última seção de cada página.
O Dynamo não seria o que é sem um forte grupo de usuários ávidos e colaboradores ativos. Participe da comunidade seguindo o blog, adicionando seu trabalho à galeria ou discutindo o Dynamo no fórum.
O Dynamo é idealizado como uma ferramenta de programação visual para os designers, permitindo-nos criar ferramentas que usam bibliotecas externas ou qualquer produto da Autodesk que tenha uma API. Com o Dynamo Sandbox, podemos desenvolver programas em um aplicativo estilo “Sandbox”, mas o ecossistema do Dynamo continua a crescer.
O código-fonte do projeto é de código aberto, o que nos permite estender a funcionalidade conforme desejarmos. Confira o projeto no GitHub e procure os trabalhos em andamento dos usuários personalizando o Dynamo.
Pesquise e comece a estender o Dynamo de acordo com suas necessidades
Desde as suas origens como um complemento para o BIM (Building Information Modeling – Modelagem de informações de construção) no Revit, o Dynamo se tornou muitas coisas. Acima de tudo, tornou-se uma plataforma que permite aos designers explorar a programação visual, resolver problemas e criar suas próprias ferramentas. Vamos começar nossa jornada com o Dynamo contextualizando um pouco: o que é o Dynamo e qual é a abordagem correta para usá-lo?
Como um ambiente de programação visual, o Dynamo permite criar a forma como os dados são processados. Os dados são números ou texto, mas também a geometria. Conforme entendido pelo computador, a geometria (ou às vezes chamada Geometria computacional) são os dados que podemos usar para criar modelos bonitos, intrincados ou orientados para o desempenho. Para fazer isso, precisamos compreender os pontos de entrada e saída dos diferentes tipos de geometria que podemos usar.
Nesta seção, apresentamos os nós essenciais disponíveis na biblioteca do Dynamo que ajudarão você a criar seu próprio programa visual como um profissional.
: Como posso trabalhar com elementos geométricos no Dynamo? Explore várias maneiras de criar geometrias simples ou complexas com base em primitivos.
O que são os “Dados” e quais são alguns tipos fundamentais que posso começar a usar em meus programas? Além disso, saiba mais sobre como incorporar operações de matemática e lógica no fluxo de trabalho do projeto.
Como posso gerenciar e coordenar minhas estruturas de dados? Entenda mais sobre o conceito de lista e use-a para gerenciar os dados do projeto com eficiência.
O que são dicionários? Descubra como usar dicionários para procurar dados e valores específicos nos resultados existentes.
O espaço de trabalho do Dynamo consiste em quatro elementos principais.
Todas as guias ativas.
Modo de visualização
Controles de zoom/pan
Nó no espaço de trabalho
Quando você abre um novo arquivo, um novo espaço de trabalho inicial será aberto por padrão.
Você pode criar um nó personalizado e abri-lo em um espaço de trabalho de nó personalizado.
Somente um espaço de trabalho inicial é permitido em cada janela do Dynamo, mas você pode ter vários espaços de trabalho de nós personalizados abertos em guias.
Há três métodos para alternar entre diferentes visualizações:
a. Use os ícones na parte superior direita
b. Clique com o botão direito do mouse no espaço de trabalho
Alterne a visualização 3D para a visualização de gráfico
Alterne a visualização de gráfico para a visualização 3D
c. c. Use o atalho de teclado (Ctrl+B)
Você pode usar ícones ou um mouse para navegar em qualquer espaço de trabalho.
a. No modo de Visualização de gráfico
Com ícones:
Com o mouse:
Clique com o botão esquerdo do mouse – Selecionar
Clique com o botão esquerdo e arraste a caixa Seleção para selecionar vários pontos.
Role com botão do meio do mouse para cima e para baixo – Aproximar/afastar o zoom
Clique com o botão do meio do mouse e arraste – Pan
Clique com o botão direito do mouse em qualquer lugar na tela – Abrir pesquisa na tela
b. No modo de Visualização 3D
Com ícones:
Com o mouse:
Role com botão do meio do mouse para cima e para baixo – Aproximar/afastar o zoom
Clique com o botão do meio do mouse e arraste – Pan
Clique com o botão direito do mouse e arraste – Órbita
Clique com o botão esquerdo do mouse para selecionar qualquer nó.
Para selecionar vários nós, clique e arraste para criar uma caixa de seleção.
No Dynamo, os Nós são os objetos que você conecta para formar um programa visual. Cada Nó executa uma operação – às vezes pode ser tão simples quanto armazenar um número ou pode ser uma ação mais complexa, como criar ou consultar geometria.
A maioria dos nós no Dynamo são compostos de cinco partes. Embora existam exceções, como os nós de entrada, a anatomia de cada nó pode ser descrita da seguinte maneira:
Nome – O nome do nó com uma convenção de nomenclatura
Category.Name
.Corpo principal – O corpo principal do nó: se clicar aqui com o botão direito do mouse, serão apresentadas opções de todo o nó
Portas (entrada e saída) – Os destinatários dos fios que fornecem os dados de entrada para o nó, assim como os resultados da ação do nó
Valor padrão – Clique com o botão direito do mouse em uma porta de entrada: alguns nós têm valores padrão que podem ser usados ou não.
As entradas e saídas nos nós são chamadas de portas e agem como receptores para os fios. Os dados entram o nó através das portas à esquerda e saem do nó após ele ter executado sua operação à direita.
As portas esperam receber dados de um determinado tipo. Por exemplo, ao conectar um número como 2.75 às portas em um nó Ponto por coordenadas, resultará na criação com êxito de um ponto; no entanto, se fornecermos “Vermelho” à mesma porta, resultará em um erro.
Dica: Passe o cursor do mouse sobre uma porta para ver uma dica de ferramenta contendo o tipo de dados esperado.
Legenda da porta
Dica de ferramenta
Tipo de dados
Valor padrão
O Dynamo fornece uma indicação do estado da execução do programa visual ao renderizar os nós com diferentes esquemas de cores com base no status de cada nó. A hierarquia de estados segue esta sequência: Erro > Aviso > Informações > Visualização.
Quando você passa o cursor do mouse ou clica com o botão direito do mouse sobre o nome ou as portas, serão apresentadas informações e opções adicionais.
Entradas satisfeitas – Um nó com barras verticais azuis sobre suas portas de entrada está bem conectado e tem todas as suas entradas conectadas com êxito.
Entradas não satisfeitas – Um nó com uma barra vertical vermelha sobre uma ou mais portas de entrada precisa ter essas entradas conectadas.
Função – Um nó que gera uma função e tem uma barra vertical cinza sobre uma porta de saída é um nó de função.
Selecionado – Os nós atualmente selecionados têm um realce azul-claro em sua borda.
Congelado – Um nó azul translúcido está congelado, suspendendo a execução do nó.
Aviso – Uma barra de status amarela abaixo do nó indica um estado de aviso, o que significa que o nó não tem dados de entrada ou pode ter tipos de dados incorretos.
Erro – Uma barra de status vermelha abaixo do nó indica que o nó está em um estado de erro
Informações – Uma barra de status azul abaixo do nó indica um estado de informações, que sinaliza informações úteis sobre os nós. Esse estado pode ser acionado ao se aproximar de um valor máximo suportado pelo nó, ao usar um nó de uma forma que tenha possíveis impactos no desempenho, etc.
Dica: Com essa informação da dica de ferramenta, examine os nós a montante para ver se o tipo de dados ou a estrutura de dados necessários apresenta erro.
Dica de ferramenta de aviso – “Nulo” ou nenhum dado não pode ser entendido como um Duplo, ou seja, um número
Use o nó de inspeção para examinar os dados de entrada
A montante do nó de número está indicando “Vermelho”, e não um número
Em algumas situações, você pode desejar impedir a execução de nós específicos no programa visual. É possível fazer isso “congelando” o nó, que é uma opção no menu de contexto do nó.
Congelar um nó também congela os nós que estão a jusante dele. Em outras palavras, todos os nós que dependem da saída de um nó congelado também serão congelados.
Os fios se conectam entre os nós para criar relações e estabelecer o fluxo do nosso programa visual. Podemos pensar neles literalmente como fios elétricos que transmitem impulsos de dados de um objeto para o seguinte.
Os fios conectam a porta de saída de um nó à porta de entrada de outro nó. Essa direcionalidade estabelece o Fluxo de dados no programa visual.
As portas de entrada estão no lado esquerdo e as portas de saída estão localizadas no lado direito dos nós; portanto, geralmente podemos dizer que o fluxo do programa se move da esquerda para a direita.
Crie um fio clicando com o botão esquerdo do mouse em uma porta e, em seguida, clicando com o botão esquerdo do mouse na porta de outro nó para criar uma conexão. Enquanto estamos no processo de criar uma conexão, o fio aparecerá a tracejado e se tornará numa linha contínua quando for conectado com êxito.
Os dados sempre fluirão por esse fio da saída para a entrada; no entanto, podemos criar o fio em qualquer direção em termos da sequência dos cliques nas portas conectadas.
Frequentemente, queremos ajustar o fluxo do programa em nosso programa visual editando as conexões representadas pelos fios. Para editar um fio, clique com o botão esquerdo do mouse na porta de entrada do nó que já está conectado. Você agora tem duas opções:
Para alterar a conexão em uma porta de entrada, clique com o botão esquerdo do mouse em outra porta de entrada
Para remover o fio, afaste o fio e clique com o botão esquerdo do mouse no espaço de trabalho
Reconecte vários fios usando Shift+clique com o botão esquerdo do mouse
Duplique um fio usando Ctrl+clique com o botão esquerdo do mouse
Por padrão, nossos fios serão visualizados com um traço cinza. Quando um nó é selecionado, ele vai renderizar qualquer fio de conexão com o mesmo realce azul-claro do nó.
Fio realçado
Fio padrão
Ocultar fios por padrão
Caso você prefira ocultar os fios no gráfico, pode encontrar essa opção em Vista > Conectores > desmarque Mostrar conectores.
Com essa configuração, somente os nós selecionados e seus fios unidos serão mostrados no realce azul-claro.
Também é possível ocultar somente o fio selecionado clicando com o botão direito do mouse na saída Nós > e selecionando Ocultar fios
A biblioteca contém todos os nós carregados, incluindo os dez nós de categorias padrão que vêm com a instalação, bem como quaisquer nós ou pacotes personalizados carregados adicionalmente. Os nós na biblioteca são organizados hierarquicamente dentro de bibliotecas, categorias e, quando apropriado, subcategorias.
Nós básicos: vêm com a instalação padrão.
Nós personalizados: armazene as rotinas ou gráficos especiais usados com frequência como nós personalizados. Também é possível compartilhar os nós personalizados com a comunidade
Nós do Gerenciador de pacotes: conjunto de nós personalizados publicados.
Navegar por essas categorias é a maneira mais rápida de entender a hierarquia do que podemos adicionar ao nosso espaço de trabalho e a melhor maneira de descobrir novos nós que você não usou antes.
Navegue na biblioteca clicando nos menus para expandir cada categoria e suas subcategorias
Geometria oferece ótimos menus para começar a explorar, pois contêm a maior quantidade de nós.
Biblioteca
Categoria
Subcategoria
Nó
Essas opções categorizam os nós na mesma subcategoria com base na capacidade dos nós criar dados, executar uma ação ou consultar dados.
Passe o cursor do mouse sobre um nó para obter informações mais detalhadas além do nome e do ícone. Isso nos oferece uma maneira rápida de entender o que o nó faz, o que ele exigirá para as entradas e o que ele fornecerá como resultado.
Descrição: descrição de texto simples do nó
Ícone: versão maior do ícone no menu Biblioteca
Entrada(s): nome, tipo de dados e estrutura de dados
Saída(s): tipo de dados e estrutura
Se você souber com algum grau de especificidade qual é o nó que deseja adicionar ao espaço de trabalho, digite no campo Pesquisar para procurar todos os nós correspondentes.
Clique no nó que deseja adicionar ou pressione Enter para adicionar nós realçados ao centro do espaço de trabalho.
Além de usar palavras-chave para tentar localizar nós, podemos digitar a hierarquia separada por um ponto no campo de pesquisa ou com blocos de código (que usam o idioma textual do Dynamo).
A hierarquia de cada biblioteca é refletida no nome dos nós adicionados ao espaço de trabalho.
Se inserir diferentes partes do local do nó na hierarquia da biblioteca no formato library.category.nodeName
, os resultados obtidos serão diferentes
library.category.nodeName
category.nodeName
nodeName
ou keyword
Normalmente, o nome do nó no espaço de trabalho será renderizado no formato category.nodeName
, com algumas exceções notáveis, especialmente nas categorias de entrada e vista.
Tenha atenção aos nós de nome semelhante e observe a diferença de categoria:
Os nós da maioria das bibliotecas incluirão o formato da categoria
Point.ByCoordinates
e UV.ByCoordinates
têm o mesmo nome, mas são provenientes de diferentes categorias
Exceções notáveis incluem funções incorporadas, Core.Input, Core.View e Operators
Com centenas de nós incluídos na instalação básica do Dynamo, quais são essenciais para o desenvolvimento de nossos programas visuais? Vamos nos concentrar naqueles que nos permitem definir os parâmetros do programa (Entrada), ver os resultados de uma ação do nó (Inspeção) e definir entradas ou funcionalidades por meio de um atalho (Bloco de código).
Os nós de entrada são os principais meios para o usuário do nosso Programa visual, seja você mesmo ou outra pessoa, fazer a interface com os parâmetros mais importantes. Confira alguns exemplos disponíveis na biblioteca principal:
Os nós de inspeção são essenciais para gerenciar os dados que fluem através do Programa visual. É possível visualizar o resultado de um nó através da visualização dos dados do nó passando o cursor do mouse sobre o nó.
É útil manter a exibição dessas informações em um nó de Inspeção
Ou consultar os resultados da geometria através de um nó Watch3D.
Ambos são encontrados na categoria da vista na biblioteca principal.
Dica: Às vezes, a visualização 3D pode causar distrações, quando o Programa visual contém muitos nós. Considere desmarcar a opção Exibir visualização de plano de fundo no menu Configurações e usar um nó Watch3D para visualizar a geometria.
Os nós Code Block podem ser utilizados para definir um Code Block com linhas separadas por ponto e vírgula. Isso pode ser tão simples quanto X/Y
.
Confira aqui uma demonstração simples (com instruções) para usar o Bloco de código no script.
Clique duas vezes para criar um nó de bloco de código
Circle.ByCenterPointRadius(x,y);
Type
Clique no espaço de trabalho para limpar a seleção e adicionar as entradas x
e y
automaticamente.
Crie um nó Point.ByCoordinates e um controle deslizante de número e, em seguida, conecte-os às entradas do Bloco de código.
O resultado da execução do Programa visual é mostrado como o círculo na visualização 3D
Este índice fornece informações adicionais sobre todos os nós usados neste manual de introdução, bem como outros componentes que você pode considerar úteis. Esta é apenas uma introdução a alguns dos 500 nós disponíveis no Dynamo.
**Em outras palavras, se você criar um comprimento de largura de Cuboide (eixo X) 10 e transformá-lo em um CoordinateSystem com dimensionamento de 2 vezes em X, a largura ainda será 10. O ASM não permite extrair os vértices de um corpo em nenhuma ordem previsível; portanto, é impossível determinar as cotas após uma transformação.
Para começar a usar, inicie-o no painel da barra de ferramentas. Dependendo do software que você está usando, o ícone de inicialização normalmente pode ser encontrado na guia Menu > Gerenciar. Clique no ícone do Dynamo para iniciá-lo.
Novo – Criar um novo arquivo .dyn
Abrir – Abrir um arquivo .dyn (espaço de trabalho) ou .dyf (nó personalizado) existente
Salvar/Salvar como – Salvar o arquivo .dyn ou .dyf ativo
Desfazer – Desfaz a última ação
Refazer – Refaz a próxima ação
Exportar espaço de trabalho como imagem – Exporta o espaço de trabalho visível como um arquivo PNG
Visualização de gráfico
Visualização 3D
Zoom para ajustar
Aumentar o zoom
Diminuir o zoom
Efetuar panorâmica
Zoom para ajustar
Aumentar o zoom
Diminuir o zoom
Efetuar panorâmica
Orbitar
Ícone de amarra – Indica a especificada para as entradas de lista coincidentes (mais informações adiante)
Visualização desativada – Uma barra de status cinza abaixo do nó e um ícone de olho indicam que a visualização da geometria do nó está desativada.
Se o programa visual tiver avisos ou erros, o Dynamo fornecerá informações adicionais sobre o problema. Qualquer nó exibido em amarelo também terá uma dica de ferramenta acima do nome. Passe o cursor do mouse sobre o ícone de dica de ferramenta de aviso ou erro para expandi-lo.
Vamos abordar as categorias da , mostrar como é possível e saber mais sobre alguns dos .
Criar: criar ou construir uma geometria do zero. Por exemplo, um círculo.
Ação: executar uma ação em um objeto. Por exemplo, dimensionar um círculo.
Consulta: obter uma propriedade de um objeto que já existe. Por exemplo, obter o raio de um círculo.
Também é possível usar os blocos de código como um atalho para definir uma entrada de número ou acionar outra funcionalidade do nó. A sintaxe para fazer isso segue a convenção de nomenclatura da linguagem textual do Dynamo, .
Booleano
Número
Sequência de caracteres
Controle deslizante de números
Caminho do diretório
Controle deslizante de números inteiros
Caminho do arquivo
CRIAR
Color.ByARGB Crie uma cor usando os componentes alfa, vermelho, verde e azul.
Faixa de cores Obtenha uma cor de um gradiente de cores entre uma cor inicial e uma cor final.
AÇÕES
Color.Brightness Retorna o valor de brilho dessa cor.
Color.Components Lista os componentes da cor na ordem: alfa, vermelho, verde, azul.
Color.Saturation Retorna o valor de saturação dessa cor.
Color.Hue Retorna o valor de matiz desda cor.
CONSULTA
Color.Alpha Localize o componente alfa de uma cor, 0 a 255.
Color.Blue Localize o componente azul de uma cor, 0 a 255.
Color.Green Localize o componente verde de uma cor, 0 a 255.
Color.Red Localize o componente vermelho de uma cor, 0 a 255.
CRIAR
GeometryColor.ByGeometryColor Exibe a geometria usando uma cor.
AÇÕES
View.Watch Visualize a saída do nó.
View.Watch 3D Mostra uma visualização dinâmica da geometria.
AÇÕES
Booleano Seleção entre verdadeiro e falso.
Bloco de código Permite que o código DesignScript seja criado diretamente.
Caminho do diretório Permite selecionar um diretório no sistema para obter o caminho
Caminho do arquivo Permite selecionar um arquivo no sistema para obter o nome do arquivo.
Controle deslizante de números inteiros Um controle deslizante que produz valores inteiros.
Número Cria um número.
Controle deslizante de números Um controle deslizante que produz valores numéricos.
Sequência de caracteres Cria uma cadeia de caracteres.
Object.IsNull Determina se o objeto determinado é nulo.
CRIAR
List.Create Cria uma nova lista com base nas entradas fornecidas.
List.Combine Aplica um combinador a cada elemento em duas sequências
Intervalo de números Cria uma sequência de números no intervalo especificado.
Sequência de números Cria uma sequência de números.
AÇÕES
List.Chop Divida uma lista em um conjunto de listas que contêm a quantidade determinada de itens.
List.Count Retorna o número de itens armazenados na lista determinada.
List.Flatten Mescla uma lista de listas aninhada por um determinado valor.
List.FilterByBoolMask Filtra uma sequência examinando os índices correspondentes em uma lista separada de booleanos.
List.GetItemAtIndex Retorna um item da lista fornecida que está localizada no índice especificado.
List.Map Aplica uma função em todos os elementos de uma lista, gerando uma nova lista com base nos resultados
List.Reverse Cria uma nova lista que contém os itens da lista determinada, mas na ordem inversa
List.ReplaceItemAtIndex Substitua um item da lista determinada que está localizada no índice especificado
List.ShiftIndices Troca os índices da lista à direita pelo valor fornecido
List.TakeEveryNthItem Obtém os itens da lista fornecida em índices que são múltiplos do valor fornecido, após o deslocamento fornecido.
List.Transpose Troca as linhas e as colunas de uma lista de listas. Se houver algumas linhas mais curtas do que outras, os valores nulos serão inseridos como espaços reservados na matriz resultante de forma que ela seja sempre retangular
AÇÕES
Se Declaração condicional. Verifica o valor booleano da entrada de teste. Se a entrada de teste for verdadeira, o resultado retornará a entrada verdadeira. Caso contrário, o resultado retornará a entrada falsa.
AÇÕES
Math.Cos Retorna o cosseno de um ângulo.
Math.DegreesToRadians Converte um ângulo em graus em um ângulo em radianos.
Math.Pow Eleva um número à potência especificada.
Math.RadiansToDegrees Converte um ângulo em radianos em um ângulo em graus.
Math.RemapRange Ajusta o intervalo de uma lista de números, preservando o coeficiente de distribuição.
Math.Sin Localiza o seno de um ângulo.
Fórmula Avalia fórmulas matemáticas. Usa NCalc para a avaliação. Consulte http://ncalc.codeplex.com
Mapa Mapeia um valor para um intervalo de entrada
AÇÕES
String.Concat Concatena várias sequências de caracteres em uma única sequência de caracteres.
String.Contains Determina se a sequência de caracteres fornecida contém a subsequência de caracteres determinada.
String.Join Concatena várias sequências de caracteres em uma única sequência de caracteres, inserindo o separador fornecido entre cada sequência de caracteres unida.
String.Split Divide uma única sequência de caracteres em uma lista de sequência de caracteres, com as divisões determinadas pelas sequências de caracteres fornecidas do separador.
String.ToNumber Converte uma sequência de caracteres em um número inteiro ou um duplo.
CRIAR
Circle.ByCenterPointRadius Cria um círculo com o ponto central de entrada e o raio no plano XY universal, com o Z universal como normal.
Circle.ByPlaneRadius Crie um círculo centralizado na origem do plano de entrada (raiz), que reside no plano de entrada, com o raio especificado.
CRIAR
CoordinateSystem.ByOrigin Crie um CoordinateSystem com origem no ponto de entrada, com os eixos X e Y definidos como eixos X e Y do sistema de coordenadas universal.
CoordinateSystem.ByCyclindricalCoordinates Cria um CoordinateSystem nos parâmetros de coordenadas cilíndricas especificadas com relação ao sistema de coordenadas especificado
CRIAR
Cuboid.ByLengths Cria um cuboide centralizado com origem no sistema de coordenadas universal e com largura, comprimento e altura.
Cuboid.ByLengths (origem)
Crie um cuboide centralizado no ponto de entrada, com largura, comprimento e altura especificadas.
Cuboid.ByLengths (coordinateSystem)
Cria um cuboide centralizado com origem no sistema de coordenadas universal e com largura, comprimento e altura.
Cuboid.ByCorners
Cria um cuboide que se estende do ponto baixo ao ponto alto.
Cuboid.Length
Retorna as cotas de entrada do Cuboide e NÃO as cotas reais do espaço universal. **
Cuboid.Width
Retorna as cotas de entrada do Cuboide e NÃO as cotas reais do espaço universal. **
Cuboid.Height
Retorna as cotas de entrada do Cuboide e NÃO as cotas reais do espaço universal. **
BoundingBox.ToCuboid
Retorna a caixa delimitadora como um cuboide de sólido.
AÇÕES
Curve.Extrude (distância) Efetua a extrusão de uma curva na direção do vetor normal.
Curve.PointAtParameter Obtenha um ponto na curva com um parâmetro especificado entre StartParameter() e EndParameter().
AÇÕES
Geometry.DistanceTo Obtenha a distância dessa geometria até outra.
Geometry.Explode Separa elementos compostos ou não separados em suas partes do componente.
Geometry.ImportFromSAT Lista de geometrias importadas
Geometry.Rotate (basePlane) Rotaciona o objeto em torno da origem e normal do plano por um grau especificado.
Geometry.Translate Converte qualquer tipo de geometria pela distância fornecida na direção determinada.
CRIAR
Line.ByBestFitThroughPoints Cria uma linha que melhor se aproxima à dispersão de uma plotagem de pontos.
Line.ByStartPointDirectionLength Crie uma linha reta começando no ponto e estendendo-se na direção do vetor pelo comprimento especificado.
Line.ByStartPointEndPoint Cria uma linha reta entre dois pontos de entrada.
Line.ByTangency Crie uma linha tangente à curva de entrada, posicionada no ponto do parâmetro da curva de entrada.
CONSULTA
Line.Direction A direção da curva.
Criar
NurbsCurve.ByControlPoints Crie uma BSplineCurve usando pontos de controle explícitos.
NurbsCurve.ByPoints Crie uma BSplineCurve interpolando entre os pontos
Criar
NurbsSurface.ByControlPoints Crie uma NurbsSurface usando pontos de controle explícitos com os graus U e V especificados.
NurbsSurface.ByPoints Cria uma NurbsSurface com os graus U e V e pontos interpolados especificados. A superfície resultante passará por todos os pontos.
CRIAR
Plane.ByOriginNormal Crie um plano centralizado no ponto raiz, com o vetor normal de entrada.
Plane.XY Cria um plano no XY universal
CRIAR
Point.ByCartesianCoordinates Forme um ponto em um determinado sistema de coordenadas com três coordenadas cartesianas
Point.ByCoordinates (2d) Forme um ponto no plano XY com base em duas coordenadas cartesianas fornecidas. O componente Z é 0.
Point.ByCoordinates (3d) Forme um ponto com três coordenadas cartesianas fornecidas.
Point.Origin Obtenha o ponto de origem (0,0,0)
AÇÕES
Point.Add Adicione um vetor a um ponto. O mesmo que Converter (vetor).
CONSULTA
Point.X Obtenha o componente X de um ponto
Point.Y Obtenha o componente Y de um ponto
Point.Z Obtenha o componente Z de um ponto
CRIAR
Polycurve.ByPoints Crie a PolyCurve com base na sequência de linhas que conectam os pontos. Para a curva fechada, o último ponto deve estar na mesma localização que o ponto inicial.
CRIAR
Rectangle.ByWidthLength (Plano) Crie um retângulo centralizado na raiz do plano de entrada, com a largura (tamanho do eixo X do plano) e o comprimento (tamanho do eixo Y do plano) de entrada.
CRIAR
Sphere.ByCenterPointRadius Crie uma esfera sólida centralizada no ponto de entrada, com o raio especificado.
CRIAR
Surface.ByLoft Crie uma superfície efetuando a elevação entre as curvas de seção transversal de entrada.
Surface.ByPatch Crie uma superfície preenchendo o interior de um contorno fechado definido por curvas de entrada.
AÇÕES
Surface.Offset Desloque a superfície na direção da normal da superfície pela distância especificada.
Surface.PointAtParameter Retorne o ponto nos parâmetros U e V especificados.
Surface.Thicken Torne mais espessa a superfície em um sólido, efetuando a extrusão na direção de normais de superfície em ambos os lados da superfície.
CRIAR
UV.ByCoordinates Crie um UV com base em dois duplos.
CRIAR
Vector.ByCoordinates Forme um vetor com três coordenadas euclidianas
Vector.XAxis Retorna o vetor do eixo X canônico (1,0,0)
Vector.YAxis Retorna o vetor do eixo Y canônico (0,1,0)
Vector.ZAxis Retorna o vetor do eixo Z canônico (0,0,1)
AÇÕES
Vector.Normalized Obtenha a versão normalizada de um vetor
CRIAR
CoordinateSystem.ByOrigin Crie um CoordinateSystem com origem no ponto de entrada, com os eixos X e Y definidos como eixos X e Y do sistema de coordenadas universal.
CoordinateSystem.ByCyclindricalCoordinates Cria um CoordinateSystem nos parâmetros de coordenadas cilíndricas especificadas com relação ao sistema de coordenadas especificado
+ Adição
- Subtração
* Multiplicação
/ Divisão
% A divisão modular localiza o resto da primeira entrada após dividir pela segunda entrada
< Menor que
> Maior que
== Testes de igualdade entre dois valores.
Um ponto é definido por nada mais que um ou mais valores chamados coordenadas. A quantidade de valores de coordenadas que precisamos para definir o ponto depende do sistema de coordenadas ou do contexto em que ele se encontra.
O tipo mais comum de ponto no Dynamo existe em nosso Sistema de coordenadas universais tridimensional e tem três coordenadas [X,Y,Z] (Ponto 3D no Dynamo).
Um ponto 2D no Dynamo tem duas coordenadas [X,Y].
Os parâmetros para curvas e superfícies são contínuos e se estendem além da aresta da geometria fornecida. Como as formas que definem o espaço paramétrico residem em um Sistema de coordenadas universais tridimensional, sempre podemos converter uma coordenada paramétrica em uma coordenada “Universal”. O ponto [0,2; 0,5] na superfície, por exemplo, é o mesmo que o ponto [1,8; 2,0; 4,1] nas coordenadas universais.
Ponto em coordenadas XYZ universais assumidas
Ponto relativo a um determinado sistema de coordenadas (cilíndrico)
Ponto como coordenada UV em uma superfície
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Se a geometria é o idioma de um modelo, então os pontos são o alfabeto. Os pontos são a fundação na qual todas as outras geometrias são criadas: precisamos de ao menos dois pontos para criar uma curva, precisamos de ao menos três pontos para criar um polígono ou uma face de malha, e assim por diante. A definição de posição, ordem e relação entre os pontos (tente uma função de seno) nos permite definir uma geometria de ordem superior como as coisas que reconhecemos como círculos ou curvas.
Um círculo que usa as funções
x=r*cos(t)
ey=r*sin(t)
Uma curva senoidal que usa as funções
x=(t)
ey=r*sin(t)
Os pontos também podem existir em um sistema de coordenadas bidimensional. A convenção tem uma notação de letra diferente dependendo do tipo de espaço com que estamos trabalhando: podemos usar [X,Y] em um plano ou [U,V] se estivermos em uma superfície.
Um ponto no Sistema de coordenadas euclidianas: [X,Y,Z]
Um ponto em um sistema de coordenadas de parâmetro de curva: [t]
Um ponto em um sistema de coordenadas de parâmetro de superfície: [U,V]
Geometria é a linguagem da área de design. Quando uma linguagem de programação ou ambiente tem um kernel de geometria em seu núcleo, podemos explorar as possibilidades de projetar modelos precisos e robustos, automatizando rotinas de projeto e gerando iterações de projeto com algoritmos.
A compreensão dos tipos de geometria e como eles estão relacionados permitirá navegar no conjunto de Nós de geometria disponíveis na biblioteca. Os nós de geometria são organizados em ordem alfabética, ao contrário da hierarquia; aqui eles são exibidos de forma similar ao layout na interface do Dynamo.
Além disso, a criação de modelos no Dynamo e conexão da visualização de plano fundo ao fluxo de dados em nosso gráfico são processos que devem se tornar mais intuitivos com o passar do tempo.
Observe o sistema de coordenadas assumido renderizado pela grade e pelos eixos coloridos
Os nós selecionados irão renderizar a geometria correspondente (se o nó criar geometria) no plano de fundo, a cor de realce
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
A geometria, tradicionalmente definida, é o estudo de forma, tamanho, posição relativa das imagens e as propriedades de espaço. Este campo tem uma história rica que remonta a milhares de anos. Com o advento e a popularização do computador, ganhamos uma poderosa ferramenta na definição, na exploração e na geração de geometria. Agora é muito fácil calcular o resultado de interações geométricas complexas, o fato de que estamos fazendo isso é quase transparente.
Se você tem curiosidade em descobrir como a geometria pode ser diversa e complexa com o poder do computador, faça uma pesquisa rápida pelo Stanford Bunny, um modelo tradicional usado para testar algoritmos.
Compreender a geometria no contexto de algoritmos, computação e complexidade pode parecer desafiador. No entanto, há alguns princípios-chave e relativamente simples que podemos estabelecer como fundamentos para começar a construção em aplicativos mais avançados:
A geometria corresponde a dados: para o computador e o Dynamo, um modelo Bunny não é tão diferente de um número.
A geometria depende da abstração: fundamentalmente, os elementos geométricos são descritos por números, relações e fórmulas em um determinado sistema de coordenadas espaciais
A geometria possui uma hierarquia: os pontos são reunidos para criar linhas, as linhas se unem para criar superfícies, e assim por diante
A geometria descreve simultaneamente a parte e o todo: quando uma curva é exibida, ela tem a forma e todos os pontos possíveis ao longo dela
Na prática, esses princípios significam que precisamos estar cientes do material com o qual estamos trabalhando (com que tipo de geometria, como ela foi criada, etc.) para que possamos compor, decompor e recompor de forma fluida diferentes geometrias à medida que desenvolvemos modelos mais complexos.
Vamos separar um momento para analisar a relação entre as descrições de geometria abstrata e hierárquica. Como esses dois conceitos estão relacionados, mas nem sempre são óbvios no início, podemos chegar rapidamente a um bloco de estradas conceitual quando começamos a desenvolver fluxos de trabalho ou modelos mais profundos. Para começar, vamos usar a cotagem como um descritor fácil do "material" que modelamos. O número de cotas necessárias para descrever uma forma nos dá uma ideia sobre como a geometria é organizada hierarquicamente.
Um Ponto (definido por coordenadas) não possui dimensões, apenas números que descrevem cada coordenada
Uma Linha (definida por dois pontos) agora tem uma cota: é possível “navegar” na linha para frente (direção positiva) ou para trás (direção negativa)
Um Plano (definido por duas linhas) tem duas dimensões: agora é possível andar mais para a esquerda ou mais para a direita
Uma Caixa (definida por dois planos) tem três dimensões: podemos definir uma posição com relação para cima ou para baixo
A cotagem é uma forma conveniente de começar a classificar a geometria, mas não é necessariamente a melhor. Afinal, não modelamos apenas com pontos, linhas, planos e caixas; e se eu quiser algum modelo curvado? Além disso, há toda uma outra categoria de tipos de geometria que é completamente abstrata, ou seja, define propriedades como orientação, volume ou relações entre as peças. Não podemos considerar um vetor, e então como o definimos em relação ao que vemos no espaço? Uma categorização mais detalhada da hierarquia geométrica deve acomodar a diferença entre Tipos abstratos ou “Auxiliares”, cada um dos quais podemos agrupar pelo que eles ajudam a fazer e os tipos que ajudam a descrever a forma dos elementos do modelo.
A criação de modelos no Dynamo não se limita ao que podemos gerar com Nós. Aqui estão algumas maneiras importantes de levar o processo para o próximo nível com a Geometria:
O Dynamo permite importar arquivos: tente usar um CSV para nuvens de pontos ou SAT para trazer superfícies
Quando trabalhamos com o Revit, podemos referenciar os elementos do Revit para usar no Dynamo
O Dynamo Package Manager oferece funcionalidade adicional para tipos e operações estendidos de geometria: verifique o pacote Kit de ferramentas de malha
Vetor é uma representação de magnitude e direção. É possível visualizá-lo como uma seta que acelera em uma determinada direção em uma velocidade especificada. É um componente-chave para os nossos modelos no Dynamo. Observe que, como eles estão na categoria Abstrata de “Auxiliares”, quando criamos um vetor, não veremos nada na Visualização do plano de fundo.
Podemos usar uma linha como suporte para uma visualização de Vetor.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Plano é uma superfície bidimensional. É possível imaginá-lo como uma superfície plana que se estende indefinidamente. Cada plano tem uma Origem, Direção X, Direção Y e uma Direção Z (para cima).
Embora sejam abstratos, os planos têm uma posição de origem para que possam ser localizados no espaço.
No Dynamo, os planos são renderizados na Visualização de plano de fundo.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Sistema de coordenadas é um sistema para determinar a localização de pontos ou outros elementos geométricos. A imagem abaixo explica como o sistema de coordenadas é exibido no Dynamo e o que cada cor representa.
Embora sejam abstratos, os sistemas de coordenadas também têm uma posição de origem para que possamos localizá-los no espaço.
No Dynamo, os sistemas de coordenadas são renderizados na visualização do plano de fundo como um ponto (origem) e linhas que definem os eixos (X é vermelho, Y é verde e Z é azul, seguindo a convenção).
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Vetores, Planos e Sistemas de coordenadas constituem o grupo principal de Tipos de geometria abstratos. Eles nos ajudam a definir a localização, a orientação e o contexto espacial para outra geometria que descreva as formas. Se eu disser que estou em Nova Iorque, na rua 42nd e Broadway (Sistema de Coordenadas), de pé no nível da rua (Plano), olhando para o norte (Vetor), acabei de usar essas "Ajudas" para definir onde estou. O mesmo vale para um produto de caso de telefone ou um arranha-céu. Precisamos desse contexto para desenvolver nosso modelo.
Um vetor é uma quantidade geométrica que descreve a direção e a magnitude. Os vetores são abstratos; isto é, eles representam uma quantidade, e não um elemento geométrico. Os vetores podem ser facilmente confundidos com pontos porque ambos são compostos por uma lista de valores. No entanto, há uma diferença fundamental: os pontos descrevem uma posição em um determinado sistema de coordenadas, enquanto os vetores descrevem uma diferença relativa na posição, o que é o mesmo que dizer “direção”.
Se a ideia de diferença relativa for confusa, pense no vetor AB como “Estou de pé no ponto A, olhando em direção ao ponto B”. A direção, daqui (A) até lá (B), é o nosso vetor.
Dividindo os vetores em suas partes, usando a mesma notação AB:
O Ponto inicial do vetor é chamado Base.
O *Ponto final **do vetor é chamado Ponta ou Sentido.
O vetor AB não é o mesmo que o vetor BA, que apontaria na direção oposta.
Se você precisar de uma anedota no que diz respeito aos vetores (e sua definição abstrata), veja a comédia clássica Airplane e ouça o diálogo engraçado:
Roger, Roger. Qual é o nosso vetor, Victor?
Os planos são "Ajudas" abstratas bidimensionais. Mais especificamente, os planos são conceitualmente "planos", estendendo-se infinitamente em duas direções. Normalmente, eles são renderizados como um retângulo menor perto de sua origem.
Você pode estar pensando: “Espere um segundo. Origem? Isso parece um sistema de coordenadas... como o que eu uso para modelar no meu software CAD!"
E você está correto! A maioria dos softwares de modelagem tira proveito dos planos de construção ou "níveis" para definir um contexto de duas dimensões locais na qual a inclinação será desenhada. XY, XZ, YZ, ou: Norte, Sudoeste, o plano pode parecer mais familiar. Todos esses são os Planos, definindo um contexto "plano" infinito. Os planos não têm profundidade, mas eles nos ajudam a descrever a direção também -
Se estivermos confortáveis com o conceito de planos, estamos a um pequeno passo de entender os sistemas de coordenadas. Um plano tem todas as mesmas peças que um sistema de coordenadas, desde que seja um sistema de coordenadas padrão "Euclidean" ou "XYZ".
No entanto, há outros sistemas de coordenadas alternativos como Cilíndricos ou Esféricos. Como veremos em seções posteriores, os sistemas de coordenadas também podem ser aplicados a outros tipos de geometria para definir uma posição naquela geometria.
Adicionar sistemas de coordenadas alternativos: cilíndricos, esféricos
As curvas são o primeiro tipo de dados geométricos que abordamos com um conjunto mais familiar de propriedades descritivas de forma: em que medida elas são mais curvas ou retas? Longas ou curtas? E lembre-se de que os Pontos ainda são os nossos blocos de construção para definir qualquer coisa, desde uma linha a uma spline e todos os tipos de curva entre elas.
Linha
Polilinha
Arco
Circle
Elipse
Curva NURBS
PolyCurve
NURBS é um modelo usado para representar curvas e superfícies com precisão. Uma curva senoidal no Dynamo usando dois métodos diferentes para criar curvas NURBS para comparar os resultados.
NurbsCurve.ByControlPoints usa a lista de pontos como pontos de controle
NurbsCurve.ByPoints desenha uma curva através da lista de pontos
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
O termo Curve é um termo mais abrangente que engloba todas as diferentes formas curvas (mesmo se forem retas). A curva capital “C” é a categorização principal para todos esses tipos de forma: linhas, círculos, splines, etc. Tecnicamente, uma curva descreve cada ponto possível que possa ser encontrado inserindo “t” em um conjunto de funções, que podem variar desde funções simples (x = -1.26*t, y = t
) a funções que envolvam cálculos. Não importa com que tipo de curva estamos trabalhando, este Parâmetro chamado “t” é uma propriedade que podemos avaliar. Além disso, independentemente da aparência da forma, todas as curvas também têm um ponto inicial e um ponto final, que coincidem com os valores mínimo e máximo de “t” usados para criar a curva. Isso também nos ajuda a compreender sua direcionalidade.
É importante observar que o Dynamo assume que o domínio dos valores “t” de uma curva é compreendido entre 0,0 e 1,0.
Todas as curvas também possuem diversas propriedades ou características que podem ser usadas para descrever ou analisar. Quando a distância entre os pontos inicial e final for zero, a curva será "fechada". Além disso, cada curva tem vários pontos de controle, se todos esses pontos estão localizados no mesmo plano, a curva é "plana". Algumas propriedades se aplicam à curva como um todo, enquanto outras somente se aplicam a pontos específicos ao longo da curva. Por exemplo, a planaridade é uma propriedade global, enquanto um vetor tangente em um determinado valor "t" é uma propriedade local.
As Linhas são a forma mais simples de Curvas. Podem não parecer curvas, mas na verdade são: apenas sem qualquer curvatura. Existem algumas maneiras diferentes de criar Linhas, sendo a mais intuitiva do ponto A ao ponto B. A forma da linha AB será desenhada entre os pontos, mas matematicamente ela se estende infinitamente em ambas as direções.
Quando nós conectamos duas linhas, temos uma Polilinha. Aqui temos uma representação simples do que é um Ponto de controle. Editar qualquer uma dessas localizações de ponto irá alterar a forma da D. Se a polilinha estiver fechada, temos um polígono. Se os comprimentos de aresta do polígono forem todos iguais, ele será descrito como normal.
À medida que adicionamos mais complexidade às funções paramétricas que definem uma forma, podemos avançar mais uma etapa a partir de uma linha para criar um Arco, Círculo, Arco de elipse ou Ellipse descrevendo um ou dois raios. As diferenças entre a versão do arco e o círculo ou elipse são apenas se a forma está fechada.
NURBS (Splines de base racional não uniforme) são representações matemáticas que podem modelar com precisão qualquer forma, desde uma linha simples bidimensional, um círculo, um arco ou um retângulo até a curva orgânica tridimensional mais complexa e de forma livre. Devido à sua flexibilidade (relativamente poucos pontos de controle, mas interpolação suave com base nas configurações de grau) e precisão (delimitado por uma matemática robusta), os modelos NURBS podem ser usados em qualquer processo, da ilustração e animação à fabricação.
Grau: o grau da curva determina o intervalo de influência que os pontos de controle têm em uma curva; quanto maior for o grau, maior será o intervalo. O grau é um número inteiro positivo. Este número é normalmente 1, 2, 3 ou 5, mas pode ser qualquer número inteiro positivo. As linhas e polilinhas NURBS são normalmente de grau 1 e a maioria das curvas de forma livre é de graus 3 ou 5.
Pontos de controle: os pontos de controle são uma lista de ao menos pontos de graus + 1. Uma das formas mais fáceis de alterar a forma de uma curva NURBS é mover seus Pontos de controle.
Peso: os pontos de controle têm um número associado denominado Peso. Os pesos são, normalmente, números positivos. Quando os Pontos de controle de uma curva têm o mesmo peso (normalmente 1), a Curva é chamada não racional, caso contrário, a Curva é chamada racional. A maioria das curvas NURBS é não racional.
Nós: os nós são uma lista de números (graus+N-1), em que N é o número de pontos de controle. Os nós são usados junto com os pesos para controlar a influência dos Pontos de controle na curva resultante. Um uso dos nós é a criação de pontos de inflexão em certos pontos da curva.
Grau = 1
Grau = 2
Grau = 3
Observe que quanto maior for o valor do grau, mais pontos de controle serão usados para interpolar a curva resultante.
Usamos Superfície no modelo para representar objetos que vemos em nosso mundo tridimensional. Embora as curvas nem sempre sejam planas, ou seja, sejam tridimensionais, o espaço que elas definem estará sempre vinculado a uma cota. As superfícies proporcionam outra dimensão e um conjunto de propriedades adicionais que podemos usar em outras operações de modelagem.
Importe e avalie uma superfície em um parâmetro no Dynamo para ver o tipo de informações que podemos extrair.
Surface.PointAtParameter retorna o ponto em uma determinada coordenada UV
Surface.NormalAtParameter retorna o vetor normal em uma determinada coordenada UV
Surface.GetIsoline retorna a curva isoparamétrica em uma coordenada U ou V: observe a entrada isoDirection.
Faça o download dos arquivos de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Uma superfície é uma forma matemática definida por uma função e dois parâmetros. Em vez de t
para curvas, usamos U
e V
para descrever o espaço de parâmetro correspondente. Isso significa que temos mais dados geométricos para desenhar ao trabalhar com este tipo de geometria. Por exemplo, as curvas apresentam vetores tangentes e planos normais (que podem ser rotacionados ou girados ao longo do comprimento da curva), enquanto as superfícies apresentam vetores normais e planos tangentes que são consistentes na sua orientação.
Superfície
Isocurva U
Isocurva V
Coordenada UV
Plano perpendicular
Vetor normal
Surface Domain: um domínio de superfície é definido como o intervalo de parâmetros (U,V) que são avaliados em um ponto tridimensional naquela superfície. O domínio em cada cota (U ou V) normalmente é descrito como dois números (U mín a U máx) e (V mín a V máx).
Embora a forma da superfície não pareça “retangular” e localmente possa haver um conjunto de isocurvas mais rígido ou mais solto, o “espaço” definido por seu domínio é sempre bidimensional. No Dynamo, as superfícies sempre são consideradas como tendo um domínio definido por um mínimo de 0,0 e um máximo de 1,0 nas direções U e V. As superfícies planas ou aparadas podem apresentar diferentes domínios.
Isocurva (ou curva isoparamétrica): uma curva definida por um valor U ou V constante na superfície e um domínio de valores para a outra direção U ou V correspondente.
Coordenada UV: o ponto no espaço de parâmetro UV definido por U, V e, às vezes, W.
Plano perpendicular: um plano que é perpendicular às Isocurvas U e V em uma determinada coordenada UV.
Vetor normal: um vetor que define a direção “para cima” em relação ao plano perpendicular.
As superfícies NURBS são muito similares às curvas NURBS. É possível considerar as superfícies NURBS como uma grade de curvas NURBS que estão em duas direções. A forma de uma superfície NURBS é definida por um número de pontos de controle e o grau da superfície nas direções U e V. Os mesmos algoritmos são usados para calcular a forma, as normais, as tangentes, as curvaturas e outras propriedades por meio de pontos de controle, espessuras e graus.
No caso de superfícies NURBS, há duas direções implícitas pela geometria, porque as superfícies NURBS são, independentemente da forma que vemos, grades retangulares de pontos de controle. E, embora essas direções sejam muitas vezes arbitrárias em relação ao sistema de coordenadas universal, nós as usaremos com frequência para analisar nossos modelos ou gerar outra geometria com base na superfície.
Grau (U,V) = (3,3)
Grau (U,V) = (3,1)
Grau (U,V) = (1,2)
Grau (U,V) = (1,1)
As Polysurfaces são compostas por superfícies que são unidas através de uma aresta. As Polysurfaces oferecem muito mais do que uma definição UV bidimensional, pois agora podemos percorrer as formas conectadas por meio de sua topologia.
Embora “Topologia” geralmente descreva um conceito sobre como as peças são conectadas e/ou relacionadas, a topologia no Dynamo também é um tipo de geometria. Especificamente, é uma categoria principal para Superfícies, Polysurfaces e Sólidos.
Às vezes chamada de patches, a união de superfícies dessa maneira permite criar formas mais complexas, além de definir detalhes na junção. Convenientemente, podemos aplicar uma operação de arredondamento ou chanfro às arestas de uma PolySurface.
Se quisermos criar modelos mais complexos que não possam ser criados com base em uma única superfície ou se desejarmos definir um volume explícito, agora precisaremos nos aventurar no domínio dos sólidos (e das Polysurfaces). Até mesmo um cubo simples é suficientemente complexo para precisar de seis superfícies, uma por face. Os sólidos dão acesso a dois conceitos-chave que as superfícies não têm: uma descrição topológica mais refinada (faces, arestas, vértices) e operações booleanas.
É possível usar operações booleanas para modificar os sólidos. Vamos usar algumas operações booleanas para criar uma bola pontiaguda.
Sphere.ByCenterPointRadius: crie o sólido da base.
Topology.Faces, Face.SurfaceGeometry: consulte as faces do sólido e converta-as em geometria da superfície. Neste caso, a esfera tem apenas uma face.
Cone.ByPointsRadii: crie cones usando pontos na superfície.
Solid.UnionAll: una os cones e a esfera.
Topology.Edges: consulte as arestas do novo sólido
Solid.Fillet: arredonde as arestas da esfera pontiaguda
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
As operações booleanas são complexas e seu cálculo pode ser lento. É possível usar a funcionalidade “congelar” para suspender a execução dos nós selecionados e dos nós a jusante afetados.
1. Use o menu de contexto do botão direito do mouse para congelar a operação de União de sólidos
2. O nó selecionado e todos os nós a jusante serão visualizados em um modo duplicado cinza claro, e os fios afetados serão exibidos como linhas tracejadas. A visualização da geometria afetada também será duplicada. Agora é possível alterar os valores anteriores sem calcular a união booleana.
3. Para descongelar os nós, clique com o botão direito do mouse e desmarque Congelar.
4. Todos os nós afetados e as visualizações de geometria associadas serão atualizados e revertidos para o modo de visualização padrão.
Você pode obter mais informações sobre o congelamento de nós na seção Nós e fios.
Os sólidos consistem em uma ou mais superfícies que contêm volume por meio de um limite fechado que define a “entrada” ou a “saída”. Independentemente de quantas superfícies existem, elas devem formar um volume “hermético” para serem consideradas como um sólido. Os sólidos podem ser criados unindo superfícies ou Polysurfaces ou usando operações como elevação, varredura e revolução. As primitivas Esfera, Cubo, Cone e Cilindro também são sólidos. Um cubo com, pelo menos, uma face removida conta como uma Polysurface, que tem algumas propriedades similares, mas não é um sólido.
Um plano é composto por uma única superfície e não é um sólido.
Uma esfera é composta por uma superfície, mas é um sólido.
Um cone é composto por duas superfícies unidas para criar um sólido.
Um cilindro é composto por três superfícies unidas para criar um sólido.
Um cubo é composto de seis superfícies unidas para criar um sólido.
Os sólidos são compostos de três tipos de elementos: vértices, arestas e faces. As faces são as superfícies que compõem o sólido. As arestas são as curvas que definem a conexão entre as faces adjacentes e os vértices são os pontos inicial e final dessas curvas. É possível consultar esses elementos usando os nós de topologia.
Faces
Arestas
Vértices
É possível modificar os sólidos arredondando ou chanfrando suas bordas para eliminar os cantos e os ângulos agudos. A operação de chanfro cria uma superfície regular entre duas faces, enquanto o arredondamento é mesclado entre as faces para manter a tangência.
Cubo sólido
Cubo chanfrado
Cubo arredondado
As operações booleanas de sólidos são métodos para combinar dois ou mais sólidos. Uma única operação booleana significa realizar quatro operações:
Fazer interseção de dois ou mais objetos.
Dividir os objetos nas interseções.
Excluir as partes indesejadas da geometria.
Unir tudo novamente.
União: remove as partes sobrepostas dos sólidos e une-as em um único sólido.
Diferença: subtrai um sólido de outro. O sólido a ser subtraído é chamado de ferramenta. Observe que é possível alternar qual sólido é a ferramenta para manter o volume inverso.
Interseção: mantém somente o volume de interseção dos dois sólidos.
UnionAll: operação de união com esfera e cones virados para fora
DifferenceAll: operação de diferença com esfera e cones virados para dentro
No campo da modelagem de cálculo, as malhas são uma das formas mais difundidas de representar a geometria 3D. A geometria de malha é geralmente feita com um conjunto de quadriláteros ou triângulos, pode ser uma alternativa leve e flexível para trabalhar com NURBS. As malhas são usadas em tudo, desde renderização e visualizações até fabricação digital e impressão 3D.
O Dynamo define malhas usando uma estrutura de dados Face-Vértice. Em seu nível mais básico, esta estrutura é simplesmente uma coleção de pontos que são agrupados em polígonos. Os pontos de uma malha são chamados de vértices, enquanto os polígonos como a superfície são chamados de faces.
Para criar uma malha, precisamos de uma lista de vértices e um sistema de agrupamento desses vértices em faces, o que é denominado grupo de índice.
Lista de vértices
Lista de grupos de índice para definir faces
Os recursos de malha do Dynamo podem ser estendidos instalando o pacote Kit de ferramentas de malha. O Kit de ferramentas de malha do Dynamo fornece ferramentas para importar malhas de formatos de arquivo externo, criar uma malha de objetos de geometria do Dynamo e criar manualmente malhas de acordo com seus vértices e índices.
A biblioteca também fornece ferramentas para modificar malhas, reparar malhas ou extrair fatias horizontais para uso na fabricação.
Consulte Estudos de caso do kit de ferramentas de malha, por exemplo, para saber como usar esse pacote.
Uma Malha é uma coleção de quadriláteros e triângulos que representam uma geometria de superfície ou sólido. Como os sólidos, a estrutura de um objeto de malha inclui vértices, arestas e faces. Há propriedades adicionais que também tornam as Malhas exclusivas, como as normais.
Vértices de malha
Arestas de malha *Arestas com apenas uma face adjacente são chamadas "Naked". Todas as outras arestas são "Clothed"
Faces de malha
Os vértices de uma malha são simplesmente uma lista de pontos. O índice dos vértices é muito importante ao construir uma malha ou obter informações sobre a estrutura de uma malha. Para cada vértice, há também uma normal de vértice correspondente (vetor) que descreve a direção média das faces anexadas e nos ajuda a compreender a orientação “dentro” e “fora” da malha.
Vértices
Normais de vértice
Uma face é uma lista ordenada de três ou quatro vértices. A representação "superfície" de uma face de malha, portanto, é implícita de acordo com a posição dos vértices que estão sendo indexados. Já temos a lista de vértices que compõem a malha, por isso, em vez de fornecer pontos individuais para definir uma face, basta usar o índice dos vértices. Isso também nos permite usar o mesmo vértice em mais de uma face.
Uma face de quadrados feita com índices 0, 1, 2 e 3
Uma face de triângulo feita com índices 1, 4 e 2. Observe que os grupos de índice podem ser deslocados em sua ordem, desde que a sequência seja ordenada de forma anti-horária, a face será definida corretamente
Como a geometria de malha é diferente da geometria NURBS? Em que casos é recomendado utilizar um e não o outro?
Em um capítulo anterior, vimos que as superfícies NURBS são definidas por uma série de curvas NURBS seguindo em duas direções. Essas direções são legendadas como U
eV
, e permitem que uma superfície NURBs seja parametrizada de acordo com um domínio de superfície bidimensional. As curvas em si são armazenadas como equações no computador, permitindo que as superfícies resultantes sejam calculadas para um grau arbitrariamente pequeno de precisão. No entanto, pode ser difícil combinar várias superfícies NURBS juntas. A união de duas superfícies NURBS resultará em uma polysurface, onde diferentes seções da geometria terão diferentes parâmetros UV e definições de curva.
Superfície
Curva isoparamétrica (Isoparm)
Ponto de controle de superfície
Polígono de controle de superfície
Ponto isoparamétrico
Estrutura da superfície
Malha
Aresta consolidada
Rede de malha
Arestas de malha
Normal de vértice
Face de malha/normal de face de malha
As malhas, por outro lado, são compostas de um número discreto de vértices e faces exatamente definidos. A rede de vértices geralmente não pode ser definida por coordenadas simples UV
e, como as faces são separadas, a quantidade de precisão é incorporada à malha e só pode ser alterada refinando a malha e adicionando mais faces. A falta de descrições matemáticas permite que as malhas manipulem com mais flexibilidade a geometria complexa em uma única malha.
Outra diferença importante é a extensão para a qual uma alteração local na geometria de Malha ou NURBS afeta toda a forma. Mover um vértice de uma malha somente afeta as faces que são adjacentes a esse vértice. Em superfícies NURBS, a extensão da influência é mais complicada e depende do grau da superfície, bem como dos pesos e nós dos pontos de controle. Em geral, no entanto, mover um único ponto de controle em uma superfície NURBS cria uma alteração mais suave e mais extensa na geometria.
Superfície NURBS: mover um ponto de controle tem influência que se estende através da forma
Geometria de malha: mover um vértice tem influência somente em elementos adjacentes
Uma analogia que pode ser útil é para comparar uma imagem vetorial (composta de linhas e curvas) com uma imagem raster (composta de pixels individuais). Se você aproximar o zoom em uma imagem de vetor, as curvas permanecem definidas e claras, ao efetuar o zoom em uma imagem raster resulta em uma vista em que os pixels individuais se tornam maiores. Nesta analogia, as superfícies NURBS podem ser comparadas a uma imagem vetorial porque há uma relação matemática suave, enquanto uma malha se comporta de forma similar a uma imagem raster com uma resolução definida.
Os dados são a matéria dos nossos programas. Eles percorrem os fios, fornecendo entradas para os nós onde são processados em uma nova forma de dados de saída. Vamos revisar a definição de dados, como eles são estruturados e começar a usá-los no Dynamo.
Os dados são um conjunto de valores de variáveis qualitativas ou quantitativas. A forma mais simples de dados são os números como 0
, 3.14
ou 17
. Mas os dados também podem ser de diferentes tipos: uma variável representando a alteração de números (height
); caracteres (myName
); geometria (Circle
); ou uma lista de itens de dados (1,2,3,5,8,13,...
).
No Dynamo, adicionamos dados às portas de entrada dos nós. Podemos ter dados sem ações, mas precisamos de dados para processar as ações que nossos nós representam. Quando adicionamos um nó ao espaço de trabalho, se ele não tiver nenhuma entrada fornecida, o resultado será uma função, e não o resultado da própria ação.
Dados simples
Dados e ações (nó A) executados com êxito
A ação (nó A) sem entradas de dados retorna uma função genérica
Cuidado com os nós Nulls O tipo 'null'
representa a ausência de dados. Embora seja um conceito abstrato, provavelmente ele aparecerá ao trabalhar com a programação visual. Se uma ação não criar um resultado válido, o nó retornará nulo.
Testar para verificar se existem nulos e a sua remoção da estrutura de dados é uma parte crucial para criar programas robustos.
Object.IsNull
obj
bool
Quando estamos fazendo a programação visual, podemos gerar muitos dados muito rapidamente e necessitar de um meio para gerenciar sua hierarquia. Essa é a função das estruturas de dados, os esquemas organizacionais nos quais armazenamos dados. As especificidades das estruturas de dados e de como usá-las variam conforme a linguagem de programação usada.
No Dynamo, adicionamos hierarquia aos nossos dados através das listas. Vamos explorar isso em profundidade em capítulos posteriores. Para já, vamos começar de forma simples:
Uma lista representa um conjunto de itens colocados em uma estrutura de dados:
Tenho cinco dedos (itens) na minha mão (lista).
Há dez casas (itens) na minha rua (lista).
Um nó Sequência de números define uma lista de números usando as entradas início, quantidade e etapa. Com esses nós, criamos duas listas separadas de dez números, uma que vai de 100 a 109 e outra que vai de 0 a 9.
O nó List.GetItemAtIndex seleciona um item de uma lista em um índice específico. Escolhendo 0, obtemos o primeiro item da lista (100 neste caso).
Aplicando o mesmo processo à segunda lista, obtemos um valor de 0, o primeiro item da lista.
Agora, mesclamos as duas listas em uma usando o nó List.Create. Observe que o nó cria uma lista de listas. Isso altera a estrutura dos dados.
Usando List.GetItemAtIndex novamente, com o índice definido como 0, obtemos a primeira lista na lista de listas. Isso é o que significa tratar uma lista como um item, o que é um pouco diferente de outras linguagens de script. Nos capítulos posteriores, aprofundaremos mais nos temas de manipulação de listas e estrutura de dados.
O conceito-chave para entender a hierarquia dos dados no Dynamo: em relação à estrutura de dados, as listas são consideradas itens. Ou seja, o Dynamo funciona com um processo descendente para compreender as estruturas dos dados. O que isso significa? Vamos analisar isso com um exemplo.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Neste primeiro exemplo, montamos um cilindro com camadas que percorre a hierarquia da geometria discutida nesta seção.
1. Adicionar Point.ByCoordinates – após adicionarmos o nó à tela, vemos um ponto na origem da grade de visualização do Dynamo. Os valores padrão das entradas x,y e z são 0,0, especificando um ponto nesse local.
2. Plane.ByOriginNormal – a próxima etapa na hierarquia da geometria é o plano. Existem diversas maneiras de construir um plano, e estamos usando uma origem e um normal para a entrada. A origem é o nó de ponto criado na etapa anterior.
Vector.ZAxis – esse é um vetor unificado na direção z. Observe que não há entradas, somente um vetor de valor [0,0,1]. Usamos isso como a entrada normal para o nó Plane.ByOriginNormal. Isso nos fornece um plano retangular na visualização do Dynamo.
3. Circle.ByPlaneRadius – subindo na hierarquia, agora criamos uma curva com base no plano da etapa anterior. Após a conexão ao nó, obtemos um círculo na origem. O raio padrão no nó é o valor de 1.
4. Curve.Extrude – agora vamos fazer isso surgir fornecendo alguma profundidade e entrando na terceira dimensão. Esse nó cria uma superfície com base na curva por meio de extrusão. A distância padrão no nó é 1 e devemos ver um cilindro na viewport.
5. Surface.Thicken – esse nó fornece um sólido fechado deslocando a superfície por uma determinada distância e fechando a forma. O valor padrão da espessura é 1 e vemos um cilindro com camadas na viewport em linha com esses valores.
6. Controle deslizante de número – em vez de usar os valores padrão para todas essas entradas, vamos adicionar um controle paramétrico ao modelo.
Edição de domínio – após adicionar o controle deslizante de número à tela, clique no acento circunflexo no canto superior esquerdo para exibir as opções de domínio.
Mín/Máx/Etapa – altere os valores mín, máx e etapa para 0,2 e 0,01 respectivamente. Estamos fazendo isso para controlar o tamanho da geometria geral.
7. Controles deslizantes de número – em todas as entradas padrão, vamos copiar e colar esse controle deslizante de número (selecione o controle deslizante, pressione Ctrl+C e, em seguida, Ctrl+V) diversas vezes, até que todas as entradas com padrões tenham um controle deslizante. Alguns dos valores do controle deslizante terão que ser maiores que zero para que a definição funcione (isto é, você precisa de uma profundidade de extrusão para que uma superfície se torne mais espessa).
8. Acabamos de criar um cilindro paramétrico com camadas com esses controles deslizantes. Tente flexibilizar alguns desses parâmetros e veja a atualização da geometria dinamicamente na viewport do Dynamo.
Controles deslizantes de número – aprofundando isso um pouco mais, adicionamos muitos controles deslizantes à tela e precisamos limpar a interface da ferramenta que acabamos de criar. Clique com o botão direito do mouse em um controle deslizante, selecione “Renomear...” e altere cada controle deslizante com o nome apropriado para seu parâmetro (espessura, raio, altura etc.).
9. Acabamos de criar um item incrível de cilindro que aumenta de espessura. Esse é um objeto atualmente, vamos analisar como criar uma matriz de cilindros que permanece vinculada de forma dinâmica. Para fazer isso, criaremos uma lista de cilindros, em vez de trabalhar com um único item.
Adição (+) – nosso objetivo é adicionar uma linha de cilindros ao lado do cilindro que criamos. Se desejarmos adicionar um cilindro adjacente ao atual, precisaremos considerar o raio do cilindro e a espessura de sua camada. Obtemos esse número adicionando os dois valores dos controles deslizantes.
10. Essa etapa é mais complicada, portanto, vamos explicá-la devagar: o objetivo final é criar uma lista de números que definem as localizações de cada cilindro em uma linha.
a. Multiplicação ð primeiro, desejamos multiplicar o valor da etapa anterior por 2. O valor da etapa anterior representa um raio e desejamos mover o cilindro ao longo de todo o diâmetro.
b. Sequência de números – criamos uma matriz de números com esse nó. A primeira entrada é o nó_multiplicação_ da etapa anterior para o valor etapa. É possível definir o valor inicial como 0,0 usando um nó de número.
c. Controle deslizante de número inteiro – para o valor quantidade, conectamos um controle deslizante de número inteiro. Isso definirá quantos cilindros são criados.
d. Saída – essa lista mostra a distância de movimentação de cada cilindro na matriz, e é orientada parametricamente pelos controles deslizantes originais.
11. Essa etapa é muito simples: conecte a sequência definida na etapa anterior à entrada x do Point.ByCoordinates original. Isso substituirá o controle deslizante pointX, que pode ser excluído. Agora, vemos uma matriz de cilindros na viewport (certifique-se de que o controle deslizante de número inteiro seja maior que 0).
12. A cadeia de cilindros ainda está dinamicamente vinculada a todos os controles deslizantes. Flexibilize cada controle deslizante para assistir à atualização da definição.
Se a forma mais simples de dados forem os números, a forma mais fácil de relacionar esses números será através da matemática. De operadores simples, como dividir até funções trigonométricas, ou fórmulas mais complexas, a matemática é uma ótima forma de começar a explorar as relações e os padrões numéricos.
Os operadores são um conjunto de componentes que usam funções algébricas com dois valores de entrada numéricos, o que resulta em um valor de saída (adição, subtração, multiplicação, divisão etc.). Eles podem ser encontrados em Operadores>Ações.
Adicionar (+)
var[]...[], var[]...[]
var[]...[]
Subtrair (-)
var[]...[], var[]...[]
var[]...[]
Multiplicar (*)
var[]...[], var[]...[]
var[]...[]
Dividir (/)
var[]...[], var[]...[]
var[]...[]
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Combine operadores e variáveis para formar uma relação mais complexa através de Fórmulas. Use os controles deslizantes para criar uma fórmula que pode ser controlada com parâmetros de entrada.
1. Crie a sequência de números que representa o “t” na equação paramétrica; portanto, queremos usar uma lista suficientemente grande para definir uma espiral.
Sequência de números: defina uma sequência de números com base em três entradas: início, quantidade e etapa.
2. A etapa acima criou uma lista de números para definir o domínio paramétrico. Em seguida, crie um grupo de nós que representa a equação da espiral dourada.
A espiral dourada é definida como a equação:
A imagem abaixo representa a espiral dourada na forma de programação visual. Quando você percorrer o grupo de nós, tente prestar atenção ao paralelo entre o programa visual e a equação escrita.
a. Controle deslizante de número: adicione dois controles deslizantes de número à tela. Esses controles deslizantes representarão as variáveis a e b da equação paramétrica. Eles representam uma constante que é flexível ou parâmetros que podem ser ajustados para um resultado desejado.
b. Multiplicação (*): o nó de multiplicação é representado por um asterisco. Usaremos isso repetidamente para conectar variáveis de multiplicação
c. Math.RadiansToDegrees: os valores “t” precisam ser convertidos em graus para sua avaliação nas funções trigonométricas. Lembre-se de que o Dynamo usa como padrão a unidade de graus para avaliar essas funções.
d. Math.Pow: como uma função de “t” e o número “e” que cria a sequência de Fibonacci.
e. Math.Cos e Math.Sin: essas duas funções trigonométricas diferenciarão a coordenada x e a coordenada y, respectivamente, de cada ponto paramétrico.
f. Inspeção: agora vemos que nossa saída é formada por duas listas, que serão as coordenadas x e y dos pontos usados para gerar a espiral.
Agora a maioria dos nós da etapa anterior funcionará bem, mas isso requer muito trabalho. Para criar um fluxo de trabalho mais eficiente, observe o DesignScript para definir uma sequência de caracteres de expressões do Dynamo em um nó. Nesta próxima série de etapas, vamos analisar o uso da equação paramétrica para desenhar a espiral de Fibonacci.
Point.ByCoordinates: conecte o nó de multiplicação superior à entrada “x” e a parte inferior à entrada “y”. Agora vemos uma espiral paramétrica de pontos na tela.
Polycurve.ByPoints: conecte Point.ByCoordinates da etapa anterior a pontos. Podemos deixar connectLastToFirst sem entrada porque não estamos criando uma curva fechada. Isso cria uma espiral que passa por cada ponto definido na etapa anterior.
Agora concluímos a espiral de Fibonacci. A partir daqui, vamos aprofundar isso em dois exercícios separados, que chamaremos de nautiloide e girassol. Esses são abstrações de sistemas naturais, mas os dois aplicativos diferentes da espiral de Fibonacci serão bem representados.
Circle.ByCenterPointRadius: vamos usar um nó de círculo aqui com as mesmas entradas da etapa anterior. O valor do raio tem como padrão 1,0, de modo que vemos uma saída imediata de círculos. Torna-se imediatamente legível como os pontos se afastam da origem.
Sequência de números: essa é a matriz original de “t”. Conectando isso ao valor do raio de Circle.ByCenterPointRadius, os centros do círculo ainda ficam bastante afastados da origem, mas o raio dos círculos está aumentando, criando um gráfico de círculo de Fibonacci moderno.
Você ganhará pontos de bônus se fizer em 3D.
Agora que fizemos uma casca circular nautiloide, vamos passar para os eixos paramétricos. Vamos usar uma rotação básica na espiral de Fibonacci para criar um eixo de Fibonacci, e o resultado é modelado de acordo com o crescimento de sementes de girassol.
Como ponto de partida, vamos começar com a mesma etapa do exercício anterior: criar uma matriz de espiral de pontos com o nó Point.ByCoordinates.
![](../images/5-3/2/math-part IV-01.jpg)
Em seguida, siga estas minietapas para gerar uma série de espirais em várias rotações.
a. Geometry.Rotate: há diversas opções de Geometry.Rotate; assegure-se de que você selecionou o nó com geometry,basePlane e degrees como entradas. Conecte Point.ByCoordinates à entrada da geometria. Clique com o botão direito do mouse nesse nó e verifique se a amarra está definida como “Produto transversal”
b. Plane.XY: conecte à entrada basePlane. Vamos rotacionar em torno da origem, que é a mesma localização da base da espiral.
c. Intervalo de números: para nossa entrada de graus, desejamos criar várias rotações. Podemos fazer isso rapidamente com um componente do Intervalo de números. Conecte isso à entrada graus.
d. Número: para definir o intervalo de números, adicione três nós de número à tela na ordem vertical. De cima para baixo, atribua valores de 0,0,360,0, e 120,0, respectivamente. Esses valores controlam a rotação da espiral. Observe os resultados de saída no nó Intervalo de números após conectar os três nós de número ao nó.
Nossa saída está começando a se parecer com um redemoinho. Vamos ajustar alguns dos parâmetros de Intervalo de números e ver como os resultados mudam.
Altere o tamanho da etapa do nó Intervalo de números de 120,0 para 36,0. Observe que isso está criando mais rotações e, portanto, nos oferece um eixo mais denso.
Altere o tamanho da etapa do nó Intervalo de números de 36,0 para 3,6. Isso nos oferece agora um eixo muito mais denso, e a direcionalidade da espiral é pouca clara. Senhoras e senhores, criamos um girassol.
Quando estivermos prontos para nos aprofundar no desenvolvimento de programas visuais, precisaremos de uma compreensão mais profunda dos blocos de construção que usaremos. Este capítulo apresentará os conceitos fundamentais em torno dos dados: o que percorre os fios do nosso programa Dynamo.
Formalmente, uma String é uma sequência de caracteres que representa uma constante literal ou algum tipo de variável. De forma informal, uma sequência de caracteres é jargão de programação para texto. Trabalhamos com números, tanto números inteiros quanto decimais, para controlar os parâmetros e podemos fazer o mesmo com o texto.
É possível usar as sequências de caracteres para uma ampla gama de aplicativos, incluindo a definição de parâmetros personalizados, a anotação de conjuntos de documentação e a análise através de conjuntos de dados com base em texto. O nó String está localizado em Núcleo>Categoria de entrada.
Os nós de amostra acima são sequências de caracteres. É possível representar um número como uma sequência de caracteres, assim como uma letra ou uma matriz de texto inteira.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
É possível analisar rapidamente grandes quantidades de dados ao consultar sequências de caracteres. Falaremos sobre algumas operações básicas que podem acelerar um fluxo de trabalho e ajudar na interoperabilidade do software.
A imagem abaixo considera uma sequência de caracteres de dados proveniente de uma planilha externa. A sequência de caracteres representa os vértices de um retângulo no plano XY. Vamos analisar algumas operações de divisão de sequências de caracteres no exercício em miniatura:
O separador “;” divide cada vértice do retângulo. Isso cria uma lista com três itens para cada vértice.
Pressionando “+” no meio do nó, criamos um novo separador.
Adicione uma sequência de caracteres “,” à tela e conecte-se à nova entrada do separador.
Nosso resultado é agora uma lista de dez itens. Primeiro, o nó é dividido com base em separator0 e, em seguida, com base em separator1.
Embora a lista de itens acima possa parecer ser de números, eles ainda são considerados sequências de caracteres individuais no Dynamo. Para criar pontos, seu tipo de dados precisa ser convertido de uma sequência de caracteres em um número. Isso é feito com o nó String.ToNumber
Esse nó é simples. Conecte os resultados de String.Split à entrada. A saída não parece diferente, mas o tipo de dados é agora um número em vez de uma sequência de caracteres.
Com algumas operações adicionais básicas, agora temos um triângulo desenhado na origem com base na entrada original da sequência de caracteres.
Como uma sequência de caracteres é um objeto de texto genérico, ela armazena uma ampla gama de aplicações. Vamos analisar algumas das principais ações em Núcleo>Categoria de sequência de caracteres no Dynamo:
Este é um método que consiste em mesclar duas sequências de caracteres em ordem. Usa cada sequência de caracteres literais de uma lista e cria uma sequência de caracteres mesclada.
Veja a seguir a representação da concatenação das três sequências de caracteres:
Adicione ou subtraia sequências de caracteres da concatenação clicando nos botões +/- no centro do nó.
A saída fornece uma sequência de caracteres concatenada, com espaços e sinais de pontuação incluídos.
O método de união é muito similar a concatenar, exceto que tem uma camada de pontuação adicionada.
Se você já tiver trabalhado no Excel, poderá já ter visto um arquivo CSV. Isso significa valores separados por vírgulas. É possível usar uma vírgula (ou, neste caso, dois traços) como separador com o nó String.Join para criar uma estrutura de dados similar.
A imagem a seguir representa a união das duas sequências de caracteres:
A entrada do separador permite criar uma sequência de caracteres que divide as sequências de caracteres unidas.
Neste exercício, vamos usar métodos de consulta e manipulação de sequências de caracteres para desconstruir a estrofe final de Robert Frost: Parando em bosques em uma noite de neve. Não é o aplicativo mais prático, mas nos ajuda a compreender as ações de sequências de caracteres conceituais conforme as aplicamos às linhas legíveis de ritmo e rima.
Vamos começar com uma divisão básica da sequência de caracteres da estrofe. Primeiro, percebemos que a escrita é formatada com base em vírgulas. Usaremos esse formato para separar cada linha em itens individuais.
A sequência de caracteres base é colada em um nó String.
Outro nó String é usado para indicar o separador. Neste caso, usamos uma vírgula.
Um nó String.Split é adicionado à tela e conectado às duas sequências de caracteres.
A saída mostra que separamos as linhas em elementos individuais.
Agora, vamos chegar à parte boa do poema: as duas últimas linhas. A estrofe original era um item de dados. Separamos esses dados em itens individuais na primeira etapa. Agora, precisamos pesquisar o texto que estamos procurando. Embora seja possível fazer isso selecionando os últimos dois itens da lista, se este fosse um livro inteiro, não iríamos querer ler tudo e isolar manualmente os elementos.
Em vez de pesquisar manualmente, usamos o nó String.Contains para executar uma pesquisa de um conjunto de caracteres. Isso é semelhante a usar o comando “Localizar” em um processador de texto. Neste caso, obteremos um retorno de “true” ou “false” se a subsequência de caracteres for encontrada no item.
Na entrada searchFor, definimos uma subsequência de caracteres que estamos procurando na estrofe. Vamos usar um nó String com o texto “E milhas”.
A saída nos fornece uma lista de valores false e true. Usaremos essa lógica booleana para filtrar os elementos na próxima etapa.
List.FilterByBoolMask é o nó que queremos usar para selecionar os valores false e true. A saída “in” retorna as declarações com uma entrada “mask” com valores “true”, enquanto a saída “out” retorna as que têm valores “false”.
Nosso resultado de “in” é conforme esperado, e isso nos dá as duas linhas finais da estrofe.
Agora, queremos enfatizar a repetição da estrofe, mesclando as duas linhas. Quando visualizamos a saída da etapa anterior, notamos que há dois itens na lista:
Usando dois nós List.GetItemAtIndex, podemos isolar os itens usando os valores de 0 e 1 como entrada do índice.
A saída de cada nó gera, em ordem, as duas linhas finais.
Para mesclar esses dois itens em um único, usamos o nó String.Join:
Após adicionar o nó String.Join, notamos que precisamos de um separador.
Para criar o separador, adicionamos um nó String à tela e digitamos uma vírgula.
O resultado final mesclou os últimos dois itens em um.
Pode parecer muito trabalhoso isolar as duas últimas linhas; e é verdade, as operações de sequência de caracteres geralmente exigem algum trabalho inicial. Mas elas são escalonáveis e podem ser aplicadas a grandes conjuntos de dados com relativa facilidade. Se você estiver trabalhando parametricamente com planilhas e interoperabilidade, lembre-se de considerar as operações de sequência de caracteres.
A Lógica ou, mais especificamente, a Lógica condicional, permite especificar uma ação ou conjunto de ações com base em um teste. Após avaliar o teste, teremos um valor booleano que representa True
ouFalse
, que podemos usar para controlar o fluxo do programa.
As variáveis numéricas podem armazenar um intervalo completo de números diferentes. As variáveis booleanas somente podem armazenar dois valores referidos como True ou False, Yes ou No, 1 ou 0. Raramente usamos operações booleanas para realizar cálculos devido ao seu intervalo limitado.
A declaração “If” é um conceito-chave em programação: “se isso for verdadeiro, aquilo acontecerá; caso contrário, outra coisa acontecerá. A ação resultante da declaração é controlada por um valor booleano. Há várias maneiras de definir uma declaração “If” no Dynamo:
Vamos examinar um breve exemplo de cada um desses três nós em ação usando a declaração condicional “Se”.
Nessa imagem, o valor booleano está definido como true, o que significa que o resultado é uma sequência de caracteres com a inscrição: “this is the result if true” (esse será o resultado se for verdadeiro). Os três nós que criam a declaração If estão funcionando de forma idêntica aqui.
Novamente, os nós estão funcionando de forma idêntica. Se o valor booleano for alterado para false, nosso resultado será o número Pi, conforme definido na declaração If original.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Vamos usar a lógica para separar uma lista de números em uma lista de números pares e uma lista de números ímpares.
a. Intervalo de números – adicione um intervalo de números à tela.
b. Números – adicione três nós de número à tela. O valor para cada nó de número deve ser: 0,0 para início, 10,0 para fim e 1,0 para etapa.
c. Saída – nossa saída é uma lista de 11 números que varia entre 0 e 10.
d. Módulo (%) – Intervalo de números em x e 2,0 em y. Isso calcula o resto de cada número na lista dividida por 2. A saída dessa lista fornece uma lista de valores alternados entre 0 e 1.
e. Teste de igualdade (==) – adicione um teste de igualdade à tela. Conecte a saída módulo à entrada x e 0,0 à entrada y.
f. Inspeção – a saída do teste de igualdade é uma lista de valores que alternam entre true e false. Esses são os valores usados para separar os itens na lista. 0 (ou true) representa números pares e (1 ou false) representa números ímpares.
g. List.FilterByBoolMask – esse nó filtrará os valores em duas listas diferentes com base no booleano de entrada. Conecte o intervalo de números original à entrada lista e a saída teste de igualdade à entrada máscara. A saída in representa valores true, enquanto a saída out representa valores false.
h. Inspeção – como resultado, agora temos uma lista de números pares e uma lista de números ímpares. Usamos operadores lógicos para separar as listas em padrões.
Desenvolvendo a lógica estabelecida no primeiro exercício, vamos aplicar essa configuração a uma operação de modelagem.
2. Vamos passar do exercício anterior com os mesmos nós. As únicas exceções (além da alteração do formato) são:
a. Use um nó Sequência com esses valores de entrada.
b. Desconectamos a entrada da lista in em List.FilterByBoolMask. Colocaremos esses nós de lado por enquanto, mas eles serão úteis no exercício posteriormente.
3. Vamos começar criando um grupo separado de gráficos, como mostrado na imagem acima. Esse grupo de nós representa uma equação paramétrica para definir uma curva de linha. Algumas observações:
a. O primeiro Controle deslizante de número representa a frequência da onda; deve ter um mínimo de 1, um máximo de 4 e uma etapa de 0,01.
b. O segundo Controle deslizante de número representa a amplitude da onda; deve ter um mínimo de 0, um máximo de 1 e uma etapa de 0,01.
c. PolyCurve.ByPoints – se o diagrama de nós acima for copiado, o resultado será uma curva sinusoidal na viewport de Visualização do Dynamo.
Método para as entradas: use os nós de número nas propriedades mais estáticas e os controles deslizantes de número nas mais flexíveis. Queremos manter o intervalo de números original que estávamos definindo no início desta etapa. No entanto, a curva seno criada aqui deve ter alguma flexibilidade. É possível mover esses controles deslizantes para observar a curva atualizar sua frequência e amplitude.
4. Vamos pular um pouco a definição e examinar o resultado final para que possamos fazer referência ao ponto em que estamos chegando. As duas primeiras etapas são feitas separadamente. Agora queremos conectar as duas. Usaremos a curva sinusoidal base para controlar a localização dos componentes do compactador e usaremos a lógica true/false para alternar entre caixas pequenas e caixas maiores.
a. Math.RemapRange – usando a sequência de números criada na etapa 02, vamos criar uma nova série de números remapeando o intervalo. Os números originais da etapa 01 variam entre 0 e 100. Esses números variam entre 0 e 1 nas entradas newMin e newMax, respectivamente.
5. Crie um nó Curve.PointAtParameter e, em seguida, conecte a saída Math.RemapRange da etapa 04 como sua entrada de parâmetro.
Essa etapa cria pontos ao longo da curva. Remapeamos os números de 0 a 1, pois a entrada parâmetro está procurando valores nesse intervalo. Um valor de 0 representa o ponto inicial e um valor de 1 representa os pontos finais. Todos os números entre esses valores avaliam dentro do intervalo [0,1].
6. Conecte a saída de Curve.PointAtParameter a List.FilterByBoolMask para separar a lista de índices ímpares e pares.
a. List.FilterByBoolMask – conecte Curve.PointAtParameter da etapa anterior à entrada lista.
b. Inspeção – um nó de inspeção para in e um nó de inspeção para out mostram que temos duas listas que representam índices pares e ímpares. Esses pontos estão ordenados da mesma maneira na curva, o que demonstramos na próxima etapa.
7. Em seguida, vamos usar o resultado de saída de List.FilterByBoolMask na etapa 05 para gerar geometrias com tamanhos de acordo com seus índices.
Cuboid.ByLengths – recrie as conexões vistas na imagem acima para obter um compactador ao longo da curva sinusoidal. Um cuboide é apenas uma caixa aqui, e estamos definindo seu tamanho com base no ponto da curva no centro da caixa. A lógica da divisão par/ímpar agora deve estar clara no modelo.
a. Lista de cuboides em índices pares.
b. Lista de cuboides em índices ímpares.
Pronto. Você acabou de programar um processo de definição das cotas de geometria de acordo com a operação lógica demonstrada neste exercício.
As listas são a forma como organizamos os dados. No sistema operacional do computador, você tem arquivos e pastas. No Dynamo, podemos considerá-las como itens e listas, respectivamente. Como no sistema operacional, há muitas formas de criar, modificar e consultar os dados. Neste capítulo, veremos como as listas são gerenciadas no Dynamo.
Uma lista é uma coleção de elementos ou de itens. Por exemplo, uma penca de bananas. Cada banana é um item na lista (ou penca). É mais fácil pegar uma penca de bananas em vez de cada banana individualmente, e o mesmo vale para agrupar elementos por relações paramétricas em uma estrutura de dados.
Quando fazemos compras, colocamos todos os itens comprados em uma sacola. Essa sacola também é uma lista. Para fazer pão de banana, precisaremos de três pencas de bananas (vamos fazer muito pão de banana). O saco representa uma lista de pencas de bananas e cada penca representa uma lista de bananas. O saco é uma lista de listas (bidimensionais) e a penca de bananas é uma lista (unidimensional).
No Dynamo, os dados da lista são ordenados e o primeiro item em cada lista tem um índice “0”. Abaixo, vamos discutir como as listas são definidas no Dynamo e como várias listas se relacionam entre si.
Uma coisa que pode parecer estranha no início é que o primeiro índice de uma lista é sempre 0; não 1. Portanto, quando falamos sobre o primeiro item de uma lista, na verdade, queremos dizer o item que corresponde ao índice 0.
Por exemplo, se você contasse o número de dedos que temos na mão direita, as chances são de que você teria contado de 1 a 5. No entanto, se você colocar seus dedos em uma lista, o Dynamo teria dado índices de 0 a 4. Embora isso possa parecer um pouco estranho para programadores iniciantes, o índice com base em zero é uma prática padrão na maioria dos sistemas de cálculo.
Observe que ainda temos cinco itens na lista; é apenas que a lista está usando um sistema de contagem baseado em zero. E os itens que estão sendo armazenados na lista não precisam ser apenas números. Eles podem ser qualquer tipo de dados que o Dynamo suporta, como pontos, curvas, superfícies, famílias etc.
a. Índice
b. Ponto
c. Item
Muitas vezes, a maneira mais fácil de analisar o tipo de dados armazenados em uma lista é conectar um nó de inspeção à saída de outro nó. Por padrão, o nó de inspeção exibe automaticamente todos os índices no lado esquerdo da lista e exibe os itens de dados na direita.
Esses índices são um elemento crucial ao trabalhar com listas.
Nas listas, as entradas e as saídas variam de acordo com o nó do Dynamo que está sendo usado. Como exemplo, vamos usar uma lista de cinco pontos e conectar essa saída a dois nós diferentes do Dynamo: PolyCurve.ByPoints e Circle.ByCenterPointRadius:
A entrada pontos para PolyCurve.ByPoints está procurando “Point[]”. Isso representa uma lista de pontos
A saída para PolyCurve.ByPoints é uma policurva única criada com base em uma lista de cinco pontos.
A entrada centerPoint para Circle.ByCenterPointRadius solicita “Ponto”.
A saída para Circle.ByCenterPointRadius é uma lista de cinco círculos, cujos centros correspondem à lista original de pontos.
Os dados de entrada para PolyCurve.ByPoints e Circle.ByCenterPointRadius são os mesmos. No entanto, o nó Polycurve.ByPoints gera uma policurva, enquanto o nó Circle.ByCenterPointRadius gera cinco círculos com centros em cada ponto. Isso faz sentido intuitivamente: a policurva é desenhada como uma curva que conecta os cinco os pontos, enquanto os círculos criam um círculo diferente em cada ponto. O que está acontecendo com os dados?
Passando o cursor do mouse sobre a entrada pontos para Polycurve.ByPoints, vemos que a entrada está procurando “Point[]”. Observe os colchetes no final. Isso representa uma lista de pontos e, para criar uma policurva, a entrada precisa ser uma lista para cada policurva. Esse nó, portanto, condensará cada lista em uma policurva.
Por outro lado, a entrada centerPoint para Circle.ByCenterPointRadius solicita “Ponto”. Esse nó procura um ponto, como um item, para definir o ponto central do círculo. É por isso que obtemos cinco círculos com base nos dados de entrada. Reconhecer essa diferença com as entradas no Dynamo ajuda a compreender melhor como os nós funcionam ao gerenciar os dados.
A correspondência de dados é um problema sem uma solução fácil. Isso ocorre quando um nó tem acesso a entradas de tamanhos diferentes. Alterar o algoritmo de correspondência de dados pode gerar resultados muito diferentes.
Imagine um nó que cria segmentos de linha entre pontos (Line.ByStartPointEndPoint). Ele terá dois parâmetros de entrada que fornecem as coordenadas dos pontos:
A maneira mais simples é conectar as entradas individualmente até que um dos fluxos se esgote. Isso é denominado algoritmo “Lista mais curta”. Este é o comportamento padrão dos nós do Dynamo:
O algoritmo “Lista mais longa” continua conectando entradas, reusando elementos, até que todos os fluxos se esgotem:
Por fim, o método “Produto transversal” torna todas as conexões possíveis:
Como você pode ver, há diferentes maneiras de desenhar linhas entre estes conjuntos de pontos. É possível encontrar as opções de amarra clicando com o botão direito do mouse no centro de um nó e selecionando o menu “Amarra”.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Para demonstrar as operações de amarra abaixo, vamos usar esse arquivo base para definir a lista mais curta, a lista mais longa e o produto transversal.
Vamos alterar a amarra em Point.ByCoordinates, mas não alteraremos mais nada no gráfico acima.
Escolhendo lista mais curta como a opção de amarra (também é a opção padrão), obtemos uma linha diagonal básica composta por cinco pontos. Cinco pontos são o comprimento da lista menor; portanto, a amarra da lista mais curta é interrompida após atingir o final de uma lista.
Alterando a amarra para lista mais longa, obtemos uma linha diagonal que se estende verticalmente. Pelo mesmo método que o diagrama conceitual, o último item na lista de cinco itens será repetido para alcançar o comprimento da lista mais longa.
Alterando a amarra para Produto transversal, temos todas as combinações entre cada lista, dando-nos uma grade de pontos 5 x 10. Essa é uma estrutura de dados equivalente ao produto transversal, como mostrado no diagrama conceitual acima, exceto pelo fato de que nossos dados agora são uma lista de listas. Conectando uma policurva, podemos ver que cada lista é definida pelo seu valor X, dando-nos uma linha de linhas verticais.
Agora que estabelecemos o que é uma lista, vamos falar sobre as operações que podemos realizar nela. Imagine uma lista como um baralho de cartas. O baralho é a lista e cada carta representa um item.
Quais consultas podemos fazer na lista? Isso acessa as propriedades existentes.
Número de cartas no baralho? 52.
Número de naipes? 4.
Material? Papel.
Comprimento? 3,5 pol. ou 89 mm.
Largura? 2,5 pol. ou 64 mm.
Quais ações podemos executar na lista? Isso altera a lista com base em uma determinada operação.
Podemos embaralhar as cartas.
Podemos classificar as cartas por valor.
Podemos classificar as cartas por naipe.
Podemos dividir o baralho.
Podemos dividir o baralho, distribuindo cada uma das mãos da rodada.
É possível selecionar uma carta específica no baralho.
Todas as operações listadas acima têm nós análogos do Dynamo para trabalhar com listas de dados genéricos. As lições abaixo demonstrarão algumas das operações fundamentais que podemos executar nas listas.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
A imagem abaixo é o gráfico de base no qual estamos desenhando linhas entre dois círculos para representar operações básicas de lista. Vamos explorar como gerenciar dados em uma lista e demonstrar os resultados visuais através das ações da lista abaixo.
Comece com um Bloco de código com um valor de
500;
Conecte-se à entrada x de um nó Point.ByCoordinates.
Conecte o nó da etapa anterior à entrada de origem de um nó Plane.ByOriginNormal.
Usando um nó Circle.ByPlaneRadius, conecte o nó da etapa anterior à entrada do plano.
Usando o Bloco de código, designe um valor de
50;
para o raio. Esse é o primeiro círculo que criaremos.Com um nó Geometry.Translate, movimente o círculo 100 unidades para cima na direção Z.
Com um nó de Bloco de código, defina um intervalo de dez números entre 0 e 1 com esta linha de código:
0..1..#10;
Conecte o bloco de código da etapa anterior à entrada parâmetro de dois nós Curve.PointAtParameter. Conecte Circle.ByPlaneRadius à entrada de curva do nó superior e Geometry.Translate à entrada de curva do nó abaixo dele.
Usando Line.ByStartPointEndPoint, conecte os dois nós Curve.PointAtParameter.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
O nó List.Count é simples: conta o número de valores em uma lista e retorna esse número. Esse nó ganha mais nuances à medida que trabalhamos com listas de listas, mas vamos demonstrar isso nas seções a seguir.
O nó **List.Count ****** retorna o número de linhas no nó Line.ByStartPointEndPoint. Neste caso, o valor é 10, que concorda com o número de pontos criados no nó original do Bloco de código.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
List.GetItemAtIndex é uma forma fundamental de consultar um item na lista.
Primeiro, clique com o botão direito do mouse no nó Line.ByStartPointEndPoint para desativar sua visualização.
Usando o nó List.GetItemAtIndex, estamos selecionando o índice “0” ou o primeiro item na lista de linhas.
Altere o valor do controle deslizante entre 0 e 9 para selecionar outro item usando List.GetItemAtIndex.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
List.Reverse inverte a ordem de todos os itens em uma lista.
Para visualizar corretamente a lista invertida de linhas, crie mais linhas alterando o Bloco de código para
0..1..#50;
Duplique o nó Line.ByStartPointEndPoint, insira um nó List.Reverse entre Curve.PointAtParameter e o segundo Line.ByStartPointEndPoint
Use os nós Watch3D para visualizar dois resultados diferentes. O primeiro mostra o resultado sem uma lista invertida. As linhas se conectam verticalmente aos pontos adjacentes. A lista invertida, no entanto, conectará todos os pontos à ordem oposta na outra lista.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
List.ShiftIndices é uma boa ferramenta para criar padrões de torções ou helicoidais, ou qualquer outra manipulação de dados semelhante. Esse nó altera os itens em uma lista por um determinado número de índices.
No mesmo processo que a lista inversa, insira um List.ShiftIndices no Curve.PointAtParameter e Line.ByStartPointEndPoint.
Usando um Bloco de código, foi designado o valor de “1” para mudar a lista em um índice.
Observe que a alteração é sutil, mas todas as linhas no nó inferior Watch3D mudaram um índice ao se conectarem ao outro conjunto de pontos.
Se o Bloco de código for alterado para um valor maior, “30”, por exemplo, perceberemos uma diferença significativa nas linhas diagonais. A mudança está funcionando como a íris da câmera nesse caso, criando uma torção na forma cilíndrica original.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
List.FilterByBooleanMask removerá determinados itens com base em uma lista de booleanos ou valores “true” ou “false”.
Para criar uma lista de valores “true” ou “false”, é necessário um pouco mais de trabalho...
Usando um Bloco de código, defina uma expressão com a sintaxe:
0..List.Count(list);
. Conecte o nó Curve.PointAtParameter à entrada lista. Vamos abordar mais essa configuração no capítulo do bloco de código, mas a linha de código nesse caso fornece uma lista que representa cada índice do nó Curve.PointAtParameter.Usando um nó %** (módulo)**, conecte a saída do bloco de código à entrada x e um valor de 4 à entrada y. Isso vai gerar o resto ao dividir a lista de índices por 4. O módulo é um nó muito útil para a criação do padrão. Todos os valores serão lidos como os possíveis restos de 4: 0, 1, 2, 3.
No nó %** (módulo)**, sabemos que um valor de 0 significa que o índice é divisível por 4 (0, 4, 8 etc...). Usando um nó ==, podemos testar a divisibilidade com um valor de “0”.
O nó Watch revela apenas isso: temos um padrão true/false com a indicação: true,false,false,false....
Usando esse padrão true/false, conecte-se à entrada de máscara dos dois nós List.FilterByBooleanMask.
Conecte o nó Curve.PointAtParameter a cada entrada da lista do List.FilterByBooleanMask.
A saída de Filter.ByBooleanMask é “in” e “out”. “In” representa valores que tinham um valor de máscara “true”, enquanto “out” representa valores que tinham um valor “false”. Conectando as saídas “in” às entradas startPoint e endPoint de um nó Line.ByStartPointEndPoint, criamos uma lista de linhas filtrada.
O nó Watch3D revela que temos menos linhas do que pontos. Selecionamos somente 25% dos nós filtrando somente os valores true.
A cor é um excelente tipo de dados para criar imagens atraentes, bem como para a diferença de renderização na saída do Programa visual. Ao trabalhar com dados abstratos e números variados, às vezes é difícil ver o que está mudando e até que ponto. Este é um ótimo aplicativo para cores.
As cores no Dynamo são criadas usando entradas ARGB. Isso corresponde aos canais alfa, vermelho, verde e azul. O alfa representa a transparência da cor, enquanto os outros três canais são usados como cores primárias para gerar todo o espectro de cores em conjunto.
As cores na tabela abaixo consultam as propriedades usadas para definir a cor: Alfa, Vermelho, Verde e Azul. Observe que o nó Color.Components nos fornece as quatro como resultados diferentes, o que torna este nó preferível para consultar as propriedades de uma cor.
As cores na tabela abaixo correspondem ao espaço de cores HSB. A divisão das cores em matiz, saturação e brilho é, sem dúvida, algo mais intuitivo para a maneira como interpretamos as cores: qual deve ser a cor? Quão colorido deve ser? E quão clara ou escura deve ser a cor? Este é o detalhamento de matiz, saturação e brilho, respectivamente.
A faixa de cores é similar ao nó Remapear faixa do exercício : remapeia uma lista de números em outro domínio. Mas, em vez de mapear para um domínio de números, o mapeamento é feito para um gradiente de cores com base nos números de entrada que variam de 0 a 1.
O nó atual funciona bem, mas pode ser um pouco estranho fazer com que tudo funcione da primeira vez. A melhor forma de se familiarizar com o gradiente de cores é testar o resultado de forma interativa. Vamos fazer um exercício rápido para rever como configurar um gradiente com cores de saída correspondentes aos números.
Definir três cores: usando um nó de bloco de código defina vermelho, verde e azul inserindo as combinações apropriadas de 0 e 255.
Criar lista: mescle as três cores em uma lista.
Definir índices: crie uma lista para definir as posições da alça de cada cor (desde 0 até 1). Observe o valor de 0,75 para verde. Isso situa a cor verde a 3/4 do caminho através do gradiente horizontal no controle deslizante da faixa de cores.
Bloco de código: insira valores (entre 0 e 1) para converter em cores.
O nó Display.ByGeometry fornece a capacidade de colorir a geometria na viewport do Dynamo. Isso é útil para separar diferentes tipos de geometria, demonstrando um conceito paramétrico ou definindo uma legenda de análise para simulação. As entradas são simples: geometria e cor. Para criar um gradiente como a imagem acima, a entrada de cor é conectada ao nó Faixa de cores.
O nó Display.BySurfaceColors fornece a capacidade de mapear dados em uma superfície usando a cor. Essa funcionalidade apresenta algumas possibilidades interessantes para visualizar os dados obtidos por meio de análise discreta, como solar, energia e proximidade. A aplicação de cor a uma superfície no Dynamo é semelhante à aplicação de uma textura a um material em outros ambientes CAD. Vamos demonstrar como usar essa ferramenta no breve exercício abaixo.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Este exercício foca no controle de cores parametricamente em paralelo com a geometria. A geometria é uma hélice básica, que definimos abaixo usando o Bloco de código. Essa é uma maneira rápida e fácil de criar uma função paramétrica; e, como nosso foco está na cor (e não na geometria), usamos o bloco de código para criar a hélice de forma eficiente sem sobrecarregar a tela. Usaremos o bloco de código com mais frequência à medida que o manual passar a abordar um material mais avançado.
Bloco de código: define os dois blocos de código com as fórmulas acima. Esse é um método paramétrico rápido para criar uma espiral.
Point.ByCoordinates: conecta as três saídas do bloco de código às coordenadas do nó.
Agora, vemos uma matriz de pontos criando uma hélice. A próxima etapa é criar uma curva através dos pontos de forma que possamos visualizar a hélice.
PolyCurve.ByPoints: conecta a saída Point.ByCoordinates à entrada pontos do nó. Obtemos uma curva helicoidal.
Curve.PointAtParameter: conecta a saída PolyCurve.ByPoints à entrada curva. O propósito dessa etapa é criar um ponto paramétrico atrativo que desliza ao longo da curva. Como a curva está avaliando um ponto no parâmetro, precisaremos inserir um valor de parâmetro entre 0 e 1.
Controle deslizante de número: após adicionar à tela, altere o valor mín para 0,0, o valor máx para 1,0 e o valor de etapa para 0,01. Conecte a saída do controle deslizante à entrada parâmetro para Curve.PointAtParameter. Agora, vemos um ponto ao longo do comprimento da hélice, representado por uma porcentagem do controle deslizante (0 no ponto inicial, 1 no ponto final).
Com o ponto de referência criado, agora comparamos a distância do ponto de referência com os pontos originais que definem a hélice. Esse valor de distância determinará a geometria e a cor.
Geometry.DistanceTo: conecta a saída Curve.PointAtParameter à entrada. Conecte Point.ByCoordinates à entrada da geometria.
Inspeção: o resultado mostra uma lista de distâncias entre cada ponto helicoidal e o ponto de referência ao longo da curva.
A próxima etapa é determinar os parâmetros com a lista de distâncias, entre os pontos helicoidais e o ponto de referência. Usamos esses valores de distância para definir os raios de uma série de esferas ao longo da curva. Para manter as esferas em um tamanho adequado, precisamos remapear os valores da distância.
Math.RemapRange: conecta a saída Geometry.DistanceTo à entrada dos números.
Bloco de código: conecta um bloco de código com um valor de 0,01 à entrada newMin e um bloco de código com um valor de 1 à entrada newMax.
Inspeção: conecta a saída Math.RemapRange a um nó e a saída Geometry.DistanceTo a outro nó. Compare os resultados.
Essa etapa remapeou a lista de distâncias para um intervalo menor. Podemos editar os valores newMin e newMax, conforme necessário. Os valores serão remapeados e terão a mesma relação de distribuição em todo o domínio.
Sphere.ByCenterPointRadius: conecta a saída Math.RemapRange à entrada raio e a saída original Point.ByCoordinates à entrada centerPoint.
Altere o valor do controle deslizante de número e observe o tamanho das esferas atualizadas. Agora, temos um modelo paramétrico
O tamanho das esferas demonstra a matriz paramétrica definida por um ponto de referência ao longo da curva. Vamos usar o mesmo conceito para o raio da esfera para determinar sua cor.
Faixa de cores: adiciona a parte superior da tela. Quando passamos o cursor sobre a entrada valor, notamos que os números solicitados estão entre 0 e 1. Precisamos remapear os números da saída Geometry.DistanceTo para que sejam compatíveis com esse domínio.
Sphere.ByCenterPointRadius: por enquanto, vamos desativar a visualização nesse nó (clique com o botão direito do mouse > Visualização).
Math.RemapRange: esse processo deverá ser familiar. Conecte a saída Geometry.DistanceTo à entrada de números.
Bloco de código: de forma semelhante a uma etapa anterior, crie um valor de 0 para a entrada newMin e um valor de 1 para a entrada newMax. Neste caso, observe que podemos definir duas saídas de um único bloco de código.
Faixa de cores: conecte a saída Math.RemapRange à entrada valor.
Color.ByARGB: esse é o processo para criar duas cores. Embora esse processo possa parecer estranho, é o mesmo que as cores RGB em outro software, estamos apenas usando a programação visual para fazer isso.
Bloco de código: crie dois valores de 0 e 255. Conecte as duas saídas às duas entradas Color.ByARGB de acordo com a imagem acima (ou crie as duas cores favoritas).
Faixa de cores: a entrada cores solicita uma lista de cores. É necessário criar essa lista com base nas duas cores criadas na etapa anterior.
List.Create: mescla as duas cores em uma lista. Conecte a saída à entrada cores para a Faixa de cores.
Display.ByGeometryColor: conecta Sphere.ByCenterPointRadius à entrada geometria e a Faixa de cores à entrada cor. Agora temos um gradiente suave no domínio da curva.
Se alterarmos o valor do Controle deslizante de número anterior na definição, as cores e os tamanhos serão atualizados. As cores e o tamanho do raio estão diretamente relacionados neste caso: agora temos uma ligação visual entre dois parâmetros.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Primeiro, é preciso criar (ou referenciar) uma superfície para usar como uma entrada para o nó Display.BySurfaceColors. Neste exemplo, estamos fazendo a transição entre uma curva seno e cosseno.
Esse grupo de nós está criando pontos ao longo do eixo Z e, em seguida, deslocando-os com base nas funções de seno e cosseno. As duas listas de pontos são, em seguida, usadas para gerar curvas NURBS.
Surface.ByLoft: gera uma superfície interpolada entre a lista de curvas NURBS.
Caminho do arquivo: selecione um arquivo de imagem de amostra com uso dos dados de pixel a jusante
File.FromPath para converter o caminho do arquivo em um arquivo e, em seguida, passar para Image.ReadFromFile para gerar uma imagem de amostra
Image.Pixels: insira uma imagem e forneça um valor de amostra para usar ao longo das dimensões x e y da imagem
Controle deslizante: fornece os valores para Image.Pixels
Display.BySurfaceColors: mapeia a matriz de valores de cores através da superfície ao longo de X e Y, respectivamente
Visualização aproximada da superfície de saída com resolução de 400 x 300 amostras
Vamos adicionar mais um nível à hierarquia. Se pegarmos o maço de cartas do exemplo original e criarmos uma caixa que contém vários maços, a caixa agora representará uma lista de maços e cada maço representará uma lista de cartas. Esta é uma lista de listas. Para a analogia nesta seção, a imagem abaixo contém uma lista de rolos de moeda e cada rolo contém uma lista de moedas de um centavo.
Quais consultas podemos fazer na lista de listas? Isso acessa as propriedades existentes.
Quantidade de tipos de moeda? 2.
Valores de tipo de moeda? $ 0,01 e $ 0,25.
Material das moedas de vinte e cinco centavos? 75% de cobre e 25% de níquel.
Material de moedas de um centavo? 97,5% de zinco e 2,5% de cobre.
Quais ações podemos executar na lista de listas? Isso altera a lista de listas com base em uma operação fornecida.
Selecione uma pilha específica de moedas de vinte e cinco centavos ou de um centavo.
Selecione uma moeda específica de vinte e cinco centavos ou um centavo.
Reorganize as pilhas de moedas de vinte e cinco centavos e de um centavo.
Misture as pilhas.
Novamente, o Dynamo tem um nó análogo para cada uma das operações acima. Como estamos trabalhando com dados abstratos, e não com objetos físicos, precisamos de um conjunto de regras para controlar como movemos para cima e para baixo na hierarquia de dados.
Ao lidar com listas de listas, os dados são complexos e dispostos em camadas, mas isso proporciona a oportunidade de executar algumas operações paramétricas incríveis. Vamos separar os conceitos básicos e discutir mais algumas operações nas lições abaixo.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
O conceito fundamental a ser aprendido nesta seção: o Dynamo trata as listas intrinsecamente como objetos. Essa hierarquia de cima para baixo é desenvolvida considerando a programação orientada a objetos. Em vez de selecionar subelementos com um comando como List.GetItemAtIndex, o Dynamo seleciona o índice da lista principal na estrutura de dados. E esse item pode ser outra lista. Vamos explicar em detalhes com uma imagem de exemplo:
Com o Bloco de código, definimos dois intervalos:
0..2; 0..3;
Esses intervalos são conectados a um nó Point.ByCoordinates com amarra definida como “Produto transversal”. Isso cria um eixo de pontos e também retorna uma lista de listas como uma saída.
Observe que o nó Inspeção fornece três listas com quatro itens cada.
Usando List.GetItemAtIndex, com um índice de 0, o Dynamo seleciona a primeira lista e todo seu conteúdo. Outros programas podem selecionar o primeiro item de cada lista na estrutura de dados, mas o Dynamo emprega uma hierarquia de cima para baixo ao lidar com os dados.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Mesclar remove todos os níveis de dados de uma estrutura de dados. Isso é útil quando as hierarquias de dados não são necessárias para sua operação, mas pode ser arriscado porque remove as informações. O exemplo abaixo mostra o resultado do nivelamento de uma lista de dados.
Insira uma linha de código para definir um intervalo em Bloco de código:
-250..-150..#4;
Conectando o bloco de código à entrada x e y de um nó Point.ByCoordinates, definimos a amarra como “Produto transversal” para obter um eixo de pontos.
O nó Inspeção mostra que temos uma lista de listas.
Um nó PolyCurve.ByPoints fará referência a cada lista e criará uma policurva respectiva. Observe na visualização do Dynamo que temos quatro policurvas que representam cada linha no eixo.
Se inserirmos um nivelamento antes do nó da policurva, criaremos uma única lista para todos os pontos. O nó PolyCurve.ByPoints faz referência a uma lista para criar uma curva e, como todos os pontos estão em uma lista, obtemos uma policurva em ziguezague que segue em toda a lista de pontos.
Há também opções para aplainar níveis isolados de dados. Usando o nó List.Flatten, é possível definir um número determinado de níveis de dados para aplainar desde o topo da hierarquia. Essa será uma ferramenta realmente útil se você estiver lidando com estruturas de dados complexas, que não são necessariamente relevantes para o fluxo de trabalho. Outra opção é usar o nó de nivelamento como uma função em List.Map. Discutiremos mais sobre List.Map abaixo.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Durante a modelagem paramétrica, também há ocasiões em que você desejará modificar a estrutura de dados para uma lista existente. Há muitos nós disponíveis para isso também, e o corte é a versão mais básica. Com o corte, é possível particionar uma lista em sublistas com um número definido de itens.
O comando de corte divide as listas com base em um determinado comprimento de lista. De certa forma, o corte é o oposto da mesclagem: em vez de remover a estrutura de dados, ele adiciona novos níveis a ela. Essa é uma ferramenta útil para operações geométricas como o exemplo abaixo.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
List.Map/Combine aplica uma função definida a uma lista de entrada, mas um degrau abaixo na hierarquia. As combinações são o mesmo que os mapas, exceto pelo fato de que as combinações podem ter várias entradas correspondentes à entrada de uma determinada função.
Como uma rápida introdução, vamos revisar o nó List.Count de uma seção anterior.
O nó List.Count conta todos os itens em uma lista. Usaremos isso para demonstrar como List.Map funciona.
Insira duas linhas de código no Bloco de código:
-50..50..#Nx; -50..50..#Ny;
Após digitar esse código, o bloco de código criará duas entradas para Nx e Ny.
Com dois controles deslizantes de número inteiro, defina os valores Nx e Ny conectando-os ao Bloco de código.
Conecte cada linha do bloco de código às respectivas entradas X e Y de um nó Point.ByCoordinates. Clique com o botão direito do mouse no nó, selecione “Amarra” e selecione “Produto transversal”. Isso cria um eixo de pontos. Como definimos o intervalo de -50 a 50, estamos expandindo o eixo padrão do Dynamo.
Um nó Inspeção revela os pontos criados. Observe a estrutura de dados. Criamos uma lista de listas. Cada lista representa uma linha de pontos do eixo.
Anexe um nó List.Count à saída do nó de inspeção da etapa anterior.
Conecte um nó Inspeção à saída List.Count.
Observe que o nó List.Count fornece um valor igual a 5. Isso é igual à variável “Nx”, conforme definido no bloco de código. Por que isso ocorre?
Primeiro, o nó Point.ByCoordinates usa a entrada “x” como entrada principal para criar listas. Quando Nx é 5 e Ny é 3, obtemos uma lista de 5 listas, cada uma com 3 itens.
Como o Dynamo trata as listas intrinsecamente como objetos, um nó List.Count é aplicado à lista principal na hierarquia. O resultado é um valor igual a 5 ou o número de listas na lista principal.
Usando um nó List.Map, descemos um degrau na hierarquia e executamos uma “função” neste nível.
Observe que o nó List.Count não tem nenhuma entrada. Ele está sendo usado como uma função para que o nó List.Count seja aplicado a cada lista individual um degrau abaixo na hierarquia. A entrada em branco de List.Count corresponde à entrada de lista de List.Map.
Os resultados de List.Count agora fornecem uma lista de 5 itens, cada um com o valor de 3. Isso representa o tamanho de cada sublista.
Neste exercício, usaremos List.Combine para demonstrar como pode ser usado para aplicar uma função em listas separadas de objetos.
Comece configurando duas listas de pontos.
Use o nó Sequência para gerar 10 valores, cada um com um incremento de 10 etapas.
Conecte o resultado à entrada x de um nó Point.ByCoordinates. Isso criará uma lista de pontos no Dynamo.
Adicione um segundo nó Point.ByCoordinates ao espaço de trabalho, use a mesma saída de Sequência como sua entrada x, mas use um Controle deslizante de número inteiro como sua entrada y e defina seu valor como 31 (pode ser qualquer valor, desde que não se sobreponha ao primeiro conjunto de pontos) para que os dois conjuntos de pontos não se sobreponham um ao outro.
Em seguida, usaremos List.Combine para aplicar uma função em objetos em duas listas separadas. Neste caso, será uma função de linha de desenho simples.
Adicione List.Combine ao espaço de trabalho e conecte os dois conjuntos de pontos como suas entradas list0 e list1.
Use Line.ByStartPointEndPoint como a função de entrada para List.Combine.
Após a conclusão, os dois conjuntos de pontos são compactados/emparelhados por meio de uma função Line.ByStartPointEndPoint e retornam 10 linhas no Dynamo.
Consulte o exercício em Listas n-dimensionais para ver outro exemplo de uso de List.Combine.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Com preferência em relação a List.Map, o recurso List@Level permite selecionar diretamente com qual nível de lista você deseja trabalhar diretamente na porta de entrada do nó. É possível aplicar esse recurso a qualquer entrada de nó e permitirá que você acesse os níveis de suas listas com mais rapidez e facilidade do que com outros métodos. Basta informar ao nó qual nível da lista você deseja usar como entrada e deixar que o nó faça o restante.
Neste exercício, usaremos o recurso List@Level para isolar um nível de dados específico.
Começaremos com um eixo de pontos 3D simples.
Como o eixo é construído com um intervalo para X, Y e Z, sabemos que os dados estão estruturados com três níveis: uma lista X, uma lista Y e uma lista Z.
Esses níveis existem em diferentes Níveis. Os níveis são indicados na parte inferior da bolha de visualização. As colunas de níveis da lista correspondem aos dados da lista acima para ajudar a identificar em qual nível se deve trabalhar.
Os níveis da lista estão organizados em ordem inversa para que os dados de menor nível estejam sempre em “L1”. Isso ajudará a garantir que os gráficos funcionem conforme planejado, mesmo que algo seja alterado a montante.
Para usar a função List@Level, clique em “>”. Nesse menu, existem duas caixas de seleção.
Usar níveis – Ativa a funcionalidade List@Level. Após clicar nessa opção, você poderá clicar e selecionar os níveis da lista de entrada que deseja que o nó use. Com esse menu, você pode experimentar rapidamente diferentes opções de nível clicando para cima ou para baixo.
Manter a estrutura da lista – Se essa opção estiver ativada, você poderá manter a estrutura de nível da entrada. Às vezes, você pode ter organizado intencionalmente os dados em sublistas. Ao marcar essa opção, é possível manter a organização da lista intacta e não perder nenhuma informação.
Com nosso eixo 3D simples, podemos acessar e visualizar a estrutura de lista alternando entre os níveis de lista. Cada combinação de nível de lista e índice retorna um conjunto de pontos diferente do nosso conjunto 3D original.
“@L2” em DesignScript nos permite selecionar somente a lista no Nível 2. A lista no Nível 2 com o índice 0 inclui somente o primeiro conjunto de pontos Y, retornando somente o eixo XZ.
Se alterarmos o filtro Nível para “L1”, poderemos ver tudo no primeiro nível da lista. A lista no Nível 1 com índice 0 inclui todos os nossos pontos 3D em uma lista plana.
Se tentarmos fazer o mesmo para “L3”, veremos somente os pontos do terceiro nível da lista. A lista no Nível 3 com índice 0 inclui somente o primeiro conjunto de pontos Z, retornando somente um eixo XY.
Se tentarmos o mesmo para “L4”, veremos somente os pontos do terceiro nível da lista. A lista no Nível 4 com índice 0 inclui somente o primeiro conjunto de pontos X, retornando somente um eixo YZ.
Embora este exemplo específico também possa ser criado com List.Map, o recurso List@Level simplifica muito a interação, facilitando o acesso aos dados do nó. Confira abaixo uma comparação entre os métodos List.Map e List@Level:
Embora ambos os métodos ofereçam acesso aos mesmos pontos, o método List@Level permite alternar facilmente entre as camadas de dados em um único nó.
Para acessar um eixo de pontos com List.Map, precisamos de um nó List.GetItemAtIndex junto com List.Map. Para cada nível de lista que descermos, precisaremos usar um nó List.Map adicional. Dependendo da complexidade das listas, isso pode exigir a adição de uma quantidade significativa de nós List.Map ao gráfico para acessar o nível de informações correto.
Neste exemplo, um nó List.GetItemAtIndex com um nó List.Map retorna o mesmo conjunto de pontos com a mesma estrutura de lista que o List.GetItemAtIndex com “@L3” selecionado.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Transpor é uma função fundamental ao lidar com listas de listas. Assim como nos programas de planilha, uma transposição inverte as colunas e linhas de uma estrutura de dados. Vamos demonstrar isso com uma matriz básica abaixo e, na seção a seguir, vamos demonstrar como uma transposição pode ser usada para criar relações geométricas.
Vamos excluir os nós List.Count do exercício anterior e usar alguma geometria para ver como os dados se estruturaram.
Conecte PolyCurve.ByPoints à saída do nó de inspeção de Point.ByCoordinates.
A saída mostra 5 policurvas e podemos ver as curvas na visualização do Dynamo. O nó do Dynamo está procurando uma lista de pontos (ou uma lista de listas de pontos neste caso) e criando uma única PolyCurve com base neles. Essencialmente, cada lista foi convertida em uma curva na estrutura de dados.
Um nó List.Transpose alternará todos os itens com todas as listas em uma lista de listas. Isso parece complicado, mas é a mesma lógica do recurso Transpor no Microsoft Excel: alternar colunas com linhas em uma estrutura de dados.
Observe o resultado abstrato: a transposição alterou a estrutura da lista de 5 listas com 3 itens cada uma para 3 listas com 5 itens cada uma.
Observe o resultado geométrico: usando PolyCurve.ByPoints, obtemos 3 policurvas na direção perpendicular às curvas originais.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Este exercício usa uma lógica estabelecida no exercício anterior para editar uma superfície. Nosso objetivo aqui é intuitivo, mas a navegação na estrutura de dados estará mais envolvida. Desejamos articular uma superfície movendo um ponto de controle.
Comece com a cadeia de caracteres dos nós acima. Estamos criando uma superfície básica que abrange o eixo padrão do Dynamo.
Usando o Bloco de código, insira essas duas linhas de código e conecte-se às entradas u e v de Surface.PointAtParameter, respectivamente:
-50..50..#3;
-50..50..#5;
Certifique-se de configurar a Amarra de Surface.PointAtParameter como “Produto transversal”.
O nó Inspeção mostra que temos uma lista de 3 listas, cada uma com 5 itens.
Nesta etapa, queremos consultar o ponto central no eixo que criamos. Para fazer isso, vamos selecionar o ponto médio na lista do meio. Faz sentido, certo?
Para confirmar que esse é o ponto correto, também podemos clicar nos itens do nó de inspeção para confirmar que estamos selecionando o item correto.
Usando o Bloco de código, vamos escrever uma linha básica de código para consultar uma lista de listas:
points[1][2];
Usando Geometry.Translate, vamos mover o ponto selecionado para cima na direção Z por 20 unidades.
Vamos também selecionar a linha média de pontos com um nó List.GetItemAtIndex. Observação: De forma similar a uma etapa anterior, também é possível consultar a lista com o Bloco de código, usando uma linha de
points[1];
Até agora, consultamos com êxito o ponto central e o movemos para cima. Agora, queremos inserir esse ponto movido de volta na estrutura de dados original.
Primeiro, queremos substituir o item da lista que isolamos em uma etapa anterior.
Usando List.ReplaceItemAtIndex, vamos substituir o item do meio e o índice de “2” pelo item de substituição conectado ao ponto movido (Geometry.Translate).
A saída mostra que inserimos o ponto movido no item do meio da lista.
Agora que modificamos a lista, precisamos inseri-la de volta na estrutura de dados original: a lista de listas.
Seguindo a mesma lógica, use List.ReplaceItemAtIndex para substituir a lista do centro pela nossa lista modificada.
Observe que os Blocos de código que definem o índice para esses dois nós são 1 e 2, que coincidem com a consulta original do Bloco de código (pontos[1][2]).
Se selecionarmos a lista no índice 1, veremos a estrutura de dados realçada na visualização do Dynamo. Mesclamos com êxito o ponto movido para a estrutura de dados original.
Existem várias maneiras de criar uma superfície com base nesse conjunto de pontos. Neste caso, vamos criar uma superfície por meio da elevação de curvas.
Crie um nó NurbsCurve.ByPoints e conecte a nova estrutura de dados para criar três curvas NURBS.
Conecte Surface.ByLoft à saída de NurbsCurve.ByPoints. Agora, temos uma superfície modificada. É possível alterar o valor Z original da geometria. Converta e observe a atualização da geometria.
Linha é composta por um conjunto de pontos, cada linha tem ao menos dois pontos. Um dos modos mais comuns de criar linhas no Dynamo é usando Line.ByStartPointEndPoint
para criar uma linha no Dynamo.
Isso faz com que os booleanos de sólidos sejam um processo eficaz para economizar tempo. Existem três operações booleanas de sólidos que distinguem quais partes da geometria são mantidas.
Além dessas três operações, o Dynamo tem os nós Solid.DifferenceAll e Solid.UnionAll para executar operações de diferença e união com vários sólidos.
Foto de .
Foto de
Foto de .
Observação: Este exercício foi criado com uma versão anterior do Dynamo. A maior parte da funcionalidade de List.Map foi resolvida com a adição do recurso List@Level . Para obter mais informações, consulte abaixo.
Observação: Este exercício foi criado com uma versão anterior do Dynamo. A maior parte da funcionalidade de List.Combine foi resolvida com a adição do recurso List@Level . Para obter mais informações, consulte abaixo.
A abreviação do bloco de código usa “[]” para definir uma lista. Essa é uma maneira muito mais rápida e fluida de criar uma lista do que com o nó List.Create. O Bloco de código é discutido com mais detalhes em . Observe na imagem abaixo como uma lista com várias expressões pode ser definida com o bloco de código.
A abreviação do Bloco de código usa “[]” como uma forma rápida e fácil de selecionar itens específicos que você deseja de uma estrutura de dados complexa. Os Blocos de código são discutidos com mais detalhes no . Observe na imagem abaixo como uma lista com vários tipos de dados pode ser consultada com o bloco de código.
Cor ARGB (Color.ByARGB)
A,R,G,B
cor
Alfa (Color.Alpha)
cor
A
Vermelho (Color.Red)
cor
R
Verde (Color.Green)
cor
G
Azul (Color.Blue)
cor
B
Componentes (Color.Components)
cor
A, R, G, B
Matiz (Color.Hue)
cor
Matiz
Saturação (Color.Saturation)
cor
Saturação
Brilho (Color.Brightness)
cor
Brilho
Se (If)
teste, true, false
resultado
Fórmula (IF(x,y,z))
x, y, z
resultado
Bloco de código ((x?y:z);)
X, Y, Z
resultado
O Dynamo 2.0 não só apresenta os nós anteriormente discutidos dos dicionários, como também existe uma nova funcionalidade nos blocos de código para isso.
É possível usar a sintaxe como indicado abaixo ou as representações com base em DesignScript dos nós.
Como um dicionário é um tipo de objeto no Dynamo, podemos confirmar as seguintes ações sobre ele.
Manter esse tipo de interações é especialmente útil ao relacionar dados do Revit com sequências de caracteres. A seguir, vamos examinar alguns casos de uso do Revit.
Os dicionários representam uma coleção de dados relacionados com outros dados conhecidos como chave. Os dicionários expõem a capacidade de procurar, excluir e inserir dados em uma coleção.
Essencialmente, podemos pensar em um dicionário como uma forma realmente inteligente de buscar algo.
Embora a funcionalidade de dicionário já esteja disponível no Dynamo há algum tempo, o Dynamo 2.0 apresenta uma nova forma de gerenciar esse tipo de dados.
Cortesia de imagem original de: sixtysecondrevit.com
Alguma vez você já quis procurar algo no Revit por um dado que ele possui?
É provável que você tenha feito algo como o seguinte exemplo.
Na imagem abaixo, estamos coletando todos os ambientes no modelo do Revit, obtendo o índice do ambiente desejado (por número do ambiente) e, por fim, selecionando o ambiente no índice.
Colete todos os ambientes no modelo.
Número do ambiente a ser localizado.
Obtenha o número do ambiente e encontre em que índice ele se encontra.
Obtenha o ambiente no índice.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Agora, vamos recriar essa ideia usando dicionários. Primeiro, precisamos coletar todos os ambientes em nosso modelo do Revit.
Escolhemos a categoria do Revit com a qual queremos trabalhar (neste caso, estamos trabalhando com ambientes).
Dizemos ao Dynamo para coletar todos esses elementos.
Em seguida, precisamos decidir quais chaves usaremos para examinar esses dados. (Para obter informações sobre as chaves, consulte a seção O que é um dicionário?).
Os dados que usaremos são o número do ambiente.
Agora, criaremos o dicionário com as chaves e os elementos indicados.
O nó Dictionary.ByKeysValues criará um dicionário com as entradas apropriadas.
Keys
precisa ser uma sequência de caracteres, enquantovalues
pode ser uma variedade de tipos de objetos.
Por último, é possível recuperar um ambiente do dicionário com seu número de ambiente atual.
String
será a chave que vamos usar para pesquisar um objeto no dicionário.Dictionary.ValueAtKey obterá o objeto do dicionário.
Usando a mesma lógica de dicionário, também é possível criar dicionários com objetos agrupados. Se quiséssemos examinar todos os ambientes em um determinado nível, poderíamos modificar o gráfico acima, da seguinte forma.
Em vez de usar o número do ambiente como a chave, podemos usar um valor de parâmetro (neste caso, usaremos o nível).
Agora, é possível agrupar os ambientes pelo nível em que residem.
Com os elementos agrupados pelo nível, agora podemos usar as chaves compartilhadas (chaves exclusivas) como a nossa chave para o dicionário e as listas de ambientes como os elementos.
Por fim, usando os níveis no modelo do Revit, podemos procurar quais ambientes residem naquele nível no dicionário.
Dictionary.ValueAtKey
coleta o nome do nível e retorna os objetos do ambiente naquele nível.
As oportunidades de uso do dicionário são realmente infinitas. A capacidade de relacionar seus dados do BIM no Revit com o próprio elemento apresenta uma variedade de casos de uso.
O Dynamo 2.0 apresenta o conceito de separar o tipo de dados de dicionários do tipo de dados de listas. Essa alteração pode representar algumas alterações significativas na forma como você cria e trabalha com os dados em seus fluxos de trabalho. Antes da versão 2.0, os dicionários e as listas eram combinados como um tipo de dados. Em resumo, as listas eram, na verdade, dicionários com chaves de número inteiro.
Um dicionário é um tipo de dados formado por um conjunto de pares de valores-chave onde cada chave é exclusiva em cada conjunto. Um dicionário não tem ordem e, basicamente, é possível “procurar por coisas” usando uma chave em vez de um valor de índice, como em uma lista. No Dynamo 2.0, as chaves somente podem ser sequências de caracteres.
Uma lista é um tipo de dados formado por um conjunto de valores ordenados. No Dynamo, as listas usam números inteiros como valores de índice.
A separação dos dicionários das listas apresenta os dicionários como um elemento de primeira classe que você pode usar para armazenar e pesquisar valores de maneira rápida e fácil, sem precisar lembrar um valor de índice ou manter uma estrutura de lista rigorosa em todo o fluxo de trabalho. Durante o teste dos usuários, vimos uma redução significativa no tamanho do gráfico quando os dicionários eram usados em vez de vários nós GetItemAtIndex
.
Ocorreram alterações na sintaxe que alteram a forma como você inicializará e trabalhará com dicionários e listas em blocos de código.
Os dicionários usam a seguinte sintaxe {key:value}
As listas usam a seguinte sintaxe [value,value,value]
Novos nós foram introduzidos na biblioteca para ajudar a criar, modificar e consultar dicionários.
As listas criadas em blocos de código v1.x migrarão automaticamente durante o carregamento do script com a nova sintaxe de lista que usa colchetes [ ]
em vez de chaves { }
\
Em ciência de computação, os dicionários, como as listas, são conjuntos de objetos. Embora as listas estejam em uma ordem específica, os dicionários são conjuntos não ordenados. Eles não dependem de números sequenciais (índices); em vez disso, usam chaves.
Na imagem abaixo, demonstramos um caso de uso potencial de um dicionário. Muitas vezes, os dicionários são usados para relacionar duas partes dos dados que podem não ter uma correlação direta. No nosso caso, estamos ligando a versão em espanhol de uma palavra à versão em inglês para uma pesquisa posterior.
Crie um dicionário para relacionar as duas partes dos dados.
Obtenha o valor com a chave fornecida.
O Dynamo 2.0 expõe uma variedade de nós de dicionário para serem usados. Isso inclui os nós criar, ação e consulta.
Dictionary.ByKeysValues
criará um dicionário com os valores e chaves fornecidos. (O número de entradas será o da lista de entradas mais curta)
Dictionary.Components
produzirá os componentes do dicionário de entrada. (Isso é o inverso do nó criar)
Dictionary.RemoveKeys
produzirá um novo objeto de dicionário com as chaves de entrada removidas.
Dictionary.SetValueAtKeys
produzirá um novo dicionário com base nas chaves de entrada e nos valores para substituir o valor atual nas chaves correspondentes.
Dictionary.ValueAtKey
retornará o valor na chave de entrada.
Dictionary.Count
informará quantos pares de valores-chave estão no dicionário.
Dictionary.Keys
retornará quais chaves estão atualmente armazenadas no dicionário.
Dictionary.Values
retornará quais valores estão armazenados no momento no dicionário.
A relação global de dados com dicionários é uma ótima alternativa ao método antigo de trabalho com índices e listas.
Em um passo mais avançado, vamos adicionar ainda mais camadas à hierarquia. A estrutura de dados pode se expandir muito além de uma lista bidimensional de listas. Como as listas são itens por si só no Dynamo, podemos criar dados com tantas dimensões quanto possível.
A analogia com a qual vamos trabalhar aqui são as bonecas russas. Cada lista pode ser considerada como um contêiner com vários itens. Cada lista tem suas próprias propriedades e também é considerada como seu próprio objeto.
Um conjunto de bonecas russas (Foto de Zeta) é uma analogia das Listas n-dimensionais. Cada camada representa uma lista e cada lista contém itens. No caso do Dynamo, cada contêiner pode ter vários contêineres dentro (representando os itens de cada lista).
As listas n-dimensionais são difíceis de explicar visualmente, mas criamos alguns exercícios neste capítulo, focados no trabalho com listas que vão além de duas dimensões.
O mapeamento é, sem dúvida, a parte mais complexa do gerenciamento de dados no Dynamo e é especialmente relevante ao trabalhar com hierarquias complexas de listas. Com a série de exercícios abaixo, vamos demonstrar quando usar o mapeamento e as combinações, à medida que os dados se tornam multidimensionais.
A introdução inicial a List.Map e List.Combine pode ser encontrada na seção anterior. No último exercício abaixo, vamos usar esses nós em uma estrutura de dados complexa.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Este exercício é o primeiro de uma série de três focado na articulação da geometria importada. Cada parte desta série de exercícios aumenta a complexidade da estrutura de dados.
Vamos começar com o arquivo .sat na pasta de arquivos de exercícios. É possível selecionar esse arquivo usando o nó Caminho do arquivo.
Com Geometry.ImportFromSAT, a geometria é importada para nossa visualização do Dynamo como duas superfícies.
Neste exercício, queremos mantê-la simples e trabalhar com uma das superfícies.
Vamos selecionar o índice de 1 para selecionar a superfície superior. Isso é feito com o nó List.GetItemAtIndex.
Desative a visualização da geometria da visualização de Geometry.ImportFromSAT.
A próxima etapa é dividir a superfície em um eixo de pontos.
1. Usando o Bloco de código, insira estas duas linhas de código:
0..1..#10;
0..1..#5;
2. Com Surface.PointAtParameter, conecte os dois valores do bloco de código a u e v. Altere a amarra desse nó para “Produto transversal”.
3. A saída exibe a estrutura de dados, que também está visível na visualização do Dynamo.
Em seguida, usamos os Pontos da última etapa para gerar dez curvas ao longo da superfície.
Para obter uma visão de como a estrutura de dados está organizada, vamos conectar NurbsCurve.ByPoints à saída de Surface.PointAtParameter.
Você pode desativar a visualização do nó List.GetItemAtIndex por enquanto para obter um resultado mais claro.
Um List.Transpose básico inverterá as colunas e as linhas de uma lista de listas.
Conectando a saída de List.Transpose a NurbsCurve.ByPoints, agora obtemos cinco curvas sendo executadas horizontalmente na superfície.
Você pode desativar a visualização do nó NurbsCurve.ByPoints na etapa anterior para obter o mesmo resultado na imagem.
Vamos aumentar a complexidade. Suponha que desejamos executar uma operação nas curvas criadas no exercício anterior. Talvez desejemos relacionar essas curvas com outra superfície e fazer a transição entre elas. Isso requer mais atenção à estrutura de dados, mas a lógica é a mesma.
Comece com uma etapa do exercício anterior, isolando a superfície superior da geometria importada com o nó List.GetItemAtIndex.
Usando Surface.Offset, desloque a superfície por um valor de 10.
Da mesma forma que no exercício anterior, defina um bloco de código com estas duas linhas de código:
0..1..#10;
0..1..#5;
Conecte essas saídas aos dois nós Surface.PointAtParameter, cada um com a amarra definida como “Produto transversal”. Um desses nós está conectado à superfície original, enquanto o outro está conectado à superfície de deslocamento.
Desative a visualização dessas superfícies.
Como no exercício anterior, conecte as saídas aos dois nós NurbsCurve.ByPoints. O resultado mostra curvas correspondentes às duas superfícies.
Usando List.Create, é possível combinar os dois conjuntos de curvas em uma lista de listas.
Observe que, na saída, temos duas listas com dez itens em cada uma, representando cada conjunto de conexão de curvas Nurbs.
Executando o nó Surface.ByLoft, podemos entender visualmente essa estrutura de dados. O nó efetua a transição de todas as curvas em cada sublista.
Desative a visualização do nó Surface.ByLoft na etapa anterior.
Se List.Transpose for usado, lembre-se de que estamos invertendo todas as colunas e linhas. Esse nó transferirá duas listas de dez curvas em dez listas de duas curvas. Agora, temos cada curva Nurbs relacionada à curva vizinha na outra superfície.
Usando Surface.ByLoft, chegamos a uma estrutura nervurada.
Em seguida, demonstraremos um processo alternativo para alcançar esse resultado
Antes de começarmos, desative a visualização de Surface.ByLoft na etapa anterior para evitar confusão.
Uma alternativa para List.Transpose é usar List.Combine. Isso executará um “combinador” em cada sublista.
Neste caso, estamos usando List.Create como o “combinador”, o que criará uma lista de cada item nas sublistas.
Usando o nó Surface.ByLoft, obtemos as mesmas superfícies que as da etapa anterior. A transposição é mais fácil de usar nesse caso, mas quando a estrutura de dados se torna ainda mais complexa, List.Combine é mais confiável.
Retrocedendo algumas etapas, se quisermos alternar a orientação das curvas na estrutura nervurada, deveremos usar List.Transpose antes de conectar a NurbsCurve.ByPoints. Isso inverterá as colunas e linhas, resultando em cinco nervuras horizontais.
Agora, vamos um pouco mais longe. Neste exercício, vamos trabalhar com as duas superfícies importadas, criando uma hierarquia de dados complexa. Ainda assim, nosso objetivo é concluir a mesma operação com a mesma lógica subjacente.
Comece com o arquivo importado do exercício anterior.
Como no exercício anterior, use o nó Surface.Offset para deslocar por um valor de 10.
Observe, na saída, que criamos duas superfícies com o nó de deslocamento.
Da mesma forma que no exercício anterior, defina um Bloco de código com estas duas linhas de código:
0..1..#20;
0..1..#20;
Conecte essas saídas aos dois nós Surface.PointAtParameter, cada um com a amarra definida como “Produto transversal”. Um desses nós está conectado às superfícies originais, enquanto o outro está conectado às superfícies de deslocamento.
Como no exercício anterior, conecte as saídas aos dois nós NurbsCurve.ByPoints.
Observando a saída de NurbsCurve.ByPoints,, é possível ver que esta é uma lista de duas listas, que é mais complexa do que no exercício anterior. Os dados são categorizados pela superfície subjacente; portanto, adicionamos outro nível aos dados estruturados.
Observe que as coisas se tornam mais complexas no nó Surface.PointAtParameter. Neste caso, temos uma lista de listas de listas.
Antes de prosseguir, desative a visualização das superfícies existentes.
Usando o nó List.Create, mesclamos as curvas Nurbs em uma estrutura de dados, criando uma lista de listas de listas.
Conectando um nó Surface.ByLoft, obtemos uma versão das superfícies originais, pois cada uma delas permanece em sua própria lista, conforme foram criadas com base na estrutura de dados original.
No exercício anterior, usamos List.Transpose para criar uma estrutura nervurada. Isso não funcionará aqui. A transposição deve ser usada em uma lista bidimensional e, como nós temos uma lista tridimensional, uma operação de “inverter colunas e linhas” não funcionará tão facilmente. Lembre-se de que as listas são objetos; portanto, List.Transpose inverterá nossas listas com as sublistas, mas não inverterá as curvas Nurbs uma lista mais abaixo na hierarquia.
List.Combine funcionará melhor neste caso. Devemos usar os nós List.Map e List.Combine quando chegarmos a estruturas de dados mais complexas.
Usando List.Create como o “combinador”, criamos uma estrutura de dados que funcionará melhor.
A estrutura de dados ainda precisa ser transposta uma etapa abaixo na hierarquia. Para fazer isso, vamos usar List.Map. Isso funciona como List.Combine, mas com uma lista de entrada, em vez de duas ou mais.
A função que será aplicada a List.Map é List.Transpose, que inverterá as colunas e as linhas das sublistas em nossa lista principal.
Finalmente, podemos fazer a transição entre as curvas Nurbs junto com uma hierarquia de dados adequada, gerando uma estrutura nervurada.
Vamos adicionar alguma profundidade à geometria com um nó Surface.Thicken, com as configurações de entrada conforme mostrado.
É recomendado adicionar uma superfície de apoio a duas estruturas; portanto, adicione outro nó Surface.ByLoft e use a primeira saída de NurbsCurve.ByPoints de uma etapa anterior como entrada.
À medida que a visualização for ficando confusa, desative a visualização desses nós clicando com o botão direito do mouse em cada um deles e desmarque a opção “Visualização” para ver melhor o resultado.
Depois de tornarmos mais espessas essas superfícies selecionadas, nossa articulação estará completa.
Não é a cadeira de balanço mais confortável de todos os tempos, mas há muitos dados em jogo.
Última etapa: vamos inverter a direção dos membros com listras. Como usamos a função de transposição no exercício anterior, faremos algo semelhante aqui.
Como temos mais um nível para a hierarquia, vamos precisar usar List.Map com uma função de List.Tranpose para alterar a direção das curvas Nurbs.
Podemos querer aumentar o número de degraus, então podemos alterar o Bloco de código para
0..1..#20;
0..1..#30;
Como a primeira versão da cadeira de balanço era elegante, nosso segundo modelo oferece uma versão alternativa, de utilidade esportiva para descanso dorsal.
Depois de criar alguns nós personalizados, a próxima etapa é começar a organizá-los e publicá-los por meio de pacotes: uma forma conveniente de armazenar e compartilhar os nós com a Comunidade do Dynamo.
O Dynamo oferece muitos nós principais para uma ampla gama de tarefas de programação visual. Às vezes, uma solução mais rápida, mais elegante ou compartilhada com mais facilidade consiste em construir seus próprios nós. Eles podem ser reusados em diferentes projetos e tornam os gráficos mais claros e limpos, além de poderem ser enviados para o gerenciador de pacotes e compartilhados com a comunidade global do Dynamo.
Logo de início, o Dynamo tem uma grande quantidade de funções armazenadas em sua Biblioteca de nós. Para as rotinas usadas com frequência ou aquele gráfico especial que você deseja compartilhar com a comunidade, os pacotes e nós personalizados são uma ótima maneira de estender o Dynamo ainda mais.
Os nós personalizados são construídos pelo agrupamento de outros nós e dos nós personalizados dentro de um “nó personalizado do Dynamo”, que podemos pensar conceitualmente como um contêiner. Quando esse nó de contêiner é executado no gráfico, tudo dentro dele será executado para permitir a reutilização e o compartilhamento de uma combinação útil de nós.
Quando você tem várias cópias de um nó personalizado no gráfico, é possível atualizar todas elas editando o nó personalizado de base. Isso permite atualizar o gráfico sem problemas, adaptando-se a quaisquer alterações que possam ocorrer no fluxo de trabalho ou no projeto.
O melhor recurso dos nós personalizados é a forma de compartilhamento de trabalho. Se um “usuário avançado” criar um gráfico do Dynamo complexo e o entregar a um designer iniciante no Dynamo, ele poderá condensar o gráfico para exibir o essencial para a interação do projeto. Será possível abrir o nó personalizado para editar o gráfico interno, mas o “contêiner” poderá ser mantido simples. Com esse processo, os nós personalizados permitem que os usuários do Dynamo projetem um gráfico limpo e intuitivo.
Vamos para o ambiente de nó personalizado e criar um nó simples para calcular uma porcentagem. O ambiente de nó personalizado é diferente do ambiente gráfico do Dynamo, mas a interação é fundamentalmente a mesma. Com isso, vamos criar nosso primeiro nó personalizado.
Para criar um nó personalizado do zero, inicie o Dynamo e selecione Nó personalizado ou digite Ctrl + Shift + N na tela.
Atribua um nome, uma descrição e uma categoria na caixa de diálogo Propriedades de nó personalizado.
Nome: porcentagem
Descrição: calcula a porcentagem de um valor em relação a outro.
Categoria: Math.Functions
Isso abrirá uma tela com um fundo amarelo, indicando que você está trabalhando dentro de um nó personalizado. Nessa tela, você tem acesso a todos os nós principais do Dynamo, bem como aos nós Input e Output, que rotulam os dados que fluem para dentro e para fora do nó personalizado. Eles podem ser encontrados em Entrada>Básico.
Entradas: os nós de entrada criam portas de entrada no nó personalizado. A sintaxe para um nó de entrada é input_name : datatype = default_value(optional).
É possível salvar esse nó personalizado como um arquivo .dyf (em oposição ao arquivo .dyn padrão) e ele será automaticamente adicionado à sua sessão e a sessões futuras. Você encontrará o nó personalizado na biblioteca na seção Complementos.
Agora que criamos nosso primeiro nó personalizado, as próximas seções se aprofundarão na funcionalidade dos nós personalizados e como publicar fluxos de trabalho genéricos. Na seção a seguir, vamos analisar o desenvolvimento de um nó personalizado que transfere a geometria de uma superfície para outra.
Acabamos de criar um nó personalizado e aplicá-lo a um processo específico em nosso gráfico do Dynamo. Gostamos tanto desse nó, por isso queremos mantê-lo em nossa biblioteca do Dynamo para usar como referência em outros gráficos. Para fazer isso, vamos publicar o nó localmente. Este é um processo semelhante ao de publicar um pacote, que iremos mostrar em mais detalhes no próximo capítulo.
Quando publicar um nó localmente, o nó estará acessível na biblioteca do Dynamo quando você abrir uma nova sessão. Se nenhum nó for publicado, o gráfico do Dynamo que faz referência a um nó personalizado também deverá ter aquele nó personalizado em sua pasta (ou o nó personalizado deverá ser importado para o Dynamo usando Arquivo > Importar biblioteca).
É possível publicar nós e pacotes personalizados do Dynamo Sandbox na versão 2.17 e mais recentes, desde que não tenham dependências de APIs do hospedeiro. Em versões anteriores, a publicação de nós e pacotes personalizados somente estava ativada no Dynamo for Revit e no Dynamo for Civil 3D.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Vamos avançar com o nó personalizado que criamos na seção anterior. Quando o nó personalizado PointsToSurface é aberto, vemos o gráfico no Editor de nós personalizados do Dynamo. Também é possível abrir um nó personalizado clicando duas vezes nele no Editor de gráficos do Dynamo.
Para publicar um nó personalizado localmente, basta clicar com o botão direito do mouse na tela e selecionar “Publicar este nó personalizado...”
Preencha as informações relevantes de forma similar à imagem acima e selecione “Publicar localmente”. Observe que o campo Grupo define o elemento principal acessível no menu do Dynamo.
Escolha uma pasta para armazenar todos os nós personalizados que você planeja publicar localmente. O Dynamo verificará essa pasta sempre que ela for carregada, portanto, certifique-se de que a pasta esteja em um local permanente. Navegue até essa pasta e escolha “Selecionar pasta”. O nó do Dynamo agora é publicado localmente e permanecerá na biblioteca do Dynamo cada vez que você carregar o programa.
Para verificar a localização da pasta de nós personalizados, vá para Dynamo > Preferências > Configurações do pacote > Caminhos de nós e pacotes.
Nessa janela, vemos uma lista de caminhos.
Documentos\DynamoCustomNodes... refere-se à localização dos nós personalizados que publicamos localmente.
AppData\Roaming\Dynamo... refere-se à localização padrão dos pacotes do Dynamo instalados on-line.
Você pode desejar mover o caminho da pasta local para baixo na ordem da lista (clicando na seta para baixo à esquerda do nome do caminho). A pasta superior é o caminho padrão para a instalação do pacote. Portanto, mantendo o caminho de instalação do pacote do Dynamo padrão como a pasta padrão, os pacotes on-line serão separados dos nós publicados localmente.
Alteramos a ordem dos nomes de caminhos para que o caminho padrão do Dynamo seja o local de instalação do pacote.
Navegando para essa pasta local, poderemos encontrar o nó personalizado original na pasta “.dyf”, que é a extensão de arquivo de nós personalizados do Dynamo. Podemos editar o arquivo nessa pasta e o nó será atualizado na interface do usuário. Também é possível adicionar mais nós à pasta principal DynamoCustomNode e o Dynamo os adicionará à biblioteca ao ser reiniciado.
O Dynamo agora será carregado sempre com “PointsToSurface” no grupo “DynamoPrimer” da biblioteca do Dynamo.
O Dynamo oferece um grande número de recursos prontos para uso e também mantém uma ampla biblioteca de pacotes que pode estender significativamente a capacidade do Dynamo. Um pacote é uma coleção de nós personalizados ou funcionalidades adicionais. O Dynamo Package Manager é um portal para a comunidade fazer download de qualquer pacote que tenha sido publicado on-line. Esses conjuntos de ferramentas são desenvolvidos por terceiros para estender a funcionalidade central do Dynamo, acessível a todos, e prontos para download com o clique do botão.
Um projeto de código aberto, como o Dynamo, prospera com esse tipo de envolvimento da comunidade. Com desenvolvedores de terceiros dedicados, o Dynamo é capaz de estender seu alcance para os fluxos de trabalho em uma variedade de setores. Por esse motivo, a equipe do Dynamo tem feito esforços em conjunto para simplificar o desenvolvimento e a publicação de pacotes (que serão discutidos mais detalhadamente nas seções a seguir).
A maneira mais fácil de instalar um pacote é usando a opção de menu Pacotes na interface do Dynamo. Vamos entrar nele e instalar um pacote agora. Neste exemplo rápido, vamos instalar um pacote popular para criar painéis quadrados em uma grade.
No Dynamo, vá para Pacotes > Package Manager...
Na barra de pesquisa, vamos procurar “quadrados na grade retangular”. Após alguns momentos, você deverá ver todos os pacotes que correspondem a essa consulta de pesquisa. Queremos selecionar o primeiro pacote com o nome correspondente.
Clique em Instalar para adicionar esse pacote à biblioteca e, em seguida, aceite a confirmação. Concluído.
Observe que agora temos outro grupo em nossa biblioteca do Dynamo, chamado “buildz”. Esse nome se refere ao desenvolvedor do pacote e o nó personalizado é colocado nesse grupo. Podemos começar a usá-lo imediatamente.
Use Bloco de código para definir rapidamente uma grade retangular, gere a saída do resultado para um nó Polygon.ByPoints e, subsequentemente, um nó Surface.ByPatch para visualizar a lista de painéis retangulares que você acabou de criar.
O exemplo acima se concentra em um pacote com um nó personalizado, mas você usa o mesmo processo para fazer o download de pacotes com diversos nós personalizados e arquivos de dados de suporte. Vamos demonstrar isso agora, com um pacote mais abrangente: o Dynamo Unfold.
Como no exemplo acima, comece selecionando Pacotes > Package Manager...
Desta vez, vamos procurar “DynamoUnfold”, uma palavra. Quando os pacotes forem exibidos, faça o download clicando em Instalar para adicionar o Dynamo Unfold à biblioteca do Dynamo.
Na biblioteca do Dynamo, temos um grupo DynamoUnfold com várias categorias e vários nós personalizados.
Agora, vamos analisar a estrutura de arquivos do pacote.
Primeiro, vá para Pacotes > Package Manager > Pacotes instalados.
Em seguida, clique em Mostrar diretório raiz para abrir a pasta raiz desse pacote.
Isso nos leva ao diretório raiz do pacote. Observe que temos três pastas e um arquivo.
A pasta bin contém os arquivos .dll. Esse pacote do Dynamo foi desenvolvido usando a funcionalidade Sem toque; por isso, os nós personalizados são mantidos nessa pasta.
A pasta dyf contém os nós personalizados. Esse pacote não foi desenvolvido usando os nós personalizados do Dynamo; portanto, a pasta está vazia para esse pacote.
A pasta extra contém todos os arquivos adicionais, inclusive os arquivos de exemplo.
O arquivo pkg é um arquivo de texto básico que define as configurações do pacote. Podemos ignorar isso por enquanto.
Abrindo a pasta “extra”, vemos muitos arquivos de exemplo que foram obtidos por download com a instalação. Nem todos os pacotes têm arquivos de exemplo, mas será possível encontrá-los se fizerem parte de um pacote.
Vamos abrir “SphereUnfold”.
Após abrir o arquivo e pressionar “Executar” no solucionador, teremos uma esfera desdobrada. Arquivos de exemplo como esses são úteis para saber como trabalhar com um novo pacote do Dynamo.
No Package Manager, é possível procurar pacotes usando as opções de classificação e filtragem na guia Procurar pacotes. Há vários filtros disponíveis para o programa hospedeiro, status (novo, obsoleto ou não) e se o pacote tem dependências.
Através da classificação de pacotes, é possível identificar os pacotes com alta classificação ou aqueles com mais downloads, ou encontrar pacotes com atualizações recentes.
Também é possível acessar mais detalhes em cada pacote clicando em Exibir detalhes. Isso abre um painel lateral no Package Manager, onde é possível encontrar informações como controle de versão e dependências, URL do site ou do repositório, informações de licença etc.
Se você quiser ver onde os arquivos dos pacotes estão armazenados, na parte superior da navegação, clique em Dynamo > Preferências > Configurações do pacote > Localizações dos arquivos de nós e pacotes. Você poderá encontrar o diretório da pasta raiz atual aqui.
Por padrão, os pacotes são instalados em uma localização similar a este caminho de pasta: C:/Usuários/[nome de usuário]/AppData/Roaming/Dynamo/[versão do Dynamo].
A comunidade do Dynamo está crescendo e evoluindo constantemente. Explorando o Dynamo Package Manager periodicamente, você encontrará alguns novos desenvolvimentos empolgantes. Nas seções a seguir, analisaremos com mais detalhes os pacotes, da perspectiva do usuário final até a criação do seu próprio pacote do Dynamo.
Há uma ampla variedade de maneiras de criar nós personalizados no Dynamo. Nos exemplos neste capítulo, vamos criar nós personalizados diretamente na interface do usuário do Dynamo. Se você for um programador e tiver interesse na formatação C# ou Sem toque, poderá consultar na Wiki do Dynamo para obter uma revisão mais aprofundada.
Saídas: de forma semelhante às entradas, os nós de saída criam e nomeiam as portas de saída no nó personalizado. Considere a possibilidade de adicionar um Comentário personalizado às portas de entrada e saída para indicar os tipos de entrada e saída. Isso é discutido em mais detalhes na seção .
Ao lado de DynamoUnfold, selecione o menu de opções .
Outra forma de descobrir pacotes do Dynamo é explorar o site do . Nesse site, é possível encontrar estatísticas sobre os pacotes e criar quadros de pontuação. Também é possível fazer o download dos arquivos do pacote no Dynamo Package Manager, mas fazer isso diretamente no Dynamo é um processo mais intuitivo.
Embora o Dynamo tenha sido originalmente criado com o Revit em mente, sua versatilidade como ferramenta de programação visual se estende além do Revit. O Dynamo também está integrado no Civil 3D, permitindo que os usuários criem rotinas de automação poderosas para projetos de infraestrutura civil. É uma ferramenta extremamente útil para processar qualquer tarefa, desde as comuns até os fluxos de trabalho de projeto mais complexos, ajudando, em última análise, a economizar tempo, otimizar os projetos e tomar melhores decisões de projeto. O Dynamo oferece um conjunto completo de nós especificamente projetados para o Civil 3D, bem como bibliotecas de terceiros de uma comunidade consolidada.
Este capítulo do manual se concentrará no Dynamo for Civil 3D, começando com os conceitos básicos e chegando até tópicos mais avançados.
Embora o Dynamo seja um ambiente flexível, projetado para criar uma ampla gama de programas, ele foi originalmente criado para uso com o Revit. Um programa visual cria opções robustas para o BIM (Building Information Model – Modelo de informações de construção). O Dynamo oferece um conjunto completo de nós especificamente projetados para o Revit, bem como bibliotecas de terceiros de uma comunidade AEC em evolução. Este capítulo foca nos conceitos básicos do uso do Dynamo no Revit.
O Kit de ferramentas de malha do Dynamo fornece ferramentas para importar malhas de formatos de arquivos externos, para criar uma malha com base nos objetos de geometria do Dynamo e para criar manualmente malhas de acordo com seus vértices e índices. A biblioteca também fornece ferramentas para modificar malhas, reparar malhas ou extrair camadas horizontais para uso na fabricação.
O Kit de ferramentas de malha do Dynamo faz parte da pesquisa contínua sobre malhas da Autodesk e, como tal, continuará a crescer nos próximos anos. Pode contar com o aparecimento frequente de novos métodos no kit de ferramentas. Sinta-se à vontade para entrar em contato com a equipe do Dynamo com comentários, bugs e sugestões de novos recursos.
O exercício abaixo demonstra algumas operações básicas de malha usando o Kit de ferramentas de malha. No exercício, intersecionamos uma malha com uma série de planos, que podem ser computacionalmente caros usando sólidos. Ao contrário de um sólido, uma malha tem uma “resolução” definida e não é definida matematicamente, e sim topologicamente, sendo possível definir essa resolução com base na tarefa em questão. Para obter mais detalhes sobre as relações entre malhas e sólidos, consulte o capítulo Geometria do projeto computacional neste manual. Para uma análise mais completa do Kit de ferramentas de malha, consulte a página Wiki do Dynamo. Vamos analisar o pacote no exercício abaixo.
No Dynamo, vá para Pacotes > Package Manager... na barra de menus superior. No campo de pesquisa, digite MeshToolkit, uma única palavra. Clique em Instalar e aceite as confirmações para iniciar o download. É tão simples quanto isso.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Neste exemplo, vamos analisar o nó Intersect no kit de ferramentas de malha. Vamos importar uma malha e intersecioná-la com uma série de planos de entrada para criar fatias. Esse é o ponto inicial para preparar o modelo para fabricação de um cortador a laser, um cortador a jato de água ou uma fresa CNC.
Para começar, abra Mesh-Toolkit_Intersect-Mesh.dyn in Dynamo.
Caminho do arquivo: localize o arquivo de malha a ser importado (stanford_bunny_tri.obj). Os tipos de arquivo suportados são .mix e .obj
Mesh.ImportFile: conecte o caminho do arquivo para importar a malha
Point.ByCoordinates: crie um ponto, ele será o centro de um arco.
Arc.ByCenterPointRadiusAngle: crie um arco em torno do ponto. Essa curva será usada para posicionar uma série de planos. __ As configurações são as seguintes: __
radius: 40, startAngle: -90, endAngle:0
Crie uma série de planos orientados ao longo do arco.
Bloco de código: crie 25 números entre 0 e 1.
Curve.PointAtParameter: conecte o arco à entrada “curva” e a saída do bloco de código à entrada “parâmetro” para extrair uma série de pontos ao longo da curva.
Curve.TangentAtParameter: conecte as mesmas entradas do nó anterior.
Plane.ByOriginNormal: conecte os pontos à entrada “origem” e os vetores à entrada “normal” para criar uma série de planos em cada ponto.
Em seguida, usaremos esses planos para fazer a interseção com a malha.
Mesh.Intersect: faça a interseção dos planos com a malha importada, criando uma série de contornos de policurvas. Clique com o botão direito do mouse em Nó e defina a amarra como a mais longa
PolyCurve.Curves: divida as policurvas em seus fragmentos de curva.
Curve.EndPoint: extraia os pontos finais de cada curva.
NurbsCurve.ByPoints: use os pontos para criar uma curva Nurbs. Use um nó Booleano definido como True para fechar as curvas.
Antes de continuar, desative a visualização de alguns dos nós, como: Mesh.ImportFile, Curve.EndPoint, Plane.ByOriginNormal e Arc.ByCenterPointRadiusAngle para ver melhor o resultado.
Surface.ByPatch: crie as correções de superfícies para cada contorno para criar “fatias” da malha.
Adicione um segundo conjunto de fatias para obter um efeito waffle/caixa de ovos.
Você pode ter notado que as operações de intersecção são calculadas mais rapidamente com uma malha do que com um sólido comparável. Fluxos de trabalho como o demonstrado neste exercício ajudam a trabalhar com malhas.
Nas seções anteriores, analisamos os detalhes de como o pacote MapToSurface é configurado com nós personalizados e arquivos de exemplo. Mas como publicamos um pacote que foi desenvolvido localmente? Este estudo de caso demonstra como publicar um pacote de um conjunto de arquivos em uma pasta local.
Há diversas formas de publicar um pacote. Confira abaixo o processo que aconselhamos: publicar localmente, desenvolver localmente e publicar on-line. Vamos começar com uma pasta contendo todos os arquivos do pacote.
Antes de passarmos para a publicação do pacote MapToSurface, se você instalou o pacote da lição anterior, desinstale-o para que não esteja trabalhando com pacotes idênticos.
Para começar, vá para a guia Pacotes > Package Manager > Pacotes instalados > ao lado de MapToSurface, clique no menu de pontos verticais > Excluir.
Em seguida, reinicie o Dynamo. Depois de reabrir, quando você verificar a janela “Gerenciar pacotes”, o MapToSurface não deverá mais estar lá. Agora estamos prontos para começar.
É possível publicar nós e pacotes personalizados do Dynamo Sandbox na versão 2.17 e mais recentes, desde que não tenham dependências de APIs do hospedeiro. Em versões anteriores, a publicação de nós e pacotes personalizados somente estava ativada no Dynamo for Revit e no Dynamo for Civil 3D.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Este é o primeiro envio para o nosso pacote e colocamos todos os arquivos de exemplo e nós personalizados em uma pasta. Com essa pasta preparada, estamos prontos para carregar no Dynamo Package Manager.
Essa pasta contém cinco nós personalizados (.dyf).
Essa pasta também contém cinco arquivos de exemplo (.dyn) e um arquivo de vetor importado (.svg). Esses arquivos servirão como exercícios introdutórios para mostrar ao usuário como trabalhar com os nós personalizados.
No Dynamo, comece clicando na guia Pacotes > Package Manager > Publicar novo pacote.
Na guia Publicar um pacote, preencha os campos relevantes no lado esquerdo da janela.
Em seguida, adicionaremos arquivos de pacote. É possível adicionar arquivos um a um ou todas as pastas selecionando Adicionar diretório (1). Para adicionar arquivos que não são arquivos .dyf, assegure-se de alterar o tipo de arquivo na janela do navegador para “Todos os arquivos (.)”. Observe que vamos adicionar indiscriminadamente cada arquivo, nó personalizado (.dyf) ou arquivo de exemplo (.dyn). O Dynamo categorizará esses itens quando o pacote for publicado.
Depois de selecionar a pasta MapToSurface, o Package Manager mostrará o conteúdo da pasta. Se você estiver carregando seu próprio pacote com uma estrutura de pastas complexa e não quiser que o Dynamo faça alterações na estrutura de pastas, poderá ativar a alternância “Manter estrutura de pastas”. Essa opção é para usuários avançados e, se o pacote não for configurado deliberadamente de uma forma específica, será melhor deixar essa alternância desativada e permitir que o Dynamo organize os arquivos conforme necessário. Clique em Avançar para continuar.
Aqui, você tem a chance de visualizar como o Dynamo organizará os arquivos do pacote antes da publicação. Clique em Concluir para continuar.
Publique clicando em “Publicar localmente” (1). Após completar esses passos, certifique-se de clicar em “Publicar localmente” e não em “Publicar on-line” para evitar ter um acúmulo de pacotes duplicados no Package Manager.
Após a publicação, os nós personalizados devem estar disponíveis no grupo “DynamoPrimer” ou na Biblioteca do Dynamo.
Agora, vamos examinar o diretório raiz para ver como o Dynamo formatou o pacote que acabamos de criar. Para fazer isso, vá para a guia Pacotes instalados > ao lado de MapToSurface, clique no menu de pontos verticais > selecione Mostrar diretório raiz.
Observe que o diretório raiz está na localização local do pacote (lembre-se de que publicamos o pacote “localmente”). O Dynamo está fazendo referência a esta pasta para ler nós personalizados. Portanto, é importante publicar localmente o diretório em uma localização de pasta permanente (ou seja, não na área de trabalho). Veja a seguir o detalhamento da pasta do pacote do Dynamo.
A pasta bin contém os arquivos .dll criados com bibliotecas C# ou Sem toque. Não temos nenhum arquivo desse tipo nesse pacote; portanto, a pasta está em branco neste exemplo.
A pasta dyf contém os nós personalizados. Depois de abrir essa pasta, serão exibidos todos os nós personalizados (arquivos .dyf) desse pacote.
A pasta adicional contém todos os arquivos adicionais. É provável que esses arquivos sejam arquivos do Dynamo (.dyn) ou qualquer arquivo adicional necessário (.svg, .xls, .jpeg, .sat, etc.).
O arquivo pkg é um arquivo de texto básico que define as configurações do pacote. Isso é automatizado no Dynamo, mas pode ser editado se você deseja entrar nos detalhes.
Observação: Siga estas etapas somente se você estiver realmente publicando um pacote próprio.
Quando estiver pronto para publicar, na janela Pacotes > Package Manager > Pacotes instalados, selecione o botão à direita do pacote que deseja publicar e escolha Publicar.
Se você estiver atualizando um pacote que já foi publicado, selecione “Publicar versão” e o Dynamo atualizará o pacote on-line com base nos novos arquivos no diretório raiz do pacote. Simples assim!
Ao atualizar os arquivos na pasta raiz do pacote publicado, também é possível publicar uma nova versão do pacote selecionando “Publicar versão...” na guia Meus pacotes. Essa é uma forma perfeita para fazer atualizações necessárias ao conteúdo e para compartilhar com a comunidade. A opção Publicar versão só funcionará se você for o administrador do pacote.
O Dynamo oferece diversas formas de criar um pacote para seu uso pessoal ou para compartilhar com a comunidade do Dynamo. No estudo de caso abaixo, vamos analisar como um pacote é configurado desconstruindo um existente. Este estudo de caso baseia-se nas lições do capítulo anterior, fornecendo um conjunto de nós personalizados para o mapeamento de geometria, por coordenadas UV, de uma superfície do Dynamo para outra.
Vamos trabalhar com um pacote de amostra que demonstra o mapeamento UV de pontos de uma superfície para outra. Já desenvolvemos os conceitos básicos da ferramenta na seção Criar um nó personalizado deste manual. Os arquivos abaixo demonstram como podemos usar o conceito de mapeamento UV e desenvolver um conjunto de ferramentas para uma biblioteca publicável.
Nessa imagem, mapeamos um ponto de uma superfície para outra usando as coordenadas UV. O pacote é baseado nesse conceito, mas com uma geometria mais complexa.
No capítulo anterior, exploramos formas de criar painéis em uma superfície no Dynamo com base nas curvas definidas no plano XY. Este estudo de caso estende esses conceitos para mais cotas de geometria. Vamos instalar esse pacote conforme construído para demonstrar como ele foi desenvolvido. Na próxima seção, demonstraremos como esse pacote foi publicado.
No Dynamo, clique em Pacotes > Package Manager e procure o pacote “MapToSurface” (uma única palavra). Clique em Instalar para iniciar o download e adicionar o pacote à biblioteca.
Após a instalação, os nós personalizados devem estar disponíveis na seção Complementos > DynamoPrimer.
Com o pacote já instalado, vamos analisar como ele está configurado.
O pacote que estamos criando usa cinco nós personalizados que criamos para referência. Vamos examinar o que cada nó faz abaixo. Alguns nós personalizados são criados com base em outros nós personalizados, e os gráficos têm um layout para que outros usuários compreendam de forma simples.
Esse é um pacote simples com cinco nós personalizados. Nas etapas abaixo, falaremos brevemente sobre a configuração de cada nó personalizado.
Esse é um nó personalizado básico e no qual todos os outros nós de mapeamento estão baseados. Em termos simples, o nó mapeia um ponto de uma coordenada UV da superfície de origem para o local da coordenada UV a superfície de destino. Como os pontos são a geometria mais primitiva, a partir da qual se constrói uma geometria mais complexa, podemos usar essa lógica para mapear a geometria 2D e até mesmo a geometria 3D de uma superfície para outra.
A lógica de estender pontos mapeados da geometria 1D para a geometria 2D é demonstrada aqui simplesmente com polígonos. Observe que aninhamos o nó “PointsToSurface” nesse nó personalizado. Dessa forma, é possível mapear os pontos de cada polígono para a superfície e, em seguida, regenerar o polígono com base nesses pontos mapeados. Mantendo a estrutura de dados apropriada (uma lista de listas de pontos), podemos manter os polígonos separados após serem reduzidos a um conjunto de pontos.
A mesma lógica do nó “PolygonsToSurface” se aplica aqui. Mas, em vez de mapear pontos poligonais, estamos mapeando pontos de controle de uma curva Nurbs.
OffsetPointsToSurface
Esse nó é um pouco mais complexo, mas o conceito é simples: como o nó “PointsToSurface”, esse nó mapeia pontos de uma superfície para outra. No entanto, ele também considera os pontos que não estão na superfície de origem, obtém sua distância até o parâmetro UV mais próximo e mapeia essa distância para a normal da superfície-alvo na coordenada UV correspondente. Isso fará mais sentido ao analisar os arquivos de exemplo.
Esse é um nó simples que cria uma superfície paramétrica para mapear da grade de origem para uma superfície ondulada nos arquivos de exemplo.
Os arquivos de exemplo podem ser encontrados na pasta raiz do pacote. Clique na guia Package Manager > Pacotes instalados.
Ao lado de MapToSurface, clique no menu de pontos verticais > Mostrar diretório raiz.
Em seguida, abra a pasta “extra”, que contém todos os arquivos do pacote que não são nós personalizados. Esse é o local onde os arquivos de exemplos (se existirem) são armazenados para pacotes do Dynamo. As capturas de tela abaixo apresentam os conceitos demonstrados em cada arquivo de exemplo.
Esse arquivo de exemplo demonstra como “PointsToSurface” pode ser usado para criar painéis em uma superfície com base em uma grade de retângulos. Isso deve parecer familiar para você, pois demonstramos um fluxo de trabalho similar no capítulo anterior.
Usando um fluxo de trabalho semelhante, esse arquivo de exercício mostra uma configuração para o mapeamento de círculos (ou polígonos que representam círculos) de uma superfície para outra. Isso usa o nó “PolygonsToSurface”.
Esse arquivo de exemplo adiciona alguma complexidade ao trabalhar com o nó “NurbsCrvToSurface”. A superfície alvo é deslocada uma determinada distância e a curva Nurbs é mapeada para a superfície alvo original e para a superfície de deslocamento. A partir daí, as duas curvas mapeadas são elevadas para criar uma superfície, que então se torna mais espessa. Esse sólido resultante apresenta uma ondulação representativa das normais da superfície-alvo.
Esse arquivo de exemplo demonstra como mapear uma PolySurface plissada de uma superfície de origem para uma superfície-alvo. A superfície de origem e a de destino são uma superfície retangular que se estende pela grade e uma superfície de revolução, respectivamente.
A PolySurface de origem é mapeada da superfície de origem para a superfície de destino.
Como os nós personalizados são capazes de mapear diferentes tipos de curvas, esse último arquivo faz referência a um arquivo SVG exportado do Illustrator e mapeia as curvas importadas para uma superfície-alvo.
Durante a análise da sintaxe de um arquivo .svg, as curvas são convertidas do formato .xml para policurvas do Dynamo.
As curvas importadas são mapeadas para uma superfície-alvo. Isso nos permite projetar explicitamente (apontar e clicar) uma panorâmica no Illustrator, importar para o Dynamo e aplicar a uma superfície de destino.
A importação sem toque é um método simples de apontar e clicar para importar bibliotecas C#. O Dynamo lê os métodos públicos de um arquivo .dll e os converte em nós do Dynamo. É possível usar a funcionalidade Sem toque para desenvolver seus próprios nós e pacotes personalizados e para importar bibliotecas externas para o ambiente do Dynamo.
Arquivos .dll
Nós do Dynamo
Com a funcionalidade Sem toque, é possível importar de fato uma biblioteca que não foi necessariamente desenvolvida para o Dynamo e criar um conjunto de novos nós. A funcionalidade Sem toque atual demonstra a mentalidade do projeto do Dynamo entre plataformas.
Esta seção demonstra como usar a funcionalidade Sem toque para importar uma biblioteca de terceiros. Para obter informações sobre como desenvolver sua própria biblioteca sem toque, consulte a página wiki do Dynamo.
Os pacotes sem toque são um bom complemento aos nós personalizados definidos pelo usuário. Alguns pacotes que usam bibliotecas C# são listados na tabela abaixo. Para obter informações mais detalhadas sobre os pacotes, consulte a seção Pacotes no Apêndice.
Logotipo/Imagem
Nome
Neste estudo de caso, vamos mostrar como importar a biblioteca .dll externa AForge. O AForge é uma biblioteca robusta que oferece uma variedade de funcionalidades de processamento de imagens para inteligência artificial. Vamos fazer referência à classe de imagens no AForge para fazer alguns exercício de processamento de imagens abaixo.
Vamos começar por fazer o download do AForge. Na página de download do AForge, selecione [Instalador de download] e faça a instalação após a conclusão do download.
No Dynamo, crie um novo arquivo e selecione Arquivo > Importar biblioteca...
Em seguida, localize o arquivo dll.
Na janela pop-up, navegue até a pasta de lançamento na instalação do AForge. Provavelmente isso estará em uma pasta semelhante a esta: C:\Arquivos de Programas (x86)\AForge.NET\Framework\Release.
AForge.Imaging.dll: somente queremos usar esse arquivo da biblioteca do AForge para este estudo de caso. Selecione este arquivo .dll e clique em “Abrir”.
De volta ao Dynamo, você deve ver um grupo de nós do AForge adicionados à biblioteca. Agora, temos acesso à biblioteca de imagens do AForge do nosso programa visual.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Agora que a biblioteca foi importada, começaremos de forma simples com este primeiro exercício (01-EdgeDetection.dyn). Vamos fazer um processamento básico de imagens em uma imagem de amostra para mostrar como o AForge filtra as imagens. Usaremos o nó “Inspeção de imagem” para mostrar nossos resultados e aplicar filtros no Dynamo de forma similar aos do Photoshop.
Para importar uma imagem, adicione um nó Caminho do arquivo à tela e selecione “soapbubbles.jpg” na pasta de exercícios (créd. foto: flickr).
O nó Caminho do arquivo simplesmente fornece uma sequência de caracteres do caminho para a imagem que selecionamos. Em seguida, precisamos convertê-la em um arquivo de imagem usável no Dynamo.
Use Arquivo do caminho para converter o item do caminho do arquivo em uma imagem no ambiente do Dynamo.
Conecte o nó Caminho do arquivo ao nó File.FromPath.
Para converter esse arquivo em uma imagem, usaremos o nó Image.ReadFromFile.
Por último, vamos ver o resultado. Solte um nó Inspeção de imagem na tela e conecte-se a Image.ReadFromFile. Ainda não usamos o AForge, mas importamos com êxito uma imagem para o Dynamo.
Em AForge.Imaging.AForge.Imaging.Filters (no menu de navegação), você notará que há uma ampla gama de filtros disponíveis. Agora, vamos usar um desses filtros para diminuir a saturação de uma imagem com base nos valores-limite.
Solte três controles deslizantes na tela, altere seus intervalos para que fiquem de 0 a 1 e seus valores de etapas para 0,01.
Adicione o nó Grayscale.Grayscale à tela. Esse é um filtro do AForge que aplica um filtro de escala de cinza a uma imagem. Conecte os três controles deslizantes da etapa 1 a cr, cg e cb. Altere os controles deslizantes superior e inferior para ter um valor de 1 e o controle deslizante do meio para ter um valor de 0.
Para aplicar o filtro escala de cinza, é necessário executar uma ação em nossa imagem. Para isso, usamos BaseFilter.Apply. Conecte a imagem à entrada de imagem e Grayscale.Grayscale à entrada baseFilter.
A conexão a um nó Inspeção de imagem permitirá obter uma imagem sem saturação.
Podemos ter controle sobre como diminuir a saturação dessa imagem com base nos valores-limite para vermelho, verde e azul. Esses valores são definidos pelas entradas para o nó Grayscale.Grayscale. Observe que a imagem parece muito escura, pois o valor verde está definido como 0 no controle deslizante.
Altere os controles deslizantes superior e inferior para ter um valor de 0 e o controle deslizante do meio para ter um valor de 1. Dessa forma, obtemos uma imagem sem saturação mais legível.
Vamos usar a imagem sem saturação e aplicar outro filtro. A imagem sem saturação tem algum contraste, por isso, vamos testar a detecção de bordas.
Adicione um nó SobelEdgeDetector.SobelEdgeDetector à tela.
Conecte-o a BaseUsingCopyPartialFilter.Apply e conecte a imagem sem saturação à entrada de imagem desse nó.
O Sobel Edge Detector realçou as bordas em uma nova imagem.
Aproximando o zoom, o detector de bordas destacou os contornos das bolhas com pixels. A biblioteca AForge tem ferramentas para obter resultados como este e criar a geometria do Dynamo. Vamos explorar isso no próximo exercício.
Agora que aprendemos alguns conceitos básicos do processamento de imagens, vamos usar uma imagem para determinar a geometria do Dynamo. Neste exercício, em um nível elementar, temos como objetivo fazer um “Traço automático” de uma imagem usando o AForge e o Dynamo. Vamos simplificar e extrair retângulos de uma imagem de referência, mas há ferramentas disponíveis no AForge para operações mais complexas. Vamos trabalhar com 02-RectangleCreation.dyn dos arquivos de exercício que transferimos por download.
Com o nó Caminho do arquivo, navegue para grid.jpg na pasta de exercícios.
Conecte as séries restantes de nós acima para revelar um eixo paramétrico de curso.
Nesta próxima etapa, queremos fazer referência aos quadrados brancos na imagem e convertê-los em geometria real do Dynamo. O AForge tem muitas ferramentas eficazes de Pesquisa visual computacional e, aqui, vamos usar uma ferramenta particularmente importante para a biblioteca chamada BlobCounter.
Após adicionar BlobCounter à tela, precisamos de uma forma de processar a imagem (de modo semelhante à ferramenta BaseFilter.Apply no exercício anterior).
Infelizmente, o nó “Processar imagem” não está imediatamente visível na biblioteca do Dynamo. Isso acontece porque a função pode não estar visível no código fonte do AForge. Para corrigir isso, precisamos encontrar uma solução alternativa.
Adicione um nó Python à tela e adicione o seguinte código ao nó Python. Esse código importa a biblioteca AForge e, em seguida, processa a imagem importada.
Conectando a saída da imagem à entrada do nó Python, obtemos um resultado AForge.Imaging.BlobCounter do nó Python.
As próximas etapas abrangem alguns truques que demonstram familiaridade com a API de imagem do AForge. Não é necessário aprender tudo isso para trabalhar no Dynamo. Esta é mais uma demonstração de como trabalhar com bibliotecas externas dentro da flexibilidade do ambiente do Dynamo.
Conecte a saída do script Python a BlobCounterBase.GetObjectRectangles. Essa ação faz a leitura de objetos em uma imagem, com base em um valor-limite, e extrai retângulos quantificados do espaço de pixel.
Adicione outro nó Python à tela, conecte-se a GetObjectRectangles e insira o código abaixo. Isso criará uma lista organizada de objetos do Dynamo.
Transponha a saída do nó Python da etapa anterior. Isso cria quatro listas, cada uma representando X, Y, Largura e Altura para cada retângulo.
Usando o bloco de código, organizamos os dados em uma estrutura que acomoda o nó Rectangle.ByCornerPoints (código abaixo).
Temos uma matriz de retângulos representando os quadrados brancos na imagem. Através da programação, fizemos algo (quase) similar a um traço automático no Illustrator.
No entanto, ainda precisamos fazer um pouco de limpeza. Aumentando o zoom, podemos ver que temos vários retângulos pequenos indesejados.
Em seguida, vamos escrever códigos para nos livrar de retângulos indesejados.
Insira um nó Python entre o nó GetObjectRetangle e outro nó Python. O código do nó está abaixo e remove todos os retângulos que estão abaixo de um determinado tamanho.
Com os retângulos supérfluos removidos, apenas para testar, vamos criar uma superfície com base nesses retângulos e efetuar a extrusão deles por uma distância baseada em suas áreas.
Por último, altere a entrada both_sides para falso e obtemos uma extrusão em uma direção. Mergulhe a peça em resina e você obtém uma mesa supermoderna.
Esses são exemplos básicos, mas os conceitos descritos aqui também podem ser usados em aplicativos reais incríveis. É possível usar a pesquisa visual computacional para diversos processos. Para nomear apenas alguns: leitores de código de barras, correspondência de perspectiva, mapeamento de projeção e realidade aumentada. Para obter informações sobre tópicos mais avançados com o AForge relacionados a este exercício, leia este artigo.
O Dynamo oferece vários métodos diferentes para criar nós personalizados. É possível criar nós personalizados do zero, com base em um gráfico existente ou explicitamente em C#. Nesta seção, vamos abordar a criação de um nó personalizado na IU do Dynamo com base em um gráfico existente. Este método é ideal para limpar o espaço de trabalho, bem como para empacotar uma sequência de nós para reutilização em outro lugar.
Na imagem abaixo, é mapeado um ponto de uma superfície para outra usando as coordenadas UV. Usaremos esse conceito para criar uma superfície de painel que faz referência a curvas no plano XY. Criaremos painéis quadrados aqui, mas usando a mesma lógica, podemos criar uma ampla variedade de painéis com o mapeamento UV. Esta é uma ótima oportunidade para o desenvolvimento de nós personalizados, pois poderemos repetir um processo semelhante mais facilmente neste gráfico ou em outros fluxos de trabalho do Dynamo.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Vamos começar criando um gráfico que desejamos aninhar em um nó personalizado. Neste exemplo, vamos criar um gráfico que mapeia os polígonos de uma superfície base para uma superfície alvo usando as coordenadas UV. Esse processo de mapeamento UV é algo que usamos com frequência, o que faz dele um bom candidato para um nó personalizado. Para obter mais informações sobre as superfícies e o espaço UV, consulte a página Superfícies. O gráfico completo é UVmapping_Custom-Node.dyn do arquivo .zip obtido por download acima.
Bloco de código: use essa linha para criar um intervalo de 10 números entre -45 e 45
45..45..#10;
Point.ByCoordinates: conecte a saída do Bloco de código às entradas “x” e “y” e defina a amarra como referência cruzada. Agora, você deve ter uma grade de pontos.
Plane.ByOriginNormal: conecte a saída “Ponto” à entrada “origem” para criar um plano em cada um dos pontos. Será usado o vetor normal padrão de (0,0,1).
Rectangle.ByWidthLength: conecte os planos da etapa anterior à entrada “plano” e use um Bloco de código com um valor de 10 para especificar a largura e o comprimento.
Agora, você deve ver uma grade de retângulos. Vamos mapear esses retângulos para uma superfície-alvo usando as coordenadas UV.
Polygon.Points: conecte a saída de Rectangle.ByWidthLength da etapa anterior à entrada “polígono” para extrair os pontos de canto de cada retângulo. Esses são os pontos que serão mapeados para a superfície-alvo.
Rectangle.ByWidthLength: use um Bloco de código com um valor de 100 para especificar a largura e o comprimento de um retângulo. Esse será o limite da nossa superfície de base.
Surface.ByPatch: conecte o Rectangle.ByWidthLength da etapa anterior à entrada “closedCurve” para criar uma superfície de base.
Surface.UVParameterAtPoint: conecte a saída “Ponto” do nó Polygon.Points e a saída “Superfície” do nó Surface.ByPatch para retornar o parâmetro UV em cada ponto.
Agora que temos uma superfície de base e um conjunto de coordenadas UV, é possível importar uma superfície-alvo e mapear os pontos entre as superfícies.
File Path: selecione o caminho do arquivo da superfície que você deseja importar. O tipo de arquivo deve ser .SAT. Clique no botão “Procurar...” e navegue até o arquivo UVmapping_srf.sat do arquivo .zip obtido por download acima.
Geometry.ImportFromSAT: conecte o caminho do arquivo para importar a superfície. Você deve ver a superfície importada na visualização da geometria.
UV: conecte a saída do parâmetro UV a um nó UV.U e a um nó UV.V.
Surface.PointAtParameter: conecte a superfície importada, bem como as coordenadas u e v. Agora, você deve visualizar uma grade de pontos 3D na superfície-alvo.
A última etapa é usar os pontos 3D para construir as correções de superfícies retangulares.
PolyCurve.ByPoints: conecte os pontos na superfície para construir uma policurva através dos pontos.
Booleano: adicione um valor booleano ao espaço de trabalho, conecte-o à entrada “connectLastToFirst” e alterne para True para fechar as policurvas. Agora, você deve ver os retângulos mapeados para a superfície.
Surface.ByPatch: conecte as policurvas à entrada “closedCurve” para construir as correções de superfícies.
Agora, vamos selecionar os nós que desejamos aninhar em um nó personalizado, pensando no que desejamos que sejam as entradas e saídas do nosso nó. Desejamos que nosso nó personalizado seja o mais flexível possível, para que possa mapear qualquer polígono, não apenas retângulos.
Selecione os seguintes nós (começando com Polygon.Points), clique com o botão direito do mouse no espaço de trabalho e selecione “Criar nó personalizado”.
Na caixa de diálogo Propriedades do nó personalizado, atribua um nome, uma descrição e uma categoria ao nó personalizado.
Nome: MapPolygonsToSurface
Descrição: Mapear polígonos de uma superfície base para a superfície alvo
Categoria de complementos: Geometry.Curve
O nó personalizado limpou consideravelmente o espaço de trabalho. Observe que as entradas e saídas foram nomeadas com base nos nós originais. Vamos editar o nó personalizado para tornar os nomes mais descritivos.
Clique duas vezes no nó personalizado para editá-lo. Isso abrirá um espaço de trabalho com um fundo amarelo que representa o interior do nó.
Entradas: altere os nomes das entradas para baseSurface e targetSurface.
Saídas: adicione mais uma saída para os polígonos mapeados.
Salve o nó personalizado e volte para o espaço de trabalho inicial. Observe que o nó MapPolygonsToSurface reflete as alterações que acabamos de fazer.
Também é possível aumentar a robustez do nó personalizado adicionando Comentários personalizados. Os comentários podem ajudar a indicar os tipos de entrada e saída ou explicar a funcionalidade do nó. Os comentários aparecerão quando o usuário passar o cursor sobre uma entrada ou saída de um nó personalizado.
Clique duas vezes no nó personalizado para editá-lo. Isso reabrirá o espaço de trabalho de fundo amarelo.
Comece editando o Bloco de código de entrada. Para iniciar um comentário, digite “//” seguido do texto do comentário. Digite qualquer coisa que possa ajudar a esclarecer o nó. Aqui, descreveremos a targetSurface.
Também definiremos o valor padrão da inputSurface definindo o tipo de entrada igual a um valor. Aqui, definiremos o valor padrão como o conjunto Surface.ByPatch original.
Também é possível aplicar os comentários às saídas.
Edite o texto no bloco de código de saída. Digite “//” seguido do texto do comentário. Aqui, esclareceremos as saídas Polígonos e surfacePatches adicionando uma descrição mais detalhada.
Passe o cursor sobre as entradas dos nós personalizados para ver os comentários.
Com o valor padrão definido em inputSurface, também é possível executar a definição sem uma entrada de superfície.
O Dynamo possui um recurso avançado para permitir editar os parâmetros em um nível paramétrico. Por exemplo, um algoritmo gerador ou os resultados de uma simulação podem ser usados para controlar os parâmetros de uma matriz de elementos. Desta forma, um conjunto de instâncias da mesma família pode ter propriedades personalizadas no projeto do Revit.
Os parâmetros de instância definem a abertura dos painéis na superfície de telhado, variando de um coeficiente de abertura de 0,1 a 0,4.
Os parâmetros com base no tipo são aplicados a cada elemento na superfície porque são do mesmo tipo de família. O material de cada painel, por exemplo, pode ser controlado por um parâmetro com base no tipo.
Se você já tiver configurado uma família do Revit, lembre-se de que é preciso atribuir um tipo de parâmetro (sequência de caracteres, número, cota, etc.). Certifique-se de usar o tipo de dados correto ao atribuir parâmetros do Dynamo.
Também é possível usar o Dynamo em combinação com restrições paramétricas, definidas nas propriedades de uma família do Revit.
Como uma revisão rápida dos parâmetros no Revit, lembramos que existem parâmetros de tipo e parâmetros de instância. Ambos podem ser editados no Dynamo, mas trabalharemos com parâmetros de instância no exercício abaixo.
Depois de descobrir a aplicação abrangente de edição de parâmetros, você poderá editar uma grande quantidade de elementos no Revit com o Dynamo. Essa operação pode exigir muitos cálculos computacionais , o que significa que pode ser lenta. Se estiver editando um grande número de elementos, poderá ser conveniente usar a funcionalidade do nó “congelar” para pausar a execução das operações do Revit enquanto você desenvolve o gráfico. Para obter mais informações sobre o congelamento de nós, consulte a seção “Congelar” no capítulo de sólidos.
A partir da versão 0.8, o Dynamo tem como base a ausência de unidades. Isso permite que o Dynamo continue sendo um ambiente de programação visual abstrato. Os nós do Dynamo que interagem com as cotas do Revit farão referência às unidades do projeto do Revit. Por exemplo, se você estiver definindo um parâmetro de comprimento no Revit no Dynamo, o número no Dynamo para o valor corresponderá às unidades padrão no projeto do Revit. O exercício abaixo funciona em metros.
Para uma conversão rápida das unidades, use o nó “Converter entre unidades”. Essa é uma ferramenta útil para converter as unidades de Comprimento, Área e Volume em tempo real.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
O exercício abaixo funciona em metros.
Esse exercício se concentra na edição de elementos do Revit sem executar a operação geométrica no Dynamo. Não estamos importando a geometria do Dynamo aqui, apenas editando os parâmetros em um projeto do Revit. Este exercício é básico e para os usuários mais avançados do Revit, observe que estes são parâmetros de instância de uma massa, mas a mesma lógica pode ser aplicada a uma matriz de elementos para personalizar em grande escala. Tudo isso é feito com o nó “Element.SetParameterByName”.
Comece com o arquivo de exemplo do Revit para esta seção. Removemos os elementos estruturais e as treliças adaptativas da seção anterior. Neste exercício, vamos nos concentrar em uma montagem paramétrica no Revit e manipulá-la no Dynamo.
Selecionando a construção em massa no Revit, vemos uma matriz de parâmetros de instância no painel Propriedades.
No Dynamo, podemos recuperar os parâmetros selecionando o elemento de destino.
Selecione a massa da construção com o nó “Selecionar o elemento do modelo”.
É possível consultar todos os parâmetros dessa massa com o nó “Element.Parameters”. Isso inclui os parâmetros de tipo e instância.
Faça referência ao nó Element. Parameters para localizar os parâmetros alvo. Também é possível visualizar o painel Propriedades na etapa anterior para escolher quais nomes de parâmetros desejamos editar. Neste caso, estamos procurando os parâmetros que afetam os grandes movimentos geométricos na massa da construção.
Faremos alterações no elemento do Revit usando o nó Element.SetParameterByName
Use o B_loco de código para_ definir uma lista de parâmetros, com aspas em torno de cada item para indicar uma sequência de caracteres. Também podemos usar o nó List.Create com uma série de nós de "sequência de caracteres" conectados a várias entradas, mas o Bloco de código é mais rápido e fácil. Assegure-se de que a sequência de caracteres coincida com o nome exato no Revit, específico em relação ao uso de maiúsculas e minúsculas:
{"BldgWidth","BldgLength","BldgHeight", "AtriumOffset", "InsideOffset","LiftUp"};
Também queremos especificar valores para cada parâmetro. Adicione seis “controles deslizantes de números inteiros” na tela e renomeie-os de acordo com o parâmetro correspondente na lista. Além disso, defina os valores de cada controle deslizante para a imagem acima. Em ordem de cima para baixo: 62,92,25,22,8,12
Defina outro bloco de código com uma lista do mesmo tamanho que os nomes de parâmetro. Neste caso, nomeamos variáveis (sem aspas) que criam entradas para o bloco de código. Conecte os controles deslizantes a cada entrada respectiva:
{bw,bl,bh,ao,io,lu};
Conecte o Bloco de código à entrada de valor “Element.SetParameterByName”*. Com a execução marcada automaticamente, veremos os resultados automaticamente.
*Esta demonstração funciona com parâmetros de instância, mas não com parâmetros de tipo.
Assim como no Revit, muitos desses parâmetros dependem uns dos outros. É claro que há combinações nas quais a geometria pode ser interrompida. Podemos solucionar esse problema com fórmulas definidas nas propriedades de parâmetro ou definir uma lógica semelhante às operações matemáticas no Dynamo (esse será um desafio adicional se você desejar expandir o exercício).
Essa combinação oferece um novo projeto moderno para a massa da construção: 100, 92, 100, 25, 13, 51
Em seguida, vamos ver como podemos editar a fachada usando um processo semelhante.
Copie o gráfico e foque na vidraça da fachada que abrigará o sistema de treliça. Isolamos quatro parâmetros neste caso:
{"DblSkin_SouthOffset","DblSkin_MidOffset","DblSkin_NorthOffset","Facade Bend Location"};
Adicionalmente, criamos controles deslizantes de número e os renomeamos com os parâmetros apropriados. Os três primeiros controles deslizantes de cima para baixo devem ser remapeados para um domínio de [0,10], enquanto o controle deslizante final, “Localização da vergadura da fachada”, deve ser remapeado para um domínio de [0,1]. Esses valores, de cima para baixo, devem começar com estes valores (embora sejam arbitrários): 2,68; 2,64; 2,29; 0,5
Defina um novo bloco de código e conecte os controles deslizantes:
{so,mo,no,fbl};
Se os controles deslizantes forem alterados nesta parte do gráfico, poderemos tornar a vidraça da fachada muito mais substancial: 9,98; 10,0; 9,71; 0,31
Apesar de anteriormente termos examinado a edição de uma massa de construção básica, desejamos aprofundar o vínculo do Dynamo/Revit editando um grande número de elementos de uma só vez. Personalizar em uma grande escala se torna mais complexo, já que as estruturas de dados requerem operações de lista mais avançadas. No entanto, os princípios subjacentes por trás de sua execução são fundamentalmente os mesmos. Vamos estudar algumas oportunidades para análise com base em um conjunto de componentes adaptativos.
Suponha que criamos uma faixa de componentes adaptativos e que desejamos editar os parâmetros com base nas localizações dos pontos. Os pontos, por exemplo, podem determinar um parâmetro de espessura que está relacionado com a área do elemento. Ou, eles poderiam determinar um parâmetro de opacidade relacionado à exposição solar durante o ano. O Dynamo permite a conexão entre análise e parâmetros por meio de algumas etapas simples. Vamos explorar uma versão básica no exercício abaixo.
Consulte os pontos adaptativos de um componente adaptativo selecionado usando o nó AdaptiveComponent.Locations. Isso nos permite trabalhar com uma versão abstrata de um elemento do Revit para análise.
Ao extrair a localização dos pontos dos componentes adaptativos, podemos executar uma faixa de análise para aquele elemento. Um componente adaptativo de quatro pontos permitirá estudar o desvio do plano para um determinado painel, por exemplo.
Use o remapeamento para mapear um conjunto de dados para um intervalo de parâmetros. Essa é uma ferramenta fundamental usada em um modelo paramétrico e vamos demonstrá-la no exercício abaixo.
Usando o Dynamo, é possível usar as localizações dos pontos dos componentes adaptativos para criar um plano de melhor ajuste para cada elemento. Também podemos consultar a posição do sol no arquivo do Revit e estudar a orientação relativa do plano em relação ao sol em comparação com outros componentes adaptativos. Vamos definir isso no exercício abaixo, criando um ambiente algorítmico.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Este exercício permite expandir as técnicas demonstradas na seção anterior. Neste caso, estamos definindo uma superfície paramétrica com base em elementos do Revit, instanciando componentes adaptativos de quatro pontos e, em seguida, editando-os com base na orientação em relação ao sol.
Comece selecionando duas arestas com o nó “Selecionar aresta”. As duas arestas são os vãos longos do átrio.
Combine as duas arestas em uma lista com o nó List.Create.
Crie uma superfície entre as duas arestas com Surface.ByLoft.
Usando o bloco de código, defina um intervalo de 0 a 1 com 10 valores uniformemente espaçados:
0..1..#10;
Conecte o bloco de código às entradas *u *e v de um nó Surface.PointAtParameter e conecte o nó Surface.ByLoft à entrada superfície. Clique com o botão direito do mouse no nó e altere a amarra para Produto transversal. Isso fornecerá uma grade de pontos na superfície.
Essa grade de pontos serve como os pontos de controle para uma superfície definida parametricamente. Queremos extrair as posições “u” e “v” de cada um desses pontos para que possamos conectá-los em uma fórmula paramétrica e manter a mesma estrutura de dados. É possível fazer isso consultando as localizações dos parâmetros dos pontos que acabamos de criar.
Adicione um nó Surface.ParameterAtPoint à tela e conecte as entradas como mostrado acima.
Consulte os valores u desses parâmetros com o nó UV.U.
Consulte os valores v desses parâmetros com o nó UV.V.
Os resultados mostram os valores u e v correspondentes a cada ponto da superfície. Agora, temos um intervalo de 0 a 1 para cada valor, na estrutura de dados apropriada; portanto, estamos prontos para aplicar um algoritmo paramétrico.
Adicione um bloco de código à tela e insira o código:
Math.Sin(u*180)*Math.Sin(v*180)*w;
Essa é uma função paramétrica que cria um montículo senoidal de uma superfície plana.Conecta o UV.U à entrada u e o UV.V à entrada v.
A entrada w representa a amplitude da forma; portanto, anexamos um controle deslizante de número a ela.
Agora, temos uma lista de valores conforme definido pelo algoritmo. Vamos usar essa lista de valores para mover os pontos para cima na direção +Z. Usando Geometry.Translate, conecte o *bloco de código *a zTranslation e Surface.PointAtParameter à entrada geometria. Você deve ver os novos pontos exibidos na visualização do Dynamo.
Finalmente, criamos uma superfície com o nó NurbsSurface.ByPoints, conectando o nó da etapa anterior à entrada de pontos. Dessa forma, obtemos uma superfície paramétrica. Sinta-se à vontade para arrastar o controle deslizante para ver o encolhimento e aumento dos montículos.
Com a superfície paramétrica, queremos definir uma forma de aplicar painéis para criar matrizes em quatro pontos de componentes adaptativos. O Dynamo não tem uma funcionalidade pronta para uso para aplicar painéis à superfície; portanto, podemos consultar a comunidade para obter pacotes úteis do Dynamo.
Vá para Pacotes>Procurar um pacote...
Procure “LunchBox” e instale “LunchBox for Dynamo”. Esse pacote tem um conjunto de ferramentas muito útil para operações de geometria, como esta.
Após o fazer o download, você terá acesso completo ao conjunto LunchBox. Procure “Quad Grid” e selecione “LunchBox Quad Grid By Face”. Conecte a superfície paramétrica à entrada superfície e defina as divisões U e V como 15. Você deve ver uma superfície com painéis quad na visualização do Dynamo.
Se tiver curiosidade sobre a configuração, clique duas vezes no nó Lunch Box e veja como foi feito.
De volta ao Revit, vamos dar uma olhada rápida no componente adaptativo que estamos usando aqui. Não é necessário seguir, mas este é o painel do telhado que vamos instanciar. É um componente adaptativo de quatro pontos que é uma representação bruta de um sistema ETFE. A abertura do vazio central está em um parâmetro chamado “ApertureRatio”.
Estamos prestes a instanciar uma grande quantidade de geometria no Revit; portanto, certifique-se de ativar o solucionador do Dynamo na opção “Manual”.
Adicione um nó Tipos de família à tela e selecione “ROOF-PANEL-4PT”.
Adicione um nó AdaptiveComponent.ByPoints à tela, conecte Pts do painel da saída “LunchBox Quad Grid by Face” à entrada pontos. Conecte o nó Tipos de família à entrada familySymbol.
Pressione Executar. O Revit terá que pensar um pouco enquanto a geometria está sendo criada. Se demorar muito, reduza o número de “15” do bloco de código para um número menor. Isso reduzirá o número de painéis no telhado.
Observação: Se o Dynamo estiver demorando muito para calcular os nós, talvez seja recomendável usar a funcionalidade do nó “congelar” para pausar a execução das operações do Revit enquanto desenvolve o gráfico. Para obter mais informações sobre o congelamento de nós, consulte a seção “Congelar” no capítulo de sólidos.
De volta ao Revit, temos a matriz de painéis no telhado.
Aproximando o zoom, podemos ver mais de perto suas qualidades de superfície.
Continuando com a etapa anterior, vamos avançar mais e determinar a abertura de cada painel com base em sua exposição solar. Aproximando o zoom no Revit e selecionando um painel, vemos que na barra de propriedades há um parâmetro chamado “Proporção de abertura”. A família é configurada de forma que a abertura se estenda, aproximadamente, de 0,05 a 0,45.
Se ativarmos o caminho solar, será possível ver a localização atual do sol no Revit.
É possível referenciar a localização do sol usando o nó SunSettings.Current.
Conecte as configurações do sol a Sunsetting.SunDirection para obter o vetor solar.
Nos Pts do painel usados para criar os componentes adaptativos, use Plane.ByBestFitThroughPoints para aproximar o plano do componente.
Consulte a normal desse plano.
Use o produto escalar para calcular a orientação solar. O produto escalar é uma fórmula que determina como dois vetores paralelos ou antiparalelos podem ser. Então, estamos tomando a normal do plano de cada componente adaptativo e comparando com o vetor solar para simular aproximadamente a orientação solar.
Obtenha o valor absoluto do resultado. Isso assegura que o produto escalar seja preciso se a normal do plano estiver voltada para a direção reversa.
Pressione Executar.
Observando o produto escalar, temos uma ampla variedade de números. Queremos usar a distribuição relativa deles, mas precisamos condensar os números dentro do intervalo apropriado do parâmetro “Proporção de abertura” que planejamos editar.
Math.RemapRange é uma ótima ferramenta para isso. Essa ferramenta analisa uma lista de entradas e remapeia seus limites em dois valores-alvo.
Defina os valores-alvo como 0,15 e 0,45 em um bloco de código.
Pressione Executar.
Conecte os valores remapeados a um nó Element.SetParameterByName.
Conecte a sequência de caracteres “Proporção de abertura” à entrada parameterName.
Conecte os componentes adaptativos à entrada elemento.
Pressione Executar.
De volta ao Revit, com base em uma distância, podemos fazer o efeito da orientação solar na abertura dos painéis ETFE.
Aproximando o zoom, vemos que os painéis ETFE estão mais fechados como a face do sol. Nosso objetivo aqui é reduzir o superaquecimento da exposição solar. Se quiséssemos deixar entrar mais luz com base na exposição solar, apenas precisaríamos alternar o domínio em Math.RemapRange.
O Revit é um ambiente com abundância de dados. Isso nos dá uma gama de capacidades de seleção que se expande muito além de “apontar e clicar”. Podemos consultar o banco de dados do Revit e vincular dinamicamente os elementos do Revit à geometria do Dynamo durante a execução de operações paramétricas.
A biblioteca do Revit na interface do usuário oferece uma categoria “Seleção” que possibilita várias maneiras de selecionar a geometria.
Para selecionar os elementos do Revit corretamente, é importante ter um entendimento completo da hierarquia de elementos do Revit. Deseja selecionar todas as paredes em um projeto? Selecione por categoria. Deseja selecionar todas as cadeiras Eames em seu lobby moderno de meados do século? Selecione por família.
Vamos fazer uma rápida revisão da hierarquia do Revit.
Você se lembra da taxonomia da biologia? Reino, Filo, Classe, Ordem, Família, Gênero, Espécie? Os elementos do Revit são categorizados de forma similar. Em um nível básico, é possível dividir a hierarquia do Revit em Categorias, Famílias, Tipos* e Instâncias. Uma instância é um elemento de modelo individual (com uma ID exclusiva), enquanto uma categoria define um grupo genérico (como “paredes” ou “pisos”). Com o banco de dados do Revit organizado dessa forma, é possível selecionar um elemento e escolher todos os elementos similares com base em um nível especificado na hierarquia.
*Os tipos no Revit são definidos de forma diferente dos tipos na programação. No Revit, um tipo se refere a uma ramificação da hierarquia, em vez de um “tipo de dados”.
As três imagens abaixo mostram as categorias principais para a seleção de elementos do Revit no Dynamo. Essas são ótimas ferramentas para usar em combinação, e vamos explorar algumas delas nos exercícios seguintes.
Apontar e clicar é a forma mais fácil de selecionar diretamente um elemento do Revit. É possível selecionar um elemento do modelo completo ou partes de sua topologia (como uma face ou uma aresta). Isso permanece vinculado dinamicamente ao objeto do Revit. Portanto, quando o arquivo do Revit atualizar sua localização ou parâmetros, o elemento do Dynamo referenciado será atualizado no gráfico.
Os menus suspensos criam uma lista de todos os elementos acessíveis em um projeto do Revit. É possível usar essa opção para referenciar elementos do Revit que não são necessariamente visíveis em uma vista. Essa é uma ótima ferramenta para consultar elementos existentes ou criar novos em um projeto do Revit ou em um editor de família.
![](../.gitbook/assets/selecting _database_navigation_with_dynamo_nodes_02.png)
Também é possível selecionar o elemento do Revit por camadas específicas na hierarquia do Revit. Essa é uma opção eficaz para personalizar grandes matrizes de dados na preparação da documentação ou da instanciação generativa e personalização.
Com as três imagens acima em mente, vamos nos aprofundar em um exercício que seleciona elementos de um projeto básico do Revit na preparação para os aplicativos paramétricos que criaremos nas seções restantes deste capítulo.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Neste arquivo de exemplo do Revit, temos três tipos de elementos de uma construção simples. Usaremos isso como exemplo para selecionar elementos do Revit no contexto da hierarquia do Revit.
Massa de construção
Vigas (Framing estrutural)
Treliças (componentes adaptativos)
Quais conclusões podemos tirar dos elementos atualmente na vista do projeto do Revit? E a que distância da hierarquia precisamos ir para selecionar os elementos apropriados? Isso, é claro, se tornará uma tarefa mais complexa ao trabalhar em um projeto grande. Há muitas opções disponíveis: é possível selecionar elementos por categorias, níveis, famílias, instâncias etc.
Como estamos trabalhando com uma configuração básica, vamos selecionar a massa da construção escolhendo “Massa” no nó suspenso Categorias. Isso pode ser encontrado na guia Seleção do Revit.
A saída da categoria Massa é apenas a própria categoria. Precisamos selecionar os elementos. Para fazer isso, usamos o nó “Todos os elementos da categoria”.
Neste ponto, observe que não vemos nenhuma geometria no Dynamo. Selecionamos um elemento do Revit, mas não convertemos o elemento na geometria do Dynamo. Essa é uma separação importante. Se você selecionasse um grande número de elementos, não seria uma boa ideia visualizá-los no Dynamo, pois isso deixaria o sistema inteiro lento. O Dynamo é uma ferramenta para gerenciar um projeto do Revit sem executar necessariamente operações de geometria, e vamos examinar isso na próxima seção deste capítulo.
Neste caso, estamos trabalhando com geometria simples, por isso queremos trazer a geometria para a visualização do Dynamo. Há um número verde ao lado de “BldgMass” no nó de inspeção acima. Isso representa a ID do elemento e nos informa que estamos lidando com um elemento do Revit, não com a geometria do Dynamo. A próxima etapa é converter esse elemento do Revit em geometria no Dynamo.
Usando o nó Element.Faces, obtemos uma lista de superfícies que representam cada face da massa do Revit. Agora, podemos ver a geometria na viewport do Dynamo e começar a referenciar a face para operações paramétricas.
Veja a seguir um método alternativo. Nesse caso, estamos deixando de lado a seleção através da hierarquia do Revit (“Todos os elementos da categoria”) e optando por selecionar explicitamente a geometria no Revit.
Usando o nó “Selecionar o elemento do modelo”, clique no botão *“selecionar” *(ou “alterar”). Na viewport do Revit, selecione o elemento desejado. Neste caso, estamos selecionando a massa da construção.
Em vez de Element.Faces, é possível selecionar a massa completa como uma geometria sólida usando Element.Geometry. Isso seleciona toda a geometria contida naquela massa.
Usando Geometry.Explode, podemos obter a lista de superfícies novamente. Esses dois nós funcionam da mesma forma que Element.Faces, mas oferecem opções alternativas para examinar a geometria de um elemento do Revit.
Usando algumas operações básicas de lista, podemos consultar uma face de interesse.
Primeiro, gere os elementos selecionados anteriormente para o nó Element.Faces.
Em seguida, use o nó List.Count que revela que estamos trabalhando com 23 superfícies na massa.
Referenciando esse número, alteramos o Valor máximo de um controle deslizante de número inteiro para “22”.
Usando List.GetItemAtIndex, inserimos as listas e o controle deslizante de número inteiro para o índice. Deslizando a seleção, paramos quando chegamos ao índice 9 e isolamos a fachada principal que hospeda as treliças.
A etapa anterior era um pouco complicada. Podemos fazer isso muito mais rápido com o nó “Selecionar face”. Isso nos permite isolar uma face que não é um elemento em si no projeto do Revit. Aplica-se a mesma interação como em “Selecionar o elemento do modelo”, exceto pelo fato de que selecionamos a superfície em vez do elemento completo.
Suponha que desejamos isolar as paredes da fachada principal do edifício. É possível usar o nó “Selecionar faces” para fazer isso. Clique no botão “Selecionar” e, em seguida, selecione as quatro fachadas principais no Revit.
Após selecionar as quatro paredes, clique no botão “Concluir” no Revit.
As faces são importadas para o Dynamo como superfícies.
Agora, vamos analisar as vigas sobre o átrio.
Use o nó “Selecionar o elemento do modelo” para selecionar uma das vigas.
Conecte o elemento de viga ao nó Element.Geometry. Agora, temos a viga na viewport do Dynamo.
É possível aumentar o zoom na geometria com um nó Watch3D (se você não visualizar a viga no nó de Inspeção 3D, clique com o botão direito do mouse e pressione “zoom para ajustar”).
Uma pergunta que pode surgir frequentemente nos fluxos de trabalho do Revit/Dynamo: como posso selecionar um elemento e obter todos os elementos similares? Como o elemento selecionado do Revit contém todas as suas informações hierárquicas, podemos consultar seu tipo de família e selecionar todos os elementos daquele tipo.
Conecte o elemento de viga a um nó Element.ElementType.
O nó de Inspeção revela que a saída é agora um símbolo de família, em vez de um elemento do Revit.
Element.ElementType é uma consulta simples; portanto, podemos fazer isso no bloco de código com a mesma facilidade que com
x.ElementType;
e obter os mesmos resultados.
Para selecionar as vigas restantes, usaremos o nó “Todos os elementos do tipo de família”.
O nó de inspeção mostra que selecionamos cinco elementos do Revit.
Também podemos converter todos esses cinco elementos para a geometria do Dynamo.
E se tivéssemos 500 vigas? A conversão de todos esses elementos na geometria do Dynamo seria muito lenta. Se o Dynamo estiver demorando muito para calcular os nós, será recomendável usar a funcionalidade do nó “congelar” para pausar a execução das operações do Revit enquanto desenvolve o gráfico. Para obter mais informações sobre o congelamento de nós, consulte a seção “Congelar” no capítulo de sólidos.
Em qualquer caso, se precisarmos importar 500 vigas, precisaremos de todas as superfícies para executar a operação paramétrica prevista? Ou podemos extrair informações básicas das vigas e executar tarefas gerativas com a geometria fundamental? Essa é uma pergunta que vamos ter em mente, à medida que avançamos neste capítulo. Por exemplo, em seguida, vamos analisar o sistema de treliça.
Usando o mesmo gráfico de nós, selecione o elemento de treliça ao invés do elemento de viga. Antes de fazer isso, exclua Element.Geometry da etapa anterior.
Em seguida, estamos prontos para extrair algumas informações básicas do tipo de família de treliças.
No nó Inspeção, podemos ver que temos uma lista de componentes adaptativos selecionados no Revit. Queremos extrair as informações básicas; por isso, começamos com os pontos adaptativos.
Conecte o nó “Todos os elementos do tipo de família” ao nó "AdaptiveComponent.Location". Isso nos fornece uma lista de listas, cada uma com três pontos que representam as localizações dos pontos adaptativos.
A conexão de um nó "Polygon.ByPoints" retorna uma policurva. Podemos ver isso na viewport do Dynamo. Com esse método, visualizamos a geometria de um elemento e abstraímos a geometria da matriz restante dos elementos (que pode ser maior em número do que este exemplo).
Dica: Se você clicar no número verde de um elemento do Revit no Dynamo, a viewport do Revit efetuará o zoom para aquele elemento.
É possível criar uma matriz de elementos do Revit no Dynamo com o controle paramétrico completo. Os nós do Revit no Dynamo oferecem a capacidade de importar elementos de geometrias genéricas para tipos de categoria específicos (como paredes e pisos). Nesta seção, vamos focar na importação de elementos parametricamente flexíveis com componentes adaptativos.
Um componente adaptativo é uma categoria de família flexível que é bem adequada para aplicativos gerativos. Após a instanciação, é possível criar um elemento geométrico complexo que é guiado pela localização fundamental dos pontos adaptativos.
Veja abaixo um exemplo de um componente adaptativo de três pontos no editor de família. Isso gera uma treliça que é definida pela posição de cada ponto adaptativo. No exercício abaixo, usaremos esse componente para gerar uma série de treliças em uma fachada.
O componente adaptativo é um bom exemplo das práticas recomendadas de interoperabilidade. É possível criar uma matriz de componentes adaptativos definindo os pontos adaptativos fundamentais. E, ao transferir esses dados para outros programas, temos a capacidade de reduzir a geometria a dados simples. A importação e a exportação com um programa como o Excel seguem uma lógica similar.
Suponha que um consultor de fachadas deseje saber a localização dos elementos da treliça sem precisar analisar a geometria totalmente articulada. Na preparação para a fabricação, o consultor pode fazer referência à localização de pontos adaptativos para gerar novamente a geometria em um programa como o Inventor.
O fluxo de trabalho que configuraremos no exercício abaixo nos permite acessar todos esses dados ao criar a definição para a criação de elementos do Revit. Nesse processo, é possível mesclar a conceitualização, a documentação e a fabricação em um fluxo de trabalho contínuo. Isso cria um processo mais inteligente e eficiente para a interoperabilidade.
O primeiro exercício abaixo detalhará como o Dynamo referencia os dados para a criação de elementos do Revit. Para gerar vários componentes adaptativos, definiremos uma lista de listas em que cada lista tem três pontos que representam cada ponto do componente adaptativo. Isso será levado em consideração à medida que gerenciarmos as estruturas de dados no Dynamo.
Outro método para importar a geometria paramétrica do Dynamo no Revit é com o DirectShape. Em resumo, o elemento DirectShape e as classes relacionadas oferecem suporte à capacidade de armazenar formas geométricas criadas externamente em um documento do Revit. A geometria pode incluir sólidos ou malhas fechadas. O DirectShape foi projetado principalmente para importar formas de outros formatos de dados, como IFC ou STEP, onde não há informações suficientes disponíveis para criar um elemento “real” do Revit. Como o fluxo de trabalho IFC e STEP, a funcionalidade DirectShape funciona bem com a importação de geometrias criadas pelo Dynamo em projetos do Revit como elementos reais.
Detalharemos no segundo exercício a importação da geometria do Dynamo como uma DirectShape em nosso projeto do Revit. Usando esse método, podemos atribuir a categoria, o material e o nome de uma geometria importada, mantendo um vínculo paramétrico com o gráfico do Dynamo.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Começando com o arquivo de exemplo desta seção (ou continuando com o arquivo do Revit da sessão anterior), vemos a mesma massa do Revit.
Esse é o arquivo conforme aberto.
Esse é o sistema de treliça que criamos com o Dynamo, vinculado de forma inteligente à massa do Revit.
Usamos os nós “Selecionar o elemento do modelo” e “Selecionar face”, agora estamos descendo uma etapa na hierarquia da geometria e usando “Selecionar aresta”. Com o solucionador do Dynamo definido para executar “Automático”, o gráfico será continuamente atualizado com as alterações no arquivo do Revit. A aresta que estamos selecionando está vinculada dinamicamente à topologia do elemento do Revit. Desde que a topologia* não seja alterada, a conexão permanecerá vinculada entre o Revit e o Dynamo.
Selecione a curva superior da fachada de vidraça. Ela se expande por todo o comprimento da construção. Se você estiver tendo problemas para selecionar a aresta, lembre-se de escolher a seleção no Revit ao passar o mouse sobre a aresta e pressionar “Tab” até que a aresta desejada seja realçada.
Usando dois nós “Selecionar aresta”, selecione cada aresta que representa o declive transversal no meio da fachada.
Faça o mesmo para as arestas inferiores da fachada no Revit.
Os nós de Inspeção revelam que agora temos linhas no Dynamo. Isso é convertido automaticamente na geometria do Dynamo, já que as próprias arestas não são elementos do Revit. Essas curvas são as referências que usaremos para instanciar as treliças adaptativas na fachada.
*Para manter uma topologia consistente, estamos nos referindo a um modelo que não tenha mais faces ou arestas adicionadas. Embora os parâmetros possam alterar sua forma, a maneira como ele é construído permanece consistente.
Primeiro, precisamos unir as curvas e mesclá-las em uma lista. Dessa forma, podemos “agrupar” as curvas para realizar operações de geometria.
Crie uma lista para as duas curvas no meio da fachada.
Una as duas curvas numa policurva conectando o componente List.Create a um nó Polycurve.ByJoinedCurves.
Crie uma lista para as duas curvas na parte inferior da fachada.
Una as duas curvas numa policurva conectando o componente List.Create a um nó Polycurve.ByJoinedCurves.
Por fim, una as três curvas principais (uma linha e duas policurvas) em uma lista.
Desejamos aproveitar a curva superior, que é uma linha, e representa a extensão completa da fachada. Vamos criar planos ao longo dessa linha para fazer a interseção com o conjunto de curvas que agrupamos em uma lista.
Com um bloco de código, defina um intervalo usando a sintaxe:
0..1..#numberOfTrusses;
Conecte um *controle deslizante de número inteiro *à entrada do bloco de código. Como talvez você tenha adivinhado, isso representará o número de treliças. Observe que a barra deslizante controla o número de itens no intervalo definido de *0 *a 1.
Conecte o bloco de código à entrada param de um nó “Curve.PlaneAtParameter” e conecte a aresta superior à entrada da curva. Isso gerará dez planos uniformemente distribuídos pela extensão da fachada.
Um plano é uma parte abstrata da geometria, representando um espaço bidimensional infinito. Os planos são excelentes para contorno e interseção, enquanto estamos configurando nesta etapa.
Usando o nó Geometry.Intersect (defina a opção de amarra como produto transversal), conecte Curve.PlaneAtParameter à entrada entidade do nó Geometry.Intersect. Conecte o nó principal List.Create à entrada geometria. Agora, vemos pontos na viewport do Dynamo que representam a interseção de cada curva com os planos definidos.
Observe que a saída é uma lista de listas de listas. Para nossos fins, há muitas listas. Desejamos fazer uma mesclagem parcial aqui. Precisamos descer uma etapa na lista e nivelar o resultado. Para fazer isso, usaremos a operação List.Map, conforme discutido no capítulo sobre lista do manual.
Conecte o nó Geometry.Intersect à entrada da lista de List.Map.
Conecte um nó Aplainar à entrada f(x) de List.Map. Os resultados fornecem três listas, cada uma com uma contagem igual ao número de treliças.
Precisamos alterar esses dados. Se desejarmos instanciar a treliça, precisaremos usar o mesmo número de pontos adaptativos, conforme definido na família. Esse é um componente adaptativo de três pontos, portanto, em vez de três listas com 10 itens cada (numberOfTrusses), desejamos 10 listas de três itens cada. Desta forma, podemos criar 10 componentes adaptativos.
Conecte o List.Map a um nó List.Transpose. Agora, temos a saída de dados desejada.
Para confirmar se os dados estão corretos, adicione um nó Polygon.ByPoints à tela e verifique novamente com a visualização do Dynamo.
Da mesma forma que criamos os polígonos, é possível organizar os componentes adaptativos.
Adicione um nó AdaptiveComponent.ByPoints à tela, conecte o nó List.Transpose à entrada pontos.
Usando um nó Tipos de família, selecione a família “AdaptiveTruss” e conecte-a à entrada FamilyType do nó AdaptiveComponent.ByPoints.
No Revit, agora temos as dez treliças espaçadas uniformemente na fachada.
“Flexibilizar” o gráfico, aumentamos numberOfTrusses para 30 alterando o controle deslizante. Muitas treliças, o que não é muito realista, mas o vínculo paramétrico está funcionando. Depois de verificar, defina numberOfTrusses como 15.
E, para o teste final, selecionando a massa no Revit e editando os parâmetros de instância, será possível alterar a forma da construção e observar a treliça fazer o mesmo. Lembre-se: esse gráfico do Dynamo precisa estar aberto para que essa atualização seja exibida. O vínculo será interrompido assim que for fechado.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Comece abrindo o arquivo de exemplo desta lição: ARCH-DirectShape-BaseFile.rvt.
Na vista 3D, vemos a massa da construção da lição anterior.
Ao longo da aresta do átrio há uma curva de referência, vamos usá-la como uma curva para fazer referência no Dynamo.
Ao longo da aresta oposta do átrio, há outra curva de referência à qual também vamos fazer referência no Dynamo.
Para fazer referência à nossa geometria no Dynamo, usaremos Selecionar o elemento do modelo para cada membro do Revit. Selecione a massa no Revit e importe a geometria para o Dynamo usando Element.Faces. A massa agora deve estar visível na visualização do Dynamo.
Importe uma curva de referência para o Dynamo usando Selecionar o elemento do modelo e CurveElement.Curve.
Importe a outra curva de referência para o Dynamo usando Selecionar o elemento do modelo e CurveElement.Curve.
Diminuindo o zoom e efetuando o pan à direita no gráfico de exemplo, vemos um grupo grande de nós: são operações geométricas que geram a estrutura do telhado da treliça visível na visualização do Dynamo. Esses nós são criados usando a funcionalidade Nó para código, conforme discutido na seção bloco de código do manual.
A estrutura é guiada por três parâmetros principais: Deslocamento diagonal, Curvatura e Raio.
Efetue o zoom em uma visualização próxima dos parâmetros para este gráfico. Podemos flexibilizá-los para obter resultados de geometria diferentes.
Soltando o nó DirectShape.ByGeometry na tela, vemos que ele tem quatro entradas: geometria, categoria, material e nome.
A geometria será o sólido criado com base na parte de criação da geometria do gráfico.
A entrada de categoria é selecionada usando o nó suspenso Categorias. Neste caso, usaremos “Framing estrutural”.
A entrada de material é selecionada por meio da matriz de nós acima. Embora possa ser mais simplesmente definida como “Padrão” neste caso.
Após executar o Dynamo, de volta no Revit, temos a geometria importada no telhado em nosso projeto. Esse é um elemento do framing estrutural em vez de um modelo genérico. O vínculo paramétrico para o Dynamo permanece intacto.
O Dynamo para Revit estende a modelagem das informações de construção com o ambiente de dados e de lógica de um editor de algoritmo gráfico. Sua flexibilidade, juntamente com um banco de dados robusto do Revit, oferece uma nova perspectiva para o BIM.
Este capítulo é voltado para os fluxos de trabalho do Dynamo para o BIM. As seções são baseadas principalmente em exercícios, uma vez que saltar direto para um projeto é a melhor maneira de se familiarizar com um editor de algoritmos gráficos para BIM. Mas primeiro, vamos falar sobre o começo do programa.
À medida que o Revit e o Dynamo continuam a evoluir, você poderá notar que a versão do Revit com a qual você está trabalhando não é compatível com a versão do Dynamo para Revit instalada em seu computador. Abaixo estão descritas quais versões do Dynamo para Revit são compatíveis com o Revit.
Com uma equipe dedicada de desenvolvedores e uma comunidade entusiasmada, o projeto percorreu um longo caminho desde seu humilde começo.
O Dynamo foi originalmente criado para simplificar os fluxos de trabalho AEC no Revit. Embora o Revit crie um banco de dados robusto para cada projeto, pode ser difícil para um usuário intermediário acessar essas informações fora das restrições da interface. O Revit hospeda uma API (Interface de Programação de Aplicativo) abrangente, permitindo que desenvolvedores de terceiros criem ferramentas personalizadas. Os programadores têm usado essa API há anos, mas o script baseado em texto não está acessível a todos. O Dynamo busca democratizar os dados do Revit através de um editor de algoritmo gráfico acessível.
Usando os principais nós do Dynamo juntamente com os nós personalizados do Revit, um usuário pode expandir substancialmente os fluxos de trabalho paramétricos para interoperabilidade, documentação, análise e geração. Com o Dynamo, os fluxos de trabalho tediosos podem ser automatizados enquanto as explorações de projeto podem ser melhoradas.
Em um editor de família ou um projeto do Revit, navegue para Complementos e clique em Dynamo.*
*O Dynamo será executado somente no arquivo no qual foi aberto.
Quando o Dynamo é aberto no Revit, há uma nova categoria chamada “Revit”. Essa é uma adição abrangente à interface de usuário, oferecendo nós especificamente voltados para os fluxos de trabalho do Revit.*
*Usando a família de nós específica do Revit, o gráfico do Dynamo só funcionará quando for aberto no Dynamo para Revit. Se um gráfico do Dynamo para Revit for aberto no Dynamo Sandbox, por exemplo, os nós do Revit estarão ausentes.
Como o Revit é uma plataforma que fornece um gerenciamento robusto de projetos, as operações paramétricas no Dynamo podem ser complexas e seu cálculo pode ser lento. Se o Dynamo estiver demorando muito para calcular os nós, será recomendável usar a funcionalidade do nó “congelar” para pausar a execução das operações do Revit enquanto desenvolve o gráfico.
Desde que o Dynamo foi originalmente criado para o AEC, sua grande e crescente comunidade é um grande recurso para aprender e entrar em contato com especialistas no setor. A comunidade do Dynamo é formada por arquitetos, engenheiros, programadores e designers, apaixonados por compartilhar e criar.
O Dynamo também mantém um blog ativo. Leia os artigos recentes para saber mais sobre os últimos acontecimentos.
Estradas, ferrovias, terras, serviços públicos, levantamento topográfico, GIS etc.
A infraestrutura civil é tudo isso e muito mais. Esta seção contém diversos gráficos de exemplo práticos e relevantes para ajudar a orientar você a dominar o Dynamo e revelar todo o potencial do Dynamo for Civil 3D. Cada gráfico é fornecido completo com descrições detalhadas da lógica que foi usada para criá-lo, para que você possa não apenas usá-lo, mas entendê-lo.
Além disso, esses exemplos incorporam práticas recomendadas, que já passaram pelo teste do tempo, para a construção de gráficos sólidos. À medida que você trabalha nos exemplos, recomendamos que se familiarize também com a seção para obter mais ideias sobre como criar gráficos poderosos, flexíveis e sustentáveis.
Agora que você sabe um pouco mais sobre o quadro geral, vamos entrar e criar o primeiro gráfico do Dynamo no Civil 3D.
Este é um exemplo simples que deve demonstrar a funcionalidade básica do Dynamo. É recomendável seguir as etapas em um novo documento vazio do Civil 3D.
A primeira coisa a fazer é abrir um documento vazio no Civil 3D. Depois disso, navegue até a guia Gerenciar na faixa de opções do Civil 3D e procure o painel Programação visual.
Clique no botão Dynamo, que iniciará o Dynamo em uma janela separada.
Qual é a diferença entre o Dynamo e o Reprodutor do Dynamo?
O Dynamo é a ferramenta usada para criar e executar gráficos. O Reprodutor do Dynamo é uma forma fácil de executar gráficos sem precisar abri-los no Dynamo.
Quando o Dynamo estiver aberto, você verá a tela inicial. Clique em Novo para abrir um espaço de trabalho em branco.
E os exemplos?
Agora você deve estar olhando para um espaço de trabalho vazio. Vamos ver o Dynamo em ação. Este é nosso objetivo:
Muito simples, certo? Mas antes de começarmos, precisamos abordar alguns conceitos básicos.
Os blocos de construção principais de um gráfico do Dynamo são chamados de nós. Um nó é como uma máquina pequena – você coloca dados nele, ele realiza algum trabalho nesses dados e gera um resultado. O Dynamo for Civil 3D tem uma biblioteca de nós que você pode conectar com fios para formar um gráfico que faz coisas maiores e melhores do que qualquer nó isolado pode fazer.
Espere, e se eu nunca tiver usado o Dynamo?
Alguns desses pontos podem ser novos para você, mas isso não é um problema. Estas seções ajudarão.
OK, vamos criar nosso gráfico. Veja a seguir uma lista de todos os nós que precisaremos.
Você pode encontrar esses nós digitando seus nomes na barra de pesquisa na biblioteca ou clicando com o botão direito do mouse em qualquer lugar na tela e pesquisando.
Como posso saber quais nós usar e onde encontrá-los?
Veja a seguir como deve ser a aparência do gráfico final.
Vamos resumir o que fizemos aqui:
Escolhemos em qual documento trabalhar. Neste caso (e em muitos casos), queremos trabalhar no documento ativo no Civil 3D.
Definimos o bloco de destino onde o objeto de texto deve ser criado (neste caso, espaço do modelo).
Usamos um nó String para especificar em qual camada o texto deve ser colocado.
Criamos um ponto usando o nó Point.ByCoordinates para definir a posição em que o texto deve ser colocado.
Definimos as coordenadas X e Y do ponto de inserção de texto usando dois nós Number Slider.
Usamos outro nó String para definir o conteúdo do objeto de texto.
E, por fim, criamos o objeto de texto.
Vamos ver os resultados do nosso novíssimo gráfico.
De volta ao Civil 3D, assegure-se de que a guia Modelo esteja selecionada. Você deve ver o novo objeto de texto que o Dynamo criou.
Se você não conseguir ver o texto, talvez seja necessário executar o comando ZOOM -> EXTENTS para efetuar o zoom no ponto certo.
Legal. Agora, vamos fazer algumas atualizações no texto.
De volta ao gráfico do Dynamo, vá em frente e altere alguns dos valores de entrada, como a sequência de texto, as coordenadas do ponto de inserção etc. Você deve ver o texto automaticamente atualizado no Civil 3D. Observe também que, se você desconectar uma das portas de entrada, o texto será removido. Se você conectar tudo de volta, o texto será criado novamente.
Por que o Dynamo não insere um novo objeto de texto cada vez que o gráfico é executado?
Este exemplo apenas oferece uma pequena noção do que você pode fazer com o Dynamo for Civil 3D. Continue lendo para saber mais.
Mencionamos anteriormente que os nós são os principais blocos de construção de um gráfico do Dynamo e eles são organizados em grupos lógicos na biblioteca. No Dynamo for Civil 3D, há duas categorias (ou prateleiras) na biblioteca que contêm nós dedicados para trabalhar com objetos do AutoCAD e do Civil 3D, como alinhamentos, perfis, corredores, referências de bloco etc. O restante da biblioteca contém nós que são mais genéricos por natureza e são consistentes em todas as “versões” do Dynamo (por exemplo, Dynamo para Revit, Dynamo Sandbox etc.).
Confira a seção para obter mais informações sobre como os nós da biblioteca principal do Dynamo são organizados.
Nós específicos para trabalhar com objetos do AutoCAD e do Civil 3D
Nós para uso geral
Nós de pacotes de terceiros que você pode instalar separadamente
Se você usar os nós encontrados nas prateleiras do AutoCAD e do Civil 3D, o gráfico do Dynamo funcionará somente no Dynamo for Civil 3D. Se um gráfico do Dynamo for Civil 3D for aberto em outro lugar (no Dynamo para Revit, por exemplo), esses nós serão sinalizados com um aviso e não serão executados.
Por que há duas prateleiras separadas para o AutoCAD e o Civil 3D?
Essa organização distingue os nós de objetos nativos do AutoCAD (linhas, polilinhas, referências de bloco etc.) dos nós de objetos do Civil 3D (alinhamentos, corredores, superfícies etc.). E, do ponto de vista técnico, o AutoCAD e o Civil 3D são dois itens separados – o AutoCAD é o aplicativo base e o Civil 3D é construído com base nele.
Para trabalhar com os nós do AutoCAD e do Civil 3D, é importante ter uma compreensão sólida da hierarquia de objetos em cada prateleira. Você se lembra da taxonomia da biologia? Reino, Filo, Classe, Ordem, Família, Gênero, Espécie? Os objetos do AutoCAD e do Civil 3D são categorizados de forma semelhante. Vamos analisar alguns exemplos para explicar.
Vamos usar um alinhamento como exemplo.
Digamos que seu objetivo seja alterar o nome do alinhamento. A partir daqui, o próximo nó que você adicionaria é um nó CivilObject.SetName.
No início, isso pode não parecer muito intuitivo. O que é um CivilObject e por que a biblioteca não tem um nó Alignment.SetName? A resposta está relacionada à reutilização e à simplicidade. Se você parar para pensar, o processo de alterar o nome de um objeto do Civil 3D será o mesmo quer o objeto seja um alinhamento, corredor, perfil ou outra coisa. Assim, em vez de ter nós repetitivos que essencialmente fazem a mesma coisa (por exemplo, Alignment.SetName, Corridor.SetName, Profile.SetName etc.), faria sentido combinar essa funcionalidade em um único nó. É exatamente isso que CivilObject.SetName faz.
Outra maneira de pensar sobre isso é com base em relacionamentos. Um alinhamento e um corredor são tipos de Objetos do Civil, assim como uma maçã e uma pera são tipos de frutas. Os nós de Objeto do Civil se aplicam a qualquer tipo de Objeto do Civil, da mesma forma que você pode desejar usar um único descascador para remover as cascas de uma maçã e de uma pera. Sua cozinha ficaria bem bagunçada se você tivesse um descascador separado para cada tipo de fruta. Nesse sentido, a biblioteca de nós do Dynamo é como sua cozinha.
Agora, vamos aprofundar essa ideia. Digamos que você deseje alterar a camada do alinhamento. Você usaria o nó Object.SetLayer.
Por que não há um nó chamado CivilObject.SetLayer? Os mesmos princípios de reutilização e simplicidade que discutimos anteriormente aplicam-se aqui. A propriedade layer é algo que é comum a qualquer objeto no AutoCAD que possa ser desenhado ou inserido, como linha, polilinha, texto, referência de bloco etc. Os objetos do Civil 3D, como alinhamentos e corredores, estão na mesma categoria, e, portanto, qualquer nó que se aplica a um Objeto também pode ser usado com qualquer Objeto do Civil.
Você pode obter mais informações sobre o congelamento de nós na seção .
O Dynamo é um projeto de código aberto que está em constante evolução e muitos desenvolvimentos são relacionados ao Revit. Se você não estiver familiarizado com essa área, entre no fórum de discussão e comece a . Se você for um programador e quiser participar do desenvolvimento do Dynamo, confira o . Além disso, o é um ótimo recurso para as bibliotecas de terceiros. Muitos desses pacotes são feitos com o AEC em mente. Vamos também analisar os pacotes de terceiros para obter uma panorâmica neste capítulo.
Vá para a seção quando estiver tudo pronto para experimentá-lo.
O Dynamo for Civil 3D vem com alguns gráficos pré-criados que podem ajudar a estimular mais ideias sobre como você pode usar o Dynamo. Recomendamos que você dê uma olhada neles em algum momento, bem como nos aqui no manual.
Criar um gráfico do Dynamo que inserirá texto no espaço do modelo.
Os nós da biblioteca são agrupados em categorias lógicas com base no que fazem. Dê uma olhada na seção para ver um tour mais aprofundado.
Por padrão, o Dynamo “lembrará” os objetos que criar. Se você alterar os valores de entrada do nó, os objetos no Civil 3D serão atualizados em vez de criar objetos novos. Você pode ler mais sobre esse comportamento na seção .
Missão cumprida.
2013
2014
2015
2016
2017
2018
2019
2020 e versões posteriores
2.1.0 – O Revit 2020 e posterior agora inclui o Dynamo e recebe atualizações como faz o Revit.
N/D
Com o tempo, você pode precisar ir além dos conceitos básicos e se aprofundar no funcionamento interno do Dynamo. As páginas desta seção fornecerão um esquema para conhecer funcionalidades avançadas no Dynamo for Civil 3D, para que você possa levar seus gráficos a um novo patamar.
Existem alguns métodos de abreviação básicos no bloco de código que, em termos simples, facilitam muito o gerenciamento de dados. Vamos explicar os conceitos básicos abaixo e discutir como a abreviação pode ser usada para criar e consultar dados.
Tipo de dados
Dynamo padrão
Equivalente ao bloco de código
Números
Sequências de caracteres
Sequências
Intervalos
Obter item no índice
Criar lista
Concatenar sequências de caracteres
Declarações condicionais
Nó(s)
Equivalente ao bloco de código
Nota
Qualquer operador (+, &&, >=, Not, etc.)
+, &&, >=, !, etc.
Observe que “Not” se torna “!”, mas o nó é chamado “Not” para distinguir de “Factorial”
Booleano true
true;
Repare nas minúsculas
Booleano false
false;
Repare nas minúsculas
É possível reduzir o método para definir intervalos e sequências para a abreviação básica. Use a imagem abaixo como um guia para a sintaxe “...” para definir uma lista de dados numéricos com o bloco de código. Após obter o travamento dessa notação, a criação de dados numéricos é um processo realmente eficiente:
Neste exemplo, um intervalo de números é substituído pela sintaxe básica do Bloco de código que define
beginning..end..step-size;
. Representados numericamente, temos:0..10..1;
Observe que a sintaxe
0..10..1;
é equivalente a0..10;
Um tamanho de etapa de 1 é o valor padrão para a notação abreviada. Assim,0..10;
será fornecida uma sequência de 0 a 10 com um tamanho de etapa de 1.O exemplo de Sequência é semelhante, exceto se usarmos “#” para indicar que desejamos 15 valores na lista em vez de uma lista que vai até 15. Neste caso, estamos definindo:
beginning..#ofSteps..step-size:
A sintaxe real para a sequência é0..#15..2
Usando o símbolo “#” da etapa anterior, agora o colocamos na parte “step-size” da sintaxe. Agora, temos um intervalo de números que se estende de “beginning” até “end”, e a notação “step-size” distribui uniformemente alguns valores entre os dois:
beginning..end..#ofSteps
A criação de intervalos avançados nos permite trabalhar com uma lista de listas de forma simples. Nos exemplos abaixo, vamos isolar uma variável da notação do intervalo principal e criar outro intervalo dessa lista.
1. Criando intervalos aninhados, compare a notação com “#” e a notação sem. A mesma lógica se aplica a intervalos básicos, exceto pelo fato de que fica um pouco mais complexo.
2. Podemos definir um subintervalo em qualquer lugar dentro do intervalo principal e observar que também podemos ter dois subintervalos.
3. Controlando o valor “end” em um intervalo, criamos mais intervalos de comprimentos diferentes.
Como um exercício lógico, compare as duas abreviações acima e tente analisar como os subintervalos e a notação # controlam a saída resultante.
Além de criar listas com abreviações, podemos criar listas imediatamente. Essas listas podem conter um amplo intervalo de tipos de elementos e também podem ser consultadas (lembre-se: as próprias listas são objetos). Para resumir, com o bloco de código você faz listas e consulta itens de uma lista com colchetes :
1. Crie listas rapidamente com sequências de caracteres e consulte-as usando o índice do item.
2. Crie listas com variáveis e consulte usando a notação de abreviação de intervalo.
O gerenciamento com listas aninhadas é um processo semelhante. Esteja ciente da ordem da lista e chame de volta usando vários conjuntos de colchetes:
1. Defina uma lista de listas.
2. Consulte uma lista com uma notação de colchete único.
3. Consulte um item com uma notação de colchete duplo.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Neste exercício, flexibilizaremos nossas novas habilidades de abreviação para criar uma superfície de casca de ovo moderna definida por intervalos e fórmulas. Durante este exercício, observe como usamos o bloco de código e os nós do Dynamo existentes em conjunto: usamos o bloco de código para o levantamento de dados pesados enquanto os nós do Dynamo são visualmente dispostos para a legibilidade da definição.
Comece criando uma superfície conectando os nós acima. Em vez de usar um nó de número para definir a largura e o comprimento, clique duas vezes na tela e digite 100;
em um bloco de código
Defina um intervalo entre 0 e 1 com 50 divisões digitando
0..1..#50
em um Bloco de código.Conecte o intervalo a Surface.PointAtParameter, que usa os valores u e v entre 0 e 1 na superfície. Lembre-se de alterar a Amarra para Produto transversal clicando com o botão direito do mouse no nó Surface.PointAtParameter.
Nesta etapa, empregamos nossa primeira função para mover o eixo de pontos para cima no Z. Esse eixo controlará uma superfície gerada com base na função subjacente. Adicione novos nós, como mostrado na imagem abaixo
Em vez de usar um nó de fórmula, usamos um Bloco de código com a linha:
(0..Math.Sin(x*360)..#50)*5;
. Para analisar isso rapidamente, definimos um intervalo com uma fórmula dentro dele. Essa fórmula é a função Seno. A função seno recebe entradas de grau no Dynamo, portanto, para obter uma onda senoidal completa, multiplicamos nossos valores de x (essa é a entrada de intervalo de 0 a 1) por 360. Em seguida, queremos o mesmo número de divisões que os pontos de eixo de controle para cada linha, portanto, definimos cinquenta subdivisões com #50. Finalmente, o multiplicador de 5 simplesmente aumenta a amplitude da conversão para que possamos ver o efeito na Visualização do Dynamo.
Apesar de o Bloco de código anterior funcionar bem, não era completamente paramétrico. Queremos controlar os parâmetros dinamicamente; portanto, substituiremos a linha da etapa anterior por
(0..Math.Sin(x*360*cycles)..#List.Count(x))*amp;
. Isso nos oferece a capacidade de definir esses valores com base nas entradas.
Alterando os controles deslizantes (de 0 a 10), obtemos resultados interessantes.
Efetuando uma transposição no intervalo de números, inverteremos a direção da onda da cortina:
transposeList = List.Transpose(sineList);
Obtemos uma superfície de casca de ovo distorcida quando adicionamos sineList e tranposeList:
eggShellList = sineList+transposeList;
Vamos alterar os valores dos controles deslizantes especificados abaixo para “acalmar as águas” deste algoritmo.
Por último, vamos consultar partes isoladas dos dados com o bloco de código. Para regenerar a superfície com um intervalo específico de pontos, adicione o bloco de código acima entre os nós Geometry.Translate e NurbsSurface.ByPoints. Isso tem a linha de texto: sineStrips[0..15..1];
. Isso selecionará as primeiras 16 linhas de pontos (de 50). Recriando a superfície, podemos ver que geramos uma parte isolada do eixo de pontos.
Na etapa final, para tornar esse Bloco de código mais paramétrico, controlaremos a consulta usando um controle deslizante que varia entre 0 e 1. Fazemos isso com esta linha de código:
sineStrips[0..((List.Count(sineStrips)-1)*u)];
. Isso pode parecer confuso, mas a linha de código nos fornece uma forma rápida de dimensionar o comprimento da lista em um multiplicador entre 0 e 1.
Um valor de 0.53
no controle deslizante cria uma superfície logo após o ponto central do eixo.
E, conforme esperado, um controle deslizante de 1
cria uma superfície com base no eixo completo de pontos.
Analisando o gráfico visual, podemos realçar os blocos de código e ver cada uma de suas funções.
1. O primeiro Bloco de código substitui o nó Número.
2. O segundo Bloco de código substitui o nó Intervalo de números.
3. O terceiro Bloco de código substitui o nó Fórmula (assim como List.Transpose, List.Count e Intervalo de números).
4. O quarto Bloco de código consulta uma lista de listas, substituindo o nó List.GetItemAtIndex.
Trabalhar com pontos COGO e grupos de pontos no Civil 3D é um elemento central de muitos processos do campo à conclusão. O Dynamo realmente brilha quando se trata de gerenciamento de dados e demonstraremos um caso de uso potencial neste exemplo.
Trabalhar com listas
Agrupar objetos similares com o nó List.GroupByKey
Mostrar a saída personalizada no Reprodutor do Dynamo
Este gráfico será executado no Civil 3D 2020 e versões superiores.
Comece fazendo o download dos arquivos de amostra abaixo e, em seguida, abrindo o arquivo DWG e o gráfico do Dynamo.
Apresentamos a seguir uma visão geral da lógica no gráfico.
Obter todos os pontos COGO no documento
Agrupar os pontos COGO por descrição
Criar os grupos de pontos
Gerar a saída de um resumo para o Reprodutor do Dynamo
Vamos começar
Nossa primeira etapa é obter todos os grupos de pontos no documento e, em seguida, obter todos os pontos COGO dentro de cada grupo. Isso nos fornecerá uma lista aninhada ou uma “lista de listas” com a qual será mais fácil trabalhar mais tarde se aplainarmos tudo em uma única lista com o nó List.Flatten.
Se você não estiver familiarizado com o trabalho com listas, veja a seção Trabalhar com listas.
Agora que temos todos os pontos COGO, precisamos separá-los em grupos com base em suas descrições. É exatamente isso que o nó List.GroupByKey faz. Ele essencialmente agrupa todos os itens que compartilham a mesma chave.
O trabalho árduo está feito. A etapa final é criar novos grupos de pontos do Civil 3D com base em pontos COGO agrupados.
Quando você executa o gráfico, não há nada para ver na visualização do plano de fundo do Dynamo porque não estamos trabalhando com nenhuma geometria. Portanto, a única maneira de ver se o gráfico foi executado corretamente é verificar o espaço da ferramenta ou analisar as visualizações de saída do nó. No entanto, se executarmos o gráfico usando o Reprodutor do Dynamo, poderemos fornecer mais feedback sobre os resultados do gráfico, gerando um resumo dos grupos de pontos que foram criados. Tudo o que você precisa fazer é clicar com o botão direito do mouse em um nó e defini-lo como É saída. Neste caso, usamos um nó Inspeção renomeado para visualizar os resultados.
Veja um exemplo de como executar o gráfico usando o Reprodutor do Dynamo.
Se o Reprodutor do Dynamo for algo novo para você, veja a seção Reprodutor do Dynamo.
Veja a seguir algumas ideias sobre como você pode expandir os recursos desse gráfico.
Modifique o agrupamento de pontos para que seja baseado na descrição completa em vez de na descrição original.
Agrupe os pontos em algumas outras categorias predefinidas que você escolher (por exemplo, “Instantâneos no nível do solo”, “Monumentos” etc.)
Cria automaticamente superfícies TIN para pontos em determinados grupos.
Um dos muitos casos de uso excelentes do Dynamo é posicionar objetos separados dinamicamente ao longo de um modelo de corredor. Geralmente, os objetos precisam ser posicionados em localizações independentes das montagens inseridas ao longo do corredor, o que é uma tarefa muito entediante para ser realizada manualmente. E, quando a geometria horizontal ou vertical do corredor muda, isso introduz uma quantidade significativa de retrabalho.
Ler dados de um arquivo externo (neste caso, Excel)
Organizar dados em dicionários
Usar sistemas de coordenadas para controlar a posição/escala/rotação
Posicionar referências de bloco
Visualizar a geometria no Dynamo
Este gráfico será executado no Civil 3D 2020 e versões superiores.
Comece fazendo o download dos arquivos de amostra abaixo e, em seguida, abrindo o arquivo DWG e o gráfico do Dynamo.
É melhor que o arquivo do Excel seja salvo no mesmo diretório que o gráfico do Dynamo.
Apresentamos a seguir uma visão geral da lógica no gráfico.
Ler o arquivo do Excel e importar os dados para o Dynamo
Obter as linhas de recurso da linha base do corredor especificada
Gerar os sistemas de coordenadas ao longo da linha de recurso do corredor nas estacas desejadas
Usar os sistemas de coordenadas para posicionar referências de bloco no espaço do modelo
Vamos começar
Neste gráfico de exemplo, vamos usar um arquivo do Excel para armazenar os dados que o Dynamo usará para posicionar as referências de bloco dos postes de luz. A tabela tem a aparência a seguir.
Usar o Dynamo para ler dados de um arquivo externo (como um arquivo do Excel) é uma ótima estratégia, especialmente quando os dados precisam ser compartilhados com outros membros da equipe.
Os dados do Excel são importados para o Dynamo da seguinte maneira.
Agora que temos os dados, precisamos dividi-los por coluna (Corredor, Linha base, PointCode etc.) para que possam ser usados no restante do gráfico. Uma forma comum de fazer isso é usar o nó List.GetItemAtIndex e especificar o número de índice de cada coluna que desejamos. Por exemplo, a coluna Corredor está no índice 0, a coluna Linha base está no índice 1 etc.
Parece bom, certo? Mas há um problema potencial com essa abordagem. E se a ordem das colunas no arquivo do Excel for alterada no futuro? Ou uma nova coluna for adicionada entre duas colunas? Nesses casos, o gráfico não funcionará corretamente e exigirá uma atualização. Podemos tornar o gráfico à prova de futuro colocando os dados em um Dicionário, com os cabeçalhos de coluna do Excel como chaves e o resto dos dados como valores.
Se os dicionários forem algo novo para você, veja a seção Dicionários no Dynamo.
Isso torna o gráfico mais resiliente porque permite flexibilidade ao alterar a ordem das colunas no Excel. Enquanto os cabeçalhos de coluna permanecerem os mesmos, os dados poderão ser recuperados do dicionário usando sua chave (ou seja, o cabeçalho da coluna), que é o que fazemos em seguida.
Agora que temos os dados do Excel importados e prontos para serem usados, vamos começar a usá-los para obter algumas informações do Civil 3D sobre os modelos de corredor.
Selecione o modelo de corredor pelo nome.
Obtenha uma linha base específica dentro do corredor.
Obtenha uma linha do recurso na linha base pelo código de ponto.
O que vamos fazer agora é gerar Sistemas de coordenadas ao longo das linhas de recurso do corredor nos valores de estaca que especificamos no arquivo do Excel. Esses sistemas de coordenadas serão usados para definir a posição, a rotação e a escala das referências de bloco dos postes de luz.
Se os sistemas de coordenadas forem algo novo para você, veja a seção Vetor, plano e sistema de coordenadas.
Observe o uso de um bloco de código para rotacionar os sistemas de coordenadas, dependendo do lado em que eles estejam da linha base. Isso pode ser obtido usando uma sequência de vários nós, mas esse é um bom exemplo de uma situação em que é mais fácil escrever manualmente.
Se os blocos de código forem algo novo para você, veja a seção Blocos de código e DesignScript.
Está quase. Temos todas as informações necessárias para podermos realmente posicionar as referências de bloco. A primeira coisa a fazer é obter as definições de bloco que desejamos usando a coluna BlockName do arquivo do Excel.
A partir daí, a última etapa é criar as referências de bloco.
Quando você executar o gráfico, deverá ver novas referências de bloco mostradas no espaço do modelo ao longo do corredor. E aqui está a parte interessante – se o modo de execução do gráfico estiver definido como Automático e você editar o arquivo do Excel, as referências de bloco serão atualizadas automaticamente.
Você pode ler mais sobre os modos de execução de gráficos na seção Interface do usuário.
Veja um exemplo de como executar o gráfico usando o Reprodutor do Dynamo.
Se o Reprodutor do Dynamo for algo novo para você, veja a seção Reprodutor do Dynamo.
Pode ser útil visualizar a geometria do corredor no Dynamo para fornecer contexto. Este modelo específico tem os sólidos do corredor já extraídos no espaço do modelo, então vamos levá-los para o Dynamo.
Mas há algo mais que precisamos considerar. Os sólidos são um tipo de geometria relativamente “pesada”, o que significa que essa operação diminuirá a velocidade do gráfico. Seria bom se houvesse uma maneira simples de escolher se desejamos visualizar os sólidos ou não. A resposta óbvia é desconectar o nó Corridor.GetSolids, mas isso produzirá avisos para todos os nós a jusante, o que é um pouco confuso. Essa é uma situação em que o nó ScopeIf realmente se destaca.
Observe que o nó Object.Geometry tem uma barra cinza na parte inferior. Isso significa que a visualização do nó está desativada (acessível clicando com o botão direito do mouse no nó), o que permite que GeometryColor.ByGeometryColor evite “brigar” com outra geometria por prioridade de exibição na visualização do plano de fundo.
O nó ScopeIf basicamente permite executar seletivamente uma ramificação inteira de nós. Se a entrada test for falsa, nenhum nó conectado ao nó ScopeIf será executado.
Veja o resultado na visualização do plano de fundo do Dynamo.
Veja a seguir algumas ideias sobre como você pode expandir os recursos desse gráfico.
Adicione uma coluna de rotação ao arquivo do Excel e use-a para controlar a rotação dos sistemas de coordenadas.
Adicione deslocamentos horizontais ou verticais ao arquivo do Excel para que os postes de luz possam se desviar da linha de recurso do corredor, se necessário.
Em vez de usar um arquivo do Excel com valores de estaca, gere os valores de estaca diretamente no Dynamo usando uma estaca inicial e um espaçamento típico.
O projeto de engenharia de uma construção habitacional típica envolve o trabalho com várias concessionárias subterrâneas, como esgoto sanitário, drenagem de águas pluviais, água potável ou outras. Este exemplo demonstrará como o Dynamo pode ser usado para desenhar as conexões de serviço de uma linha principal de distribuição até um determinada subdivisão de propriedade (por exemplo, um lote). É comum que todos os lotes exijam uma conexão de serviço, o que introduz um trabalho tedioso significativo para colocar todos os serviços. O Dynamo pode acelerar o processo desenhando automaticamente a geometria necessária com precisão, além de fornecer entradas flexíveis que podem ser ajustadas para se adequarem às normas de órgãos locais.
Usar o nó Selecionar objeto para a entrada do usuário
Trabalhar com sistemas de coordenadas
Usar operações geométricas como Geometry.DistanceTo e Geometry.ClosestPointTo
Criar referências de bloco
Controlar as configurações de vinculação de objetos
Este gráfico será executado no Civil 3D 2020 e versões superiores.
Comece fazendo o download dos arquivos de amostra abaixo e, em seguida, abrindo o arquivo DWG e o gráfico do Dynamo.
Apresentamos a seguir uma visão geral da lógica no gráfico.
Obter a geometria da curva para a linha principal de distribuição
Obter a geometria da curva para uma linha do lote selecionada pelo usuário, revertendo se necessário
Gerar os pontos de inserção para os medidores de serviço
Obter os pontos na linha principal de distribuição que estão mais próximos das localizações do medidor de serviço
Criar referências de bloco e linhas no espaço do modelo
Vamos começar
Nossa primeira etapa é obter a geometria da linha de distribuição principal no Dynamo. Em vez de selecionar linhas individuais ou polilinhas, vamos obter todos os objetos em uma determinada camada e uni-los como uma PolyCurve do Dynamo.
Se a geometria da curva do Dynamo for nova para você, veja a seção Curvas.
Em seguida, precisamos colocar a geometria de uma linha do lote selecionada no Dynamo para que possamos trabalhar com ela. A ferramenta certa para o trabalho é o nó Selecionar objeto, que permite que o usuário do gráfico selecione um objeto específico no Civil 3D.
Também precisamos lidar com um possível problema que surja. A linha do lote tem um ponto inicial e um ponto final, o que significa que ela tem uma direção. Para que o gráfico produza resultados consistentes, precisamos que todas as linhas do lote tenham uma direção consistente. Podemos levar em conta essa condição diretamente na lógica do gráfico, o que torna o gráfico mais resiliente.
Obtenha os pontos inicial e final da linha do lote.
Meça a distância de cada ponto até a linha principal de distribuição e, em seguida, descubra qual distância é maior.
O resultado desejado é que o ponto inicial da linha seja o mais próximo da linha principal de distribuição. Se esse não for o caso, invertemos a direção da linha do lote. Caso contrário, simplesmente retornaremos a linha do lote original.
É hora de descobrir onde os medidores de serviço serão colocados. Normalmente, a colocação é determinada pelos requisitos de órgãos locais; portanto, forneceremos valores de entrada que podem ser alterados para atender a várias condições. Vamos usar um Sistema de coordenadas ao longo da linha do lote como referência para criar os pontos. Isso torna muito fácil a definição de deslocamentos relativos à linha do lote, não importando sua orientação.
Se os sistemas de coordenadas forem algo novo para você, veja a seção Vetor, plano e sistema de coordenadas.
Agora precisamos obter os pontos na linha principal de distribuição que estão mais próximos da localizações do medidor de serviço Isso nos permitirá desenhar as conexões de serviço no espaço do modelo para que elas sempre sejam perpendiculares à linha principal de distribuição. O nó Geometry.ClosestPointTo é a solução perfeita.
Essa é a PolyCurve da linha principal de distribuição
Esses são os pontos de inserção do medidor de serviço
A última etapa é efetivamente criar objetos no espaço do modelo. Usaremos os pontos de inserção que geramos anteriormente para criar referências de bloco e, em seguida, usaremos os pontos na linha principal de distribuição para desenhar linhas para as conexões de serviço.
Quando você executar o gráfico, deverá ver novas referências de bloco e linhas de conexão de serviço no espaço do modelo. Tente alterar algumas das entradas e veja como tudo é atualizado automaticamente.
Você pode observar que, após colocar os objetos para uma linha do lote, selecionar uma linha do lote diferente resulta na “movimentação” dos objetos.
Esse é o comportamento padrão do Dynamo e é muito útil em muitos casos. No entanto, você pode achar conveniente colocar várias conexões de serviço sequencialmente e fazer com que o Dynamo crie novos objetos a cada execução em vez de modificar os originais. É possível controlar esse comportamento ao alterar as configurações de vinculação de objetos.
Veja a seção Vinculação de objetos para obter mais informações.
Alterar essa configuração forçará o Dynamo a “esquecer” os objetos que cria a cada execução. Veja a seguir um exemplo de como executar o gráfico com a vinculação de objetos desativada usando o Reprodutor do Dynamo.
Se o Reprodutor do Dynamo for algo novo para você, veja a seção Reprodutor do Dynamo.
Veja a seguir algumas ideias sobre como você pode expandir os recursos desse gráfico.
Coloque várias conexões de serviço simultaneamente em vez de selecionar cada linha do lote.
Ajuste as entradas para colocar limpeza de esgoto em vez de medidores de serviço de água.
Adicione um botão de alternância para permitir a colocação de uma única conexão de serviço em um lado específico da linha do lote em vez de em ambos os lados.
A edição de parâmetros da documentação segue as lições aprendidas nas seções anteriores. Nesta seção, vamos examinar os parâmetros de edição que não afetam as propriedades geométricas de um elemento, mas, em vez disso, preparam um arquivo do Revit para a documentação.
No exercício abaixo, vamos usar um desvio básico do nó do plano para criar uma folha do Revit para documentação. Cada painel em nossa estrutura de telhado definida parametricamente tem um valor diferente para o desvio, e queremos chamar o intervalo de valores usando cores e programando os pontos adaptativos para entregar a um consultor de fachadas, engenheiro ou empreiteiro.
O desvio do nó do plano calculará a distância pela qual o conjunto de quatro pontos varia em relação ao plano de melhor ajuste entre eles. Essa é uma maneira rápida e fácil de estudar a construtibilidade.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Inicie com o arquivo do Revit nesta seção (ou continue da seção anterior). Esse arquivo tem uma matriz de painéis ETFE no telhado. Vamos fazer referência a esses painéis para este exercício.
Adicione um nó Tipos de família à tela e escolha “ROOF-PANEL-4PT”.
Conecte esse nó a um nó Todos os elementos do tipo de família para selecionar todos os elementos do Revit para o Dynamo.
Consulte a localização dos pontos adaptativos de cada elemento com o nó AdaptiveComponent.Locations.
Crie um polígono com base nesses quatro pontos com o nó Polygon.ByPoints. Observe que agora temos uma versão abstrata do sistema de painéis no Dynamo sem ter que importar toda a geometria do elemento do Revit.
Calcule o desvio do plano com o nó Polygon.PlaneDeviation.
Só para testar, como no exercício anterior, vamos definir a proporção de abertura de cada painel com base em seu desvio do plano.
Adicione um nó Element.SetParameterByName à tela e conecte os componentes adaptativos à entrada elemento. Conecte um Bloco de código com a inscrição “Proporção de abertura” à entrada parameterName.
Não é possível conectar diretamente os resultados do desvio à entrada de valor porque precisamos remapear os valores para o intervalo de parâmetros.
Usando Math.RemapRange, remapeie os valores de desvio para um domínio entre 0,15 e 0_,_45 inserindo
0.15; 0.45;
no Bloco de código.Conecte esses resultados à entrada de valor de Element.SetParameterByName.
De volta ao Revit, podemos compreender de certa forma a mudança de abertura na superfície.
Aproximando o zoom, torna-se mais claro que os painéis fechados se concentram nos cantos da superfície. Os cantos abertos estão na parte superior. Os cantos representam áreas de desvio maior, enquanto a saliência tem uma curvatura mínima; portanto, isso faz sentido.
Definir a Proporção de abertura não demonstra claramente o desvio dos painéis no telhado. Também estamos alterando a geometria do elemento real. Suponha que só desejamos estudar o desvio do ponto de vista da viabilidade de fabricação. Seria útil colorir os painéis com base no intervalo de desvio para nossa documentação. Podemos fazer isso com a série de etapas abaixo e em um processo muito semelhante às etapas acima.
Remova o Element.SetParameterByName e seus nós de entrada e adicione Element.OverrideColorInView.
Adicione um nó Intervalo de cores à tela e conecte-o à entrada de cor Element.OverrideColorInView. Ainda precisamos conectar os valores de desvio ao intervalo de cores para criar o gradiente.
Se você passar o mouse sobre a entrada valor, será possível ver que os valores da entrada devem estar entre 0 e 1 para mapear uma cor para cada valor. Precisamos remapear os valores de desvio para esse intervalo.
Usando Math.RemapRange, remapeie os valores de desvio do plano para um intervalo entre* 0* e 1 (observação: também é possível usar o nó “MapTo” para definir um domínio de origem).
Conecte os resultados a um nó Intervalo de cores.
Observe que nossa saída é um intervalo de cores, em vez de um intervalo de números.
Se a definição estiver como Manual, pressione Executar. A partir desse ponto, você deve conseguir estabelecer a definição como Automático.
De volta ao Revit, vemos um gradiente muito mais legível que é representativo do desvio plano com base em nosso intervalo de cores. Mas, e se quisermos personalizar as cores? Observe que os valores de desvio mínimo são representados em vermelho, o que parece ser o oposto do que esperávamos. Queremos que o desvio máximo esteja em vermelho, com o desvio mínimo representado por uma cor menos intensa. Vamos voltar ao Dynamo e corrigir isso.
Usando um Bloco de código, adicione dois números em duas linhas diferentes:
0;
e255;
.Crie uma cor vermelha e azul ao conectar os valores apropriados em dois nós Color.ByARGB.
Crie uma lista com base nessas duas cores.
Conecte essa lista à entrada cores do Intervalo de cores e observe a atualização personalizada do intervalo de cores.
De volta ao Revit, agora podemos entender melhor as áreas de desvio máximo nos cantos. Lembre-se: esse nó se destina a substituir uma cor em uma vista; portanto, poderá ser realmente útil se tivermos uma folha específica no conjunto de desenhos com foco em um determinado tipo de análise.
Ao selecionar um painel ETFE no Revit, vemos que há quatro parâmetros de instância: XYZ1, XYZ2, XYZ3 e XYZ4. Eles ficam todos em branco depois de serem criados. Esses são parâmetros baseados em texto e precisam de valores. Usaremos o Dynamo para escrever as localizações dos pontos adaptativos em cada parâmetro. Isso ajudará a interoperabilidade se a geometria precisar ser enviada para um engenheiro consultor de fachadas.
Em uma folha de amostra, temos uma tabela grande e vazia. Os parâmetros XYZ são parâmetros compartilhados no arquivo do Revit, o que nos permite adicioná-los à tabela.
Aproximando o zoom, os parâmetros XYZ ainda devem ser preenchidos. Os dois primeiros parâmetros são preparados pelo Revit.
Para gravar esses valores, faremos uma operação de lista complexa. O gráfico em si é simples, mas os conceitos são criados intensamente com base no mapeamento da lista, conforme discutido no capítulo sobre a lista.
Selecione todos os componentes adaptativos com dois nós.
Extraia a localização de cada ponto com AdaptiveComponent.Locations.
Converta esses pontos em sequências de caracteres. Lembre-se: o parâmetro se baseia em texto; portanto, é preciso inserir o tipo de dados correto.
Crie uma lista das quatro sequências de caracteres que definem os parâmetros a serem alterados:XYZ1, XYZ2, XYZ3, e XYZ4.
Conecte essa lista à entrada parameterName de Element.SetParameterByName.
Conecte Element.SetParameterByName à entrada combinador de List.Combine. Conecte os componentes adaptativos à list1. Conecte a Sequência de caracteres do objeto à list2.
Estamos mapeando a lista aqui, porque estamos gravando quatro valores para cada elemento, que cria uma estrutura de dados complexa. O nó List.Combine define uma operação uma etapa abaixo na hierarquia de dados. É por isso que as entradas de elemento e de valor Element.SetParameterByName são deixadas em branco. List.Combine está conectando as sublistas de suas entradas às entradas vazias de Element.SetParameterByName, com base na ordem em que elas estão conectadas.
Selecionando um painel no Revit, poderemos ver agora que temos valores de sequência de caracteres para cada parâmetro. Realisticamente, criaríamos um formato mais simples para escrever um ponto (X,Y,Z). Isso pode ser feito com operações de sequência de caracteres no Dynamo, mas estamos ignorando isso aqui para permanecer no escopo deste capítulo.
Uma vista da amostra de cronograma com parâmetros preenchidos.
Cada painel ETFE agora tem as coordenadas XYZ gravadas para cada ponto adaptativo, representando os cantos de cada painel para fabricação.
O Reprodutor do Dynamo fornece uma forma simplificada para executar gráficos do Dynamo no Civil 3D. Após a criação dos gráficos, não é necessário nenhum conhecimento do Dynamo para usar o Reprodutor e executar os gráficos. Isso facilita o compartilhamento de gráficos com outras pessoas que podem não estar interessadas em analisar os detalhes de nós e fios.
Para obter mais informações sobre o Reprodutor do Dynamo no Civil 3D, consulte a documentação fornecida no site Ajuda do Civil 3D.
O desenvolvimento de envelopes cinemáticos para validação da altura livre é uma parte importante do projeto de ferrovia. É possível usar o Dynamo para gerar sólidos para o envelope, em vez de criar e gerenciar submontagens complexas de corredor para fazer o trabalho.
Trabalhar com linhas de recurso do corredor
Transformar a geometria entre sistemas de coordenadas
Criar sólidos por elevação
Controlar o comportamento do nó com configurações de amarra
Este gráfico será executado no Civil 3D 2020 e versões superiores.
Comece fazendo o download dos arquivos de amostra abaixo e, em seguida, abrindo o arquivo DWG e o gráfico do Dynamo.
Apresentamos a seguir uma visão geral da lógica no gráfico.
Obter linhas de recurso da linha base do corredor especificada
Gerar sistemas de coordenadas ao longo da linha de recurso do corredor no espaçamento desejado
Transformar a geometria do bloco do perfil para os sistemas de coordenadas
Elevar um sólido entre os perfis
Criar sólidos no Civil 3D
Vamos começar
Nossa primeira etapa é obter os dados do corredor. Selecionaremos o modelo de corredor pelo nome, obteremos uma linha base específica dentro do corredor e, em seguida, obteremos uma linha de recurso dentro da linha base pelo código de ponto.
O que vamos fazer agora é gerar os Sistemas de coordenadas ao longo das linhas de recurso do corredor entre uma determinada estaca inicial e final. Esses sistemas de coordenadas serão usados para alinhar a geometria do bloco do perfil do veículo com o corredor.
Se os sistemas de coordenadas forem algo novo para você, veja a seção Vetor, plano e sistema de coordenadas.
Observe os pequenos XXX no canto inferior direito do nó. Isso significa que as configurações de amarra do nó são definidas como Produto transversal, que é necessário para gerar os sistemas de coordenadas nos mesmos valores de estaca para ambas as linhas de recurso.
Se a amarra de nó for algo novo para você, veja a seção O que é uma lista?.
Agora, precisamos de alguma forma criar uma matriz dos perfis de veículo ao longo das linhas do recurso. O que vamos fazer é transformar a geometria da definição do bloco do perfil do veículo usando o nó Geometry.Transform. Esse é um conceito complicado de visualizar, assim, antes de analisarmos os nós, veja a seguir um gráfico que mostra o que vai acontecer.
Basicamente, estamos usando a geometria do Dynamo de uma única definição de bloco e movendo-a/girando-a, tudo isso enquanto criamos uma matriz ao longo da linha do recurso. Que legal. Veja como é a aparência da sequência de nós.
Isso obtém a definição de bloco do documento.
Esses nós obtêm a geometria do Dynamo dos objetos dentro do bloco.
Esses nós definem essencialmente o sistema de coordenadas com base no qual estamos transformando a geometria.
E, por fim, esse nó faz o trabalho real de transformar a geometria.
Observe a amarra Mais longa nesse nó.
E aqui está o que obtemos no Dynamo.
Temos boas notícias. O trabalho árduo está feito. Tudo o que precisamos fazer agora é gerar sólidos entre os perfis. Isso é facilmente obtido com o nó Solid.ByLoft.
E aqui está o resultado. Lembre-se de que esses são sólidos do Dynamo – ainda precisamos criá-los no Civil 3D.
Nossa última etapa é gerar os sólidos gerados no espaço do modelo. Também daremos a eles uma cor para torná-los muito fáceis de ver.
Veja um exemplo de como executar o gráfico usando o Reprodutor do Dynamo.
Se o Reprodutor do Dynamo for algo novo para você, veja a seção Reprodutor do Dynamo.
Veja a seguir algumas ideias sobre como você pode expandir os recursos desse gráfico.
Adicione a capacidade de usar diferentes intervalos de estacas separadamente para cada trilha.
Divida os sólidos em segmentos menores que podem ser analisados individualmente para detectar interferências.
Verifique se os sólidos de envelope fazem interseção com recursos e colore os que apresentam interferência.
O Dynamo for Civil 3D contém um mecanismo muito poderoso para “lembrar” os objetos que são criados por cada nó. Esse mecanismo é chamado de Vinculação de objetos e permite que um gráfico do Dynamo produza resultados consistentes sempre que for executado no mesmo documento. Embora isso seja altamente desejável em muitas situações, há outras situações em que você pode desejar ter mais controle sobre o comportamento do Dynamo. Esta seção ajudará a entender como funciona a vinculação de objetos e como você pode tirar proveito dela.
Considere este gráfico que cria um círculo no espaço do modelo na camada atual.
Observe o que acontece quando o raio é alterado.
É a vinculação de objetos em ação. O comportamento padrão do Dynamo é modificar o raio do círculo, em vez de criar um novo círculo sempre que a entrada do raio é alterada. Isso ocorre porque o nó Object.ByGeometry “lembra” que criou esse círculo específico sempre que o gráfico é executado. Além disso, o Dynamo armazenará essas informações de modo que, na próxima vez que você abrir o documento do Civil 3D e executar o gráfico, ele tenha exatamente o mesmo comportamento.
Vamos examinar um exemplo no qual você pode desejar alterar o comportamento da vinculação de objetos padrão do Dynamo. Digamos que você deseje criar um gráfico que posicione o texto no meio de um círculo. No entanto, sua intenção com esse gráfico é que ele possa ser executado repetidamente e posicionar novo texto sempre que qualquer círculo for selecionado. Veja a seguir a aparência do gráfico.
No entanto, isso é o que acontece quando um círculo diferente é selecionado.
Parece que o texto é excluído e recriado a cada execução do gráfico. Na realidade, a posição do texto está sendo modificada, dependendo de qual círculo está selecionado. Portanto, é o mesmo texto, só que em um lugar diferente. Para criar um novo texto a cada vez, é necessário modificar as configurações de vinculação de objetos do Dynamo para que nenhum dado de vinculação seja mantido (consulte #binding-settingsabaixo).
Depois de fazer essa alteração, temos o comportamento que procuramos.
O Dynamo for Civil 3D permite modificar o comportamento padrão da vinculação de objetos por meio das configurações Armazenamento de dados de vinculação no menu do Dynamo.
Observe que as opções de Armazenamento de dados de vinculação estão disponíveis no Civil 3D 2022.1 e versões posteriores.
Todas as opções estão ativadas por padrão. Veja a seguir um resumo do que cada opção faz.
Quando essa opção está ativada, o Dynamo “esquecerá” os objetos que criou na última vez que o gráfico foi executado. Assim, o gráfico pode ser executado em qualquer desenho em qualquer situação e criará novos objetos a cada vez.
Quando usar
Use essa opção quando desejar que o Dynamo “esqueça” tudo sobre o que fez em execuções anteriores e crie novos objetos todas as vezes.
Essa opção significa que os metadados da vinculação de objetos serão serializados no gráfico (arquivo .dyn) quando ele for salvo. Se você fechar/reabrir o gráfico e executá-lo no mesmo desenho, tudo deverá funcionar da mesma forma que você deixou. Se o gráfico for executado em um desenho diferente, os dados de vinculação serão removidos do gráfico e novos objetos serão criados. Isso significa que, se você abrir o desenho original e executar o gráfico novamente, serão criados novos objetos além dos antigos.
Quando usar
Use essa opção quando desejar que o Dynamo “lembre-se” dos objetos que criou na última vez que foi executado em um desenho específico.
Essa opção é mais adequada para situações em que é possível manter uma relação 1:1 entre um desenho específico e um gráfico do Dynamo. As opções 1 e 3 são mais adequadas para gráficos projetados para execução em vários desenhos.
Essa opção é semelhante à Opção 2, exceto que os dados de vinculação de objetos são serializados no desenho em vez de serem no gráfico (arquivo .dyn). Se você fechar/reabrir o gráfico e executá-lo no mesmo desenho, tudo deverá funcionar da mesma forma que você deixou. Se o gráfico for executado em um desenho diferente, os dados de vinculação ainda serão preservados no desenho original, já que ele é salvo no desenho e não no gráfico.
Quando usar
Use essa opção quando desejar usar o mesmo gráfico em vários desenhos e que o Dynamo “lembre” do que fez em cada um deles.
A primeira coisa a observar com essa opção é que ela não tem efeito sobre como o gráfico interage com o desenho ao executar o gráfico através da interface principal do Dynamo. Essa opção somente se aplica quando o gráfico é executado usando o Reprodutor do Dynamo.
Se o Reprodutor do Dynamo for algo novo para você, veja a seção Reprodutor do Dynamo.
Se o gráfico for executado usando a interface principal do Dynamo e, em seguida, fechar e executar o mesmo gráfico usando o Reprodutor do Dynamo, ele criará novos objetos além dos que criou antes. No entanto, quando o Reprodutor do Dynamo executar o gráfico uma vez, ele serializará os dados da vinculação de objetos no desenho. Portanto, se o gráfico for executado várias vezes através do Reprodutor do Dynamo, ele atualizará os objetos em vez de criar novos. Se o gráfico for executado através do Reprodutor do Dynamo em um desenho diferente, os dados de vinculação ainda serão preservados no desenho original, já que ele será salvo no desenho e não no gráfico.
Quando usar
Use essa opção quando desejar executar um gráfico usando o Reprodutor do Dynamo em vários desenhos e que ele “lembre” o que fez em cada um deles.
Os pacotes do Dynamo são conjuntos de ferramentas desenvolvidos por terceiros para estender a funcionalidade principal do Dynamo. Eles podem ser acessados por todos e prontos para download com o clique do botão.
Consulte a seção Pacotes para obter mais informações sobre como começar a usar pacotes.
Veja a seguir uma lista de alguns dos pacotes mais populares que podem levar seus gráficos do Dynamo for Civil 3D a um novo patamar.
O Kit de ferramentas do Civil 3D é um pacote do Dynamo for Civil 3D que fornece aprimoramentos significativos aos recursos do Dynamo por meio de um grande inventário de nós adicionais.
O Camber é um pacote de código aberto do Dynamo for Civil 3D que inclui centenas de nós para trabalhar com legendas, refexs, atalhos de dados, estilos etc.
O CivilConnection é um pacote do Dynamo para Revit de código aberto que permite a troca de informações entre o Civil 3D, o Dynamo e o Revit.
O Arkance Systems Nodes é um pacote do Dynamo for Civil 3D com uma grande variedade de nós úteis para trabalhar com cotas, tabelas, vistas, controle de perfuração etc.
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.
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.
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.
O Dynamo for Civil 3D traz o paradigma da programação visual para engenheiros e projetistas que trabalham em projetos de infraestrutura civil. Você pode pensar no Dynamo como uma espécie de multiferramenta digital para usuários do Civil 3D, seja qual for a tarefa, ele tem a ferramenta certa para o trabalho. Sua interface intuitiva permite criar rotinas poderosas e personalizáveis sem escrever uma única linha de código. Não é necessário ser um programador para usar o Dynamo, mas é preciso pensar na lógica de um programador. Juntamente com os outros capítulos do manual, este capítulo ajudará você a desenvolver suas habilidades lógicas para que você possa lidar com qualquer tarefa com uma mentalidade de projeto computacional.
O Dynamo foi introduzido pela primeira vez no Civil 3D 2020 e continuou a evoluir desde então. Inicialmente instalado separadamente por meio de uma atualização de software, agora é fornecido com todas as versões do Civil 3D. Dependendo de qual versão do Civil 3D você esteja usando, você poderá observar que a interface do Dynamo tem aparência ligeiramente diferente dos exemplos mostrados neste capítulo. Isso ocorre porque houve uma revisão significativa da interface no Civil 3D 2023.
É recomendável dar uma olhada no Blog do Dynamo para obter as informações mais atualizadas sobre o desenvolvimento do Dynamo. A tabela abaixo resume os principais marcos de vida do Dynamo for Civil 3D.
2024.1
2.18
2024
2.17
Atualização da interface do usuário do Reprodutor do Dynamo
2023.2
2.15
2023
2.13
Atualização da interface do usuário do Dynamo
2022.1
2.12
Foram adicionadas configurações de armazenamento de dados de vinculação de objetos
Novos nós para controlar a vinculação de objetos
2022
2.10
Incluído na instalação principal do Civil 3D
Transição do IronPython para o Python.NET
2021
2.5
2020.2
2.4
2020 Update 2
2.4
Novos nós adicionados
2020.1
2.2
2020
2.1
Versão inicial
O bloco de código é um recurso exclusivo no Dynamo que vincula dinamicamente um ambiente de programação visual com um baseado em texto. O bloco de código tem acesso a todos os nós do Dynamo e pode definir um gráfico completo em um nó. Leia este capítulo com atenção, já que o bloco de código é um bloco de construção fundamental do Dynamo.
O Dynamo é uma ótima porta de entrada para a escrita de códigos para o mundo AEC. Você pode ter interesse em algumas destas seções para iniciar sua jornada de codificação:
Você pode ter notado um tema comum nos nomes dos nós no Dynamo: cada nó usa uma sintaxe de “.” sem espaços. Isso ocorre porque o texto na parte superior de cada nó representa a sintaxe real dos scripts, e “.” (ou notação de ponto) separa um elemento dos métodos possíveis que podemos chamar. Isso cria uma conversão fácil de scripts visuais em scripts baseados em texto.
Como uma analogia geral da notação de ponto, como podemos lidar com uma maçã paramétrica no Dynamo? Abaixo estão alguns métodos que iremos executar na maçã antes de decidir comê-la. (Observação: Estes não são métodos reais do Dynamo):
Qual é a cor da maçã?
Apple.color
vermelho
A maçã está madura?
Apple.isRipe
true
Quanto a maçã pesa?
Apple.weight
170 g
De onde veio a maçã?
Apple.parent
árvore
O que a maçã cria?
Apple.children
sementes
Esta maçã foi cultivada localmente?
Apple.distanceFromOrchard
96 km
Não sei o que você acha, mas com base nos resultados da tabela acima, parece uma maçã saborosa. Acho que vou nomeá-la Apple.eat().
Com a analogia da maçã em mente, vamos examinar Point.ByCoordinates e mostrar como podemos criar um ponto usando o bloco de código.
A sintaxe do bloco de código Point.ByCoordinates(0,10);
fornece o mesmo resultado que um nó Point.ByCoordinates no Dynamo, exceto que podemos criar um ponto usando um nó. Isso é mais eficiente do que fazer a conexão com um nó separado em “X” e “Y”.
Usando Point.ByCoordinates no bloco de código, estamos especificando as entradas na mesma ordem que o nó pronto para uso (X,Y).
É possível chamar qualquer nó normal na biblioteca através de um bloco de código, desde que o nó não seja um nó da “IU” especial: aqueles com um recurso especial da interface do usuário. Por exemplo, é possível chamar Circle.ByCenterPointRadius, mas não faria muito sentido chamar um nó Watch 3D.
Os nós normais (a maioria da biblioteca) geralmente são de três tipos. Você verá que a biblioteca está organizada tendo em mente essas categorias. Os métodos ou nós desses três tipos são tratados de forma diferente quando executados dentro de um bloco de código.
Criar – Cria (ou constrói) algo
Ação – Realiza uma ação sobre algo
Consulta – Obtém uma propriedade de algo que já existe
A categoria “Criar” construirá a geometria do zero. Inserimos valores no bloco de código da esquerda para a direita. Essas entradas estão na mesma ordem que as entradas no nó de cima para baixo.
Comparando o nó Line.ByStartPointEndPoint e a sintaxe correspondente no bloco de código, obtemos os mesmos resultados.
Uma ação é algo que você faz em relação a um objeto desse tipo. O Dynamo usa a notação de ponto, comum a muitas linguagens de codificação, para aplicar uma ação a um item. Uma vez que você tenha o item, digite um ponto e, em seguida, o nome da ação. A entrada do método do tipo de ação é colocada entre parênteses como acontece nos métodos do tipo de criação, com a diferença de não ser necessário especificar a primeira entrada que você vê no nó correspondente. Em vez disso, especificamos o elemento no qual estamos executando a ação:
O nó Point.Add é um nó de tipo de ação, de modo que a sintaxe funciona de forma um pouco diferente.
As entradas são (1) o ponto e (2) o vetor a ser adicionado. Em um Bloco de código, nomeamos o ponto (o item) “pt”. Para adicionar um vetor chamado *“vec” * a “pt”, podemos escrever pt.Add(vec) ou: item, ponto, ação. A ação Adicionar tem somente uma entrada ou todas as entradas do nó Point.Add, menos a primeira. A primeira entrada do nó Point.Add é o ponto em si.
Os métodos de tipo consulta obtêm uma propriedade de um objeto. Como o próprio objeto é a entrada, não é necessário especificar nenhuma entrada. Nenhum parêntese é necessário.
A amarra com nós é um pouco diferente da amarra com bloco de código. Com nós, o usuário clica com o botão direito do mouse no nó e seleciona a opção de amarra a ser executada. Com o bloco de código, o usuário tem muito mais controle sobre como os dados são estruturados. O método abreviado do bloco de código usa guias de replicação para definir como várias listas unidimensionais devem ser emparelhadas. Os números entre colchetes angulares “<>” definem a hierarquia da lista aninhada resultante: <1>,<2>,<3> etc.
Neste exemplo, usaremos uma abreviação para definir dois intervalos (obtenha mais informações sobre abreviação na seção seguinte deste capítulo). Em resumo,
0..1;
é equivalente a{0,1}
e-3..-7
é equivalente a{-3,-4,-5,-6,-7}
. O resultado nos fornece listas de dois valores x e cinco valores y. Se não usarmos guias de replicação com estas listas não coincidentes, obteremos uma lista de dois pontos, que é o comprimento da lista mais curta. Usando guias de replicação, podemos encontrar todas as possíveis combinações de coordenadas 2 e 5 (ou um Produto transversal).Usando a sintaxe Point.ByCoordinates
(x_vals<1>,y_vals<2>);
, obtemos duas listas com cinco itens em cada lista.Usando a sintaxe Point.ByCoordinates
(x_vals<2>,y_vals<1>);
, obtemos cinco listas com dois itens em cada lista.
Com essa notação, também podemos especificar qual lista será dominante: 2 listas de 5 itens ou 5 listas de 2 itens. No exemplo, alterar a ordem dos guias de replicação resulta em uma lista de linhas de pontos ou em uma lista de colunas de pontos em um eixo.
Embora os métodos de bloco de código acima possam ter algumas informações úteis, há um recurso no Dynamo chamado “Nó para código” que tornará o processo mais fácil. Para usar esse recurso, selecione uma matriz de nós no gráfico do Dynamo, clique com o botão direito do mouse na tela e selecione “Nó para código”. O Dynamo condensa esses nós em um bloco de código, com todas as entradas e saídas. Não só essa é uma ótima ferramenta para a aprendizagem do bloco de código, como também permite que você trabalhe com um gráfico do Dynamo mais eficiente e paramétrico. Concluiremos o exercício abaixo usando “Nó para código”, por isso, continue acompanhando.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Para mostrar as capacidades do bloco de código, vamos converter uma definição de campo atrativo existente em formato de bloco de código. O trabalho com uma definição existente demonstra como o bloco de código se relaciona com os scripts visuais e é útil para aprender a sintaxe do DesignScript.
Comece recriando a definição na imagem acima (ou abrindo o arquivo de amostra).
Observe que a amarra em Point.ByCoordinates foi definida como Produto transversal.
Cada ponto em um eixo é movido para cima na direção Z com base em sua distância até o ponto de referência.
Uma superfície é recriada e espessada, criando uma convexidade na geometria relacionada à distância até o ponto de referência.
Começando do início, vamos definir primeiro o ponto de referência: Point.ByCoordinates
(x,y,0);
Usamos a mesma sintaxe Point.ByCoordinates como especificado na parte superior do nó do ponto de referência.As variáveis x e y são inseridas no Bloco de código de forma que possamos atualizá-las dinamicamente com controles deslizantes.
Adicione alguns controles deslizantes às entradas de Bloco de código que variam de -50 a 50. Dessa forma, podemos expandir através do eixo padrão do Dynamo.
Na segunda linha do Bloco de código, definimos uma abreviação para substituir o nó de sequência numérica:
coordsXY = (-50..50..#11);
Discutiremos mais sobre isso na próxima seção. Por enquanto, observe que essa abreviação é equivalente ao nó Sequência numérica no script visual.
Agora, queremos criar um eixo de pontos com base na sequência coordsXY. Para fazer isso, queremos usar a sintaxe Point.ByCoordinates, mas também precisamos iniciar um Produto transversal da lista da mesma maneira que fizemos no script visual. Para fazer isso, digitamos a linha:
gridPts = Point.ByCoordinates(coordsXY<1>,coordsXY<2>,0);
Os colchetes angulares indicam a referência do produto transversal.Observe no nó Watch3D que temos um eixo de pontos no eixo do Dynamo.
Agora, a parte difícil: queremos mover o eixo de pontos para cima com base na distância deles até o ponto de referência. Primeiro, vamos chamar esse novo conjunto de pontos transPts. E, como uma conversão é uma ação em um elemento existente, em vez de usar
Geometry.Translate...
, vamos usargridPts.Translate
Lendo o nó real na tela, vemos que há três entradas. A geometria para converter já está declarada porque estamos executando a ação naquele elemento (com gridPts.Translate). As duas entradas restantes serão inseridas entre os parênteses da função: direção e distância.
A direção é muito simples, usamos um
Vector.ZAxis()
para mover verticalmente.A distância entre o ponto de referência e cada ponto do eixo ainda precisa ser calculada; portanto, fazemos isso como uma ação para o ponto de referência da mesma maneira:
refPt.DistanceTo(gridPts)
A linha final do código fornece os pontos convertidos:
transPts=gridPts.Translate(Vector.ZAxis(),refPt.DistanceTo(gridPts));
Agora, temos um eixo de pontos com a estrutura de dados apropriada para criar uma superfície Nurbs. Construímos a superfície usando
srf = NurbsSurface.ByControlPoints(transPts);
E, finalmente, para adicionar alguma profundidade à superfície, construímos um sólido usando
solid = srf.Thicken(5);
Neste caso, aumentamos a espessura da superfície 5 unidades no código, mas sempre podemos declará-la como uma variável (chamando-a de espessura, por exemplo) e, em seguida, controlamos esse valor com um controle deslizante.
O recurso “Nó para código” automatiza todo o exercício que acabamos de concluir com o clique de um botão. Isso não só é eficaz para criar definições personalizadas e blocos de código reutilizáveis, também é uma ferramenta realmente útil para saber como criar um script no Dynamo:
Inicie com o script visual existente na etapa 1 do exercício. Selecione todos os nós, clique com o botão direito do mouse na tela e selecione “Nó para código”. É tão simples quanto isso.
O Dynamo automatizou uma versão com base em texto do gráfico visual, incluindo a amarra e outros itens. Teste isso em seus scripts visuais e aproveite ao máximo o recurso de bloco de código.
Os blocos de código são uma janela localizada no DesignScript, a linguagem de programação principal do Dynamo. Desenvolvido do zero para suportar fluxos de trabalho de projeto exploratório, o DesignScript é uma linguagem legível e concisa que oferece comentários imediatos a pequenos bits de código e também é dimensionado para interações grandes e complexas. O DesignScript também forma a espinha dorsal do mecanismo que motiva a maioria dos aspectos do Dynamo “essenciais”. Como quase todas as funções encontradas nos nós e nas interações do Dynamo têm uma relação estreita com a linguagem de scripts, há oportunidades únicas para alternar o uso entre as interações baseadas em nós e os scripts de uma forma fluida.
Para iniciantes, os nós podem ser convertidos automaticamente em sintaxe de texto para ajudar a aprender o DesignScript ou simplesmente para reduzir o tamanho de seções maiores de gráficos. Isso é feito usando um processo denominado “Nó para código”, que é descrito com mais detalhes na seção . Os usuários mais experientes podem usar os blocos de código para criar mashups personalizados de relacionamentos existentes de usuários e funcionalidades, usando muitos paradigmas de codificação padrão. Entre o usuário iniciante e o avançado, há um grande número de atalhos e fragmentos de código que aceleram seus projetos. Embora o termo “bloco de código” possa ser um pouco intimidador para não programadores, é fácil de usar e robusto. Um iniciante pode usar o bloco de código de forma eficiente com codificação mínima, e um usuário avançado pode definir definições de script para serem chamadas em outro lugar em uma definição do Dynamo.
Em resumo, os blocos de código são uma interface de scripts de texto em um ambiente de scripts visuais. Eles podem ser usados como números, sequências de caracteres, fórmulas e outros tipos de dados. O bloco de código é projetado para o Dynamo, portanto, é possível definir variáveis arbitrárias no bloco de código, e essas variáveis são automaticamente adicionadas às entradas do nó:
Com os blocos de código, um usuário tem a flexibilidade de decidir como especificar as entradas. Confira a seguir várias maneiras de criar um ponto básico com coordenadas (10, 5, 0):
À medida que você aprende mais sobre as funções disponíveis na biblioteca, lembre-se de que digitar “Point.ByCoordinates” é mais rápido do que pesquisar na biblioteca e localizar o nó apropriado. Quando você digita “Point.”, por exemplo, o Dynamo exibirá uma lista de possíveis funções para aplicar a um ponto. Isso torna o script mais intuitivo e ajudará no processo de aprendizagem de como aplicar funções no Dynamo.
O bloco de código pode ser encontrado em Core>Input>Actions>Code Block. Mas existe um modo mais rápido: basta clicar duas vezes na tela e o bloco de código aparece. Esse nó é usado com tanta frequência que recebeu o privilégio de ser acionado com duplo clique.
Os blocos de código também são flexíveis em relação aos tipos de dados. O usuário pode definir rapidamente os números, as sequências e as fórmulas, e o bloco de código fornecerá o resultado desejado.
Na imagem abaixo, é possível ver que a forma de fazer as coisas “à moda antiga” é um pouco demorada: o usuário procura o nó desejado na interface, adiciona o nó à tela e insere os dados. Com o bloco de código, o usuário pode clicar duas vezes na tela para abrir o nó e digitar o tipo de dados correto com sintaxe básica.
Os nós número, sequência de caracteres e fórmula são três exemplos de nós do Dynamo que são provavelmente obsoletos em comparação ao bloco de código.
“Tradicional”
Blocos de código
Ao adicionar tubulações e estruturas a uma rede de tubulação, o Civil 3D usa um modelo para atribuir nomes automaticamente. Normalmente, isso é suficiente durante o posicionamento inicial, mas inevitavelmente os nomes terão que mudar no futuro à medida que o projeto evoluir. Além disso, há muitos padrões de nomenclatura diferentes que podem ser necessários, por exemplo, nomear estruturas sequencialmente em um trecho de tubulação com base na estrutura a jusante mais distante ou seguir um padrão de nomenclatura alinhado com o esquema de dados de um órgão local. Este exemplo demonstrará como o Dynamo pode ser usado para definir qualquer tipo de estratégia de nomeação e aplicá-lo de forma consistente.
Trabalhar com caixas delimitadoras
Filtrar dados usando o nó List.FilterByBoolMask
Classificar os dados usando o nó List.SortByKey
Gerar e modificar sequências de texto
Este gráfico será executado no Civil 3D 2020 e versões superiores.
Comece fazendo o download dos arquivos de amostra abaixo e, em seguida, abrindo o arquivo DWG e o gráfico do Dynamo.
Apresentamos a seguir uma visão geral da lógica no gráfico.
Selecionar as estruturas por camada
Obter as localizações da estrutura
Filtrar as estruturas por deslocamento e, em seguida, classificá-las por estaca
Gerar os novos nomes
Renomear as estruturas
Vamos começar
A primeira coisa que precisamos fazer é selecionar todas as estruturas com as quais planejamos trabalhar. Para fazer isso, basta selecionar todos os objetos em uma determinada camada, o que significa que podemos selecionar estruturas de diferentes redes de tubulação (presumindo que compartilhem a mesma camada).
Esse nó assegura que não recuperemos acidentalmente quaisquer tipos de objetos indesejados que possam compartilhar a mesma camada que as estruturas.
Agora que temos as estruturas, precisamos descobrir sua posição no espaço para que possamos classificá-las de acordo com sua localização. Para fazer isso, aproveitaremos a caixa delimitadora de cada objeto. A Caixa delimitadora de um objeto é a caixa de tamanho mínimo que contém completamente as extensões geométricas do objeto. Ao calcular o centro da caixa delimitadora, obtemos uma boa aproximação do ponto de inserção da estrutura.
Usaremos estes pontos para obter a estaca e o deslocamento das estruturas em relação a um alinhamento selecionado.
Neste ponto é que as coisas começam a ficar um pouco complicadas. Nesta fase, temos uma lista grande de todas as estruturas na camada que especificamos e escolhemos um alinhamento que desejamos classificar. O problema é que pode haver estruturas na lista que não queremos renomear. Por exemplo, elas podem não fazer parte do trecho específico em que estamos interessados.
O alinhamento selecionado
As estruturas que queremos renomear
As estruturas que devem ser ignoradas
Portanto, precisamos filtrar a lista de estruturas para que não consideremos as que são maiores do que um determinado deslocamento do alinhamento. Isso é melhor realizado usando o nó List.FilterByBoolMask. Após filtrar a lista de estruturas, usamos o nó List.SortByKey para classificá-las por seus valores de estaca.
Verificar se o deslocamento da estrutura é menor que o valor de limite
Substituir os valores nulos por false
Filtrar a lista de estruturas e estacas
Classificar as estruturas pelas estacas
O último trabalho que precisamos fazer é criar os novos nomes para as estruturas. O formato que usaremos é <alignment name>-STRC-<number>
. Há alguns nós extras aqui para preencher os números com zeros extras, se desejado (por exemplo, “01”em vez de “1”).
E, por último, mas não menos importante, renomeamos as estruturas.
Veja um exemplo de como executar o gráfico usando o Reprodutor do Dynamo.
Pode ser útil aproveitar a visualização do plano de fundo 3D do Dynamo para visualizar as saídas intermediárias do gráfico em vez de apenas o resultado final. Uma coisa fácil que podemos fazer é mostrar as caixas delimitadoras das estruturas. Além disso, este conjunto de dados específico tem um corredor no documento; portanto, podemos trazer a geometria da linha de recurso do corredor para o Dynamo para fornecer algum contexto para onde as estruturas estão localizadas no espaço. Se o gráfico for usado em um conjunto de dados que não tem corredores, estes nós simplesmente não farão nada.
Agora podemos entender melhor como funciona o processo de filtragem das estruturas por deslocamento.
Veja a seguir algumas ideias sobre como você pode expandir os recursos desse gráfico.
Renomeie as estruturas com base em seu Alinhamento mais próximo em vez de selecionar um alinhamento específico.
Renomeie as tubulações além das estruturas.
Defina as camadas das estruturas com base em seu trecho.
Nesta seção, você encontrará uma série de aulas sobre a criação de geometria com o DesignScript. Acompanhe copiando o DesignScript de exemplo para os blocos de código do Dynamo.
Os objetos em projetos de cálculo raramente são criados explicitamente em sua posição e forma finais e são, na maioria das vezes, convertidos, rotacionados e posicionados de outra forma, com base na geometria existente. A matemática de vetores serve como um tipo de andaime geométrico para dar direção e orientação à geometria, bem como para conceituar movimentos através do espaço 3D sem representação visual.
Em seu nível mais básico, um vetor representa uma posição no espaço 3D e, muitas vezes, é considerado como o ponto final de uma seta da posição (0, 0, 0) para essa posição. É possível criar vetores com o construtor ByCoordinates, usando as posições x, y e z do objeto Vector recém-criado. Observe que os objetos Vector não são objetos geométricos e não aparecem na janela do Dynamo. No entanto, as informações sobre um vetor recém-criado ou modificado podem ser impressas na janela do console:
Um conjunto de operações matemáticas é definido em objetos Vector, permitindo adicionar, subtrair, multiplicar e mover objetos no espaço 3D, como você moveria os números reais no espaço 1D em uma linha de números.
A adição de vetores é definida como a soma dos componentes de dois vetores e poderá ser considerada como o vetor resultante se as duas setas de vetor dos componentes forem inseridas “ponta a ponta”. A adição de vetores é realizada com o método Add e é representada pelo diagrama à esquerda.
De forma similar, dois objetos Vector podem ser subtraídos um do outro com o método Subtract. A subtração de vetores pode ser considerada como a direção do primeiro vetor para o segundo vetor.
A multiplicação de vetores pode ser considerada como o ato de mover a extremidade de um vetor em sua própria direção com base em um determinado fator de escala.
Muitas vezes, ao dimensionar um vetor, é desejável que o comprimento resultante seja exatamente igual à quantidade dimensionada. Isso é facilmente conseguido pela normalização de um vetor, ou seja, definindo o comprimento do vetor como exatamente igual a um.
c ainda aponta na mesma direção que a (1, 2, 3), embora agora apresente comprimento exatamente igual a 5.
Existem dois métodos adicionais na matemática de vetores que não têm paralelos claros com a matemática 1D, o produto vetorial e o produto escalar. O produto vetorial é um meio de gerar um vetor ortogonal (a 90 graus) a dois vetores existentes. Por exemplo, o produto vetorial dos eixos x e y é o eixo z, embora os dois vetores de entrada não precisem ser ortogonais entre si. Um vetor de produto vetorial é calculado com o método Cross.
Uma função adicional, embora um pouco mais avançada da matemática vetorial, é o produto escalar. O produto escalar entre dois vetores é um número real (não um objeto Vector) que se relaciona, mas não é exatamente, o ângulo entre dois vetores. Uma propriedade útil do produto escalar é que o produto escalar entre dois vetores será 0 somente se eles forem perpendiculares. O produto escalar é calculado com o método Dot.
O objeto geométrico mais simples da biblioteca de geometria padrão do Dynamo é um ponto. Toda a geometria é criada usando funções especiais chamadas construtores, cada uma delas retorna uma nova instância desse tipo de geometria específico. No Dynamo, os construtores começam com o nome do tipo do objeto, neste caso, Ponto, seguido pelo método de construção. Para criar um ponto tridimensional especificado pelas coordenadas cartesianas x, y e z, use o construtor ByCoordinates:
Os construtores no Dynamo normalmente são designados com o prefixo “By” e a chamada dessas funções retorna um objeto recém-criado desse tipo. Esse objeto recém-criado é armazenado na variável nomeada no lado esquerdo do sinal de igual.
A maioria dos objetos tem muitos construtores diferentes, e podemos usar o construtor BySphericalCoordinates para criar um ponto sobre uma esfera, especificado pelo raio da esfera, um primeiro ângulo de rotação e um segundo ângulo de rotação (especificado em graus):
É possível usar os pontos para construir uma geometria dimensional maior, como linhas. Podemos usar o construtor ByStartPointEndPoint para criar um objeto de linha entre dois pontos:
De forma semelhante, é possível usar as linhas para criar uma geometria de superfície dimensional maior; por exemplo, usando o construtor Loft, que assume uma série de linhas ou curvas e interpola uma superfície entre elas.
Também é possível usar as superfícies para criar uma geometria sólida dimensional maior, por exemplo, espessando a superfície por uma distância especificada. Muitos objetos possuem funções associadas a eles, chamados métodos, permitindo que o programador execute comandos nesse objeto em particular. Os métodos comuns a todas as porções de geometria incluem Translate e Rotate, que, respectivamente, convertem (movem) e rotacionam a geometria por um valor especificado. As superfícies apresentam um método Thicken, que recebe uma única entrada, um número que especifica a nova espessura da superfície.
Os comandos Intersection podem extrair geometria dimensional menor de objetos dimensionais maiores. Essa geometria dimensional menor extraída pode formar a base para uma geometria dimensional maior, em um processo cíclico de criação, extração e recriação geométrica. Neste exemplo, usamos o sólido gerado para criar uma superfície e usamos a superfície para criar uma curva.
Embora o Dynamo seja capaz de criar uma variedade de formas geométricas complexas, as primitivas geométricas simples formam a espinha dorsal de qualquer projeto de cálculo: expressas diretamente na forma final projetada ou usadas como pontos de partida dos quais é gerada uma geometria mais complexa.
Embora não seja estritamente uma geometria, o CoordinateSystem é uma ferramenta importante para construir a geometria. Um objeto CoordinateSystem mantém o controlo das transformações de posição e geométricas, como rotação, cisalhamento e escala.
Criar um CoordinateSystem centralizado em um ponto com x = 0, y = 0, z = 0, sem rotações, escala ou transformações de cisalhamento, requer simplesmente a chamada do construtor Identity:
Os CoordinateSystems com transformações geométricas estão fora do escopo deste capítulo, embora outro construtor permita criar um sistema de coordenadas em um ponto específico, CoordinateSystem.ByOriginVectors:
A primitiva geométrica mais simples é um Ponto, representando uma localização de dimensão zero no espaço tridimensional. Como mencionado anteriormente, há diversas formas de criar um ponto em um determinado sistema de coordenadas: Point.ByCoordinates cria um ponto com as coordenadas x, y e x especificadas; Point.ByCartesianCoordinates cria um ponto com as coordenadas x, y e x especificadas em um sistema de coordenadas específico; Point.ByCylindricalCoordinates cria um ponto sobre um cilindro com o raio, o ângulo de rotação e a altura; e Point.BySphericalCoordinates cria um ponto sobre uma esfera com o raio e dois ângulos de rotação.
Este exemplo mostra pontos criados em vários sistemas de coordenadas:
A próxima primitiva dimensional superior do Dynamo é um segmento de linha, representando um número infinito de pontos entre dois pontos finais. É possível criar as linhas explicitamente especificando os dois pontos de limite com o construtor Line.ByStartPointEndPoint ou especificando um ponto inicial, uma direção e um comprimento nessa direção, Line.ByStartPointDirectionLength.
O Dynamo tem objetos que representam os tipos mais básicos de primitivas geométricas em três dimensões: cuboides, criados com Cuboid.ByLengths; cones, criados com Cone.ByPointsRadius e Cone.ByPointsRadii; cilindros, criados com Cylinder.ByRadiusHeight; e esferas, criadas com Sphere.ByCenterPointRadius.
Criar um grupo de pontos para cada descrição de ponto COGO exclusiva.
Missão cumprida.
Posicionar referências de bloco de postes de luz ao longo de um corredor em valores de estaca especificados em um arquivo do Excel.
Missão cumprida.
Colocar referências de bloco do medidor de serviço de água em deslocamentos especificados de uma linha do lote e desenhar uma linha para cada conexão de serviço perpendicular à linha principal de distribuição.
Missão cumprida.
Usar um bloco de perfil de veículo para gerar sólidos 3D de estrutura de altura livre ao longo de um corredor.
Missão cumprida.
Obter a geometria de limite de todas as áreas de contribuição em um desenho.
Missão cumprida.
Renomear as estruturas de rede de tubulação na ordem com base no estaqueamento de um alinhamento.
Se você não estiver familiarizado com o trabalho com listas, veja a seção .
Se o Reprodutor do Dynamo for algo novo para você, veja a seção .
Missão cumprida.
Agora que demonstramos como usar scripts Python no Dynamo, vamos analisar como conectar as bibliotecas do Revit ao ambiente de scripts. Lembre-se, importamos os nós do núcleo padrão do Python e os nossos do Dynamo com as quatro primeiras linhas do bloco de código abaixo. Para importar os nós, os elementos e o gerenciador de documentos do Revit, só precisamos adicionar mais algumas linhas:
Isso nos fornece acesso à API do Revit e oferece scripts personalizados para qualquer tarefa do Revit. Ao combinar o processo de programação visual com scripts da API do Revit, a colaboração e o desenvolvimento de ferramentas melhoram significativamente. Por exemplo, um gerente do BIM e um projetista esquemático podem trabalhar juntos no mesmo gráfico. Nessa colaboração, eles podem aprimorar o projeto e a execução do modelo.
O plano por trás do projeto do Dynamo é ampliar o escopo da implementação da plataforma. À medida que o Dynamo adiciona mais programas ao registro, os usuários obterão acesso a APIs específicas de plataforma do ambiente de scripts Python. Embora o Revit seja o estudo de caso desta seção, podemos prever mais capítulos que oferecem tutoriais abrangentes sobre scripts em outras plataformas. Além disso, agora há muitas bibliotecas IronPython acessíveis que podem ser importadas para o Dynamo.
Os exemplos abaixo demonstram as maneiras de implementar operações específicas do Revit no Dynamo usando o Python. Para obter uma análise mais detalhada sobre a relação do Python com o Dynamo e o Revit, consulte a página Wiki do Dynamo. Outro recurso útil para o Python e o Revit é o projeto Revit Python Shell.
Crie um novo projeto do Revit.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Nestes exercícios, vamos explorar os scripts Python elementares no Dynamo for Revit. O exercício se concentrará em lidar com os arquivos e elementos do Revit, bem como na comunicação entre o Revit e o Dynamo.
Esse é um método preparado previamente para recuperar o doc, uiapp e app do arquivo do Revit vinculado à sessão do Dynamo. Os programadores que já trabalharam na API do Revit podem observar os itens na lista de inspeção. Se esses itens não parecerem familiares, não há problema, usaremos outros exemplos nos exercícios abaixo.
Confira a seguir como importamos serviços do Revit e recuperamos os dados do documento no Dynamo.
Veja o nó do Python no Dynamo. Você também pode encontrar o código abaixo:
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Neste exercício, vamos criar uma curva de modelo simples no Revit usando o nó do Python do Dynamo.
Comece criando uma nova família de massa conceitual no Revit.
Abra a Pasta de massa conceitual e use o arquivo de modelo Metric Mass.rft.
No Revit, use o atalho de teclado un
para abrir as configurações da unidade do projeto e altere a unidade de comprimento para metros.
Inicie o Dynamo e crie o conjunto de nós na imagem abaixo. Primeiro, criaremos dois pontos de referência no Revit com base nos nós do Dynamo.
Crie um bloco de código e atribua o valor
"0;"
Conecte esse valor a um nó ReferencePoint.ByCoordinates para as entradas X, Y e Z.
Crie três controles deslizantes, variando de -100 a 100 com um tamanho de etapa de 1.
Conecte cada controle deslizante a um nó ReferencePoint.ByCoordinates.
Adicione um nó do Python ao espaço de trabalho, clique no botão “+” no nó para adicionar outra entrada e conecte os dois pontos de referência em cada entrada. Abra o nó do Python.
Veja o nó do Python no Dynamo. Encontre o código completo abaixo.
System.Array: o Revit precisa de uma matriz do sistema como uma entrada (em vez de uma lista do Python). Isso é apenas mais uma linha de código, mas prestar atenção aos tipos de argumentos facilitará a programação em Python no Revit.
No Dynamo, criamos dois pontos de referência com uma linha que os conecta usando o Python. Vamos aprofundar isso um pouco no próximo exercício.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Este exercício mantém a simplicidade, mas esclarece os tópicos de conexão de dados e a geometria do Revit para o Dynamo e vice-versa. Começaremos abrindo o Revit-StructuralFraming.rvt. Depois de aberto, inicie o Dynamo e abra o arquivo Revit-StructuralFraming.dyn.
Esse arquivo do Revit é o mais básico possível. Duas curvas de referência: uma desenhada no Nível 1 e outra desenhada no Nível 2. Queremos inserir essas curvas no Dynamo e manter um vínculo dinâmico.
Nesse arquivo, temos um conjunto de nós que se conectam a cinco entradas de um nó do Python.
Nós Selecionar elemento do modelo: clique no botão de seleção para cada um e selecione uma curva correspondente no Revit.
Bloco de código:: usando a sintaxe
0..1..#x;
, conecte um controle deslizante de número inteiro que varia entre 0 e 20 à entrada x. Isso especifica o número de vigas a serem desenhadas entre as duas curvas.Tipos de framing estrutural: escolheremos a viga padrão W12x26 na opção do menu suspenso.
Níveis: selecione “Nível 1”.
Esse código no Python é um pouco mais denso, mas os comentários no código descrevem o que está acontecendo no processo
No Revit, temos uma matriz de vigas que se estendem pelas duas curvas como elementos estruturais. Observação: Este exemplo não é realista... os elementos estruturais são usados como um exemplo para instâncias nativas do Revit criadas no Dynamo.
No Dynamo, também podemos ver os resultados. As vigas no nó Watch3D se referem à geometria consultada dos elementos do Revit.
Observe que temos um processo contínuo de conversão de dados do ambiente do Revit para o ambiente do Dynamo. Em resumo, veja como o processo é realizado:
Selecionar o elemento do Revit
Converter o elemento do Revit em curva do Dynamo
Dividir a curva do Dynamo em uma série de pontos do Dynamo
Usar os pontos do Dynamo entre duas curvas para criar linhas do Dynamo
Criar vigas do Revit referenciando linhas do Dynamo
Gerar saída de superfícies do Dynamo ao consultar a geometria de vigas do Revit
Isso pode parecer um pouco severo, mas o script torna isso tão simples quando editar a curva no Revit e executar novamente o solucionador (embora você possa precisar excluir as vigas anteriores ao fazer isso). Isso se deve ao fato de que estamos colocando vigas no Python e, portanto, quebrando a associação que os nós prontos para uso têm.
Com uma atualização das curvas de referência no Revit, obtemos uma nova matriz de vigas.
Há duas maneiras fundamentais para criar curvas de forma livre no Dynamo: especificar uma coleção de pontos e fazer com que o Dynamo interpole uma curva suave entre eles ou um método de menor nível ao especificar os pontos de controle subjacentes de uma curva de determinado grau. As curvas interpoladas serão úteis quando um designer sabe exatamente a forma que uma linha deve ter ou se o projeto tiver restrições específicas por onde a curva pode e não pode passar. As curvas especificadas por meio de pontos de controle são, em essência, uma série de segmentos de linha reta que um algoritmo suaviza em uma forma de curva final. A especificação de uma curva por meio de pontos de controle pode ser útil para navegações de formas de curva com graus variados de suavização ou quando uma continuidade suave entre segmentos de curva é necessária.
Para criar uma curva interpolada, basta passar um conjunto de pontos para o método NurbsCurve.ByPoints.
A curva gerada faz interseção com cada um dos pontos de entrada, começando e terminando no primeiro e último ponto da coleção, respectivamente. É possível usar um parâmetro periódico opcional para criar uma curva periódica que está fechada. O Dynamo automaticamente preencherá o segmento ausente, portanto, um ponto final duplicado (idêntico ao ponto inicial) não é necessário.
As NurbsCurves são geradas da mesma forma, com os pontos de entrada que representam os pontos finais de um segmento de linha reta e um segundo parâmetro que especifica a quantidade e o tipo de suavização que a curva sofre, denominado grau.* Uma curva com grau 1 não tem suavização; é uma polilinha.
Uma curva com grau 2 é suavizada de forma que a curva faça interseção e seja tangente ao ponto central dos segmentos de polilinha:
O Dynamo suporta curvas NURBS (B-spline racional não uniforme) até o grau 20, e o seguinte script ilustra o efeito que o aumento dos níveis de suavização tem na forma de uma curva:
Observe que você deve ter pelo menos mais um ponto de controle que o grau da curva.
Outro benefício de construir curvas por vértices de controle é a capacidade de manter a tangência entre segmentos de curva individuais. Isso é feito extraindo a direção entre os últimos dois pontos de controle e continuando esta direção com os dois primeiros pontos de controle da curva a seguir. O exemplo a seguir cria duas curvas NURBS separadas que, mesmo assim, são tão suaves como uma curva:
*Essa é uma descrição muito simplificada da geometria da curva NURBS; para uma discussão mais precisa e detalhada, consulte Pottmann, et al, 2007, nas referências.
Em projetos de cálculo, as curvas e as superfícies são usadas com frequência como o esboço subjacente para construir a geometria subsequente. Para que esta geometria inicial seja usada como uma fundação para a geometria posterior, o script deve ser capaz de extrair qualidades como a posição e a orientação através de toda a área do objeto. As curvas e as superfícies suportam essa extração, que é chamada de parametrização.
Todos os pontos em uma curva podem ser considerados como tendo um parâmetro único variando de 0 a 1. Se fôssemos criar uma NurbsCurve com base em diversos pontos de controle ou interpolados, o primeiro ponto teria o parâmetro 0 e o último ponto teria o parâmetro 1. É impossível saber antecipadamente qual é o parâmetro exato que qualquer ponto intermediário representa, o que pode parecer uma limitação severa, embora seja atenuada por uma série de funções de utilitários. As superfícies têm uma parametrização semelhante às curvas, mas com dois parâmetros em vez de um, chamados u e v. Se criássemos uma superfície com os seguintes pontos:
p1 teria o parâmetro u = 0 v = 0, enquanto p9 teria os parâmetros u = 1 v = 1.
A parametrização não é particularmente útil ao determinar os pontos usados para gerar curvas, seu principal uso será determinar as localizações se os pontos intermediários forem gerados pelos construtores NurbsCurve e NurbsSurface.
As curvas têm um método PointAtParameter, que assume um único argumento duplo entre 0 e 1, e retorna o objeto de ponto naquele parâmetro. Por exemplo, esse script localiza os pontos nos parâmetros 0, .1, .2, .3, .4, .5, .6, .7, .8, .9 e 1:
De forma similar, as superfícies têm um método PointAtParameter que assume dois argumentos, os parâmetros u e v do ponto gerado.
Embora a extração de pontos individuais em uma curva e superfície possa ser útil, os scripts geralmente exigem o conhecimento das características geométricas específicas de um parâmetro, como a direção da curva ou da superfície. O método CoordinateSystemAtParameter localiza não somente a posição como também um CoordinateSystem orientado no parâmetro de uma curva ou superfície. Por exemplo, o script a seguir extrai o CoordinateSystems orientado ao longo de uma superfície de revolução e usa a orientação do CoordinateSystems para gerar linhas que se destacam normalmente na superfície:
Como mencionado anteriormente, a parametrização nem sempre é uniforme ao longo do comprimento de uma curva ou superfície, o que significa que o parâmetro 0,5 nem sempre corresponde ao ponto central, e 0,25 nem sempre corresponde ao ponto um quarto ao longo de uma curva ou superfície. Para contornar essa limitação, as curvas têm um conjunto adicional de comandos de parametrização que permite encontrar um ponto em comprimentos específicos ao longo de uma curva.
O Python é uma linguagem de programação amplamente usada, cuja popularidade tem muito a ver com seu estilo de sintaxe. É altamente legível, o que a torna mais fácil de aprender do que muitas outras linguagens. O Python oferece suporte a módulos e pacotes e pode ser incorporado em aplicativos existentes. Para obter informações sobre como começar a usar o Python, um bom recurso é a página “Getting Started” (Introdução) em Python.org.
O análogo bidimensional de uma NurbsCurve é a NurbsSurface e, tal como a NurbsCurve de forma livre, as NurbsSurfaces podem ser construídas com dois métodos básicos: inserir um conjunto de pontos base e fazer interpolar o Dynamo entre eles e especificar explicitamente os pontos de controle da superfície. Também como as curvas de forma livre, as superfícies interpoladas são úteis quando um designer sabe com precisão a forma que uma superfície precisa ter ou se um projeto requer que a superfície passe pelos pontos de restrição. Por outro lado, as superfícies criadas por pontos de controle podem ser mais úteis para projetos exploratórios em vários níveis de suavização.
Para criar uma superfície interpolada, basta gerar uma coleção bidimensional de pontos aproximando a forma de uma superfície. A coleção deve ser retangular, isto é, não irregular. O método NurbsSurface.ByPoints constrói uma superfície com base nesses pontos.
Também é possível criar as NurbsSurfaces de forma livre ao especificar os pontos de controle subjacentes de uma superfície. Tal como as NurbsCurves, os pontos de controle podem ser considerados como representando uma malha quadrilateral com segmentos retos que, dependendo do grau da superfície, é suavizada na forma da superfície final. Para criar uma NurbsSurface por pontos de controle, inclua dois parâmetros adicionais para NurbsSurface.ByPoints, indicando os graus das curvas subjacentes em ambas as direções da superfície.
É possível aumentar o grau da NurbsSurface para alterar a geometria da superfície resultante:
Assim como as superfícies podem ser criadas por interpolação entre um conjunto de pontos de entrada, elas também podem ser criadas por interpolação entre um conjunto de curvas base. Isso é conhecido como elevação. Uma curva elevada é criada usando o construtor Surface.ByLoft, com um conjunto de curvas de entrada como o único parâmetro.
As superfícies de revolução são um tipo adicional de superfície criada arrastando uma curva base em torno de um eixo central. Se as superfícies interpoladas são o análogo bidimensional das curvas interpoladas, as superfícies de revolução são o análogo bidimensional dos círculos e arcos.
As superfícies de revolução são especificadas por uma curva base, representando a “aresta” da superfície; uma origem de eixo, o ponto base da superfície; uma direção de eixo, a direção “principal” central; um ângulo inicial de varredura; e um ângulo final de varredura. Elas são usadas como a entrada para o construtor Surface.Revolve.
Intersect, Trim e SelectTrim são principalmente usados na geometria bidimensional menor como Pontos, Curvas e Superfícies. A geometria sólida, por outro lado, tem um conjunto adicional de métodos para modificar a forma após sua construção, subtraindo o material de uma forma similar a Trim e combinando elementos para formar um todo maior.
O método Union usa dois objetos sólidos e cria um único objeto sólido fora do espaço coberto por ambos os objetos. O espaço sobreposto entre os objetos é combinado na forma final. Este exemplo combina uma esfera e um cuboide em uma única forma sólida de cubo de esfera:
O método Difference, como Trim, subtrai o conteúdo do sólido da ferramenta de entrada do sólido base. Neste exemplo, nós colocamos um pequeno recuo fora de uma esfera:
O método Intersect retorna o sólido sobreposto entre duas entradas de sólidos. No exemplo a seguir, o método Difference foi alterado para Intersect, e o sólido resultante é o vazio ausente inicialmente entalhado:
Os seguintes scripts Python geram matrizes de pontos para diversos exemplos. Elas devem ser coladas em um nó de script do Python da seguinte forma:
python_points_1
python_points_2
python_points_3
python_points_4
python_points_5
Determinados objetos de geometria podem ser criados explicitamente especificando as coordenadas x, y e z no espaço tridimensional. Mais frequentemente, no entanto, a geometria é movida para sua posição final usando transformações geométricas no próprio objeto ou em seu CoordinateSystem subjacente.
A transformação geométrica mais simples é uma conversão, que move um objeto um número especificado de unidades nas direções x, y e z.
Embora todos os objetos no Dynamo possam ser convertidos anexando o método .Translate ao final do nome do objeto, as transformações mais complexas exigem a transformação do objeto de um CoordinateSystem subjacente em um novo CoordinateSystem. Por exemplo, para rotacionar um objeto 45° em torno do eixo x, vamos transformar o objeto de seu CoordinateSystem existente sem rotação em um CoordinateSystem que foi rotacionado 45° em torno do eixo x com o método .Transform:
Além de serem convertidos e rotacionados, também é possível criar os CoordinateSystems com escala ou cisalhamento. Um CoordinateSystem pode ser dimensionado com o método .Scale:
Os CoordinateSystems de cisalhamento são criados inserindo vetores não ortogonais no construtor CoordinateSystem.
A escala e o cisalhamento são, comparativamente, transformações geométricas mais complexas do que a rotação e a conversão, de modo que nem todos os objetos do Dynamo podem sofrer essas transformações. A tabela a seguir descreve quais objetos do Dynamo podem ter CoordinateSystems com escala não uniforme e CoordinateSystems com cisalhamento.
Arco
Não
Não
NurbsCurve
Sim
Sim
NurbsSurface
Não
Não
Círculo
Não
Não
Linha
Sim
Sim
Plano
Não
Não
Ponto
Sim
Sim
Polígono
Não
Não
Sólido
Não
Não
Superfície
Não
Não
Texto
Não
Não
Muitos dos exemplos até agora têm se concentrado na construção de geometria dimensional maior com base em objetos dimensionais menores. Os métodos de interseção permitem que essa geometria dimensional maior gere objetos dimensionais menores, enquanto os comandos Trim e Select Trim permitem que o script modifique fortemente as formas geométricas após a criação.
O método Intersect é definido em todas as partes da geometria no Dynamo, o que significa que, em teoria, qualquer parte da geometria pode fazer interseção com qualquer outra parte da geometria. Naturalmente, algumas interseções são sem sentido, como interseções envolvendo pontos, já que o objeto resultante será sempre o próprio ponto de entrada. As outras combinações possíveis de interseções entre objetos são descritas no gráfico a seguir. A tabela a seguir descreve o resultado de diversas operações de interseção:
Com:
Superfície
Curva
Plano
Sólido
Superfície
Curva
Ponto
Ponto, Curva
Superfície
Curva
Ponto
Ponto
Ponto
Curva
Plano
Curva
Ponto
Curva
Curva
Sólido
Superfície
Curva
Curva
Sólido
O exemplo a seguir demonstra a interseção de um plano com uma NurbsSurface. A intersecção gera uma matriz NurbsCurve, que pode ser usada como qualquer outra NurbsCurve.
O método Trim é muito similar ao método Intersect, pois é definido para quase todas as partes da geometria. No entanto, há muito mais limitações em Trim do que em Intersect.
Usando: Ponto
Curva
Plano
Superfície
Sólido
Em: curva
Sim
Não
Não
Não
Não
Polígono
-
Não
Sim
Não
Não
Superfície
-
Sim
Sim
Sim
Sim
Sólido
-
-
Sim
Sim
Sim
Algo a ser observado sobre os métodos Trim é o requisito de um ponto de “seleção”, um ponto que determina qual geometria será descartada e quais elementos devem ser mantidos. O Dynamo localiza e descarta a geometria recortada mais próxima do ponto selecionado.
As funções podem ser criadas em um Code Block e chamadas em outro lugar da definição do Dynamo. Isto cria outra camada de controle em um arquivo paramétrico e pode ser visualizado como uma versão com base em texto de um nó personalizado. Neste caso, o Code Block "principal" é facilmente acessível e pode ser localizado em qualquer lugar do gráfico. Não é necessário fio!
A primeira linha tem a palavra-chave "def", depois o nome da função e, a seguir, os nomes das entradas entre parênteses. Os contraventamentos definem o corpo da função. Retorne um valor com "return =". Os Blocos de código que definem uma função não possuem portas de entrada ou saída porque eles são chamados de outros Blocos de código.
Chame a função com outro Code Block no mesmo arquivo fornecendo o mesmo nome e o mesmo número de argumentos. Funciona da mesma forma que os nós prontos para uso da sua biblioteca.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Neste exercício, vamos criar uma definição genérica que irá criar esferas a partir de uma lista de entrada de pontos. O raio dessas esferas é conduzido pela propriedade Z de cada ponto.
Vamos começar com um intervalo de números de dez valores , de 0 a 100. Conecte-os a um nó Point.ByCoordinates para criar uma linha diagonal.
Crie um Bloco de código e insira a nossa definição.
Use estas linhas de código:
O inputPt é o nome que atribuímos para representar os pontos que guiarão a função. Por agora, a função não está fazendo nada, mas vamos desenvolver essa função nas etapas a seguir.
Quando a função Bloco de código é adicionada, colocamos um comentário e uma variável sphereRadius que consulta a posição Z de cada ponto. Lembre-se de que inputPt.Z não precisa de parênteses como um método. Essa é uma consulta das propriedades de um elemento existente; portanto, nenhuma entrada é necessária:
Agora, vamos recordar a função que criamos em outro Bloco de código. Se clicarmos duas vezes na tela para criar um novo bloco de código e digitarmos sphereB, notamos que o Dynamo sugere a função sphereByZ que foi definida. A função foi adicionada à biblioteca intellisense. Muito legal.
Agora, chamamos a função e criamos uma variável chamada Pt para conectar os pontos criados nas etapas anteriores:
Observe que, na saída, temos todos os valores nulos. Por que isso ocorre? Quando definimos a função, estamos calculando a variável sphereRadius, mas não definimos o que a função deve ser retornada como uma saída. Podemos corrigir isso na próxima etapa.
Uma etapa importante: é necessário definir a saída da função adicionando a linha
return = sphereRadius;
à função sphereByZ.Agora, vemos que a saída do Bloco de código nos fornece as coordenadas Z de cada ponto.
Agora, vamos criar esferas reais editando a função Principal.
Primeiro definimos uma esfera com a linha de código:
sphere=Sphere.ByCenterPointRadius(inputPt,sphereRadius);
Em seguida, alteramos o valor de retorno para sphere em vez de sphereRadius:
return = sphere;
Isso nos fornece algumas esferas gigantes em nossa visualização do Dynamo.
1. Para reduzir o tamanho dessas esferas, vamos atualizar o valor sphereRadius adicionando um divisor:
sphereRadius = inputPt.Z/20;
Agora podemos ver as esferas separadas e começar a entender a relação entre o raio e o valor Z.
No nó Point.ByCoordinates, alterando a amarra de Lista mais curta para Produto transversal, criamos uma grade de pontos. A função sphereByZ ainda está em pleno efeito, de modo que todos os pontos criam esferas com raios com base em valores Z.
E apenas para efeitos de teste, conectamos a lista original de números à entrada X para Point.ByCoordinates. Agora temos um cubo de esferas.
Observação: Se isso levar muito tempo para ser calculado no computador, tente alterar #10 para algo como #5.
Lembre-se: A função sphereByZ que foi criada é uma função genérica, para que possamos recuperar a hélice de uma lição anterior e aplicar a função a ela.
Uma etapa final: vamos conduzir a relação do raio com um parâmetro definido pelo usuário. Para fazer isso, é necessário criar uma nova entrada para a função e também substituir o divisor 20 por um parâmetro.
Atualize a definição de sphereByZ para:
Atualize o Bloco de código secundário adicionando uma variável de relação à entrada:
sphereByZ(Pt,ratio);
Conecte um controle deslizante à entrada do Bloco de código recém-criado e varie o tamanho dos raios com base na relação de raio.
Esta parte do manual está organizada no espírito de um diário de “melhores práticas”. Ela lança luz sobre várias estratégias que aprendemos, por meio de experiência e pesquisa, como mais favoráveis a fluxos de trabalho paramétricos de qualidade. Como designers e programadores, nossa métrica de qualidade está preocupada principalmente com a manutenção, a dependência, a usabilidade e a eficiência de nossas ferramentas. Embora essas práticas recomendadas tenham exemplos específicos de scripts visuais ou baseados em texto, os princípios são aplicáveis a todos os ambientes de programação e podem informar muitos fluxos de trabalho computacionais.
Com o Dynamo 2.0, podemos especificar um modelo padrão (.py extension)
para usar ao abrir a janela do Python pela primeira vez. Essa foi uma solicitação muito desejada, pois isso acelera o uso do Python no Dynamo. Ter a capacidade de usar um modelo nos permite ter as importações padrão prontas para serem usadas quando quisermos desenvolver um script Python personalizado.
A localização desse modelo está em APPDATA
da instalação do Dynamo.
Normalmente, é ( %appdata%\Dynamo\Dynamo Core\{version}\ )
.
Para usar essa funcionalidade, é necessário adicionar a seguinte linha em nosso arquivo DynamoSettings.xml
. (Editar no bloco de notas)
Onde vemos <PythonTemplateFilePath />
, basta substituir por:
Observação: Substitua CURRENTUSER por seu nome de usuário
Em seguida, precisamos criar um modelo com a funcionalidade que desejamos usar incorporada. Em nosso caso, vamos incorporar as importações relacionadas ao Revit e alguns dos outros itens típicos ao trabalhar com o Revit.
É possível iniciar um documento do bloco de notas em branco e colar o seguinte código:
Uma vez feito isso, salve o arquivo como PythonTemplate.py
na localização APPDATA
.
Após o modelo do Python ser definido, o Dynamo procurará esses dados sempre que um nó do Python for inserido. Se não forem encontrados, será semelhante à janela padrão do Python.
Se o modelo do Python for encontrado (como nosso modelo do Revit, por exemplo), será possível ver todos os itens padrão incorporados.
Você pode obter mais informações sobre esta grande inclusão (desenvolvida por Radu Gidei) aqui. https://github.com/DynamoDS/Dynamo/pull/8122
Por que você usaria a programação textual no ambiente de programação visual do Dynamo? A Programação visual tem muitas vantagens. Ela permite que você crie programas sem aprender sintaxe especial em uma interface visual intuitiva. No entanto, um programa visual pode se tornar confuso e, às vezes, pode ter funcionalidade insatisfatória. Por exemplo, o Python oferece métodos muito mais simples de escrever declarações condicionais (if/then) e loops. O Python é uma ferramenta avançada que pode ampliar os recursos do Dynamo e permitir que você substitua muitos nós por algumas linhas concisas de código.
Programa visual:
Programa textual:
Como os blocos de código, os nós do Python são uma interface de scripts dentro de um ambiente de programação visual. O nó do Python pode ser encontrado em Script>Editor>Script do Python na biblioteca.
Clicando duas vezes no nó, é aberto o editor de scripts do Python (também é possível clicar com o botão direito do mouse no nó e selecionar Editar...). Você observará algum texto padronizado na parte superior, que pretende ajudar você a consultar as bibliotecas necessárias. As entradas estão armazenadas na matriz IN. Os valores são retornados ao Dynamo quando são atribuídos à variável OUT
A biblioteca Autodesk.DesignScript.Geometry permite usar a notação de pontos similar aos blocos de código. Para obter mais informações sobre a sintaxe do Dynamo, consulte https://github.com/DynamoDS/DynamoPrimerNew/blob/master-ptb/coding-in-dynamo/7_code-blocks-and-design-script/7-2_design-script-syntax.md, bem como o Guia do DesignScript (Para fazer o download desse documento PDF, clique com o botão direito do mouse no link e escolha “Salvar link como...”). Digitar um tipo de geometria como “Point.” exibirá uma lista de métodos para criar e consultar pontos.
Os métodos incluem construtores como ByCoordinates, ações como Add e consultas como as coordenadas X, Y e Z.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Neste exemplo, escreveremos um script Python que cria padrões de um módulo sólido e o transforma em um nó personalizado. Primeiro, vamos criar nosso módulo sólido usando os nós do Dynamo.
Rectangle.ByWidthLength: crie um retângulo que será a base do nosso sólido.
Surface.ByPatch: conecte o retângulo à entrada “closedCurve” para criar a superfície inferior.
Geometry.Translate: conecte o retângulo à entrada “geometry” para movê-lo para cima, usando um bloco de código para especificar a espessura da base do nosso sólido.
Polygon.Points: consulte o retângulo convertido para extrair os pontos de canto.
Geometry.Translate: use um bloco de código para criar uma lista de quatro valores correspondentes aos quatro pontos, convertendo um canto do sólido para cima.
Polygon.ByPoints: use os pontos convertidos para reconstruir o polígono superior.
Surface.ByPatch: conecte o polígono para criar a superfície superior.
Agora que temos as superfícies superior e inferior, vamos elevar os dois perfis para criar os lados do sólido.
List.Create: conecte o retângulo inferior e o polígono superior às entradas do índice.
Surface.ByLoft: eleve os dois perfis para criar os lados do sólido.
List.Create: conecte as superfícies superior, laterais e inferior às entradas do índice para criar uma lista de superfícies.
Solid.ByJoinedSurfaces: una as superfícies para criar o módulo sólido.
Agora que temos nosso sólido, vamos colocar um nó do script do Python no espaço de trabalho.
Para adicionar mais entradas ao nó, clique no ícone + no nó. As entradas são nomeadas IN[0], IN[1], etc. para indicar que representam itens em uma lista.
Vamos começar definindo nossas entradas e saídas. Clique duas vezes no nó para abrir o editor do Python. Siga o código abaixo para modificar o código no editor.
Esse código fará mais sentido à medida que progredirmos no exercício. Em seguida, precisaremos pensar sobre quais informações são necessárias para organizar o módulo de sólido. Primeiro, precisamos conhecer as dimensões do sólido para determinar a distância de conversão. Devido a uma falha da caixa delimitadora, será necessário usar a geometria de curva de aresta para criar uma caixa delimitadora.
Veja o nó do Python no Dynamo. Observe que estamos usando a mesma sintaxe que vemos nos títulos dos nós no Dynamo. Confira o código comentado abaixo.
Como vamos converter e girar os módulos de sólido, usaremos a operação Geometry.Transform. Observando o nó Geometry.Transform, sabemos que precisaremos de um sistema de coordenadas de origem e um sistema de coordenadas de destino para transformar o sólido. A origem é o sistema de coordenadas do contexto do nosso sólido, enquanto o destino será um sistema de coordenadas diferente para cada módulo com matriz. Isso significa que teremos que fazer um loop pelos valores x e y para transformar o sistema de coordenadas de forma diferente a cada vez.
Clique em Executar e, em seguida, salve o código. Conecte o nó do Python ao nosso script existente da seguinte maneira.
Conecte a saída de Solid.ByJoinedSurfaces como a primeira entrada para o nó do Python e use um bloco de código para definir as outras entradas.
Crie um nó Topology.Edges e use a saída do nó do Python como entrada.
Por fim, crie um nó Edge.CurveGeometry e use a saída de Topology.Edges como entrada.
Tente alterar o valor gerador para criar diferentes padrões. Também é possível alterar os parâmetros do próprio módulo sólido para obter diferentes efeitos.
Agora que criamos um script Python útil, vamos salvá-lo como um nó personalizado. Selecione o nó do script do Python, clique com o botão direito do mouse no espaço de trabalho e selecione “Criar nó personalizado”.
Atribua um nome, uma descrição e uma categoria.
Isso abrirá um novo espaço de trabalho no qual o nó personalizado será editado.
Entradas: altere os nomes das entradas para que sejam mais descritivos e adicione tipos de dados e valores padrão.
Saída: altere o nome da saída
Salve o nó como um arquivo .dyf. Em seguida, você deverá ver que o nó personalizado reflete as alterações que acabamos de fazer.
Antes deste capítulo, a introdução abordou como implementar os recursos avançados de scripts visuais do Dynamo. Uma boa compreensão desses recursos é uma base sólida e a primeiro etapa para criação de programas visuais robustos. Quando usamos nossos programas visuais no campo, os compartilhamos com colegas, solucionamos erros ou testamos limites adicionais com os quais você precisa lidar. Se outra pessoa usar seu programa no futuro ou se você estiver esperando abri-lo daqui a seis meses, ele precisará ter uma clareza gráfica e lógica imediata. O Dynamo tem muitas ferramentas para gerenciar a complexidade do programa, e este capítulo fornecerá diretrizes sobre quando usá-las.
À medida que você desenvolve o gráfico do Dynamo e testa ideias, ele pode aumentar rapidamente em tamanho e complexidade. Embora seja importante criar um programa funcional, é igualmente importante o tornar o mais simples possível. Assim, além de o gráfico ser executado de forma mais rápida e previsível, você e outros usuários compreenderão a lógica posteriormente. Confira a seguir diversas formas que ajudarão você a esclarecer a lógica do gráfico.
Os grupos permitem criar partes funcionalmente distintas enquanto você cria um programa
Os grupos permitem mover grandes partes do programa enquanto a modularidade e o alinhamento são mantidos
É possível alterar a cor do grupo para diferenciar o que os grupos estão fazendo (entradas versus funções)
É possível usar grupos para iniciar a organização do gráfico para simplificar a criação do nó personalizado
As cores deste programa identificam o propósito de cada grupo. Essa estratégia pode ser usada para criar hierarquia em qualquer norma gráfica ou modelo que você desenvolver.
Grupo de funções (azul)
Grupo de entradas (laranja)
Grupo de scripts (verde)
Para saber como usar Grupos, consulte Como gerenciar o programa.
Às vezes, é possível usar um bloco de código para digitar um método de nó ou número mais rapidamente do que pesquisando (Point.ByCoordinates, Number, String, Formula)
Os blocos de código são úteis quando você deseja definir funções personalizadas no DesignScript para reduzir o número de nós em um gráfico
Tanto 1 quanto 2 executam a mesma função. Era muito mais rápido escrever algumas linhas de código do que procurar e adicionar cada nó individualmente. O bloco de código também é muito mais conciso.
DesignScript escrito no bloco de código
Programa equivalente nos nós
Para saber como usar o bloco de código, consulte O que é um bloco de código?
É possível reduzir a complexidade de um gráfico com a opção Nó para código, que usa um conjunto de nós simples e grava o DesignScript correspondente em um único bloco de código
O Nó para código pode** condensar o código sem eliminar a clareza do programa**
Vantagens do uso de Nó para código:
Condensa facilmente o código em um componente que ainda é editável
Pode simplificar uma parte significativa do gráfico
Será útil se o “miniprograma” não for editado com frequência
É útil para incorporar outras funcionalidades de bloco de código, como funções
Desvantagens do uso de Nó para código:
A nomenclatura genérica o torna menos legível
É mais difícil de entender para outros usuários
Não há uma forma fácil de retornar à versão de programação visual
Programa existente
Bloco de código criado usando Nó para código
Para saber como usar Nó para código, consulte Sintaxe do DesignScript.
O uso do recurso List@Level pode ajudar a reduzir a complexidade do gráfico substituindo os nós List.Map e List.Combine, que podem ocupar um volume considerável de espaço da tela
O recurso List@Level oferece uma** forma mais rápida do que List.Map/List.Combine para criar a lógica do nó** permitindo acessar dados em qualquer nível de uma lista diretamente da porta de entrada de um nó
É possível verificar quantos valores verdadeiros BoundingBox.Contains retorna e em quais listas, ativando List@Level para a entrada de “lista” de CountTrue. O recurso List@Level permite que o usuário determine de qual nível a entrada extrairá os dados. O uso de List@Level é flexível, eficiente e altamente recomendável em relação a outros métodos que envolvem List.Map e List.Combine.
Contagem de valores verdadeiros no Nível de lista 2
Contagem de valores verdadeiros no Nível de lista 3
Para saber como usar List@Level, consulte Listas de listas.
Além de tornar o gráfico o mais simples e eficiente possível, tente obter maior clareza gráfica. Apesar de seus melhores esforços para tornar o gráfico intuitivo com agrupamentos lógicos, os relacionamentos podem não ser evidentes. Uma Nota simples dentro de um grupo ou a renomeação de um controle deslizante pode poupar confusão desnecessária ou a aplicação de pan pelo gráfico para você ou outro usuário. Confira a seguir diversas formas que ajudarão você a aplicar consistência gráfica nos gráficos e entre eles.
Para reduzir o trabalho após terminar de criar o gráfico, você deve tentar garantir que o layout dos nós seja legível alinhando os nós com frequência e conforme você avança
Se outras pessoas estiverem trabalhando com o gráfico, você deverá garantir que o layout fio/nó flua com facilidade antes do envio
Para ajudar com o alinhamento, use o recurso “Limpeza do layout do nó” para alinhar automaticamente o gráfico, porém de forma menos precisa do que se você fizesse isso manualmente
Gráfico não organizado
Gráfico alinhado
Para saber como usar o alinhamento de nós, consulte Gerenciar o programa.
A renomeação de entradas poderá ajudar outras pessoas a entender facilmente o gráfico, principalmente se o item a que elas se conectam estiver fora da tela
Tenha cuidado ao renomear nós que não sejam entradas. Uma alternativa para isso é criar um nó personalizado de um cluster de nós e renomeá-lo; assim, ficará subentendido que ele contém outra coisa
Entradas para manipulação de superfície
Entradas para parâmetros arquitetônicos
Entradas para o script de simulação de drenagem
Para renomear um nó, clique com o botão direito do mouse no nome e selecione “Renomear nó...”.
Adicione uma nota se algo no gráfico necessitar de uma explicação em linguagem simples que os nós não podem expressar
Você deverá adicionar uma nota se um conjunto de nós ou um grupo for muito grande ou complexo e não puder ser facilmente compreendido de imediato
Uma nota que descreve a parte do programa que retorna as distâncias brutas de conversão
Uma nota que descreve o código que mapeia esses valores para uma onda sinusoidal
Para saber como adicionar uma nota, consulte Como gerenciar o programa.
Ao criar o script visual, é importante verificar se o que está sendo retornado é o que você esperava. Nem todos os erros ou problemas causarão a falha imediata do programa, principalmente valores nulos ou zero que possam afetar algo distante a jusante. Essa estratégia também é discutida no contexto de scripts de texto em Estratégias de script. A prática a seguir ajudará a garantir que você obtenha o que esperava.
Use balões de visualização ou inspeção durante a criação do programa para** verificar se as saídas principais estão retornando o que você esperava**
Os nós de inspeção são usados para comparar:
As distâncias de conversão brutas
Os valores passados pela equação de seno
Para saber como usar a Inspeção, consulte Biblioteca.
É altamente provável que outra pessoa esteja abrindo o programa em algum momento, mesmo que você esteja trabalhando de forma independente. Ela deve ser capaz de entender rapidamente o que o programa precisa e produz com base em suas entradas e saídas. Isso é especialmente importante ao desenvolver um nó personalizado para ser compartilhado com a comunidade do Dynamo e usado no programa de outra pessoa. Essas práticas resultam em programas e nós robustos e reutilizáveis.
Para garantir a legibilidade e a escalabilidade, tente minimizar as entradas e saídas o máximo possível
Você deve tentar estabelecer uma estratégia de como criará a lógica elaborando um esboço de como a lógica poderia funcionar antes mesmo de adicionar um único nó à tela. À medida que desenvolve o esboço, você deve monitorar quais entradas e saídas farão parte de scripts
Se houver opções ou condições específicas que você queira incorporar ao gráfico, use as predefinições para obter acesso rápido
Também é possível usar as predefinições para reduzir a complexidade armazenando em cache os valores específicos de controle deslizante em um gráfico com tempos de execução longos
Para saber como usar as predefinições, consulte Gerenciar os dados com as predefinições.
Você deverá usar um nó personalizado se o programa puder ser coletado em um único contêiner
Você deverá usar um nó personalizado quando uma parte do gráfico for reutilizada com frequência em outros programas
Você deverá usar um nó personalizado se desejar compartilhar uma funcionalidade com a comunidade do Dynamo
A coleta do programa de conversão de pontos em um nó personalizado torna portátil e muito mais fácil de entender um programa robusto e exclusivo. Portas de entrada bem nomeadas ajudarão outros usuários a entender como usar o nó. Lembre-se de adicionar descrições e tipos de dados necessários a cada entrada.
Programa atrativo existente
Nó personalizado que coleta este programa, PointGrid
Para saber como usar nós personalizados, consulte Introdução aos nós personalizados.
É possível criar modelos para estabelecer padrões gráficos nos gráficos visuais para garantir que os colaboradores tenham um modo padronizado de entender o gráfico
Durante a criação de um modelo, é possível padronizar as cores de grupo e os tamanhos de fonte para categorizar os tipos de fluxos de trabalho ou as ações de dados.
Durante a criação de um modelo, é possível até mesmo padronizar como você quer definir legendas, cores ou estilos para diferenciar entre os fluxos de trabalho de front-end e back-end no gráfico.
A interface do usuário, ou o front-end, do programa inclui um nome de projeto, controles deslizantes de entrada e geometria de importação.
O back-end do programa.
Categorias de cor de grupo (o projeto geral, as entradas, o script do Python, a geometria importada).
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Agora que estabelecemos várias práticas recomendadas, vamos aplicá-las a um programa que foi montado rapidamente. Embora o programa seja bem-sucedido na geração do telhado, o estado do gráfico é um “mapa mental” do autor. Ele não possui nenhuma organização ou descrição de seu uso. Vamos examinar as práticas recomendadas para organizar, descrever e analisar o programa de modo que outros usuários possam entender como usá-lo.
O programa está funcionando, mas o gráfico está desorganizado.
Vamos começar determinando os dados e a geometria retornados pelo programa.
A compreensão de quando ocorrem as principais alterações nos dados é crucial para estabelecer divisões lógicas ou modularidade. Tente inspecionar o restante do programa com os nós de inspeção para ver se é possível determinar grupos antes de passar para a próxima etapa.
Esse bloco de código com uma equação matemática se parece com uma parte crucial do programa. Um nó de inspeção mostra que ele está retornando listas de distâncias de conversão.
O objetivo dessa área não é evidente. A disposição dos valores True no nível de lista L2 de BoundingBox.Contains e a presença de List.FilterByBoolMask sugerem que estamos fazendo uma amostragem de uma parte da grade de pontos.
Quando entendermos as partes elementares do programa, vamos colocá-las em grupos.
Os grupos permitem que o usuário diferencie visualmente as partes do programa.
Importar o modelo de terreno 3D
Converter a grade de ponto com base na equação de seno
Parte de exemplo da grade de pontos
Criar a superfície de telhado arquitetônico
Criar a parede cortina de vidro
Com os grupos estabelecidos, alinhe os nós para criar a continuidade visual no gráfico.
A continuidade visual ajuda o usuário a ver o fluxo do programa e as relações implícitas entre os nós.
Torne o programa mais acessível adicionando mais uma camada de melhorias gráficas. Adicione notas para descrever como funciona uma área específica do programa, atribua nomes personalizados às entradas e atribua cores a diferentes tipos de grupos.
Essas melhorias gráficas dão mais informações ao usuário sobre o que o programa está fazendo. As diferentes cores de grupo ajudam a diferenciar as entradas das funções.
Notas
Entradas com nomes descritivos
Antes de começarmos a condensar o programa, vamos encontrar uma localização estratégica para introduzir o simulador de drenagem do script do Python. Conecte a saída da primeira superfície de telhado dimensionado à respectiva entrada de script.
Escolhemos integrar scripts neste ponto no programa para que a simulação de drenagem possa ser executada na superfície original de telhado único. Essa superfície específica não está sendo visualizada, mas nos poupa a necessidade de escolher a superfície superior da PolySurface chanfrada.
Geometria de origem para entrada de script
Nó do Python
Controles deslizantes de entrada
“Chave” ligar/desligar
Vamos simplificar o gráfico agora que tudo está em seu devido lugar.
A condensação do nosso programa com Nó para código e Nó personalizado reduziu consideravelmente o tamanho do gráfico. Os grupos que criam a superfície do telhado e as paredes foram convertidos em código, já que são muito específicos deste programa. O grupo de conversão de pontos está contido em um Nó personalizado, pois ele pode ser usado em outro programa. No arquivo de exemplo, crie seu próprio nó personalizado com base no grupo de conversão de pontos.
Nó personalizado para conter o grupo “converter grade de pontos”
Nó para código para condensar os grupos “criar superfície de telhado arquitetônico e parede cortina”
Como etapa final, crie predefinições de formas de telhado exemplares.
Essas entradas são os principais acionadores da forma do telhado e ajudarão os usuários a ver o potencial do programa.
Nosso programa com vistas de duas predefinições.
Os padrões de drenagem do telhado fornecem ao usuário uma vista analítica das predefinições respectivas.
Os scripts baseados em texto no ambiente de scripts visuais permitem relacionamentos visuais avançados usando o DesignScript, o Python e o ZeroTouch (C#). O usuário pode expor elementos como os controles deslizantes de entrada, condensar grandes operações no DesignScript e acessar ferramentas e bibliotecas avançadas por meio do Python ou do C#, tudo isso no mesmo espaço de trabalho. Se gerenciada de forma eficaz, a combinação dessas estratégias pode fornecer uma grande quantidade de personalização, clareza e eficiência a todo o programa. A seguir, há um conjunto de diretrizes para ajudar a ampliar o script visual com script de texto.
Os scripts de texto podem estabelecer relacionamentos de maior complexidade do que a programação visual, mas há uma quantidade significativa de sobreposição de recursos entre ambos. Isso faz sentido porque os nós são essencialmente um código pré-empacotado e é provável que possamos escrever um programa inteiro do Dynamo em DesignScript ou Python. No entanto, usamos scripts visuais porque a interface dos nós e dos fios cria um fluxo intuitivo de informações gráficas. O conhecimento de que os recursos de script de texto vão além do script visual oferece pistas importantes de quando ele deve ser usado sem sacrificar a natureza intuitiva dos nós e dos fios. A seguir, encontram-se as diretrizes sobre quando inserir um script e qual linguagem usar.
Use os scripts de texto para:
Loops
Recursão
Acessar bibliotecas externas
Escolha uma linguagem:
Loops
Recursão
Condensar nós
Ext. Bibliotecas
Abreviação
DesignScript
Sim
Sim
Sim
Não
Sim
Python
Sim
Sim
Parcialmente
Sim
Não
ZeroTouch (C#))
Não
No
Não
Sim
Não
Consulte Referência de scripts para obter uma lista dos itens aos quais cada biblioteca do Dynamo fornece acesso.
Ao criar scripts no Dynamo, um ambiente inevitavelmente paramétrico, é aconselhável estruturar o código em relação à estrutura de nós e do fios na qual ele residirá. Considere o nó que contém o script de texto como se fosse qualquer outro nó no programa com algumas entradas específicas, uma função e uma saída esperada. Isso imediatamente fornece ao código no nó um pequeno conjunto de variáveis com o qual é possível trabalhar, a chave para um sistema paramétrico limpo. Aqui estão algumas diretrizes para uma melhor integração do código em um programa visual.
Identifique as variáveis externas:
Tente determinar os parâmetros fornecidos no problema do projeto para que você possa construir diretamente um modelo com base nesses dados.
Antes de escrever o código, identifique as variáveis:
Um conjunto mínimo de entradas
A saída pretendida
Constantes
Diversas variáveis foram estabelecidas antes de escrever o código.
A superfície na qual simularemos as águas pluviais.
O número de gotas de chuva (agentes) que desejamos.
A distância que desejamos que as gotas de chuva percorram.
Alterne entre descer o caminho mais inclinado e percorrer a superfície.
Nó do Python com o respectivo número de entradas.
Um bloco de código para tornar azuis as curvas retornadas.
Projete os relacionamentos internos:
O parametricismo permite que determinados parâmetros ou variáveis sejam editados para manipular ou alterar o resultado final de uma equação ou de um sistema.
Sempre que as entidades do script estão logicamente relacionadas, é preciso defini-las como funções umas das outras. Dessa forma, quando uma é modificada, a outra pode ser atualizada proporcionalmente.
Minimize o número de entradas expondo somente os parâmetros chave:
Se for possível derivar um conjunto de parâmetros de mais parâmetros principais, somente exponha os parâmetros principais como entradas de script. Isso aumenta a usabilidade reduzindo a complexidade da interface do script.
Os “módulos” do código com base no exemplo no Nó do Python.
Entradas.
Variáveis internas do script.
Um loop que usa essas entradas e variáveis para executar sua função.
Dica: Dê ao processo a mesma ênfase que você dá à solução.
Quando você tem várias maneiras de expressar o mesmo no script, em algum momento as representações duplicadas não estarão sincronizadas, o que pode provocar uma grande dificuldade de manutenção, má fatoração e contradições internas.
O princípio DRY é declarado como “Cada conhecimento deve ter uma representação única, inequívoca e confiável dentro de um sistema”:
Quando esse princípio é aplicado com êxito, todos os elementos relacionados ao script mudam de forma previsível e uniforme, e todos os elementos não relacionados não têm consequências lógicas entre si.
Dica: Antes de duplicar entidades no script (como a constante no exemplo acima), considere se é possível, em vez disso, vincular à origem.
Conforme seu código fica cada vez mais complexo, a “ideia geral”, ou o algoritmo abrangente, se torna cada vez mais ilegível. Também é mais difícil controlar o que (e onde) coisas específicas acontecem, encontrar falhas quando as coisas dão errado, integrar outro código e atribuir tarefas de desenvolvimento. Para evitar essas dores de cabeça, é preciso escrever código em módulos, uma estratégia organizacional que divide o código com base na tarefa que ele executa. Aqui estão algumas dicas para tornar os scripts mais gerenciáveis por meio da modularização.
Escreva código em módulos:
Um “módulo” é um grupo de códigos que executa uma tarefa específica, similar a um nó do Dynamo no espaço de trabalho.
Isso pode ser qualquer item que deva ser visualmente separada do código adjacente (uma função, uma classe, um grupo de entradas ou as bibliotecas que você esteja importando).
O desenvolvimento de código em módulos aproveita a característica visual e intuitiva dos nós, bem como as relações complexas que somente os scripts de texto podem obter.
Esses loops chamam uma classe nomeada “agente” que desenvolveremos no exercício.
Um módulo de código que define o ponto inicial de cada agente.
Um módulo de código que atualiza o agente.
Um módulo de código que desenha um rastro para o caminho do agente.
Identificação da reutilização de código:
Se você achar que seu código faz a mesma coisa (ou algo muito similar) em mais de um lugar, encontre maneiras de agrupá-lo em uma função que possa ser chamada.
As funções de “gerenciador” controlam o fluxo do programa e contêm principalmente chamadas para funções de “trabalho” que lidam com detalhes de baixo nível, como mover dados entre estruturas.
Este exemplo cria esferas com raios e cores com base no valor Z dos pontos centrais.
Duas funções principais de “trabalho”: uma que cria esferas com raios e exibe cores com base no valor Z do ponto central.
Uma função principal de “gerenciador” que combina as duas funções de trabalho. Chamar essa função chamará as duas funções no interior dela.
Mostre somente o que precisa ser visto:
Uma interface de módulo expressa os elementos que são fornecidos e requeridos pelo módulo.
Quando as interfaces entre as unidades tiverem sido definidas, o projeto detalhado de cada unidade poderá prosseguir separadamente.
Capacidade de separação/substituição:
Os módulos não sabem ou são indiferentes quanto à existência uns dos outros.
Formas gerais de modularização:
Agrupamento de código:
Funções:
Classes:
Ao desenvolver scripts de texto no Dynamo, é recomendável garantir constantemente que o que está sendo realmente criado esteja de acordo com as suas expectativas. Isso garante que eventos imprevistos, como erros de sintaxe, discrepâncias lógicas, imprecisões de valor, saídas anômalas, etc., sejam rapidamente descobertos e tratados conforme surgirem, em vez de todos ao mesmo tempo no final. Como os scripts de texto residem nos nós internos da tela, eles já estão integrados no fluxo de dados do programa visual. Isso torna o monitoramento sucessivo do script tão simples quanto a atribuição dos dados a serem gerados, a execução do programa e a avaliação do que flui do script usando um nó de inspeção. Confira aqui algumas dicas para inspecionar continuamente os scripts ao construí-los.
Teste conforme o uso:
Sempre que você concluir um conjunto de funcionalidades:
Volte e inspecione o código.
Seja crítico. Um colaborador conseguiria entender o que ele está produzindo? Preciso fazer isso? Essa função pode ser feita de forma mais eficiente? Estou criando dependências ou duplicatas desnecessárias?
Teste rapidamente para garantir que ele esteja retornando dados que “façam sentido”.
Atribua os dados mais recentes com os quais você está trabalhando em seu script como a saída, de forma que o nó sempre produza dados relevantes quando o script for atualizado:
Verifique se todas as arestas do sólido estão sendo retornadas como curvas para criar uma caixa delimitadora em torno dele.
Verifique se nossas entradas de contagem estão sendo convertidas com êxito em intervalos.
Verifique se os sistemas de coordenadas foram corretamente convertidos e rotacionados neste loop.
Antecipe “casos de aresta”:
Durante a criação dos scripts, coloque os parâmetros de entrada nos valores mínimo e máximo de seus domínios alocados para verificar se o programa ainda funciona em condições extremas.
Mesmo que o programa funcione em seus extremos, verifique se ele está retornando valores nulos/vazios/zero não pretendidos.
Às vezes, as falhas e os erros que revelam um problema subjacente com seu script só surgirão durante esses casos de aresta.
Compreenda o que está causando o erro e, em seguida, decida se ele precisa ser corrigido internamente ou se um domínio de parâmetro precisa ser redefinido para evitar o problema.
Dica: Sempre presuma que o usuário usará cada combinação de cada valor de entrada que foi exposto a ele/ela. Isso ajudará a eliminar surpresas indesejadas.
A depuração é o processo de eliminação de falhas do script. As falhas podem ser erros, ineficiências, imprecisões ou qualquer resultado não pretendido. A solução de uma falha pode ser tão simples quanto corrigir um nome de variável com erros de grafia ou problemas estruturais mais abrangentes no script. Idealmente, a flexibilização do script à medida que você o cria ajudará a detectar esses possíveis problemas no início, embora isso não seja uma garantia de que ele estará livre de falhas. A seguir, apresentamos uma revisão das várias práticas recomendadas acima para ajudar a solucionar falhas de forma sistemática.
Use a bolha de inspeção:
Verifique os dados retornados em diferentes locais no código ao atribuí-los à variável OUT, de forma semelhante ao conceito de flexibilização do programa.
Insira comentários significativos:
Será muito mais fácil depurar um módulo de código se seu resultado pretendido for claramente descrito.
Normalmente, isso seria uma quantidade excessiva de linhas de comentário e em branco; mas, ao depurar, pode ser útil dividir os itens em partes gerenciáveis.
Aproveite a modularidade do código:
É possível isolar a origem de um problema em determinados módulos.
Quando o módulo com falha for identificado, a correção do problema será consideravelmente mais simples.
Quando um programa precisa ser modificado, é muito mais fácil alterar o código que foi desenvolvido nos módulos:
É possível inserir módulos novos ou depurados em um programa existente com a segurança de que o restante do programa não será alterado.
Depurar o arquivo de exemplo do Nó do Python.
A geometria de entrada está retornando uma caixa delimitadora maior que ela mesma, como podemos ver ao atribuir xDist e yDist a OUT.
As curvas de aresta da geometria de entrada retornam uma caixa delimitadora apropriada com as distâncias corretas para xDist e yDist.
O “módulo” do código que inserimos para resolver o problema dos valores xDist e yDist.
Faça o download do arquivo de exemplo clicando no link abaixo.
É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.
Considerando as nossas melhores práticas para os scripts de texto, vamos escrever um script de simulação de chuva. Embora seja possível aplicar as práticas recomendadas a um programa visual desorganizado em Estratégias de gráfico, é muito mais difícil fazer isso com scripts de texto. As relações lógicas estabelecidas no script de texto são menos visíveis e pode ser quase impossível decifrá-las em um código confuso. O poder dos scripts de texto é acompanhado por uma responsabilidade maior na organização. Vamos detalhar cada etapa e aplicar as práticas recomendadas durante o percurso.
Nosso script aplicado a uma superfície deformada por atrativos.
A primeira coisa que precisamos fazer é importar as bibliotecas do Dynamo necessárias. Fazer isso fornecerá acesso global à funcionalidade do Dynamo no Python.
Todas as bibliotecas que pretendemos usar precisam ser importadas aqui.
Em seguida, precisamos definir as entradas e a saída do script, que serão exibidas como portas de entrada no nó. Essas entradas externas são a base do nosso script e a chave para estabelecer um ambiente paramétrico.
Precisamos definir entradas que correspondam a variáveis no script do Python e determinar a saída desejada:
A superfície que queremos percorrer.
O número de agentes pelos quais queremos percorrer.
O número máximo de etapas que os agentes podem assumir.
Uma opção para obter o caminho mais curto pela superfície ou para percorrê-la.
O nó do Python com identificadores de entrada que correspondem às entradas no script (IN[0], IN[1]).
As curvas de saída que podem ser exibidas com uma cor diferente.
Agora, vamos empregar a prática da modularidade e criar o corpo do nosso script. A simulação do caminho mais curto por uma superfície de vários pontos iniciais é uma tarefa significativa que exigirá diversas funções. Em vez de chamar as diferentes funções por todo o script, podemos modularizar nosso código coletando-as em uma única classe, nosso agente. As diferentes funções dessa classe ou “módulo” podem ser chamadas com diferentes variáveis ou até mesmo reutilizadas em outro script.
Precisaremos definir uma classe ou blueprint para um agente com a intenção de percorrer uma superfície, escolhendo o deslocamento na direção mais inclinada possível sempre que ele assumir uma etapa:
Nome.
Atributos globais compartilhados por todos os agentes.
Atributos de instância exclusivos para cada agente.
Uma função para realizar uma etapa.
Uma função para catalogar a posição de cada etapa em uma lista de rastros.
Vamos inicializar os agentes definindo sua localização inicial. Esta é uma boa oportunidade para flexibilizar nosso script e garantir que a classe de agente esteja funcionando.
Precisaremos instanciar todos os agentes que desejamos observar pela superfície e definir seus atributos iniciais:
Uma nova lista de rastros vazia.
Onde eles iniciarão sua jornada na superfície.
Atribuímos a lista de agentes como saída para verificar o que o script está retornando aqui. O número correto de agentes está sendo retornado, mas precisamos flexionar o script novamente mais tarde para verificar a geometria que ele retorna.
Atualize cada agente em cada etapa. Em seguida, precisaremos inserir um ciclo aninhado onde, para cada agente e para cada etapa, atualizamos e registramos sua posição na lista de rastros. Em cada etapa, também garantiremos que o agente não tenha alcançado um ponto na superfície em que ele não possa avançar mais uma etapa, o que lhe permitirá descer. Se essa condição for atendida, encerraremos o percurso do agente.
Agora que nossos agentes foram totalmente atualizados, vamos retornar a geometria que os representa. Depois que todos os agentes tiverem atingido seu limite de descida ou o número máximo de etapas, criaremos uma policurva pelos pontos da lista de rastros e geraremos os rastros da policurva.
Nosso script para encontrar os caminhos mais inclinados.
Uma predefinição que simula as águas pluviais na superfície subjacente.
Em vez de encontrar o caminho mais inclinado, é possível alternar os agentes para percorrer a superfície subjacente.
O script de texto completo em Python.
Trabalhar dentro de um processo de programação visual pode ser uma poderosa atividade criativa, mas muito rapidamente o fluxo do programa e as principais entradas do usuário podem ser ofuscadas pela complexidade e/ou layout do espaço de trabalho. Vamos rever algumas práticas recomendadas para o gerenciamento do programa.
Depois de adicionar alguns nós ao espaço de trabalho, convém reorganizar o layout dos nós por uma questão de clareza. Se selecionar mais de um nó e clicar com o botão direito do mouse no espaço de trabalho, a janela pop-up incluirá um menu Alinhar seleção com opções de justificação e distribuição em X e Y.
Selecione mais de um nó
Clique com o botão direito do mouse no espaço de trabalho
Use as opções Alinhar seleção
Com alguma experiência, podemos “ler” o programa visual, revisando os nomes dos nós e seguindo o fluxo do programa. Para usuários de todos os níveis de experiência, também é uma boa prática incluir descrições e legendas em linguagem simples. O Dynamo tem um nó Notas com um campo de texto editável para fazer isso. É possível adicionar notas ao espaço de trabalho de duas maneiras:
Navegue até o menu Editar > Criar nota
Use o atalho de teclado Ctrl+W
Após a nota ser adicionada ao espaço de trabalho, será exibido um campo de texto, permitindo editar o texto na nota. Após serem criadas, é possível editar as notas clicando duas vezes ou clicando com o botão direito do mouse no nó Nota.
Quando nosso programa visual cresce, é útil identificar as etapas maiores que serão executadas. Podemos destacar conjuntos maiores de nós com um Grupo para incluir legendas com um retângulo colorido em segundo plano e um título. Existem três maneiras de criar um grupo com mais de um nó selecionado:
Navegue até o menu Editar > Criar grupo
Use o atalho de teclado Ctrl+G
Clique com o botão direito do mouse no espaço de trabalho e selecione “Criar grupo”
Uma vez criado um grupo, podemos editar suas configurações, como o título e a cor.
Dica: Usar notas e grupos é uma forma eficaz de anotar o arquivo e aumentar a legibilidade.
Veja um exemplo de programa com notas e grupos adicionados:
Nota: “Parâmetros da grade”
Nota: “Pontos da grade”
Nota: “Criar uma grade de pontos”
Grupo: “Criar um ponto atrativo”
Nota: “Calibrar valores de distância”
Nota: “Grade de círculos variável”
Esta página de referência estende as melhores práticas descritas em Estratégias de script com mais detalhes sobre bibliotecas de códigos, legendagem e estilização. Usaremos o Python para ilustrar os conceitos abaixo, mas os mesmos princípios se aplicam a Python e C# (Zerotouch), mas com sintaxe diferente.
As bibliotecas padrão são externas ao Dynamo e estão presentes nas linguagens de programação Python e C# (Zerotouch). O Dynamo também tem seu próprio conjunto de bibliotecas que correspondem diretamente à sua hierarquia de nós, permitindo que o usuário crie qualquer coisa em código que possa ser feito com nós e fios. A seguir está um guia a indicar os acessos fornecidos por cada biblioteca do Dynamo e quando usar uma biblioteca padrão.
Bibliotecas padrão e bibliotecas do Dynamo
As bibliotecas padrão do Python e C# podem ser usadas para criar dados avançados e estruturas de fluxo no ambiente do Dynamo.
As bibliotecas do Dynamo correspondem diretamente à hierarquia dos nós para criar geometria e outros objetos do Dynamo.
Bibliotecas do Dynamo
ProtoGeometry*
Funcionalidade: Arco de elipse, Arco, Aresta, Caixa delimitadora, Cilindro, Círculo, Cone, Cuboide, Curva Nurbs, Curva, Elipse, Esfera, Face, Geometria, Grupo de índices, Hélice, Linha, Malha, Plano, Polígono, Ponto, Retângulo, Sistema de coordenadas, Sólido, Superfície Nurbs, Superfície, Topologia, TSpline, UV, Vértice, Vetor.
Como importar: import Autodesk.DesignScript.Geometry
``
DSCoreNodes
Funcionalidade: Cor, Intervalo de Cores 2D, Data e hora, Tempo, E/S, Fórmula, Lógica, Lista, Matemática, Quadtree, Sequência de caracteres, Rosca.
Como importar: import DSCore
Tessellation
Funcionalidade: Casco convexo, Delaunay, Voronoi.
Como importar: import Tessellation
DSOffice
Funcionalidade: Excel.
Como importar: import DSOffice
*Observação: Durante o uso de ProtoGeometry com o Python ou C#, você está criando objetos não gerenciados, que precisam ter memória gerenciada manualmente. Consulte a seção abaixo: Objetos não gerenciados para obter mais informações.
Enquanto cria scripts, estamos constantemente usando identificadores para indicar coisas como variáveis, tipos, funções e outras entidades. Por meio desse sistema de notação simbólica, ao criar algoritmos, podemos convenientemente nos referir às informações através de rótulos, geralmente compostos de uma sequência de caracteres. Atribuir nomes a coisas desempenha um papel importante em códigos de escrita que podem ser facilmente lidos e compreendidos por outras pessoas, bem como por você no futuro. Veja algumas dicas para se ter em mente ao nomear os itens no script:
É aceitável usar abreviações, mas explique a abreviação com um comentário:
Evite a legendagem redundante:
Use lógica positiva para os nomes de variáveis em vez de lógica negativa:
Prefira a “notação inversa”:
É mais sensível, em termos estruturais.
Os alias devem ser usados para abreviar cadeias muito longas e frequentemente repetidas:
O uso de alias pode gerar rapidamente programas muito confusos e não padrão.
Use somente as palavras necessárias:
“Tudo deve ser feito tão simples quanto possível, mas não mais simples”. – Albert Einstein
Em termos gerais, há mais de uma maneira de programar qualquer coisa; portanto, seu “estilo pessoal” de scripts é o resultado das inúmeras decisões pequenas que você tomar (ou não tomar) durante o processo. Mesmo assim, a legibilidade e a manutenção do código são um resultado direto de sua consistência interna, bem como sua adesão às convenções estilizadas gerais. Como regra geral, o código com a mesma aparência em dois lugares deve funcionar da mesma maneira também. Aqui estão algumas dicas para escrever código claro e consistente.
Convenções de nomenclatura: (selecione uma das convenções abaixo para cada tipo de entidade no código e a mantenha.)
Variáveis, funções, métodos, pacotes, módulos:
lower_case_with_underscores
Classes e exceções:
CapWords
Funções internas e métodos protegidos:
_single_leading_underscore(self, ...)
Métodos privados:
__double_leading_underscore(self, ...)
Constantes:
ALL_CAPS_WITH_UNDERSCORES
Dica: Evite variáveis de uma só letra (especialmente l, O, I), exceto em blocos muito curtos, quando o significado estiver claramente visível no contexto imediato.
Use linhas em branco:
Defina a função de nível superior e as definições de classe com duas linhas em branco.
As definições de método dentro de uma classe são cercadas por uma única linha em branco.
É possível usar linhas em branco adicionais (com moderação) para separar grupos de funções relacionadas.
Evite espaços em branco desnecessários:
Imediatamente dentro dos parênteses, colchetes ou chaves:
Imediatamente antes de uma vírgula, ponto e vírgula ou dois pontos:
Imediatamente antes do parêntese de abertura que inicia a lista de argumentos de uma chamada de função:
Imediatamente antes do parêntese de abertura que inicia uma indexação ou fatiamento:
Sempre coloque esses operadores binários com um único espaço em cada lado:
Comprimento da linha de inspeção:
Não se estresse com isso, aproximadamente 79 caracteres.
Limitar a largura da janela do editor necessária possibilita ter vários arquivos abertos lado a lado e funciona bem ao usar as ferramentas de revisão de código que apresentam as duas versões em colunas adjacentes.
Linhas longas podem ser divididas em várias linhas colocando expressões entre parênteses:
Evite comentários óbvios e redundantes:
Às vezes, menos comentários resultam em um código mais legível. Especialmente se isso forçar o uso de nomes de símbolos significativos.
Adotar bons hábitos de codificação reduz a dependência de comentários:
Dica: Os comentários informam o porquê, o código informa como.
Confira o código-fonte aberto:
Os projetos em código aberto foram desenvolvidos com base nos esforços de colaboração de muitos desenvolvedores. Esses projetos precisam manter um alto nível de legibilidade de código para que a equipe possa trabalhar em conjunto da maneira mais eficiente possível. Portanto, é aconselhável procurar o código fonte desses projetos para observar o que esses desenvolvedores estão fazendo.
Melhore as convenções:
Questione se cada convenção está ou não funcionando para as necessidades em questão.
A funcionalidade/eficiência está sendo comprometida?
Confira estas páginas wiki para obter ajuda sobre como escrever em C# para Zerotouch e contribuir para o Dynamo:
Objetos não gerenciados:
Você só precisa descartar os recursos não gerenciados aos quais não retorne no gráfico ou para os quais não armazene uma referência. Para o restante desta seção, chamaremos esses objetos geometria intermediária. É possível ver um exemplo dessa classe de objeto no exemplo de código abaixo. Essa função C# zerotouch singleCube retorna um único cubo, mas cria 10.000 cubos extras durante sua execução. É possível simular que usamos essa outra geometria como alguma geometria de construção intermediária.
Essa função zerotouch provavelmente causará um erro fatal no Dynamo. Como criamos 10.000 sólidos, mas somente um deles foi armazenado, só esse será devolvido. Devemos, em vez disso, descartar todos os nossos cubos intermediários, exceto o que retornamos. Não queremos descartar o que retornamos, pois será propagado no gráfico e usado por outros nós.
O código fixo deve ter o seguinte aspecto:
Em geral, basta descartar a geometria como Surfaces
, Curves
e Solids
. Para estar seguro, no entanto, é possível descartar todos os tipos de geometria (Vectors
, Points
, CoordinateSystems
).
Este wiki aborda alguns padrões gerais de codificação para documentar e testar o código:
Este wiki aborda especificamente os padrões de nomenclatura para bibliotecas, categorias, nomes de nós, nomes de porta e abreviações:
Ao usar a biblioteca de geometria do Dynamo (ProtoGeometry) do Python ou C#, os objetos de geometria que você criar não serão gerenciados pela máquina virtual, e a memória de muitos desses objetos precisará ser limpa manualmente. Para limpar objetos nativos ou não gerenciados, é possível usar o método Descartar ou usar a palavra-chave. Consulte esta entrada do wiki para obter uma visão geral: .