Всем привет! Сегодня решил написать небольшую статью, которая постоянным читателям моего блога покажется простой и очевидной, но может быть полезна начинающим, а также тем, кто только наткнулся на мой блог. Сегодня мы разберём создание стен с помощью Revit API. Поехали!
Поиск решения
Как обычно, пойдём на наш любимый revitapidocs.com и найдём класс Wall. Посмотрим его методы и сразу найдём метод Create. Отлично, то что нам нужно. Кстати, этот метод статический, что это значит, можно прочесть вот здесь.
У данного метода есть 5 разных перегрузок. Посмотрим их описание и сделаем вывод, что нам пока нужна обычная стена с прямоугольным профилем — построение стен со сложным профилем это более сложная и редкая задача, так что, если вам это потребуется, придётся разобраться самостоятельно.
В чём разница между этими методами? В первом случае мы передаём 3 аргумента и получаем стену с дефолтным типом по заданной траектории. Во втором случае мы передаём 8 аргументов, и так же определяем тип стены, базовый уровень, высоту, и будет ли стена развёрнутой (Flipped) — аналогично нажатию пробела при выделенной стены.
На самом деле, особой разницы то и нет. Мы получаем стену и можем после этого задавать ей все параметры, которые захотим (очевидно, там куда больше опций, чем 8). Но иногда удобнее сразу указать тип стены и высоту, чем назначать их дополнительно, поэтому мы рассмотрим перегрузку метода с восемью аргументами.
Получение аргументов
Нам нужно получить тип стены, Id базового уровня и линию, вдоль которой пройдёт стена.
В данном случае я решу задачи в общем виде, без привязки к конкретному случаю. Мы возьмём первый уровень проекта, тип стены с заранее известным именем и, для разнообразия и усложнения, сделаем стену по дуге, предложив пользователю задать 3 точки.
Код у меня получился вот такой (в конце приложу ссылку на гитхаб):
Давайте разберём по порядку:
- на строке 24 я вызываю метод DrawArcWall, который написан ниже.
- на строках 34-36 я беру первый уровень проекта с помощью FilteredElementCollector (подробнее здесь).
- На строках 39-41 я получаю тип стены с именем "Витраж" с помощью того же FilteredElementCollector и LINQ-запроса
- на строках 43-45 я предлагаю пользователю указать 3 точки.
- И на 52 строке я наконец создаю стену. Я задал ей высоту 3000 и смещение 200 простым, но неправильным способом. А как правильно преобразовывать единицы измерения, читайте тут.
Результат:
Странно, дуга какая-то.. не дуга. Поменяем настройки типа у витража:
Витраж автоматически разбился на участки длиной 1500, и что мы имеем:
Всё работает так, как задумано!
Итоговый код можно посмотреть по ссылке на мой гитхаб-репозиторий. Не забывайте ставить ему звёздочки — мне будет приятно.
А на этом на сегодня всё. Напоминаю про свой телеграм-канал о Revit API, обязательно заходите и подписывайтесь, если ещё не сделали этого. До новых встреч!