# Posicionamento de postes de luz

<figure><img src="https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-c6559ed7f2c9c93dfb1ca141842c04b414a08e65%2FRoads_CorridorBlockRefs_Player%20(1).gif?alt=media" alt=""><figcaption></figcaption></figure>

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.

## Objetivo

> :dart: Posicionar referências de bloco de postes de luz ao longo de um corredor em valores de estaca especificados em um arquivo do Excel.

## Principais conceitos

> * 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

## Compatibilidade de versão

{% hint style="success" %}
Este gráfico será executado no **Civil 3D 2020** e versões superiores.
{% endhint %}

## Conjunto de dados

Comece fazendo o download dos arquivos de amostra abaixo e, em seguida, abrindo o arquivo DWG e o gráfico do Dynamo.

{% hint style="info" %}
É melhor que o arquivo do Excel seja salvo no mesmo diretório que o gráfico do Dynamo.
{% endhint %}

{% file src="<https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-9c51a61b67527c24cb0a0448a935665f603cb9ab%2FRoads_CorridorBlockRefs%20(1).dyn?alt=media>" %}

{% file src="<https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-a60d4e7c613e6f813c74a865117363232e66f9c7%2FRoads_CorridorBlockRefs.dwg?alt=media>" %}

{% file src="<https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-e1b21723079c566de6102f6f09ab14b74f525892%2FLightPoles.xlsx?alt=media>" %}

## Solução

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

> 1. Ler o arquivo do Excel e importar os dados para o Dynamo
> 2. Obter as linhas de recurso da linha base do corredor especificada
> 3. Gerar os sistemas de coordenadas ao longo da linha de recurso do corredor nas estacas desejadas
> 4. Usar os sistemas de coordenadas para posicionar referências de bloco no espaço do modelo

Vamos começar

### Obter os dados do Excel

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.

<figure><img src="https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-3119bb9a977968f97b56185738f1239e16bc3b6e%2FRoads_CorridorBlockRefs_ExcelFile.png?alt=media" alt=""><figcaption><p>Estrutura da tabela de arquivos do Excel</p></figcaption></figure>

{% hint style="info" %}
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.
{% endhint %}

Os dados do Excel são importados para o Dynamo da seguinte maneira.

<figure><img src="https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-a801dc929782993cc242ae8b9111705e5c4297e4%2FRoads_CorridorBlockRefs_GetExcelData%20(1).png?alt=media" alt="" width="548"><figcaption><p>Importação de dados do Excel para o Dynamo</p></figcaption></figure>

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*.

{% hint style="info" %}
Se os dicionários forem algo novo para você, veja a seção [5-5\_dictionaries-in-dynamo](https://primer2.dynamobim.org/pt-br/5_essential_nodes_and_concepts/5-5_dictionaries-in-dynamo "mention").
{% endhint %}

<figure><img src="https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-7a50b7420e08ec24b4d2c5abbeee4e4ebe84663e%2FRoads_CorridorBlockRefs_Dictionary.png?alt=media" alt=""><figcaption><p>Colocar os dados do Excel em um dicionário</p></figcaption></figure>

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.

<figure><img src="https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-1a1366f197a182d51d72f44091dcbfbe380280cd%2FRoads_CorridorBlockRefs_DictionaryRetrieval.png?alt=media" alt=""><figcaption><p>Recuperação de dados do dicionário</p></figcaption></figure>

### Obter as linhas de recurso do corredor

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.

<figure><img src="https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-614ba829e4790df44b18dd78d1994c44d37eb2f4%2FRoads_CorridorBlockRefs_GetCorridorFeatureLines.png?alt=media" alt=""><figcaption></figcaption></figure>

> 1. Selecione o modelo de corredor pelo nome.
> 2. Obtenha uma linha base específica dentro do corredor.
> 3. Obtenha uma linha do recurso na linha base pelo código de ponto.

### Gerar os sistemas de coordenadas

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.

{% hint style="info" %}
Se os sistemas de coordenadas forem algo novo para você, veja a seção [2-vectors](https://primer2.dynamobim.org/pt-br/5_essential_nodes_and_concepts/5-2_geometry-for-computational-design/2-vectors "mention").
{% endhint %}

<figure><img src="https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-efe007d82c8b1b59ded9046dcadb67385f417fc7%2FRoads_CorridorBlockRefs_GetCoordinateSystems%20(1).png?alt=media" alt=""><figcaption><p>Obtenção dos sistemas de coordenadas ao longo das linhas de recurso do corredor</p></figcaption></figure>

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.

{% hint style="info" %}
Se os blocos de código forem algo novo para você, veja a seção [8-1\_code-blocks-and-design-script](https://primer2.dynamobim.org/pt-br/8_coding_in_dynamo/8-1_code-blocks-and-design-script "mention").
{% endhint %}

### Criar as referências de bloco

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.

<figure><img src="https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-249de556182f309946d599e62f54714b2e8686bc%2FRoads_CorridorBlockRefs_GetBlockDefinitions.png?alt=media" alt=""><figcaption><p>Obtenção das definições de bloco que desejamos do documento</p></figcaption></figure>

A partir daí, a última etapa é criar as referências de bloco.

<figure><img src="https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-3a7a5f59a8128b97de3230fa5006c924b7b80136%2FRoads_CorridorBlockRefs_CreateBlockReferences.png?alt=media" alt=""><figcaption><p>Criação das referências de bloco no espaço do modelo</p></figcaption></figure>

### Resultado

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.

{% hint style="info" %}
Você pode ler mais sobre os modos de execução de gráficos na seção [3\_user\_interface](https://primer2.dynamobim.org/pt-br/3_user_interface "mention").
{% endhint %}

<figure><img src="https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-98bbc4816018cf7cee6bacabe87c480a403cc0b8%2FRoads_CorridorBlockRefs_Excel.gif?alt=media" alt=""><figcaption><p>Realização de atualizações no arquivo do Excel e visualização rápida dos resultados no Civil 3D</p></figcaption></figure>

Veja um exemplo de como executar o gráfico usando o **Reprodutor do Dynamo**.

<figure><img src="https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-c6559ed7f2c9c93dfb1ca141842c04b414a08e65%2FRoads_CorridorBlockRefs_Player%20(1).gif?alt=media" alt=""><figcaption><p>Execução do gráfico usando o Reprodutor do Dynamo e visualização dos resultados no Civil 3D</p></figcaption></figure>

{% hint style="info" %}
Se o Reprodutor do Dynamo for algo novo para você, veja a seção [dynamo-player](https://primer2.dynamobim.org/pt-br/dynamo-for-civil-3d/dynamo-player "mention").
{% endhint %}

> :tada: Missão cumprida.

### Bônus: Visualização no 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.

<figure><img src="https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-bb127a8c17fc0df41b349e7ca32efccd424f52c7%2FRoads_CorridorBlockRefs_VisualizeCorridor%20(1).png?alt=media" alt=""><figcaption></figcaption></figure>

> 1. 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.
> 2. 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.

<figure><img src="https://244128891-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2qE9MHrCjjcYhCOUtPm6%2Fuploads%2Fgit-blob-23657306ebcf8021ced1345f603a8628eb840acd%2FRoads_CorridorBlockRefs_Dynamo.png?alt=media" alt=""><figcaption><p>Visualização da geometria do corredor no Dynamo</p></figcaption></figure>

## Ideias

Veja a seguir algumas ideias sobre como você pode expandir os recursos desse gráfico.

{% hint style="info" %}
Adicione uma coluna de **rotação** ao arquivo do Excel e use-a para controlar a rotação dos sistemas de coordenadas.
{% endhint %}

{% hint style="info" %}
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.
{% endhint %}

{% hint style="info" %}
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.
{% endhint %}
