AutoCAD 雑学:カスタム オブジェクトとオブジェクト イネーブラ では、AutoCAD 上のカスタム オブジェクトとプロキシ オブジェクトの関係や動作についてご案内しました。
その内容から、カスタム オブジェクトがプロキシ オブジェクト化してしまうのを防ぐため、オブジェクト イネーブラ(Object Enabler)と呼ばれる .dbx コンポーネント(ファイル)が用意されている点と、そのメカニズムをご理解いただけるはずです。カスタム オブジェクトやオブジェクト イネーブラは、オートデスク以外の 3rd party 開発者も ObjectARX を使って提供することが出来ます。
業種別製品オブジェクト イネーブラの提供方法
AutoCAD Plus(AutoCAD including specialized toolsets)の一部の業種別ツールセットが利用するカスタム オブジェクト用のオブジェクト イネーブラ、また、AutoCAD Civil3D 用のオブジェクト イネーブラは、Autodesk デスクトップ アプリの「マイ アップデート」で「Object Enabler」と検索するとダウンロード出来ます。
Autodesk デスクトップ アプリも含め、オートデスクのオブジェクト イネーブラは、異なる方法で提供されています。AutoCAD 2023 ベースで主要なものをまとめると次のようになるかと思います。
ダウンロードしたオブジェクト イネーブラは、AutoCAD にインストールすることで、プロキシ オブジェクト化することを抑止することが出来るようになります。
AutoCAD 単体製品用の業種別製品オブジェクト イネーブラ
AutoCAD Architecture と AutoCAD MEP(日本語版未提供)で使用される、壁、ドア、ダクトなどのカスタム オブジェクト用オブジェクト イネーブラは、AutoCAD 単体製品のインストーラに含まれています。
AutoCAD Civil 3D と AutoCAD Plant 3D で使用されるコリドー、バルブなどのカスタム オブジェクト用オブジェクト イネーブラは、Autodesk デスクトップアプリやダウンロード用の Web ページからダウンロードして AutoCAD 単体製品のインストールすることが出来ます。AutoCAD Map 用には AutoCAD Civil 3D 用オブジェクト イネーブラで代替出来ます。
あいにく、AutoCAD Mechanical 用のオブジェクト イネーブラは、AutoCAD 単体製品での同梱やダウンロードでの提供がされていないため、AutoCAD Mechanical 製品で使用するバルーンやパーツ一覧などのカスタム オブジェクトは、プロキシ オブジェクトになってしまいます。
ただし、それら Mechanical カスタム オブジェクトがプロキシオブジェクト化する際には、PROXYNITICE システム変数の値が 1 に設定されていても、[プロキシ情報] ダイアログが表示されないように工夫されています。(Mechanical オブジェクトを定義するオブジェクト イネーブラでは、ObjectARX でカスタム オブジェクトを定義する ACRX_DXF_DEFINE_MEMBERS マクロで AcDbProxyEntity::kDisableProxyWarning が設定されているため。)
なお、AutoCAD Electrical では、カスタム オブジェクトではなく、ブロックとブロック属性を用いて回路図面を表現しているため、オブジェクト イネーブラの提供はありません。
AutoCAD API 視点でのオブジェクト イネーブラの効果
ここで、AutoCAD API を利用する開発者目線でオブジェクト イネーブラの効果を見てみます。AutoCAD .NET API を使ったアドインが、次のような C# コードで記述されていると仮定します。このコードは、MyCommand コマンドを実行すると、モデル空間のすべてのオブジェクトを走査して、各オブジェクトの DXF 名と定義元になっている ObjectARX クラス名を表示する簡単なものです。
Database db = Application.DocumentManager.MdiActiveDocument.Database;Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;using (Transaction tr = db.TransactionManager.StartTransaction()){BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt["*MODEL_SPACE"], OpenMode.ForRead);Entity ent = null;foreach (ObjectId objId in btr){ent = (Entity)tr.GetObject(objId, OpenMode.ForRead);ed.WriteMessage("\n" + ent.GetRXClass().DxfName + " (" + ent.GetRXClass().Name + " クラス)");}tr.Commit();}
次に、対象図面です。ここでは、AutoCAD Mechanical のサンプル図面 gear_pump_subassy.dwg から六角ボルトとバルーンを 1 つづつ残してすべて削除し、比較用に線分を 2 つ追加した図面でテストしてみましょう。
この図面を Mechanical オブジェクト イネーブラがロードされている AutoCAD Mechanical で開いて、MyCommand コマンドを実行すると、次のコマンド プロンプトが示す結果が得られます。
この例では、バルーンを ACMBALOON 図形として、また、六角ボルトを STDPART2D 図形として正しく認識出来ていることがわかります。
続いて、 Mechanical オブジェクト イネーブラがない AutoCAD 単体製品で同じ図面を開いて MyCommand コマンドを実行すると、バルーンと六角ボルトがプロキシ オブジェクトになっていることが見て取れます。
このように、オブジェクト イネーブラがある環境では、プロキシ オブジェクト化を抑止して特定のカスタム オブジェクトを識別出来るので、 AutoCAD アドインが特定のオブジェクトをカウントすることが出来るようになります。もちろん、AutoCAD もオブジェクトを正しく認識出来るため、正確な印刷や境界判定などを得られるようになります。
なお、AutoCAD 雑学:カスタム オブジェクトとオブジェクト イネーブラ でご紹介したとおり、オブジェクト イネーブラだけでカスタム オブジェクトの新規作成や編集が出来るわけではない点にご注意ください。カスタム オブジェクトのクラスを使用した API アクセスも同様です。
By Toshiaki Isezaki
コメント