Как получить зеркальный объект после применения метода ElementTransformUtils.MirrorElement
Для получения симметричного объекта в Revit API есть два метода:
- ElementTransformUtils.MirrorElement
- ElementTransformUtils.MirrorElements
Проблема в том, что эти методы не возвращают какое-либо значение. А это значит, что на прямую мы не можем получить результат, т.е. объект, полученный в результате зеркального отображение исходного объекта.
Но, есть способ, как все же этот объект можно получить при помощи события Application.DocumentChanged.
Алгоритм таков:
Подписываемся на событие Application.DocumentChanged
Делаем зеркальный объект
Возникает событие и в обработчике события мы получаем добавленные элементы.
Пример кода. Помните, что событие возникает только после подтверждения транзакции.
- public static ICollection<ElementId> MirrorElement(
- Document doc, ElementId elementId, Plane plane)
- {
- if (doc == null || plane == null ||
- elementId == ElementId.InvalidElementId ||
- !ElementTransformUtils.CanMirrorElement(doc, elementId))
- throw new ArgumentException("Argument invalid");
- ICollection<ElementId> result = new List<ElementId>();
- // создаем обработчик события
- var documentChangedHandler =
- new EventHandler<DocumentChangedEventArgs>(
- (sender, args) => result = args.GetAddedElementIds());
- // подписываемся на событие
- doc.Application.DocumentChanged += documentChangedHandler;
- using (Transaction transaction = new Transaction(doc))
- {
- try
- {
- transaction.Start("Mirror");
- ElementTransformUtils.MirrorElement(
- doc, elementId, plane);
- transaction.Commit();
- }
- catch (Exception ex)
- {
- TaskDialog.Show("ERROR", ex.ToString());
- transaction.RollBack();
- }
- finally
- {
- // Отписываемся от события
- doc.Application.DocumentChanged -= documentChangedHandler;
- }
- }
- return result;
- }
Использовать метод очень просто. Вот пример кода как можно создать зеркальную копию экземпляра семейства возле самого себя и отобразить список созданных элементов.
- var instance = RevitDoc.GetElement(elementId) as FamilyInstance;
- if (instance != null)
- {
- var transform = instance.GetTransform();
- var mirrored = MirrorElement(RevitDoc, instance.Id,
- new Plane(transform.BasisX, transform.Origin));
- TaskDialog.Show("Инфо", "Создание зеркальных копий прошло успешно. Идентфикаторы созданных элементов: "
- + mirrored.Aggregate("", (ss, id) => ss + id + " "));
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=1798
Опубликовано 25.01.2015