form
Это интерфейс построения формы параметров плагина. Форма описывается в методе def form(): перед запуском система вызывает его и показывает форму пользователю, а введенные значения передаются в params под ключом, равным первому аргументу метода (modelValue). Тот же набор методов есть у интерфейса widget в плагинах типа «Виджет».
В нем доступны следующие функции:
- addCheckbox - добавление "флажка" на форму
- addChoiceAttribute - добавление выбора атрибута на форму
- addChoiceClassificationNode - добавление выбора классификатора на форму
- addChoiceCondition - добавление condition на форму
- addChoiceFloor - добавление выбора этажа на форму
- addChoiceIfcClass - добавление выбора IFC-типа на форму
- addChoiceMaterial - добавление выбора материала на форму
- addChoiceModel - добавление выбора модели на форму
- addChoiceRevision - добавление выбора ревизии на форму
- addChoiceSystem - добавление выбора системы на форму
- addCombobox - добавление выпадающего списка на форму
- addDate - добавление выбора даты на форму
- addFile - добавление поля загрузки файла на форму
- addImage - добавление изображения на форму
- addInput - добавление поля ввода на форму
- addModelRevisionSelection - добавление поля выбора ревизии для каждой отдельной модели
- addRadio - добавление радиокнопки на форму
- addSelect - добавление выпадающего списка на форму
- addSelectAttribute - добавление выбора атрибута на форму
- addSelectClassificationNode - добавление выбора классификатора на форму
- addSelectCondition - добавление condition на форму
- addSelectFloor - добавление выбора этажа на форму
- addSelectIfcClass - добавление выбора IFC-типа на форму
- addSelectMaterial - добавление выбора материала на форму
- addSelectModel - добавление выбора модели на форму
- addSelectRevision - добавление выбора ревизии на форму
- addSelectSystem - добавление выбора системы на форму
- addTable - добавление таблицы на форму
- addText - добавление текстовой строки на форму
- addTextarea - добавление поля ввода текста на форму
- addTreeview - добавление дерева на форму
- Методы элементов формы (PluginTag) - добавление пунктов списка, свойств и действий к элементу формы
Общий пример:
def form() {
form.addText("Параметры отчёта")
form.addSelectModel("models")
form.addSelectIfcClass("ifcClass")
form.addInput("minHeight", [value: "1500"])
form.addSelect("format", [label: "Формат", value: "XLSX", items: [XLSX: "Excel", DOCX: "Word"]])
form.addCheckbox("onlyLoadBearing", [label: "Только несущие"])
}
def start() {
String ifcClass = params.get("ifcClass") ?: "IfcWall"
double minHeight = ((params.get("minHeight") ?: "0") as String).replace(",", ".") as double
boolean onlyLoadBearing = params.get("onlyLoadBearing") ? true : false
List modelNames = bim.parseOptionValueToList((params.get("models") ?: "").toString())
// ...
}
- Каждый метод имеет формы
add*(String modelValue)иadd*(String modelValue, Map attributes)и возвращает элемент формыPluginTag(уaddTable()—PluginTable).modelValue— ключ значения вparams: латиница без пробелов, уникальный в пределах формы. - В атрибутах (
Map) передаются свойства поля, но учитываются они не везде:addSelect,addCombobox,addCheckbox,addDate,addFile,addTreeview— все атрибуты (label,items,styleи т.п.);addInput,addTextarea— только начальное значениеvalue/defaultValue; подписьlabelне выводится, используйтеform.addText(...)перед полем;addRadio— толькоitems;addSelectCondition,addSelectClassificationNode,addSelectAttribute,addSelectIfcClass,addSelectRevision— толькоvalue/defaultValue;addSelectModel,addSelectFloor,addSelectSystem,addSelectMaterial— атрибуты не используются.
- Пары методов
addSelectX/addChoiceX— синонимы.
- Любое значение в
paramsможет отсутствовать (null) — вstart()всегда задавайте запасное значение:params.get("key") ?: "...". - Внутри
form()доступны толькоform,params,bim,ifcql,bimutils,console. Внутриstart()переменнаяformравнаnull(кроме плагинов типов «Коллизии» и «Виджет»).
- form.addCheckbox(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addCheckbox(String modelValue) →
PluginTag
В params приходит Boolean (по умолчанию false).
Пример использования:
form.addCheckbox("checkBToBottom", [label: "Проверять до низа"])
// флажок в ячейке таблицы-вёрстки (см. addTable)
def t = form.addTable()
def row1 = t.addRow()
row1.addCell().addText("Проверять до низа")
row1.addCell().addCheckbox("checkBToBottom")
- form.addChoiceAttribute(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addChoiceAttribute(String modelValue) →
PluginTag
Синоним addSelectAttribute. В params приходит путь к атрибуту вида "Набор/Свойство"; начальное значение задается атрибутом value или defaultValue.
Пример использования:
form.addChoiceAttribute("myattr")
- form.addChoiceClassificationNode(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addChoiceClassificationNode(String modelValue) →
PluginTag
Синоним addSelectClassificationNode. В params приходит строка.
Пример использования:
form.addChoiceClassificationNode("clazz")
- form.addChoiceCondition(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addChoiceCondition(String modelValue) →
PluginTag
Синоним addSelectCondition. В params приходит строка условия IFCQL.
Пример использования:
form.addChoiceCondition("mycondition")
- form.addChoiceFloor(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addChoiceFloor(String modelValue) →
PluginTag
Синоним addSelectFloor: мультивыбор, значение приходит строкой вида ["Этаж 1","Этаж 2"].
Пример использования:
form.addChoiceFloor("floor")
- form.addChoiceIfcClass(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addChoiceIfcClass(String modelValue) →
PluginTag
Синоним addSelectIfcClass. В params приходит имя IFC-класса (например, "IfcWall").
Пример использования:
form.addChoiceIfcClass("ifctypename")
- form.addChoiceMaterial(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addChoiceMaterial(String modelValue) →
PluginTag
Синоним addSelectMaterial: мультивыбор, значение приходит строкой со списком.
Пример использования:
form.addChoiceMaterial("material")
- form.addChoiceModel(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addChoiceModel(String modelValue) →
PluginTag
Синоним addSelectModel: мультивыбор, значение приходит строкой вида ["АР","КР"].
Пример использования:
form.addChoiceModel("model3")
- form.addChoiceRevision(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addChoiceRevision(String modelValue) →
PluginTag
Синоним addSelectRevision.
Пример использования:
form.addChoiceRevision("revision1")
- form.addChoiceSystem(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addChoiceSystem(String modelValue) →
PluginTag
Синоним addSelectSystem: мультивыбор, значение приходит строкой со списком.
Пример использования:
form.addChoiceSystem("systems")
- form.addCombobox(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addCombobox(String modelValue) →
PluginTag
Работает так же, как addSelect.
Пример использования:
form.addCombobox("select1", [ items: [ model1: "Объект 1", model2: "Объект 2" ], label: "Объект" ])
- form.addDate(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addDate(String modelValue) →
PluginTag
В params приходит строка с датой — разбирайте ее с проверкой на null.
Пример использования:
def startDate = form.addDate("startDate")
- form.addFile(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addFile(String modelValue) →
PluginTag
Атрибут formats ограничивает допустимые расширения. В params приходит содержимое файла строкой в формате base64 (data-URL).
Пример использования:
form.addFile("xml", ["formats": [".xml"]])
- form.addImage(Map<String, Object> attributes) →
PluginTag- атрибуты передаются тегуimg(src,style,width,altи т.д.) - form.addImage() →
PluginTag- пустая картинка;srcи другие атрибуты можно задать черезaddProperty
В src можно передать:
- путь к картинке из общей коллекции, как в table.addImage, например
"collections/images/Arm/О_(23).png"; адрес сервера подставляется автоматически - абсолютную ссылку
http://...илиhttps://... - картинку строкой в формате base64 (
data:image/png;base64,...)
Поддерживаются форматы png, jpg (jpeg), svg и webp. По умолчанию ширина картинки 100 пикселей, другой размер задается через style.
Пример использования:
// картинка из общей коллекции
form.addImage([src: "collections/images/Arm/О_(23).png", style: "width: 300px;"])
// SVG из общей коллекции
form.addImage([src: "collections/images/Arm/scheme.svg", style: "width: 200px;"])
// внешняя ссылка
form.addImage([src: "https://example.com/scheme.png", style: "width: 300px;"])
// атрибуты через addProperty
form.addImage().addProperty("src", "collections/images/Arm/О_(23).png").addProperty("style", "width: 150px;")
Картинку можно поставить и в ячейку таблицы формы, например, схему рядом с параметром:
def t = form.addTable()
def r = t.addRow()
r.addCell().addImage([src: "collections/images/Arm/О_(23).png", style: "width: 120px;"])
r.addCell().addInput("gap", [value: "50"])
- form.addInput(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addInput(String modelValue) →
PluginTag
В params приходит строка (числа нужно разбирать самостоятельно); начальное значение задается атрибутом value или defaultValue.
Пример использования:
form.addInput("myinput2", [value: "1000"])
// в start()
int limit = ((params.get("myinput2") ?: "1000") as String).trim() as int
- form.addModelRevisionSelection(String modelValue) →
PluginTag
Пример использования:
form.addModelRevisionSelection("modelRevisions")
- form.addRadio(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addRadio(String modelValue) →
PluginTag
Варианты задаются атрибутом items или методами addOption. В params приходит значение выбранного варианта, по умолчанию — первый вариант.
Пример использования:
def group = form.addRadio("fileSource")
group.addOption("model", "Из модели")
group.addOption("file", "Из файла")
- form.addSelect(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addSelect(String modelValue) →
PluginTag
Пункты задаются атрибутом items: картой [значение: "Подпись"] или списком строк (значение совпадает с подписью). В params приходит значение выбранного пункта (String) или null, если ничего не выбрано.
Пример использования:
form.addSelect("select1", [ items: [ model1: "Объект 1", model2: "Объект 2" ], label: "Объект" ])
form.addSelect("select2", [ items: ["Текст 1", "Текст 2"] ])
- form.addSelectAttribute(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addSelectAttribute(String modelValue) →
PluginTag
В params приходит путь к атрибуту вида "Набор/Свойство"; начальное значение задается атрибутом value или defaultValue.
Пример использования:
form.addSelectAttribute("myattr")
// в start()
String attrPath = params.get("myattr") ?: ""
def value = element.getAttribute(attrPath)
- form.addSelectClassificationNode(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addSelectClassificationNode(String modelValue) →
PluginTag
В params приходит строка.
Пример использования:
form.addSelectClassificationNode("clazz")
- form.addSelectCondition(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addSelectCondition(String modelValue) →
PluginTag
В params приходит строка условия IFCQL, которую можно передать в bim.getElements(String); начальное значение задается атрибутом value или defaultValue.
Пример использования:
form.addSelectCondition("mycondition", [defaultValue: 'entity = "IfcDoor"'])
// в start()
def elements = bim.getElements(params.get("mycondition") ?: 'entity = "IfcDoor"')
- form.addSelectFloor(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addSelectFloor(String modelValue) →
PluginTag
Пример использования:
form.addSelectFloor("floor")
// в start()
List floorNames = bim.parseOptionValueToList((params.get("floor") ?: "").toString())
addSelectModel, addSelectFloor, addSelectSystem, addSelectMaterial и их синонимы addChoice*) приходит в paramsстрокой вида ["Этаж 1","Этаж 2"], а не списком. Декодируйте его методом bim.parseOptionValueToList(...). Атрибуты (в том числе label) у этих полей не используются — подпись выводите отдельной строкой form.addText(...).- form.addSelectIfcClass(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addSelectIfcClass(String modelValue) →
PluginTag
В params приходит имя IFC-класса (например, "IfcWall"); начальное значение задается атрибутом value или defaultValue.
Пример использования:
form.addSelectIfcClass("ifctypename")
// в start()
def elements = bim.getElements(bim.createCondition("class", "eq", params.get("ifctypename") ?: "IfcWall"))
- form.addSelectMaterial(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addSelectMaterial(String modelValue) →
PluginTag
Мультивыбор: значение приходит строкой со списком, декодируйте через bim.parseOptionValueToList(...).
Пример использования:
form.addSelectMaterial("material")
- form.addSelectModel(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addSelectModel(String modelValue) →
PluginTag
Мультивыбор: значение приходит строкой вида ["АР","КР"] с названиями моделей, декодируйте через bim.parseOptionValueToList(...).
Пример использования:
form.addText("Модели")
form.addSelectModel("model3")
// в start()
List modelNames = bim.parseOptionValueToList((params.get("model3") ?: "").toString())
- form.addSelectRevision(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addSelectRevision(String modelValue) →
PluginTag
Пример использования:
form.addSelectRevision("revision1")
- form.addSelectSystem(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addSelectSystem(String modelValue) →
PluginTag
Мультивыбор: значение приходит строкой со списком, декодируйте через bim.parseOptionValueToList(...).
Пример использования:
form.addSelectSystem("systems")
- form.addTable() →
PluginTable- таблица для вёрстки формы
Методы таблицы:
- table.addHeader() →
PluginRow- добавить строку заголовка - table.addRow() →
PluginRow- добавить строку - row.addCell() →
PluginCell- добавить ячейку в строку; в ячейку можно добавлять любые поля формы теми же методами (addText,addInput,addCheckbox…)
Пример использования:
def t = form.addTable()
def h = t.addHeader()
h.addCell().addText("Параметр")
h.addCell().addText("Значение")
def r = t.addRow()
r.addCell().addText("Зазор, мм")
r.addCell().addInput("gap", [value: "50"])
- form.addText(String text, Map<String, Object> attributes) →
PluginTag - form.addText(String text) →
PluginTag
Надпись, не поле ввода — значения в params не передает.
Пример использования:
form.addText("Я текст")
form.addText("Заголовок").addProperty("style", "font-weight: bold; font-size: 18px;")
- form.addTextarea(String modelValue, Map<String, Object> attributes) →
PluginTag - form.addTextarea(String modelValue) →
PluginTag
В params приходит строка; начальное значение задается атрибутом value или defaultValue.
Пример использования:
form.addTextarea("comment", [value: "Комментарий к отчёту"])
- form.addTreeview(String modelValue, Map<String, Object> attributes) →
PluginTag
Узлы дерева задаются атрибутом items: список карт [key: …, value: …, children: [...]] (value — подпись узла), выбранные узлы — атрибутом selected. В params приходит карта с полями selected (выбранные узлы), items и active.
Пример использования:
def treeItems = [
[key: "corp1", value: "Корпус 1", children: [
[key: "s1", value: "Секция 1"],
[key: "s2", value: "Секция 2"]
]]
]
form.addTreeview("tree", [items: treeItems, selected: []])
// в start()
def selected = params.get("tree")?.selected ?: []
Методы элементов формы (PluginTag)
Все методы add* возвращают элемент формы PluginTag, у которого есть методы для настройки. Методы возвращают тот же элемент, поэтому их можно вызывать цепочкой.
- tag.addProperty(String key, Object value) →
PluginTag- добавить атрибут элементу - tag.addProperty(Map<String, Object> attributes) →
PluginTag- добавить несколько атрибутов - tag.addOption(String value, String title) / tag.addItem(String value, String title) →
PluginTag- добавить пункт списка со значением и подписью - tag.addOption(String title) / tag.addItem(String title) →
PluginTag- добавить пункт, значение которого совпадает с подписью - tag.addOptions(Map<String, Object> items) / tag.addItems(Map<String, Object> items) →
PluginTag- добавить пункты из карты[значение: "Подпись"] - tag.addOptions(String... items) / tag.addItems(String... items) →
PluginTag- добавить пункты из строк; строка"значение:подпись"делится по: - tag.addAction(String name, Object params) →
PluginTag- добавить действие при изменении значения (используется в виджетах, напримерaddAction("refresh", ""))
Пример использования:
def s3 = form.addSelect("s3")
s3.addOption("opt1", "Вариант 1")
s3.addOption("opt2", "Вариант 2")
form.addSelect("s4").addOptions([a: "A", b: "B"]).addProperty("label", "Селект 4")
form.addInput("n").addProperty("value", "10")
addOption(value, title) / addOptions(Map), хранятся без гарантированного порядка. Если порядок важен — передавайте items литералом в атрибутах ([items: [m1: "Объект 1", m2: "Объект 2"]]) или списком строк. Не смешивайте в одном списке пункты «значение + подпись» и «только подпись».
