v2.0
 
Шаблон стиля арматурной сетки

Разберём создание шаблона стиля арматурного изделияАрматурная сетка.

Техническое задание

Перед созданием шаблона стиля рассмотрим техническое задание, по которому составим файл параметров в формате JSON и напишем скрипт на языке Lua.

Техническое задание может быть представлено в виде чертежа с указанием параметров и таблицы значений параметров.

Чертёж арматурной сетки

Условное отображение:

Условное отображение арматурной сетки

Группа/Параметр Описание Тип параметра Значение по умолчанию Минимальное Максимальное
Dimensions Габаритные размеры
Length Длина Length 1000 200 12000
Width Ширина Length 1000 200 12000
LongitudinalReinforcement Продольная арматура
RebarStyleId Стиль арматурного стержня Id
Step Шаг Length 100 0 9999999
FreeEnd Свободный конец арматуры Length 25 0 9999999
TransverseReinforcement Поперечная арматура
RebarStyleId Стиль арматурного стержня Id
Step Шаг Length 100 0 9999999
FreeEnd Свободный конец арматуры Length 25 0 9999999

Описание параметров

По техническому заданию составляем файл параметров согласно структуре, описанной в разделе Шаблоны стилей арматурных изделий.

Результат смотрите в файле описания параметров арматурной сетки.

Скрипт

Получение параметров и объявление переменных

Сначала получаем значения параметров, которые задаёт пользователь в редакторе стилей арматурных изделий. Затем объявляем переменные.

local parameters = Style.GetParameterValues()
local length = parameters.Dimensions.Length
local width = parameters.Dimensions.Width
local longRebarStyleID = parameters.LongitudinalReinforcement.RebarStyleId
local longFreeEnd = parameters.LongitudinalReinforcement.FreeEnd
local longStep = parameters.LongitudinalReinforcement.Step
local transRebarStyleID = parameters.TransverseReinforcement.RebarStyleId
local transFreeEnd = parameters.TransverseReinforcement.FreeEnd
local transStep = parameters.TransverseReinforcement.Step
Пространство имён Style содержит функции задания геометрии, получения параметров и портов.
Definition GeometryStyleMethodRegistrator.h:12

Создание модели арматурной сетки

Согласно техническому заданию, арматурная сетка состоит из продольных и поперечных арматурных стержней, повторяющихся с шагом, который задаёт пользователь, и доборным шагом, который рассчитывается, в зависимости от длины и ширины сетки и свободного конца арматуры.

Чтобы задавать положение арматурных стержней, нужно знать радиус арматурного стержня, для его вычисления создадим функцию:

function GetRebarRadius(rebarStyleId)
local style = Project.GetRebarStyle(rebarStyleId)
local parameters = CastToParameterContainer(style)
return parameters:GetParameterValues().RebarDiameter / 2
end
ParameterContainer CastToParameterContainer(Entity entity)
Приводит сущность к контейнеру параметров, если преобразование разрешено.
Пространство имён Project содержит функции для получения стилей.

Чтобы задавать смещение объектов по вектору, создадим функцию:

function ShiftedByVector(object, vector, length)
return object:Shift(vector:GetX() * length, vector:GetY() * length, vector:GetZ() * length)
end

Для раскладки арматуры на заданную длину по одному направлению так же создадим функцию:

function CreateRebarLayoutWithFreeEnd(rebarStyleId, curve3d, fullLength, freeEnd, step, vector)
local rebarRadius = GetRebarRadius(rebarStyleId)
-- При вычислении длины учитываем полную длину сетки, а также длины свободных концов
local length = fullLength - freeEnd * 2 - rebarRadius * 2
-- Для расчета количества стержней округляем значение
local number = math.floor(length / step)
-- Определяем нужен ли доборный шаг
local lastStep = length - step * number
if lastStep < rebarRadius * 2 and lastStep ~= 0 then
number = number - 1
end
ShiftedByVector(curve3d, vector, freeEnd + rebarRadius)
-- Создаём группу стержней с равным шагом
Style.AddRebarSet(rebarStyleId, curve3d, vector, step, number + 1)
-- Если нужен доборный шаг, добавляем стержень
if lastStep ~= 0 then
ShiftedByVector(curve3d, vector, length)
Style.AddRebar(rebarStyleId, curve3d)
end
end

Далее задаём переменные для задания положения арматурных стержней по высоте:

-- Высота расположения продольной арматуры
local longHeight = GetRebarRadius(longRebarStyleID)
-- Высота расположения поперечной арматуры
local transHeight = GetRebarRadius(longRebarStyleID) * 2 + GetRebarRadius(transRebarStyleID)

Задаём кривую и вектор для продольных арматурных стержней:

local longRebarLine = CreateLineSegment3D(Point3D(-length / 2, -width / 2, longHeight),
Point3D(length / 2, -width / 2, longHeight))
local longVector = Vector3D(0, 1, 0)
Точка в трёхмерном пространстве.
Вектор в трёхмерном пространстве.
Curve3D CreateLineSegment3D(Point3D startPoint, Point3D endPoint)
Создаёт отрезок.

Задаём кривую и вектор для поперечных арматурных стержней:

local transRebarLine = CreateLineSegment3D(Point3D(-length / 2, -width / 2, transHeight),
Point3D(-length / 2, width / 2, transHeight))
local transVector = Vector3D(1, 0, 0)

Используя функцию CreateRebarLayoutWithFreeEnd(), создаём продольные и поперечные арматурные стержни сетки:

CreateRebarLayoutWithFreeEnd(longRebarStyleID, longRebarLine, width, transFreeEnd, longStep, longVector)
CreateRebarLayoutWithFreeEnd(transRebarStyleID, transRebarLine, length, longFreeEnd, transStep, transVector)

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

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

function MakeSymbolicGeometrySet()
local rectangle = CreateRectangle2D(Point2D(0, 0), 0, length, width)
local line = CreateLineSegment2D(Point2D(-length / 2, -width / 2), Point2D(length / 2, width / 2))
local geometrySet = GeometrySet2D()
geometrySet:AddCurve(rectangle)
geometrySet:AddCurve(line)
return geometrySet
end
Набор геометрических примитивов, который может включать двумерные кривые и заливки.
Точка в двумерном пространстве.
Curve2D CreateRectangle2D(Point2D center, double angle, number width, number height)
Создаёт прямоугольник в виде составной кривой из четырёх отрезков.
Curve2D CreateLineSegment2D(Point2D startPoint, Point2D endPoint)
Создаёт отрезок по двум точкам.

Далее задаём переменную для задания положения условного обозначения по высоте:

local symbolicHeight = GetRebarRadius(longRebarStyleID) + GetRebarRadius(transRebarStyleID)

Теперь создаём условное изображение, определяем его положение и устанавливаем для стиля арматурного изделия:

local symbolicGeometry = ModelGeometry()
local symbolicGeometryPlacement = Placement3D(Point3D(0, 0, symbolicHeight), Vector3D(0, 0, 1), Vector3D(1, 0, 0))
symbolicGeometry:AddGeometrySet2D(MakeSymbolicGeometrySet(), symbolicGeometryPlacement)
Style.SetSymbolicGeometry(symbolicGeometry)
Модельная геометрия.
Локальная система координат в трёхмерном пространстве.

Полный пример шаблона стиля смотрите по ссылке.