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