# Размещение коммуникаций

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

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

## Цель

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

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

> * Использование узла **Select Object** для ввода данных пользователем
> * Работа с системами координат
> * Использование геометрических операций, таких как **Geometry.DistanceTo** и **Geometry.ClosestPointTo**
> * Создание вхождений блоков
> * Управление параметрами привязки объектов

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

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

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

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

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

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

## Решение

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

> 1. Получение геометрии кривой для распределительной магистрали.
> 2. Получение геометрии кривой для выбранной пользователем линии участка (при необходимости с обращением ее направления).
> 3. Создание точек вставки для счетчиков
> 4. Получение точек на распределительной магистрали, ближайших к местоположениям счетчиков
> 5. Создание вхождений блоков и линий в пространстве модели

Приступим!

### Получение геометрии распределительной магистрали

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

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

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-d69da1e6af1779066a06c12b3819db8d4fbf239b%2FLand_ServicePlacement_DistributionMain%20(1).png?alt=media" alt=""><figcaption><p>Объединение объектов из Civil 3D в одну сложную кривую</p></figcaption></figure>

### Получение геометрии линии участка

Теперь необходимо перенести геометрию выбранной линии участка в Dynamo, чтобы с ней можно было работать. Для этого нам понадобится узел **Select Object**, с помощью которого пользователь график может выбрать определенный объект в Civil 3D.

Нам также необходимо решить одну потенциальную проблему. Линия участка имеет начальную и конечную точки, а это значит, что у нее есть направление. Чтобы график давал последовательные результаты, все линии участка должны иметь одинаковое направление. Это условие можно задать непосредственно в логике графика, что сделает наш график более стабильным.

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-92d8ca834425f6bd1b44df75cbdf0b2d3571ab60%2FLand_ServicePlacement_Selection%20(2).png?alt=media" alt=""><figcaption><p>Выбор линии участка и проверка ее направления</p></figcaption></figure>

> 1. Получаем начальную и конечную точки линии участка.
> 2. Измеряем расстояние от каждой точки до распределительной магистрали, а затем определяем, какое расстояние больше.
> 3. Нужно, чтобы начальная точка линии находилась ближе к распределительной магистрали. Если это не так, требуется обратить направление линии участка. Если все правильно, то мы просто возвращаем исходную линию участка.

### Создание точек вставки

Теперь нужно решить, где будут размещены счетчики. Обычно их расположение определяется местными органами власти, поэтому мы просто укажем входные значения, которые можно изменить в соответствии с теми или иными условиями. В качестве основы для создания точек используем **систему координат**, расположенную вдоль линии участка. Это позволит с легкостью определить смещения относительно линии участка независимо от ее ориентации.

{% 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="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-e041a918b4a572a8476559151515a466240404ff%2FLand_ServicePlacement_InsertionPoints.png?alt=media" alt=""><figcaption><p>Создание точек вставки для счетчиков</p></figcaption></figure>

### Получение точек подключения

Теперь нужно получить точки на распределительной магистрали, которые находятся ближе всего к счетчикам. Это позволит нам нарисовать линии подключения в пространстве модели так, чтобы они всегда были перпендикулярны к распределительной магистрали. Для этого идеально подойдет узел **Geometry.ClosestPointTo**.

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

> 1. Сложная кривая распределительной магистрали.
> 2. Точки вставки счетчиков.

### Создание объектов

Наконец, последний шаг — создание объектов в пространстве модели. Сначала мы используем созданные ранее точки вставки для создания вхождений блоков, а затем — точки на распределительной магистрали для построения линий подключения коммуникаций.

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

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

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

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-3c5cbbd7d2026d408854cd0c10f8470bfff5d933%2FLand_ServicePlacement_Dynamo%20(1).gif?alt=media" alt=""><figcaption><p>Регулировка входных параметров в Dynamo и немедленное отображение результатов в Civil 3D</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-7e423b8cf54b9ad8fc40ba5408c7dc30b3cde56d%2FLand_ServicePlacement_Binding.gif?alt=media" alt=""><figcaption><p>Поведение при включенной привязке объекта</p></figcaption></figure>

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

<figure><img src="https://2422276774-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Frrl0CzV5yPtxYRNkwD4h%2Fuploads%2Fgit-blob-b41e6469b325266db6a00a4ba79687691d922a5f%2FLand_ServicePlacement_BindingSettings.png?alt=media" alt=""><figcaption><p>Параметры привязки объекта Dynamo</p></figcaption></figure>

{% hint style="info" %}
Дополнительные сведения см. в разделе \[object-binding.md]\(../../advanced-topics/object-binding.md "mention").
{% endhint %}

Изменив этот параметр, мы заставляем программу Dynamo «забывать» объекты, создаваемые при каждом запуске графика. Ниже приведен пример запуска графика с отключенной привязкой объектов в **проигрывателе Dynamo**.

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

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

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

## Идеи

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

{% hint style="info" %}
Размещение \*\*нескольких подключений к коммуникациям\*\* одновременно вместо выбора каждой линии участка по отдельности.
{% endhint %}

{% hint style="info" %}
Изменение входных данных, чтобы вместо водопроводных счетчиков были размещены \*\*прочистные люки канализации\*\*.
{% endhint %}

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