0

RevitAPIを使用して壁のブルートエリアを取得しようとしています。しかし、私が得ているのはネットエリアだけです。

壁を削除し、変更を元に戻して、壁に配置されているすべての要素を決定する方法を使用しています。次に、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);
            }
        }
4

2 に答える 2

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壁領域を取得してから、外部トランザクションをRollback()できる場合があります。

于 2013-01-25T14:19:30.160 に答える
0

ジオメトリだけ見てみましたか?壁をしっかりと取り、面を通して見ると、他のすべての面よりもはるかに大きく、向きの z コンポーネントがゼロの面が 2 つあるはずです。

BUT : あなたの質問に固有のものですが、ドキュメントから 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 に答える