.NET APIを使用してAutoCAD用のプラグインを作成する(パート6-図面内のオブジェクトの検索と変更)

これは、AutoCADのプラグイン開発サイクルの6番目の部分です 。 その中で、図面内のオブジェクトの検索と、それらの変更について説明します。



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







はじめに



記事の最初の部分では、図面内のオブジェクトの検索について検討し、2番目の部分では、オブジェクトの変更について簡単に説明します。 ただし、これらの問題を検討する前に、この記事全体で使用するテストケースのフレームワークを準備しましょう。



この例は単純ですが、かなりボリュームがあります。 「layer-1」と「layer-2」という名前の2つのレイヤーを作成します(合計で、各図面にあるゼロレイヤーと合わせて、3つのレイヤーを取得します)。 また、「block-1」(円、線、ポリラインで構成される)と「block-2」(円と2本のラインで構成される)という名前の2つのブロック定義を追加します。 その後、いくつかのグラフィックオブジェクトを図面に配置します。



さて、完全な幸福のために、全体をピンク、青、薄緑の色で塗ります。



注意:
あまり標準的でない色の選択は、記事のコード例を準備することは致命的な憂鬱であるという事実によるものであり、どういうわけかこのプロセスを復活させたいと思います。

最初の行を描いた後、私は突然虹の旗を思い出し、それを記事に挿入することさえ考えました...

しかし、第二に、私はこの運動をあまり支持しておらず、第一に、旗は3人の支配者よりもはるかに複雑です。 まあ、ナフィグ。



このアクションプランを実装するコードは次のとおりです。 実行されるすべての操作:レイヤーとブロック定義の作成、テキストの挿入、グラフィックプリミティブ、およびブロックオカレンス-サイクルの以前の記事で既に検討しました。 まだ考慮されていない唯一のことは、描画オブジェクトのレイヤーと色を設定することですが、文字通り1行のコードを占有し、問題を引き起こさないことを願っています。



そのため、プロジェクトを作成し、初期構成を実行して(.NETバージョンを指定し、 CopyLocal



無効にしCopyLocal



)、使い慣れたAcMgdおよびAcDbMgdライブラリを接続します 。 次に、この例のオブジェクトを作成する関数を配置します。



コード:
 using System; using System.Collections.Generic; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.EditorInput; using acad = Autodesk.AutoCAD.ApplicationServices.Application; namespace HabrPlug_SearchAndRescue { public class ClassMyAutoCADDLL_SearchAndRescue { public class Commands : IExtensionApplication { //   Autodesk.AutoCAD.Colors.Color color_Pink = Autodesk.AutoCAD.Colors.Color.FromRgb(255, 128, 255); Autodesk.AutoCAD.Colors.Color color_Blue = Autodesk.AutoCAD.Colors.Color.FromRgb(0, 200, 255); Autodesk.AutoCAD.Colors.Color color_LightGreen = Autodesk.AutoCAD.Colors.Color.FromRgb(128, 255, 64); // ID  "layer-1"  "layer-2" ObjectId layer_1; ObjectId layer_2; //   public void createLayers() { //       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_1 = new LayerTableRecord(); acLyrTblRec_1.Name = "layer-1"; //      ,  ID    layer_1 = acLyrTbl.Add(acLyrTblRec_1); //      tr.AddNewlyCreatedDBObject(acLyrTblRec_1, true); //        LayerTableRecord acLyrTblRec_2 = new LayerTableRecord(); acLyrTblRec_2.Name = "layer-2"; //      ,  ID    layer_2 = acLyrTbl.Add(acLyrTblRec_2); //      tr.AddNewlyCreatedDBObject(acLyrTblRec_2, true); //   tr.Commit(); } } } //    "block-1" public void createBlock_1() { //        Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; //    const string blockName = "block-1"; //   Transaction tr = db.TransactionManager.StartTransaction(); using (tr) { //      BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite); // ,        ;   -    if (bt.Has(blockName)) { return; } //    ,    BlockTableRecord btr = new BlockTableRecord(); btr.Name = blockName; //           bt.Add(btr); tr.AddNewlyCreatedDBObject(btr, true); //     //   Circle acCircle = new Circle(); //     acCircle.SetDatabaseDefaults(); acCircle.Center = Point3d.Origin; acCircle.Radius = 25; //          btr.AppendEntity(acCircle); tr.AddNewlyCreatedDBObject(acCircle, true); //   Line acLine = new Line(new Point3d(18, 18, 0), new Point3d(35, 35, 0)); //         acLine.SetDatabaseDefaults(); //          btr.AppendEntity(acLine); tr.AddNewlyCreatedDBObject(acLine, true); //   Polyline acPolyline = new Polyline(); //         acPolyline.SetDatabaseDefaults(); //     acPolyline.AddVertexAt(0, new Point2d(20, 35), 0, 0, 0); acPolyline.AddVertexAt(1, new Point2d(35, 35), 0, 0, 0); acPolyline.AddVertexAt(2, new Point2d(35, 20), 0, 0, 0); //          btr.AppendEntity(acPolyline); tr.AddNewlyCreatedDBObject(acPolyline, true); //   tr.Commit(); } } //    "block-2" public void createBlock_2() { //        Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; //    const string blockName = "block-2"; //   Transaction tr = db.TransactionManager.StartTransaction(); using (tr) { //      BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite); // ,        ;   -    if (bt.Has(blockName)) { return; } //    ,    BlockTableRecord btr = new BlockTableRecord(); btr.Name = blockName; //           bt.Add(btr); tr.AddNewlyCreatedDBObject(btr, true); //     //   Circle acCircle = new Circle(); //     acCircle.SetDatabaseDefaults(); acCircle.Center = Point3d.Origin; acCircle.Radius = 25; //         btr.AppendEntity(acCircle); tr.AddNewlyCreatedDBObject(acCircle, true); //    Line acLine_1 = new Line(new Point3d(0, -25, 0), new Point3d(0, -50, 0)); //         acLine_1.SetDatabaseDefaults(); //          btr.AppendEntity(acLine_1); tr.AddNewlyCreatedDBObject(acLine_1, true); //    Line acLine_2 = new Line(new Point3d(-7, -39, 0), new Point3d(7, -39, 0)); //         acLine_2.SetDatabaseDefaults(); //          btr.AppendEntity(acLine_2); tr.AddNewlyCreatedDBObject(acLine_2, true); //   tr.Commit(); } } //      public void layer_0_createObjects() { //       Document doc = acad.DocumentManager.MdiActiveDocument; Database db = doc.Database; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //     BlockTable acBlkTbl; acBlkTbl = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; //    (Model Space) -          BlockTableRecord ms = tr.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //    Line acLine_1 = new Line(new Point3d(225, 225, 0), new Point3d(225, 175, 0)); //         acLine_1.SetDatabaseDefaults(); //        acLine_1.Layer = "0"; acLine_1.Color = color_Pink; //          ms.AppendEntity(acLine_1); tr.AddNewlyCreatedDBObject(acLine_1, true); //    Line acLine_2 = new Line(new Point3d(250, 225, 0), new Point3d(250, 175, 0)); //         acLine_2.SetDatabaseDefaults(); //        acLine_2.Layer = "0"; acLine_2.Color = color_Blue; //          ms.AppendEntity(acLine_2); tr.AddNewlyCreatedDBObject(acLine_2, true); //    Line acLine_3 = new Line(new Point3d(275, 225, 0), new Point3d(275, 175, 0)); //         acLine_3.SetDatabaseDefaults(); //        acLine_3.Layer = "0"; acLine_3.Color = color_LightGreen; //          ms.AppendEntity(acLine_3); tr.AddNewlyCreatedDBObject(acLine_3, true); //    Polyline acPolyline = new Polyline(); //         acPolyline.SetDatabaseDefaults(); //     acPolyline.AddVertexAt(0, new Point2d(300, 225), 0, 0, 0); acPolyline.AddVertexAt(1, new Point2d(325, 175), 0, 0, 0); acPolyline.AddVertexAt(2, new Point2d(350, 225), 0, 0, 0); //        acPolyline.Layer = "0"; acPolyline.Color = color_Pink; //          ms.AppendEntity(acPolyline); tr.AddNewlyCreatedDBObject(acPolyline, true); //    Circle acCircle = new Circle(); //     acCircle.SetDatabaseDefaults(); acCircle.Center = new Point3d(400, 200, 0); acCircle.Radius = 25; //        acCircle.Layer = "0"; acCircle.Color = color_Blue; //          ms.AppendEntity(acCircle); tr.AddNewlyCreatedDBObject(acCircle, true); //    DBText text = new DBText(); text.Position = new Point3d(450, 175, 0); text.Height = 50; text.TextString = "HABR!"; //        text.Layer = "0"; text.Color = color_LightGreen; //          ms.AppendEntity(text); tr.AddNewlyCreatedDBObject(text, true); //   tr.Commit(); } } //     "layer-1" public void layer_1_createObjects() { //       Document doc = acad.DocumentManager.MdiActiveDocument; Database db = doc.Database; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //           // (         ) ObjectId currentLayer = db.Clayer; db.Clayer = layer_1; //     BlockTable acBlkTbl; acBlkTbl = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; //    (Model Space) -          BlockTableRecord ms = tr.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //    Line acLine_1 = new Line(new Point3d(225, 25, 0), new Point3d(225, -25, 0)); //     acLine_1.SetDatabaseDefaults(); acLine_1.Color = color_Pink; //          ms.AppendEntity(acLine_1); tr.AddNewlyCreatedDBObject(acLine_1, true); //    Line acLine_2 = new Line(new Point3d(250, 25, 0), new Point3d(250, -25, 0)); //     acLine_2.SetDatabaseDefaults(); acLine_2.Color = color_Blue; //          ms.AppendEntity(acLine_2); tr.AddNewlyCreatedDBObject(acLine_2, true); //    Circle acCircle = new Circle(); //     acCircle.SetDatabaseDefaults(); acCircle.Center = new Point3d(300, 0, 0); acCircle.Radius = 25; acCircle.Color = color_LightGreen; //          ms.AppendEntity(acCircle); tr.AddNewlyCreatedDBObject(acCircle, true); //    DBText text = new DBText(); //     text.Position = new Point3d(350, -25, 0); text.Height = 50; text.TextString = "HABR!"; text.Color = color_Pink; //          ms.AppendEntity(text); tr.AddNewlyCreatedDBObject(text, true); //    "block-1" //      BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); //  ObjectID  ObjectId btrId = bt["block-1"]; //    ,   ID   BlockReference br = new BlockReference(new Point3d(600, 0, 0), btrId); //          ms.AppendEntity(br); tr.AddNewlyCreatedDBObject(br, true); //      db.Clayer = currentLayer; //   tr.Commit(); } } //     "layer-2" public void layer_2_createObjects() { //       Document doc = acad.DocumentManager.MdiActiveDocument; Database db = doc.Database; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //           // (         ) ObjectId currentLayer = db.Clayer; db.Clayer = layer_2; //     BlockTable acBlkTbl; acBlkTbl = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; //    (Model Space) -          BlockTableRecord ms = tr.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //    Line acLine_1 = new Line(new Point3d(225, -175, 0), new Point3d(225, -225, 0)); //     acLine_1.SetDatabaseDefaults(); acLine_1.Color = color_Pink; //          ms.AppendEntity(acLine_1); tr.AddNewlyCreatedDBObject(acLine_1, true); //    Arc acArc = new Arc(new Point3d(250, -200, 0), 25, -45 / 180.0 * Math.PI, 45 / 180.0 * Math.PI); //     acArc.SetDatabaseDefaults(); acArc.Color = color_Blue; //          ms.AppendEntity(acArc); tr.AddNewlyCreatedDBObject(acArc, true); //    Circle acCircle = new Circle(); //     acCircle.SetDatabaseDefaults(); acCircle.Center = new Point3d(325, -200, 0); acCircle.Radius = 25; acCircle.Color = color_LightGreen; //          ms.AppendEntity(acCircle); tr.AddNewlyCreatedDBObject(acCircle, true); //    "block-1" //      BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); //  ObjectID  ObjectId btrId = bt["block-1"]; //    ,   ID   BlockReference br = new BlockReference(new Point3d(400, -200, 0), btrId); //          ms.AppendEntity(br); tr.AddNewlyCreatedDBObject(br, true); //    "block-2" //  ObjectID  btrId = bt["block-2"]; //    ,   ID   br = new BlockReference(new Point3d(475, -200, 0), btrId); //          ms.AppendEntity(br); tr.AddNewlyCreatedDBObject(br, true); //      db.Clayer = currentLayer; //   tr.Commit(); } } //      public void Initialize() { createLayers(); createBlock_1(); createBlock_2(); layer_0_createObjects(); layer_1_createObjects(); layer_2_createObjects(); } //  Terminate() ,    IExtensionApplication public void Terminate() { } } } }
      
      





結果:




コードは単純であり、基本的な質問をするべきではありません。 いくつかのニュアンスを簡単に確認しましょう。



瞬間1:Initialize()メソッド内で操作を実行する
そもそも、必要なすべてのオブジェクトの作成は、プラグインがロードされた時点で行われることに注意してください。 サンプルが機能するために作成されたオブジェクトが必要であり、プラグインコマンドの操作に必要なので、 Initialize()



メソッドを使用して作成できるようです。



ただし、これがいかに正確で合理的であるかが重要なポイントです。 まず、何かを自動的に作成し、ユーザーから選択を奪い、楽しい事実に立ち向かいます。こんにちは、10個の新しいレイヤーと100個の新しいオブジェクトが図面に追加されました。



楽しくなりますが、それほど多くはありません。 特にユーザーに。



2つ目の問題は、作成されたオブジェクトの一部をユーザーが誤ってまたは意図的に図面から削除する可能性があることです。 この場合、彼はこれらのオブジェクトを再作成できません。 これを行うには、AutoCADを閉じて再起動する必要があります。



一般に、プラグインをロードするときにアクションを実行すると、「より柔らかく、さらに柔らかく」なる必要があります(c)。 これに関するジョークはケーススタディでは完全に受け入れられますが、実際にはInitialize()



を使用する前に3回考える価値があります。 理想的には、次のコードのセクションにコンクリートと金属の構造物のみを配置する必要があります。

  1. ユーザーに干渉したり、図面に不要な負荷をかけたりしないでください。
  2. 繰り返しの呼び出しは必要ありません(または、ユーザーがこの呼び出しを行う方法が必要です-描画オブジェクトを誤って削除することに関する上記の段落の例を思い出してください)。


注意:
今、震えながら、彼は実際のプロジェクトのコードを使ってリポジトリに行き、目を閉じ、目を開けました...

うーん、すべてが大丈夫です。 上記のルールはほぼ守られています。

...

なんて言うの? 「だれが働けないか、教えている」





2番目の瞬間:2つの方法でオブジェクトレイヤーを定義する
オブジェクトがゼロレイヤー(関数layer_0_createObjects()



)で満たされると、このレイヤーのメンバーシップは、作成された各オブジェクトに対して明示的に示されます。 例:



 acLine_1.Layer = "0";
      
      





これは理解でき、難しくはありませんが、多数のオブジェクトを操作する場合、レイヤーの設定を忘れることがありますが、これは良くありません。



注意:
実例:記事の著者は、 layer_0_createObjects()



関数からlayer_0_createObjects()



関数layer_0_createObjects()



行を挿入するためのコードを忠実にコピーし、レイヤーを新しいものに変更することを忘れました。 エラーの検索と修正には時間がかかりました。 これをすべてのプリミティブで行う必要があることを認識して、著者はびっくりして、すべてを別の方法で行うことにしました。

したがって、記事のこの部分は生まれました。)



このようなエラーの可能性を減らす別の方法は、以前のレイヤーの記事の1つで簡単に言及されていました。 これはClayer



プロパティを使用してClayer



ます。



このメソッドの本質は、オブジェクトを作成するときにレイヤーをまったく指定しない場合、現在のドキュメントのデータベースのClayer



プロパティの値に基づいて自動的に割り当てられることです。 この値は次のように表示できます。



 Document doc = acad.DocumentManager.MdiActiveDocument; Database db = doc.Database; ObjectId currentLayer = db.Clayer;
      
      





値は同じ方法で割り当てられます:



 Document doc = acad.DocumentManager.MdiActiveDocument; Database db = doc.Database; db.Clayer = layer_1; // layer_1 - ObjectID  
      
      





そのため、名前を知ってObjectID



レイヤーのObjectID



取得できます。



 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; ObjectId layer_objID = acLyrTbl["someLayer"] } }
      
      





