在Revit API中获取wall brutto区域

时间:2013-01-24 13:48:06

标签: c# api revit revit-api

我正试图通过Revit API获得墙上的brutto区域。然而,我唯一得到的是netto区域。

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

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

2 个答案:

答案 0 :(得分:0)

您是否尝试过观察几何图形?如果您将墙壁固定并透过面观察,那么应该有两个面比所有其他面大,并且它们的方向具有零z分量 - 这些面中的一个面应该是您的布鲁托区域! / p>

但是:特定于您的问题,您可能会尝试从文档中重新获取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();

答案 1 :(得分: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区域,然后回滚()外部事务。