Revit二次开发——多个喷头连接管道

做喷淋时,绘制喷头连接管道的时候,使用Revit自带的功能,必须一个个进行连接,机械且耗时:
先将开发思路分析一下:

  1. 拾取一个管道;
  2. 框选多个喷头;
  3. 遍历喷头,连接到管道;
    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;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值