revit二次开发三通及四通完美思路

当进行管道生成的时候,发现二次开发基本教程中仅有弯头的示例,于是我补充上三通与四通的生成示例。

弯头的生成最简单,书中有教程,且弯头的生成对于角度的要求较低。

using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

[Transaction(TransactionMode.Manual)]
    class NewElbow : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIApplication uiApp = commandData.Application;
            Document doc = uiApp.ActiveUIDocument.Document;
            Selection sel = uiApp.ActiveUIDocument.Selection;

            //选取两个管
            var reference1 = sel.PickObject(ObjectType.Element, "请选择第1个管");
            MEPCurve duct1 = doc.GetElement(reference1) as MEPCurve;

            var reference2 = sel.PickObject(ObjectType.Element, "请选择第2个管");
            MEPCurve duct2 = doc.GetElement(reference2) as MEPCurve;

            //弯头
            ConnectTwoDuctsWithElbow(doc, duct1, duct2);

            return Result.Succeeded;
        }
        /// <summary>
        /// 连接管道
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="duct1"></param>
        /// <param name="duct2"></param>
        public static void ConnectTwoDuctsWithElbow(Document doc, MEPCurve duct1, MEPCurve duct2)
        {
            double minDistance = double.MaxValue;
            Connector connector1, connector2;
            connector1 = connector2 = null;

            foreach (Connector con1 in duct1.ConnectorManager.Connectors)
            {
                foreach (Connector con2 in duct2.ConnectorManager.Connectors)
                {
                    var dis = con1.Origin.DistanceTo(con2.Origin);
                    if (dis < minDistance)
                    {
                        minDistance = dis;
                        connector1 = con1;
                        connector2 = con2;
                    }

                }
            }

            if (connector1 != null && connector2 != null)
            {
                using (Transaction tran = new Transaction(doc))
                {
                    tran.Start("1033067630");

                    var elbow = doc.Create.NewElbowFitting(connector1, connector2);

                    tran.Commit();
                }
            }
        }
    }

接下是三通,三通最需要注意的事角度!!角度!!角度!!,第二根管应该垂直于第一根管,不能超出1°!极为严格!

还有主次顺序问题。如用三通保温球阀则需要采用以下方案

[Transaction(TransactionMode.Manual)]
    class NewTeeFitting : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {

            UIApplication uiApp = commandData.Application;
            Document doc = uiApp.ActiveUIDocument.Document;
            Selection sel = uiApp.ActiveUIDocument.Selection;

            //选取两个管道
            var reference1 = sel.PickObject(ObjectType.Element, "请选择第1个管");
            MEPCurve duct1 = doc.GetElement(reference1) as MEPCurve;

            var reference2 = sel.PickObject(ObjectType.Element, "请选择第2个管");
            MEPCurve duct2 = doc.GetElement(reference2) as MEPCurve;


            Curve curve1 = (doc.GetElement(reference1).Location as LocationCurve).Curve;

            Curve curve2 = (doc.GetElement(reference2).Location as LocationCurve).Curve;

            var ductList = GetMainDuct(duct1, duct2);

            MEPCurve MainDuct = ductList[0];//the main Pipe
            MEPCurve LessDuct = ductList[1];// the minor Pipe

            MEPCurve duct3 = null;//the main pipe

            IntersectionResultArray intersectPoint = new IntersectionResultArray();

            var x = curve1.Intersect(curve2, out intersectPoint);

            if (x == SetComparisonResult.Overlap)
            {
                using (Transaction tran = new Transaction(doc))
                {
                    tran.Start("1033067630");

                    var OrginPoint = intersectPoint.get_Item(0).XYZPoint;

                    var elementId = PlumbingUtils.BreakCurve(doc, MainDuct.Id, OrginPoint);

                    duct3 = doc.GetElement(elementId) as MEPCurve;

                    tran.Commit();
                }
            }


            ConnectTwoDuctsWithElbow(doc, MainDuct, duct3, LessDuct);

            return Result.Succeeded;
        }

        /// <summary>
        /// 区分主要管道与次要管道
        /// </summary>
        /// <param name="duct1"></param>
        /// <param name="duct2"></param>
        /// <returns></returns>
        public static List<MEPCurve> GetMainDuct(MEPCurve duct1, MEPCurve duct2)
        {
            List<MEPCurve> mEPCurves = new List<MEPCurve>();

            Curve curve1 = (duct1.Location as LocationCurve).Curve;
            Curve curve2 = (duct2.Location as LocationCurve).Curve;

            List<double> disList = new List<double>();
            double dis = double.MaxValue;
            XYZ pointA1 = curve1.GetEndPoint(0);
            XYZ pointA2 = curve1.GetEndPoint(1);
            XYZ pointB1 = curve2.GetEndPoint(0);
            XYZ pointB2 = curve2.GetEndPoint(1);

            var distance1 = curve2.Distance(pointA1);
            var distance2 = curve2.Distance(pointA2);
            var distance3 = curve1.Distance(pointB1);
            var distance4 = curve1.Distance(pointB2);

            disList.Add(distance1);
            disList.Add(distance2);
            disList.Add(distance3);
            disList.Add(distance4);

            dis = disList.Min();
            var x = disList.IndexOf(dis);

            if (x < 2)
            {
                mEPCurves.Add(duct2);
                mEPCurves.Add(duct1);
                return mEPCurves;
            }
            else
            {
                mEPCurves.Add(duct1);
                mEPCurves.Add(duct2);
                return mEPCurves;
            }


        }

        /// <summary>
        /// 创建连接
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="duct1">主要管道1</param>
        /// <param name="duct2">主要管道2</param>
        /// <param name="duct3">次要管道</param>
        public static void ConnectTwoDuctsWithElbow(Document doc, MEPCurve duct1, MEPCurve duct2, MEPCurve duct3)
        {
            double minDistance = double.MaxValue;
            Connector connector1, connector2, connector3;
            connector1 = connector2 = connector3 = null;

            foreach (Connector con1 in duct1.ConnectorManager.Connectors)
            {
                foreach (Connector con2 in duct2.ConnectorManager.Connectors)
                {
                    var dis = con1.Origin.DistanceTo(con2.Origin);
                    if (dis < minDistance)
                    {
                        minDistance = dis;
                        connector1 = con1;
                        connector2 = con2;
                    }

                }
            }

            minDistance = double.MaxValue;//重置
            foreach (Connector con3 in duct3.ConnectorManager.Connectors)
            {
                var dis = con3.Origin.DistanceTo(connector1.Origin);
                if (dis < minDistance)
                {
                    minDistance = dis;
                    connector3 = con3;
                }
            }


            if (connector1 != null && connector2 != null && connector3 != null)
            {
                using (Transaction tran = new Transaction(doc))
                {
                    tran.Start("xx");

                    var elbow = doc.Create.NewTeeFitting(connector1, connector2, connector3);

                    tran.Commit();
                }
            }
        }
    }

