В предыдущей статье мы познакомили вас с примером использования табличного функционала 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"";
Привязка объектов к таблице позволяет динамически отслеживать изменения: при изменении свойств присоединенного объекта, изменится и содержимое соответствующей ячейки.
Автор: ISL