RevitAPI: 如何获取MirrorElement函数镜像之后的结果元素

目前已经发布的Revit版本中(2015以及之前),有两个方法可以镜像元素,分别是:

ElementTransformUtils.MirrorElement和

ElementTransformUtils.MirrorElements

但问题是这两个方法都没有返回值,这就意味着我们无法直接获取镜像之后新元素。

这里我们可以通过变通的方法实现,就是利用Application.DocumentChanged事件。

大致流程如下:

  1. 注册Application.DocumentChanged事件
  2. 镜像元素
  3. 事件触发,在事件监听函数里面获取新创建的元素集合

示例代码,请注意这里DocumentChanged事件只有在Transaction被提交之后才能被触发:

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;
}

如何使用该方法:

(下面的代码在一个FamilyInstance的原点附近镜像了它自己,并显示镜像产生的元素)

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 + " "));
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值