デスクトップ AutoCAD とオブジェクト イネーブラ 記事に続き、AutoCAD コアエンジンを使用する Design Automation API for AutoCAD 環境とオートデスク製オブジェクト イネーブラについてご案内します。
Design Automation API for AutoCAD 環境の業種別製品オブジェクト イネーブラと効果
Design Automation API for AutoCAD では、オートデスク製のオブジェクト イネーブラはどう提供されているでしょうか?
答えは簡単です。デスクトップ AutoCAD とオブジェクト イネーブラ 記事で触れたすべてのオブジェクト イネーブラが含まれています。デスクトップの AutoCAD 単体製品と Design Automation API for AutoCAD 環境でのオートデスク製オブジェクト イネーブラの有無は次のようになります。
Design Automation API for AutoCAD 環境にオブジェクト イネーブラロードされることで、 AutoCAD 業種別製品のカスタム オブジェクトのプロキシ オブジェクト化を抑止して、AppBundle で提供する AutoCAD アドインの処理で特定のカスタム オブジェクトを識別したり、数量拾いを実施したりすることが出来るようになります。
試しに、デスクトップ AutoCAD とオブジェクト イネーブラ 記事でもご紹介したコードを Design Automation API 用に少し修正して 、AppBundle として登録、WorkItem を実行したとします。
[CommandMethod("MyGroup", "MyCommand", "MyCommand", CommandFlags.Modal)]public void MyCommand(){log("\nAddin process start ...");Database db = Application.DocumentManager.MdiActiveDocument.Database;try{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);log("\n" + ent.GetRXClass().DxfName + " (" + ent.GetRXClass().Name + " クラス)");}tr.Commit();}}catch (Autodesk.AutoCAD.Runtime.Exception ex){log("\n!!! Exception happened on Addin process ...");log(ex.Message);}finally{}log("\nAddin process end ...");}private static void log(string format, params object[] args) { Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(format, args); }
ここでも、デスクトップ AutoCAD とオブジェクト イネーブラ 記事と同じ対象図面を処理することにします。AutoCAD Mechanical のサンプル図面 gear_pump_subassy.dwg から六角ボルトとバルーンを 1 つづつ残してすべて削除し、比較用に線分を 2 つ追加した図面です。
Design Automation API にはコマンド プロンプトを含むユーザ インタフェースがないので、WorkItem 実行時に生成されるレポート ログのメッセージをを見て判断することにします。
結果、次のように WorkItem として実行されるアドイン処理でも、オブジェクト イネーブラによって、AutoCAD Mechanical のカスタム オブジェクトが正しく認識されることがわかります。
:
[09/04/2022 13:40:50] Version Number: S.51.Z.100 (UNICODE)
[09/04/2022 13:40:50] LogFilePath has been set to the working folder.
[09/04/2022 13:40:50] Loading Mechanical modules.....
[09/04/2022 13:40:51] Loader application completed
[09/04/2022 13:40:51] Regenerating model.
[09/04/2022 13:40:51] AutoCAD menu utilities loaded.
[09/04/2022 13:40:51] Command:
[09/04/2022 13:40:51] Command:
[09/04/2022 13:40:51] Command:
[09/04/2022 13:40:51] Command: MyCommand
[09/04/2022 13:40:52] Addin process start ...
[09/04/2022 13:40:53] STDPART2D (AmgStdPart クラス)
[09/04/2022 13:40:53] ACMBALLOON (AcmBalloon クラス)
[09/04/2022 13:40:53] LINE (AcDbLine クラス)
[09/04/2022 13:40:53] LINE (AcDbLine クラス)_tilemode
:
AutoCAD Mechanical Desktop カスタム オブジェクトの影響
DWG ファイルのライフサイクルは、日頃考えるよりも長いものです。もし、Design Automation API for AutoCAD で利用時に、レポートログに「ERROR: Something went wrong. ErrorStatus=53.」と記録されて処理が失敗する場合には、AutoCAD Mechanical Desktop カスタム オブジェクトの影響を疑ってみてください。
:
[09/04/2022 15:25:41] LogFilePath has been set to the working folder.
[09/04/2022 15:25:41] Loading Mechanical modules.....
[09/04/2022 15:25:42] Loader application completed
[09/04/2022 15:25:42] Regenerating model.
[09/04/2022 15:25:43] ERROR: Something went wrong. ErrorStatus=53.
[09/042022 15:25:44] End AutoCAD Core Engine standard output dump.
[09/04/2022 15:25:44] Error: Application accoreconsole.exe exits with code 53 which indicates an error.
[09/04/2022 15:25:44] End script phase.
[09/04/2022 15:25:44] Error: An unexpected error happened during phase CoreEngineExecution of job.[09/04/2022 15:25:44] Job finished with result FailedExecution
:
オートデスクは、以前、AutoCAD 上でフィーチャ ベースの 3D パラメトリック設計を実現する製品を開発・販売していました。AutoCAD Mechanical Desktop と名付けられた製品は、同等の機能を持つ Inventor に役割を譲り、AutoCAD 2009 Mechanical Desktop を最後に販売を停止した経緯があります。
当時、同じ製造業向けアプリケーションとして、3D の AutoCAD Mechanical Desktop と 2D の AutoCAD Mechanical の連携利用を想定していたため、AutoCAD Mechanical しか利用していなくても、あらかじめ AutoCAD Mechanical Desktop のカスタム オブジェクトが埋め込まれていました(図形としてではなく。ディクショナリ領域に)。
Design Automation API for AutoCAD は AutoCAD Mechanical のカスタム オブジェクトを正しく認識出来ますが、Mechanical カスタム オブジェクトが旧 AutoCAD Mechanical Desktop のカスタム オブジェクトを内部的に「参照」していると、参照先のオブジェクトが解決出来ず、図面破損と判定されてしまいます。ちょうど、AutoCAD API から見た図面構造と破損 でご紹介したような状態です。AutoCAD Mechanical Desktop カスタム オブジェクトのオブジェクト イネーブラがすでに提供されていないのが原因です。
このような DWG ファイルを処理するには、Activity 登録時に "commandLine" で指定するコアエンジンの起動スイッチに /recover を追加してください。WorkItem 実行時に解決できなかった AutoCAD Mechanical Desktop カスタム オブジェクトを削除します。
"commandLine": ['$(engine.path)\\accoreconsole.exe /i "$(args[DWGInput].path)" /al "$(appbundles[TestHarness].path)" /s $(settings[script].path) /recover'],
/recover オプションを使用して図面開き、上書き保存しても、AutoCAD Mechanical を含めた図面の運用には影響はありません。
もし、ローカル環境で「ERROR: Something went wrong. ErrorStatus=53.」が発生する DWG ファイルを事前に修復したい場合には、システム変数 RECOVERAUTO を 3 に設定した AutoCAD Mechanical(エラーを検出してしまう AutoCAD Mechanical オブジェクト イネーブラがロードされる)で当該図面を開いて、上書き保存するだけで、AutoCAD Mechanical Desktop のカスタム オブジェクトを削除することが出来ます。別途、RECOVER コマンドを実行する必要はありません。
AutoCAD Mechanical バージョンの影響
Design Automation API for AutoCAD で AutoCAD Mechanical のカスタム オブジェクトを含む DWG ファイルを処理する際には、 AutoCAD Mechanical の保存バージョンとコアエンジンの差異にも注意すべきです。
ご存知のように、AutoCAD Mechanical はオブジェクトのバージョン管理を非常に細かくおこなっています。AutoCAD Mechanical の [図面に名前を付けて保存] ダイアログ(SAVEAS コマンド)を見てみてください。2018 DWG形式 1 つに、4 つの AutoCAD Mechanical バージョンが存在していることがわかります。
具体的には、AutoCAD Mechanical 2018 図面、AutoCAD Mechanical 2021 図面、AutoCAD Mechanical 2022 図面、AutoCAD Mechanical 2023 図面を指しますが、これは、すなわち 4 つのバージョン毎のオブジェクト イネーブラが必要になることを意味します。
AutoCAD 2022 に相当する Autodesk.AutoCAD+24_1 コアエンジンを使用して、「AutoCAD Mechanical 2022 図面」として保存された 2018 DWG 形式の図面を処理すると、期待通りに動作します。WokItem は AutoCAD Mechanical カスタム オブジェクトを適切に認識してリストします。
しかし、同じ図面を AutoCAD 2020 相当の Autodesk.AutoCAD+23_1 コアエンジンで処理すると、コアエンジンが図面を開くことが出来るものの、アドイン処理には失敗してしまいます。お気づきのとおり、AutoCAD Mechanical カスタム オブジェクトのバージョンと、Autodesk.AutoCAD+23_1 コアエンジン環境のオブジェクト イネーブラが一致しないのが原因です。
あいにく、一般的な AutoCAD アドインと同様、オブジェクト イネーブラにも下位バージョン互換はありません。このため、Autodesk.AutoCAD+24_1 コアエンジンの「AutoCAD Mechanical 2022 図面」用オブジェクト イネーブラを、AutoCAD 2020 相当の Autodesk.AutoCAD+23_1 コアエンジンで使用することは出来ません。
オブジェクト イネーブラと AutoCAD Mechanical カスタム オブジェクトのバージョン ミスマッチが発生しても、レポートログにはその詳細について記載はされず、「timeput(タイムアウト)」とだけレポートされるのみです。
:
[09/04/2022 19:41:57] Loading Mechanical modules.....
[09/04/2022 19:41:57] Loader application completed
[09/04/2022 19:41:57] Regenerating model.
[09/04/2022 19:42:58] Error: AutoCAD Core Console is shut down due to timeout.
[09/04/2022 19:42:58] End script phase.
[09/04/2022 19:42:58] Error: An unexpected error happened during phase CoreEngineExecution of job.
[09/04/2022 19:42:58] Job finished with result FailedExecution
:
この部分は少し分かりにくいので、今後の改善検討課題とされています。Design Automation API for AutoCAD で、最新のコアエンジンの使用が推奨される由縁です。
なお、独自に ObjectARX で実装したカスタム オブジェクト用のオブジェクト イネーブラを AppBundle 化して、バンドルパッケージ内の PackageContents.xml で Loadreasons 値に LoadOnProxy を指定しておくことで、処理対象の図面にカスタム オブジェクトが含まれた場合に自動的にロードさせて、プロキシ オブジェクトになることを抑止することが出来ます。
By Toshiaki Isezaki
コメント