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