MEP 系统遍历 - 找不到 BaseEquipment 或 Openconnector

问题描述 投票:0回答:3

简介

我正在开发一个项目,需要从起始机械设备遍历 MEPSystem 中的所有元素。我发现 Jeremy Tammik 的以下两篇文章提出了一种方法:

  1. 遍历并导出所有MEP系统图
  2. 分层 JSON 图中的 MEP 系统结构

我在这篇文章中找到的 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;
}

其他有用的资源:

revit-api autodesk
3个回答
1
投票

我最初试图弄清楚为什么 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;
            }
        }
    }
// ...

0
投票

嘿 Gangula(和 Jeremy)我看到了这篇文章,并对通过破坏找到的第一个 MechanicalEquipment 元素来设置起始元素节点的建议解决方案感到好奇。我认为,对于根设备而言,与风机盘管或紫外线滤水器等内联或终端设备相比,人们更喜欢空气处理机组或冷水机等源设备。也许需要一些额外的逻辑来从设备连接器中找出FlowDirMEPSystemClassification与基础设备相对应,例如AHU SupplyAir 连接器只能 FlowDir = Out,ReturnAir 连接器只能 FlowDir = In。下游风机盘管的情况则相反。

如果任何机械设备就足够了,那么也许任何元素也可以,因为无论如何你都会失去“基本”设备因素?


-1
投票

看起来很专业,希望以后能和你们合作我们的MEP项目,我们有一些项目涉及到。 https://www.roterair.com/cooling-heating.html

© www.soinside.com 2019 - 2024. All rights reserved.