STDL-скрипт#
Перейдём к описанию динамической части описания шаблона стиля. Это создание скрипта на языке Lua, создающий на основе параметров из parameters.json стиль объекта.
Создание детальной 3D-геометрии#
Объявим несколько локальных переменных, которые помогут проще писать скрипт.
1-- объявление локальных переменных
2local parameters = Style.GetParameterValues()
3
4-- таблицы групп параметров
5local general = parameters.General
6local lengthwaysRebars = parameters.LengthwaysRebars
7local transverseRebars = parameters.TransverseRebars
8
9-- параметры
10local meshLength = general.meshLength
11local meshWidth = general.meshWidth
12local meshOffsetZ = general.meshOffsetZ
13
14local lengthwaysRebarId = lengthwaysRebars.RebarStyleId
15local dowelLength = lengthwaysRebars.dowelLength
16
17local transverseRebarId = transverseRebars.RebarStyleId
18local transverseRebarFreeEndLength = transverseRebars.freeEndLength
19local rebarStep = transverseRebars.rebarStep
Для размещения продольной и поперечной арматуры относительно друг друга нам нужно знать диаметры стержней, которые выберет пользователь. Поэтому создадим функцию
GetRebarDiameter, которая будет получать параметрRebarDiameterпо ID выбранного стиля. И получим диаметры продольной и поперечной арматуры.
1-- Функция получения диаметра стиля стержня по его ID
2local function GetRebarDiameter(rebarStyleId)
3 local style = Project.GetRebarStyle(rebarStyleId)
4 local parameters = CastToParameterContainer(style)
5 return parameters:GetParameterValues().RebarDiameter
6end
7
8-- получаем диаметр продольного стержня
9local lengthwaysRebarDiameter = GetRebarDiameter(lengthwaysRebarId)
10-- получаем диаметр поперечного стержня
11local transverseRebarDiameter = GetRebarDiameter(transverseRebarId)
Создадим функцию
makeRebarBaseCurve, которая будет создавать 3D-кривую, образующую продольный стержень.
1local function makeRebarBaseCurve()
2 local curve
3
4 -- если длина выпусков < 200, то создаем прямые стержни
5 if dowelLength < 200 then
6 return CreateLineSegment3D(Point3D(0, 0, 0), Point3D(0, 0, meshLength + dowelLength))
7
8 -- иначе - с изгибом для правильного соединения с верхним каркасом
9 else
10 curve = CreatePolyline3D({Point3D(0, 0, 0),
11 Point3D(0, 0, meshLength + 30),
12 Point3D(lengthwaysRebarDiameter, 0, meshLength + 170),
13 Point3D(lengthwaysRebarDiameter, 0, meshLength + dowelLength)})
14 FilletCorners3D(curve, 10*lengthwaysRebarDiameter)
15 return curve
16 end
17end
Создадим функцию
CreateLengthwaysRebars, создающую продольные стержни. Стержни добавляем в стиль с помощью функцииAddRebarпо отдельности.
1local function CreateLengthwaysRebars(rebarStyleId)
2 local firstCurve = makeRebarBaseCurve()
3 local secondCurve = makeRebarBaseCurve()
4
5 -- сами стержни двигаться не могут, поэтому перемещаем образующие кривые на свои места
6 firstCurve:Shift(-meshWidth/2 + transverseRebarFreeEndLength, 0, meshOffsetZ)
7 secondCurve:Rotate(CreateZAxis3D(), math.pi)
8 :Shift(meshWidth/2 - transverseRebarFreeEndLength, 0, meshOffsetZ)
9
10 -- добавляем в стиль стержни
11 Style.AddRebar(rebarStyleId, firstCurve)
12 Style.AddRebar(rebarStyleId, secondCurve)
13end
Создадим функцию
CreateTransverseRebars, создающую поперечные стержни. Стержни добавляем в стиль с помощью функцииAddRebarSetодним набором.
1local function CreateTransverseRebars(rebarStyleId)
2 -- находим вертикальное смещение первого поперечного стержня
3 local rebarOffsetZ = lengthwaysRebars.bottomFreeEndLength + transverseRebarDiameter/2 + meshOffsetZ
4
5 -- находим горизонтальное смещение поперечного стержня относительно продольного
6 local rebarOffsetY = (lengthwaysRebarDiameter + transverseRebarDiameter)/2
7
8 -- находим количество поперечных стержней
9 local layoutLength = meshLength - rebarOffsetZ - lengthwaysRebars.topFreeEndLength
10 local rebarsQty = math.ceil(layoutLength/rebarStep)
11
12 -- создаем направляющую кривую
13 local curve = CreateLineSegment3D(Point3D(-meshWidth/2, -rebarOffsetY, rebarOffsetZ),
14 Point3D(meshWidth/2, -rebarOffsetY, rebarOffsetZ))
15
16 -- добавляем в стиль набор стержней
17 Style.AddRebarSet(rebarStyleId, curve, Vector3D(0, 0, 1), rebarStep, rebarsQty)
18end
Вызовем созданные функции и создадим детальное отображение арматурного каркаса.
1-- создание продольных стержней
2CreateLengthwaysRebars(lengthwaysRebarId)
3
4-- создание поперечных стержней
5CreateTransverseRebars(transverseRebarId)
Создание условного изображения#
Создадим экземпляр класса
ModelGeometry, в котором будем «собирать» условную геометрию стиля. Условное изображение шаблона будет двумерной геометриейGeometrySet2D.
1-- создание экземпляра ModelGeometry
2local symbolicGeometry = ModelGeometry()
3
4-- создание экземпляра планарной геометрии
5local geometry = GeometrySet2D()
6
7-- задание ЛСК
8local geometryPlacement = Placement3D(Point3D(0, 0, meshOffsetZ), Vector3D(0, -1, 0), Vector3D(1, 0, 0))
Условное изображение будет состоять из прямоугольника и диагональной линии. Поместим созданные кривые в двумерную геометрию с помощью метода
AddCurves.
1local rectangle = CreateRectangle2D(Point2D(0, meshLength/2), 0, meshWidth, meshLength)
2local line = CreateLineSegment2D(Point2D(-meshWidth/2, 0), Point2D(meshWidth/2, meshLength))
3
4-- добавление кривых в планарную геометрию
5geometry:AddCurve(rectangle):AddCurve(line)
6
7-- добавление планарной геометрии в модельную геометрию
8symbolicGeometry:AddGeometrySet2D(geometry, geometryPlacement)
Cозданную двумерную геометрию geometry добавляем в модельную геометрию symbolicGeometry с помощью метода AddGeometrySet2D.
Для создания условной геометрии стиля, передадим модельную геометрию
symbolicGeometryв качестве аргумента функции SetSymbolicGeometry.
1-- создание условной геометрии стиля
2Style.SetSymbolicGeometry(symbolicGeometry)