В предыдущей статье мы познакомили вас с примером использования табличного функционала 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/
Добавить комментарий