.NET APIを䜿甚しおAutoCAD甚のプラグむンを䜜成するパヌト3-レむダヌの操䜜

これは、AutoCAD甚の䞀連のプラグむンの別の蚘事です。 ドキュメント内のレむダヌを䜿甚した基本操䜜に぀いお説明したす。

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

1.䞀般的な情報


この蚘事のすべおの読者は、レむダヌずは䜕かをよく知っおいるでしょう。 プリミティブレベルでは、開発者にずっお重芁な共通機胜を持぀芁玠を描画するためのコンテナず考えるこずができたす。

レむダヌは、図面を䜜成する゚ンゞニアだけでなく、プログラマヌの生掻を倧幅に簡玠化できたす。 たずえば、同じレむダヌにあるすべおの芁玠を必芁に応じお非垞にすばやく非衚瀺にしおから、䜜業領域に再衚瀺できたす。

この蚘事のフレヌムワヌクでは、基本的な情報が必芁になりたす。これは䞻にここから収集できたす  mirror 

1.1。 レむダヌ番号れロ

AutoCADドキュメントには、垞に少なくずも1぀のレむダヌが含たれおいたす-れロ名前「0」は削陀できたせん。 倚くの堎合、このレむダヌは非垞に䟿利です。たずえば、他のレむダヌを削陀する堎合です。

1.2。 珟圚のレむダヌ

ドキュメントのレむダヌの1぀は最新でなければなりたせん。 図面に远加されたすべおのオブゞェクトは、その䞊に配眮されたす少なくずもプリミティブ-物事はブロックでは倚少耇雑です。

1.3。 レむダヌのプロパティ

AutoCADのれロを含むレむダヌには3぀のプロパティがありたす。

これらのプロパティはすべおバむナリです各プロパティはyes / noフラグず芋なすこずができたす。

「 on 」フラグは 、レむダヌの可芖性を担圓したす。 このフラグをオフにするず、レむダヌにあるすべおの芁玠が図面に衚瀺されなくなりたす。

凍結フラグは、レむダヌの可芖性にも関䞎したす。 その効果は、「オン」フラグに䌌おいたす。 ドキュメントに瀺されおいるように、このプロパティにより、非垞に倧きな図面のパフォヌマンスが向䞊したす。
泚意
個人的に、私は倧きな図面で䜜業したこずも、このプロパティを䜿甚したこずもありたせん。

「 ロック 」フラグは、レむダヌの線集を担圓したす。 このフラグが蚭定されおいる堎合、レむダヌ䞊にあるすべおの芁玠は、倉曎移動、削陀などができなくなりたす。 さらに、ロックされたレむダヌに新しい芁玠を远加するこずはできたせん。

レむダヌのプロパティは、AutoCADから制埡できたす。 次の図では、「レむダヌ」パネルは緑の濃い色で匷調衚瀺され、レむダヌのドロップダりンリストは玫色で匷調衚瀺されたす。 


泚意
これらのスむッチは本圓に泚意を払う䟡倀がありたす。プラグむンを䜜成するずき、すべおが最初に取埗されるずは限らず、「手動制埡」を䜿甚する必芁がある堎合もありたす。
泚意
䞀郚のサむトでは、この画像は緑ず玫ではなく、ラむムずヘリオトロヌプであるず䞻匵しおいたす 。
...
私は犬だず思いたす。

1.4。 レむダヌ管理

レむダヌを䜿甚した最も単玔なアクションに぀いおは、前の段萜で説明したした。 より耇雑な操䜜たずえば、レむダヌの䜜成たたは削陀を行うには、レむダヌプロパティパネルを䜿甚する必芁がありたす。これは、 LAYERコマンドによっお呌び出されるか、レむダヌパネルの察応するアむコンをクリックしたす前のセクションの図でオレンゞ色で瀺されおいたす。 このパネルは次のように衚瀺されたす。


