Разрезать ленту Мёбиуса на четыре части с замком

3d-models openscad pre-processing

Я новичок в OpenSCAD. Раньше я работал с Rhino, но у меня больше нет лицензии, а новый Fablab, с которым я работаю, использует OpenSCAD, поэтому сейчас я изучаю OpenSCAD.

На рисунке ниже показано, что я хочу сделать. Мне нужно это, чтобы иметь возможность напечатать несколько деталей на 3D-принтере, чтобы получить ленту Мёбиуса большего размера.

3D-рендеринг ленты Мёбиуса, разбитой на четыре взаимосвязанные части

Я нашел эти скрипты:

1. /*
2. * Лента Мёбиуса
3. *
4. * r: радиус полосы
5. * w: ширина полосы
6. * t: толщина полосы
7. *
8. * Модель использует $fs to adjust the smoothness.
9.   */
10. module moebius_strip(r = 1, w = 1, t = 1) {
11.     step = $fs;
12.     for(azimuth = [0 : step : 360]) {
13.         x = r * cos(azimuth);
14.         y = r * sin(azimuth);
15.         translate([x, y, 0]) {
16.             rotate([0, azimuth/2, azimuth]) {
17.                 cube([t, step, w], center=true);
18.             }
19.         }
20.     }
21. }
22. 
23. $fs = 0.5;
24. 
25. moebius_strip(r = 30, w = 15, t = 1); 

Этот вариант выше работает, и я нашел еще один для разделения:

module mycut() {
    translate([x,y,z]) cube([w,l,h]);
}

difference() {
    myobject();
    mycut();
}

translate([u,v,w])
intersection() {
    myobject();
    mycut();
}

Я просто не знаю, как использовать эти скрипты вместе. Может кто-нибудь объяснить мне немного о том, как я могу управлять этим? Не забывайте, что я новичок!

, 👍4

Обсуждение

Здесь используются четыре разные части. С вашей точки зрения, будет ли результирующий объект лучше, если он будет состоять из четырех одинаковых ⅛ витков?, @Ray Butterworth


1 ответ


3

Разрезание на части

Чтобы разрезать кольцо на части, вы можете использовать intersection() объекта и квадранта. представляет интерес (например, с помощью куба, но клин тоже сработал бы).

/*
* Лента Мёбиуса
*
* r: радиус полосы
* w: ширина полосы
* t: толщина полосы
*
* Модель использует $fs to adjust the smoothness.
 */
module moebius_strip(r = 1, w = 1, t = 1) {
    step = $fs;
    for(azimuth = [0 : step : 360]) {
        x = r * cos(azimuth);
        y = r * sin(azimuth);
        translate([x, y, 0]) {
            rotate([0, azimuth/2, azimuth]) {
                cube([t, step, w], center=true);
            }
        }
    }
}

$fs = 0.5;

xloc=[0,1,-1,-1,1];
yloc=[0,1,1,-1,-1];
//квадрант = 4; // 1, 2, 3 или 4
for(quadrant  = [1 : 1 : 4])
intersection(){
    translate([xloc[quadrant]*10,yloc[quadrant]*10,0]) moebius_strip(r = 30, w = 15, t = 1); 
    translate([xloc[quadrant]*10,yloc[quadrant]*10,-(30+15/2)/2]) rotate([0,0,(quadrant-1)*90]) cube(30+15/2);
}

Кольцо, разрезанное на кварты, отображение со смещением

Поскольку вкладки и слоты запрашиваются, нам нужно внести некоторые коррективы.

Добавить/удалить табуляцию

Осталось только вырезать "прямоугольный" формы на интерфейсах. Для этого мы склеиваем или union() вкладку с одной стороны и выдавливаем или difference() вкладка с другой стороны, клин используется для intersection() с лентой Мёбиуса меньшей ширины.

echo(version=version());
//отладка = 0;
//explode = $preview ? 0.1 : 0.0;
//$fn = $preview ? 90 : 360;
//nearly_zero = $предварительный просмотр? 0,005: 0,0;
tol = 0.01;
/*
 * Möbius Strip
 *
 * r: radius of strip
 * w: width of strip
 * t: thickness of strip
 *
 * The model uses $fs to adjust the smoothness.
 */
module moebius_strip(r = 1, w = 1, t = 1) {
step = $preview ? 2 : 0.5;
    for(azimuth = [0 : step : 360]) {
        x = r * cos(azimuth);
        y = r * sin(azimuth);
        translate([x, y, 0]) {
            rotate([0, azimuth/2, azimuth]) {
                cube([t, step, w], center=true);
            }
        }
    }
}

module wedge(h,r,a)
{
    th=(a%360)/2;
    difference()
    {
        cylinder(h=h,r=r,center=true);
        if(th<90)
        {
            for(n=[-1,1])rotate(-th*n)translate([(r+0.5)*n,0,0])
                cube(size=[r*2+1,r*2+1,h+1],center=true);
        }
        else
        {
            intersection()
            {
                rotate(-th)translate([(r+0.5),(r+0.5),0])
                    cube(size=[r*2+1,r*2+1,h+1],center=true);
                rotate(th)translate([-(r+0.5),(r+0.5),0])
                    cube(size=[r*2+1,r*2+1,h+1],center=true);
            }
        }
    }
}

xloc=[0,1,-1,-1, 1]; // вектор, индексированный квадрантом, отрицательное значение — отрицательная ось x
yloc=[0,1, 1,-1,-1]; // вектор, проиндексированный квадрантом, отрицательное значение - это отрицательное значение оси y
offsetVal=0; // можно использовать для разнесения представления
quadrant = 1; // 1, 2, 3 или 4 соотв. для xy, -xy, -xy или xy
//for(quadrant = [1 : 1 : 4]){ // теперь закомментировано для используемого одиночного квадранта
    difference(){ // для вытягивания вкладки
        union(){ // для добавления вкладки
            intersection(){
                translate([xloc[quadrant]*offsetVal,yloc[quadrant]*offsetVal,0]) moebius_strip(r = 30, w = 15, t = 1); // Пояс Мёбиуса
                translate([xloc[quadrant]*offsetVal,yloc[quadrant]*offsetVal,-(30+15/2)/2]) rotate([0,0,(quadrant-1)*90]) cube(30+15/2); // квадратный куб
            }
            intersection(){
                moebius_strip(r = 30, w = 7.5, t = 1); // Лента Мёбиуса меньшей ширины
                rotate([0,0,(quadrant-1)*90]){
                   wedge((30+15/2), (30+15/2), 10); // пересекаемся с клином, чтобы получить выступ, который расширяет часть квадранта
                }
            }
        }
        intersection(){
            moebius_strip(r = 30, w = 7.5, t = 1+tol); // Ремень Мебиуса меньшей ширины и увеличенной толщины для лучшего вырезания негативного язычка
            rotate([0,0,(quadrant-2)*90]){
               wedge((30+15/2), (30+15/2), 10); // пересекаемся с клином, чтобы получить вкладку, которая выдавливает часть квадранта
            }
        }
    }
//}

Квадрант 1 часть с выступами

Обратите внимание, что для рендеринга (F6) требуется некоторое время, предварительный просмотр (F5) даже не отображается из-за слишком большого количества элементов. Просто измените значение quadrant = 1; на 2, 3 или 4 для других сегментов.

Квадрант из 2 частей с выступами


Обратите внимание, что изображение из вопроса не создано с помощью скрипта Мебиуса, для создания этого объекта необходимо rotate([0, azimuth/2, azimuth]) изменено на rotate([0, азимут, азимут])


,