MultiCAD.NETでテーブルを操作します。 パート1.テンプレートに基づいてレポートを作成する





この出版物では、MultiCAD.NETでテーブルを操作するためのAPIの機能と機能に関する一連の記事を開きます。



ご存知のように、表形式のデザインなしでは図面はほとんど完成していません。表は、設計、要素のリスト、仕様などに関する定量的な情報を含むオブジェクトを作成するために使用されます。 このタスクを自動化することにより、ユーザーは日常的な作業から解放され、それにより、費やされる時間とエラーの数が削減されます。



例として、機器のレイアウト計画(または、より簡単に、施設全体のコンセントの分布を示す図に従って)の最終的な電気機器リストの作成を検討します。



各コンセントには、次の情報を含むマルチレベルリーダーが付いています。









問題を解決するプロセスは、3つの段階に分けることができます。



  1. レポート用の独自のテーブルテンプレートを作成し、
  2. テンプレートのロードとデータへのテーブルの順次充填、
  3. 表のページネーションとページ挿入。


テーブルテンプレートの作成


通常、テーブルレポートは標準テンプレートに基づいて生成され、作成にはテーブルUIが最もよく使用されます。 ただし、デモンストレーションのために、MultiCAD.NETソフトウェアを使用して独自のテンプレートを作成します。 ファイナルテーブルの一般的なビューは次のようになります。







セルの値は、特定の部屋にある特定のモデルの設置されたコンセントの数に対応しています。 テーブルには、2つのヘッダーも含まれます。通常のフッター(テーブルが破損した場合に最初のページを除くレポートの各ページに追加される)と、最初のページのフッターです。



