【问题标题】:Getting wall brutto area in Revit API在 Revit API 中获取墙布鲁托区域
【发布时间】:2013-01-25 22:19:30
【问题描述】:

我正在尝试使用 Revit API 获取墙布鲁托区域。然而,我得到的唯一东西是 netto 区域。

我正在使用删除墙并还原更改以确定放置在墙上的所有元素的方法。然后,我从 ElementSet 中删除墙的 id,在变量中获取 HOST_AREA_COMPUTED 的值并再次恢复更改。然而,结果是墙网区域:( 参数或墙是否需要重新加载?或者也许有更简单的方法来获得 brutto 区域?任何帮助将不胜感激,因为我找不到与该问题相关的任何内容。提前致谢!

        foreach (Wall wallElem in elems)
        {
            try
            {
                Double brutto = 0.0;
                ICollection<ElementId> delIds = null;

                using (SubTransaction t = new SubTransaction(doc))
                {
                    try
                    {
                        t.Start();

                        delIds = doc.Delete(wallElem);

                        t.RollBack();

                    }
                    catch (Exception ex)
                    {
                        message = "Deletion failed: " + ex.Message;
                        t.RollBack();
                    }
                }

                using (SubTransaction u = new SubTransaction(doc))
                {
                    try
                    {
                        u.Start();

                        delIds.Remove(wallElem.Id);
                        doc.Delete(delIds);
                        brutto = wallElem.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED).AsDouble();
                        u.RollBack();
                    }
                    catch (Exception ex)
                    {
                        message = "Deletion failed: " + ex.Message;
                        u.RollBack();
                    }
                }
                wallElem.get_Parameter("Wall Area Bruto").Set(brutto);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

【问题讨论】:

    标签: c# api revit revit-api


    【解决方案1】:

    你在正确的轨道上。 我建议您删除托管元素后,您需要重新生成,然后才能更新墙的参数。

    试试:

    doc.Delete(delIds);
    doc.Regenerate();  // regenerate to cascade all changes.
    wallElem = doc.get_Element(wallElem.Id);
    brutto = wallElem.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED).AsDouble();
    

    如果这不起作用,那么我会说您的下一步是尝试提交子事务。子事务完成后,您可能能够检索 brutto wall 区域,然后 Rollback() 外部事务。

    【讨论】:

    • 那是我忽略的事情 :) 非常感谢!
    【解决方案2】:

    你试过只看几何吗?如果您将墙壁固定并通过面看,应该有两个面比所有其他面大得多,并且它们的方向的 z 分量为零 - 其中一个面的区域应该是您的 brutto 区域!

    但是:针对您的问题,您可能会尝试从文档中重新获取墙元素:

    delIds.Remove(wallElem.Id);
    doc.Delete(delIds);
    wallElem = doc.get_ElementById(wallElem.Id); // re-fetch wall element from BIM model
    brutto = wallElem.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED).AsDouble();
    u.RollBack();
    

    【讨论】:

      猜你喜欢
      • 2020-03-05
      • 2018-03-02
      • 2023-03-22
      • 1970-01-01
      • 2021-06-28
      • 2017-04-30
      • 2019-09-21
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多