STDL-скрипт#

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

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

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

Объявление локальных переменных.#
 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
  1. Для размещения продольной и поперечной арматуры относительно друг друга нам нужно знать диаметры стержней, которые выберет пользователь. Поэтому создадим функцию 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)
  1. Создадим функцию 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
  1. Создадим функцию 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
  1. Создадим функцию 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. Вызовем созданные функции и создадим детальное отображение арматурного каркаса.

Создаем с помощью функций продольную и поперечную арматуру каркаса.#
1-- создание продольных стержней
2CreateLengthwaysRebars(lengthwaysRebarId)
3
4-- создание поперечных стержней
5CreateTransverseRebars(transverseRebarId)

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

  1. Создадим экземпляр класса 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))
  1. Условное изображение будет состоять из прямоугольника и диагональной линии. Поместим созданные кривые в двумерную геометрию с помощью метода 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.

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

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