Найти тему

Создание макросов для Revit

Оглавление

Всем привет! В этом блоге я буду рассказывать о том, как создавать плагины для Autodesk Revit: находить решение через Revit Lookup, искать информацию на revitapidocs.com, как писать на языке C#, отлаживать код и другие интересные вещи.

Материал будет излагаться так, чтобы в нём не было доминирование теории, а можно было сразу решать простые практические задачи. Поэтому некоторые вещи могут быть неочевидными при первом прочтении, и вам потребуется погрузиться в тему, чтобы понять их (или прочесть мои будущие статьи).

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

Для повторения на практике того, что будет изложено в статье, вам потребуется установленный Revit. Я буду рассматривать всё на примере Revit 2023. Возможно, в более старых или новых версиях Revit API код будет чуть-чуть отличаться, но общие принципы будут одинаковыми, и, следуя им, вы сможете написать код в любой версии.

Запустим Autodesk Revit и откроем любой проект. Перейдём на вкладку Управление и запустим Диспетчер макросов:

Запуск Диспетчера макросов
Запуск Диспетчера макросов

Появится окно диспетчера, в нём создадим Модуль для Приложения (не для документа, это важно).

Создание нового модуля
Создание нового модуля

Revit задумается, и появится окно нового незнакомого приложения: SharpDevelop — поставляемая вместе с Revit интегрированная среда разработки (IDE). Мы пока не знаем, как именно создавать макрос внутри модуля, поэтому закроем SharpDevelop, и в окне Диспетчера макросов создадим новый макрос в нашем модуле:

Создание нового макроса в модуле
Создание нового макроса в модуле

Revit вновь запустит SharpDevelop, но теперь мы уже увидим в нём имя нашего макроса и выделенную фигурными скобками область для написания кода.

На самом деле, при создании модуля Revit создаёт файл с расширением *.cs, в котором хранятся макросы, и создаёт в нём класс ThisApplication и некоторые вспомогательные методы. При создании же макроса HelloMacro создаётся метод HelloMacro. Более подробно о классах и методах я расскажу в следующих статьях, но это обширная тема, и при первом знакомстве понять её будет сложно, да и не нужно. Пока условимся так: класс — некий абстрактный объект, обладающий свойствами, и умеющий выполнять действия. А методы класса — это и есть те действия, которые он может сделать. То есть при создании макроса появился метод, мы можем написать в нём код, и произойдёт какие-то действия

Наш первый макрос
Наш первый макрос

Теперь давайте напишем наш первый код. Что же будет делать наш макрос? Очень простую операцию: при запуске предлагать выбор элемента, а затем выводить окно с заголовком "Hello world" и Id элемента в теле окна.

Для начала работы введём 2 переменные: для текущего документа в пользовательском интерфейсе и просто для текущего документа. Как правило, при написании макросов всегда начинают с них, поэтому пока просто примем эти 2 строки кода как данность.

Важное примечание. Гораздо эффективнее писать код самостоятельно, чем копировать его. Это поможет вам и быстрее погрузиться в тему, и "набить руку", и привыкнуть к SharpDevelop — ведь он подсказывает вам возможные варианты продолжения, что упрощает написание кода.

Код:

UIDocument uidoc = this.ActiveUIDocument;
Document doc = uidoc.Document;

В языке C# объявление переменных происходит так:

Тип имя_переменной = /значение переменной/;. Что это означает: сначала мы пишем тип переменной (UIDocument), затем — выбранное имя (uidoc), затем — оператор присваивания (=), затем — значение, которое мы хотим записать (this.ActiveUIDocument). И в самом конце строки обязательно ставим точку с запятой (;).

Далее начнём писать сам код. Нам нужно, чтобы Revit предложил нам выбрать элемент. Но как это сделать? Зайдём на сайт со справкой по Revit API и посмотрим. В поле для поиска введём наш тип UIDocument и посмотрим, что он умеет:

Смело кликаем на первую подсказку и проваливаемся в класс UIDocument
Смело кликаем на первую подсказку и проваливаемся в класс UIDocument

Далее рассмотрим свойства этого класса. Нас интересует Selection (выбор).

Кликаем на свойство слева, а затем на Selection в описании. Попадаем в класс Selection
Кликаем на свойство слева, а затем на Selection в описании. Попадаем в класс Selection

И рассмотрим методы этого класса:

Методы класса Selection
Методы класса Selection

