Разберём создание шаблона стиля на примере категории Газовая плита.
Техническое задание
Перед созданием шаблона стиля рассмотрим техническое задание, по которому составим файл параметров и портов в формате 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 содержит функции задания геометрии, получения параметров и портов.
Definition GeometryStyleMethodRegistrator.h:12
Создание модели газовой плиты
Согласно техническому заданию, плита — прямоугольный параллелепипед, на который нанесены графические примитивы, обозначающие конфорки и дверцу духовки.
Чтобы создать прямоугольный параллелепипед, используем 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)
Полный пример шаблона стиля смотрите по ссылке.