Renga — программа для проектирования зданий, с помощью которой можно создать трёхмерную модель, включающую инженерные конструкции, коммуникации и всю информацию о них. Затем из этой модели можно получить чертежи и спецификации. Renga работает под Windows и написана на C++.

В первых версиях приложения мы разрабатывали инструменты для  архитектурно-строительного проектирования, у каждого из которых есть свои параметры, особенности, правила построения геометрии, отношения, но число их относительно невелико.

От Renga Architecture к Renga Professional
От Renga Architecture к Renga Professional

Когда пришло время развития функциональности для проектирования внутренних инженерных сетей стало понятно, что нужно бесконечно увеличивать число по сути однотипных, но в то же время совершенно разных по форме объектов. Если вы когда-нибудь попадали в отдел инженерной сантехники в строительном магазине, то представляете о чём речь. 

Зал магазина инженерной сантехники
Зал магазина инженерной сантехники

А теперь представьте, что для каждого типа фитинга нужно создать параметризованную модель на 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 и ознакомившись с документацией.

Документация Renga STDL
Документация Renga STDL

На этом заканчиваем обзор. Если вам интересны подробности выбора языка или реализации, пишите в комментариях.

Комментарии (4)


  1. White_wh
    04.10.2023 09:33

    Небольшой вопрос.
    В чем смысл ограничивать в приложении для разработчиков доступ из под скриптового языка к OS? Требования ФСБ, личные соображения по безопасности?

    Просто огромное количество софта прекрасно живет с питоном на борту, и возможность использовать доступ к ос наоборот является плюсом (ты и кастомный экспорт написать можешь, и данные выплевывать в сторонние обработчики, например плюсовые приложения)

    На память (лет пять назад последний раз ковырял), Dynamo в Revit имело встроенный питон, что позволяло делать весьма веселые кульбиты


    1. Rengabim Автор
      04.10.2023 09:33
      +2

      Есть плагины — там у разработчика есть права равные правам запущенного приложения. Приведенные вами примеры касаются функциональности плагинов.

      Здесь же скрипт с поведением нужно воспринимать как часть переносимого контента проекта, поэтому нет и не должно быть задач "обратиться к ОС". Поведение скрипта должно быть полностью детерминировано тем проектом, в рамках которого он выполняется, тогда на другой машине этот скрипт будет давать такой же результат.

      Т.е. первое — не должно быть возможности выйти из "песочницы" проекта.

      Второе — отдельный вопрос про безопасность с точки зрения какого-то вреда пользователю, когда, открыв скачанный проект, вы можете получить очищенный диск C. Все-таки при запуске скачанного из сети исполняемого файла (плагина) для человека более явно, что, запуская его, можно получить неприятные последствия.


  1. AlexKOrso
    04.10.2023 09:33

    А почему нельзя было просто в сборках создавать нужное оборудование, ввести в сборку точки трассировки и все. При появлении этой сборки в трассировке Ренга бы ее уже рассматривала, как часть системы и она везде бы появляясь (чертежи, спецификации и т.д). Зачем из проектировщика делать программиста?


    1. Rengabim Автор
      04.10.2023 09:33
      +1

      Давайте начнем с конца. Делать из проектировщика программиста цели нет. Этот инструмент рассчитан на тех, кто уже умеет программировать, внедренцев, автоматизаторов.

      Сборка — это сборочная единица, она не подразумевает параметризации, в ней нет условного обозначения, получить там сложное тело сложнее, чем скриптом.

      Если же разрабатывать специальный моделлер с возможностью параметризации и назначения портов, то, во-первых, за возможную лёгкость вхождения теряется гибкость, во-вторых, вопрос, кто будет делать новые категории объектов, остаётся, а в-третьих, стоимость и время разработки увеличиваются, что в итоге негативно сказывается на конечном пользователе, так как он не получает нужные ему объекты.