我正试图通过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);
}
}
答案 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区域,然后回滚()外部事务。