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("").
- 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доступен в плагине без импорта
- table.addRow(Object... inp) - создает строку с выбранными данными в конце таблицы. Строку короче заголовков писать можно — недостающие ячейки будут пустыми
Пример использования:
table.addRow("Строка 1", "Строка 2", "Строка 3")
table.addRow() без данных не оставляйте — формирование результата завершится ошибкой. Список нужно разворачивать: table.addRow(list as Object[]), иначе весь список попадет в одну ячейку.- table.insertRow(int indexRow, Object... inp) - записывает строку с номером
indexRow. Если строка уже есть, она перезаписывается — сдвига строк нет
Пример использования:
table.insertRow(2, "Новая строка 2", "Значение")
- table.replaceRow(int indexRow, Object... inp) - заменяет все содержимое строки
indexRowновыми данными
Пример использования:
table.replaceRow(1, "Строка 1", "Новое значение")
- 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, новая строка
- 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.
- 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", "Название задачи")
- table.setPageSize(int pageSize) - устанавливает количество отображаемых строк на странице (по умолчанию 10); действует на всю таблицу
Пример использования:
table.setPageSize(10)
- table.setPage(int page) - устанавливает текущую страницу (нумерация начинается с 1, по умолчанию 1)
Пример использования:
table.setPage(1)
- table.sortASC(int indexColumn) - сортировка активного листа при выдаче результата
Пример использования:
table.sortASC(2)
- table.sortDESC(int indexColumn) - сортировка активного листа при выдаче результата
Пример использования:
table.sortDESC(2)
"100" < "20"), а номер столбца отсчитывается по видимым на экране столбцам. Для чисел и надежного порядка отсортируйте данные в Groovy до addRow и sortASC/sortDESC не вызывайте. Кнопки перемещаются вместе со строкой.- 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())
- table.setFontBold(int colIndex, int rowIndex) - при указании номера столбца и/или строки 0 стиль применяется ко всем столбцам/строкам
Пример использования:
//Применить на всю таблицу
table.setFontBold(0, 0)
//Применить на конкретную строку
table.setFontBold(0, 2)
//Применить на конкретный столбец
table.setFontBold(4, 0)
//Применить на конкретную ячейку
table.setFontBold(4, 2)
- table.setFontItalic(int colIndex, int rowIndex) - при указании номера столбца и/или строки 0 стиль применяется ко всем столбцам/строкам
Пример использования:
//Применить на всю таблицу
table.setFontItalic(0, 0)
//Применить на конкретную строку
table.setFontItalic(0, 2)
//Применить на конкретный столбец
table.setFontItalic(4, 0)
//Применить на конкретную ячейку
table.setFontItalic(4, 2)
- 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)
- 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)
- table.setColumnVisible(int indexColumn, String visibility) -
visibility:"TABLE"(только на экране),"EXPORT"(только в файле экспорта) или"BOTH". Вызывать после addHeaderRow
Пример использования:
table.setColumnVisible(1, "TABLE")
table.setColumnVisible(2, "TABLE")
table.setColumnVisible(3, "EXPORT")
- 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)
- 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))
- table.addSheet(String sheetName) - созданный новый лист становится активным
Пример использования:
table.addSheet("Лист2")
table.addHeaderRow("Описание", "Показать")
table.addSheet(...) нумерация строк снова начинается с 1 и нужен свой addHeaderRow. Первым пользователю показывается лист с ID 0 («Лист1»).- table.renameCurrentSheet(String newSheetName) - редактирование названия текущего / активного листа
Пример использования:
table.renameCurrentSheet("Лист3")
- table.renameSheet(int id, String newSheetName) - редактирование названия листа, ID листа - это его порядковый номер, отсчет начинается с нуля
- table.renameSheet(String oldSheetName, String newSheetName) - редактирование названия листа
Пример использования:
table.renameSheet(0, "Лист2")
table.renameSheet("Лист2", "Лист3")
- table.setCurrentSheet(String sheetName) - установка активного листа таблицы
- table.setCurrentSheet(int id) - ID листа - это его порядковый номер, отсчет начинается с нуля
Пример использования:
table.setCurrentSheet("Лист2")
table.setCurrentSheet(1)
- 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)
- table.autoSizeColumns()
Пример использования:
table.autoSizeColumns()
- table.setSizeColumns(int indexColumn, int indexRow, String url, int width) - аргументы
indexRowиurlне используются;width— в единицах 1/256 ширины символа
Пример использования:
table.setSizeColumns(2, 0, "", 30 * 256)
- 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)
}

