Работа с таблицами в 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
    • +11
    • 2,7k
    • 3
    Нанософт 39,84
    Компания
    Поделиться публикацией
    Комментарии 3
    • 0
      День добрый, вроде все ясно, единственное сходу не смог найти и понять, а как таблицу разместить по нужным координатам программно, без участия пользователя.
      • +1
        table.DbEntity.Transform(Matrix3d.Displacement(new Vector3d(100, 50, 0)));

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

    Самое читаемое