Использование if с разницей в openSCAD - PullRequest
0 голосов
/ 29 августа 2018

Я хочу создать модель в openSCAD а затем я хочу вырезать необязательно вырезать отверстие в нем (используя разницу)

так что я могу сделать что-то вроде

module model_with_hole( hole=false) {
   difference() {
         //the_model()
         if (hole) {
            //the_hole()
         }
   }
}

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

другой альтернативой будет:

module model_with_hole( hole=false) {
   if (hole) {
       difference() {
         //the_model()
         //the_hole()
       }
   }
   else {
         //the_model()  
   }
}

Но на самом деле это говорит что-то вроде "если вам нужно отверстие, то визуализируйте модель и удалите отверстие, в противном случае просто визуализируйте модель".

Есть ли способ закодировать это так, что вызов для рендеринга модели будет существовать только один раз, а разностное действие произойдет только в случае необходимости?

if (hole) {the_hole()} the_model();

Таким образом, коду будет больше походить на то, чтобы сказать, визуализировать модель и, если требуется, вырезать дыру?

1 Ответ

0 голосов
/ 01 сентября 2018

Возможно, это то, что вы хотите: добавьте параметры отверстий в вектор и используйте этот вектор в цикле for в difference(). Если вектор пустой, из модели ничего не вычитается, попробуйте четыре примера:

module model(l) {
    cube(size = l, center = true);
}

module hole(pos, dim) {
    translate(pos) cylinder(h = dim[0] + 0.1, r = dim[1], center = true);
}

// holes = [];
// holes = [[[0,0,0],[10, 1]]];
holes = [[[-2.5,-2.5,0],[10, 0.5]], [[0,0,0],[10, 1]], [[2.5,2.5,0],[10, 1.5]]];
// holes = [[[-2.5,-2.5,0],[10, 1]], [[-2.5,2.5,0],[10, 1]], [[2.5,2.5,0],[10, 1]], [[2.5,-2.5,0],[10, 1]], [[0,0,0],[10, 1]]];

difference() {
    model(10);
    for (h = holes) hole(h[0], h[1]);
}
...