BIMIT
Разработка плагинов

table

Это интерфейс для отображения результата работы плагина в табличном виде в системе BIMIT (плагины типа «Аналитический отчет»). Таблица показывается в интерфейсе с пагинацией, сортировкой и кнопками подсветки элементов, а также выгружается в XLSX. Возвращать таблицу из start() не нужно — система сама отдает ее после выполнения плагина. В нем доступны следующие функции:

  • addHeaderRow - добавление строки с заголовками в таблицу
  • addRow - добавление строки
  • insertRow - запись содержимого строки по указанному индексу
  • replaceRow - замена содержимого строки по указанному индексу с указанием новых данных
  • addCell - добавление ячейки в таблицу
  • addButton - добавление кнопки с действием
  • addContextMenuButton - добавление кнопки с действием в контекстное меню ячейки
  • setPageSize - установка количества элементов на одной странице
  • setPage - установка страницы, которая будет активна при запуске плагина
  • sortASC - установка параметров для сортировки данных в таблице по возрастанию с указанием столбца
  • sortDESC - установка параметров для сортировки данных в таблице по убыванию с указанием столбца
  • createGroupElements - создание группы элементов с указанием цвета группы и списка элементов
  • setFontBold - применение жирного шрифта
  • setFontItalic - применение курсива
  • setFontSize - применение размера шрифта
  • setCellAlignment - применение выравнивания
  • setColumnVisible - смена видимости колонки
  • addImage - добавление картинки в таблицу
  • getImage - получение картинки из общей коллекции
  • addSheet - создание дополнительного листа таблицы
  • renameCurrentSheet - редактирование названия текущего / активного листа
  • renameSheet - редактирование названия листа
  • setCurrentSheet - установка активного листа таблицы
  • addTableParams - добавление дополнительных параметров таблицы (переключатель слоев)
  • autoSizeColumns - автоматический размер столбцов в аналитическом отчете
  • setSizeColumns - установка ширины столбца в аналитическом отчете
  • setSizeAndWrapColumns - установка ширины и переноса текста столбца в аналитическом отчете
Индексация строк и столбцов в интерфейсе table начинается с 1: строки данных — 1..N (строка заголовков в нумерацию не входит), столбцы — 1..M. В методах стилей 0 означает «все строки» / «все столбцы». В интерфейсе file индексация начинается с 0.
  • Значения ячеек не должны быть null — это приводит к ошибке; используйте запасное значение: el.name ?: "".
  • Не оставляйте полностью пустых строк и пропусков в номерах строк (например, addCell(1, 10, …), когда в таблице 3 строки) — формирование результата завершится ошибкой. Для пустой строки-отступа пишите table.addRow("").
addHeaderRow - добавление строки с заголовками в таблицу
  • table.addHeaderRow(Object... inp) - сколько заголовков, столько и столбцов в итоговой таблице
  • table.addHeaderRow(HeaderColumn... columns) - заголовки с параметром видимости колонки на экране и в файле экспорта: new HeaderColumn(String title) или new HeaderColumn(String title, String visibility), где visibility — "BOTH" (по умолчанию), "TABLE" или "EXPORT"

Пример использования:

table.addHeaderRow("Заголовок 1", "Заголовок 2", "Заголовок 3")
table.addHeaderRow(new HeaderColumn("Код", "EXPORT"), new HeaderColumn("Название", "BOTH"), new HeaderColumn("Ед. изм", "TABLE"))

Примечание:

  • на экране отобразятся колонки, где TABLE | BOTH
  • в файле экспорта отобразятся колонки, где EXPORT | BOTH
  • вызов addHeaderRow обязателен: ячейки правее последнего заголовка не выводятся
  • класс HeaderColumn доступен в плагине без импорта
addRow - добавление строки
  • table.addRow(Object... inp) - создает строку с выбранными данными в конце таблицы. Строку короче заголовков писать можно — недостающие ячейки будут пустыми