この例では、毎回レイヤーテーブルを参照しないようにするために、2つのグローバル変数layer_1



layer_2



を作成し、作成時にレイヤー「layer-1」と「layer-2」のObjectID



を保存しObjectID



。 その後、手続きlayer_1_createObjects()



およびlayer_2_createObjects()



で、次の構成を使用します。



 // ... ObjectId currentLayer = db.Clayer; db.Clayer = layer_1; // ... //    // ... db.Clayer = currentLayer; // ...
      
      





現在のClayer



値を保存して、関数の最後に復元するのはなぜですか?

理由の1つは、関数の操作後、ユーザーがプロシージャの作業前と同じレイヤーにオブジェクトを追加し続けることができることです。

— , .

, , , . しかし、なぜですか?





ポイント3:安全性


: « »



, . — , , .



. : , — , . . , - .



, , , .





例の機能について説明したので、最終的に図面内のオブジェクトの検索に進むことができます。オブジェクトにアクセスしてModelSpace



描画オブジェクトを表示し、メソッドを使用して描画オブジェクトの識別子を取得するという2つの異なるアプローチを分析しますEditor.SelectAll()







注意:
. , .



- , , .



1オブジェクトにアクセスして描画オブジェクトを検索します ModelSpace





1.1すべての描画オブジェクトの反復



まず、図面上にあるすべてのオブジェクトをループする方法を見てみましょう。



原理は簡単です。モデル空間(ModelSpace



)を開き、その中のすべてのオブジェクトへのリンクを取得します。次に、これらのオブジェクトを型にしEntity



、必要なプロパティを処理します。



この例は、ここからほぼ完全に引用されています



コード:
 [CommandMethod("Habr_IterateThroughAllObjects_1")] public void iterateThroughAllObjects() { //    Database db = HostApplicationServices.WorkingDatabase; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //      (ModelSpace) BlockTableRecord ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead); // ""       foreach (ObjectId id in ms) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //     (entity.Layer),  (entity.GetType().ToString())   (entity.Color)   acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n", entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString())); } tr.Commit(); } }
      
      





結果:






ご覧のとおり、結果は期待と完全に一致しています。16個のオブジェクトがあり、色が交互になっています。



小さなイノベーションから:この例では、WorkingDatabase



クラスのなじみのないプロパティを使用しましたHostApplicationServices



現在アクティブな(入力フォーカスがある)ドキュメントのデータベースを取得できます。もう1つのイノベーションは、GetBlockModelSpaceId()



クラスメソッドですSymbolUtilityServices



。これにより、ObjectId



モデル空間をすばやく取得できますModelSpace



)。



