Renga STDL: краткий обзор языка для расширения функциональности программы Renga
Renga — программа для проектирования зданий, с помощью которой можно создать трёхмерную модель, включающую инженерные конструкции, коммуникации и всю информацию о них. Затем из этой модели можно получить чертежи и спецификации. Renga работает под Windows и написана на C++.
В первых версиях приложения мы разрабатывали инструменты для архитектурно-строительного проектирования, у каждого из которых есть свои параметры, особенности, правила построения геометрии, отношения, но число их относительно невелико.
Когда пришло время развития функциональности для проектирования внутренних инженерных сетей стало понятно, что нужно бесконечно увеличивать число по сути однотипных, но в то же время совершенно разных по форме объектов. Если вы когда-нибудь попадали в отдел инженерной сантехники в строительном магазине, то представляете о чём речь.
А теперь представьте, что для каждого типа фитинга нужно создать параметризованную модель на C++...
В общем, мы стали искать способы, как развивать программу и наращивать функциональность, не утонув в бесконечной номенклатуре оборудования.
На помощь пришли скрипты. С их помощью можно:
Отделить код на C++ от шаблонов стилей объектов, которые используются для создания объектов.
Не тратить время на компиляцию при создании нового шаблона стиля (о компиляции Renga читайте здесь).
Отдать написание шаблонов стилей аналитикам, которые по собственному ТЗ могут написать скрипт.
Развивая внутреннюю функциональность для написания скриптов, мы пришли к тому, что ее нужно сделать общедоступной.
В итоге, мы выпустили язык описания шаблонов стилей Renga STDL, с помощью которого любой человек, знакомый с основами программирования и геометрии, может написать свой шаблон стиля.
Renga STDL - это предметно-ориентированный язык на основе Lua. Он предоставляет средства для создания шаблонов стиля, используя встроенные возможности Lua 5.4.6, а также формат JSON для определения набора параметров стиля объекта. STDL также предоставляет набор функций Style Template API для взаимодействия с Renga.
Теперь, чтобы добавить в Renga новую категорию инженерного оборудования, нужно:
описать параметры объекта и порты подключения к инженерной системе в JSON-файле;
{
"metadata":{
"defaultName": "Block",
"description": "Просто прямоугольный параллелепипед с портом",
"version": "1.0.0",
"author": "Renga Software"
},
"styleParameters":[
{
"name": "Dimensions",
"text": "Габаритные размеры",
"params": [
{
"name": "Width",
"text": "Ширина",
"type": "Length",
"default": 600
},
{
"name": "Depth",
"text": "Глубина",
"type": "Length",
"default": 600
},
{
"name": "Height",
"text": "Высота",
"type": "Length",
"default": 850
}
]
}
],
"ports": [
{
"name": "Gas",
"text": "Газ",
"flowDirection": "Inlet",
"systemCategories": [
"Gas"
]
}
]
}
описать геометрию объекта в Lua-скрипте с использованием функций двумерного и трёхмерного моделирования Style Template API и передать её стилю, например создание прямоугольного параллелепипеда и передача его стилю:
local parameters = Style.GetParameterValues()
local width = parameters.Dimensions.Width
local depth = parameters.Dimensions.Depth
local height = parameters.Dimensions.Height
function MakeBody()
return CreateBlock(width, depth, height):Shift(0, 0, - height / 2)
end
local solid = MakeBody()
solid:Shift(0, 0, height / 2)
Style.SetDetailedGeometry(ModelGeometry():AddSolid(solid))
с помощью специального сборщика за несколько секунд собрать файл шаблона стиля в формате RST;
импортировать категорию в Renga Professional.
Несмотря на то, что скриптовых языков много, выбор достаточно быстро ограничился двумя вариантами: Python и Lua.
Оценив эти факторы мы выбрали Lua. Скорее всего, если пользователи уже владеют Python, то освоение Lua не займёт много времени. А задач, в которых пришлось бы применять множество библиотек Python, мы не смогли найти.
Выполнение скрипта происходит в момент:
вычисления геометрии объекта для его отображения;
получения положения портов подключения оборудования к инженерным системам;
получения расчётных характеристик, таких как габаритные размеры.
Функции Lua вызывают соответствующие функции C3D Modeler для выполнения геометрических операций и функции ядра самой Renga для передачи результатов выполнения скрипта в бизнес-логику Renga. Дополнительную информацию об этом можно найти в докладе, представленном на конференции C3Days 2021, который был подготовлен в начале подготовки скриптов к передаче пользователям.
Утилита RstBuilder, предназначенная для сбора шаблона стиля из набора файлов, при запуске проверяет корректность синтаксиса скрипта и структуры описания параметров и портов в формате JSON.
После импорта категории в проект, ошибки времени выполнения, если они есть, записываются в лог приложения. Объекты, в процессе построения которых произошла ошибка времени выполнения, отображаются в приложении желтым треугольником, так же как другие объекты приложения, для которых невозможно построить геометрическое представление.
В результате для рядового пользователя Renga работа с объектами, полученными с помощью скриптов, внешне не отличается от работы с остальными объектами.
Продвинутые пользователи или, скорее, инженеры по внедрению, могут использовать в работе не только те категории объектов инженерных систем, которые идут в поставке, но и с помощью Renga STDL создавать уникальные.
В Renga есть и другие стили, создание шаблонов которых будет в будущем переведено на написание с помощью Renga STDL, в частности стили армирования. Для этого Style Template API будет расширяться.
Текущую версию Renga STDL можно скачать и опробовать уже сейчас, скачав Renga Professional, Renga STDL SDK и ознакомившись с документацией.
На этом заканчиваем обзор. Если вам интересны подробности выбора языка или реализации, пишите в комментариях.