Пример использования:

table.addRow("Строка 1", "Строка 2", "Строка 3")
Пустую строку table.addRow() без данных не оставляйте — формирование результата завершится ошибкой. Список нужно разворачивать: table.addRow(list as Object[]), иначе весь список попадет в одну ячейку.
insertRow - запись содержимого строки по указанному индексу
  • table.insertRow(int indexRow, Object... inp) - записывает строку с номером indexRow. Если строка уже есть, она перезаписывается — сдвига строк нет

Пример использования:

table.insertRow(2, "Новая строка 2", "Значение")
replaceRow - замена содержимого строки по указанному индексу с указанием новых данных
  • table.replaceRow(int indexRow, Object... inp) - заменяет все содержимое строки indexRow новыми данными

Пример использования:

table.replaceRow(1, "Строка 1", "Новое значение")
addCell - добавление ячейки в таблицу
  • table.addCell(int indexColumn, int indexRow, Object value) - создает ячейку в указанном столбце и строке или заменяет существующую
  • table.addCell(int indexColumn, Object value) - создает ячейку в указанном столбце новой строки после последней

Примеры использования:

table.addCell(1, 1, "123")   // столбец 1, строка 1
table.addCell(1, "123")      // столбец 1, новая строка
addButton - добавление кнопки с действием
  • table.addButton(int indexColumn, int indexRow, String buttonName, String ACTION_TYPE, Object elements) - кнопка с цветом подсветки по умолчанию (#FFFF00)
  • table.addButton(int indexColumn, int indexRow, String buttonName, String ACTION_TYPE, String color, Object elements) - кнопка с указанием цвета подсветки "#RRGGBB" (работает для SHOW_ELEMENTS и SHOW_GROUP_ELEMENTS)

В elements передается список строк-UUID элементов (самый надежный вариант), объектов с полем uuid (элементы модели) или объектов Colored, либо одиночный объект. Кнопка занимает ячейку (indexColumn, indexRow).

Типы действий:

ДействиеОписание
SHOW_ELEMENTSвыделение элементов на модели и перелет камеры к ним (обычная выборка)
SHOW_GROUP_ELEMENTSподсветка элементов на модели в соответствии с назначенными для них цветами (если цвет не назначен, то по умолчанию)
EXCLUDE_ELEMENTSисключение элементов и перезапуск плагина: в params придут excludedElements (накопленный список UUID исключенных элементов) и isReportRecalc: true
Строка indexRow уже должна существовать (создана через addRow/addCell), иначе возникнет ошибка.

Примеры использования:

table.addButton(1, 3, "click", "SHOW_ELEMENTS", ["29dec5b9-bfe8-4189-82c7-7aec4c858fce", "98cff622-b2a9-475b-be6d-77f443f0ed53"])
table.addButton(1, 1, "color el", "SHOW_GROUP_ELEMENTS", "#FF0000",
        ["98cff622-b2a9-475b-be6d-77f443f0ed53", "bd70e912-ffaf-4374-8185-e1d44bd4461e", "29dec5b9-bfe8-4189-82c7-7aec4c858fce"])
def arr = []
def conditionOne = bim.createCondition("class", "eq", "IfcPile")

def el = bim.getElements(conditionOne).toList()

arr.add(el[0].uuid.toString())
arr.add(new Colored("#F322dd", el[1]))
arr.add(new Colored("#F30011", el[3].uuid))
arr.add(new Colored("#F399dd", "493105b3-d8ab-422e-95ea-dbaab48c8a68"))
arr.add(new Colored("#002fff", "2049c986-1f49-4a39-8c1a-dc19348f9d40"))

table.addButton(1, 1, "color group", "SHOW_GROUP_ELEMENTS", "#ff6600", arr)
table.addButton(2, 1, "group", "SHOW_GROUP_ELEMENTS", arr)
// кнопка «убрать строку из отчета»
table.addButton(6, row, "❌", "EXCLUDE_ELEMENTS", items.collect { it.uuid.toString() })

// при перезапуске учитываем исключенные элементы
def excluded = (params.get("excludedElements") ?: []).collect { it.toString() } as Set
walls = walls.findAll { !excluded.contains(it.uuid.toString()) }

Colored (доступен без импорта): new Colored(String color, элемент | UUID | строка-UUID) или new Colored(String color, int opacity, …) — индивидуальный цвет и непрозрачность элемента для SHOW_GROUP_ELEMENTS.

addContextMenuButton - добавление кнопки с действием в контекстное меню с указанием индекса строки, столбца, наименования кнопки, типа действия, передаваемых данных (массив/строка)
  • table.addContextMenuButton(int indexColumn, int indexRow, String buttonName, String ACTION_TYPE, Object value) - добавление кнопки с действием в контекстное меню ячейки
  • indexColumn - индекс столбца
  • indexRow - индекс строки
  • buttonName - название кнопки в контекстном меню
  • ACTION_TYPE - тип действия (только TASK_CREATE - для создания задачи)
  • value - любой объект и дополнительные данные (например, для создания задачи передавать тайтл, который подставляется автоматически)

Ячейка (indexColumn, indexRow) уже должна быть заполнена, иначе кнопка не добавляется. В одну ячейку можно добавить несколько кнопок.

Пример использования:

table.addContextMenuButton(1, 1, "Создать задачу", "TASK_CREATE", "Название задачи")
setPageSize - установка количества элементов на одной странице
  • table.setPageSize(int pageSize) - устанавливает количество отображаемых строк на странице (по умолчанию 10); действует на всю таблицу

Пример использования:

table.setPageSize(10)
setPage - установка страницы, которая будет активна при запуске плагина
  • table.setPage(int page) - устанавливает текущую страницу (нумерация начинается с 1, по умолчанию 1)

Пример использования:

table.setPage(1)
sortASC - установка параметров для сортировки данных в таблице по возрастанию с указанием столбца
  • table.sortASC(int indexColumn) - сортировка активного листа при выдаче результата

Пример использования:

table.sortASC(2)
sortDESC - установка параметров для сортировки данных в таблице по убыванию с указанием столбца
  • table.sortDESC(int indexColumn) - сортировка активного листа при выдаче результата

Пример использования:

table.sortDESC(2)
Сравнение текстовое без учета регистра ("100" < "20"), а номер столбца отсчитывается по видимым на экране столбцам. Для чисел и надежного порядка отсортируйте данные в Groovy до addRow и sortASC/sortDESC не вызывайте. Кнопки перемещаются вместе со строкой.
createGroupElements - создание группы элементов с указанием цвета группы и списка элементов
  • table.createGroupElements(String color, List<T> elements) → GroupElements - группа (цвет + список UUID); elements — элементы модели или их UUID. Может передаваться в elements кнопки SHOW_GROUP_ELEMENTS

Пример использования:

def walls = bim.getElements(bim.createCondition("class", "eq", "IfcWall"))
def group = table.createGroupElements("#FF0000", walls.toList())
setFontBold - применение жирного шрифта
  • table.setFontBold(int colIndex, int rowIndex) - при указании номера столбца и/или строки 0 стиль применяется ко всем столбцам/строкам

Пример использования:

//Применить на всю таблицу
table.setFontBold(0, 0)

//Применить на конкретную строку
table.setFontBold(0, 2)

//Применить на конкретный столбец
table.setFontBold(4, 0)

//Применить на конкретную ячейку
table.setFontBold(4, 2)
setFontItalic - применение курсива
  • table.setFontItalic(int colIndex, int rowIndex) - при указании номера столбца и/или строки 0 стиль применяется ко всем столбцам/строкам

Пример использования:

//Применить на всю таблицу
table.setFontItalic(0, 0)

//Применить на конкретную строку
table.setFontItalic(0, 2)

//Применить на конкретный столбец
table.setFontItalic(4, 0)

//Применить на конкретную ячейку
table.setFontItalic(4, 2)
setFontSize - применение размера шрифта
  • table.setFontSize(int size, int colIndex, int rowIndex) - при указании номера столбца и/или строки 0 стиль применяется ко всем столбцам/строкам

Пример использования:

//Применить на всю таблицу
table.setFontSize(12, 0, 0)

//Применить на конкретную строку
table.setFontSize(15, 0, 2)

//Применить на конкретный столбец
table.setFontSize(8, 4, 0)

//Применить на конкретную ячейку
table.setFontSize(20, 4, 2)
setCellAlignment - применение выравнивания
  • table.setCellAlignment(String align, int colIndex, int rowIndex) - align: "left", "center" или "right"; при указании номера столбца и/или строки 0 стиль применяется ко всем столбцам/строкам

Пример использования:

//Применить на всю таблицу
table.setCellAlignment("left", 0, 0)

//Применить на конкретную строку
table.setCellAlignment("center", 0, 2)

//Применить на конкретный столбец
table.setCellAlignment("right", 4, 0)

//Применить на конкретную ячейку
table.setCellAlignment("left", 4, 2)
setColumnVisible - смена видимости колонки в аналитическом отчете
  • table.setColumnVisible(int indexColumn, String visibility) - visibility: "TABLE" (только на экране), "EXPORT" (только в файле экспорта) или "BOTH". Вызывать после addHeaderRow

Пример использования:

table.setColumnVisible(1, "TABLE")
table.setColumnVisible(2, "TABLE")
table.setColumnVisible(3, "EXPORT")
addImage - добавление картинки в таблицу
  • table.addImage(int indexColumn, int indexRow, PluginImage image) - добавление картинки (ширина 100 пикселей)
  • table.addImage(int indexColumn, int indexRow, PluginImage image, int width) - добавление картинки с указанной шириной в пикселях
  • table.addImage(int indexColumn, int indexRow, String url) - добавление картинки по пути в общей коллекции (ширина 100 пикселей)
  • table.addImage(int indexColumn, int indexRow, String url, int width) - добавление картинки по пути с указанной шириной в пикселях

Строка создается автоматически, если ее еще нет.

По пути можно добавить картинку в формате png, jpg (jpeg), svg или webp: в таблице на экране отображаются все эти форматы. При выгрузке таблицы в XLSX svg и webp не поддерживаются, поэтому для выгрузки используйте png или jpg.

Пример использования:

table.addImage(6, 1, imgResult)
table.addImage(5, 1, img3, 200)
table.addImage(4, 1, "collections/images/Arm/О_(23).png", 150)
getImage - получение картинки из общей коллекции
  • table.getImage(String url) → PluginImage - получение картинки в формате png или jpg (jpeg); svg и webp не читаются

Для работы с картинками доступны вспомогательные методы:

  • img.crop(int x, int y, int width, int height) → PluginImage - вырезать область: левый верхний угол (x, y), ширина и высота в пикселях
  • Images.joinHorizontal(PluginImage... images) → PluginImage - склеивание картинок по горизонтали
  • Images.joinVertical(PluginImage... images) → PluginImage - склеивание картинок по вертикали

Пример использования:

def img1 = table.getImage("collections/images/Arm/IFC_Арматура_Кольцо_ГОСТ_5781-82.png")
def img2 = table.getImage("collections/images/Arm/О_(23).png")
def img3 = Images.joinHorizontal(img1, img2.crop(10, 10, 400, 200))
def img4 = Images.joinVertical(img1, img2.crop(10, 10, 400, 200))
addSheet - создание дополнительного листа таблицы
  • table.addSheet(String sheetName) - созданный новый лист становится активным

Пример использования:

table.addSheet("Лист2")
table.addHeaderRow("Описание", "Показать")
Заголовки, строки, стили и сортировка принадлежат активному листу: после table.addSheet(...) нумерация строк снова начинается с 1 и нужен свой addHeaderRow. Первым пользователю показывается лист с ID 0 («Лист1»).
renameCurrentSheet - редактирование названия текущего / активного листа
  • table.renameCurrentSheet(String newSheetName) - редактирование названия текущего / активного листа

Пример использования:

table.renameCurrentSheet("Лист3")
renameSheet - редактирование названия листа
  • table.renameSheet(int id, String newSheetName) - редактирование названия листа, ID листа - это его порядковый номер, отсчет начинается с нуля
  • table.renameSheet(String oldSheetName, String newSheetName) - редактирование названия листа

Пример использования:

table.renameSheet(0, "Лист2")
table.renameSheet("Лист2", "Лист3")
setCurrentSheet - установка активного листа таблицы
  • table.setCurrentSheet(String sheetName) - установка активного листа таблицы
  • table.setCurrentSheet(int id) - ID листа - это его порядковый номер, отсчет начинается с нуля

Пример использования:

table.setCurrentSheet("Лист2")
table.setCurrentSheet(1)
addTableParams - добавление дополнительных параметров таблицы, например дерева слоев для переключения отображения моделей в аналитической таблице
  • table.addTableParams(String key, Object object) - в отчетах используется ключ "layers": список [name: …, enabled: …, uuids: [...]] для переключателя слоев над таблицей

Пример использования:

def arUuids = bim.getElements(bim.createCondition("model", "eq", "АР")).collect { it.uuid.toString() }
def krUuids = bim.getElements(bim.createCondition("model", "eq", "КР")).collect { it.uuid.toString() }
def layers = [
    [name: "АР", enabled: true, uuids: arUuids],
    [name: "КР", enabled: false, uuids: krUuids]
]
table.addTableParams("layers", layers)
autoSizeColumns - задать автоматический размер столбцов в аналитическом отчете
  • table.autoSizeColumns()

Пример использования:

table.autoSizeColumns()
setSizeColumns - устанавливает ширину для ячеек заданной колонки в аналитическом отчете
  • table.setSizeColumns(int indexColumn, int indexRow, String url, int width) - аргументы indexRow и url не используются; width — в единицах 1/256 ширины символа

Пример использования:

table.setSizeColumns(2, 0, "", 30 * 256)
setSizeAndWrapColumns - устанавливает ширину и перенос текста для ячеек заданной колонки в аналитическом отчете
  • table.setSizeAndWrapColumns(int indexColumn, int width) - width — в единицах 1/256 ширины символа

Пример использования:

table.setSizeAndWrapColumns(2, 40 * 256)
Методы autoSizeColumns, setSizeColumns и setSizeAndWrapColumns применяются к служебной книге Excel, которая при формировании файла экспорта пересоздается; на экранную таблицу они не влияют. В текущей реализации их вызов не меняет результат: ширина столбцов в файле экспорта подбирается автоматически.

Общий пример использования

def start() {
    table.renameCurrentSheet("Стены по этажам")
    table.addHeaderRow("Этаж", "Кол-во", "Объём", "Показать")

    def walls = bim.getGeometryElements(bim.createCondition("class", "cont", "IfcWall"))
    def storeyToFloor = [:]
    bim.getFloors().each { f -> f.elements?.each { storeyToFloor[it] = f } }
    def byFloor = walls.groupBy { w -> storeyToFloor[w.buildingStorey]?.name ?: "Без этажа" }

    int row = 0
    byFloor.each { floorName, items ->
        row++
        table.addRow(floorName, items.size(), calc.trunc(items.sum { it.volume } ?: 0d, 2), "")
        table.addButton(4, row, "Показать", "SHOW_ELEMENTS", items.collect { it.uuid.toString() })
    }
    table.setFontBold(1, 0)                 // столбец 1, все строки
    table.setCellAlignment("right", 3, 0)   // столбец 3, все строки
    table.setPageSize(50)
}
Copyright © 2026