> For the complete documentation index, see [llms.txt](https://primer2.dynamobim.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://primer2.dynamobim.org/ru/dynamo-for-civil-3d/sample-workflows/roads/light-pole-placement.md).

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

<figure><img src="/files/ttGFh3IMWzZY1hl3CEVe" 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="/files/MC64CpqZLqIE85oKiVQC" %}

{% file src="/files/ntjZG1p2F3rf8kAS54I2" %}

{% file src="/files/EfG5rkqZWXGNu65CTePA" %}

## Решение

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

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

Приступим!

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

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

<figure><img src="/files/aS5vDnolmwNrolvMEesz" alt=""><figcaption><p>Структура таблицы в файле Excel</p></figcaption></figure>

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

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

<figure><img src="/files/qzNLISO8KoKa2igxX5q0" 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]\(../../../5\\\_essential\\\_nodes\\\_and\\\_concepts/5-5\\\_dictionaries-in-dynamo/ "mention").
{% endhint %}

<figure><img src="/files/BvP7V1QbGNRHCcJX3BF1" alt=""><figcaption><p>Преобразование данных Excel в словарь</p></figcaption></figure>

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

<figure><img src="/files/gzJUJ6M7EXC8NTq5hRmw" alt=""><figcaption><p>Получение данных из словаря</p></figcaption></figure>

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

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

<figure><img src="/files/weYPJNYYPOanocNL1o1q" alt=""><figcaption></figcaption></figure>

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

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

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

{% hint style="info" %}
Если вы еще не знакомы с системами координат, см. раздел \[2-vectors.md]\(../../../5\\\_essential\\\_nodes\\\_and\\\_concepts/5-2\\\_geometry-for-computational-design/2-vectors.md "mention").
{% endhint %}

<figure><img src="/files/lkKnoaDdh77oRk1l5SKH" alt=""><figcaption><p>Получение систем координат, расположенных вдоль характерных линий коридора</p></figcaption></figure>

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

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

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

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

<figure><img src="/files/gPOeGKo4uYgIMz6kOOSd" alt=""><figcaption><p>Получение необходимых определений блоков из документа</p></figcaption></figure>

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

<figure><img src="/files/41f53vlZKoZK4mzc8ZBl" alt=""><figcaption><p>Создание вхождений блоков в пространстве модели</p></figcaption></figure>

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

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

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

<figure><img src="/files/XKIwW2tYnsyaWioYmHhn" alt=""><figcaption><p>Обновление файла Excel и быстрое визуальное представление результатов в Civil 3D</p></figcaption></figure>

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

<figure><img src="/files/ttGFh3IMWzZY1hl3CEVe" alt=""><figcaption><p>Запуск графика с помощью проигрывателя Dynamo и просмотр результатов в Civil 3D</p></figcaption></figure>

{% hint style="info" %}
Если вы еще не знакомы с проигрывателем Dynamo, см. раздел \[dynamo-player.md]\(../../dynamo-player.md "mention").
{% endhint %}

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

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

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

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

<figure><img src="/files/bmED36WiJRpSoluz8y4B" alt=""><figcaption></figcaption></figure>

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

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

<figure><img src="/files/rEQwfYVTaIpf2UdDwoKS" alt=""><figcaption><p>Визуализация геометрии коридора в Dynamo</p></figcaption></figure>

## Идеи

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

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

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

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