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

25/01/2015

Как получить зеркальный объект после применения метода ElementTransformUtils.MirrorElement

Для получения симметричного объекта в Revit API есть два метода:

  • ElementTransformUtils.MirrorElement
  • ElementTransformUtils.MirrorElements

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

Но, есть способ, как все же этот объект можно получить при помощи события Application.DocumentChanged.

Алгоритм таков:

Подписываемся на событие Application.DocumentChanged

Делаем зеркальный объект

Возникает событие и в обработчике события мы получаем добавленные элементы.

Пример кода. Помните, что событие возникает только после подтверждения транзакции.

Код - C#: [Выделить]
  1. public static ICollection<ElementId> MirrorElement(
  2.     Document doc, ElementId elementId, Plane plane)
  3. {
  4.     if (doc == null || plane == null ||
  5.         elementId == ElementId.InvalidElementId ||
  6.         !ElementTransformUtils.CanMirrorElement(doc, elementId))
  7.         throw new ArgumentException("Argument invalid");
  8.  
  9.     ICollection<ElementId> result = new List<ElementId>();
  10.     // создаем обработчик события
  11.     var documentChangedHandler =
  12.         new EventHandler<DocumentChangedEventArgs>(
  13.             (sender, args) => result = args.GetAddedElementIds());
  14.  
  15.     // подписываемся на событие
  16.     doc.Application.DocumentChanged += documentChangedHandler;
  17.     using (Transaction transaction = new Transaction(doc))
  18.     {
  19.         try
  20.         {
  21.             transaction.Start("Mirror");
  22.             ElementTransformUtils.MirrorElement(
  23.             doc, elementId, plane);
  24.             transaction.Commit();
  25.         }
  26.         catch (Exception ex)
  27.         {
  28.             TaskDialog.Show("ERROR", ex.ToString());
  29.             transaction.RollBack();
  30.         }
  31.  
  32.         finally
  33.         {
  34.             // Отписываемся от события
  35.             doc.Application.DocumentChanged -= documentChangedHandler;
  36.         }
  37.     }
  38.     return result;
  39. }

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

Код - C#: [Выделить]
  1. var instance = RevitDoc.GetElement(elementId) as FamilyInstance;
  2. if (instance != null)
  3. {
  4.     var transform = instance.GetTransform();
  5.     var mirrored = MirrorElement(RevitDoc, instance.Id,
  6.         new Plane(transform.BasisX, transform.Origin));
  7.     TaskDialog.Show("Инфо", "Создание зеркальных копий прошло успешно. Идентфикаторы созданных элементов: "
  8.         + mirrored.Aggregate("", (ss, id) => ss + id + " "));
  9. }

Источник: http://adndevblog.typepad.com/aec/2015/01/revitapi-how-to-get-mirrored-result-after-calling-elementtransformutilsmirrorelement.html

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

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