Часто задаваемые вопросы: макросы Revit

В данном разделе даны ответы на часто задаваемые вопросы о макросах Revit.

Вопрос Ответ
Я полагал, что созданный макрос появится в систематизированном по категориям списке Диспетчера макросов, но это не так. Почему? Для отображения нового макроса в окне "Диспетчер макросов" проект этого макроса должен быть предварительно скомпонован в Revit macro IDE (с помощью меню "Сборка").
Требуется ли добавлять файлы RevitAPI.dll и RevitAPIUI.dll в качестве ссылок при создании новой макрокоманды? Нет. Добавлять ссылки на файлы RevitAPI.dll и RevitAPIUI не требуется, так как эта операция выполняется автоматически. В проекте макросов Revit обе ссылки являются обязательными. Удаление этих ссылок в IDE приводит к сбою при выполнении макрокоманд Revit.

См. раздел Восстановление файлов RevitAPI.dll и RevitAPIUI.dll.

Требуется ли редактировать файлы Revit.ini? Нет. Макросы Revit автоматически регистрируются и отображаются в диспетчере макросов без изменения системных данных.
Я удалил макрос в Revit macro IDE путем удаления его метода в файле This*.cs или This*.vb. Однако имя удаленного макроса все еще присутствует в систематизированном по категориям списке Диспетчера макросов при его повторном открытии. Как убрать имя из списка? Необходимо выполнить компоновку отредактированного проекта, после чего Диспетчер макросов распознает удаление.
В чем состоят различия между макросами уровня приложения и уровня документа? Макросы уровня приложения могут выполняться во всех открытых проектах Revit в рамках одного экземпляра (сеанса) приложения Revit. Проекты макросов уровня документа хранятся в файле RVT. Они могут загружаться и выполняться в текущем активном документе.
Как обратиться к объекту Application или эквиваленту externalCommandData? Все макрокоманды уровня приложения связаны с объектом UIApplication. В макрокомандах уровня приложения ключевое слово Application, которое служит указателем в C# и VB.NET, возвращает объект API Application.

В макрокомандах уровня документа ключевое слово Document возвращает объект-документ API. Для доступа к объекту UIApplication из макрокоманды уровня документа используется код this.Application.

Что следует включать в методы запуска и останова: Module_Startup и Module_Shutdown?

Метод Module_Startup вызывается при загрузке модуля, а метод Module_Shutdown — при выгрузке модуля.

Для модулей макрокоманд уровня приложения метод Module_Startup вызывается при запуске Revit, а метод Module_Shutdown — при завершении работы Revit.

Для модулей макрокоманд уровня документа метод Module Startup вызывается при открытии проекта Revit, а метод Module_Shutdown — при закрытии документа проекта.

Модули Module_Startup и Module_Shutdown вызываются также при повторной компоновке проекта макрокоманды.

Вы можете добавлять свой инициализирующий текст в методы Module_Startup и выполнять некоторую "зачистку" в методах Module_Shutdown. Например, можно регистрировать обработчики событий при запуске и отменять регистрацию обработчиков при останове (это рекомендуемый способ).

Как и почему следует регистрировать и отменять регистрацию обработчика событий Revit? Как говорилось выше, в Revit IDE рекомендуется регистрировать обработчики событий в методе *_Startup и отменять их регистрацию в методе *_Shutdown. Каждый макрос будет загружаться и выгружаться в динамическом режиме. При отладке макроса, если отмена регистрации обработчика событий выполнена неверно, Revit может вызвать ошибочный метод (возможно, по ошибочному адресу памяти). Хотя Revit IDE может предотвратить аварийный останов работы Revit по такому сценарию, любые обработчики событий, отмена регистрации для которых была выполнена некорректно, могут вызвать неполадки, связанные с производительностью, в текущем сеансе Revit.
В моем макросе имеется диалоговое окно, которое работает некорректно и приводит к проблемам с Revit. Немодальные диалоговые окна, работающие за пределами текущего ответного вызова к API, могут вызывать проблемы. Рекомендуется избегать таких ответных вызовов во избежание нестабильности Revit.
Мне хотелось бы поэкспериментировать с методами запуска и останова и обработчиком событий. Можно ли увидеть соответствующий пример? В приведенном ниже образце программного текста показано, как зарегистрировать обработчик события OnDocumentNewed, который будет автоматически выводить окно сообщения при создании нового проекта Revit. Примечание. Один из образцов макросов, входящий в пакет Revit SDK, может служить примером запуска и останова обработчика событий на уровне документа. В данном разделе представлены примеры обработчика событий уровня приложения.

Следует учитывать, что доступ ко всем событиям API из Revit IDE возможен в версии 2011. События, относящиеся к более ранним версиям по сравнению с 2011, удалены. В следующих примерах показаны новые события.

Почему макросы, созданные в Python, больше не работают? Для созданных в Python макросах требуется платформа .NET Framework 3.5. Она не устанавливается по умолчанию. Установите .NET Framework 3.5 вручную для запуска макросов Python.

Пример на языке C#, уровень приложения:

private void Module_Startup(object sender, EventArgs e)
{
   this.Application.DocumentOpened
      += new EventHandler<Autodesk.Revit.DB.Events.DocumentOpenedEventArgs>(Application_DocumentOpened);
}

private void Module_Shutdown(object sender, EventArgs e)
{
   this.Application.DocumentOpened
      -= new EventHandler<Autodesk.Revit.DB.Events.DocumentOpenedEventArgs>(Application_DocumentOpened); 
}

void Application_DocumentOpened(object sender, Autodesk.Revit.DB.Events.DocumentOpenedEventArgs e)
{ 
   System.Windows.Forms.MessageBox.Show("message here");
}

Пример на языке VB.NET, уровень приложения:

Private
Sub Module_Startup(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Me.Startup
AddHandler Me.OnDocumentNewed,
AddressOf Me.ThisApplication_OnDocumentNewed
End SubPrivate Sub Module_Shutdown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shutdown
RemoveHandler Me.OnDocumentNewed,
AddressOf Me.ThisApplication_OnDocumentNewed
End SubPrivate Sub ThisApplication_OnDocumentNewed(ByVal document As Autodesk.Revit.Document)
System.Windows.Forms.MessageBox.Show("VB.NET
Application event OnDocumentNewed")
End Sub