Работа с таблицами в MultiCAD.NET. Часть 2. Создание и редактирование

от автора

В предыдущей статье мы познакомили вас с примером использования табличного функционала MultiCAD.NET API для автоматического создания отчета по выбранным объектам. Мы намеренно нарушаем хронологию и сегодняшнюю публикацию начнём с создания и форматирования простейшей таблицы. Рассмотрим наполнение таблицы данными в текстовом и числовом формате, а также использование формул. Затем перейдем к добавлению блоков и подтаблиц в качестве содержимого ячеек и завершим статью описанием использования свойств объектов чертежа в качестве динамически изменяемых данных таблицы.

Создание и форматирование таблиц

В MultiCAD.NET API таблицы представлены классом McTable из пространства имен Multicad.Symbols.Tables. Следующий фрагмент кода создает пустую таблицу, а затем добавляет в нее 2 строки и 3 столбца, начиная с нулевой позиции:

McTable Table1 = new McTable(); int rowCount = 4; int colCount = 5; Table1.Rows.AddRange(0, rowCount + 1); Table1.Columns.AddRange(0, colCount); 

Таким же образом может быть добавлен любой диапазон строк и столбцов в указанные позиции.

Добавим содержимое для только что созданной таблицы и определим формат ячеек. К примеру, таблица будет хранить данные о перечне деталей: порядковый номер в таблице, наименование, номер партии, материал и количество. Для ячеек, содержащих количество единиц, мы определим числовой формат, остальные ячейки будут содержать текст.

// Sets color and text height that will be used for all table cells by default: Table1.DefaultCell.TextHeight = 2.5; Table1.DefaultCell.TextColor = System.Drawing.Color.Aqua;  // The first row is the title, let's merge all its cells and set text alignment and height System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, colCount - 1, 0); Table1.Merge(rect); Table1[0, 0].HorizontalTextAlign = HorizTextAlign.Center; Table1[0, 0].VerticalTextAlign = VertTextAlign.Center; Table1[0, 0].TextHeight = 5;  // Fill up the table foreach (var cell in Table1.Rows[2].Cells) {   cell.VerticalTextAlign = VertTextAlign.Center;   cell.HorizontalTextAlign = HorizTextAlign.Center; } Table1.Columns[0].Width = 10; Table1[0, 0].Value = "Перечень деталей"; Table1[1, 0].Value = "Поз."; Table1[1, 1].Value = "Наименование"; Table1[1, 2].Value = "Количество, шт."; Table1[1, 3].Value = "Материал"; Table1[1, 4].Value = "Номер партии"; Table1[2, 0].Value = "1."; Table1[2, 1].Value = "Корпус"; Table1[2, 2].Type = CellFormatEnum.Number; Table1[2, 2].Value = "1"; Table1[2, 3].Value = "Нержавеющая сталь"; Table1[2, 4].Value = "1938-1К"; Table1[3, 0].Value = "2."; Table1[3, 1].Value = "Пружина"; Table1[3, 2].Type = CellFormatEnum.Number; Table1[3, 2].Value = "1"; Table1[3, 3].Value = "Углеродистая сталь"; Table1[3, 4].Value = "0132-2"; Table1[4, 0].Value = "3."; Table1[4, 1].Value = "Болт"; Table1[4, 2].Type = CellFormatEnum.Number; Table1[4, 2].Value = "1"; Table1[4, 3].Value = "Сталь"; Table1[4, 4].Value = "0715-7"; 

Одной из отличительных особенностей таблиц в MultiCAD.NET является возможность задания размещения текста в ячейке в случае, если при заполнении таблицы ширина или высота текста будет больше размеров ячейки. С помощью свойства HorzFits вы можете задать следующие режимы горизонтального вписывания:

  • HorizontalFitsEnum.None — не вписывать текст, текст может перекрывать соседние ячейки,
  • HorizontalFitsEnum.Shrink — сжать текст по горизонтали (режим по умолчанию),
  • HorizontalFitsEnum.Wrap — переносить по словам.

Свойство VertFits задает вертикальное вписывание текста:

  • VerticalFitsEnum.None — не вписывать текст, текст может перекрывать соседние ячейки,
  • VerticalFitsEnum.Shrink — уменьшить высоту шрифта (режим по умолчанию),
  • VerticalFitsEnum.Expand — увеличить высоту строки,
  • VerticalFitsEnum.AddRows — добавить псевдостроки для каждой строки текста.

Само собой, после того, как таблица сформирована, вы можете редактировать ее структуру. Например, добавить, удалить или скопировать строки и столбцы. Добавим в перечень еще одну запись о детали «Болт», переместим столбец «Количество» на последнюю позицию и удалим столбец с порядковыми номерами деталей:

Table1.Rows.CopyRange(4, 5, 1, true); Table1.Columns.Move(2,5); Table1.Columns.Delete(0); 

Затем добавим возможность учета общего количества деталей в таблице, используя встроенную табличную формулу «Сумма»:

