Revit二次开发-平行管道

在调管综的过程中,模型往往有些管道不平行,导致尺寸定位不了,所以在此做一个管道平行的功能。一键将管道平行,代码如下:

	       UIApplication uiapp = commandData.Application;
	                UIDocument uidoc = uiapp.ActiveUIDocument;
	                Document doc = uidoc.Document;
	                Selection sel = uidoc.Selection;
	          
	            try
	            {
	                var elems = sel.PickObjects(ObjectType.Element);
	            
	                var elem = sel.PickObject(ObjectType.Element).GetElement(doc) as MEPCurve;
	                //平行管道
	                Transaction tr = new Transaction(doc, "Create beam");
	                tr.Start();
	                foreach (var item in elems)
	                {
	                    var elem2 = item.GetElement(doc) as MEPCurve;
	              
	                    var LocaCurve = elem.LocationLine().xyComponent();
	                    LocaCurve.MakeUnbound();
	
	                    var starpoint = elem2.LocationLine().StartPoint()
	                    .xyComponent().ProjectToXLine(LocaCurve);
	                    var endpoint = elem2.LocationLine().EndPoint()
	                    .xyComponent().ProjectToXLine(LocaCurve);
	
	                    var originaldis = getHorizontalDis(elem2, elem);
	                    var transline = Line.CreateBound(starpoint, endpoint);
	                    var offsetCurve = transline.CreateOffset(originaldis, XYZ.BasisZ);
	
	                    (elem2.Location as LocationCurve).Curve = offsetCurve;
	                }
	                tr.Commit();
	
	            }
	            catch (Exception e)
	            {
	                MessageBox.Show(e.ToString());
	            
	            }
	            return Result.Succeeded;
    double getHorizontalDis(MEPCurve mep, MEPCurve mep2)
        {
            var line1 = mep.LocationLine().xyComponent();
            var line2 = mep2.LocationLine().xyComponent();
            var origin = line1.StartPoint();
            var originprojectonline2 = origin.ProjectToXLine(line2);
            var dir = originprojectonline2 - origin;
            var horizontaldir = dir.xyComponent();
            return horizontaldir.GetLength();
        }
          public static Line xyComponent(this Line line)
        {
            var startpoint = line.GetEndPoint(0);
           
            var endpoint = line.GetEndPoint(1);
            var p0 = new XYZ(startpoint.X, startpoint.Y, 0);
            var p1 = new XYZ(endpoint.X, endpoint.Y, 0);
           return  Line.CreateBound(p0, p1);
        }


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值