By Aaron Lu
In current Revit (2015 and before), there are 2 methods to mirror elements, they are:
ElementTransformUtils.MirrorElement and
ElementTransformUtils.MirrorElements
But the problem is they don’t have return value, meaning we can get the mirrored element(s) directly.
However, there is a workaround to accomplish that using Application.DocumentChanged event.
Workflow:
- Subscribe Application.DocumentChanged event
- Mirror element(s)
- event raises, in the event handler, get the added new element(s)
Example Code, please note the DocumentChanged event can only be raised after the transaction is committed.
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>();
// create DocumentChanged event handler
var documentChangedHandler =
new EventHandler<DocumentChangedEventArgs>(
(sender, args) => result = args.GetAddedElementIds());
// subscribe the event
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
{
// unsubscribe the event
doc.Application.DocumentChanged -= documentChangedHandler;
}
}
return result;
}
How to use this function
(Following code is to mirror a FamilyInstance near itself, and then display the id(s) of the mirrored elements)
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("Info", "Mirror succeeded! New mirrored ids: "
+ mirrored.Aggregate("", (ss, id) => ss + id + " "));
}

Leave a Reply