Revit二开之管道翻弯

前言:本次分享适合刚入门二开的小白学习,管道翻弯功能,是个很好的学习素材,代码里面有注释,使用简单的代码实现功能简单易懂,直接上代码。

  public class DoubleCurved : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            try
            {
                UIApplication uiapp = commandData.Application;
                UIDocument uidoc = uiapp.ActiveUIDocument;
                Document doc = uiapp.ActiveUIDocument.Document;
                Selection sel = uidoc.Selection;

                double h = 500;

                Reference reference = sel.PickObject(ObjectType.PointOnElement, "请选择第一个翻弯点");

                //选择Pipe上的第一个点(GlobalPoint获取点击的点)
                var reffirstpoint = reference.GlobalPoint;
                var mepcurev = doc.GetElement(reference) as MEPCurve;
                var Pickmep0locationCurve1 = (mepcurev.Location as LocationCurve).Curve as Line;//获取管线的LocationCurve
                Pickmep0locationCurve1.MakeUnbound();//将管线变成射线
                var proj0 = Pickmep0locationCurve1.Project(reffirstpoint).XYZPoint;//将点投影到射线上获取该点的坐标

                //选择Pipe上的第二个点
                reference = sel.PickObject(ObjectType.PointOnElement, "请选择第二个翻弯点");
                var refsecondpoint = reference.GlobalPoint;
                var proj1 = Pickmep0locationCurve1.Project(refsecondpoint).XYZPoint;//将点投影到射线上获取该点的坐标

                //生成管道线
                var stratpoint = (mepcurev.Location as LocationCurve).Curve.GetEndPoint(0);
                var endpoint = (mepcurev.Location as LocationCurve).Curve.GetEndPoint(1);
                var line1point = Nearpoint(proj0,stratpoint, endpoint);//比较开始点和刚点的两边
                var line2point = Nearpoint(proj1, stratpoint, endpoint );

                //5根管的LocationCurve
                var line1 = Line.CreateBound(proj0, line1point);//第一根管的LocationCurve
                var UPline2 = Line.CreateBound(proj0, new XYZ(proj0.X, proj0.Y, proj0.Z + h / 304.8));//第二根管的LocationCurve(翻弯侧管)

                var line3 = Line.CreateBound(new XYZ(proj0.X, proj0.Y, proj0.Z + h / 304.8), new XYZ(proj1.X, proj1.Y, proj1.Z + h / 304.8));//第三根管的LocationCurve(翻弯管)

                var UPline4 = Line.CreateBound(proj1, new XYZ(proj1.X, proj1.Y, proj1.Z + h / 304.8));//第四根管的LocationCurve(翻弯侧管)
                var line5 = Line.CreateBound(proj1, line2point);//第五根管的LocationCurve

                Transaction tr = new Transaction(doc);
                tr.Start("一键翻弯");
                //复制管道
                var newmepcurev1 = doc.GetElement(ElementTransformUtils.CopyElement(doc, mepcurev.Id, new XYZ(0, 0, 0)).FirstOrDefault()) as MEPCurve;
                var newmepcurev2 = doc.GetElement(ElementTransformUtils.CopyElement(doc, mepcurev.Id, new XYZ(0, 0, 0)).FirstOrDefault()) as MEPCurve;
                var newmepcurev3 = doc.GetElement(ElementTransformUtils.CopyElement(doc, mepcurev.Id, new XYZ(0, 0, 0)).FirstOrDefault()) as MEPCurve;
                var newmepcurev4 = doc.GetElement(ElementTransformUtils.CopyElement(doc, mepcurev.Id, new XYZ(0, 0, 0)).FirstOrDefault()) as MEPCurve;
                var newmepcurev5 = doc.GetElement(ElementTransformUtils.CopyElement(doc, mepcurev.Id, new XYZ(0, 0, 0)).FirstOrDefault()) as MEPCurve;

                //变换管道LocationCurve
                (newmepcurev1.Location as LocationCurve).Curve = line1;
                (newmepcurev2.Location as LocationCurve).Curve = UPline2;
                (newmepcurev3.Location as LocationCurve).Curve = line3;
                (newmepcurev4.Location as LocationCurve).Curve = UPline4;
                (newmepcurev5.Location as LocationCurve).Curve = line5;
                //生成管件
                TwoMEPCurveCeateElbow(doc, newmepcurev1, newmepcurev2);
                TwoMEPCurveCeateElbow(doc, newmepcurev2, newmepcurev3);
                TwoMEPCurveCeateElbow(doc, newmepcurev3, newmepcurev4);
                TwoMEPCurveCeateElbow(doc, newmepcurev4, newmepcurev5);

                doc.Delete(mepcurev.Id);//删除原来的管道
                tr.Commit();

            }
            catch (Autodesk.Revit.Exceptions.OperationCanceledException)
            {
                

            }
            return Result.Succeeded;
        }
//方法
        public static XYZ Nearpoint(XYZ pickpoint, XYZ firpiont, XYZ secpoint)
        {

            if (firpiont.DistanceTo(pickpoint) > secpoint.DistanceTo(pickpoint))
            {
                return secpoint;
            }
            else
            {
                return firpiont;
            }

        }
        public static void TwoMEPCurveCeateElbow(Document doc, MEPCurve pipecurve1, MEPCurve pipecurve2)
        {
            double mindistance = double.MaxValue;
            Connector connector1, connector2;
            connector1 = null;
            connector2 = null;
            foreach (Connector con1 in pipecurve1.ConnectorManager.Connectors)
            {
                foreach (Connector con2 in pipecurve2.ConnectorManager.Connectors)
                {
                    var dis = con1.Origin.DistanceTo(con2.Origin);
                    if (dis < mindistance)
                    {
                        mindistance = dis;
                        connector1 = con1;
                        connector2 = con2;
                    }
                }
            }

            if (connector1 != null && connector2 != null)
            {
                doc.Create.NewElbowFitting(connector1, connector2);
            }
        }
    }

分享一个自制Revit插件,本人是个BIM工程师,该插件是根据自己做工程一些经验和对插件功能的频繁度,自己整合开发功能,初衷是提高效率。
目前MagicTools的功能包括通用功能、土建、机电、审图、出图功能。还有好多功能都想做,如果有好的需求也可以提,后续有新增继续增加上去,努力弄个实用的插件,希望能帮到真正有需要的BIMer。
如有需要的可以加企鹅群:630552940

插件下载地址,免费试用
链接:https://pan.baidu.com/s/1GDnHeWwZ5r_HrnT3Mo7twA?pwd=jhlt
提取码:jhlt

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值