最后就是4通,依旧是角度问题要注意,且连接器内参数,第一个和第二个参数共线,第三个和第四个参数共线(即在同一根线上)

[Transaction(TransactionMode.Manual)]
    class NewCross : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            MEPCurve duct3, duct4;
            duct3 = duct4 = null;
            UIApplication uiApp = commandData.Application;
            Document doc = uiApp.ActiveUIDocument.Document;
            Selection sel = uiApp.ActiveUIDocument.Selection;

            //选取两个风管
            var reference1 = sel.PickObject(ObjectType.Element, "请选择第1个风管");
            MEPCurve duct1 = doc.GetElement(reference1) as MEPCurve;

            var reference2 = sel.PickObject(ObjectType.Element, "请选择第2个风管");
            MEPCurve duct2 = doc.GetElement(reference2) as MEPCurve;

            Curve curve1 = (doc.GetElement(reference1).Location as LocationCurve).Curve;

            Curve curve2 = (doc.GetElement(reference2).Location as LocationCurve).Curve;

            IntersectionResultArray intersectPoint = new IntersectionResultArray();

            var x = curve1.Intersect(curve2, out intersectPoint);

            if (x == SetComparisonResult.Overlap)
            {
                using (Transaction tran = new Transaction(doc))
                {
                    tran.Start("x");

                    var OrginPoint = intersectPoint.get_Item(0).XYZPoint;

                    var elementId3 = PlumbingUtils.BreakCurve(doc, duct1.Id, OrginPoint);

                    duct3 = doc.GetElement(elementId3) as MEPCurve;//duct1 and duct3 in one line 

                    var elementId4 = PlumbingUtils.BreakCurve(doc, duct2.Id, OrginPoint);

                    duct4 = doc.GetElement(elementId4) as MEPCurve;//duct2 and duct4 in one line

                    tran.Commit();
                }
            }

            ConnectTwoDuctsWithElbow(doc, duct1, duct3, duct2, duct4);//四通

            return Result.Succeeded;
        }
        /// <summary>
        /// 创建连接,四通前2个共线,后2个共线
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="duct1"></param>
        /// <param name="duct2"></param>
        /// <param name="duct3"></param>
        public static void ConnectTwoDuctsWithElbow(Document doc, MEPCurve duct1, MEPCurve duct2, MEPCurve duct3, MEPCurve duct4)
        {
            double minDistance = double.MaxValue;
            Connector connector1, connector2, connector3, connector4;
            connector1 = connector2 = connector3 = connector4 = null;

            foreach (Connector con1 in duct1.ConnectorManager.Connectors)
            {
                foreach (Connector con2 in duct2.ConnectorManager.Connectors)
                {
                    var dis = con1.Origin.DistanceTo(con2.Origin);
                    if (dis < minDistance)
                    {
                        minDistance = dis;
                        connector1 = con1;
                        connector2 = con2;
                    }

                }
            }

            minDistance = double.MaxValue;//重置
            foreach (Connector con3 in duct3.ConnectorManager.Connectors)
            {
                var dis = con3.Origin.DistanceTo(connector1.Origin);
                if (dis < minDistance)
                {
                    minDistance = dis;
                    connector3 = con3;
                }
            }

            minDistance = double.MaxValue;//重置
            foreach (Connector con4 in duct4.ConnectorManager.Connectors)
            {
                var dis = con4.Origin.DistanceTo(connector1.Origin);
                if (dis < minDistance)
                {
                    minDistance = dis;
                    connector4 = con4;
                }
            }


            if (connector1 != null && connector2 != null && connector3 != null && connector4 != null)
            {
                using (Transaction tran = new Transaction(doc))
                {
                    tran.Start("xx");

                    var elbow = doc.Create.NewCrossFitting(connector1, connector2, connector3, connector4);

                    tran.Commit();
                }
            }
        }
    }
相关博文:三通结构思路

BQ44F-BQ45F三通保温球阀
Q944F-Q945F电动三通球阀
Q644F-Q645F气动三通球阀
Q44F-Q45F不锈钢三通球阀
Q14F-Q15F三通内螺纹球阀
Q44H-Q44YQ45H-Q45Y硬密封三通球阀
Q44F-Q45F三通四密封球阀



猜你喜欢

转载自www.cnblogs.com/sktvalves/p/10974881.html