Table1.Rows.AddRange(Table1.Rows.Count, 1); System.Drawing.Rectangle rect2 = new System.Drawing.Rectangle(0, Table1.Rows.Count - 1, Table1.Columns.Count - 2, 0); Table1.Merge(rect2); Table1[Table1.Rows.Count - 1, 0].TextHeight = 5; Table1[Table1.Rows.Count - 1, 0].Value = "Итого:"; String SummStartCell = Table1[2, Table1.Columns.Count - 1].AddressOfCell(); String SummEndCell = Table1[Table1.Rows.Count - 2, Table1.Columns.Count - 1].AddressOfCell(); Table1[Table1.Rows.Count - 1, Table1.Columns.Count - 1].ValueFormula = "=summ(" + SummStartCell + ":" + SummEndCell + ")"; 

В итоге, наша таблица будет иметь следующий вид:

Для суммирования данных из диапазона ячеек в итоговую ячейку было добавлено строковое представление формулы. В редакторе таблиц содержимое этой ячейки будет выглядеть следующим образом:

Сам редактор таблиц может быть вызван по двойному клику по таблице на чертеже или программно — вызовом метода OnEdit() у объекта таблицы.

Обратите внимание, что в примере для содержимого ячеек с количеством деталей предварительно был установлен числовой формат. По умолчанию используется формат Auto, который позволяет определять тип данных автоматически.

Добавление таблицы в чертеж

Как обычный примитив, таблица может быть добавлена в чертеж с помощью одного из двух методов:

Table.DbEntity.AddToCurrentDocument();— добавляет табличный примитив в чертеж, координаты левого верхнего угла таблицы совпадают с началом координат.
Table.PlaceObject(); — интерактивная вставка объекта. Пользователю будет предложено определить точку вставки таблицы. В зависимости от значений аргументов вставка может быть выполнена с предварительным вызовом редактора таблицы. Вызов метода без аргументов, а также со значением McEntity.PlaceFlags.Normal вызовет редактор таблицы.
Добавим таблицу в чертеж с помощью интерактивного выбора точки вставки, без вызова редактора таблиц:

Table1.PlaceObject(McEntity.PlaceFlags.Silent); 
Использование блоков и подтаблиц в качестве содержимого ячеек

В таблицах MultiCAD.NET, помимо обычных текстовых и числовых данных, в качестве содержимого ячеек можно использовать блоки и другие таблицы. Рассмотрим эту возможность на примере создания таблицы, которая будет описывать элементы металлического профиля. В первом столбце будет указан тип профиля, во втором — его спецификация, в третьем — изображение профиля:

Предположим, что спецификация типа профиля хранится в виде таблице следующего вида:

А общий вид различных профилей — во внешнем файле в виде отдельных блоков:

Добавим в основную таблицу изображение профиля и его спецификацию.

Вставка подтаблиц

Для вставки подтаблиц используется метод

McTable.InsertSubtable(ref McTable inTable, int row, int col, InsertionModeEnum mode);
inTable — таблица, которая будет вставлена
row, col — номер строки и столбца ячейки, в которую будет осуществляться вставка,
mode — режим вставки таблицы.
Режимы вставки могут быть следующими:

InSingleCell — таблица будет вставлена в отдельную ячейку. При этом структура полученной таблицы будет изменена в соответствии со структурой вставляемой таблицы.
CellByCell — таблица будет вставлена «ячейка в ячейку», начиная с левой верхней. Полученная таблица будет содержать те ячейки, которые являются общими для структур обеих таблиц.
Over — таблица будет вставлена поверх. Размеры ячеек обеих таблиц при этом не изменяются.

Вставим таблицу спецификации профиля в отдельную ячейку основной таблицы:

Table1.InsertSubtable(ProfileTable1, 1, 1, InsertionModeEnum.InSingleCell); 

Блоки как содержимое ячеек

Для вставки блока используется метод EmbedBlock() класса Cell, который позволяет внедрить блок в отдельную ячейку, указав ID блока, его имя или имя блока и имя файла, который его содержит:

bool EmbedBlock(int row, int col, McObjectId Id);
bool EmbedBlock(int row, int col, ref String name);
bool EmbedBlock(int row, int col, ref String name, ref String fileName);
Вставим изображение направляющего профиля, которое хранится во внешнем файле в виде блока:

Table1[1, 0].Value = "Профиль направляющий"; Table1[1, 2].EmbedBlock("Profile_03", "C:\\Profiles.dwg"); 

Извлечение свойств объекта в таблицу

Еще одна полезная функция табличного API в MultiCAD.NET — это привязка примитивов к таблице. После того, как объект привязан к таблице, вы можете использовать его свойства в качестве содержимого ячейки с помощью формул. Следующий фрагмент кода присоединяет замкнутую полилинию к таблице и получает в качестве содержимого ячейки (0, 0) значение площади, ограниченной полилинией:

String object = Table1.AttachObject(polyline.ID); Table1[0, 0].ValueFormula = object + ".\"Geometry.Area\""; 

Привязка объектов к таблице позволяет динамически отслеживать изменения: при изменении свойств присоединенного объекта, изменится и содержимое соответствующей ячейки.

ссылка на оригинал статьи http://habrahabr.ru/company/nanosoft/blog/198774/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *