# Размещение осветительных столбов

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

Один из многих примеров эффективного применения Dynamo — динамическое размещение отдельных объектов вдоль модели коридора. Часто объекты требуется размещать в местах, не зависящих от вставленных сборок вдоль коридора. Если эту задачу выполнять вручную, она может быть очень утомительной. Кроме того, много приходится переделывать при изменении горизонтальной или вертикальной геометрии коридора.

## Цель

> :dart: Размещение вхождений блока осветительных столбов вдоль коридора со значениями пикетов, заданными в файле Excel.

## Основные этапы

> * Чтение данных из внешнего файла (в данном случае Excel)
> * Организация данных в словарях
> * Использование систем координат для управления положением, масштабом и поворотом
> * Размещение вхождений блоков
> * Визуализация геометрии в Dynamo

## Совместимость версий

{% hint style="success" %}
Этот график будет работать в **Civil 3D 2020** и более поздних версиях.
{% endhint %}

## Набор данных

Сначала скачайте файлы примеров ниже, а затем откройте файл DWG и график Dynamo.

{% hint style="info" %}
Рекомендуем сохранить файл Excel в одной папке с графиком Dynamo.
{% endhint %}

{% file src="<https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-9e657daa146527e863586130615db39a0886624a%2FRoads_CorridorBlockRefs.dyn?alt=media>" %}

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

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

## Решение

Ниже представлен обзор логики, используемой в этом графике.

> 1. Чтение файла Excel и импорт данных в Dynamo.
> 2. Получение характерных линий из заданной базовой линии коридора.
> 3. Создание систем координат вдоль характерной линии коридора на требуемых пикетах.
> 4. Использование систем координат для размещения вхождений блоков в пространстве модели.

Приступим!

### Получение данных Excel

При работе с этим примером графика мы используем файл Excel для хранения данных, на основе которых Dynamo будет размещать вхождения блоков осветительных столбов. Вот как выглядит наша таблица.

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-3119bb9a977968f97b56185738f1239e16bc3b6e%2FRoads_CorridorBlockRefs_ExcelFile.png?alt=media" alt=""><figcaption><p>Структура таблицы в файле Excel</p></figcaption></figure>

{% hint style="info" %}
Использование Dynamo для чтения данных из внешнего файла (например, файла Excel) — это отличная стратегия, особенно если эти данные необходимо предоставить другим участникам группы.
{% endhint %}

Данные Excel импортируются в Dynamo следующим образом.

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-a801dc929782993cc242ae8b9111705e5c4297e4%2FRoads_CorridorBlockRefs_GetExcelData%20(1).png?alt=media" alt="" width="548"><figcaption><p>Импорт данных Excel в Dynamo</p></figcaption></figure>

Теперь, когда мы получили данные, нужно разделить их по столбцам — *Corridor*, *Baseline*, *PointCode* и т. д., — чтобы их можно было использовать в оставшейся части графика. Обычно для этого используется узел **List.GetItemAtIndex** и указывается порядковый номер каждого нужного столбца. Например, номер столбца *Corridor* — 0, столбца *Baseline* — 1 и т. д.

Пока все вроде бы в порядке. Однако при использовании такого подхода может возникнуть проблема. Что будет, если порядок столбцов в файле Excel впоследствии изменится? Или если между двумя столбцами будет вставлен третий? График перестанет работать должным образом, и его нужно будет изменить. Чтобы избежать этого, поместим данные в **словарь**, записав заголовки столбцов Excel в качестве *ключей* (keys), а остальные данные в качестве *значений* (values).

