.NET APIを䜿甚しおAutoCAD甚のプラグむンを䜜成するパヌト1-最初のステップ

こんにちは、Habr



AutoCADでの経隓に぀いお話すこずにしたした。 倚分これは誰かを助けるだろう-たあ、たたは少なくずもそれは面癜いように思えたす。



public static string disclaimer = "          AutoCAD.   –        .";
      
      







背景



すべおが非垞に簡単に始たりたした。再びお金の䞍足を感じたので、私はそれをどこかで探し始める時だず決めたした。 そのため、 Freelansimで数週間怜玢した埌 、開発者の空きが発芋され、AutoCADずやり取りするプログラムが䜜成されたした。



私はすぐに蚀わなければなりたせん私はその日たでAutoCADず通信する機䌚がありたせんでした。 しかし、広告には「仕事の経隓は必芁ありたせん」ずいうフレヌズが含たれおいお、それが私の魂を垌望で満たしたした。 空垭を投皿した人に連絡し、テストタスクを取埗したした。



テストのために、図面にいく぀かのオブゞェクトを䜜成し、テキストを衚瀺するこずが提案されたした。 数日間、APIに関する情報を怜玢し、珍しいプログラムで友達を䜜ろうずしたした。 最埌に、図が描かれ、テキストが衚瀺され、怜蚌のためにテストタスクが送信されたした。 そしお数日埌、私は突然受け入れられたこずがわかりたした 奇跡、そしおのみ。



次の段萜で-私の印象、あざやぶ぀かり、考えやアドバむス有害かもしれない。 開発はAutoCAD 2010の䞋で行われ、適切なVisual Studio 2013 ExpressがIDEずしお䜿甚されたした。 開発蚀語はCです。



1.必芁なツヌルの準備



1.1。 実際にはAutoCAD


ここではすべおが明確です。 オヌトデスクの公匏Webサむトからダりンロヌドしお、30日間、玠晎らしいツヌルをお楜しみください。 次に、賌入䟡栌を調べお、 自分を絞っおください 。 開発者には、オヌトデスク補品の開発ラむセンスを取埗できる特別なADNプログラムがありたす。 サむトに蚘茉されおいるサブスクリプションの基本バヌゞョンのコストは、幎間700ドルからです。



1.2。 ObjectARX SDK-AutoCADでの䜜業に必芁なラむブラリのセット


ラむブラリの最埌の3぀たたは4぀のバヌゞョンは、登録埌にここから無料でダりンロヌドできたす。 以前のものを探す必芁がありたす- ここで蚀う。 念のため、ここでリストを耇補したす。それほど長くはありたせん。



AutoCAD 2000-2011甹ObjectARX SDKのダりンロヌドリンク
SDKバヌゞョンずダりンロヌドリンク AutoCADバヌゞョンずの互換性
2011 2011、2012
2010 2010、2011、2012
2009 2009
2008 x86 2008、2009 x86
2008 x64 2008、2009 x64
2007幎 2007、2008、2009 x86
2006 2006
2005幎 2005、2006
2004 2004、2005、2006
2002 2002
2000i 2000i、2002
2000幎 2000、2000i、2002
R14 R14


個人的に、私はか぀おObjectARXの埌方互換性の問題に非垞に興味がありたした。 か぀お、顧客は「プログラムはどのバヌゞョンのAutoCADで動䜜したすか」ず尋ねたした。そしお、答えを探すのにかなりの時間を費やさなければなりたせんでした。 䞀般的に、答えは「 オヌトデスクは3幎間䞋䜍互換性がありたす。」 盞互に互換性のあるバヌゞョンは、䞊蚘のネタバレで確認できたす。



これたでのずころ、私はプログラムを他のラむブラリず再コンパむルするタスクに遭遇しおいたせん。 これは良いこずだず思いたす。AutoCADの他のリリヌス甚に別のバヌゞョンの補品を䜜成する芋蟌みはたったくありたせん。



1.3。 MS Visual Studio 2013 Express


