Преобразование круга в овал в opencad

Я пытаюсь создать веерный канал в opencad, сплющивая воздуховод с круглого на овальный. Есть ли способ сделать это в opencad? Если нет, есть ли другой программный способ создания 3D-модели такого типа?

Спасибо, Деннис.


person Dennis    schedule 22.10.2013    source источник


Ответы (4)


Предполагая, что под «овалом» вы подразумеваете эллипс, тогда следующее создает сплошное сужение от круга к эллипсу:

    Delta=0.01;

    module connector (height,radius,eccentricity) {
        hull() {
          linear_extrude(height=Delta)
             circle(r=radius);
          translate([0,0,height - Delta])   
             linear_extrude(height=Delta) 
                scale([1,eccentricity]) 
                   circle(r=radius);
        }
      }

      connector(20,6,0.6);

Вы можете сделать трубку, вычитая меньшую версию:

module tube(height, radius, eccentricity=1, thickness) {
     difference() {
       connector(height,radius,eccentricity);
       translate([0,0,-(Delta+thickness)]) 
         connector(height + 2* (Delta +thickness) ,radius-thickness, eccentricity);
     }
   }
   tube(20,8,0.6,2);

но толщина стенки будет неравномерной. Чтобы сделать однородную стену, используйте minkowski, чтобы добавить стену:

module tube(height, radius, eccentricity=1, thickness) {
    difference() {
      minkowski() {
        connector(height,radius,eccentricity);
        cylinder(height=height,r=thickness);
      }
    translate([0,0,-(Delta+thickness)]) 
        connector(height + 2* (Delta +thickness) ,radius, eccentricity);
    }
  }

tube(20,8,0.6,2);
person Chris Wallace    schedule 24.01.2014
comment
Хороший код! Вот модифицированная версия, которая работает и с другими формами: Delta=0,01; разъем модуля (высота, эксцентриситет) { корпус () { дети (); translate([0,0,height-Delta]) scale([1,excentricity,1]) children(); } } разъем(20,0.6) цилиндр(Дельта, r=6); перевести ([30,0,0]) коннектор (20,1.6) { куб ([6,6, дельта], центр = истина); перевести([0,10,0]) цилиндр(Дельта, r=6); } - person Scott Leslie; 23.11.2019
comment
Попытка сделать что-то другое, но это было очень полезно для понимания потока opencad. Спасибо! - person Timothy Lee Russell; 07.05.2020

Есть еще один способ, используя параметр «масштаб» в linear_extrude(). Он «масштабирует 2D-форму на это значение по высоте экструзии. Масштаб может быть скалярным или векторным» (Документация). Используя вектор с масштабным коэффициентом x и y, вы получаете желаемую модификацию:

d = 2;        // height of ellipsoid, diameter of bottom circle
t = 0.25;     // wall thickness
w = 4;        // width of ellipsoid
l = 10;       // length of extrusion

module ellipsoid(diameter, width, height) {
    linear_extrude(height = height, scale = [width/diameter,1]) circle(d = diameter); 
  }

difference() {
    ellipsoid(d,w,l);
    ellipsoid(d-2*t,w-2*t,l);
  }
person a_manthey_67    schedule 13.07.2014

Мне нравится ответ Криса Уоллеса, но в Minkwoski была ошибка, она должна быть h=Delta.

module tube(height, radius, eccentricity=1, thickness) {
    difference() {
      minkowski() {
        connector(height,radius,eccentricity);
        cylinder(h=Delta,r=thickness);
      }
    translate([0,0,-(Delta+thickness)]) 
        connector(height + 2* (Delta +thickness) ,radius, eccentricity);
    }
  }

tube(20,8,0.6,2);
person Gabriel Robinson    schedule 01.06.2021

Я не знаю, как сделать это напрямую, но могу представить, как можно приблизиться к этому с помощью ряда сложенных друг на друга срезов.

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

person jwygralak67    schedule 22.10.2013