新しいクラスの代わりに、確かに使い慣れたクラスを使用できます。
 //      ( 1) [CommandMethod("Habr_IterateThroughAllObjects_1")] public void iterateThroughAllObjects() { //       Document doc = acad.DocumentManager.MdiActiveDocument; Database db = doc.Database; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //      (ModelSpace) //     BlockTable acBlkTbl = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; //    (Model Space) -          BlockTableRecord ms = tr.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // ""       foreach (ObjectId id in ms) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //     (entity.Layer),  (entity.GetType().ToString())   (entity.Color)   acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n", entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString())); } tr.Commit(); } }
      
      





.



注意:
SymbolUtilityServices



(.).



モデル空間へのリンクを受け取っEntity



たら、そのすべてのオブジェクトを調べてタイプに変換し(プロパティを表示できるように)、コンソールで次のオブジェクトのレイヤー、タイプ、色に関する情報を表示します。



1.2特定のタイプのオブジェクトの検索



すべての円を選択してみましょう。これは前の例に基づいて行います。



次のように動作します。図面内のすべてのオブジェクトを順番に調べ、各オブジェクトのタイプを決定します。オブジェクトが円であることが判明した場合-コンソールにオブジェクトに関する情報を表示します。前回の記事では、オブジェクトの種類を見つける5つの方法を説明するリンク(英語)に既に会っていましたいつものように、私たちは伝統から逸脱せず、最も単純な方法の1つを使用します。



 if (entity.GetType() == typeof(Circle)) //    - ,  
      
      





コード:
 [CommandMethod("Habr_FindCircles_1")] public void findCircles_1() { //    Database db = HostApplicationServices.WorkingDatabase; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //      (ModelSpace) BlockTableRecord ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead); // ""       foreach (ObjectId id in ms) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //    -    ,      if (entity.GetType() == typeof(Circle)) { acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n", entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString())); } } tr.Commit(); } }
      
      





結果:




動作します。



同様に、他のタイプを試すことができます。たとえば、すべての行を検索します。



 if (entity.GetType() == typeof(Line))
      
      





すべての注釈(テキスト要素)を検索します。



 if (entity.GetType() == typeof(DBText))
      
      





ブロックのすべての出現:



 if (entity.GetType() == typeof(BlockReference))
      
      





簡単そうです。



また、オブジェクトに対応するタイプの呼び出し方法を突然忘れた場合、そのようなオブジェクトを手動で図面に追加し、オブジェクトを反復する例を実行するだけで、AutoCADコンソールにタイプ名が表示されます。



1.3指定されたプロパティを持つオブジェクトの検索



タイプの代わりに、色などのプロパティを探してみましょう。すべてのライムオブジェクトを見つけます。



それは非常に簡単です:行



 if (entity.GetType() == typeof(Circle))
      
      





に変更



 if (entity.Color == Autodesk.AutoCAD.Colors.Color.FromRgb(128, 255, 64))
      
      





何が起こるかを見てください。)



コード:
 //      ( 1) [CommandMethod("Habr_FindLightGreenObjects_1")] public void findLightGreenObjects_1() { //    Database db = HostApplicationServices.WorkingDatabase; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //      (ModelSpace) BlockTableRecord ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead); // ""       foreach (ObjectId id in ms) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //    - ,     ,      if (entity.Color == Autodesk.AutoCAD.Colors.Color.FromRgb(128, 255, 64)) { acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n", entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString())); } } tr.Commit(); } }
      
      





結果:




同様に、他の属性(たとえば、レイヤー)で検索できます。



 if (entity.Layer == "0")
      
      





注意:
. Visual Studio " Entity test; test.



" — IntelliSense . Entity:





クラスEntity



は、描画オブジェクトに典型的なプロパティを設定します:レイヤー、色など。オブジェクトの特定のクラスに固有のプロパティで検索したい場合、最初にこのタイプのすべてのオブジェクトを見つけ、次にそのタイプにキャストし、目的のプロパティの値を表示します。



たとえば、block-1ブロックのすべての出現を検索してみましょう。クラスにEntity



は、ブロック定義の名前に関する情報は含まれません。ただし、この情報はName



クラスプロパティにありますBlockReference







