Схема создание стилей Renga
Предположим, что нам в проект необходимо поместить какой-то новый объект. Для этого нужно:
1) Создать шаблон категории Renga, описывающий геометрию объекта и его параметры. Это делается вне Renga с помощью программирования.
2) Загрузить шаблон в Renga, чтобы создать категорию для того инструмента, который хотите использовать. Один и тот же шаблон можно использовать для создания категорий для разных инструментов.
3) В Renga на основе этой категории создать для выбранного инструмента новый стиль, задав значения параметрам, заложенным в шаблоне.
Самый сложный — первый этап.
В Renga есть три уровня отображения объекта детальный, условный и символьный, т.е. один и тот же объект в проекте можно отображать по-разному. (Исключение для дверей, для них пять уровней отображения, но их геометрия создается непосредственно в диалоговом окне «Стили двери» Renga и не требует создания категорий).
Каждый уровень детализации может быть наполнен различными геометрическими примитивами. Для детального уровня детализации это могут быть: твёрдотельная 3D-геометрия (тела) и двумерная геометрия. Для условного и символьного уровня детализации это может быть только двумерная геометрия.
Один стиль объекта может содержать сразу три уровня детализации, в этом случае в шаблоне категории, на основе которой он создается, необходимо задать три разных набора геомерических примитивов. Например, для детального уровня будем отображать сферу, для символьного — заштрихованный круг, а для условного — окружность.
Сколько уровней и какие нужно задавать для объекта, созданного конкретным инструментом, можно выяснить в Renga в диалоговом окне «Стили отображения» (Открывается через падающее меню «Управление стилями» —> «Офоормление» —> «Стили отображения»).
Что необходимо подготовить для создания шаблонов категорий Renga
Для создания шаблона категории Renga нужно сначала подготовить программное обеспечение. Кроме VS Code, в котором установлены расширения Code Runner и Russian Language Pack for Visual Studio Code, нам понадобится файл RstBuilder.exe, который поставляется в составе Renga STDL, и инструкцию для сборки файла шаблона категории, которая помещается в файл tasks.json.
В рабочей папке нужно создать служебную папку с названием “.vscode”, а в ней файл tasks.json. Файл RstBuilder.exe из комплекта Renga STDL можно поместить в любую папку, указав затем путь к нему в файле tasks.json. Например, поместим его на диск D в папку RstBuilder.
В рабочей папке нужно создать служебную папку с названием “.vscode”, а в ней файл tasks.json.
Файл RstBuilder.exe можно поместить в любую папку, указав затем путь к нему в файле tasks.json. Например, поместим его на диск D в папку RstBuilder.
Открываем файл tasks.json и набираем команду make. После набора первых двух букв этой команды нужное нам содержимое всплывает в подсказке, на которой нужно щелкнуть мышью.

