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 и ознакомившись с документацией.
На этом заканчиваем обзор. Если вам интересны подробности выбора языка или реализации, пишите в комментариях.
Комментарии (4)
AlexKOrso
04.10.2023 09:33А почему нельзя было просто в сборках создавать нужное оборудование, ввести в сборку точки трассировки и все. При появлении этой сборки в трассировке Ренга бы ее уже рассматривала, как часть системы и она везде бы появляясь (чертежи, спецификации и т.д). Зачем из проектировщика делать программиста?
Rengabim Автор
04.10.2023 09:33+1Давайте начнем с конца. Делать из проектировщика программиста цели нет. Этот инструмент рассчитан на тех, кто уже умеет программировать, внедренцев, автоматизаторов.
Сборка — это сборочная единица, она не подразумевает параметризации, в ней нет условного обозначения, получить там сложное тело сложнее, чем скриптом.
Если же разрабатывать специальный моделлер с возможностью параметризации и назначения портов, то, во-первых, за возможную лёгкость вхождения теряется гибкость, во-вторых, вопрос, кто будет делать новые категории объектов, остаётся, а в-третьих, стоимость и время разработки увеличиваются, что в итоге негативно сказывается на конечном пользователе, так как он не получает нужные ему объекты.
White_wh
Небольшой вопрос.
В чем смысл ограничивать в приложении для разработчиков доступ из под скриптового языка к OS? Требования ФСБ, личные соображения по безопасности?
Просто огромное количество софта прекрасно живет с питоном на борту, и возможность использовать доступ к ос наоборот является плюсом (ты и кастомный экспорт написать можешь, и данные выплевывать в сторонние обработчики, например плюсовые приложения)
На память (лет пять назад последний раз ковырял), Dynamo в Revit имело встроенный питон, что позволяло делать весьма веселые кульбиты
Rengabim Автор
Есть плагины — там у разработчика есть права равные правам запущенного приложения. Приведенные вами примеры касаются функциональности плагинов.
Здесь же скрипт с поведением нужно воспринимать как часть переносимого контента проекта, поэтому нет и не должно быть задач "обратиться к ОС". Поведение скрипта должно быть полностью детерминировано тем проектом, в рамках которого он выполняется, тогда на другой машине этот скрипт будет давать такой же результат.
Т.е. первое — не должно быть возможности выйти из "песочницы" проекта.
Второе — отдельный вопрос про безопасность с точки зрения какого-то вреда пользователю, когда, открыв скачанный проект, вы можете получить очищенный диск C. Все-таки при запуске скачанного из сети исполняемого файла (плагина) для человека более явно, что, запуская его, можно получить неприятные последствия.