そのようなテンプレートを作成し、指定された名前でファイルに保存するメソッドの例
bool CreateTemplate(string FileName) { McTable table = new McTable(); table.DefaultCell.HorizontalTextAlign = HorizTextAlign.Center; table.DefaultCell.VerticalTextAlign = VertTextAlign.Center; table.Columns.AddRange(0, 2); table.Columns[0].Width = 55; table.Columns[1].Width = 10; //       table.Rows.InsertSection(SectionTypeEnum.HeaderFirst, 0, 2); System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, 1, 0); table.Merge(rect); table[0, 0].TextHeight = 3.5; table.Rows[0].Height = 10; table[0, 0].Value = "     "; foreach (var cell in table.Rows[0].Cells) cell.SetBorderLineweight(BorderTypesEnum.ButBottom, -9); table.Rows[1].Height = 8; foreach (var cell in table.Rows[1].Cells) { cell.TextHeight = 2.5; } table[1, 0].Value = " "; table[1, 1].Value = "#room"; //     table.Rows.InsertSection(SectionTypeEnum.Header, 2); table.Rows[3].Height = 8; foreach (var cell in table.Rows[3].Cells) { cell.TextHeight = 2.5; } table[3, 0].Value = " "; table[3, 1].Value = "#room"; //    table.Rows.InsertSection(SectionTypeEnum.None, 4); table.Rows[5].Height = 6; table[5, 0].Value = "#code"; //      if (!table.SaveToFile(FileName)) { return false; } return true; }
      
      







提案されたテーブル構造とセル形式は、テーブルエディタを使用して、ユーザーの好みに応じてテンプレートで変更できます。



この実装では、テンプレートセルに特別な識別子文字列「#code」と「#room」が含まれており、テーブルに入力すると、特定のセルに書き込むデータを決定します。 これにより、テンプレート内の行と列の数が変更された場合でも、テーブルが正しく入力されます。



レポート作成


レポートテーブルを構築するためのアルゴリズムは、次の手順に分けることができます。



  1. レポート生成チームの登録、
  2. コンセントの説明を含むすべてのコールアウトの図面上の選択、
  3. テンプレートの読み込み、テンプレートの変更の可能性があるスプレッドシートエディタの起動、
  4. 選択したオブジェクトのデータを構造化して、後でテーブルに書き込む
  5. テーブルヘッダーの入力(テーブル名、部屋数に応じた列名)、
  6. テーブルの行を埋めます。


完全なサンプルコードはこのリンクから入手できます。いくつかの重要なポイントについて説明します。



レポートチームの登録


「メイン」アプリケーションメソッドを追加します。これは、 smpl_CreateTableReport



ハンドラーであり、アルゴリズムの実装が含まれます。



 [CommandMethod("smpl_CreateTableReport", CommandFlags.NoCheck | CommandFlags.NoPrefix)] public void smpl_CreateTableReport() { //   }
      
      





オブジェクト選択


タイプ「多層構造のリーダー」のオブジェクトの選択は、オブジェクトのフィルターを設定することにより、標準的な方法で実行されます。



 McObjectId[] idSelecteds = ObjectFilter.Create(true).AddType(McNoteMultilayer.TypeID).GetObjects().ToArray(); if (idSelecteds == null || idSelecteds.Length == 0) { return; }
      
      





フィルターでオブジェクトを選択した結果、図面内のすべてのコールアウトのID配列を取得しました。 Idにより、各リーダーの行の内容を取得できます。



  McNoteUnitCollection units=(McNoteMultilayer)id.GetObject()).Units;
      
      





テーブルに入力するには、選択したすべてのオブジェクトの内容を、要素の検索と並べ替えに適した単一のデータ構造に書き込むと便利です。 この例では、 <article <room number、quantity >>という形式のネストされた辞書から構造が使用されます



テンプレートをダウンロード


CreateTemplate()



メソッドを使用して目的の構造のテンプレートをすでに作成し、それをファイル(たとえば、 「C:\ template.dat」 CreateTemplate()



保存していることを前提としています。 テーブルは、 McTable.LoadFromFile()



メソッドを使用して外部ファイルからMcTable.LoadFromFile()



れます。 テーブルオブジェクトを作成し、作成したテンプレートからその構造とコンテンツをロードし、テーブルエディターを呼び出して、ユーザーがテンプレートに変更を加える機会を与えましょう。 もちろん、テーブルテンプレートは、内容だけでなく、テーブルの構造とフォーマットも保存できる形式で記述する必要があります。



 const string FileName = "C:\\template.dat"; McTable Table = new McTable(); if (!Table.LoadFromFile(FileName)) { return; } Table.OnEdit();
      
      











その後、テーブルへの入力を開始できます。 このプロセスは、ソート、引出線から取得したデータの順次ソート、および対応するセルの値としての追加で構成されます。 さまざまな実装が考えられるため、この点については説明しません。 プロジェクトのソースコードでこの例を書くために使用されたソリューションに慣れることができます。



テーブルのページネーション


また、ページネーションとしてテーブルを操作するときに、このような便利な機能に言及する必要があります。 デフォルトでは、レポートは単一のテーブルの形式で表示されますが、多数の行があるサイズは重要な場合があります。 McTable.PagesTable.SetPageHeight().



メソッドを使用して、テーブルを高さ制限のあるページに分割できますMcTable.PagesTable.SetPageHeight().



次のコードは、テーブルを高さ50以下のページに分割します。



 const double pageHeight = 50; double tableHeight = Table.DbEntity.BoundingBox.SizeByY; if (tableHeight > pageHeight) { Table.Pages.SetPageHeight(pageHeight); }
      
      









追加の方法は、 McTable.PagesTable.SetPageBreak()



メソッドを使用してMcTable.PagesTable.SetPageBreak()



ページを挿入することです。 たとえば、テーブルをインデックス7の行の2つのページに分割するには:



 Table.Pages.SetPageBreak(7);
      
      





結果は2ページのテーブルになります。





これらのメソッドのいずれかによってテーブルが分割された後、 McTable.PagesTable.SetOriginPage()



メソッドを使用して、テーブルの挿入ポイントを基準にして各ページの挿入ポイントを指定する必要があります。最初の引数はページ番号で、2番目はポイント座標です。 たとえば、5単位の間隔でページを配置するには:



 for (int n = 0; n < Table.Pages.Count; n++) { Table.Pages.SetOriginPage(n, new Point3d(n * (tableWidth + 5 * Table.DbEntity.Scale), 0, 0)); }
      
      





AutoCADでアプリケーションをダウンロードする


いつものように、ビルドされたライブラリをロードし、登録されたsmpl_CreateTableReport



を実行した後、この例はnanoCAD環境で実行されます。 AutoCADでMultiCAD.NETアプリケーションを実行するには、特別なアダプターアプリケーション(Object Enabler)を使用する必要があります。 AutoCADの標準MultiCADイネーブラーにはMulticad.Symbols



名前空間のオブジェクトを操作するツールが含まれていないため、そのようなオブジェクトを扱うアプリケーションを実行するには、最初にテーブルを含むすべてのプリミティブを含むGraphiCSまたはMechaniCS SPDSアプリケーションをダウンロードする必要がありますおよびコールアウト。



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



記事の英語への翻訳: MultiCAD.NETの表。 テーブルテンプレートに基づくレポートの生成



こちらもご覧ください:


MultiCAD.NETでテーブルを操作します。 パート2.作成と編集

MultiCAD.NETでテーブルを操作します。 パート3.外部テーブルファイルとMicrosoft Excelとのデータ交換



All Articles