我正在尝试使用 Revit API 获取墙壁粗略区域。然而,我唯一得到的是净区域。
我正在使用删除墙壁并还原更改的方法来确定放置在墙壁上的所有元素。然后,我从 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);
}
}
你走在正确的轨道上。我建议在删除托管元素后,您需要在更新墙的参数之前重新生成。
尝试:
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 墙区域,然后 Rollback() 外部事务。
你试过只看几何吗?如果你把墙壁看实心,看穿面,应该有两个面比所有其他面大得多,并且它们的方向有一个零 z 分量 - 其中一个面的面积应该是你的粗暴区域!
但是:针对您的问题,您可以尝试从文档中重新获取 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();