STDL-скрипт#
Перейдём к описанию динамической части описания шаблонной категории. Это создание скрипта на языке Lua, создающий на основе параметров из parameters.json
категорию объекта
Создание детальной 3D-геометрии#
Создадим экземпляр класса
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.
Создадим функцию
makeProfile()
, которая будет создавать пятиугольник по точкам — замкнутый контур CreatePolyline2D. Координаты точек будут определяться параметрамиheight
иwidth
:
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.
Далее создадим тело выдавливания Extrude на длину
length
, разместим его в своей локальной системе координатvrfPlacement
и добавим полученное тело в модельную геометриюdetailedGeometry
с помощью методаAddSolid
.
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
мы задаем новую ЛСК, в которой тело ориентируется горизонально (поворачиваем оси).
Для создания детальной геометрии стиля, передадим модельную геометрию
detailedGeometry
в качестве аргумента функции SetDetailedGeometry.
1-- создание детальной геометрии стиля
2Style.SetDetailedGeometry(detailedGeometry)
Создание условного изображения#
В начале создадим экземпляр класса ModelGeometry, в котором будем «собирать» условную геометрию стиля, а также несколько примитивов из двумерных кривых:
contour
— для создания прямоугольного контура оборудования иletterS
— для создания буквы «S».
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()
.
Условное изображение категории будет двумерной геометрией. Поместим созданные кривые в двумерную геометрию с помощью метода
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
.
Для создания условной геометрии стиля, передадим модельную геометрию
symbolicGeometry
в качестве аргумента функции SetSymbolicGeometry.
1-- создание условной геометрии стиля
2Style.SetSymbolicGeometry(symbolicGeometry)
Создание портов#
Создание портов трубопроводных систем#
Объявим несколько локальных переменных, которые помогут создать декартовы точки портов.
Примечание
Порты размещаются по-умолчанию в центре ЛСК
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)
Следующая часть кода размещает декартовы точки портов в зависимости от параметра
connectionSide
: слева или справа относительно центра корпуса оборудования. Координату X определяет переменнаяhalfLengthWithIndent50
, координата Y высчитывается с учетом параметра отступаportIndentation
, а координаты Z — фиксированы (25, 50 и 75).
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
Создадим функцию
rotateVectors
, которая будет возвращать векторы осей Z и X в зависимости от параметраconnectionDirection
, задающего направление подключения.
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
Создадим функцию
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
Разместим порты с помощью метода
SetPlacement
. И далее добавим параметры портам с помощью созданной функцииsetPipeAttributes
.
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")
Создание портов электрических систем#
Порты электрических систем будут размещаться группой на задней стенке 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)))
Настройка отображения параметров в диалоге стиля объекта#
Создадим функцию, которая в зависимости от выбранного вида соединения будет отображать в диалоге стиля объекта либо параметр
nominalDiameter
, либоthreadSize
. В теле функции мы вызываем методSetVisible
таблицыStyle
. Вызовем эту функцию для групп параметровWaterCoolant
,GasCoolant
иDrainage
.
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")
Примечание
Если у группы скрыть все параметры, то она также автоматически будет скрыта.
И список параметров в диалоге стиля объекта будет теперь отображаться так: