0

我正在尝试使用 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);
            }
        }
4

2 回答 2

0

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

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

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();
于 2013-01-25T10:00:42.750 回答
0

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

尝试:

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() 外部事务。

于 2013-01-25T14:19:30.160 回答