Этой публикацией мы открывам цикл статей про возможности и особенности API для работы с таблицами в MultiCAD.NET.
Как известно, практически ни один чертеж не обходится без табличного оформления: таблицы применяются для создания объектов, содержащих количественную информацию о конструкции, ведомостей элементов, спецификаций и др. Типичной задачей, с которой сталкиваются проектировщики, является формирование табличного отчета по выбранным объектам чертежа. Автоматизация этой задачи позволит избавить пользователя от рутинной работы, тем самым сократив затраченное время и количество ошибок.
В качестве примера рассмотрим формирование итоговой ведомости электроприборов по плану расположения оборудования (или, проще говоря, по чертежу, иллюстрирующему распределение электрических розеток по помещениям).
Каждая розетка отмечена многоуровневой выноской, которая содержит следующую информацию:
- тип розетки,
- артикул/производитель,
- номер помещения для установки.
Процесс решения поставленной задачи может быть разбит на три этапа:
- создание собственного шаблона таблицы для отчета,
- загрузка шаблона и последовательное заполнение таблицы данными,
- разбивка и постраничная вставка таблицы.
Создание шаблона таблицы
Табличные отчеты обычно формируются на базе стандартных шаблонов, для создания которых чаще используется табличный UI. Однако, в целях демонстрации мы создадим свой собственный шаблон программными средствами MultiCAD.NET. Общий вид итоговой таблицы будет выглядеть следующим образом:
Значения ячеек соответствуют количеству установленных электрических розеток конкретной модели в конкретном помещении. Таблица также будет содержать два верхних колонтитула: обычный колонтитул, который в случае разбивки таблицы будет добавляться к каждой странице отчета, кроме первой, и колонтитул первой страницы.
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", которые в ходе заполнения таблицы позволят определить какие данные должны быть записаны в конкретную ячейку. Это обеспечит корректное наполнение таблицы даже при возможном изменении количества строк и столбцов в шаблоне.
Формирование отчета
Алгоритм построения таблицы отчета можно разделить на следующие шаги:
- регистрация команды создания отчета,
- выбор на чертеже всех выносок, содержащих описание электрических розеток,
- загрузка шаблона, запуск табличного редактора для возможного изменения шаблона,
- структурирование данных выбранных объектов для последующей записи в таблицу,
- заполнение колонтитулов таблицы (название таблицы, названия столбцов по числу помещений),
- заполнение строк таблицы.
Полный код примера доступен по этой ссылке, а мы остановимся на некоторых ключевых моментах.
Регистрация команды создания отчета
Добавим «главный» метод приложения, который является обработчиком команды 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;
Для заполнения таблицы будет удобно записать содержимое всех выбранных объектов в единую структуру данных, подходящую для поиска и сортировки элементов. В данном примере используется структура из вложенных словарей вида: <артикул<номер_помещения, количество>>.
Загрузка шаблона
Будем считать, что у нас уже создан шаблон нужной структуры с помощью метода CreateTemplate()
и сохранен в файл, например, «C:\template.dat». Загрузка таблицы из внешнего файла осуществляется с помощью метода McTable.LoadFromFile()
. Создадим объект таблицы, загрузим для него структуру и наполнение из созданного шаблона, а также вызовем табличный редактор, чтобы дать пользователю возможность внести правки в шаблон, если такие имеются. Конечно, при этом шаблон таблицы должен быть записан в формат, позволяющий сохранить не только содержимое, но и структуру и форматирование таблицы.
const string FileName = "C:\\template.dat"; McTable Table = new McTable(); if (!Table.LoadFromFile(FileName)) { return; } Table.OnEdit();
После этого можно приступать к заполнению таблицы. Процесс заключается в сортировке, последовательном переборе данных, полученных из строк выносок и добавлении их в качестве значений соответствующих ячеек. Учитывая многообразие возможных реализаций, мы не будем останавливаться на этом моменте; с решением, которое использовалось при написании этого примера, вы можете ознакомиться в исходном коде проекта.
Разбивка таблицы на страницы
Отдельно стоит упомянуть такую полезную возможность при работе с таблицами, как разбивка на страницы. По умолчанию отчет представлен в виде единой таблицы, размер которой при большом количестве строк может быть критичным. Разбить таблицу на страницы с ограничением их высоты можно с помощью метода McTable.PagesTable.SetPageHeight().
Следующий фрагмент кода разобьет таблицу на страницы высотой не более 50:
const double pageHeight = 50; double tableHeight = Table.DbEntity.BoundingBox.SizeByY; if (tableHeight > pageHeight) { Table.Pages.SetPageHeight(pageHeight); }
Дополнительный способ — вставить принудительный разрыв страницы с помощью метода McTable.PagesTable.SetPageBreak()
. Например, чтобы разбить таблицу на две страницы в строке с индексом 7:
Table.Pages.SetPageBreak(7);
Результатом будет таблица, состоящая из двух страниц:
После того, как таблица была разбита любым из этих способов, необходимо задать точку вставки каждой из страниц относительно точки вставки таблицы с помощью метода McTable.PagesTable.SetOriginPage()
, первый аргумент которого — это номер страницы, а второй — координаты точки. Например, для размещения страниц с интервалом в 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
Как обычно, наш пример будет запускаться в среде nanoCAD после загрузки построенной библиотеки и запуска зарегистрированной команды smpl_CreateTableReport
. Для запуска приложений MultiCAD.NET в среде AutoCAD требуется использование специального приложения-адаптера (Object Enabler). Необходимо отметить, что стандартный MultiCAD Enabler for AutoCAD не содержит средств для работы с объектами из пространства имен Multicad.Symbols
, поэтому для запуска приложений, имеющих дело с такими объектами, необходимо предварительно загрузить приложения СПДС GraphiCS или MechaniCS, которые содержит все примитивы, включая таблицы и выноски.
ссылка на оригинал статьи http://habrahabr.ru/company/nanosoft/blog/197794/
Добавить комментарий