Design Automation API for AutoCAD の AppBundle 用に AutoCAD アドイン アプリを作成する場合、お薦めなのが AutoCAD .NET API です。Web ページなどで指定されたクライアントからの JSON パラメータを容易に扱うことが出来るためです。
具体的には、.NET ベースの Newtonsot.json の Json.NET パッケージを Visual Studio プロジェクトに導入するだけで、WorkItem 実行時にパラメータを格納する JSON ファイルを読み込んでパースしたり、処理した情報を JSON ファイルに書き出して Web ページに反映したりすることが出来るようになります。
ここでは、Learn Forge の「モデルを修正する」や Design Automation API for AutoCAD サンプルで使われている UpdateDWGParam アドインを作成して、Json.NET パッケージの組み込みを主眼に導入手順をご紹介してみたいと思います。
アドイン作成には、AutoCAD 用の開発環境を利用することにします。少しイレギュラーですが、
Learn Forge に合わせて ObjectARX SDK for AutoCAD 2020 がインストールされた環境で、Visual Studio 2019 Professional エディションと AutoCAD 2023 DotNet Wizard(AutoCAD .NET Wizard)を利用します。AutoCAD 2023 用の開発環境については、AutoCAD 2023 のカスタマイズ互換性 のブログ記事を確認してみてください。
- AutoCAD 2023 DotNet Wizard をインストールした Visual Studio 2019 Professional を起動して、「新しいプロジェクトの作成(N)」をクリックします。
- 画面上部の検索ボックスに "AutoCAD" と入力すると、環境にインストールされている AutoCAD 関連のウィザードがリストされます。C# を使用するので「AutoCAD 2023 CSharp plug-in」を選択して [次へ(N)] をクリックします。
- プロジェクト名に UpdateDWGParam と入力、フレームワークに Learn Forge に合わせて .NET Framework 4.7 を選択して [作成(C)] をクリックします。
- インストールされている ObjectARX SDK からプロジェクトが参照する AutoCAD アセンブリの参照先(パス)を指定します。ここでは、Learn Forge と同じ Autodesk.AutoCAD+23_1 コアエンジンでの利用を想定して、最上部の「Specify the location of the folder inside the ObectARX SDK that contains AcMgd.dll」パスに相当する AutoCAD 2020 用の ObjectARX SDK for AutoCAD 2020 の inc フォルダを指定して、[OK] ボタンをクリックします。
- Wizard によってスケルトン プロジェクトが作成されます。[ソリューション エクスプローラー] には、次のような構成が表示されるはずです。
- [ソリューション エクスプローラー] の「参照」をクリックして、Design Automation API for AutoCAD でのカスタム コマンド実行に不要な AutoCAD アセンブリの参照を除去します。AcMgd を見つけて右クリックし、「削除」を選択します。
- 続いて、プロジェクトに Json.NET パッケージを導入します。[ツール(T)] メニューから [NuGet パッケージ マネージャー(N)] >> [ソリューションの NuGet パッケージの管理(N)...] を選択します。
- 「Nuget ソリューション」タブが表示されたら [参照] タブをアクティブして(①)、検索ボックスに「Newtonsot.json」と入力します(②)。検索ボックス下に Newtonsot.json 関連のパッケージがリストされたら、「Newtonsot.json」をクリックすると、画面右の領域にパッケージ内容が表示されます(③)。「プロジェクト」にチェックして(④)、右下の [インストール] ボタンをクリックしてパッケージをインストールします(⑤)。パッケージの導入には、使用するコンピュータがインターネット接続されている必要があります。
- ここまでの操作で、[ソリューション エクスプローラー] のアセンブリ参照の状態が次のように変わっているはずです。
- [ソリューション エクスプローラー] から MyCommand.cs を見つけてダブルクリックし、画面に MyCommand.cs のソースコード表示させます。
- Learn Forge 「AutoCAD バンドルを準備する」の Commands.cs の内容を現在のプロジェクトに反映していきます。ソースコード冒頭の Using ディレクティブで解決する名前空間の行を、次の内容で全行置き換えます。青字はここでは無視してください。最後に説明しています。
using Autodesk.AutoCAD.ApplicationServices.Core;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Newtonsoft.Json;
using System.IO; - 同様に、ソースコード内の MyCommands クラス スコープ(public class MyCommands { ~ })を、次の内容で全行置き換えます。
[CommandMethod("UpdateParam", CommandFlags.Modal)]public static void UpdateParam(){//Get active document of drawing with Dynamic blockvar doc = Application.DocumentManager.MdiActiveDocument;var db = doc.Database;
// read input parameters from JSON fileInputParams inputParams = JsonConvert.DeserializeObject<InputParams>(File.ReadAllText("params.json"));
using (Transaction t = db.TransactionManager.StartTransaction()){var bt = t.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
foreach (ObjectId btrId in bt){//get the blockDef and check if is anonymousBlockTableRecord btr = (BlockTableRecord)t.GetObject(btrId, OpenMode.ForRead);if (btr.IsDynamicBlock){//get all anonymous blocks from this dynamic blockObjectIdCollection anonymousIds = btr.GetAnonymousBlockIds();ObjectIdCollection dynBlockRefs = new ObjectIdCollection();foreach (ObjectId anonymousBtrId in anonymousIds){//get the anonymous blockBlockTableRecord anonymousBtr = (BlockTableRecord)t.GetObject(anonymousBtrId, OpenMode.ForRead);//and all references to this blockObjectIdCollection blockRefIds = anonymousBtr.GetBlockReferenceIds(true, true);foreach (ObjectId id in blockRefIds){dynBlockRefs.Add(id);}}if (dynBlockRefs.Count > 0){//Get the first dynamic block reference, we have only one Dyanmic Block reference in Drawingvar dBref = t.GetObject(dynBlockRefs[0], OpenMode.ForWrite) as BlockReference;UpdateDynamicProperties(dBref, inputParams);}}}t.Commit();}LogTrace("Saving file...");db.SaveAs("outputFile.dwg", DwgVersion.Current);}
/// <summary>/// This updates the Dyanmic Blockreference with given Width and Height/// The initial parameters of Dynamic Blockrefence, Width =20.00 and Height =40.00/// </summary>/// <param Editor="ed"></param>/// <param BlockReference="br"></param>/// <param String="name"></param>private static void UpdateDynamicProperties(BlockReference br, InputParams inputParams){// Only continue is we have a valid dynamic blockif (br != null && br.IsDynamicBlock){// Get the dynamic block's property collectionDynamicBlockReferencePropertyCollection pc = br.DynamicBlockReferencePropertyCollection;foreach (DynamicBlockReferenceProperty prop in pc){switch (prop.PropertyName){case "Width":prop.Value = inputParams.Width;break;case "Height":prop.Value = inputParams.Height;break;default:break;}}}}
/// <summary>/// This will appear on the Design Automation output/// </summary>private static void LogTrace(string format, params object[] args) { Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(format, args); } - MyCommands クラス スコープ(public class MyCommands { ~ })の後に、次のクラスを追記します。
public class InputParams
{
public double Width { get; set; }
public double Height { get; set; }
} - ここまでの操作で、ビルドに必要な準備が整いました。[ビルド(B)] メニューから [ソリューションのリビルド(R)] を選択して、アドイン(UpdateDWGParam.dll アセンブリ)をビルド出来ます。
青字にした箇所が、Newtonsot.json の Json.NET パッケージを使ったパラメータ値を格納した JSON ファイル(params.json)の読み取りに関係するコードです。
あとは、UpdateDWGParam.dll の生成フォルダにある Newtonsoft.Json.dll と共に、Learn Forge 「AutoCAD バンドルを準備する」の PackageContents.xml セクションにある構造でバッケージ バンドルを UpdateDWGParam.zip 名で ZIP 圧縮して、forgesample\bundles フォルダに保存すれば、Learn Forge の内容に沿って AppBundle を登録、WorkItem でアドインを使用することが出来ます。
By Toshiaki Isezaki
コメント
コメントフィードを購読すればディスカッションを追いかけることができます。