Revit二次开发 管道弯头、三通、四通的生成代码

    技术2022-07-10  184

    原文链接: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();                 }             }         }     }

     

    Processed: 0.055, SQL: 9