Revit二次開發 管道彎頭、三通、四通的生成代碼

原文鏈接:https://blog.csdn.net/qq_39412924/article/details/83110866

當進行管道生成的時候,發現二次開發基本教程中僅有彎頭的示例,於是我補充上三通與四通的生成示例。

彎頭的生成最簡單,書中有教程,且彎頭的生成對於角度的要求較低。

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();
                }
            }
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章