Запуск команды из закрепляемой панели
Обсудим проблему, с которой ко мне часто обращаются: как взаимодействовать с документом Revit из закрепляемой панели.
Создание пользовательской закрепляемой панели с помощью API появилось в Revit 2014. В примерах, поставляемых вместе с Revit SDK, есть проект, демонстрирующий работу с такой панелью. Также я писал статью об этом.
Фактически, закрепляемая панель является немодальной формой. И так как панель активна все время, то выполняя какой-либо код в этой панели вы не находитесь в контексте выполнения внешней команды и тем более не находитесь в контексте Revit API.
В основном мне задают вот такие вопросы:
Вопрос 1: Возможно я что-то пропустил, но как я могу вызвать внешнюю команду из закрепляемого окна? Я так полагаю это возможно, да?
Ответ: Нет. Смотрите ниже.
Вопрос 2: Я создал собственную закрепляемую панель. В ней я загружаю данные в таблицу из внешнего источника и отображаю информацию в дереве. Здесь проблем нет.
Сейчас я хочу добавить на эту панель кнопку, при нажатии на которую мне нужно получить выделенный элемент и присоединить его к одному из веток дерева. Фактически я хочу записать некие данные из ветки дерева в общий параметр выделенного элемента.
Я реализовал код для определения необходимой ветки дерева.
Но, я так и не могу понять, как мне добраться до активного документа в обработчике нажатия этой кнопки? Я делаю что-то не так? Вообще это возможно?
Ответ: Как я выше заметил, закрепляемая панель имеет похожее поведение с немодальной формой, которая в свою очередь похожа на внешнее приложение Windows: оно не зарегистрировано в Revit API, Revit ничего не подозревает о его существовании и вы можете сделать с этим окном ровно столько же сколько и с внешним приложением.
API Revit не предоставляет прямой доступ к приложению Revit, за исключением валидного контекста Revit, коим является обработчик внешней команды и события Revit API. В основном, Revit API основан исключительно на методах обратного вызова. API не поддерживает вызов из внешних приложений.
Так как закрепляемая панель является немодальной формой, то не существует валидного контекста Revit из которого можно было бы обращаться к API. Вы можете подписаться на событие Idling чтобы получить доступ к валидному контексту. В примере SDK про закрепляемую панель это продемонстрировано.
Таким образом, обходным путем можно достичь требуемого результата, что уже не раз было описано.
Наиболее привлекательным примером может послужить мой облачный редактор 2D – модели.
Вот еще несколько похожих тем (на англ.)
- Display real-time interactive element properties
- Behind the scenes of the NBS Revit add-in
- Controlling Revit from modeless dialogues
- Batch mode data extraction
Для более полной информации ищите в блоге следующие категории:
Обсуждение: http://adn-cis.org/forum/index.php?topic=222
Опубликовано 21.09.2013