Revit API Tips: 未使用のオブジェクトを削除する

Revit API をご利用いただいているデベロッパーの皆様からのこれまでのお問い合わせの中から、開発のヒントやアイデアとなる情報をご紹介します。

Revit には、未使用のビュー、ファミリ、その他のオブジェクトをプロジェクトから削除する[未使用の項目を削除]コマンドがあります。

これにより、ファイルサイズを節約し、Revit プロジェクトのパフォーマンスを向上させることができます。

Revit 2026のユーザーインターフェース、未使用の項目を削除するコマンドが強調表示された画面
Revitの未使用項目削除ダイアログボックス、ビューやファミリなどの未使用オブジェクトを選択して削除するためのリストが表示されている画面。

これまで、Revit API ではこの機能はサポートされておりませんでしたが、Revit 2024 API にて、同等の機能を API でも実現できるようになっております。

Autodesk.Revit.DB.Document に追加されたメソッドにより、未使用要素を取得できるようになりました。これらのメソッドは、Revit の[未使用の項目を削除]コマンドで使用可能な未使用要素の ElementId を返します。

  • Autodesk.Revit.DB.Document.GetUnusedElements() – ドキュメントから削除可能な未使用要素 ID のリストを返します。
  • Autodesk.Revit.DB.Document.GetAllUnusedElements() – Revit が最後のインスタンスを削除できない可能性がある要素も含め、未使用要素 ID のリストを返します。

両メソッドの違いですが、特定のカテゴリでは、たとえプロジェクトで「使用中」でなくとも、ドキュメント内に少なくとも1つのタイプを残しておく必要がある要素もあります。

GetUnusedElements() は、そのようなケースに該当する場合に1つを自動的に確保します。GetAllUnusedElements() は完全なリストを返し、保持する要素を選択できるようにします。

未使用な要素を取得できれば、Document.Delete() メソッドで削除します。

public void DeleteAllUnused(Autodesk.Revit.DB.Document document)
{
   using (Transaction transaction = new Transaction(document, "Delete unused elements"))
   {
      transaction.Start();

      ISet<ElementId> unusedElementIds = document.GetUnusedElements(new HashSet<ElementId>());
      while (unusedElementIds.Any())
      {
         document.Delete(unusedElementIds);
         unusedElementIds = document.GetUnusedElements(new HashSet<ElementId>());
      }

      transaction.Commit();
   }
}

public void GetUnusedElements(Autodesk.Revit.DB.Document document)
{
   // Get all unused elements in the document
   var allUnusedElementIds = document.GetUnusedElements(new HashSet<ElementId>());

   // Get unused elements without a category
   var unusedElementIdsWithNoCategory = document.GetUnusedElements(new HashSet<ElementId>() { new ElementId(BuiltInCategory.INVALID) });

   // Get unused wall and floors types
   HashSet<ElementId> categoriesToPurge = new HashSet<ElementId>
   {
      new ElementId(BuiltInCategory.OST_Walls),
      new ElementId(BuiltInCategory.OST_Floors)
   };

   var unusedElementIds = document.GetUnusedElements(categoriesToPurge);
}

ぜひお試しください。


Comments

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading