STDL-скрипт

Перейдём к описанию динамической части описания шаблонной категории. Это создание скрипта на языке Lua, создающий на основе параметров из parameters.json категорию объекта

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

  1. Создадим экземпляр класса ModelGeometry, в котором будем «собирать» детальный уровень детализации. Кроме того объявим несколько локальных переменных, которые помогут проще писать скрипт.

Объявление локальных переменных.
1-- создание экземпляра ModelGeometry
2local detailedGeometry = ModelGeometry()
3
4-- объявление локальных переменных
5local parameters = Style.GetParameterValues()
6
7local height = parameters.Dimensions.bodyHeight
8local width = parameters.Dimensions.bodyWidth
9local length = parameters.Dimensions.bodyLength

Корпус настенного блока VRF-системы будет создан телом выдавливания Extrude.

  1. Создадим функцию makeProfile(), которая будет создавать пятиугольник по точкам — замкнутый контур CreatePolyline2D. Координаты точек будут определяться параметрами height и width:

Функция makeProfile(), создающая профиль корпуса оборудования.
 1local function makeProfile()
 2    local points = {
 3        Point2D(0, 0),
 4        Point2D(0, height),
 5        Point2D(width, height),
 6        Point2D(width, height / 8),
 7        Point2D(width / 3, 0),
 8        Point2D(0, 0)}
 9    local profile = CreatePolyline2D(points)
10    FilletCornerAfterSegment2D(profile, 2, width / 4)
11    return profile
12end

Метод FilletCornerAfterSegment2D скругляет вершину отрезка с индексом [2] и следующего отрезка по радиусу, равным width / 4.

ClosedContourByPoints

Профиль корпуса оборудования

  1. Далее создадим тело выдавливания Extrude на длину length, разместим его в своей локальной системе координат vrfPlacement и добавим полученное тело в модельную геометрию detailedGeometry с помощью метода AddSolid.

Добавление тела в модельную геометрию detailedGeometry.
 1-- задание ЛСК
 2local vrfPlacement = Placement3D(Point3D(0, 0, 0),
 3                                Vector3D(-1, 0, 0),
 4                                Vector3D(0, -1, 0))
 5
 6-- дополнительные параметры для функции Extrude()
 7local extrusionParams = ExtrusionParameters(length)
 8
 9-- создание твердотельной 3D-геометрии
10local vrfSolid = Extrude(makeProfile(), extrusionParams, vrfPlacement)
11    :Shift(length / 2, width / 2, 0)
12
13-- добавление твердотельной 3D-геометрии в детальную геометрию
14detailedGeometry:AddSolid(vrfSolid)

Примечание

Центр геометрического примитива создается в начале координат своей ЛСК.

По умолчанию выдавливание профиля выполняется относительно оси Z, т.е. вертикально. С помощью параметра vrfPlacement мы задаем новую ЛСК, в которой тело ориентируется горизонально (поворачиваем оси).

  1. Для создания детальной геометрии стиля, передадим модельную геометрию detailedGeometry в качестве аргумента функции SetDetailedGeometry.

Создание детальной геометрии стиля.
1-- создание детальной геометрии стиля
2Style.SetDetailedGeometry(detailedGeometry)

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

  1. В начале создадим экземпляр класса ModelGeometry, в котором будем «собирать» условную геометрию стиля, а также несколько примитивов из двумерных кривых: contour — для создания прямоугольного контура оборудования и letterS — для создания буквы «S».

Создание плоских кривых contour и letterS.
 1-- создание экземпляра ModelGeometry
 2local symbolicGeometry = ModelGeometry()
 3
 4-- создание двумерных кривых для двумерной геометрии
 5local contour = CreateRectangle2D(Point2D(0, 0), 0, length, width)
 6local letterS = CreateCompositeCurve2D({
 7                    CreateArc2DByThreePoints(Point2D(19.4, 23), Point2D(4.2, 30.4), Point2D(-12, 26)),
 8                    CreateArc2DByThreePoints(Point2D(-12, 26), Point2D(-16.4, 14.2), Point2D(-9, 4.2)),
 9                    CreateLineSegment2D(Point2D(-9, 4.2), Point2D(9, -4.2)),
10                    CreateArc2DByThreePoints(Point2D(9, -4.2), Point2D(16.4, -14.2), Point2D(12, -26)),
11                    CreateArc2DByThreePoints(Point2D(12, -26), Point2D(-4.2, -30.4), Point2D(-19.4, -23))})

Составная кривая letterS создается из 5-ти отдельных односегментных кривых, путем объединения в функции CreateCompositeCurve2D().

  1. Условное изображение категории будет двумерной геометрией. Поместим созданные кривые в двумерную геометрию с помощью метода AddCurves и добавим основную заливку с помощью метода AddMaterialColorSolidArea.

Создание двумерной геометрии.
 1-- создание экземпляра двумерной геометрии
 2local geometry = GeometrySet2D()
 3
 4-- задание ЛСК
 5local geometryPlacement = Placement3D(Point3D(0, 0, height), Vector3D(0, 0, 1), Vector3D(1, 0, 0))
 6
 7-- добавление кривых и области заливки в двумерную геометрию
 8geometry:AddCurve(contour):AddCurve(letterS)
 9geometry:AddMaterialColorSolidArea(FillArea(contour))
10
11-- добавление двумерной геометрии в модельную геометрию
12symbolicGeometry:AddGeometrySet2D(geometry, geometryPlacement)

Cозданную двумерную геометрию geometry добавляем в модельную геометрию symbolicGeometry с помощью метода AddGeometrySet2D.

  1. Для создания условной геометрии стиля, передадим модельную геометрию symbolicGeometry в качестве аргумента функции SetSymbolicGeometry.

Создание условной геометрии стиля.
1-- создание условной геометрии стиля
2Style.SetSymbolicGeometry(symbolicGeometry)
Детальное и условное отображение

Детальное и условное отображение

Создание портов

Создание портов трубопроводных систем

  1. Объявим несколько локальных переменных, которые помогут создать декартовы точки портов.

Примечание

Порты размещаются по-умолчанию в центре ЛСК

Объявление локальных переменных.
 1-- объявление локальных переменных
 2local halfWidth = width / 2
 3local halfLengthWithIndent50 = length / 2 - 50
 4local waterPortIntendation = parameters.WaterCoolant.portIndentation
 5local gasPortIntendation = parameters.GasCoolant.portIndentation
 6local drainagePortIntendation = parameters.Drainage.portIndentation
 7
 8-- декартовы точки по-умолчанию
 9local waterCoolantOrigin = Point3D(0, 0, 0)
10local gasCoolantOrigin = Point3D(0, 0, 0)
11local drainageOrigin = Point3D(0, 0, 0)
  1. Следующая часть кода размещает декартовы точки портов в зависимости от параметра connectionSide: слева или справа относительно центра корпуса оборудования. Координату X определяет переменная halfLengthWithIndent50, координата Y высчитывается с учетом параметра отступа portIndentation, а координаты Z — фиксированы (25, 50 и 75).

Размещение декартовых точек портов с учетом параметра connectionSide.
 1-- размещение декартовых точек портов с учетом параметра connectionSide
 2if parameters.WaterCoolant.connectionSide == "right" then
 3    waterCoolantOrigin = Point3D(halfLengthWithIndent50,
 4                                halfWidth - waterPortIntendation, 75)
 5else
 6    waterCoolantOrigin = Point3D(-halfLengthWithIndent50,
 7                                halfWidth - waterPortIntendation, 75)
 8end
 9
10if parameters.GasCoolant.connectionSide == "right" then
11    gasCoolantOrigin = Point3D(halfLengthWithIndent50,
12                            halfWidth - gasPortIntendation, 50)
13else
14    gasCoolantOrigin = Point3D(-halfLengthWithIndent50,
15                                halfWidth - gasPortIntendation, 50)
16end
17
18if parameters.Drainage.connectionSide == "right" then
19    drainageOrigin = Point3D(halfLengthWithIndent50,
20                            halfWidth - drainagePortIntendation, 25)
21else
22    drainageOrigin = Point3D(-halfLengthWithIndent50,
23                            halfWidth - drainagePortIntendation, 25)
24end
Размещение портов трубопроводных систем

Размещение портов трубопроводных систем

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

Функция rotateVectors.
 1-- создание функции rotateVectors, которая будет возвращать векторы осей Z и X в зависимости от параметра connectionDirection, задающего направление подключения.
 2local function rotateVectors(name)
 3    local direction = parameters[name].connectionDirection
 4    local side = parameters[name].connectionSide
 5
 6    -- векторы по-умолчанию
 7    local vectorZ = Vector3D(0, 0, 1)
 8    local vectorX = Vector3D(1, 0, 0)
 9
10    if direction == "side" then
11        if side == "right" then
12            vectorZ = Vector3D(1, 0, 0)
13            vectorX = Vector3D(0, 1, 0)
14        else
15            vectorZ = Vector3D(-1, 0, 0)
16            vectorX = Vector3D(0, 1, 0)
17        end
18    elseif direction == "back" then
19        vectorZ = Vector3D(0, 1, 0)
20        vectorX = Vector3D(1, 0, 0)
21    else
22        vectorZ = Vector3D(0, 0, -1)
23        vectorX = Vector3D(1, 0, 0)
24    end
25    local vectors = {z = vectorZ, x = vectorX}
26    return vectors
27end
  1. Создадим функцию setPipeAttributes, которая будет добавлять параметры соединения портам (см. главу Порты)

Функция setPipeAttributes.
1-- создание функции setPipeAttributes, которая будет добавлять параметры соединения портам
2local function setPipeAttributes(port, portParameters)
3    return parameters[portParameters].connectorType == PipeConnectorType.Thread
4        and port:SetPipeParameters(parameters[portParameters].connectorType, parameters[portParameters].threadSize)
5        or port:SetPipeParameters(parameters[portParameters].connectorType, parameters[portParameters].nominalDiameter)
6end
  1. Разместим порты с помощью метода SetPlacement. И далее добавим параметры портам с помощью созданной функции setPipeAttributes.

Размещение портов WaterCoolant, GasCoolant и Drainage со своими параметрами.
 1-- размещение портов трубопроводных систем и добавление к ним параметров соединения
 2Style.GetPort("WaterCoolant"):SetPlacement(Placement3D(waterCoolantOrigin,
 3                                            rotateVectors("WaterCoolant").z,
 4                                            rotateVectors("WaterCoolant").x))
 5setPipeAttributes(Style.GetPort("WaterCoolant"), "WaterCoolant")
 6
 7Style.GetPort("GasCoolant"):SetPlacement(Placement3D(gasCoolantOrigin,
 8                                            rotateVectors("GasCoolant").z,
 9                                            rotateVectors("GasCoolant").x))
10setPipeAttributes(Style.GetPort("GasCoolant"), "GasCoolant")
11
12Style.GetPort("Drainage"):SetPlacement(Placement3D(drainageOrigin,
13                                            rotateVectors("Drainage").z,
14                                            rotateVectors("Drainage").x))
15setPipeAttributes(Style.GetPort("Drainage"), "Drainage")

Создание портов электрических систем

  1. Порты электрических систем будут размещаться группой на задней стенке VRF-блока. Направление портов будет фиксированным - назад (в стену). Атрибутов у электрических портов нет, поэтому достаточно только разместить их с учётом пользовательских параметров.

Размещение портов электрических систем.
 1-- объявление локальных переменных
 2local halfHeight = height / 2
 3local direction = 1
 4local electricPortIntendation = parameters.ElectricConnectors.portIndentation
 5local distanceBetweenElectricPorts = parameters.ElectricConnectors.distanceBetweenPorts
 6
 7--декартова точка портов по-умолчанию
 8local electricConnectorsOrigin = Point3D(-distanceBetweenElectricPorts,
 9                                        halfWidth - electricPortIntendation,
10                                        halfHeight)
11
12-- изменение точки вставки портов в зависимости от параметра portLocation
13if parameters.ElectricConnectors.portLocation == "right" then
14    electricConnectorsOrigin = Point3D(halfLengthWithIndent50,
15                                        halfWidth - electricPortIntendation,
16                                        halfHeight)
17    direction = -1
18elseif parameters.ElectricConnectors.portLocation == "left" then
19    electricConnectorsOrigin = Point3D(-halfLengthWithIndent50,
20                                        halfWidth - electricPortIntendation,
21                                        halfHeight)
22end
23
24-- размещение портов электрических систем
25Style.GetPort("PowerSupplyLine"):SetPlacement(Placement3D(
26                                                electricConnectorsOrigin,
27                                                Vector3D(0, 1, 0),
28                                                Vector3D(1, 0, 0)))
29Style.GetPort("ControlNetwork1"):SetPlacement(Placement3D(
30                                                electricConnectorsOrigin
31                                                :Shift(direction * distanceBetweenElectricPorts, 0, 0),
32                                                Vector3D(0, 1, 0),
33                                                Vector3D(1, 0, 0)))
34Style.GetPort("ControlNetwork2"):SetPlacement(Placement3D(
35                                                electricConnectorsOrigin
36                                                :Shift(direction * distanceBetweenElectricPorts, 0, 0),
37                                                Vector3D(0, 1, 0),
38                                                Vector3D(1, 0, 0)))

Настройка отображения параметров в диалоге стиля объекта

  1. Создадим функцию, которая в зависимости от выбранного вида соединения будет отображать в диалоге стиля объекта либо параметр nominalDiameter, либо threadSize. В теле функции мы вызываем метод SetVisible таблицы Style. Вызовем эту функцию для групп параметров WaterCoolant, GasCoolant и Drainage.

Функция hideIrrelevantPortParam.
 1-- функция hideIrrelevantPortParam, которая в зависимости от выбранного вида соединения будет отображать в диалоге стиля объекта либо параметр nominalDiameter, либо threadSize.
 2local function hideIrrelevantPortParam(portName)
 3    local param = parameters[portName].connectorType == PipeConnectorType.Thread
 4    and "nominalDiameter" or "threadSize"
 5    Style.GetParameter(portName, param):SetVisible(false)
 6end
 7
 8hideIrrelevantPortParam("WaterCoolant")
 9hideIrrelevantPortParam("GasCoolant")
10hideIrrelevantPortParam("Drainage")

Примечание

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

И список параметров в диалоге стиля объекта будет теперь отображаться так:

Параметры стиля объекта Renga (итог)

Параметры стиля объекта Renga (итог).