作図されている図形の数に比べて図面ファイルのサイズが非常に大きい図面ファイルが存在している場合、図面に不要な情報が残っている可能性があります。ここでいう不要な情報とは、モデル空間やペーパー空間上の図形に参照されていない画層や寸法スタイル、ブロック定義などの非グラフィカル オブジェクトを指しています。
AutoCAD の図面ファイルでは、その構造上、このような不要なオブジェクトが発生しがちです。目に見える図形(グラフィカル オブジェクト)であれば、不要になった際に ERASE[削除] コマンドで削除すれば問題ありません。ただし、削除した図形がブロック参照だった場合など、ブロックの定義情報を保持するブロック定義が図面に残り続けてしまいます。

当然、ここでブロック定義も削除してしまえば、不要な情報を図面から消し去ることが出来ます。ここで注意が必要なのは、削除しようとするブロック定義が、どのブロック参照からも参照されていない、という保証です。もし、ブロック参照から参照されているブロック定義を削除してしまうと、図面破損の状態になっていまいます。この関係は、上図のような文字と文字スタイルの他にも、寸法と寸法スタイル、図形(グラフィカル オブジェクト)と画層、などのようにいろいろなパターンで図面内に存在します。詳細は、以前のブログ記事 AutoCAD API から見た図面構造と破損 を参照してみてください。
AutoCAD を操作する上では、安全に不要なオブジェクトを削除する方法を提供しなければなりません。その方法が、PURGE[名前削除] コマンドです。PURGE コマンドを実行すると、削除対象となるブロック定義などの非グラフィカル オブジェクトをダイアログボックス上に表示します。

AutoCAD は、 PURGE コマンドが実行されると、他から一切参照されていないオブジェクトを検出して、削除しても問題のないオブジェクトの名前を表示しています。つまり、安全に不要な情報を削除することが可能なわけです。
ここで、以前のブログ記事 AutoCAD API から見た図面構造と破損 の内容を思い出してみてください。メモリ上に展開された図面の情報、図面データベース構造では、参照の方法やつながり(オーナーシップ接続)の組み合わせが 4 つ存在していたはずです。この中で、ハード 参照の説明に「PURGE コマンド[名前削除] コマンドでの削除からの保護される」の一文が説明されていたはずです。これは、先にご紹介した安全な削除を謳っていると理解できます。
さて、問題は AutoCAD API を利用してカスタマイズをしている場合です。API によるオブジェクト操作では、参照しているオブジェクトの存在を確認せずに、対象オブジェクトを削除するプログラムを容易に作成することが出来てしまいます。図面構造を正しく理解していれば、そのようなコードは作成しないはずですが、万が一ということもあり得ます。オブジェクトを削除するプログラムを作成する際には、この部分は要注意です。
図面から一切の不要情報を削除したい場合には、PURGE[名前削除] コマンド相当のコードを作成することが出来ます。具体的な方法は、次のリンク先のドキュメントに記載されていますので、必要に応じて参照してみてください。
PURGE コマンドには、 ここまでご紹介してきた不要な情報以外にも、必要のない図形を削除する機能が備わっています。先の [名前削除] ダイアログ下部にある [長さがゼロのジオメトリおよび空白の文字オブジェクトを名前削除] です。
この機能は、Database.CountEmptyObjects メソッド(.NET API)、あるいは、AcDbDatabase::countEmptyObjects() メンバ関数(ObjectARX)で、不要なオブジェクトの数を取得したり、Database.EraseEmptyObjectsメソッド(.NET API)、あるい AcDbDatabase::eraseEmptyObjects() メンバ関数(ObjectARX)で、不要なオブジェクトを削除する方法が提供されています。
AutoCAD API を利用した開発時には、図面をクリーンに保つ手法を取り入れるといいかも知れません。
By Toshiaki Isezaki

Leave a Reply