Revit二次开发之移动元素【比目鱼原创】
来源:互联网 发布:sai绘画软件怎么画线 编辑:程序博客网 时间:2024/05/22 02:08
API提供了移动元素的方法,可以把一个或者几个元素从一个地方移动到另一个地方,
① 移动方法不能远离标高向上或者向下移动一个基于标髙的元素。也就是说,当元素是基于标髙的,则不能改变Z轴坐标值,但可以移动元素到同一标高内的任意位置。例如, 如果在坐标点(0, 0, 0)新创建了一个柱子,然后移动它到新的坐标点(10, 20, 30),这个柱 子将会移动到(10, 20, 0),而不是(10, 20, 30)。
② 当移动一个元素的时候,其他的元素也许会跟着移动。例如,如果—个墙上有窗户,这个墙移动了,窗户也会跟着移动。移动元素集的方法也会出现这种情况。例如,移动几根柱子的时候,所有与柱子连接着的梁也会跟着被移动或者会被改变长度。
③ 如果元素被钉住,即Pinned属性返回值是true,则表明这个元素不能被移动。如果仍然使用MoveEIement方法来移动这个元素,API就会抛出InvalidOperationException提示用户不能移动被钉住的元素。
只外,还可以通过Location类来移动一个元素。Location类提供了移动和旋转的方法,而其子类提供了更多的Location信息和属性控制,如LocationPoint类和 locationCurve类。如果一个元素的Location可以转型为LocationCurve或者 LocationPoint,就可以直接移动这根线或者点到新的坐标点了。
Curve属性可以用来移动基于曲线的元素到精确的坐标点。 墙、梁、支撑等都通常用这个属性改变元素的长度。
示例代码:
Revit API提供ElementTransformUtils类下的
MoveElement(Document document, ElementId elementToMove, XYZ translation)
以及MoveElements(Document document, ICollection<ElementId> elementsToMove, XYZ translation)
使用起来比较简单,但是有几个需要注意的地方:
① 移动方法不能远离标高向上或者向下移动一个基于标髙的元素。也就是说,当元素是基于标髙的,则不能改变Z轴坐标值,但可以移动元素到同一标高内的任意位置。例如, 如果在坐标点(0, 0, 0)新创建了一个柱子,然后移动它到新的坐标点(10, 20, 30),这个柱 子将会移动到(10, 20, 0),而不是(10, 20, 30)。
② 当移动一个元素的时候,其他的元素也许会跟着移动。例如,如果—个墙上有窗户,这个墙移动了,窗户也会跟着移动。移动元素集的方法也会出现这种情况。例如,移动几根柱子的时候,所有与柱子连接着的梁也会跟着被移动或者会被改变长度。
③ 如果元素被钉住,即Pinned属性返回值是true,则表明这个元素不能被移动。如果仍然使用MoveEIement方法来移动这个元素,API就会抛出InvalidOperationException提示用户不能移动被钉住的元素。
只外,还可以通过Location类来移动一个元素。Location类提供了移动和旋转的方法,而其子类提供了更多的Location信息和属性控制,如LocationPoint类和 locationCurve类。如果一个元素的Location可以转型为LocationCurve或者 LocationPoint,就可以直接移动这根线或者点到新的坐标点了。
Wall wall = element as Wall; if (null != wall) { LocationCurve wallLine = wall.Location as LocationCurve; XYZ newPlace = new XYZ(10, 20, 0); wallLine.Move(newPlace); }
上面的方法中,向量 (10, 20, 0)并不是目标坐标值, 而是一个偏移向量。
另外,LocationCurve 的 Curve 属性或者 LocationPoint 的Point属性也可以用来移动一个元素。Curve属性可以用来移动基于曲线的元素到精确的坐标点。 墙、梁、支撑等都通常用这个属性改变元素的长度。
示例代码:
using(Transaction tran = new Transaction(projectDoc, "Change the wall's curve with a new location line.")) { tran.Start(); LocationCurve wallLine = wall.Location as LocationCurve; XYZ p1 = XYZ.Zero; XYZ p2 = new XYZ(10, 20, 0); Line newWallLine = Line.CreateBound(p1, p2); // 把墙的位置线换成新的线 wallLine.Curve = newWallLine; tran.Commit(); }
利用LocationPoint的Point属性,可以设置元素的物理位置,如:
FamilyInstance column = element as FamilyInstance; if (null != column) { LocationPoint columnPoint = column.Location as LocationPoint; XYZ newLocation = new XYZ(10, 20, 0); // 移动柱子到新的位置(10,20,0) columnPoint.Point = newLocation; }
=========【更多高级应用请关注公众号】========
===================================
阅读全文
0 0
- Revit二次开发之移动元素【比目鱼原创】
- Revit二次开发之如何选取Revit元素【比目鱼原创】
- Revit二次开发之创建斑马线【比目鱼原创】
- Revit二次开发之Revit事务模式(TransactionMode)【比目鱼原创】
- Revit二次开发之使用LINQ查询元素过滤集合里的元素【比目鱼原创】
- Revit二次开发之关于外部命令IExternalCommand【比目鱼原创】
- Revit二次开发之Journal日志文档【比目鱼原创】
- Revit二次开发之快速过滤与慢速过滤【比目鱼原创】
- Revit二次开发之材料Material的设置【比目鱼原创】
- Revit二次开发之获取参数绑定的类别【比目鱼原创】
- Revit二次开发之创建共享参数及绑定共享参数【比目鱼原创】
- Revit二次开发之外部应用IExternalApplications和数据库级别的外部应用【比目鱼原创】
- Revit二次开发之如何在addin文件定制资源【比目鱼原创】
- Revit二次开发之创建双坡式屋顶及在屋顶开洞口【比目鱼原创】
- Revit API之Document与UIDocument的深入理解【比目鱼原创】
- Revit API之如何创建梯形墙及带正反面的墙【比目鱼原创】
- Revit API之在墙或者屋顶上开洞口【比目鱼原创】
- Revit二次开发之入门
- OpenMP并行加速
- 基于ubuntu16.04搭建Devstack
- golang中make和new的区别
- 多包问题
- 1359: [Baltic209]Candy
- Revit二次开发之移动元素【比目鱼原创】
- [c# WinForm]往ListView中添加大量的不同图标
- Python系统学习系列——linux读书笔记(1)
- 网络编程-python
- 【Android】标题栏和其他控件更改颜色
- 清空购物车的人可能不是你 彻底解决session丢失的问题
- 图解人工智能大数据的保障基石——自动化运维
- 归并排序
- 负载均衡的算法