В 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.
doorHeight)
geometrySet:AddCurve(rectangle)
return geometrySet
end
Набор геометрических примитивов, который может включать двумерные кривые и заливки.
Точка в двумерном пространстве.
Curve2D CreateRectangle2D(Point2D center, double angle, number width, number height)
Создаёт прямоугольник в виде составной кривой из четырёх отрезков.
Определяем положение символа так, чтобы центр прямоугольника совпал с центром передней грани прямоугольного параллелепипеда:
Локальная система координат в трёхмерном пространстве.
Точка в трёхмерном пространстве.
Вектор в трёхмерном пространстве.
Создание символа варочной панели и определение его положения
Символ варочной панели будем использовать не только для отображения в модели, но и как условное отображение газовой плиты для чертежей.
С помощью новой функции создаём символ варочной панели, состоящий из 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
-- Create rectangle for symbolic geometry
depth)
-- Create geometry set
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)
Создаёт окружность.
Определяем положение символа так, чтобы центр символа совпал с центром верхней грани прямоугольного параллелепипеда:
Создание детальной геометрии
Создаём детальную геометрию и добавляем в неё все компоненты модели:
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)
Когда детальная геометрия установлена, вы можете проверить результат. См. Сборка шаблона стиля и Тестирование и отладка.
Создание условного отображения газовой плиты
Мы уже создали символ варочной поверхности выше. Теперь создаём из него условное изображение и устанавливаем его для стиля.
symbolicGeometry:AddGeometrySet2D(MakeCookingSurfaceSymbol(),
cookerSurfaceSymbolPlace)
Style.SetSymbolicGeometry(symbolicGeometry)
Работа с портом
Газовая плита подключается к бытовому газоснабжению. Эта категория систем относится к группе трубопроводных систем.
В редакторе стилей оборудования пользователь может выбрать любой вид соединения для порта трубопроводной системы. В зависимости от вида соединения порт может принимать разные значения диаметра.
Если соединение Резьбовое, то значение выбирается из предустановленного списка. В других случаях значение диаметра задаётся в миллиметрах. Чтобы это работало, напишем функцию:
function SetPipeParameters(port, portParameters)
local connectionType = portParameters.ConnectionType
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")
Определяем положение порта согласно техническому заданию:
Point3D(width / 2 - 50, depth / 2, height - 100),
Получаем доступ к порту и устанавливаем его параметры:
local gasPort =
Style.GetPort(
"Gas")
SetPipeParameters(gasPort, parameters.Gas)
gasPort:SetPlacement(gasPortPlace)
Полный пример шаблона стиля смотрите по ссылке.