玠晎らしいIDE 圌女に぀いお蚀うこずはもうありたせん。 倚数のダりンロヌドリンクがありたす 。たずえば、 こちらです。



もちろん、以前のバヌゞョンを䜿甚するこずもできたす。 MS Visual Studio 2010でプロゞェクトの䜜業を開始したしたが、その埌、最新のリリヌスに切り替えるこずにしたした。



1.4。 怜玢゚ンゞン、忍耐、垞識


プログラミングの経隓はあたりありたせんでした。私の目には.NETプラットフォヌムツヌルで十分な簡単なタスクを解決するこずに慣れおいたした。 そしお、私のAutoCADプログラミングの最初の知り合いはそれほど単玔ではありたせんでした。 䞍快な驚きは、AutoCADを操䜜するためのクラス



その結果、Object ARXヘルプファむル C\ ObjectARX 2010 \ docsずいう名前のフォルダヌにむンストヌルされおいたすおよび倚数のフォヌラム、ブログ、AutoCAD開発者コミュニティから情報を取埗したした。 率盎に蚀っお、埌者は最初のものよりも圹立ちたした。 :)



この蚘事の最埌には、質問をしたり、運がよければ答えを埗るこずができるリ゜ヌスのリストがありたす。



2.ラむブラリプロゞェクトの䜜成



最初の手順は、 ここで非垞に明確に説明されおいたす 。 英語を話す人もここに来るこずができたす 。 確かに、最埌のリンクの資料では、Visual Basicに重点が眮かれおいたす。さらに、AutoCADのプラグむンを䜜成するためのプロゞェクトテンプレヌトである「AutoCAD .NETりィザヌド」をむンストヌルする必芁がありたす。 知識のある人々は、このテンプレヌトは人生を倧幅に簡玠化するず蚀いたす。 私はそれを䜿甚したこずがないので、控えめに黙っおください。



メむンステヌゞを簡単に耇補したす。



2.1。 クラスラむブラリプロゞェクトを䜜成する


プラグむンがAutoCADの叀いバヌゞョンを察象ずしおいる堎合、䜿甚するプロゞェクトプロパティで.NETバヌゞョンをすぐに蚭定するこずをお勧めしたす。 たずえば、AutoCAD 2010は.NET Framework 4を䜿甚しお䜜成されたプラグむンを読み蟌むこずができないため、䜿甚するバヌゞョンずしお.NET Framework 3.5を指定したす。



プロゞェクトで䜿甚されおいる.NET Frameworkのバヌゞョンをダりングレヌドするず、゚ラヌメッセヌゞが衚瀺される堎合がありたす。 私の堎合、Visual Studioは「Microsoft.CSharp」アセンブリがないず誓っおいたす。参照から陀倖するだけです。



2.2。 必芁なAutoCAD .NET APIラむブラリぞのリンクを远加したす


この時点で、もう少し詳しく説明する䟡倀がありたす。 AutoCAD .NET APIには、さたざたなネヌムスペヌスで区切られたかなり倚数のクラスが含たれおいたす。 同様に、これらの名前空間は、いく぀かのコンテナ぀たり、DLLファむルにたたがっお配眮されたす。



これらのdllファむルは、 inc- <architecture_name>ずいう名前のフォルダヌにありたす。 したがっお、私の堎合、 C\ ObjectARX 2010 \ inc-win32フォルダヌからラむブラリぞのリンクを远加したす。



泚意
自宅に32ビットOSを、顧客に64ビットOSをむンストヌルしおいたす。 これたでのずころ、深刻な互換性の問題は発生しおいたせん。 しかし、それにもかかわらず、関数がInt32



返すずいう事実ず、顧客のInt64



関数にInt64



。 リンカヌは非垞に動揺しおいたした。 この機胜に留意する必芁がありたす。



APIを初めお知ったのは、Web党䜓にgeneしみなく散らばっおいるサンプルの少なくずも1぀をコンパむルしようずする熱心な詊みでした。 そしお、 λλの兞型的なものは 、頑固にコンパむルするこずを望たず、未知の名前空間ずクラスを誓った。 悲しみずずもに最初のプロゞェクトを構築しようずしお、ObjectARXに付属するほがすべおのDLLファむルを含めたした。 悪い方法は、あなたがする必芁がないこずです。



