Рассмотрим построение модели крана с помощью языка APREPRO, а именно через циклы и параметры.
ВАЖНО: при создании подобных моделей необходимо обнулять нумерацию командой compress all и объединять сущности - merge all или работать с расположением для точного отслеживания нумерации сущностей.
Построение модели
Для задания констант в командной строке наберите команды:
#{a=2} #{b=2} #{c=2} #{n=10}
Создайте фундамент с помощью поверхности с размерами {a} на {a} и удалите ее с сохранением сущностей более низкого уровня. Для этого в командную строку введите набор команд:
create surface rectangle width {a} height {a} zplane delete Surface 1 keep_lower_geometry
Объедините сущности и обнулите нумерацию. Для этого в командную строку введите:
merge all compress all
Создайте ярусы, для этого скопируйте кривые от 1 до 4 {n} раз на высоту {c}. В командную строку введите:
Curve all copy move z {c} repeat {n}
Создайте вертикальные балки между ярусами и подкосы. Для данной операции воспользуемся циклом с использованием оператора {Loop}:
#{i=0} #{Loop(n)} create curve vertex {1+4*i} {5+4*i} #вертикаль create curve vertex {2+4*i} {6+4*i} #вертикаль create curve vertex {3+4*i} {7+4*i} #вертикаль create curve vertex {4+4*i} {8+4*i} #вертикаль create curve vertex {1+4*i} {6+4*i} #подкос create curve vertex {2+4*i} {7+4*i} #подкос create curve vertex {3+4*i} {8+4*i} #подкос create curve vertex {4+4*i} {5+4*i} #подкос #{i++} #{EndLoop}
Логика построения несущих опор и подкосов на примере одного яруса (одной итерации цикла):
Объедините сущности и обнулите нумерацию. Для этого в командную строку введите:
merge all compress all
Создание башни происходит через параметры:
- сторон башенного крана {a}
- начальной высоты башни {n*c}
- высоты башни {hb}
Для задания константы в командной строке наберите:
#{hb=3}
Создайте башню, для этого в командную строку введите:
create curve location {a/2} {a/2} {n*c} location {a/8} {a/8} {n*c+hb} create curve location {a/2} {-a/2} {n*c} location {a/8} {-a/8} {n*c+hb} create curve location {-a/2} {-a/2} {n*c} location {-a/8} {-a/8} {n*c+hb} create curve location {-a/2} {a/2} {n*c} location {-a/8} {a/8} {n*c+hb} create curve location {-a/8} {a/8} {n*c+hb} location {a/8} {a/8} {n*c+hb} create curve location {a/8} {a/8} {n*c+hb} location {a/8} {-a/8} {n*c+hb} create curve location {a/8} {-a/8} {n*c+hb} location {-a/8} {-a/8} {n*c+hb} create curve location {-a/8} {-a/8} {n*c+hb} location {-a/8} {a/8} {n*c+hb}
Объедините сущности и обнулите нумерацию. Для этого в командную строку введите:
merge all compress all
Создайте стрелу с зазором {0.1*a}.
Для задания констант в командной строке наберите:
#{e=7} #{b=2} #{hs=1} #{i=0} #{j=1}
Для построения стрелы в командную строку введите набор команд:
#{Loop(e)} create curve location {a/2+a*0.1+b*i} {a/2} {n*c} location {a/2+a*0.1+b*i} {-a/2} {n*c} #{If(j==e)} #{Break} #{EndIf} create curve location {a/2+a*0.1+b*i} {-a/2} {n*c} location {a+a*0.1+b*i} {0} {n*c+hs} create curve location {a+a*0.1+b*i} {0} {n*c+hs} location {a/2+a*0.1+b*i} {a/2} {n*c} #{i++} #{j++} #{EndLoop}
Логика построения стрелы на примере одного цикла, последняя операция создает лишь одну горизонтальную кривую:
Для построения оставшихся подкосов стрелы в командную строку введите:
#{j=1} #{e1=e-1} #{Loop(e1)} create curve location {a/2+a*0.1+e*b-b*j} {-a/2} {n*c} location {a*0.1+e*b-b*j} {0} {n*c+hs} create curve location {a*0.1+e*b-b*j} {0} {n*c+hs} location {a/2+a*0.1+e*b-b*j} {a/2} {n*c} #{j++} #{EndLoop}
Логика построения оставшихся подкосов стрелы на примере одного цикла:
Для построения дополнительных подкосов в командную строку введите набор команд:
#{i=1} #{j=2} #{Loop(e)} create curve location {a/2+a*0.1+b*(i-1)} {a/2} {n*c} location {a/2+a*0.1+b+b*(i-1)} {a/2} {n*c} create curve location {a/2+a*0.1+b*(i-1)} {-a/2} {n*c} location {a/2+a*0.1+b+b*(i-1)} {-a/2} {n*c} #{If(j==e)} #{Break} #{EndIf} create curve location {a+a*0.1+b*(i-1)} {0} {n*c+hs} location {a+a*0.1+b+b*(i-1)} {0} {n*c+hs} #{i++} #{j++} #{EndLoop}
Логика построения дополнительных подкосов на примере одного цикла:
Объедините сущности и обнулите нумерацию. Для этого в командную строку введите:
merge all compress all
Ниже приведён полный код программы:
reset #{a=2} #{b=2} #{c=2} #{n=10} create surface rectangle width {a} height {a} zplane delete Surface 1 keep_lower_geometry merge all compress all Curve all copy move z {c} repeat {n} #{i=0} #{Loop(n)} create curve vertex {1+4*i} {5+4*i} create curve vertex {2+4*i} {6+4*i} create curve vertex {3+4*i} {7+4*i} create curve vertex {4+4*i} {8+4*i} create curve vertex {1+4*i} {6+4*i} create curve vertex {2+4*i} {7+4*i} create curve vertex {3+4*i} {8+4*i} create curve vertex {4+4*i} {5+4*i} #{i++} #{EndLoop} merge all compress all #{hb=3} create curve location {a/2} {a/2} {n*c} location {a/8} {a/8} {n*c+hb} create curve location {a/2} {-a/2} {n*c} location {a/8} {-a/8} {n*c+hb} create curve location {-a/2} {-a/2} {n*c} location {-a/8} {-a/8} {n*c+hb} create curve location {-a/2} {a/2} {n*c} location {-a/8} {a/8} {n*c+hb} create curve location {-a/8} {a/8} {n*c+hb} location {a/8} {a/8} {n*c+hb} create curve location {a/8} {a/8} {n*c+hb} location {a/8} {-a/8} {n*c+hb} create curve location {a/8} {-a/8} {n*c+hb} location {-a/8} {-a/8} {n*c+hb} create curve location {-a/8} {-a/8} {n*c+hb} location {-a/8} {a/8} {n*c+hb} merge all compress all #{e=7} #{b=2} #{hs=1} #{i=0} #{j=1} #{Loop(e)} create curve location {a/2+a*0.1+b*i} {a/2} {n*c} location {a/2+a*0.1+b*i} {-a/2} {n*c} #{If(j==e)} #{Break} #{EndIf} create curve location {a/2+a*0.1+b*i} {-a/2} {n*c} location {a+a*0.1+b*i} {0} {n*c+hs} create curve location {a+a*0.1+b*i} {0} {n*c+hs} location {a/2+a*0.1+b*i} {a/2} {n*c} #{i++} #{j++} #{EndLoop} #{j=1} #{e1=e-1} #{Loop(e1)} create curve location {a/2+a*0.1+e*b-b*j} {-a/2} {n*c} location {a*0.1+e*b-b*j} {0} {n*c+hs} create curve location {a*0.1+e*b-b*j} {0} {n*c+hs} location {a/2+a*0.1+e*b-b*j} {a/2} {n*c} #{j++} #{EndLoop} #{i=1} #{j=2} #{Loop(e)} create curve location {a/2+a*0.1+b*(i-1)} {a/2} {n*c} location {a/2+a*0.1+b+b*(i-1)} {a/2} {n*c} create curve location {a/2+a*0.1+b*(i-1)} {-a/2} {n*c} location {a/2+a*0.1+b+b*(i-1)} {-a/2} {n*c} #{If(j==e)} #{Break} #{EndIf} create curve location {a+a*0.1+b*(i-1)} {0} {n*c+hs} location {a+a*0.1+b+b*(i-1)} {0} {n*c+hs} #{i++} #{j++} #{EndLoop} merge all compress all
Создание блоков
Так как кривые имеют разные сечения, то их необходимо добавлять в разные блоки. Кривые будем добавлять в блоки в соответствии с их номером или координатой центра тяжести сущности.
ВАЖНО: блоки должны иметь правильную последовательность создания и не содержать дубликаты элементов (команда - set duplicate block elements off).
Для удобства перенесем геометрическую модель в положительную область. Для этого в командную строку введите:
move Curve all midpoint x {a/2} y {a/2} include_merged
Создайте первый блок для ярусов башни. В него будут добавляться кривые, начиная с 1 до 4*(n+1) (оператором «до» является команда to). В командную строку введите:
set duplicate block elements off block 1 add curve 1 to {4*(n+1)}
Создайте второй блок для стрелы. В данный блок будут добавляться кривые, у которых координата центра тяжести по Х имеет большую величину, чем {a/2+a/2}. Для этого в командную строку введите:
set duplicate block elements off block 2 add curve with x_coord>{a/2+a/2}
Создайте третий блок для башни. Аналогично, как было сделано в блоке 2, но только по оси Z, для этого в командную строку введите:
set duplicate block elements off block 3 add curve with z_coord>{c*n}
Создайте четвертый блок для подкосов. В данном блоке будут использоваться два условия для осей X и Y и команда «except», которая исключает кривые, удовлетворяющие условию. Введите в командную строку команду для условия по оси X:
set duplicate block elements off block 4 add curve with x_coord>{0.1} except with x_coord={a/2+a/2}
Для условия по оси Y введите в командную строку, команду set duplicate block elements off еще раз можно не прописывать, для блока 4 это было сделано выше:
block 4 add curve with y_coord>{0.1} except with y_coord={a/2+a/2}
Так как блоки создавались с правильной последовательностью, то для создания пятого блока воспользуемся командой - all.
Создайте пятый блок для опорных стержней. В данный блок будут добавляться все оставшиеся кривые. В командную строку введите:
set duplicate block elements off block 5 add curve all
Ниже приведён полный код программы:
move Curve all midpoint x {a/2} y {a/2} include_merged set duplicate block elements off block 1 add curve 1 to {4*(n+1)} set duplicate block elements off block 2 add curve with x_coord>{a/2+a/2} set duplicate block elements off block 3 add curve with z_coord>{c*n} set duplicate block elements off block 4 add curve with x_coord>{0.1} except with x_coord={a/2+a/2} block 4 add curve with y_coord>{0.1} except with y_coord={a/2+a/2} set duplicate block elements off block 5 add curve all
Выводы:
- Если дублирование не включено (команда - set duplicate block elements off), то все кривые, принадлежащие блокам, не будут добавляться в новые;
- Если есть необходимость добавления большого количества кривых, необязательно делать с помощью одной команды с условиями выбора, можно добавлять их постепенно, для этого обязательно нужно указывать ID блока.
