在Revit在二次开发中,管道系统模块多于土建模块,每个机电管件与管道之间的连接由Connector控制将整个管道系统串联起来 如果在LookUp可以看到中点管可以分为ConnectorManagement 与 All Refs两个类都存储在里面Connector,刚接触的人可能会觉得很乱
如果我们从喷淋开始依次查询所有的交叉管道,我们可以得到每个管道Connector的All Refs进入Connector之后获取Owner然后进入相应的构件Management从而获得所有构件连接器。 简单来说All Refs存储外部连接器,即与管道相连的管件信息,Management存储本身Connector根据设置的数量而有所不同。
如果是终端关键,点击All Refs将会由两个Connector其中一个方向Piping System筛选中需要排除。
/// <summary> /// 它将过滤指定喷雾下的管道和第一个三通或弯头 /// <remarks>弯头连接的第二管的向量值作为旋转轴 /// 喷淋系统中只有管道和Instance类型,instance包括管件和喷嘴</remarks> /// </summary> public void GetConnectors(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 is null) 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 in set) { 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 is null) { GetConnectors(ele, node.Next); } else { if (rf.Owner.Id == node.Instance.Id) continue; GetConnectors(ele, node.Next); } } } } } }