この記事の目的。
この記事の目的は、Autocad + C#で作業するためのいくつかのトリックを検討することです。
主に「Getting Started with Autocad with C#」に依存します。 この記事のフレームワークでは、SDK-ObjectARXを使用してAutocadを操作する機能に関するいくつかのコメントが検討されます。
私は資格のあるプログラマーではないことをすぐに言わなければならず、私は趣味としてのみプログラミングが好きです。 そのため、コメントでは、資料の表示における不正確さと誤りを指摘してください。
0.特に.net APIとObjectARXに関するいくつかの言葉。
.Net開発者ガイドが伝えることは次のとおりです(ブッシュマンによって翻訳されています。参考文献を参照)。
AutoCAD .NET APIを使用すると、利用可能なアセンブリまたはライブラリを使用して、プログラムでAutoCADアプリケーションと図面ファイルを管理できます。 これらのオブジェクトは、多くの異なるプログラミング言語およびあらゆる種類のソフトウェア開発環境で使用できます。
Autocadを使用するには、Autocadからライブラリを直接使用するか( 「C#を使用したAutocadの開始」を参照 )、またはObjectARXを使用します。
ObjectARXは、Microsoft Visual C ++プログラミング環境でAutoCAD用のアプリケーションを開発するために設計されたライブラリの大きなセットです。 AutoCAD自体はObjectARXを使用して設計されています。
「クリーンな」ObjectARXは、C ++を使用してAutocadで動作するように設計されていますが、一部のライブラリは、ObjectARXクラスが.netで動作するためのラッパーにすぎません。
ObjectARXは一般公開されており、 オートデスクの Webサイトからダウンロードできます。
同じアドレスで広範なSDKドキュメントをダウンロードすることもできます。
注意! ObjectARXとAutocadの同じバージョンを使用する必要があります! 1つのバージョンのライブラリと別のバージョンのAutocadとの互換性は保証されていません。 そのため、Autocadのバージョンを変更するときは、新しいライブラリでプログラムを再コンパイルする必要があります! さらに、ObjectARXとMS VSのさまざまなバージョンの互換性に注意することをお勧めします。 以下で説明するすべての例は、AutoCAD 2009についてそれぞれ記述されており、ObjectARX 2009、MS Visual Studio 2008が使用されています。
1. .Net APIを介したAutocadとC#の相互作用の方法。
AutocadとC#が対話する主な方法は2つあります。
- 1.プログラムは、Autocad.Interpop.CommonライブラリのCOMインターフェイスを介してAutocadファイルを処理する独立した実行可能ファイルとして実装されます。 この手法により、COMを介してdwgファイルで機能する通常の実行可能exeファイルを取得できます。 この方法は存在する権利がありますが、図面上の「影響」の利用可能な方法が少数であるため機能的に非常に制限されており、ほとんどの場合は推奨されません。
- 2.拡張機能(プラグイン)autocadの形式。 作業の結果はdllファイルになり、「netload」コマンドによってAutocadにロードされ、新しいコマンド(操作)および/または標準操作の新しい動作を定義します。
この記事では、2番目の方法を使用します。
2. ObjectARXの機能
ObjectARXライブラリセットは、図面とAutocadウィンドウを操作するための膨大なツールセットを開発者に提供します。
ObjectARXが提供する主な機能:
- 新しい図面ファイルを作成する
- 既存の図面の編集:プリミティブ、ブロック、図面辞書の編集( 「C#を使用したAutocadの開始」を参照)
- 新しいチームの追加。
- Autocadインターフェースの変更(新しいボタン、パネル、ブックマークの追加);
など
ObjectArxの詳細については、ドキュメント(ObjectARX \ docs \フォルダー)を参照してください。ObjectARXのドキュメント(フォルダー\ ObjectARX \ samples \)にも例があります。
3.例
以下のこの記事では、Autocadを使用したいくつかの例を検討し、各例について小さなコメントを示します。
プログラムは2つのライブラリを使用します:\ ObjectARX \ inc-win32 \フォルダーのAcDbMgd.dllとAcMgd.dll。 これらは、C#プロジェクトリファレンスに追加する必要があります。
結果を表示するには、Autocadで「netload」コマンド(引用符なし)を呼び出し、コンパイル結果のdllアセンブリを読み込み、新しいコマンドの名前を呼び出す必要があります(それぞれaddEntityとaddBlockは関係ありません)。
3.1。 既存の図面に新しいプリミティブを追加する
コード例1
using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.EditorInput; namespace clExample { public class clExample { [CommandMethod("addEntity")] // , Autocad public void addEntity() { // Database dbCurrent = Application.DocumentManager.MdiActiveDocument.Database; // , : using (Transaction trAdding = dbCurrent.TransactionManager.StartTransaction()) { // Circle cNewCircle = new Circle(); cNewCircle.Center = new Point3d(0, 0, 0); cNewCircle.Radius = 100; cNewCircle.ColorIndex = 5; // ( ) BlockTableRecord btrCurrSpace = trAdding.GetObject (dbCurrent.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord; // ObjectId oidCircle = btrCurrSpace.AppendEntity(cNewCircle); trAdding.AddNewlyCreatedDBObject(cNewCircle, true); // trAdding.Commit(); } } } }
この例は、プリミティブを図面に追加し、そのプロパティを操作し、図面データベースを操作し、新しいプリミティブを図面に追加する基本を示しています。 コマンドを開始した後、ポイント0,0で青い円が得られます。
例1の結果
2.ブロックの作成とそのプロパティの変更
例はもう少し複雑です。新しいブロックを作成し、図面上に配置します。 これを行うには、新しい関数を追加します。
コード例2
[CommandMethod("createBlock")] // , Autocad public void createBlock() { // Database dbCurrent = Application.DocumentManager.MdiActiveDocument.Database; // Editor edCurrent = Application.DocumentManager.MdiActiveDocument.Editor; // , : using (Transaction trAdding = dbCurrent.TransactionManager.StartTransaction()) { // BlockTable btTable = (BlockTable)trAdding.GetObject(dbCurrent.BlockTableId, OpenMode.ForRead); // PromptStringOptions psoOpt = new PromptStringOptions("\n : "); psoOpt.AllowSpaces = true; string strBlockName = ""; // do { // PromptResult prRes = edCurrent.GetString(psoOpt); // . if (prRes.Status != PromptStatus.OK) return; try { // SymbolUtilityServices.ValidateSymbolName( prRes.StringResult, false ); // if (btTable.Has(prRes.StringResult)) edCurrent.WriteMessage("\nA block with this name already exists."); else // , :) strBlockName = prRes.StringResult; } catch { edCurrent.WriteMessage("\nInvalid block name."); } } while (strBlockName == ""); // // , Line lNewLine = new Line(); lNewLine.StartPoint = new Point3d(0, 0, 0); lNewLine.EndPoint = new Point3d(50, 50, 0); lNewLine.ColorIndex = 3; Circle cNewCircle = new Circle(); cNewCircle.Center = new Point3d(0, 0, 0); cNewCircle.Radius = 100; cNewCircle.ColorIndex = 5; // AttributeDefinition adAttr = new AttributeDefinition(); adAttr.Position = new Point3d(0, 0, 0); adAttr.Tag = "ATTRDEF"; // BlockTableRecord btrRecord = new BlockTableRecord(); btrRecord.Name = strBlockName; btTable.UpgradeOpen(); // ObjectId btrId = btTable.Add(btrRecord); trAdding.AddNewlyCreatedDBObject(btrRecord, true); // btrRecord.AppendEntity(lNewLine); trAdding.AddNewlyCreatedDBObject(lNewLine, true); btrRecord.AppendEntity(cNewCircle); trAdding.AddNewlyCreatedDBObject(cNewCircle, true); // btrRecord.AppendEntity(adAttr); trAdding.AddNewlyCreatedDBObject(adAttr, true); // // BlockTableRecord btrModelSpace = (BlockTableRecord)trAdding.GetObject( btTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite ); // BlockReference brRefBlock = new BlockReference(Point3d.Origin, btrId); // btrModelSpace.AppendEntity(brRefBlock); trAdding.AddNewlyCreatedDBObject(brRefBlock, true); // AttributeReference arAttr = new AttributeReference(); arAttr.SetAttributeFromBlock(adAttr, brRefBlock.BlockTransform); arAttr.TextString = "!"; brRefBlock.AttributeCollection.AppendAttribute(arAttr); trAdding.AddNewlyCreatedDBObject(arAttr, true); // trAdding.Commit(); } }
この例は、より複雑なオブジェクト(ブロック)を作成するプロセスを示しています。 ブロックを作成するプロセスは次のとおりです。
1)ブロック定義を(BlockTableテーブルの要素として)作成し、ブロックテーブルに追加します(ブロック名の正確さを確認することを忘れないでください)。
2)ブロック属性のプリミティブと定義を作成し、ブロック定義に追加します。
3)ブロックのインスタンス(BlockReference)を作成し、関心のあるスペース(この例ではモデルスペース)のデータベースに追加します。
4)属性値を設定します。
すべて、ブロックの準備ができました。
例2の結果
ミスアドベンチャー
これで私は急いで締めくくります。 記事を読んでくれてありがとう、そして私はあなたに思い出させます:私はすべてのコメント、エラーの表示、そして単に重要なコメントを喜んで検討します!
また、このトピックについてさらに説明することが理にかなっているか、このトピックが誰かに興味があるかどうかをコメントで示すようにお願いします。
文学
through-the-interface.typepad.com-Kean Walsmleyのブログ、素晴らしい例のコレクション。
spiderinnet1.typepad.com - spiderinnet1ブログ、別の例のブログ。
sites.google.com/site/bushmansnetlaboratory-ロシア語Autocad Net開発者ガイドへの部分的な翻訳
www.theswamp.org -Autocad .netの英語フォーラム。 多くの例が考慮されています。
www.caduser.ru-ロシア語のフォーラム。 多くの場合、実際の.netプログラミングの達人が立ち寄って教えます。 非常に有用なリソース。
forums.autodesk.com-公式のAutocadフォーラムは英語のフォーラムです
Autocad Net Developer Giude -Autocad用のアプリケーションを作成する際の基本的な資料。
forum.dwg.ru -Autocad専用の別のロシア語フォーラム( BoxaShuに感謝)