在Revit二次开发中,相较于土建模块多出了管道系统模块,每个机电管件与管道之间连接由Connector控制,从而将整个管道系统串联起来 如果在LookUp中点开管道可以看到分为ConnectorManagement 与 All Refs两个类,之中都存储了Connector,刚接触的人可能会觉得比较乱
///<summary> /// 将会过滤指定喷淋下的管道及遇到的第一个三通或弯头 ///<remarks>获取弯头连接的第二道管道的向量值作为旋转轴 /// 喷淋系统中将会只有管道与Instance类型,instance包括管件与喷头</remarks> ///</summary> publicvoidGetConnectors(Element fit, MepNode node) { bool baseIterator = true; //1.进入Management获得Set ConnectorSet set = new ConnectorSet(); if (fit is FamilyInstance ins) { //fitting set = ins.MEPModel.ConnectorManager.Connectors; } else { var pipe = fit as Pipe; set = pipe?.ConnectorManager.Connectors; var lc = pipe.Location as LocationCurve; var dir = (lc.Curve as Line).Direction; if (node.Vector isnull) node.Vector = dir; if (node.Vector.DotProduct(dir) < 0.002) { _pipe = pipe; baseIterator = false; } }
if (baseIterator) { node.Next = new MepNode(fit); node.Next.Vector = node.Vector; //在此例中除了喷淋都会有两个Connector指向连接的两端 //如果只有一个入口,另一个则指向管道系统 foreach (var s inset) { var connector = s as Connector; //排除是管道系统的情况 //此时查找与喷淋底部Connector连接的Connector var allRefs = connector.AllRefs; foreach (var allRef in allRefs) { var rf = allRef as Connector; var ele = rf.Owner; if (ele.Id != fit.Id && ele.GetType() != typeof(PipingSystem)) { node.Next.Connectors.Add(rf); if (node.Instance isnull) { GetConnectors(ele, node.Next); } else { if (rf.Owner.Id == node.Instance.Id) continue; GetConnectors(ele, node.Next); } } }