Forge Online - Design Automation:AutoCAD タスクの自動化 でご紹介のとおり、Design Automation API for AutoCAD(略称:DA4A)を利用する上で、AppBundle(コアエンジンでロードさせるアドイン アプリ パッケージ)は必須ではありません。
ただ、カスタマイズされたワークフローの自動化には、やはり、アドイン アプリによる細かいコントロールは必要です。ここでは、Design Automation API for AutoCAD の効果 の 例1)図面の作成・編集 でご案内したアドイン アプリをどのように DA4A に適用していくのか、具体的な差と移植に必要な情報をお届けします。
AutoCAD アドイン実装:
このアドイン(CreateCoil.dll)は、 AutoCAD .NET API の AcCoreMgd.dll、AcDbMgd.dll、AcMgd.dll アセンブリを参照設定する Visual Studio の C# プロジェクトで実装されています。
プロジェクトでは CreateCoil カスタム コマンドを定義していて、AutoCAD .NET API:パレット ダイアログを作成する方法 に準じたパレット ダイアログを表示します。パレット ダイアログの実装には AcMgd.dll アセンブリが使われている点に注意してください。
ダイアログ内に配置した [Create(作成)] ボタンをクリックすると、同じくダイアログ内の turn(旋回数)、radius(半径)、height(高さ) の入力値で らせん オブジェクトを作成、らせんに沿って円を押し出したスイープソリッドを作図します。
[Create(作成)] ボタンの Click プロシージャのコードは次のとおりです。青字部分が、パレット ダイアログからの入力値の取得箇所です。
private void button1_Click(object sender, EventArgs e)
{
Database acCurDb = HostApplicationServices.WorkingDatabase;DocumentLock docLock =
Application.DocumentManager.MdiActiveDocument.LockDocument();Int16 intTurns = short.Parse(textBox1.Text);
Double dblRadius = double.Parse(textBox2.Text);
Double dblHeight = double.Parse(textBox3.Text);// Start a transaction
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// Open the Block table for read
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
OpenMode.ForRead) as BlockTable;// Open the Block table record Model space for write
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
OpenMode.ForWrite) as BlockTableRecord;// Create a helix
Helix acHelix = new Helix();
acHelix.SetDatabaseDefaults();
acHelix.Constrain = ConstrainType.Turns;
acHelix.StartPoint = Point3d.Origin;
acHelix.BaseRadius = dblRadius;
acHelix.TopRadius = dblRadius;
acHelix.Height = dblHeight;
acHelix.Turns = intTurns;
acHelix.Twist = false;
acHelix.CreateHelix();
acBlkTblRec.AppendEntity((Entity)acHelix);
acTrans.AddNewlyCreatedDBObject(acHelix, true);// Create Circle
Circle acCircle = new Circle();
acCircle.Center = acHelix.StartPoint;
acCircle.Normal = new Vector3d(0.0, 0.0, 1.0);
acCircle.Radius = 2.5;
acBlkTblRec.AppendEntity((Entity)acCircle);
acTrans.AddNewlyCreatedDBObject(acCircle, true);// Creat Sweep Solid
SweepOptionsBuilder acSwOption = new SweepOptionsBuilder();
acSwOption.Align = SweepOptionsAlignOption.AlignSweepEntityToPath;
acSwOption.BasePoint = acHelix.StartPoint;
acSwOption.Bank = true;
Solid3d acSweep = new Solid3d();
acSweep.CreateSweptSolid(acCircle, acHelix, acSwOption.ToSweepOptions());
acBlkTblRec.AppendEntity((Entity)acSweep);
acTrans.AddNewlyCreatedDBObject(acSweep, true);// Save the new object to the database
acTrans.Commit();docLock.Dispose();
}
}
AutoCAD には、AutoCAD アドオンの自動ロードの方法あれこれ のように複数の自動ロード方法がありますが、このアドインは バンドル パッケージを使った自動ロード を採用しています。バンドル パッケージのフォルダ構成(右図)と PackageContents.xml の内容は次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<ApplicationPackage
SchemaVersion="1.0"
AppVersion="1.0"
ProductCode=""
Name="CreateCoil Package"
ProductType="Application"
Description="Create a Coil"
Author="Toshiaki Isezaki" >
<CompanyDetails
Name="Autodesk Ltd,. Japan"
Url="https://www.autodesk.co.jp"
Email="[email protected]" />
<Components>
<RuntimeRequirements
OS="Win64"
Platform="AutoCAD"
SeriesMin="R23.0"
SeriesMax="R24.1" />
<ComponentEntry
AppName="CreateCoil"
ModuleName="./Contents/CreateCoil.dll"
AppDescription="Create a Coil"
LoadOnAutoCADStartup="True" />
</Components>
</ApplicationPackage>
- Autodesk.AutoCAD+24 コアエンジン バージョン以降、AppBundle でアドイン ファイルの自動ロード定義に使用する PackageContents.xml において、ロード タイミングを起動時ロードを指定する LoadOnAutoCADStartup にしていると、パフォーマンス低下抑止のため、コアエンジンへのロードが実行されません。代替として、コマンド呼び出し時にアドインをロードさせる LoadOnCommandInvocation を指定してください。
Design Automation API for AutoCAD アドイン(AppBundle)実装:
AutoCAD アドインを Design Automation API for AutoCAD で利用出来るようにしていきます。ローカル環境の AutoCAD でロードして運用する前述のアドインでは、ユーザ インタフェースの実装とコイル状スイープ ソリッドの作図実装が、すべて アドイン内に実装されていて、処理もローカル環境の AutoCAD 内で完結します。
一方、DA4A の場合には、ユーザ インタフェースの実装とコイル状スイープ ソリッドの作図実装が、Web 配信する HTML ページとコアエンジンにロードするアドインに分離されて実装されることになります。
なお。DA4A では、コアエンジンへのアドイン ロードには バンドル パッケージを使った自動ロード のみがサポートされます。また、WorkItem と呼ぶ実際の処理を実行する前に、バンドル パッケージを ZIP 圧縮して登録しておく必要があります。これを AppBundle と呼称していて、フォルダ構成に PackageContents.xml とアドイン ファイルを含めて ZIP 圧縮しています。
ここではアドインの DA4A 化に焦点を当てているので詳細は割愛しますが、HTML ページで入力された turn(旋回数)、radius(半径)、height(高さ) の値は、実際の処理(WorkItem で指定する CreateCoil コマンド処理)時に、JSON ファイルとしてコアエンジンが実行される作業領域に AppBundle と一緒に保存されることになります。
この場合、AppBundle によってコアエンジンにロードされるアドインは、実行時に同じ作業領域(フォルダ)ある JSON ファイルを読み込み、スイープ ソリッドに必要なパラメータ値を取得、作図に利用する必要があります。
.NET API アドインで JSON ファイルを読み込み(デシリアライズ)、内容をパース、turn(線回数)、radius(半径)、height(高さ) の各値を取得するには、System.Text.Json 名前空間を利用するか、Newtonsoft 社がオープンソースとして公開している Json.NET パッケージ(ライブラリ)を利用が一般的です。
このアドイン(CreateCoil.dll)では、使用事例が豊富な Json.NET パッケージを利用します。Json.NET パッケージは、Visual Studio の NuGet パッケージ マネージャを使って Visual Studio プロジェクトに簡単に導入することが出来ます。
次のコードは、DA4A 上で実行されることになる CrrateCoil コマンドの実装内容です。青字部分が、JSON ファイルからの入力値の取得箇所です
public class MyCommands
{// Modal Command with localized name
[CommandMethod("CreateCoil", CommandFlags.Modal)]
public void MyCommand() // This method can have any name
{
Log("\nStart Addin process ...");Database acCurDb = HostApplicationServices.WorkingDatabase;
Log("\nGot database ..." );
InputParams inputParams =
JsonConvert.DeserializeObject<InputParams>(File.ReadAllText(".\\params.json"));
Double intTurns = inputParams.Turn;
Double dblRadius = inputParams.Radius;
Double dblHeight = inputParams.Height;
Log("\nAddin retrieves Turn:{0}, Radius{1}, Height:{2}", intTurns, dblRadius, dblHeight);// Start a transaction
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// Open the Block table for read
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
OpenMode.ForRead) as BlockTable;// Open the Block table record Model space for write
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
OpenMode.ForWrite) as BlockTableRecord;// Create a helix
Helix acHelix = new Helix();
acHelix.SetDatabaseDefaults();
acHelix.Constrain = ConstrainType.Turns;
acHelix.StartPoint = Point3d.Origin;
acHelix.BaseRadius = dblRadius;
acHelix.TopRadius = dblRadius;
acHelix.Height = dblHeight;
acHelix.Turns = intTurns;
acHelix.Twist = false;
acHelix.CreateHelix();
acBlkTblRec.AppendEntity((Entity)acHelix);
acTrans.AddNewlyCreatedDBObject(acHelix, true);
Log("\nHelix path created ...");// Create Circle
Circle acCircle = new Circle();
acCircle.Center = acHelix.StartPoint;
acCircle.Normal = new Vector3d(0.0, 0.0, 1.0);
acCircle.Radius = 2.5;
acBlkTblRec.AppendEntity((Entity)acCircle);
acTrans.AddNewlyCreatedDBObject(acCircle, true);
Log("\nCircle section created ...");// Creat Sweep Solid
SweepOptionsBuilder acSwOption = new SweepOptionsBuilder();
acSwOption.Align = SweepOptionsAlignOption.AlignSweepEntityToPath;
acSwOption.BasePoint = acHelix.StartPoint;
acSwOption.Bank = true;
Solid3d acSweep = new Solid3d();
acSweep.CreateSweptSolid(acCircle,acHelix, acSwOption.ToSweepOptions());
acSweep.ColorIndex = 1;
acBlkTblRec.AppendEntity((Entity)acSweep);
acTrans.AddNewlyCreatedDBObject(acSweep, true);
Log("\nSweep coil created ...");// Save the new object to the database
acTrans.Commit();
}
acCurDb.SaveAs(".\\result.dwg", DwgVersion.Current);
Log("\nresult.dwg was saved ...");
}
private static void Log(string format, params object[] args) {
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(format, args); }
}public class InputParams
{
public Int16 Turn { get; set; }
public double Radius { get; set; }
public double Height { get; set; }
}
Json.NET パッケージを導入した Visual Studio プロジェクトには、Newtonsoft.Json.dll アセンブリが含まれるようになります。Newtonsoft.Json.dll と Newtonsoft.Json.xml は DA4A の作業環境にも必要になるので、AppBundle のフォルダ構成に含めておく必要があります。
また、DA4A コアエンジンにはユーザ インターフェースはありませんので、同環境で稼働するアドインにはダイアログ ボックスなどのユーザ インタフェース実装時に必要な AcMgd.dll アセンブリを参照設定しておくことも出来ません。もはや、パレット ダイアログはアドインには不要です。DA4A のアドイン用 Visual Studio プロジェクトに参照設定する AutoCAD アセンブリは、AcCoreMgd.dll、AcDbMgd.dll になります。
このため、Visual Studio プロジェクトの参照設定(左図と、AppBundle のバンドル パッケージのフォルダ構成(右図)は次のようになります。
バンドル パッケージの PackageContents.xml の内容は、ローカル環境と同じものを流用することが出来ます。
ここでご紹介していない部分、HTML ページのどの入力値を JSON ファイル化するのか、その際のファイル名はどうするのか、コアエンジンで実行するカスタム コマンドを何か、などは、Design Automation API for AutoCAD の Activity とWorkItem で指定することになります。
実際の使用時には Design Automation API for AutoCAD 利用の注意点 もご確認ください。
By Toshiaki Isezaki
コメント