テキストファイルからクラシック.NET APIのnanoCAD図面に座標をインポートします





最も一般的なnanoCADプログラミングの質問の1つは、「テキストファイルからポイントをインポートするにはどうすればよいですか?」です。 この作業は難しくありませんが、プロのデザイナーはプロのプログラマーである必要はありません。そのため、この記事は「初心者向け」のスタイルで作成しました。



nanoCADに存在する任意のAPIタイプを使用して、座標を図面にインポートできます。 .NETを選択し、2つの近いAPIを比較することにしました。クラシック.NET APIとクロスCADプラットフォームMultiCAD.NET APIです。 カットの下-最初の部分-クラシック.NET APIでのポイントのインポート。



指定: X、Y、Zポイントの座標、1行に1ポイントのテキストファイル。 座標はスペースで区切られ、小数部分の区切りはドットです。



必須: IMPORTCOORDSコマンドでファイル名を照会し、 DatabaseServices.DBPoint



オブジェクトの形式で現在の描画スペースで見つかった座標をインポートするアプリケーションをDatabaseServices.DBPoint



ます。 オブジェクト座標は、図面の現在のユーザー座標系(UCS)にインポートする必要があります。



ワーキングドラフトの作成と設定


アプリケーションを作成するには、次のツールが必要です。



もちろん、C#で少なくとも少しプログラミングできることは理解されています。 そうでない場合は、 MSDNライブラリにようこそ。



Visual Studioで次の設定で新しいプロジェクトを作成します。



したがって、アプリケーションは通常の.NETアセンブリ(DLL)であり、その後、nanoCADにロードされます。

[参照]タブで、nanoCADキットの一部である次のライブラリを接続します。



これで、プログラム自体の作成に安全に進むことができます。



プログラム構成


実装は、次の手順に分類できます。

  1. IMPORTCOORDSコマンドを登録します。
  2. 現在の図面のデータベースとコマンドラインエディターを取得します。
  3. 座標付きのファイル名を要求します。
  4. ファイルを開き、座標で行を読み取ります。
  5. 個別の座標でDBPointオブジェクトを作成します。 それらの座標を現在のユーザー座標系に変換します。
  6. 作成したオブジェクトを現在の描画スペース(モデル空間またはペーパー空間)に追加します。


nanoCADでアプリケーションを呼び出すコマンドを登録するには、このコマンドによって呼び出されるメソッドを定義する前に、 [CommandMethod]



属性を宣言し、コマンドの名前を指定する必要があります。 メソッドにはpublic修飾子が必要であることに注意してください。



 [CommandMethod("IMPORTCOORDS")] public void importCoords() { ... }
      
      





続行する前に、停止して「図面データベース」とは何かを簡単に説明したいと思います。 .dwgファイルは厳密な構造を持つデータベースで、その主な要素はテーブル(シンボルテーブル)で、図面内のすべてのオブジェクトが含まれています。 これらは、図面に表示されるグラフィックオブジェクト(線、円弧、点など)だけでなく、図面の内容と設定を決定する他の多くのオブジェクトでもあります。 たとえば、レイヤーテーブルには図面上のすべてのレイヤーが含まれ、ラインタイプテーブルには図面で定義されたすべてのラインスタイルが保存され、UCSテーブル-ユーザーが作成したすべての座標系したがって、新しい描画オブジェクトを作成するとは、対応するデータベースオブジェクトを作成することを意味します。



続けて まず、開いているすべてのドキュメントから現在のドキュメントを選択し、そのデータベースを開く必要があります。 これを行うには、開いているすべてのドキュメントのオブジェクトマネージャーを取得し、その助けを借りてデータベースを使用して作業を続けます。



 DocumentCollection dm = Application.DocumentManager; Database db = dm.MdiActiveDocument.Database;
      
      





アプリケーションがファイル名を要求するには、Editorオブジェクトを取得し、特定のタイプ(この場合はファイル名)のユーザー入力を要求するメソッドを呼び出す必要があります。



 //     Editor ed = dm.MdiActiveDocument.Editor; //      PromptFileNameResult sourceFileName; //         sourceFileName = ed.GetFileNameForOpen("\nEnter the name of the coordinates file to be imported:"); if (sourceFileName.Status == PromptStatus.OK) { ... }
      
      





ファイルから座標を取得するのは、テキストファイルを読み取り、文字列データ型を操作するためのC#機能を使用すると非常に簡単です。



 //  ,       string[] lines = File.ReadAllLines(sourceFileName.StringResult); //       ,   (.          ). //      ,    ,       double. string[] coord; foreach (string s in lines) { coord = s.Split(new char[] { ' ' }); double coordX = Convert.ToDouble(coord[0]); double coordY = Convert.ToDouble(coord[1]); double coordZ = Convert.ToDouble(coord[2]); }
      
      





グラフィックプリミティブ(エンティティ)の作成に進みます。 前述のように、図面に格納されるオブジェクト(グラフィックだけでなく)を作成するには、図面データベース、つまり対応するコンテナオブジェクトに追加する必要があります。 そのため、たとえば、すべてのレイヤーはレイヤーテーブルにレコードとして保存されます。この場合、レイヤーテーブルはコンテナーオブジェクトです。 データベースの一般的な構造は次のとおりです。