Кажется, то что надо. PickObject — выбрать объект. Давайте сделаем цепочку вызовов на переменной uidoc.

Коротко о том, как читать описание метода и что означают все эти слова:

Описание метода из API
Описание метода из API

public — публичный (общедоступный) метод

Reference — тип возвращаемого значения

ObjectType objectType и string statusPrompt — число и типы аргументов, которые мы передадим в наш метод. В данном случае первое слово — тип, второе — краткое описание. То есть мы передаём в метод Тип объекта и строку — то, что будет написано в строке состояния.

Код:

Reference myRef = uidoc.Selection.PickObject(ObjectType.Element,
"Выберите элемент для вывода его Id");

Опять же, пишем тип (Reference), затем имя переменной (myRef), знак присвоения, а дальше цепочка вызовов. У объекта uidoc вызываем свойство Selection, а у него — метод PickObject, которому передаём тип объекта (ObjectType.Element) и строку (обязательно в кавычках).

Отлично, мы получили Reference. Но как из него узнать элемент и его Id?

Теперь обратимся к классу Document и его свойствам и методам. Нас интересует метод GetElement(Reference), который даст нам элемент (класс Element), и свойство Id этого класса. Вы можете самостоятельно найти их на https://www.revitapidocs.com/2023, пользуясь вышеизложенным порядком действий.

Давайте реализуем в коде то, что мы нашли в API:

Element element = doc.GetElement(myRef);
ElementId id = element.Id;

То есть мы получили Element, зная Reference, а затем с этого элемента — его Id. Отлично, это то, что требовалось найти в задаче. Осталось только решить вопрос с выводом сообщения на экран.

Выводить сообщение мы будем с помощью класса TaskDialog. Также это можно сделать с помощью MessageBox, но мы воспользуемся первым, потому что он из RevitAPI, а MessageBox — системный.

Для вывода окна мы воспользуемся методом Show:

-9

Важное отличие этого метода — он статический (static). Главное отличие для нас сейчас — что для его вызова мы не создаём переменную, а обращаемся к самому классу по его названию.

Напишем следующий код:

TaskDialog.Show("Hello world!", id.ToString());

То есть мы тут не создаём переменную, а сразу пишем имя класса (TaskDialog), вызываем метод и передаём в него 2 строки. Поскольку Id элемента не является строкой, мы вызываем метод ToString() на нём.

Всё. Наш код написан. Компилируем его (СборкаСобрать решение):

-10

Если ошибок нет, то всё супер. Код можно запускать. Если ошибки есть (забыли скобку или точку с запятой), аккуратно посмотрите всё и исправьте их. На всякий случай, эталонный код:

public void HelloMacro()
{
UIDocument uidoc = this.ActiveUIDocument;
Document doc = uidoc.Document;
Reference myRef = uidoc.Selection.PickObject(ObjectType.Element, "Выберите элемент для вывода его Id");
Element element = doc.GetElement(myRef);
ElementId id = element.Id;
TaskDialog.Show("Hello world!", id.ToString());
}

Напоминаю, что гораздо эффективнее писать код самостоятельно, а не копировать.

Запуск макроса

Итак, мы всё написали и успешно скомпилировали. Закрываем или сворачиваем SharpDevelop, в Revit открываем Диспетчер макросов, выбираем наш Макрос и жмём "Выполнить". В строке состояния в левом нижнем углу появится фраза "Выберите элемент для вывода его Id", а Revit будет ожидать вашего выбора. Сделаем выбор:

Наш первый макрос успешно работает и приветствует мир
Наш первый макрос успешно работает и приветствует мир

Можете проверить результат встроенным средством Revit (УправлениеКод выбора при выделенном элементе).

Дополнительная информация

Чтобы хорошо писать код, надо знать не только частности работы с Revit и Revit API, но и хорошо знать язык C# хотя бы на базовом уровне. В этом блоге я буду писать в том числе и о языке C# и базовых конструкциях его синтаксиса, но лучшим вариантом будет прочитать о нём на специализированном сайте https://metanit.com/sharp/tutorial/ (Руководство большое, самые важные базовые вещи в первых 3 главах).

В следующей статье мы научимся устанавливать Visual Studio и создадим первой консольное приложение. Это будет большой шаг к созданию первого настоящего плагина для Revit.

Подписывайтесь на мой телеграм-канал. До новых встреч!

-12