v1.1
 
Пример создания шаблона стиля

В Renga STDL SDK вы найдёте несколько примеров шаблонов стилей. Здесь разберём создание шаблона стиля на примере категории Газовая плита.

Техническое задание

Перед созданием шаблона стиля рассмотрим техническое задание, по которому составим файл параметров и портов в формате JSON и напишем скрипт на языке Lua.

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

Чертёж газовой плиты
Группа/Параметр Описание Тип параметра Значение по умолчанию Минимальное Максимальное
General Общие
Material Материал Id
Dimensions Габаритные размеры
Width Ширина Length 600 480 600
Depth Глубина Length 600 480 600
Height Высота Length 850 800 1000
Gas Газ
NominalDiameter Номинальный диаметр 1/2″
ConnectionType Вид соединения CoreEnum Thread

Категория Газовая плита — это категория Оборудования.

Описание параметров и портов

По техническому заданию составляем файл параметров и портов, согласно структуре, описанной в разделе Структура шаблона стиля.

Результат смотрите в файле описания параметров и портов газовой плиты.

Обратите внимание, что если порт относится к трубопроводной системе, то описание портов должно содержать параметры для резьбового типа соединения Thread, поэтому в группе Gas добавлен параметр ThreadSize в следующем виде:

{
"name": "ThreadSize",
"text": "Номинальный диаметр",
"type": "CoreEnum",
"coreEnumType": "PipeThreadSize",
"default": "D0_50"
}

А для других типов соединений трубопроводных систем нужен парамер Номинальный диаметр:

{
"name": "NominalDiameter",
"text": "Номинальный диаметр",
"type": "Length",
"default": 7,
"min": 1,
"max": 20
}

Скрипт

Получение параметров и объявление переменных

Сначала получаем значения параметров, которые задаёт пользователь в редакторе стилей объекта, в данном случае в редакторе Стили оборудования. Затем объявляем переменные.

local parameters = Style.GetParameterValues()
local width = parameters.Dimensions.Width
local depth = parameters.Dimensions.Depth
local height = parameters.Dimensions.Height
Style namespace.
Definition GeometryStyleMethodRegistrator.h:13

Создание модели газовой плиты

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

Чтобы создать прямоугольный параллелепипед, используем CreateBlock(width, depth, height). Символы дверцы и варочной поверхности создадим с помощью новых функций.

Создание символа дверцы и определение его положения

С помощью новой функции создаём символ дверцы:

  • Определяем размеры символа. Согласно техническому заданию, размеры дверцы зависят от ширины и высоты газовой плиты.
  • Создаём прямоугольник.
  • Создаём набор двумерных примитивов из прямоугольника.
  • Возвращаем символ.
function MakeOvenDoorSymbol()
local doorWidth = width - 100
local doorHeight = height / 2
-- Create a rectangle.
local rectangle = CreateRectangle2D(Point2D(0, doorHeight / 2), 0, doorWidth,
doorHeight)
local geometrySet = GeometrySet2D()
geometrySet:AddCurve(rectangle)
return geometrySet
end
Набор геометрических примитивов, который может включать двумерные кривые и заливки.
Точка в двумерном пространстве.
Curve2D CreateRectangle2D(Point2D center, double angle, number width, number height)
Создаёт прямоугольник в виде составной кривой из четырёх отрезков.

Определяем положение символа так, чтобы центр прямоугольника совпал с центром передней грани прямоугольного параллелепипеда:

local doorSymbolPlace = Placement3D(Point3D(0, -depth / 2, height / 4),
Vector3D(0, -1, 0), Vector3D(1, 0, 0))
Локальная система координат в трёхмерном пространстве.
Точка в трёхмерном пространстве.
Вектор в трёхмерном пространстве.

Создание символа варочной панели и определение его положения

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

С помощью новой функции создаём символ варочной панели, состоящий из 4 окружностей и прямоугольника:

  • Определяем размеры окружностей. Согласно техническому заданию диаметр конфорки равен 120 мм.
  • Создаём окружности.
  • Создаём прямоугольник.
  • Создаём набор двумерных примитивов из окружностей и прямоугольника.
  • Возвращаем символ.