グラフィックプリミティブはデータベースに直接格納されるのではなく、個々のブロックの構造に格納されます。個々のブロックはブロックテーブルのエントリになります。 このようなメカニズムにより、オブジェクトを名前付きブロックに簡単にグループ化し、それらを全体として管理できるため、これは非常に便利です。 ちなみに、データベース内のモデル空間とシート空間も別々のブロックで表されます。 したがって、グラフィックプリミティブの場合、コンテナは別のブロックになり、そのブロックは親オブジェクトであるブロックテーブルに属します。



データベースを使用しているため、プログラムの実行中にエラーが発生した場合に備えて、データベースの整合性と保護を確保する必要があります。 この目的のために、トランザクションメカニズムが使用されます。 トランザクションは、全体として実行されるいくつかの操作を結合します。何か問題が発生した場合、トランザクションはキャンセルされ、このトランザクションの一部として作成されたオブジェクトはドキュメントに追加されません。 すべての操作が正常に完了すると、トランザクションが確認され、オブジェクトがデータベースに追加されます。



この知識があれば、ファイルから読み取った座標内の現在の描画スペースに「ポイント」プリミティブを安全に追加できます。



 using (Transaction tr = db.TransactionManager.StartTransaction()) { //              ,    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); string[] lines = File.ReadAllLines(sourceFileName.StringResult); string[] coord; foreach (string s in lines) { coord = s.Split(new char[] { ' ' }); double coordX = Convert.ToDouble(coord[0]); double coordY = Convert.ToDouble(coord[1]); double coordZ = Convert.ToDouble(coord[2]); DBPoint point = new DBPoint(new Point3d(coordX, coordY, coordZ)); btr.AppendEntity(point); tr.AddNewlyCreatedDBObject(point, true); } btr.Dispose(); tr.Commit(); }
      
      





タスクは実質的に解決されます。 1つの条件を満たすために残ります:プリミティブポイントは、ユーザー座標系(UCS)の座標で作成する必要があります。 プリミティブはワールド座標系(WCS)の図面データベースに格納されていることに注意してください。 したがって、プリミティブを作成するときは、UCS-> WCSの変換を実行する必要があります。 これは、ユーザー座標系のマトリックスを使用して行われます。



 Matrix3d ucsMatrix = ed.CurrentUserCoordinateSystem;
      
      





変換を追加します。



 { ... point.TransformBy(ucsMatrix.Inverse()); ... }
      
      





したがって、プログラムは完全に作成されています。 次は?



nanoCADへのアプリケーションのダウンロード


最も快適な部分は残っていました-nanoCADでプログラムをダウンロードし、あなたの仕事の結果を楽しむこと。 覚えているように、作業プロジェクトはクラスライブラリとして作成されているため、コンパイルが成功すると、プロジェクトの名前を持つアセンブリがビルドされます。 nanoCADを開き、コマンドラインでNETLOADコマンドを作成し、リストからビルドされたライブラリを選択してロードします。 プログラムを開始するには、コマンドラインでIMPORTCOORDSコマンドの名前を入力するだけです。



インポート座標。 バージョン2.0


いくつかの便利な機能とユーザーインターフェイス要素を追加して、アプリケーションの最初のバージョンを改善します。



アプリケーションの最初のバージョンが、スペースのみで座標が区切られ、小数点が小数点記号として使用されたテキストファイルを「理解」した場合、アプリケーションはタブ文字、スペース、またはセミコロンで区切られた座標を「認識」できるようになります。 小数点区切り記号については、ピリオドまたはカンマのいずれかを使用できるようになりました;地域設定を考慮せずにインポートが実行されます。 IMPORTCOORDSコマンドは、座標をインポートするためのモーダルダイアログを開きます。このダイアログでは、ユーザーはファイルを選択し、座標をインポートするために必要な設定を指定できます。



座標をインポートしてプリミティブを作成するための一般的なメカニズムは実質的に変更されていませんが、フォームクラス内で発生し、IMPORTCOORDSコマンドハンドラーメソッドのタスクは、フォームオブジェクトの作成と画面上のフォームのモーダルダイアログとしての表示のみになります:



 [CommandMethod("IMPORTCOORDS")] public void importCoords() { Form form = new ImportForm(); HostMgd.ApplicationServices.Application.ShowModalDialog(form); }
      
      





その後、制御は座標インポートフォームのウィンドウに転送されます。



申込書


アプリケーションフォームには、次の要素が含まれています。



これらのコントロールを使用して、ユーザーは目的の区切り文字を指定し、プレビューフィールドで結果を確認し(テキストファイルをインポートするときにMS Excelで行った方法と同様)、座標のインポートを開始できます。







AutoCAD互換


結論として、nanoCAD用に作成されたアプリケーションは、AutoCADで動作するように簡単に再コンパイルできることに注意したいと思います。 これを行うには、次を実行します。



プロジェクトの両方のバージョンはここから入手できます



記事に関する議論は、フォーラム( forum.nanocad.ru/index.php?showtopic=6508)でも利用できます。

記事の英語への翻訳: 古典的な.NET APIを使用して、テキストファイルからnanoCAD図面に座標をインポートします



All Articles