ADN Open CIS
Сообщество программистов Autodesk в СНГ

10/03/2015

Пример использования метода PostRequestForElementTypePlacement

Метод NewFamilyInstance предоставляет возможность программно создать новый экземпляр семейства в проекте или вложенный экземпляр семейства в редакторе семейств.

Но он совсем не поддерживает какие-либо взаимодействие с пользователем.

Небольшое взаимодействие с пользователем появилось в методе PromptForFamilyInstancePlacement, который был представлен в Revit 2011 API.

По крайней мере он показывает пред просмотр экземпляра семейства и предлагает пользователю выбрать месторасположение экземпляра.

Множество примеров использования этого метода было уже представлено. Последний из них - Прерывание вставки экземпляра семейства.

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

В Revit 2015 API был представлен новый метод – PostRequestForElementTypePlacement. Метод предоставляет полный доступ взаимодействия с пользователем.

Еще одно интересное обсуждение на форуме Revit API – параметр изменение месторасположения элемента для метода PromptForFamilyInstancePlacement – также содержит пример кода по использованию метода PostRequestForElementTypePlacement.

Использование метода очень простое, так как надстройка просит Revit сделать всю работу без участия API.

Все что нужно – это передать ElementType того элемента, который вы хотите вставить в интерфейс:

Код - C#: [Выделить]
  1. [Transaction( TransactionMode.Manual )]
  2. class CmdPostRequestInstancePlacement : IExternalCommand
  3. {
  4.   public Result Execute(
  5.     ExternalCommandData commandData,
  6.     ref string message,
  7.     ElementSet elements )
  8.   {
  9.     UIApplication uiapp = commandData.Application;
  10.     UIDocument uidoc = uiapp.ActiveUIDocument;
  11.     Document doc = uidoc.Document;
  12.  
  13.     ElementType elementType
  14.       = new FilteredElementCollector( doc )
  15.         .OfCategory( BuiltInCategory.OST_Walls )
  16.         .OfClass( typeof( ElementType ) )
  17.         .FirstElement() as ElementType;
  18.  
  19.     uidoc.PostRequestForElementTypePlacement(
  20.       elementType );
  21.  
  22.     return Result.Succeeded;
  23.   }
  24. }

Вызов метода не нужно заключать в транзакцию.

Однако, если вы попытаетесь вызвать этот метод в команде, помеченной атрибутом [Transaction(TransactionMode.ReadOnly)], то получите исключение:

 

Я реализовал этот пример в примерах The Building Coder. Команда CmdPostRequestInstancePlacement.

Источник: http://thebuildingcoder.typepad.com/blog/2015/03/postrequestforelementtypeplacement.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=1918

Опубликовано 10.03.2015