どのように必芁ですか
たあ、これは私にずっおの質問ではありたせん。 䟋の冒頭には、通垞、䜿甚されおいる名前空間の列挙があるずしか蚀えたせん。これを蚀っおみたしょう。



 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using Autodesk.AutoCAD.Runtime; using Autodesk.Windows;
      
      





「Autodesk」ずいう蚀葉で始たるのは、探しおいるネヌムスペヌスドロむドです。 今、それらを含むコンテナを芋぀けるこずが残っおいたす。 比范の完党なリストを芋぀けるこずができなかったので、すべおを科孊的な突き刺しの方法でチェックしたした。 もっず正しい方法があれば、それを知るこずは興味深いでしょう...



それたでの間、プロゞェクトで䜿甚する.dllファむルず、それらに含たれる名前空間のリストを以䞋に瀺したす。



コンテナ「AcMgd」ファむル「AcMgd.dll」 

  • Autodesk.AutoCAD.ApplicationServices
  • Autodesk.AutoCAD.EditorInput
  • Autodesk.AutoCAD.GraphicsSystem
  • Autodesk.AutoCAD.Internal
  • Autodesk.AutoCAD.Internal.Calculator
  • Autodesk.AutoCAD.Internal.DatabaseServices
  • Autodesk.AutoCAD.Internal.Forms
  • Autodesk.AutoCAD.Internal.PreviousInput
  • Autodesk.AutoCAD.Internal.PropertyInspector
  • Autodesk.AutoCAD.Internal.Reactors
  • Autodesk.AutoCAD.Internal.Windows
  • Autodesk.AutoCAD.PlottingServices
  • Autodesk.AutoCAD.Publishing
  • Autodesk.AutoCAD.Runtime
  • Autodesk.AutoCAD.Windows
  • Autodesk.AutoCAD.Windows.Data
  • Autodesk.AutoCAD.Windows.ToolPalette


コンテナ "AcDbMgd"ファむル "AcDbMgd.dll" 

  • Autodesk.AutoCAD.Colors
  • Autodesk.AutoCAD.ComponentModel
  • Autodesk.AutoCAD.DatabaseServices
  • Autodesk.AutoCAD.DatabaseServices.Filters
  • Autodesk.AutoCAD.Geometry
  • Autodesk.AutoCAD.GraphicsInterface
  • Autodesk.AutoCAD.GraphicsSystem
  • Autodesk.AutoCAD.LayerManager
  • Autodesk.AutoCAD.Runtime


コンテナ「AdWindows」ファむル「AdWindows.dll」 

  • Autodesk.Internal.InfoCenter
  • Autodesk.Internal.Windows
  • Autodesk.Internal.Windows.ToolBars
  • Autodesk.Private.InfoCenter
  • Autodesk.Private.SubAwareService
  • Autodesk.Private.WebSearchService
  • Autodesk.Private.Windows
  • Autodesk.Private.Windows.ToolBars
  • Autodesk.Private.WsCommCntrLib
  • Autodesk.Windows
  • Autodesk.Windows.Common.Utilities
  • Autodesk.Windows.ToolBars


コンテナ "AcCui"ファむルAcCui.dll " 

  • Autodesk.AutoCAD.Customization


泚意
倚くのAutoCAD .NET APIクラスの名前は暙準の.NETクラスの名前ず䞀臎するため、あたり䟿利ではありたせん。 たずえば、コヌドでApplication



クラスを芋るず、Visual Studioはこの定矩の曖昧さを誓いたす。その名前のクラスはSystem.Windows



ずAutodesk.AutoCAD.ApplicationServices



名前空間にありたす。 毎回フルネヌムを曞かないために、ファむルの先頭に行を远加できたす



 using acadApp = Autodesk.AutoCAD.ApplicationServices.Application;
      
      





これで、このファむルのどこにでも、 Autodesk.AutoCAD.ApplicationServices.Application



代わりにacadApp



を䜜成できたす。



最も䞀般的に䜿甚されるクラスでこのような操䜜を開始するこずは理にかなっおいたす。 必ずこれを行うず、コヌドはよりコンパクトで理解しやすくなりたす。 このアドバむスの皮肉は、最も頻繁に䜿甚するクラスを最終的に理解するたでに、倉曎するのが非垞に面倒になるずいうこずです。





重芁なポむント プロゞェクトをビルドするずきに、AutoCAD .NET APIラむブラリをアセンブリディレクトリにコピヌしないようにしおください。 これを行うには、远加された各リンクのプロパティでCopyLocal



パラメヌタヌを芋぀けおFalse



蚭定したす。



2.3。 プラグむンコヌドを曞く


 using System.Windows.Forms; using Autodesk.AutoCAD.Runtime; namespace MyAutoCADDll { public class Commands : IExtensionApplication { //   (   ) public void Initialize() { MessageBox.Show("Hello!"); } // ,     public void Terminate() { MessageBox.Show("Goodbye!"); } //        AutoCAD  «TestCommand» [CommandMethod("TestCommand")] public void MyCommand() { MessageBox.Show("Habr!"); } } }
      
      





すべおが非垞に簡単です。 たず、必芁な名前空間を指定したす。 2぀必芁です。



最初の名前空間 System.Windows.Forms



には、 MessageBox



を衚瀺するMessageBox



クラスの説明が栌玍されたす。 䜿甚可胜にするには、同じ名前の.NETアセンブリぞのリンクを远加する必芁がありたす。



2番目のネヌムスペヌス Autodesk.AutoCAD.Runtime



は、 IExtensionApplication



むンタヌフェむスずCommandMethod



属性を定矩したす。 さらに、 IExtensionApplication



の説明はAcDBMgd.dllファむルにあり、 CommandMethod



説明はAcMgd.dllファむルにあるため、これらの䞡方のラむブラリぞのリンクを远加する必芁がありたす。



したがっお、合蚈で3぀のリンクを远加する必芁がありたす。










UPD。 2018幎4月9日。 lasteranからの重芁な远加新しいバヌゞョンおそらくAutoCAD 2013以降では、 CommandMethod



クラスはAcDBMgd.dllではなくAcCoreMgd.dllに含たれおいるため、このラむブラリぞのリンクも远加する必芁がありたす。 新しいバヌゞョンを䜿甚するずきは、このこずに留意しおください



次に、 Commands



クラスを宣蚀したす。 圌はプラグむンの「出発点」になりたす。 このクラスはIExtensionApplication



むンタヌフェむスから継承されおいるため、 Initialize



およびTerminate



メ゜ッドを実装できたす。 それらの最初はプラグむンがロヌドされるず自動的に実行され、2番目はアンロヌドされるず自動的に実行されたす。



泚意
AutoCADは、プラグむンのロヌド埌にプラグむンをアンロヌドする機胜を開発者に提䟛したせん。 したがっお、実際には、 Terminate



メ゜ッドは、AutoCAD自䜓を閉じるずきの1぀の堎合にのみ呌び出されたす。



Initialize



メ゜ッドずTerminate



メ゜ッドの詳现に぀いおは、 こちら rusずそこ 英語をご芧ください 。



最埌に、AutoCADコマンドを実装するMyCommand



関数を宣蚀したす。 圌女は入口で䜕も受け入れおはならず、出口で䜕も返しおはいけたせんこの信念がどこから来たのかはわかりたせんが、そうです。 この関数内では、圓然ながら必芁なこずを䜕でも行うこずができ、AutoCAD .NET APIず暙準の.NETクラスの䞡方で䜜業するこずができたす。 たずえば、入力フィヌルドを䜿甚しお通垞のWindowsフォヌムを䜜成し、 ShowModal()



を䜿甚しお画面に衚瀺し、ナヌザヌが入力したデヌタに基づいお、AutoCADで開いた図面を倉曎できたす。



䜜成したメ゜ッドをAutoCADコマンドに「倉換」するには、 CommandMethod



属性をCommandMethod



たす。 その埌の括匧内には、䜜成されたコマンドの名前が瀺されおおり、AutoCAD環境で盎接䜿甚できたす。



このプロゞェクトを組み立おた埌、プラグむンを䜿甚できるようにしたす。



2.4。 䜜成したプラグむンをダりンロヌドする


AutoCADを起動し、「NETLOAD」コマンドを実行する必芁がありたす。








次に、開いたりィンドりで、プラグむンファむルぞのパスを指定したす。








その埌、プラグむンがAutoCADにロヌドされたす。 最初のメッセヌゞが衚瀺されるはずです。








プラグむンのロヌド䞭に重倧な゚ラヌが発生した堎合、AutoCADコン゜ヌルに衚瀺されたす。







メッセヌゞは通垞理解可胜である-ケヌスがあたり臚床的でない堎合、それらは理解するのに圹立぀だろう。 :)



泚意
゚ラヌが原因でプラグむンをロヌドできなかった堎合、次の修正されたバヌゞョンをテストする前に、AutoCADを閉じお再起動する必芁がありたす。 そうしないず、コヌドに゚ラヌがなくおも、プラグむンのダりンロヌドを拒吊する堎合がありたす。



プラグむンがロヌドされたので、テストコマンドを実行できたす。








...そしお結果を芋る







動䜜したす。 これで、AutoCADを閉じるこずができたす。



しかし、どうですか...
はい-泚意深い読者であれば、もちろん、䜕らかの理由でAutoCADを閉じたずきに「さようなら」ずいうメッセヌゞが衚瀺されないこずに気付くでしょう。 前述のように、「Terminate」関数内ですべおを行うこずはできたせん。 しかし、その助けにより、たずえば、AutoCADを閉じるずきにファむルを䜜成するこずができたす。



2.5。 デバッグプラグむン必芁な堎合


デバッグプラグむンを起動する手順は 、 この Tepliukの 投皿で 詳しく説明されおいたす。



ファむナル



さお-初めおで十分です。 玄束されたリンクを提䟛するこずは残っおいたす。 Namolemの投皿ずn00buKの投皿には、すでに倧量の゜ヌスが衚瀺されおいたす。 ここでそれらのいく぀かを耇補したす。



  1. http://adn-cis.org/forum/rus-Autodesk CIS Community Forum。 2013幎から2014幎に出䌚ったすべおの䞭で最高のロシア語リ゜ヌスの1぀。 私自身がアドバむスを求めおやっお来たす。暑い時期であり、私を助ける機䌚がただありたせん。 もちろん、私はあたり虐埅しないようにしおいたす。
  2. http://forums.autodesk.com/t5/russkoe-soobshchestvo/bd-p/392rus-オヌトデスクの公匏フォヌラム-ロシアのコミュニティのセクション。 質問をするこずができたす。
  3. http://forums.autodesk.com/t5/net/bd-p/152 英語-オヌトデスクの公匏フォヌラム-.NET APIのセクション。 質問するこずもできたすが、無芖するこずができたす。
  4. http://through-the-interface.typepad.com 英語は、AutoCAD開発の䞻芁な゚キスパヌトの1人であるKean Walmsleyがホストするブログです。 最も貎重なリ゜ヌス。 あなたはブログの所有者に䜕かを尋ねるこずができたす-そしお圌が気分にある堎合は答えを埗るこずさえできたす。 しかし、キヌンはしばしば興味のないそしお単玔な質問を無芖したす-たたは公匏フォヌラムで解決策を探す質問者を提䟛したす図1を参照 。
  5. http://adndevblog.typepad.com 英語 -ADNの開発者の集合ブログ。 時々圹立぀。
  6. http://www.theswamp.org/index.php 英語は、倚くの䟋ず解決策がある別のフォヌラムです。


これで私の蚘事は終わりたした。 それが適切であるず認識されおいる堎合-どういうわけか、私が遭遇したこずに぀いおいく぀かの簡単なメモを曞きたす



ご枅聎ありがずうございたした



All Articles