Рассмотрим типичный алгоритм создания параметрической модели объекта. В качестве объекта выберем спортивную гантель, представленную на рис.1
Модель довольно простая. Она состоит из 3х цилиндров. Построим её, используя произвольные размеры, например так:
rotate([90,0,0])
union(){
cylinder(10,1,1, true, $fn=100); #Ручка
#translate([0,0,7])cylinder(4,4,4, true, $fn=100);
#translate([0,0,-7])cylinder(4,4,4, true, $fn=100);
}
Добавим в неё 2 параметра:
dlina - отвечает за длину рукоятки;
blin - за размер грузов слева и справа от рукоятки (сам параметр будет задавать их длину, но диаметр грузов так же должен быть задан через него).
На длину рукоятки влияет цифра, выделенная красным:
cylinder(10,1,1, true, $fn=100);
а это значит, что здесь и должен стоять параметр dlina :
dlina=10;
cylinder(dlina,1,1, true, $fn=100);
Обратим внимание на размеры грузов:
translate([0,0,7])cylinder(4,4,4, true, $fn=100);
translate([0,0,-7])cylinder(4,4,4, true, $fn=100);
Вводим параметр blin и, совершенно очевидно, что именно он и заменит все цифры, отмеченные красным цветом, и при этом сам станет равным, в нашем случае - 4:
blin=4;
translate([0,0,7])cylinder(blin,blin,blin, true, $fn=100);
translate([0,0,-7])cylinder(blin,blin,blin, true, $fn=100);
И, наконец ... Представим, что мы увеличили длину рукоятки и получили вот такое:
Из рис. видно, что рукоятка вошла внутр грузов, потому, что те не отодвинулись на соответствующее расстояние. Это значит, что параметр dlina влияет ещё и на смещение грузов, и притом не он один. Чтобы лучше понять это - рассмотрим рисунки:
На втором рисунки мы смещаем груз на половину длины ручки и ручка оказывается своим краем внутри груза. Её край находится ровно в середине груза. Поэтому, сместив груз ещё на половину толщины груза нам удаётся расположить ручку и груз ровно торцами друг к друга без пересечения. Таким образом, смещение зависит как от параметра dlina, так и от параметра blin. Опишем это в цифрах. Обратимся к самому первому коду вначале инструкции. Там видно, что dlina =10, blin =4, а величина смещения =7. Проверяем: 10/2 + 4/2 = 5 + 2 =7. Значит наша формула верна и код параметризованной гантели приобретает окончательный вид:
dlina=20;
blin=4;
rotate([90,0,0])
union(){
cylinder(dlina,1,1, true, $fn=100);
#translate([0,0,dlina/2 + blin/2]) cylinder(blin, blin, blin, true, $fn=100);
#translate([0,0,-(dlina/2 + blin/2)]) cylinder(blin, blin, blin, true, $fn=100);
}
И теперь такую модель можно даже анимировать: