我正在开发一个项目,需要从起始机械设备遍历 MEPSystem 中的所有元素。我发现 Jeremy Tammik 的以下两篇文章提出了一种方法:
我在这篇文章中找到的 GitHub 存储库中的 TraverseAllSystems 的参考资料之一,发现版本 2017.0.0.8 最适合我的需要,能够以结构化 json 格式提供数据,如下所示:
MEP系统JSON格式!{
"id": 392200,
"name": "Mitered Elbows / Taps",
"children": [
{
"id": 392203,
"name": "Standard",
"children": [
{
"id": 392199,
"name": "Mitered Elbows / Taps",
"children": [
{
"id": 386552,
"name": "450 x 200",
"children": []
},
{
"id": 386555,
"name": "450 x 200",
"children": []
}
]
}
]
}
]
}
现在的问题是,这似乎在 Autodesk 提供的 Revit 示例模型 中运行良好。但是当我在我的项目中尝试这个时,我发现它按预期工作。
m_system.BaseEquipment
类中的 openConnector
和 TraversalTree.cs
都返回 null,这就是代码中断的地方,因为它无法找到起始元素这是机械设备。有谁知道为什么会发生这种情况以及如何解决这个问题?
下面是导致此问题的相应代码的起始部分:
破坏的代码m_system.BaseEquipment
private TreeNode GetStartingElementNode()
{
TreeNode startingElementNode = null;
FamilyInstance equipment = m_system.BaseEquipment; // returns null
// ...
打开连接器
private Element GetOwnerOfOpenConnector()
{
Element element = null;
//
// Get an element from the system's terminals
ElementSet elements = m_system.Elements;
foreach (Element ele in elements)
{
element = ele;
break;
}
// Get the open connector recursively
Connector openConnector = GetOpenConnector(element, null); // returns null
return null != openConnector
? openConnector.Owner
: null;
}
我最初试图弄清楚为什么 Jeremy 的代码不起作用,因为我坚信 Jeremy 已经解决了他的算法中的所有可能情况。
但是在花了一些时间进行调试之后,我想尝试是否可以进行一些更改以使其正常工作。我进行了以下更改,并且能够使代码按预期工作。
我不确定这是否会导致将来出现任何可能的不一致,但这解决了我的问题:
private TreeNode GetStartingElementNode()
{
TreeNode startingElementNode = null;
FamilyInstance equipment = m_system.BaseEquipment;
// added the below if condition to look for Mechanical Equipment in the system elements
if (equipment == null)
{
foreach (FamilyInstance element in m_system.Elements)
{
if (element.MEPModel is MechanicalEquipment)
{
equipment = element;
break;
}
}
}
// ...
嘿 Gangula(和 Jeremy)我看到了这篇文章,并对通过破坏找到的第一个 MechanicalEquipment 元素来设置起始元素节点的建议解决方案感到好奇。我认为,对于根设备而言,与风机盘管或紫外线滤水器等内联或终端设备相比,人们更喜欢空气处理机组或冷水机等源设备。也许需要一些额外的逻辑来从设备连接器中找出FlowDir和MEPSystemClassification与基础设备相对应,例如AHU SupplyAir 连接器只能 FlowDir = Out,ReturnAir 连接器只能 FlowDir = In。下游风机盘管的情况则相反。
如果任何机械设备就足够了,那么也许任何元素也可以,因为无论如何你都会失去“基本”设备因素?
看起来很专业,希望以后能和你们合作我们的MEP项目,我们有一些项目涉及到。 https://www.roterair.com/cooling-heating.html