RevitAPI: 如何获取MirrorElement函数镜像之后的结果元素
2015-01-21 12:33
507 查看
目前已经发布的Revit版本中(2015以及之前),有两个方法可以镜像元素,分别是:
ElementTransformUtils.MirrorElement和
ElementTransformUtils.MirrorElements
但问题是这两个方法都没有返回值,这就意味着我们无法直接获取镜像之后新元素。
这里我们可以通过变通的方法实现,就是利用Application.DocumentChanged事件。
大致流程如下:
注册Application.DocumentChanged事件
镜像元素
事件触发,在事件监听函数里面获取新创建的元素集合
示例代码,请注意这里DocumentChanged事件只有在Transaction被提交之后才能被触发:
如何使用该方法:
(下面的代码在一个FamilyInstance的原点附近镜像了它自己,并显示镜像产生的元素)
ElementTransformUtils.MirrorElement和
ElementTransformUtils.MirrorElements
但问题是这两个方法都没有返回值,这就意味着我们无法直接获取镜像之后新元素。
这里我们可以通过变通的方法实现,就是利用Application.DocumentChanged事件。
大致流程如下:
注册Application.DocumentChanged事件
镜像元素
事件触发,在事件监听函数里面获取新创建的元素集合
示例代码,请注意这里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 + " ")); }
相关文章推荐
- Revit API元素镜像MirrorElement
- 如何用Revit API获取Conduit、FlexPipe的类型
- RevitAPI: 如何获取点云PointCloud数据?
- RevitAPI: 如何从FamilyInstance获取所在的开关系统(Switch System)
- 如何用Revit API 在Revit的模型中获取轮廓族的截面信息
- RevitAPI: 如何获取可以被明细表过滤器ScheduleFilter使用的参数Parameter?
- Revit中如何通过API获取对象的位置坐标和旋转角度
- 如何在java中获取线程异步执行之后的结果
- RevitAPI: 如何获取图纸中视口的位置
- RevitAPI: 如何获取RevitLinkInstance链接模型的位置?
- 用Revit API 如何获取工作集的名称
- RevitAPI: 如何获取某个材质参数?
- 如何获取页面中的元素(比如username,password,age,birthday,times,url,ps)
- 如何获取paypal的API用户名、密码和签名
- JAVA 如何获取Vector变量中指定位置的元素
- WordPress初级教程-25: 如何获取Wordpress.com API Key
- 模态对话框如何在DOModal() == IDOK之后获取该对话框的内容
- 当webbrowser页面元素菜没有id和name时如何获取元素
- Gallery图片库获取到图片之后如何通过Uri获取到片图路径
- 黄聪:如何获取Akismet API Key