Компания
36,40
рейтинг
5 ноября 2013 в 23:08

Разработка → Работа с таблицами в 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\"";


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

Обсуждение статьи доступно также и на нашем форуме: forum.nanocad.ru/index.php?showtopic=6511.

Перевод статьи на английский: Tables in MultiCAD.NET. Part 2: Creating and modifying.

Смотрите также:

Работа с таблицами в MultiCAD.NET. Часть 1. Создание отчета на основе шаблона
Работа с таблицами в MultiCAD.NET. Часть 3. Внешние файлы таблиц и обмен данными с Microsoft Excel
Автор: @ISL

Комментарии (3)

  • 0
    День добрый, вроде все ясно, единственное сходу не смог найти и понять, а как таблицу разместить по нужным координатам программно, без участия пользователя.
    • +1
      table.DbEntity.Transform(Matrix3d.Displacement(new Vector3d(100, 50, 0)));
      • 0
        Спасибо!

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка