转载请复制以下信息:
原文链接: http://blog.csdn.net/joexiongjin/article/details/8124489
作者: 叶雄进 , Autodesk ADN
接到一个朋友的关于修改管道角度的咨询 Q: 管道的端点偏移都是只读的,有没有更改管道坡度的API?如果有,是什么;如果没有,有什么办法解决一下吗?谢谢。
关于修改Revit中条状对象的空间位置,这个是非常常用。比如修改墙的一个端点的位置,修改梁的倾斜角度,这几个修改条状对象位置的解决方案具有类似性。今天在这里统一谈谈 大家可能很容易看到这些对象的位置都是通过Element.Location 来获取。如果是条状对象,如墙,梁,管道,我们可以把结果值强制转化为LocationCurve对象。从LocationCurve对象,我们可以获取其定位曲线 Curve dingweiXian = LocationCurve.Curve; 从Curve中可以获取其端点坐标XYZ的值。 比如: XYZ prStart = dingweiXian.get_EndPoint(0); XYZ ptEnd = dingweiXian.get_EndPoint(1);
这样接获得了墙,梁或管道对象的端点坐标。
但是大家可以发现,EndPoint属性只读的,那也就是意味着我们无法通过EndPoint属性来修改dingweiXian的端点坐标值。这就是本文开头问题的困惑。那我们到底如何修改其端点坐标呢?这个确实有点不好发现解决方案,也是为什么写本文的原因。 如果你仔细阅读RevitAPI.chm文档,你会发现LocationCurve.Curve 属性是可读写的,借此我们可以给管道重新赋值一个新的Curve对象来实现对管道的端点坐标进行修改。只需重新生成一个Curve,然后赋值给墙,梁或管道的LocationCurve 对象即可实现对他们的端点进行修改的目的。
实现过程请看下面的代码来修改管道的一个端点出的高度,实现修改管道倾斜角度。对于墙和梁的修改可以用同样的步骤。
- [csharp] view plaincopy
- Selection sel = app.ActiveUIDocument.Selection ;
- Reference ref1 = sel.PickObject(ObjectType.Element,"please pick a pipe");
- Element elem = doc.GetElement(ref1);
- Pipe pipe = elem as Pipe;
-
- LocationCurve locCurve = pipe.Location as LocationCurve;
-
- Transaction trans = new Transaction(doc);
- trans.Start("changePipeEnd");
- Line line = locCurve.Curve as Line;
-
- XYZ ptStart =line.get_EndPoint(0);
- XYZ ptEnd = line.get_EndPoint(1);
-
- XYZ newEnd = new XYZ(ptEnd.X,ptEnd.Y, ptEnd.Z + 2); //抬高2
-
- Line newLine = this.Application.Create.NewLineBound(ptStart,newEnd);
-
- locCurve.Curve = newLine;
-
- trans.Commit();
复制代码
|