function MakeCookingSurfaceSymbol()
-- Diameter is equal to 120, see technical task drawing
local radius = 120 / 2
local x = width / 4
local y = depth / 4
-- Create circles
local circle1 = CreateCircle2D(Point2D(x, y), radius)
local circle2 = CreateCircle2D(Point2D(x, -y), radius)
local circle3 = CreateCircle2D(Point2D(-x, -y), radius)
local circle4 = CreateCircle2D(Point2D(-x, y), radius)
-- Create rectangle for symbolic geometry
local rectangle = CreateRectangle2D(Point2D(0, 0), 0, width,
depth)
-- Create geometry set
local geometrySet = GeometrySet2D()
geometrySet:AddCurve(circle1)
geometrySet:AddCurve(circle2)
geometrySet:AddCurve(circle3)
geometrySet:AddCurve(circle4)
geometrySet:AddCurve(rectangle)
-- Return the resulting symbol
return geometrySet
end
Curve2D CreateCircle2D(Point2D center, number radius)
Создаёт окружность.

Определяем положение символа так, чтобы центр символа совпал с центром верхней грани прямоугольного параллелепипеда:

local cookerSurfaceSymbolPlace = Placement3D(
Point3D(0, 0, height),
Vector3D(0, 0, 1), Vector3D(1, 0, 0))

Создание детальной геометрии

Создаём детальную геометрию и добавляем в неё все компоненты модели:

local detailedGeometry = ModelGeometry()
detailedGeometry:AddSolid(CreateBlock(width, depth, height))
detailedGeometry:AddGeometrySet2D(MakeOvenDoorSymbol(), doorSymbolPlace)
detailedGeometry:AddGeometrySet2D(MakeCookingSurfaceSymbol(),
cookerSurfaceSymbolPlace)
Модельная геометрия.
Solid CreateBlock(number xSize, number ySize, number zSize, Placement3D oPlacement)
Создаёт прямоугольный параллелепипед.

Устанавливаем детальную геометрию для стиля объекта через функцию из пространства имён Style:

Style.SetDetailedGeometry(detailedGeometry)

‍Когда детальная геометрия установлена, вы можете проверить результат. См. Сборка шаблона стиля и Тестирование и отладка.

Создание условного отображения газовой плиты

Мы уже создали символ варочной поверхности выше. Теперь создаём из него условное изображение и устанавливаем его для стиля.

local symbolicGeometry = ModelGeometry()
symbolicGeometry:AddGeometrySet2D(MakeCookingSurfaceSymbol(),
cookerSurfaceSymbolPlace)
Style.SetSymbolicGeometry(symbolicGeometry)

Работа с портом

Газовая плита подключается к бытовому газоснабжению. Эта категория систем относится к группе трубопроводных систем.

В редакторе стилей оборудования пользователь может выбрать любой вид соединения для порта трубопроводной системы. В зависимости от вида соединения порт может принимать разные значения диаметра.

Если соединение Резьбовое, то значение выбирается из предустановленного списка. В других случаях значение диаметра задаётся в миллиметрах. Чтобы это работало, напишем функцию:

function SetPipeParameters(port, portParameters)
local connectionType = portParameters.ConnectionType
if connectionType == PipeConnectorType.Thread then
port:SetPipeParameters(connectionType, portParameters.ThreadSize)
else
port:SetPipeParameters(connectionType, portParameters.NominalDiameter)
end
end
PipeConnectorType
Типы соединения в трубопроводных системах.
Definition DoxygenCoreEnum.h:16

Чтобы показывать в редакторе только нужный параметр, создадим функцию, позволяющую скрыть параметры, и вызовем её для порта.

function HideIrrelevantPortParams(portName)
local isThread =
Style.GetParameter(portName, "ConnectionType"):GetValue() ==
Style.GetParameter(portName, "ThreadSize"):SetVisible(isThread)
Style.GetParameter(portName, "NominalDiameter"):SetVisible(not isThread)
end
HideIrrelevantPortParams("Gas")

Определяем положение порта согласно техническому заданию:

local gasPortPlace = Placement3D(
Point3D(width / 2 - 50, depth / 2, height - 100),
Vector3D(0, 1, 0), Vector3D(1, 0, 0))

Получаем доступ к порту и устанавливаем его параметры:

local gasPort = Style.GetPort("Gas")
SetPipeParameters(gasPort, parameters.Gas)
gasPort:SetPlacement(gasPortPlace)

Полный пример шаблона стиля смотрите по ссылке.