Содержимое файла tasks.json автоматически станет:
{
"version": "2.0.0",
"tasks": [
{
"label": "My Task",
"command": "echo hello",
"type": "shell",
"args": [ ],
"problemMatcher": ["$tsc"],
"presentation": {"reveal": "always"},
"group": "build"
}
]
}
Файл нужно отредактировать, поместив вместо "echo hello" путь к файлу RstBuilder.exe. Например, если этот файл находится на диске D в папке RstBuilder, то нужно задать “command” : "D:\\RstBuilder\\RstBuilder.exe"
Для создания шаблона категории Renga нужно записать 2 файла один с расширением json будет содержать параметры разрабатываемой категории, а второй — с расширением lua – текст скрипта. Результатом работы должен стать файл с расширением rst, который будет использоваться в программе Renga.
Внутрь квадратных скобок “arg”:[ ] в файле tasks.json нужно задать пути к обрабатываемым файлам формата json и lua и файлу формата rst, в который записывается результат, поместив между ними ключ «-o». Например, если файлы называются test.json, test.lua и test.rst, то следует написать
"test.json",
"test.lua",
"-s",
"1",
"-o",
"test.rst"
Окончательно файл tasks.json должен выглядеть следующим образом:
{
"version": "2.0.0",
"tasks": [
{
"label": "My Task",
"type": "shell",
"command": "D:\\RstBuilder\\RstBuilder.exe",
"args": [
"test.json",
"test.lua",
"-o",
"test.rst"
],
"problemMatcher": "$tsc",
"presentation": {"reveal": "always"},
"group": "build"
}
]
}
При создании разных шаблонов категорий Renga в файле tasks.json необходимо менять имена файлов test.json, test.lua, test.rst. Остальные параметры можно не трогать.
Метка «My Task» используется в интерфейсе программы VS Code при выборе задачи и может быть заменена на любой другой текст.
Параметр "type" может иметь значения "shell" и "process", которые определяют как выполняется задача, на результат, который нужен нам, это не влияет.
Параметр "problemMatcher" используется для задания сопоставителей проблем — специальных приложений, которые будут реагировать на ошибки, его можно вообще удалить.
Если в параметре "presentation" мы зададим "reveal": "always", то когда мы произведем сборку - создании файла шаблона формата rst, информация о результате работы программы всегда выводится на терминал, а если зададим "reveal": "silent", то информация выводится на терминал только в случае ошибки.
Значение "build" параметра "group" отмечает задачу, как задачу сборки, запускаемую комбинацией клавиш <Shift>+<CTRL>+<B>.
Пример создания шаблона категории Renga
Начнём создание шаблонов категорий с примера, в котором только один параметр r. В случае детального уровня детализации будем отображать окружность, радиус которой задаётся параметром r, и сферу, радиус которой в 2 раза меньше r. В случае условного уровня детализации будем отображаться круг, радиус которого равен r, а в случае символьного уровня — только окружность радиуса 10 мм.
В файле управления сборкой tasks.json заменим имена файлов test.json, test.lua, test.rst на 1.json, 1.lua, 1.rst
Сохраним его в файл параметров 1.json следующий текст:
{
"metadata": {
"defaultName": "Имя категории Renga по умолчанию",
"description": "Описание",
"version": "1.0.0",
"author": "Автор "
},
"styleParameters": [
{
"name": "Dimensions",
"text": "Радиус",
"params": [
{
"name": "Rr",
"text": "Радиус",
"type": "Length",
"default": 200,
"min": 100,
"max": 5000
}
]
}
],
"ports": [ ]
}
В группу метаданных ("metadata") помещается информация, которая будет отображаться для создаваемой категории в Renga в диалоговом окне «Категории".
В группу параметров стиля ("styleParameters") помещаются параметры, задающие геометрию создаваемого объекта.
В группу параметров портов ("ports") помещаются параметры, определяющие тип и положение порта, с помощью которого объект стиля, создаваемого на основе данной категории, можно подключить к какой-то системе. Например, объект — оборудование стиля «Стиральная машина» можно подключить через разные порты к системам «Бытовое холодное водоснабжение», «Бытовое горячее водоснабжение», «Бытовая канализация», «Производственная канализация». Мы порты задавать не будем.
Рассмотрим группу параметров стиля ("styleParameters") подробнее, она для нас наиболее интересна.
В нашем примере есть только одна подгруппа параметров, которую мы обозначили Dimensions, и только один параметр в ней, обозначенный Rr.
В других примерах подгрупп и параметров в них может быть много.
Имя подгруппы и параметра задаётся в кавычках после атрибута "name" , состоит из латинских букв (не менее двух) и отделяется двоеточием. После "text" задаётся отделяеиый двоеточием текст, который выводится в Renga в диалоговом окне стиля, создаваемого на основе данного шаблона категории, в качестве имен параметров и их групп. Этот текст можно писать и по-русски.
Атрибуты параметра заключаются в фигурные скобки. После атрибута "type" нужно задать тип параметра ("Length" - длина, "Angle" - угол, "Boolean" - да/нет, "Real" - вещественное число, "Integer" - целое число, "String" - строка, "ID" - для задания материала, "UserEnum" - пользовательский список, "CoreEnum" — список типа подключения оборудования). Атрибуты "default", "min","max": используются для задания параметру, к которому они относятся, значения по умолчанию и допустимых пределов изменения значений этого параметра. Атрибуты "name", "text", "type" и "default" есть у параметров всегда, а "min","max" могут быть заменены на другие, если атрибут "type", например, имеет значение «UserEnum».
Подробнее об атрибутах параметров можно посмотреть по ссылке Сoздание параметров - Руководство Renga Style Template Scripting 1.1
В файле скрипта необходимо:
1) передать значения параметров из файла параметров;
2) создать необходимые плоские кривые и объёмные тела;
3) создать необходимые наборы плоских кривых;
4) поместить плоские кривые в нужные наборы;
5) создать элементы из класса геометрических объектов ModelGeometry, каждый из которых
будет связан с одним из уровней детализации стиля;
6) поместить в объекты ModelGeometry созданные ранее объёмные тела и наборы плоских кривых;
7) вызвать функции из таблицы Style, задающие какой элемент класса ModelGeometry соответствует какому уровню детализации.
Текст скрипта ниже поделен на блоки, каждый из которых соответствуют каждому пункту в списке необходимых действий. Этот текст нужно сохранить в файл 1.lua.
parameters = Style.GetParameterValues() -- получаем значения всех параметров
dimensions = parameters.Dimensions -- выделяем значения группа параметров с именем Dimensions
r=dimensions.Rr -- задаем r значение параметра Rr
okr1= CreateCircle2D(Point2D(0,0),r) -- создаем окружность радиуса r
rs=r/2
s=CreateSphere (rs) -- создаем сферу радиуса r/2
kr=FillArea(okr1) -- создаем круг
okr2= CreateCircle2D(Point2D(0,0),10) -- создаем окружность радиуса 10 мм
g1=GeometrySet2D () -- создаем набор плоских кривых, в который поместим окружность радиуса r
g2=GeometrySet2D () -- создаем набор плоских кривых, в который поместим круг
g3=GeometrySet2D () -- создаем набор плоских кривых, в который поместим окружность радиуса 10 мм
g1:AddCurve(okr1) -- помещаем окружность okr1 в набор g1
g2:AddLineColorSolidArea(kr) -- помещаем круг kr в набор g2
g3:AddCurve(okr2) -- помещаем окружность okr2 в набор g3
--[[ создаем три элемента из класса геометрических объектов, который
может быть ассоциирован с каким-то уровнем детализации стиля ]]
m1=ModelGeometry() -- для детального уровня детализации стиля
m2=ModelGeometry() -- для условного уровня детализации стиля
m3= ModelGeometry() -- для символьного уровня детализации стиля
m1:AddGeometrySet2D(g1) -- помещаем набор g1 в m1
m1:AddSolid(s) -- помещаем сферу s в m1
m2:AddGeometrySet2D(g2)
m3:AddGeometrySet2D(g3)
Style.SetDetailedGeometry(m1) -- для детального уровня задёем m1
Style.SetSymbolicGeometry(m2) -- для условного уровня задаём m2
Style.SetSymbolGeometry(m3) -- для символьного уровня задаём m3
Для разных уровней детализации нужно создавать разные объекты класса ModelGeometry для каждого уровня детализации — свой, мы в примере обозначили их m1, m2, m3. Возможно, что в шаблоне категории заданы не все три уровня детализации, тогда при выборе в Renga уровня детализации, который не был задан для стиля, созданного на основе такой категории, этот стиль не будет отображаться в Renga.
Объемные тела помещаются с такой объект с помощью метода AddSolid, а плоские кривые нужно предварительно помещать в их объект GeometrySet2D () - набор плоских кривых и только его помещать в объект класса ModelGeometry.
Для осуществления сборки нужно нажать одновременно комбинация клавиш <Shift>+<Ctrl>+<B>. В результате программа должна создать файл 1.rst, в котором будем содержаться шаблон категории Renga.
Используем файл 1.rst для создания категории.
Запустим программу Renga и откроем или создадим новый проект. В падающем меню «Управление стилями» выберем пункт «Категории». В открывшемся меню «Катагории» из падающего списка выберем для какого типа оборудования будет создаваться категория (Один шаблон категории можно использовать для создания категорий разных типов оборудования.). Нажмём кнопку «Импортировать категорию» и с помощью проводника найдём файл 1.rst, произведём на этом файле двойной щелчок левой кнопкой мыши или, выделив его, нажмём кнопку «Открыть». В списке категорий появится название категории, которое мы задали для атрибута "defaultName" в файле параметров 1.json. Теперь можно вызвать диалоговое окно стилей для инструмента, соответствующего типу оборудования, для которого мы создали категорию, и с помощью этой категории создать новый стиль (Диалоговые окна стилей вызываются из подпунктов «Трубопроводные системы», «Воздуховодные системы», «Электрические системы» падающего меню «Управление стилями».).
Сделаем теперь, чтобы можно было изменять радиус окружности okr2 из набора gokr2 для детального уровня независимо от радиуса другой окружности и сферы. Для этого добавим параметр в файл параметров параметр Rr2, атрибуты которого заключаются в фигурные скобки и отделяются от атрибутов параметра Rr запятой.
{
"name": "Rr",
. . .
},
{
"name": "Rr2",
"text": "Радиус окружности",
"type": "Length",
"default": 300,
"min": 200,
"max": 5000
}
Теперь файл параметров выглядит так:
{
"metadata": {
"defaultName": "Имя категории Renga по умолчанию",
"description": "Описание",
"version": "1.0.0",
"author": "Автор "
},br>
"styleParameters": [
{
"name": "Dimensions",
"text": "Радиус",
"params": [
{
"name": "Rr",
"text": "Радиус",
"type": "Length",
"default": 200,
"min": 100,
"max": 5000
},
{
"name": "Rr2",
"text": "Радиус окружности",
"type": "Length",
"default": 300,
"min": 200,
"max": 5000
}
]
}
],
"ports": [ ]
}
Файл скрипта тоже нужно изменить, заменив строку rs=r/2 на строку rs=dimensions.Rr2, которая делает радиус сферы rs равным значению, заданному по умолчанию для параметра Rr2 в файле параметров.