{% hint style="info" %}
Если вы еще не знакомы со словарями, см. раздел [5-5\_dictionaries-in-dynamo](https://primer2.dynamobim.org/ru/5_essential_nodes_and_concepts/5-5_dictionaries-in-dynamo "mention").
{% endhint %}

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-7a50b7420e08ec24b4d2c5abbeee4e4ebe84663e%2FRoads_CorridorBlockRefs_Dictionary.png?alt=media" alt=""><figcaption><p>Преобразование данных Excel в словарь</p></figcaption></figure>

При таком подходе график будет более устойчивым, поскольку он сможет адаптироваться к изменению порядка столбцов в Excel. При условии что заголовки столбцов останутся неизменными, данные можно будет просто извлечь из словаря по *ключу* (заголовку столбца). Именно это мы и сделаем.

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-1a1366f197a182d51d72f44091dcbfbe380280cd%2FRoads_CorridorBlockRefs_DictionaryRetrieval.png?alt=media" alt=""><figcaption><p>Получение данных из словаря</p></figcaption></figure>

### Получение характерных линий коридора

Итак, данные Excel импортированы и готовы к использованию. Начнем работать с ними, чтобы получить информацию о моделях коридоров из Civil 3D.

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

> 1. Выбор модели коридора по имени.
> 2. Получение нужной базовой линии в коридоре.
> 3. Получение характерной линии в пределах базовой линии по коду точки.

### Создание систем координат

Теперь создадим **системы координат** вдоль характерных линий коридора на пикетах, значения которых заданы в файле Excel. Эти системы координат будут определять положение, поворот и масштаб вхождений блока осветительного столба.

{% hint style="info" %}
Если вы еще не знакомы с системами координат, см. раздел [2-vectors](https://primer2.dynamobim.org/ru/5_essential_nodes_and_concepts/5-2_geometry-for-computational-design/2-vectors "mention").
{% endhint %}

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-efe007d82c8b1b59ded9046dcadb67385f417fc7%2FRoads_CorridorBlockRefs_GetCoordinateSystems%20(1).png?alt=media" alt=""><figcaption><p>Получение систем координат, расположенных вдоль характерных линий коридора</p></figcaption></figure>

Обратите внимание, что мы используем Code Block для поворота систем координат в зависимости от того, на какой стороне базовой линии они находятся. Добиться этого можно также с помощью последовательности из нескольких узлов, но в данном случае проще взять и написать код.

{% hint style="info" %}
Если вы еще не знакомы с элементами Code Block, см. раздел [8-1\_code-blocks-and-design-script](https://primer2.dynamobim.org/ru/8_coding_in_dynamo/8-1_code-blocks-and-design-script "mention").
{% endhint %}

### Создание вхождений блоков

Мы на финишной прямой. У нас есть вся необходимая информация для размещения вхождений блоков. Сначала необходимо получить нужные определения блоков из столбца *BlockName* в файле Excel.

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-249de556182f309946d599e62f54714b2e8686bc%2FRoads_CorridorBlockRefs_GetBlockDefinitions.png?alt=media" alt=""><figcaption><p>Получение необходимых определений блоков из документа</p></figcaption></figure>

Теперь все, что осталось сделать, — это создать вхождения блоков.

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-3a7a5f59a8128b97de3230fa5006c924b7b80136%2FRoads_CorridorBlockRefs_CreateBlockReferences.png?alt=media" alt=""><figcaption><p>Создание вхождений блоков в пространстве модели</p></figcaption></figure>

### Результат

При запуске графика в пространстве модели вдоль коридора должны отобразиться новые вхождения блоков. И вот что здорово: если выбран автоматический режим выполнения графика, то при внесении изменений в файл Excel вхождения блоков обновляются автоматически.

{% hint style="info" %}
Для получения подробностей о режимах выполнения графиков см. раздел [3\_user\_interface](https://primer2.dynamobim.org/ru/3_user_interface "mention").
{% endhint %}

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-98bbc4816018cf7cee6bacabe87c480a403cc0b8%2FRoads_CorridorBlockRefs_Excel.gif?alt=media" alt=""><figcaption><p>Обновление файла Excel и быстрое визуальное представление результатов в Civil 3D</p></figcaption></figure>

Ниже приведен пример запуска графика с помощью **проигрывателя Dynamo**.

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-c6559ed7f2c9c93dfb1ca141842c04b414a08e65%2FRoads_CorridorBlockRefs_Player%20(1).gif?alt=media" alt=""><figcaption><p>Запуск графика с помощью проигрывателя Dynamo и просмотр результатов в Civil 3D</p></figcaption></figure>

{% hint style="info" %}
Если вы еще не знакомы с проигрывателем Dynamo, см. раздел [dynamo-player](https://primer2.dynamobim.org/ru/dynamo-for-civil-3d/dynamo-player "mention").
{% endhint %}

> :tada: Миссия выполнена!

### Бонус: визуализация в Dynamo

Иногда может быть полезно визуализировать геометрию коридора в Dynamo для получения контекста. В этой модели тела коридора уже извлечены в пространство модели, поэтому перенесем их в Dynamo.

Однако нужно учесть еще кое-что. Тела относятся к довольно «тяжелому» типу геометрии. Это значит, что данная операция замедлит работу графика. Здесь нам бы пригодился механизм, позволяющий *выбрать*, должны тела отображаться или нет. Очевидное решение — просто отключить узел **Corridor.GetSolids**. Однако это приведет к отображению предупреждений для всех последующих узлов, что сделает просмотр неудобным. В данной ситуации идеальным решением будет узел **ScopeIf**.

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

> 1. Обратите внимание на серую полосу в нижней части узла **Object.Geometry**. Она означает, что предварительный просмотр узла отключен (его можно вызвать, щелкнув узел правой кнопкой мыши). Это позволяет узлу **GeometryColor.ByGeometryColor** избежать «конкуренции» с другой геометрией за приоритет отображения в фоновом просмотре.
> 2. По сути, узел **ScopeIf** позволяет выборочно запускать целую ветвь узлов. Если входной порт *test* получает значение false, то все узлы, подключенные к узлу **ScopeIf**, при запуске выполняться не будут.

Так выглядит результат в фоновом просмотре Dynamo.

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-23657306ebcf8021ced1345f603a8628eb840acd%2FRoads_CorridorBlockRefs_Dynamo.png?alt=media" alt=""><figcaption><p>Визуализация геометрии коридора в Dynamo</p></figcaption></figure>

## Идеи

Вот несколько вариантов того, как можно расширить возможности этого графика.

{% hint style="info" %}
Добавление столбца **rotation** в файл Excel и его использование для поворота систем координат.
{% endhint %}

{% hint style="info" %}
Добавление **значений смещения по горизонтали или по вертикали** в файл Excel, чтобы при необходимости осветительные столбы могли отклоняться от характерной линии коридора.
{% endhint %}

{% hint style="info" %}
Создание значений пикетов **непосредственно в Dynamo** (вместо использования файла Excel со значениями пикетов) на основе начального пикета и типового интервала.
{% endhint %}