コード:
 [CommandMethod("Habr_FindBlocks_1")] public void findBlocks_1() { //    Database db = HostApplicationServices.WorkingDatabase; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //      (ModelSpace) BlockTableRecord ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead); // ""       foreach (ObjectId id in ms) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); // ,      if (entity.GetType() == typeof(BlockReference)) { //   -     BlockReference BlockReference br = (BlockReference)entity; //      - "block-1",     ,      if (br.Name == "block-1") { acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n", entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString())); } } } tr.Commit(); } }
      
      





block-1ブロックが2回出現します。



2メソッドを使用した描画オブジェクトの検索 Editor.SelectAll()





2.1すべての描画オブジェクトの反復



ちょっとした歴史:この方法についての言及 Kean Walmsley の記事の1つにあります。さらに、説明はAutoCAD DevBlog(英語)およびAutodesk CIS Programmers Communityフォーラム(rus)にあります。



前のバージョンで各オブジェクトを個別に調べた場合、概念が変わります。対象のすべてのオブジェクトの識別子の配列をすぐに取得し、必要に応じてフィルタリングします。



いつものように、すべてのオブジェクトを反復処理する例から始めましょう。



コード:
 //      ( 2) [CommandMethod("Habr_IterateThroughAllObjects_2")] public void iterateThroughAllObjects_2() { //    Editor   Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; //       // !         ! PromptSelectionResult selRes = ed.SelectAll(); //    -    if (selRes.Status != PromptStatus.OK) { ed.WriteMessage("\nError!\n"); return; } //   ID  ObjectId[] ids = selRes.Value.GetObjectIds(); //   using (Transaction tr = db.TransactionManager.StartTransaction()) { // ""     foreach (ObjectId id in ids) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //     (entity.Layer),  (entity.GetType().ToString())   (entity.Color)   acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n", entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString())); } tr.Commit(); } }
      
      





結果:




メソッドを呼び出していEditor.SelectAll()



ます。フィルタが設定されていないためObjectID



、図面内のすべてのオブジェクトの識別子()を返す必要があります。それらは型変数に書き込まれますPromptSelectionResult



。念のため、メソッドが正しく機能したことを確認する必要がありますPromptSelectionResult.Status



このために、結果のステータスをチェックします()。何かが間違っている場合、このプロパティの値は異なりますPromptStatus.OK



-この場合、関数を終了します。



メソッドがEditor.SelectAll()



正しく機能した場合、このメソッドによって返されたすべてのオブジェクトの識別子を取得します。このためにメソッドを使用しPromptSelectionResult.Value.GetObjectIds()



ます。その後、ループ内のすべてのオブジェクトを処理しModelSpace



ます。最初のセクションとまったく同じように、に戻ります。



重要なポイント彼によると説明(日本語版)、メソッドEditor.SelectAll()



だけ返す必要がありますがロック(NOTされているレイヤー上のオブジェクトロック()または凍結し、凍結、凍結します)。ただし、この場合、ドキュメントは嘘をついているように見えます。ドキュメントが配置されているレイヤーの状態に関係なく、Editor.SelectAll()



常に図面内のすべてのオブジェクトを返します。この楽しさの詳細については、Kean Walmsleyブログ AutoCAD Devblog Autodeskコミュニティフォーラムをご覧ください



一般的には、私の結論は:私が持っている AutoCAD 2010のために、このアプローチは動作します。たぶん、それは.NET APIの新しいバージョンで動作します。しかし、これはドキュメントの間違いまたはAPIのバグであり、おそらくいつかは修正されるでしょう、とは言えません。



短い要約:これにはもっと注意してください。



もう一つの重要なポイントメソッドを使用するにはEditor.SelectAll()



、明らかにクラスオブジェクトが必要Editor



です。AutoCADで直接開いているドキュメントを使用する場合、問題はありません。ただし、この方法を使用してサードパーティドキュメント(現在AutoCADで開いていない)のデータベースを処理すると失敗します(英語)。



2.2フィルターの使用



すべての円をもう一度選択してみましょう。もちろん、前のセクションと同様にすべてを行うことができます。すべてのオブジェクトの識別子を取得し、各オブジェクトのタイプを確認します-これは機能します。ただし、me​​thodを使用する場合Editor.SelectAll()



、異なる動作をすることが可能です。



原理は次のとおりです。最初にクラスを使用してオブジェクトのフィルターを設定し、SelectionFilter



次にこのフィルターをメソッドに適用しますEditor.SelectAll()



結果として、フィルター条件を満たすオブジェクトのみがあります。



コード:
 [CommandMethod("Habr_FindCircles_2")] public void findCircles_2() { //    Editor   Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; //  ,        TypedValue[] filterlist = new TypedValue[1]; //   (0) ,      //   ("CIRCLE") -   filterlist[0] = new TypedValue(0, "CIRCLE"); //   SelectionFilter filter = new SelectionFilter(filterlist); //         // !         ! PromptSelectionResult selRes = ed.SelectAll(filter); //    -    if (selRes.Status != PromptStatus.OK) { ed.WriteMessage("\nError!\n"); return; } //   ID  ObjectId[] ids = selRes.Value.GetObjectIds(); //   using (Transaction tr = db.TransactionManager.StartTransaction()) { // ""     foreach (ObjectId id in ids) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //    ,      acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n", entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString())); } tr.Commit(); } }
      
      





結果:




動作します。



それでは、その方法Editor.SelectAll()



を考えてみましょう。)メソッドSelectionFilter



は、フィルターを定義する型のオブジェクトの入力を取得できます。このフィルターは、型オブジェクトの配列を使用して初期化されますTypedValue



コンストラクターTypedValue



は、入力として2つのパラメーターを取ります。



 public TypedValue(int typeCode, object value);
      
      





これらの値は、DXF(rus)形式に関連付けられていますこれについてのドキュメントの記述は次のとおりです

DXF形式は、特定のバージョンのAutoCAD図面ファイルに含まれるすべての情報のタグ付きデータ表現です。タグ付きデータとは、ファイル内の各データ要素の前に、グループコードと呼ばれる整数が続くことを意味します。グループコードの値は、後に続くデータ要素のタイプを示します。また、特定のオブジェクト(またはレコード)タイプのデータ要素の意味も示します。図面ファイル内の実質的にすべてのユーザー指定情報は、DXF形式で表すことができます。DXF形式は、アプリケーション(AutoLISPおよびARX)で使用する場合、基本的に同じです。ただし、一部のデータグループにはいくつかの小さな違いがあります。


Google翻訳:
DXF AutoCAD . , , . , . ( ). DXF. DXF AutoLISP, ARX, .



検討した例では、typeCode



として値0 を指定しましたが、値の由来と意味- リストで確認できます



念のため、ここでリストを複製します。
-5: APP: persistent reactor chain

-4: APP: conditional operator (used only with ssget)

-3: APP: extended data (XDATA) sentinel (fixed)

-2: APP: entity name reference (fixed)

-1: APP: entity name. This changes each time a drawing is opened. It is never saved. (fixed)

0: Text string indicating the entity type (fixed)

1: Primary text value for an entity

2: Name (attribute tag, block name, and so on)

3-4: Other textual or name values

5: Entity handle. Text string of up to 16: hexadecimal digits (fixed)

6: Linetype name (fixed)

7: Text style name (fixed)

8: Layer name (fixed)

9: DXF: variable name identifier (used only in HEADER section of the DXF file).

10: Primary point. This is the start point of a line or text entity, center of a circle, and so on.

DXF: X value of the primary point (followed by Y and Z value codes 20: and 30)

APP: 3D point (list of three reals)

11-18: Other points.

DXF: X value of other points (followed by Y value codes 21-28: and Z value codes 31-38)

APP: 3D point (list of three reals)

20, 30: DXF: Y and Z values of the primary point

21-28, 31-37: DXF: Y and Z values of other points

38: DXF: entity's elevation if nonzero.

39: Entity's thickness if nonzero (fixed)

40-48: Floating-point values (text height, scale factors, and so on)

48: Linetype scale. Floating-point scalar value. Default value is defined for all entity types.

49: Repeated floating-point value. Multiple 49: groups may appear in one entity for variable-length tables (such as the dash lengths in the LTYPE table). A 7x group always appears before the first 49 group to specify the table length.

50-58: Angles (output in degrees to DXF files and radians through AutoLISP and ARX applications).

60: Entity visibility. Integer value. Absence or 0: indicates visibility; 1 indicates invisibility.

62: Color number (fixed)

66: "Entities follow" flag (fixed)

67: Space--that is, model or paper space (fixed)

68: APP: identifies whether viewport is on but fully off screen; is not active or is off.

69: APP: viewport identification number.

70-78: Integer values, such as repeat counts, flag bits, or modes

90-99: 32-bit integer values

100: Subclass data marker (with derived class name as a string). Required for all objects and entity classes that are derived from another concrete class to segregate data defined by different classes in the inheritance chain for the same object.

This is in addition to the requirement for DXF names for each distinct concrete class derived from ARX (see "Subclass Markers").

102: Control string, followed by "{<arbitrary name>" or "}". Similar to the xdata 1002: group code, except that when the string begins with "{", it can be followed by an arbitrary string whose interpretation is up to the application. The only other allowable control string is "}" as a group terminator. As noted before, AutoCAD does not interpret these strings except during drawing audit operations; they are for application use.

105: DIMVAR symbol table entry object handle

210: Extrusion direction (fixed).

DXF: X value of extrusion direction

APP: 3D extrusion direction vector

220, 230: DXF: Y and Z values of the extrusion direction

280-289: 8-bit integer values

300-309: Arbitrary text strings

310-319: Arbitrary binary chunks with same representation and limits as 1004: group codes: hexadecimal strings of up to 254 characters represent data chunks of up to 127 bytes.

320-329: Arbitrary object handles. Handle values that are taken "as is." They are not translated during INSERT and XREF operations.

330-339: Soft-pointer handle. Arbitrary soft pointers to other objects within same DXF file or drawing. Translated during INSERT and XREF operations.

340-349: Hard-pointer handle. Arbitrary hard pointers to other objects within same DXF file or drawing. Translated during INSERT and XREF operations.

350-359: Soft-owner handle. Arbitrary soft ownership links to other objects within same DXF file or drawing. Translated during INSERT and XREF operations.

360-369: Hard-owner handle. Arbitrary hard ownership links to other objects within same DXF file or drawing. Translated during INSERT and XREF operations.

999: DXF: The 999: group code indicates that the line following it is a comment string. DXFOUT does not include such groups in a DXF output file, but DXFIN honors them and ignores the comments. You can use the 999 group to include comments in a DXF file that you've edited.

1000: ASCII string (up to 255: bytes long) in extended data.

1001: Registered application name (ASCII string up to 31: bytes long) for extended data.

1002: Extended data control string ("{"or "}").

1003: Extended data layer name.

1004: Chunk of bytes (up to 127: bytes long) in extended data.

1005: Entity handle in extended data. Text string of up to 16: hexadecimal digits

1010: A point in extended data

DXF: X value (followed by 1020: and 1030 groups)

APP: 3D point

1020, 1030: DXF: Y and Z values of a point

1011: A 3D world space position in extended data

DXF: X value (followed by 1021: and 1031 groups)

APP: 3D point

1021, 1031: DXF: Y and Z values of a World space position

1012: A 3D world space displacement in extended data

DXF: X value (followed by 1022: and 1032 groups)

APP: 3D vector

1022, 1032: DXF: Y and Z values of a World space displacement

1013: A 3D world space direction in extended data.

DXF: X value (followed by 1022: and 1032 groups)

APP: 3D vector

1023, 1033: DXF: Y and Z values of a World space direction

1040: Extended data floating-point value.

1041: Extended data distance value.

1042: Extended data scale factor.

1070: Extended data 16-bit signed integer.

1071: Extended data 32-bit signed long.



リストの5番目の6行目は次のとおりです。

0:エンティティタイプを示すテキスト文字列(固定)


したがって、コード「0」はオブジェクトのタイプに対応します。



注意:
API Autodesk.AutoCAD.DatabaseServices.DxfCode



:



 [Wrapper("AcDb::DxfCode")] public enum DxfCode { Invalid = -9999, XDictionary = -6, PReactors = -5, Operator = -4, XDataStart = -3, FirstEntityId = -2, HeaderId = -2, End = -1, Start = 0, XRefPath = 1, Text = 1, AttributeTag = 2, ShapeName = 2, BlockName = 2, SymbolTableName = 2, MlineStyleName = 2, SymbolTableRecordName = 2, Description = 3, TextFontFile = 3, AttributePrompt = 3, LinetypeProse = 3, DimStyleName = 3, DimPostString = 3, CLShapeName = 4, DimensionAlternativePrefixSuffix = 4, TextBigFontFile = 4, SymbolTableRecordComments = 4, Handle = 5, DimensionBlock = 5, LinetypeName = 6, DimBlk1 = 6, DimBlk2 = 7, TextStyleName = 7, LayerName = 8, CLShapeText = 9, XCoordinate = 10, YCoordinate = 20, ZCoordinate = 30, Elevation = 38, Thickness = 39, TxtSize = 40, ViewportHeight = 40, Real = 40, ViewWidth = 41, TxtStyleXScale = 41, ViewportAspect = 41, TxtStylePSize = 42, ViewLensLength = 42, ViewFrontClip = 43, ViewBackClip = 44, ShapeXOffset = 44, ViewHeight = 45, ShapeYOffset = 45, ShapeScale = 46, PixelScale = 47, LinetypeScale = 48, DashLength = 49, MlineOffset = 49, LinetypeElement = 49, ViewportSnapAngle = 50, Angle = 50, ViewportTwist = 51, Visibility = 60, LayerLinetype = 61, Color = 62, HasSubentities = 66, ViewportVisibility = 67, ViewportActive = 68, ViewportNumber = 69, Int16 = 70, ViewMode = 71, TxtStyleFlags = 71, RegAppFlags = 71, CircleSides = 72, LinetypeAlign = 72, ViewportZoom = 73, LinetypePdc = 73, ViewportIcon = 74, ViewportSnap = 75, ViewportGrid = 76, ViewportSnapStyle = 77, ViewportSnapPair = 78, Int32 = 90, Subclass = 100, EmbeddedObjectStart = 101, ControlString = 102, DimVarHandle = 105, UcsOrg = 110, UcsOrientationX = 111, UcsOrientationY = 112, XReal = 140, ViewBrightness = 141, ViewContrast = 142, Int64 = 160, XInt16 = 170, NormalX = 210, NormalY = 220, NormalZ = 230, XXInt16 = 270, Int8 = 280, RenderMode = 281, Bool = 290, XTextString = 300, BinaryChunk = 310, ArbitraryHandle = 320, SoftPointerId = 330, HardPointerId = 340, SoftOwnershipId = 350, HardOwnershipId = 360, LineWeight = 370, PlotStyleNameType = 380, PlotStyleNameId = 390, ExtendedInt16 = 400, LayoutName = 410, ColorRgb = 420, ColorName = 430, Alpha = 440, GradientObjType = 450, GradientPatType = 451, GradientTintType = 452, GradientColCount = 453, GradientAngle = 460, GradientShift = 461, GradientTintVal = 462, GradientColVal = 463, GradientName = 470, Comment = 999, ExtendedDataAsciiString = 1000, ExtendedDataRegAppName = 1001, ExtendedDataControlString = 1002, ExtendedDataLayerName = 1003, ExtendedDataBinaryChunk = 1004, ExtendedDataHandle = 1005, ExtendedDataXCoordinate = 1010, ExtendedDataWorldXCoordinate = 1011, ExtendedDataWorldXDisp = 1012, ExtendedDataWorldXDir = 1013, ExtendedDataYCoordinate = 1020, ExtendedDataWorldYCoordinate = 1021, ExtendedDataWorldYDisp = 1022, ExtendedDataWorldYDir = 1023, ExtendedDataZCoordinate = 1030, ExtendedDataWorldZCoordinate = 1031, ExtendedDataWorldZDisp = 1032, ExtendedDataWorldZDir = 1033, ExtendedDataReal = 1040, ExtendedDataDist = 1041, ExtendedDataScale = 1042, ExtendedDataInteger16 = 1070, ExtendedDataInteger32 = 1071, }
      
      





,



 filterlist[0] = new TypedValue(0, "CIRCLE");
      
      









 filterlist[0] = new TypedValue((int)DxfCode.Start, "CIRCLE");
      
      





!



, 0 «Start». わからない。



, (, , ). Autodesk.AutoCAD.DatabaseServices.DxfCode



, (, , ). (, , ). ! — , .



— . — , .


簡単なフィルター機能をすばやく使用します。



もちろん、サークルだけでなく検索もできます。すべての行を検索します。



 filterlist[0] = new TypedValue((int)DxfCode.Start, "LINE");
      
      





ブロックのすべての出現を検索します。



 filterlist[0] = new TypedValue((int)DxfCode.Start, "INSERT");
      
      





注意:
(.).



, :
3DFACE

3DSOLID

ACAD_PROXY_ENTITY

ARC

ARCALIGNEDTEXT

ATTDEF

ATTRIB

BODY

CIRCLE

DIMENSION

ELLIPSE

HATCH

IMAGE

INSERT

LEADER

LINE

LWPOLYLINE

MLINE

MTEXT

OLEFRAME

OLE2FRAME

POINT

POLYLINE

RAY

REGION

RTEXT

SEQEND

SHAPE

SOLID

SPLINE

TEXT

TOLERANCE

TRACE

VERTEX

VIEWPORT

WIPEOUT

XLINE



"INSERT"



.



レイヤー1レイヤー上のすべてのオブジェクトを検索します。



 filterlist[0] = new TypedValue((int)DxfCode.LayerName, "layer-1");
      
      





TypedValue



コンマを使用して、単一のオブジェクトに複数の名前をリストできます。この場合、条件は操作「OR」(「OR」)によって結合されます。



線または円であるすべてのオブジェクトを見つけましょう:



 filterlist[0] = new TypedValue((int)DxfCode.Start, "LINE,CIRCLE");
      
      





レイヤー「layer-1」または「layer-2」にあるすべてのオブジェクトを検索します。



 filterlist[0] = new TypedValue((int)DxfCode.LayerName, "layer-1,layer-2");
      
      





重要結合するパラメーター間の小数点の後に、スペースを入れてはいけません!



最後に、いくつかのオブジェクトTypedValue



を条件配列に追加できますこの場合、条件は「AND」操作(「AND」)によって結合されます。



ラインであり、ゼロレイヤー上にあるすべてのオブジェクトを検索します。



 TypedValue[] filterlist = new TypedValue[2]; filterlist[0] = new TypedValue((int)DxfCode.Start, "CIRCLE"); filterlist[1] = new TypedValue((int)DxfCode.LayerName, "0");
      
      





block-1ブロックのすべての出現を検索します。



 TypedValue[] filterlist = new TypedValue[2]; filterlist[0] = new TypedValue((int)DxfCode.Start, "INSERT"); filterlist[1] = new TypedValue((int)DxfCode.BlockName, "block-1");
      
      





ラインであり、ゼロレイヤーまたはレイヤー「レイヤー-1」にあるすべてのオブジェクトを検索します。



 TypedValue[] filterlist = new TypedValue[2]; filterlist[0] = new TypedValue((int)DxfCode.Start, "LINE"); filterlist[1] = new TypedValue((int)DxfCode.LayerName, "0,layer-1");
      
      





まあ、それは痛くないようです...それはそうでした。これまで。



2.3フィルターはより複雑です



Kean Walmsleyのブログから盗まれて創造的に再設計された(翻訳された解説書きました見てみましょう



レイヤー1レイヤー上のすべての線とレイヤー2レイヤー上のすべての円を見つける必要があるとします。明らかに、いくつかのオブジェクトを追加するだけではこれを行うことはできません。このTypedValue



方法で達成できる最大のことは、両方のレイヤーのすべての線とすべての円を一度に見つけることです。



したがって、この条件に応じて選択を実現する必要があります:



((LAYER ==“ layer-1”)AND(TYPE ==“ Line”))OR((LAYER ==“ layer-2”)AND(TYPE ==“ Circle »))



AutoCAD構文では、条件は次のように記述できます。





そして、この条件は要素の配列として書き直されますTypedValue







 TypedValue[] filterlist = new TypedValue[10]; filterlist[0] = new TypedValue((int)DxfCode.Operator, "<OR"); filterlist[1] = new TypedValue((int)DxfCode.Operator, "<AND"); filterlist[2] = new TypedValue((int)DxfCode.LayerName, "layer-1"); filterlist[3] = new TypedValue((int)DxfCode.Start, "LINE"); filterlist[4] = new TypedValue((int)DxfCode.Operator, "AND>"); filterlist[5] = new TypedValue((int)DxfCode.Operator, "<AND"); filterlist[6] = new TypedValue((int)DxfCode.LayerName, "layer-2"); filterlist[7] = new TypedValue((int)DxfCode.Start, "CIRCLE"); filterlist[8] = new TypedValue((int)DxfCode.Operator, "AND>"); filterlist[9] = new TypedValue((int)DxfCode.Operator, "OR>");
      
      





これらの条件に基づいてフィルターを適用すると、AutoCADコンソールに次の出力が表示されます。

レイヤー:レイヤー-2; タイプ:Autodesk.AutoCAD.DatabaseServices.Circle; 色:128,255.64

レイヤー:レイヤー-1; タイプ:Autodesk.AutoCAD.DatabaseServices.Line; 色:0,200,255

レイヤー:レイヤー-1; タイプ:Autodesk.AutoCAD.DatabaseServices.Line; 色:255,128,255



原則は単純です:必要な条件を認識し、それを基本部分に分割し、演算子OR、AND、NOT、XORを使用してこれらの部分を結合します...



注意:
? XOR? , … , .

, ? - ? , ?



難しい条件についてはこちらをご覧ください



フィルターについてはこれで十分です。どれくらいできますか...



3図面内のオブジェクトを見つける別の方法



さらにEditor.SelectAll()



、図面内のオブジェクトを検索(より正確には選択)する方法は他にも多数あります。リンクは次のとおりです。英語のドキュメントロシア語の翻訳



ご覧のように、ターゲットを絞ったオプションが10個ありますEditor.SelectAll()



しかし、私たちはそれらの中で最も強力なものと考えました。



オフトピック:約束の血なまぐさい(スキップできます)
, . , , — ?



, , , , — (.), hwd , , .



( ModelSpace



), . , , , ..



:
 //      ( 3) // !   ! [CommandMethod("Habr_IterateThroughAllObjects_3")] public void iterateThroughAllObjects_3() { Database db = HostApplicationServices.WorkingDatabase; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; long amount = 0; Dictionary<string, int> d = new Dictionary<string, int>(); ObjectId id = ObjectId.Null; for (long i = db.BlockTableId.Handle.Value; i < db.Handseed.Value; i++) { Handle h = new Handle(i); if (db.TryGetObjectId(h, out id) && !id.IsNull && id.IsValid && !id.IsErased) { string t = id.ObjectClass.DxfName; amount++; if(d.ContainsKey(t)) d[t]++; else d.Add(t, 1); } } foreach(KeyValuePair<string,int> kvp in d) ed.WriteMessage("\n{0}: {1} ", kvp.Key, kvp.Value); ed.WriteMessage("\nTotal {0} objects in drawing\n", amount); }
      
      





( ):
Command: Habr_IterateThroughAllObjects_3

TABLE: 11

DICTIONARY: 16

ACDBDICTIONARYWDFLT: 1

ACDBPLACEHOLDER: 1

LAYER: 3

STYLE: 2

APPID: 7

LTYPE: 3

MLINESTYLE: 1

BLOCK_RECORD: 5

BLOCK: 5

ENDBLK: 5

LAYOUT: 3

DIMSTYLE: 3

DICTIONARYVAR: 7

TABLESTYLE: 1

VPORT: 1

MATERIAL: 3

VISUALSTYLE: 19

SCALE: 17

MLEADERSTYLE: 2

XRECORD: 4

FONT_TABLE_RECORD: 2

CIRCLE: 5

LINE: 9

LWPOLYLINE: 2

TEXT: 2

INSERT: 3

ARC: 1

Total 144 objects in drawing



- . , , , . — , welcome! … , .



UPD.: .


4オブジェクトの変更



オブジェクトの変更は、検索よりもはるかに簡単であるように思えます。基本的な原則は次のとおりです。ObjectID



オブジェクトを受け取った後、オブジェクト自体を開き、目的のタイプにし、プロパティに必要な変更を加えます。さて、または適切な方法を使用して図面からオブジェクトを削除します。



4.1図面からオブジェクトを削除する



図面からオブジェクトを削除するには、次の手順を実行する必要があります。

  1. 記録するオブジェクトを開きます。
  2. メソッドを呼び出す Erase();



  3. トランザクションをコミットします。


リンク:ドキュメント(英語)、ミラー(英語)。



たとえば、図面からすべての円を削除しましょう。



コード:
 [CommandMethod("Habr_EraseCircles_2")] public void eraseCircles_2() { //    Editor   Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; //  ,        TypedValue[] filterlist = new TypedValue[1]; //   (0) ,      //   ("CIRCLE") -   filterlist[0] = new TypedValue(0, "CIRCLE"); //   SelectionFilter filter = new SelectionFilter(filterlist); //         // !         ! PromptSelectionResult selRes = ed.SelectAll(filter); //    -    if (selRes.Status != PromptStatus.OK) { ed.WriteMessage("\nError!\n"); return; } //   ID  ObjectId[] ids = selRes.Value.GetObjectIds(); //   using (Transaction tr = db.TransactionManager.StartTransaction()) { // ""     foreach (ObjectId id in ids) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //      entity.UpgradeOpen(); //   entity.Erase(); } tr.Commit(); } }
      
      





結果:




もちろん、この場合、methodを使用せずにUpgradeOpen()



、書き込みと削除のためにオブジェクトをすぐに開くことができました



 Entity entity = (Entity)tr.GetObject(id, OpenMode.ForWrite); entity.Erase();
      
      





重要!オブジェクトがロックされたレイヤー上にある場合、記録のためにアクセスすることはできません。







そのようなメッセージを賞賛することができます。したがって少なくともtry...catch



例外をキャッチして、構造への書き込みアクセスを必要とするすべての操作をパッケージ化する必要があることを思い出させてくださいつまり、次のようなものです。



 Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); try { entity.UpgradeOpen(); entity.Erase(); } catch () { ed.WriteMessage("\nSomething went wrong...\n"); }
      
      





この場合、システム例外の代わりに、AutoCADコンソールに簡単なメッセージが表示されます。



注意:
, try...catch



— . , eOnLockedLayer



, , Autodesk.AutoCAD.Runtime.Exception



( ErrorStatus



) — - :



 catch (Autodesk.AutoCAD.Runtime.Exception ex) { if (ex.ErrorStatus == ErrorStatus.OnLockedLayer) { ... } }
      
      





— , «», , , — , _. -, , . .



— — .



UPD。:Andrei Bushman GetObject



、一般的に言って、このメソッドには次のシグネチャがあること提案しました



 GetObject(ObjectId id, OpenMode mode, Boolean openErased, Boolean forceOpenOnLockedLayer)
      
      





最後のパラメーターを使用すると、ロックされたレイヤーを操作できます。たとえば、このコードは、ロックされたレイヤーでも正しく機能しました:



 Entity entity = (Entity)tr.GetObject(id, OpenMode.ForWrite, false, true); entity.Erase();
      
      





トランザクションが完了した後、オブジェクトが配置されているレイヤーの状態は変わりません。



一般的に、構造の代わりにtry...catch



パラメータを使用できるように見えますforceOpenOnLockedLayer



この場合、メソッドを放棄しUpgradeOpen()



、すぐにフラグを設定GetObject()



たwrite メソッドOpenMode.ForWrite



)でオブジェクトを開きますforceOpenOnLockedLayer







4.2オブジェクトの典型的なプロパティの変更



「典型的なプロパティ」とは、AutoCAD図面のすべてのオブジェクトに固有のプロパティを意味します。これは、たとえば、レイヤーと色です。



ここではすべて同じです。

  1. 記録のためにオブジェクトを開きます。
  2. 目的のプロパティを変更します。
  3. トランザクションをコミットします。


すべての図形をオレンジ色にしましょう。



コード:
 [CommandMethod("Habr_RepaintOrange_2")] public void repaintOrange_2() { //    Editor   Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; //       // !         ! PromptSelectionResult selRes = ed.SelectAll(); //    -    if (selRes.Status != PromptStatus.OK) { ed.WriteMessage("\nError!\n"); return; } //   ID  ObjectId[] ids = selRes.Value.GetObjectIds(); //   using (Transaction tr = db.TransactionManager.StartTransaction()) { // ""     foreach (ObjectId id in ids) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //     entity.UpgradeOpen(); //     entity.Color = Autodesk.AutoCAD.Colors.Color.FromRgb(255, 128, 0); } tr.Commit(); } }
      
      





結果:




すべてのオブジェクトの色がオレンジに変わります。ただし、ブロックのオカレンス内のオブジェクトは、すべてのブロックのオカレンスが正常にオレンジに設定されたという事実にもかかわらず、色を変えず、黒のままです。



ProofはColorフィールドの値です:




この機能に留意する必要があります。



考慮されたメソッドを使用して、クラスで使用可能なすべての可変プロパティを変更できますEntity



ただし、前の場合と同様に、プラグインが書き込みのためにオブジェクトにアクセスできることを146%確認する必要があります。確信度が低い場合は、旗forceOpenOnLockedLayer



または個人用保護具の設計try...catch



使用して、考えられる例外をキャッチしてください。



4.3オブジェクトの特定のプロパティの変更



円の半径を変更するとします。classを使用するEntity



と、半径の原因となるプロパティがないため、これを実行できません。この場合、オブジェクトをtypeにキャストする必要がありますCircle







コード:
 [CommandMethod("Habr_ModifyCircles_2")] public void modifyCircles_2() { //    Editor   Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; //  ,        TypedValue[] filterlist = new TypedValue[1]; //   (0) ,      //   ("CIRCLE") -   filterlist[0] = new TypedValue(0, "CIRCLE"); //   SelectionFilter filter = new SelectionFilter(filterlist); //         // !         ! PromptSelectionResult selRes = ed.SelectAll(filter); //    -    if (selRes.Status != PromptStatus.OK) { ed.WriteMessage("\nError!\n"); return; } //   ID  ObjectId[] ids = selRes.Value.GetObjectIds(); //   using (Transaction tr = db.TransactionManager.StartTransaction()) { // ""     foreach (ObjectId id in ids) { //       Circle Circle cir = (Circle)tr.GetObject(id, OpenMode.ForRead); //     cir.UpgradeOpen(); //   cir.Radius = cir.Radius * 2; } tr.Commit(); } }
      
      





結果:




動作します。



もちろん、私たちが円を扱っていることを確認する必要があります。型につながるしようとするとCircle



、例えば、優れたブロックの発生が終了しません:







使用のデザインをtry...catch



または、少なくともこの例のようにフィルタリングを提供するか、キャストの直前に型を確認します。



 Entity ent = (Entity)tr.GetObject(id, OpenMode.ForRead); if (ent.GetType() == typeof(Circle)) { Circle cir = (Circle)tr.GetObject(id, OpenMode.ForRead); }
      
      





私は、フィルターも検証もロックされたレイヤーとエラーのある状況から保護しないことを強調しますeOnLockedLayer



それに対抗するには、flag forceOpenOnLockedLayer



、またはdesign try...catch



、またはロックされたオブジェクトを遮断するフィルター/チェックを使用します。



4.4単純なオブジェクトの移動



図面内のオブジェクトの位置が単一のポイント(たとえば、円やブロックなど)で指定されている場合、この図を移動するには、対応するプロパティを変更するだけで十分です。たとえば、発生したすべてのブロックを原点に移動してみましょう。



コード:
 [CommandMethod("Habr_MoveBlocks_2")] public void moveBlocks_2() { //    Editor   Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; //  ,        TypedValue[] filterlist = new TypedValue[1]; //   (0) ,      //   ("CIRCLE") -   filterlist[0] = new TypedValue(0, "INSERT"); //   SelectionFilter filter = new SelectionFilter(filterlist); //         // !         ! PromptSelectionResult selRes = ed.SelectAll(filter); //    -    if (selRes.Status != PromptStatus.OK) { ed.WriteMessage("\nError!\n"); return; } //   ID  ObjectId[] ids = selRes.Value.GetObjectIds(); //   using (Transaction tr = db.TransactionManager.StartTransaction()) { // ""     foreach (ObjectId id in ids) { //       BlockReference BlockReference br = (BlockReference)tr.GetObject(id, OpenMode.ForRead); //     br.UpgradeOpen(); //    br.Position = Point3d.Origin; } tr.Commit(); } }
      
      





結果:




Position



円のプロパティの類似物はプロパティCenter



です。



4.5オブジェクトの複雑な操作



AutoCAD .NET APIを使用すると、オブジェクトをスケールおよび回転できます。おそらく、ポリゴンとポリラインの頂点を何らかの方法で変更することさえできます。残念ながら、私はそのようなことを扱っておらず、これについては何も言えません。



すでに必要な場合は、.NET APIマニュアルで情報の検索を開始できます(リンク(英語)、ミラー(英語))。さて、支援するAutoCADフォーラムAutodesk CIS Programmer Communityフォーラムで質問することもできます



アプリ



念のため、ここに主な例を含むコードの最終バージョンを示します
 using System; using System.Collections.Generic; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.EditorInput; using acad = Autodesk.AutoCAD.ApplicationServices.Application; namespace HabrPlug_SearchAndRescue { public class ClassMyAutoCADDLL_SearchAndRescue { public class Commands : IExtensionApplication { //   Autodesk.AutoCAD.Colors.Color color_Pink = Autodesk.AutoCAD.Colors.Color.FromRgb(255, 128, 255); Autodesk.AutoCAD.Colors.Color color_Blue = Autodesk.AutoCAD.Colors.Color.FromRgb(0, 200, 255); Autodesk.AutoCAD.Colors.Color color_LightGreen = Autodesk.AutoCAD.Colors.Color.FromRgb(128, 255, 64); // ID  "layer-1"  "layer-2" ObjectId layer_1; ObjectId layer_2; //   public void createLayers() { //       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_1 = new LayerTableRecord(); acLyrTblRec_1.Name = "layer-1"; //      ,  ID    layer_1 = acLyrTbl.Add(acLyrTblRec_1); //      tr.AddNewlyCreatedDBObject(acLyrTblRec_1, true); //        LayerTableRecord acLyrTblRec_2 = new LayerTableRecord(); acLyrTblRec_2.Name = "layer-2"; //      ,  ID    layer_2 = acLyrTbl.Add(acLyrTblRec_2); //      tr.AddNewlyCreatedDBObject(acLyrTblRec_2, true); //   tr.Commit(); } } } //    "block-1" public void createBlock_1() { //        Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; //    const string blockName = "block-1"; //   Transaction tr = db.TransactionManager.StartTransaction(); using (tr) { //      BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite); // ,        ;   -    if (bt.Has(blockName)) { return; } //    ,    BlockTableRecord btr = new BlockTableRecord(); btr.Name = blockName; //           bt.Add(btr); tr.AddNewlyCreatedDBObject(btr, true); //     //   Circle acCircle = new Circle(); //     acCircle.SetDatabaseDefaults(); acCircle.Center = Point3d.Origin; acCircle.Radius = 25; //          btr.AppendEntity(acCircle); tr.AddNewlyCreatedDBObject(acCircle, true); //   Line acLine = new Line(new Point3d(18, 18, 0), new Point3d(35, 35, 0)); //         acLine.SetDatabaseDefaults(); //          btr.AppendEntity(acLine); tr.AddNewlyCreatedDBObject(acLine, true); //   Polyline acPolyline = new Polyline(); //         acPolyline.SetDatabaseDefaults(); //     acPolyline.AddVertexAt(0, new Point2d(20, 35), 0, 0, 0); acPolyline.AddVertexAt(1, new Point2d(35, 35), 0, 0, 0); acPolyline.AddVertexAt(2, new Point2d(35, 20), 0, 0, 0); //          btr.AppendEntity(acPolyline); tr.AddNewlyCreatedDBObject(acPolyline, true); //   tr.Commit(); } } //    "block-2" public void createBlock_2() { //        Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; //    const string blockName = "block-2"; //   Transaction tr = db.TransactionManager.StartTransaction(); using (tr) { //      BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite); // ,        ;   -    if (bt.Has(blockName)) { return; } //    ,    BlockTableRecord btr = new BlockTableRecord(); btr.Name = blockName; //           bt.Add(btr); tr.AddNewlyCreatedDBObject(btr, true); //     //   Circle acCircle = new Circle(); //     acCircle.SetDatabaseDefaults(); acCircle.Center = Point3d.Origin; acCircle.Radius = 25; //         btr.AppendEntity(acCircle); tr.AddNewlyCreatedDBObject(acCircle, true); //    Line acLine_1 = new Line(new Point3d(0, -25, 0), new Point3d(0, -50, 0)); //         acLine_1.SetDatabaseDefaults(); //          btr.AppendEntity(acLine_1); tr.AddNewlyCreatedDBObject(acLine_1, true); //    Line acLine_2 = new Line(new Point3d(-7, -39, 0), new Point3d(7, -39, 0)); //         acLine_2.SetDatabaseDefaults(); //          btr.AppendEntity(acLine_2); tr.AddNewlyCreatedDBObject(acLine_2, true); //   tr.Commit(); } } //      public void layer_0_createObjects() { //       Document doc = acad.DocumentManager.MdiActiveDocument; Database db = doc.Database; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //     BlockTable acBlkTbl; acBlkTbl = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; //    (Model Space) -          BlockTableRecord ms = tr.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //    Line acLine_1 = new Line(new Point3d(225, 225, 0), new Point3d(225, 175, 0)); //         acLine_1.SetDatabaseDefaults(); //        acLine_1.Layer = "0"; acLine_1.Color = color_Pink; //          ms.AppendEntity(acLine_1); tr.AddNewlyCreatedDBObject(acLine_1, true); //    Line acLine_2 = new Line(new Point3d(250, 225, 0), new Point3d(250, 175, 0)); //         acLine_2.SetDatabaseDefaults(); //        acLine_2.Layer = "0"; acLine_2.Color = color_Blue; //          ms.AppendEntity(acLine_2); tr.AddNewlyCreatedDBObject(acLine_2, true); //    Line acLine_3 = new Line(new Point3d(275, 225, 0), new Point3d(275, 175, 0)); //         acLine_3.SetDatabaseDefaults(); //        acLine_3.Layer = "0"; acLine_3.Color = color_LightGreen; //          ms.AppendEntity(acLine_3); tr.AddNewlyCreatedDBObject(acLine_3, true); //    Polyline acPolyline = new Polyline(); //         acPolyline.SetDatabaseDefaults(); //     acPolyline.AddVertexAt(0, new Point2d(300, 225), 0, 0, 0); acPolyline.AddVertexAt(1, new Point2d(325, 175), 0, 0, 0); acPolyline.AddVertexAt(2, new Point2d(350, 225), 0, 0, 0); //        acPolyline.Layer = "0"; acPolyline.Color = color_Pink; //          ms.AppendEntity(acPolyline); tr.AddNewlyCreatedDBObject(acPolyline, true); //    Circle acCircle = new Circle(); //     acCircle.SetDatabaseDefaults(); acCircle.Center = new Point3d(400, 200, 0); acCircle.Radius = 25; //        acCircle.Layer = "0"; acCircle.Color = color_Blue; //          ms.AppendEntity(acCircle); tr.AddNewlyCreatedDBObject(acCircle, true); //    DBText text = new DBText(); text.Position = new Point3d(450, 175, 0); text.Height = 50; text.TextString = "HABR!"; //        text.Layer = "0"; text.Color = color_LightGreen; //          ms.AppendEntity(text); tr.AddNewlyCreatedDBObject(text, true); //   tr.Commit(); } } //     "layer-1" public void layer_1_createObjects() { //       Document doc = acad.DocumentManager.MdiActiveDocument; Database db = doc.Database; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //           // (         ) ObjectId currentLayer = db.Clayer; db.Clayer = layer_1; //     BlockTable acBlkTbl; acBlkTbl = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; //    (Model Space) -          BlockTableRecord ms = tr.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //    Line acLine_1 = new Line(new Point3d(225, 25, 0), new Point3d(225, -25, 0)); //     acLine_1.SetDatabaseDefaults(); acLine_1.Color = color_Pink; //          ms.AppendEntity(acLine_1); tr.AddNewlyCreatedDBObject(acLine_1, true); //    Line acLine_2 = new Line(new Point3d(250, 25, 0), new Point3d(250, -25, 0)); //     acLine_2.SetDatabaseDefaults(); acLine_2.Color = color_Blue; //          ms.AppendEntity(acLine_2); tr.AddNewlyCreatedDBObject(acLine_2, true); //    Circle acCircle = new Circle(); //     acCircle.SetDatabaseDefaults(); acCircle.Center = new Point3d(300, 0, 0); acCircle.Radius = 25; acCircle.Color = color_LightGreen; //          ms.AppendEntity(acCircle); tr.AddNewlyCreatedDBObject(acCircle, true); //    DBText text = new DBText(); //     text.Position = new Point3d(350, -25, 0); text.Height = 50; text.TextString = "HABR!"; text.Color = color_Pink; //          ms.AppendEntity(text); tr.AddNewlyCreatedDBObject(text, true); //    "block-1" //      BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); //  ObjectID  ObjectId btrId = bt["block-1"]; //    ,   ID   BlockReference br = new BlockReference(new Point3d(600, 0, 0), btrId); //          ms.AppendEntity(br); tr.AddNewlyCreatedDBObject(br, true); //      db.Clayer = currentLayer; //   tr.Commit(); } } //     "layer-2" public void layer_2_createObjects() { //       Document doc = acad.DocumentManager.MdiActiveDocument; Database db = doc.Database; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //           // (         ) ObjectId currentLayer = db.Clayer; db.Clayer = layer_2; //     BlockTable acBlkTbl; acBlkTbl = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; //    (Model Space) -          BlockTableRecord ms = tr.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //    Line acLine_1 = new Line(new Point3d(225, -175, 0), new Point3d(225, -225, 0)); //     acLine_1.SetDatabaseDefaults(); acLine_1.Color = color_Pink; //          ms.AppendEntity(acLine_1); tr.AddNewlyCreatedDBObject(acLine_1, true); //    Arc acArc = new Arc(new Point3d(250, -200, 0), 25, -45 / 180.0 * Math.PI, 45 / 180.0 * Math.PI); //     acArc.SetDatabaseDefaults(); acArc.Color = color_Blue; //          ms.AppendEntity(acArc); tr.AddNewlyCreatedDBObject(acArc, true); //    Circle acCircle = new Circle(); //     acCircle.SetDatabaseDefaults(); acCircle.Center = new Point3d(325, -200, 0); acCircle.Radius = 25; acCircle.Color = color_LightGreen; //          ms.AppendEntity(acCircle); tr.AddNewlyCreatedDBObject(acCircle, true); //    "block-1" //      BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); //  ObjectID  ObjectId btrId = bt["block-1"]; //    ,   ID   BlockReference br = new BlockReference(new Point3d(400, -200, 0), btrId); //          ms.AppendEntity(br); tr.AddNewlyCreatedDBObject(br, true); //    "block-2" //  ObjectID  btrId = bt["block-2"]; //    ,   ID   br = new BlockReference(new Point3d(475, -200, 0), btrId); //          ms.AppendEntity(br); tr.AddNewlyCreatedDBObject(br, true); //      db.Clayer = currentLayer; //   tr.Commit(); } } //      public void Initialize() { createLayers(); createBlock_1(); createBlock_2(); layer_0_createObjects(); layer_1_createObjects(); layer_2_createObjects(); } //  Terminate() ,    IExtensionApplication public void Terminate() { } ////////////////////////////////////////////////////////////// //     (<<MODEL SPACE>>) ////////////////////////////////////////////////////////////// //      ( 1) [CommandMethod("Habr_IterateThroughAllObjects_1")] public void iterateThroughAllObjects_1() { //    Database db = HostApplicationServices.WorkingDatabase; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //      (ModelSpace) BlockTableRecord ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead); // ""       foreach (ObjectId id in ms) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //     (entity.Layer),  (entity.GetType().ToString())   (entity.Color)   acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n", entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString())); } tr.Commit(); } } //     ( 1) [CommandMethod("Habr_FindCircles_1")] public void findCircles_1() { //    Database db = HostApplicationServices.WorkingDatabase; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //      (ModelSpace) BlockTableRecord ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead); // ""       foreach (ObjectId id in ms) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //    -    ,      if (entity.GetType() == typeof(Circle)) { acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n", entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString())); } } tr.Commit(); } } //      ( 1) [CommandMethod("Habr_FindLightGreenObjects_1")] public void findLightGreenObjects_1() { //    Database db = HostApplicationServices.WorkingDatabase; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //      (ModelSpace) BlockTableRecord ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead); // ""       foreach (ObjectId id in ms) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //    - ,     ,      if (entity.Color == Autodesk.AutoCAD.Colors.Color.FromRgb(128, 255, 64)) { acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n", entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString())); } } tr.Commit(); } } //       "block-1" ( 1) [CommandMethod("Habr_FindBlocks_1")] public void findBlocks_1() { //    Database db = HostApplicationServices.WorkingDatabase; //   using (Transaction tr = db.TransactionManager.StartTransaction()) { //      (ModelSpace) BlockTableRecord ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead); // ""       foreach (ObjectId id in ms) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); // ,      if (entity.GetType() == typeof(BlockReference)) { //   -     BlockReference BlockReference br = (BlockReference)entity; //      - "block-1",     ,      if (br.Name == "block-1") { acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n", entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString())); } } } tr.Commit(); } } ////////////////////////////////////////////////////////////// //     (<<EDITOR.SELECTALL>>) ////////////////////////////////////////////////////////////// //      ( 2) [CommandMethod("Habr_IterateThroughAllObjects_2")] public void iterateThroughAllObjects_2() { //    Editor   Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; //       // !         ! PromptSelectionResult selRes = ed.SelectAll(); //    -    if (selRes.Status != PromptStatus.OK) { ed.WriteMessage("\nError!\n"); return; } //   ID  ObjectId[] ids = selRes.Value.GetObjectIds(); //   using (Transaction tr = db.TransactionManager.StartTransaction()) { // ""     foreach (ObjectId id in ids) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //     (entity.Layer),  (entity.GetType().ToString())   (entity.Color)   acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n", entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString())); } tr.Commit(); } } //     ( 2) [CommandMethod("Habr_FindCircles_2")] public void findCircles_2() { //    Editor   Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; //  ,        TypedValue[] filterlist = new TypedValue[1]; //   (0) ,      //   ("CIRCLE") -   filterlist[0] = new TypedValue(0, "CIRCLE"); //   SelectionFilter filter = new SelectionFilter(filterlist); //         // !         ! PromptSelectionResult selRes = ed.SelectAll(filter); //    -    if (selRes.Status != PromptStatus.OK) { ed.WriteMessage("\nError!\n"); return; } //   ID  ObjectId[] ids = selRes.Value.GetObjectIds(); //   using (Transaction tr = db.TransactionManager.StartTransaction()) { // ""     foreach (ObjectId id in ids) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //    ,      acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n", entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString())); } tr.Commit(); } } ////////////////////////////////////////////////////////////// //   ////////////////////////////////////////////////////////////// //     [CommandMethod("Habr_EraseCircles_2")] public void eraseCircles_2() { //    Editor   Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; //  ,        TypedValue[] filterlist = new TypedValue[1]; //   (0) ,      //   ("CIRCLE") -   filterlist[0] = new TypedValue(0, "CIRCLE"); //   SelectionFilter filter = new SelectionFilter(filterlist); //         // !         ! PromptSelectionResult selRes = ed.SelectAll(filter); //    -    if (selRes.Status != PromptStatus.OK) { ed.WriteMessage("\nError!\n"); return; } //   ID  ObjectId[] ids = selRes.Value.GetObjectIds(); //   using (Transaction tr = db.TransactionManager.StartTransaction()) { // ""     foreach (ObjectId id in ids) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //      entity.UpgradeOpen(); //   entity.Erase(); } tr.Commit(); } } //         [CommandMethod("Habr_RepaintOrange_2")] public void repaintOrange_2() { //    Editor   Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; //       // !         ! PromptSelectionResult selRes = ed.SelectAll(); //    -    if (selRes.Status != PromptStatus.OK) { ed.WriteMessage("\nError!\n"); return; } //   ID  ObjectId[] ids = selRes.Value.GetObjectIds(); //   using (Transaction tr = db.TransactionManager.StartTransaction()) { // ""     foreach (ObjectId id in ids) { //       Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); //     entity.UpgradeOpen(); //     entity.Color = Autodesk.AutoCAD.Colors.Color.FromRgb(255, 128, 0); } tr.Commit(); } } //      [CommandMethod("Habr_ModifyCircles_2")] public void modifyCircles_2() { //    Editor   Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; //  ,        TypedValue[] filterlist = new TypedValue[1]; //   (0) ,      //   ("CIRCLE") -   filterlist[0] = new TypedValue(0, "CIRCLE"); //   SelectionFilter filter = new SelectionFilter(filterlist); //         // !         ! PromptSelectionResult selRes = ed.SelectAll(filter); //    -    if (selRes.Status != PromptStatus.OK) { ed.WriteMessage("\nError!\n"); return; } //   ID  ObjectId[] ids = selRes.Value.GetObjectIds(); //   using (Transaction tr = db.TransactionManager.StartTransaction()) { // ""     foreach (ObjectId id in ids) { //       Circle Circle cir = (Circle)tr.GetObject(id, OpenMode.ForRead); //     cir.UpgradeOpen(); //   cir.Radius = cir.Radius * 2; } tr.Commit(); } } //     [CommandMethod("Habr_MoveBlocks_2")] public void moveBlocks_2() { //    Editor   Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; //  ,        TypedValue[] filterlist = new TypedValue[1]; //   (0) ,      //   ("INSERT") -   filterlist[0] = new TypedValue(0, "INSERT"); //   SelectionFilter filter = new SelectionFilter(filterlist); //         // !         ! PromptSelectionResult selRes = ed.SelectAll(filter); //    -    if (selRes.Status != PromptStatus.OK) { ed.WriteMessage("\nError!\n"); return; } //   ID  ObjectId[] ids = selRes.Value.GetObjectIds(); //   using (Transaction tr = db.TransactionManager.StartTransaction()) { // ""     foreach (ObjectId id in ids) { //       BlockReference BlockReference br = (BlockReference)tr.GetObject(id, OpenMode.ForRead); //     br.UpgradeOpen(); //    br.Position = Point3d.Origin; } tr.Commit(); } } ////////////////////////////////////////////////////////////// //     (<< >>) ////////////////////////////////////////////////////////////// //      ( 3) // !   ! [CommandMethod("Habr_IterateThroughAllObjects_3")] public void iterateThroughAllObjects_3() { Database db = HostApplicationServices.WorkingDatabase; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; long amount = 0; Dictionary<string, int> d = new Dictionary<string, int>(); ObjectId id = ObjectId.Null; for (long i = db.BlockTableId.Handle.Value; i < db.Handseed.Value; i++) { Handle h = new Handle(i); if (db.TryGetObjectId(h, out id) && !id.IsNull && id.IsValid && !id.IsErased) { string t = id.ObjectClass.DxfName; amount++; if (d.ContainsKey(t)) d[t]++; else d.Add(t, 1); } } foreach (KeyValuePair<string, int> kvp in d) ed.WriteMessage("\n{0}: {1} ", kvp.Key, kvp.Value); ed.WriteMessage("\nTotal {0} objects in drawing\n", amount); } } } }
      
      







いつものように、私はどんなフィードバックやコメントにも喜んでいます。



All Articles