做喷淋时,绘制喷头连接管道的时候,使用Revit自带的功能,必须一个个进行连接,机械且耗时:
先将开发思路分析一下:
- 拾取一个管道;
- 框选多个喷头;
- 遍历喷头,连接到管道;
a. 取得喷头到管道的投影点;
b. 在投影点处将管道打断;
c. 在碰头连接件与投影点处创建管道,并得到管道的另一连接件;
d. 断开处的两个连接件及c中的到的连接件创建三通
该功能编写过程中最主要的打断管道功能,第一个喷头求投影点直接使用拾取的管道的中心线即可,
但是从第二个喷头开始,管段不在是一条,需要找到点到线最近的那个投影点及管段;
下面是断开管道的方法:
Dictionary<ElementId, Pipe> pipeDic = new Dictionary<ElementId, Pipe>();//使用字典放置所有断开的管段
private List<Connector> BreakPipe(Pipe pipe, XYZ point)
{
pipeDic.Remove(pipe.Id);
Pipe copyPipe = null;
Curve curve = (pipe.Location as LocationCurve).Curve;
List<Connector> conns = new List<Connector>();
using (Transaction trans = new Transaction(doc))
{
trans.Start("Break Pipe");
Curve newCurve1 = Line.CreateBound(curve.GetEndPoint(0), point);
Curve newCurve2 = Line.CreateBound(point, curve.GetEndPoint(1));
copyPipe = doc.GetElement(ElementTransformUtils.CopyElement(doc, pipe.Id, new XYZ(0, 0, 0)).ElementAt(0)) as Pipe;
(pipe.Location as LocationCurve).Curve = newCurve1;
(copyPipe.Location as LocationCurve).Curve = newCurve2;
trans.Commit();
}
pipeDic.Add(pipe.Id, pipe);
pipeDic.Add(copyPipe.Id, copyPipe);
Connector connector1 = null, connector2 = null;
double minDis = double.MaxValue;
foreach (Connector conn1 in pipe.ConnectorManager.Connectors)
{
foreach (Connector conn2 in copyPipe.ConnectorManager.Connectors)
{
double dis = conn1.Origin.DistanceTo(conn2.Origin);
if (dis < minDis)
{
minDis = dis;
connector1 = conn1;
connector2 = conn2;
}
}
}
conns.Add(connector1);
conns.Add(connector2);
return conns;
}