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

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

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

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

## Решение

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

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

Приступим!

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

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

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

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

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

<figure><img src="/files/DI0BI4LZsgi4b97VosXd" 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" %}
Если вы еще не знакомы со словарями, см. раздел [Словари в Dynamo](/ru/5_essential_nodes_and_concepts/5-5_dictionaries-in-dynamo.md).
{% endhint %}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

## Идеи

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

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

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://primer2.dynamobim.org/ru/dynamo-for-civil-3d/sample-workflows/roads/light-pole-placement.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
