Разберём создание шаблона стиля арматурного изделия — Арматурная сетка.
Техническое задание
Перед созданием шаблона стиля рассмотрим техническое задание, по которому составим файл параметров в формате 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)
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)
Задаём кривую и вектор для продольных арматурных стержней:
Point3D(length / 2, -width / 2, longHeight))
Точка в трёхмерном пространстве.
Вектор в трёхмерном пространстве.
Curve3D CreateLineSegment3D(Point3D startPoint, Point3D endPoint)
Создаёт отрезок.
Задаём кривую и вектор для поперечных арматурных стержней:
Point3D(-length / 2, width / 2, transHeight))
Используя функцию CreateRebarLayoutWithFreeEnd(), создаём продольные и поперечные арматурные стержни сетки:
CreateRebarLayoutWithFreeEnd(longRebarStyleID, longRebarLine, width, transFreeEnd, longStep, longVector)
CreateRebarLayoutWithFreeEnd(transRebarStyleID, transRebarLine, length, longFreeEnd, transStep, transVector)
Создание условного отображения арматурной сетки
Для создания условного отображения арматурной сетки, необходимо создать прямоугольник с диагональной линией. Создадим функцию, которая позволит создать его из набора геометрических примитивов:
function MakeSymbolicGeometrySet()
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)
Теперь создаём условное изображение, определяем его положение и устанавливаем для стиля арматурного изделия:
symbolicGeometry:AddGeometrySet2D(MakeSymbolicGeometrySet(), symbolicGeometryPlacement)
Style.SetSymbolicGeometry(symbolicGeometry)
Локальная система координат в трёхмерном пространстве.
Полный пример шаблона стиля смотрите по ссылке.