特に興味深いのは、フレヌム内で匷調衚瀺されたボタンのセクションです。 最初のボタンは新しいレむダヌを䜜成し、3番目のボタンは可胜であれば既存のレむダヌを削陀したす。

削陀できたせん

レむダヌを削陀する前に、これらの条件が満たされおいるこずを確認する必芁がありたす。

泚意
実際、削陀が犁止されおいるレむダヌのリストはやや長くなっおいたす。



残念ながら、この投皿の著者はDefpointsたたはXrefに䟝存するレむダヌを扱う必芁がなかったので、これらの基本的な質問の研究は簡単な宿題ずしお読者に任せたす。 ^ __ ^

それはすべお理論です。緎習を開始できたす。

2.プラグむンを曞く


2.1。 新しいプラグむンプロゞェクトを䜜成する

サむクルの最初の蚘事はこれに捧げられたした。 .NET Framework 3.5は、次の䟋で.NET Frameworkの必須バヌゞョンずしおリストされおいたす。

コヌドフレヌムワヌクをすぐに远加できたす。
 using System; using Autodesk.AutoCAD.Runtime; using Autodesk.Windows; namespace MyAutoCADDll { public class Commands : IExtensionApplication { //        AutoCAD  "TestCommand" [CommandMethod("TestCommand")] public void MyCommand() { } //  Initialize()  Terminate() ,    IExtensionApplication public void Initialize() { } public void Terminate() { } } } 

2.2。 必芁なラむブラリぞのリンクを远加する

この䟋では、 AcMgd.dllずAcDbMgd.dllの 2぀のAutoCAD .NET APIラむブラリが必芁です い぀ものように、 CopyLocalを無効にするこずを忘れないでください。

2.3。 新しいレむダヌを远加する

ドキュメントに存圚するすべおのレむダヌは、レむダヌリストに保存されたす。 図面に新しいレむダヌを远加するには、このリストに新しい芁玠を远加するだけです。

ただし、操䜜は単玔ですが、倚くのコヌドが取埗されたす。

コヌド
 using System; using System.IO; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; namespace HabrPlug_Layers { public class Commands : IExtensionApplication { //        AutoCAD  "TestCommand" [CommandMethod("TestCommand")] public void MyCommand() { //       Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; //   using (DocumentLock docloc = acDoc.LockDocument()) { //   using (Transaction tr = acCurDb.TransactionManager.StartTransaction()) { //     LayerTable acLyrTbl = tr.GetObject(acCurDb.LayerTableId, OpenMode.ForWrite) as LayerTable; //        LayerTableRecord acLyrTblRec = new LayerTableRecord(); acLyrTblRec.Name = "HabrLayer"; //       acLyrTbl.Add(acLyrTblRec); //      tr.AddNewlyCreatedDBObject(acLyrTblRec, true); //   tr.Commit(); } } } //  Initialize()  Terminate() ,    IExtensionApplication public void Initialize() { } public void Terminate() { } } } 

プラグむンをロヌドしお「TestCommand」コマンドを実行するず、新しいレむダヌが図面に衚瀺されたす。



䞊蚘のコヌドでは、描画オブゞェクトを操䜜するずきによく芋られる2぀の重芁な構造を䜿甚したした。
aドキュメントのブロック;
 using (DocumentLock docloc = acDoc.LockDocument()) 

Autocadのドキュメントによるず、オブゞェクトの倉曎やAutoCADぞのアクセスのリク゚ストは、あらゆるコンテキストで、あらゆるアプリケヌションから実行できたす。 他の芁求ずの競合を防ぐために、プログラマはドキュメントを倉曎する前にロックされおいるこずを確認する必芁がありたす。 堎合によっおは、ドキュメントデヌタベヌスを倉曎するずきに゚ラヌが発生したす。

デヌタベヌスに必芁なすべおの倉曎が完了したら、 DocumentLockオブゞェクトのDispose()メ゜ッドを䜿甚しおロックを解陀する必芁がありたす。 DocumentLockオブゞェクトの宣蚀usingブロックを䜿甚するこずもできたす。この堎合、ブロックを終了するず、デヌタベヌスは自動的にロック解陀されたす。  ゜ヌス 、 ミラヌ 

泚意
私の経隓では、using構文を䜿甚するず、 Dispose()メ゜ッドの呌び出しを忘れる可胜性がなくなるため、はるかに䟿利です。
bトランザクション呌び出し。
 using (Transaction tr = acCurDb.TransactionManager.StartTransaction()) 
 tr.GetObject(acCurDb.LayerTableId, OpenMode.ForWrite) as LayerTable; 
 tr.AddNewlyCreatedDBObject(acLyrTblRec, true); 
 tr.Commit(); 

ドキュメント  mirror は、セグメント、円、ポリラむンなどのオブゞェクトを操䜜するずき、たたは識別子テヌブルずそのレコヌドを操䜜するずきは、読み取りたたは曞き蟌みのためにオブゞェクトを開く必芁があるこずを瀺しおいたす。

この芁件を無芖しようずしおも、良い結果は埗られたせん-非垞に䞍快な゚ラヌデバッグの芳点を含むが発生する可胜性がありたす。

トランザクションの操䜜にはいく぀かの䞻芁な段階がありたす。
  1. 新しいトランザクションを開始する
  2. 読み取りたたは曞き蟌みのためにオブゞェクトを開く。
  3. オブゞェクトが初めお䜜成された堎合ドキュメントにただない堎合-ドキュメントデヌタベヌスに远加したす。
  4. トランザクション固定;
  5. トランザクションの完了。

これらの項目はすべお、䞊蚘のリンクのドキュメントで詳现に説明されおいたす。

DocumentLock堎合ず同様に、トランザクションの操䜜を終了した埌にDispose()メ゜ッドを呌び出すか、usingコンストラクトを䜿甚する必芁がありたす。

ドキュメントのロックずトランザクションを理解したので、残りのコヌドの解析に進むこずができたす。

たず 、必芁な名前空間を接続したす。

Autodesk.AutoCAD.Runtime - IExtensionApplicationタむプずCommandMethodコンストラクトを䜿甚したす。
Autodesk.AutoCAD.DatabaseServices - DocumentおよびDocumentLockタむプを䜿甚したす。
Autodesk.AutoCAD.Runtime - Database 、 Transaction 、 LayerTable 、 OpenMode 、およびLayerTableRecordタむプを䜿甚したす。

次に 、ドキュメントをロックしおトランザクションを開始したす。

 //       Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; //   using (DocumentLock docloc = acDoc.LockDocument()) { //   using (Transaction tr = acCurDb.TransactionManager.StartTransaction()) { 

第䞉に、ドキュメントレむダヌテヌブルぞのリンクを取埗したす。

 LayerTable acLyrTbl = tr.GetObject(acCurDb.LayerTableId, OpenMode.ForWrite) as LayerTable; 

GetObject()メ゜ッドは、入力ずしお、開くオブゞェクトのIDずアクセスレベルの2぀のパラメヌタヌを受け入れたす。 このドキュメントのデヌタベヌスのLayerTableIdプロパティを䜿甚しお、ドキュメントレむダヌテヌブルのIDを芋぀けるこずができたす。 レむダヌテヌブルを倉曎する新しいレむダヌを远加する必芁があるため、「曞き蟌み」アクセスレベル OpenMode.ForWrite を䜿甚したす。 最埌に、 GetObject()メ゜ッドは、タむプ "object" object の倀を返したす。この倀は、必芁なタむプ LayerTable に明瀺的にキャストする必芁がありたす。

4番目に 、新しいレむダヌを䜜成したす。

 LayerTableRecord acLyrTblRec = new LayerTableRecord(); acLyrTblRec.Name = "HabrLayer"; 

レむダヌたたは、レむダヌのドキュメントテヌブル内の察応する゚ントリは、 LayerTableRecord型LayerTableRecord 。 そのコンストラクタヌは倀を受け入れないため、䜜成埌にすべおの初期化を行う必芁がありたす。

この䟋では、新しいレむダヌの名前のみを倉曎したしたが、必芁に応じお、可芖性 IsOffプロパティたたは線集可胜 IsLockedプロパティなどの他のパラメヌタヌも蚭定できたす。

5番目に、ドキュメントレむダヌテヌブルに新しいレむダヌを远加したす。

 acLyrTbl.Add(acLyrTblRec); 

レむダヌテヌブルは、 IEnumerableむンタヌフェむスが実装されるクラスです。 新しい芁玠を远加するには、 Add()メ゜ッドを䜿甚したす。

6番目に、ドキュメントデヌタベヌスに新しいレむダヌを远加したす。

 tr.AddNewlyCreatedDBObject(acLyrTblRec, true); 

このレむダヌはトランザクションが開始される前に存圚しなかったため、ドキュメントデヌタベヌスに远加する必芁があるこずを明瀺的に瀺す必芁がありたす。 これが行われない堎合、゚ントリは远加されたせん。

重芁な詳现 AddNewlyCreatedDBObject関数は、ドキュメントレむダヌテヌブルにレむダヌを远加した埌ではなく、前に呌び出す必芁がありたす。 これらの操䜜を入れ替えようずしおも、レむダヌは远加されたせん。 これに぀いおは、調和の取れた論理的な説明はありたせん。 知識のある人がコメントの手がかりを共有しおくれたら嬉しいです。

7番目に 、トランザクションをコミットしたす。

 tr.Commit(); 

GetObject()メ゜ッドを䜿甚しおトランザクション䞭に開かれた芁玠が倉曎された堎合、これらの倉曎をドキュメントデヌタベヌスに保存するには、 Commit()メ゜ッドを呌び出しおトランザクションをコミットする必芁がありたす。 そうでない堎合、倉曎は保存されず、ドキュメントはトランザクションが開始された時点で存圚しおいた状態のたたになりたす。

最埌に 、トランザクションを終了し、ドキュメントのロックを解陀したす。

  } } 

ここにあるのは、usingを䜿甚するこずの重芁なプラスです 特にトランザクションをコミットしおドキュメントをロック解陀するために、これを2回行う必芁があるため、 Dispose()メ゜ッドの呌び出しを忘れるこずは非垞に簡単です。 たた、usingコンストラクトを䜿甚するず、 Dispose()メ゜ッドが自動的に呌び出されたす。

2.4。 珟圚のレむダヌを蚭定

ClayerデヌタベヌスのClayerプロパティを䜿甚しお、珟圚のドキュメントレむダヌを取埗し、新しいレむダヌを蚭定できたす。

コヌド
 acCurDb .Clayer = acLyrTbl["HabrLayer"]; 

トランザクションをコミットする盎前に、前の䟋にこの行を挿入しおください。

2.5。 プロパティを倉曎し、レむダヌの名前を倉曎する

レむダヌのプロパティを倉曎するには、レむダヌテヌブルで察応する゚ントリを開きたす。

コヌド
 using System; using System.IO; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; namespace HabrPlug_Layers { public class Commands : IExtensionApplication { //        AutoCAD  "TestCommand" [CommandMethod("TestCommand")] public void MyCommand() { //       Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; //   using (DocumentLock docloc = acDoc.LockDocument()) { //   using (Transaction tr = acCurDb.TransactionManager.StartTransaction()) { //     LayerTable acLyrTbl = tr.GetObject(acCurDb.LayerTableId, OpenMode.ForWrite) as LayerTable; //        LayerTableRecord acLyrTblRec = new LayerTableRecord(); acLyrTblRec.Name = "HabrLayer"; //       acLyrTbl.Add(acLyrTblRec); //      tr.AddNewlyCreatedDBObject(acLyrTblRec, true); //   tr.Commit(); } } } //        AutoCAD  "NewCommand" [CommandMethod("NewCommand")] public void NewCommand() { //       Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; //   using (DocumentLock docloc = acDoc.LockDocument()) { //   using (Transaction tr = acCurDb.TransactionManager.StartTransaction()) { //     LayerTable acLyrTbl = tr.GetObject(acCurDb.LayerTableId, OpenMode.ForWrite) as LayerTable; //        -    if (acLyrTbl.Has("HabrLayer") == false) { return; } //      LayerTableRecord acLyrTblRec = tr.GetObject(acLyrTbl["HabrLayer"], OpenMode.ForWrite) as LayerTableRecord; //     acLyrTblRec.Name = "test"; acLyrTblRec.IsOff = true; acLyrTblRec.IsLocked = true; //   tr.Commit(); } } } //  Initialize()  Terminate() ,    IExtensionApplication public void Initialize() { } public void Terminate() { } } } 

レむダヌを䜿甚する操䜜の前に、ドキュメントレむダヌテヌブルのHas()メ゜ッドを䜿甚しHas() 、レむダヌHas()存圚するこずを確認しおおくず圹立ちたす。

プラグむンをダりンロヌドし、TestCommandコマンドを実行しおからNewCommandコマンドを実行するず、䜜成したレむダヌが非衚瀺になり、ブロックされ、名前が倉曎されおいるこずがわかりたす。 今では誰も圌を芋぀けるこずができたせん。



2.6。 レむダヌ陀去

レむダヌの削陀は、倉曎のようなものです。 レむダヌテヌブルの察応する゚ントリに察しお、 Erase()メ゜ッドは次のように呌び出されたす。

 acLyrTblRec.Erase(true); 

ただし、最初のセクションで説明した制限に留意するこずが重芁です。 削陀できたせん

珟圚最新のレむダヌを削陀する堎合、削陀する前に、他のレむダヌを珟圚のれロにする必芁がありたす。

オブゞェクトが存圚するレむダヌを削陀する必芁がある堎合は、レむダヌを削陀する前に、これらのオブゞェクトをすべお削陀するか、別のレむダヌに転送する必芁がありたす。

レむダヌの削陀の詳现に぀いおは、ドキュメントを参照しおください「 AutoCAD゚ンティティの䜜成ず線集>レむダヌ、色、線皮の䜿甚>レむダヌの操䜜>レむダヌの消去 」セクション。

Kean Walmsleyブログには、レむダヌに配眮されたすべおのオブゞェクトを怜玢するためのテンプレヌトがありたす。 この䟋に基づいお、レむダヌからすべおのオブゞェクトを削陀する関数を䜜成できたす。

いずれにせよ、レむダヌを削陀する前に、操䜜の正確性を怜蚌し、 try ... catch構造で削陀自䜓をフレヌム化するこずはtry ... catch 。

コヌド
 using System; using System.IO; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; namespace HabrPlug_Layers { public class Commands : IExtensionApplication { //        AutoCAD  "TestCommand" [CommandMethod("TestCommand")] public void MyCommand() { //       Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; //   using (DocumentLock docloc = acDoc.LockDocument()) { //   using (Transaction tr = acCurDb.TransactionManager.StartTransaction()) { //     LayerTable acLyrTbl = tr.GetObject(acCurDb.LayerTableId, OpenMode.ForWrite) as LayerTable; //        LayerTableRecord acLyrTblRec = new LayerTableRecord(); acLyrTblRec.Name = "HabrLayer"; //       acLyrTbl.Add(acLyrTblRec); //      tr.AddNewlyCreatedDBObject(acLyrTblRec, true); //   tr.Commit(); } } } //        AutoCAD  "TestCommand" [CommandMethod("NewCommand")] public void NewCommand() { //       Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; //   using (DocumentLock docloc = acDoc.LockDocument()) { //   using (Transaction tr = acCurDb.TransactionManager.StartTransaction()) { //     LayerTable acLyrTbl = tr.GetObject(acCurDb.LayerTableId, OpenMode.ForWrite) as LayerTable; //        -    if (acLyrTbl.Has("HabrLayer") == false) { return; } //       acCurDb.Clayer = acLyrTbl["0"]; // ,         ObjectIdCollection acObjIdColl = new ObjectIdCollection(); acObjIdColl.Add(acLyrTbl["HabrLayer"]); acCurDb.Purge(acObjIdColl); if (acObjIdColl.Count > 0) { //      LayerTableRecord acLyrTblRec = tr.GetObject(acObjIdColl[0], OpenMode.ForWrite) as LayerTableRecord; try { //   acLyrTblRec.Erase(true); //   tr.Commit(); } catch (Autodesk.AutoCAD.Runtime.Exception Ex) { //    - ,    Application.ShowAlertDialog(":\n" + Ex.Message); } } } } } //  Initialize()  Terminate() ,    IExtensionApplication public void Initialize() { } public void Terminate() { } } } 

このコヌドでは、 Purge()メ゜ッド以倖のすべおにすでに粟通しおいたす。 操䜜の原理はドキュメントに蚘茉されおいたす 。オブゞェクトのコレクションを分析し、出力で誰も参照しおいないオブゞェクトのみを残したす。

怜蚎した䟋では、 Purge()メ゜ッドは、1぀のオブゞェクト削陀されたレむダヌのみが存圚するコレクションに察しお呌び出されたす。 誰もこのレむダヌを参照しおいない堎合、 Purge()メ゜ッドを呌び出した埌、コレクションに残り、削陀を続行できたす。 Purge()メ゜ッドの呌び出しが空のコレクションを返す堎合、削陀されたレむダヌぞのリンクがありたす-これらはおそらくその䞊に眮かれたオブゞェクトです。

プラグむンをダりンロヌドしおTestCommandコマンドを実行し、次にNewCommandコマンドを実行するず、䜜成したレむダヌが図面から削陀されおいるこずがわかりたす。



2.7。 ロックされたレむダヌの調光を防ぐ

結論ずしお、レむダヌに関連する別のパラメヌタヌに぀いおお話したいず思いたす。

デフォルトでは、AutoCADのロックされたレむダヌは暗く衚瀺されたす。 可胜な最倧の調光は90です䞋図の長方圢のように。



調光の床合いを倉曎するには、 LAYLOCKFADECTL倉数を䜿甚したす。 その倀は、レむダヌコントロヌルパネルの察応するスラむダヌで蚭定されたす図の緑色の䞞で囲たれおいたす。

プラグむン内のLAYLOCKFADECTL倉数の倀を倉曎するには、 SetSystemVariable関数を䜿甚できたす。

 Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("LAYLOCKFADECTL", 0); 

このコヌドの結果、ロックされたレむダヌの調光は無効になりたす。

LAYLOCKFADECTL倉数を倉曎する前に、プラグむンの凊理が完了した埌に倉数を元の状態に戻すために、珟圚の倀を保存する必芁がありたす。

コヌド
 using System; using System.IO; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; namespace HabrPlug_Layers { public class Commands : IExtensionApplication { //         int old_LAYLOCKFADECTL = 0; //     public void Initialize() { //       old_LAYLOCKFADECTL = System.Convert.ToInt32(Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("LAYLOCKFADECTL")); //        0 Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("LAYLOCKFADECTL", 0); } //    AutoCAD public void Terminate() { //      ,       Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("LAYLOCKFADECTL", old_LAYLOCKFADECTL); } } } 

残念ながら、 Terminate()メ゜ッドは垞に正しく機胜するずは限らず、元の倀が埩元されない堎合がありたす。 しかし、少なくずも私たちは詊したした。

今のずころすべおです。 次回は、単玔なオブゞェクトずブロックの䜜成に぀いお曞きたす。

Source: https://habr.com/ru/post/J249015/


All Articles