Руководство пользователя по OpenSCAD/Примеры проектов с комментариями

Материал из Викиучебника — открытых книг для открытого мира

Двенадцатигранник (додекаэдр)[править]

The Dodecahedron as rendered from the example.
 //создаем двенадцатигранник (додекаэдр) пересечением 6 блоков
 module dodecahedron(height) 
 {
 	scale(height) //масштабируем по параметру height
 	{
 		intersection(){
 			//делаем куб
 			cube([2,2,1], center = true); 
 			intersection_for(i=[0:4]) //зацикливаем i от 0 до 4, пересекаем результат
 			{ 
 				//делаем куб, поворачиваем его на 116.565 градусов вокруг оси X,
 				//затем на 72*i градуса вокруг оси Z
 				rotate([0,0,72*i])
 					rotate([116.565,0,0])
 					cube([2,2,1], center = true); 
 			}
 		}
 	}
 }
 //создаем "снеговика" из 3 двенадцатигранников
 //вызываем модуль с параметром height=1 и смещаемся вверх на 1.5
 translate([0,0,2])dodecahedron(1); 
 //вызываем модуль с параметром height=2
 dodecahedron(2); 
 //вызываем модуль с параметром height=4 и смещаемся вниз на 3
 translate([0,0,-4])dodecahedron(4);

Ограничительная рамка[править]

Ограничительная рамка применяется к эллипсоиду
 // модуль для определения ограничительной рамки из пересекающихся прогнозы
 module BoundingBox()
 {
 	intersection()
 	{
 		translate([0,0,0])
 		linear_extrude(height = 1000, center = true, convexity = 10, twist = 0) 
 		projection(cut=false) intersection()
 		{
 			rotate([0,90,0]) 
 			linear_extrude(height = 1000, center = true, convexity = 10, twist = 0) 
 			projection(cut=false) 
 			rotate([0,-90,0]) 
 			children(0);
 
 			rotate([90,0,0]) 
 			linear_extrude(height = 1000, center = true, convexity = 10, twist = 0) 
 			projection(cut=false) 
 			rotate([-90,0,0]) 
 			children(0);
 		}
 		rotate([90,0,0]) 
 		linear_extrude(height = 1000, center = true, convexity = 10, twist = 0) 
 		projection(cut=false) 
 		rotate([-90,0,0])
 		intersection()
 		{
 			rotate([0,90,0]) 
 			linear_extrude(height = 1000, center = true, convexity = 10, twist = 0) 
 			projection(cut=false) 
 			rotate([0,-90,0]) 
 			children(0);
 
 			rotate([0,0,0]) 
 			linear_extrude(height = 1000, center = true, convexity = 10, twist = 0) 
 			projection(cut=false) 
 			rotate([0,0,0]) 
 			children(0);
 		}
 	}
 }
 
 // Тест модуль на эллипсоиде
 translate([0,0,40]) scale([1,2,3]) sphere(r=5);
 BoundingBox() scale([1,2,3]) sphere(r=5);

Муфта с зажимом цилиндрических валов и закругленными скосами[править]

Муфта с зажимом цилиндрических валов и закругленными скосами
// диаметр первого вала
one_wall = 5;
// диаметр второго вала
two_wall = 8;

// диаметр болтов стяжки
bolt = 3;
// Диамтр описанной окружности шестигранника, для гайки стажки
screw_nut_out_circle = 6;

// диаметр закругления цилиндра(фаска)
chamfer = 3;

// Определение внешнего диаметра муфты
ext_diam = max(one_wall, two_wall) + bolt * 3;

// высота обжимного цилиндра под каждый вал соответственно
height_one_wall = 15;
height_two_wall = 15;

// разрешение поверхностей
fn = 100;
// фикс высоты для устранения искажений поверхностей при вырезании
// при выставленном 0 разница ощутима
// фикс смещения рассчитан на то что первый вал всегда меньше или равен второму 
qwe = 0.1;

module coupling()
{
	difference()
	{
		// создаем основную конструкцию
		difference()
		{
			// создаем основной цилиндр
			// если в $fn задать значение 6, то в сечением цилиндра будет не круг а шестигранник
			// грубо говоря $fn задает количество граней из которых формируется поверхность
			// в этом и смысл этого параметра
			cylinder(height_one_wall + height_two_wall, r=ext_diam/2, $fn=fn);

			// вырезаем из него первый вал (с фиксированными смещением и высотой)
			translate([0,0,-qwe])
				cylinder(height_one_wall + qwe * 2, r=one_wall/2, $fn=fn);

			// создаем второй вал со смещением по оси Z на высоту первого (также учитываем фикс)
			translate([0,0, height_one_wall])
				cylinder(height_two_wall + qwe, r=two_wall/2, $fn=fn);
		}

		// создаем скос (закругленную фаску в основании)
		// затем этот скос исключается из основного цилиндра
		difference()
		{
			// создаем кольцо прямоугольной формы на поверх грани для которой будет сформирован скос
			rotate_extrude(convexity=10, $fn=fn)
				translate([ext_diam/2 - chamfer + qwe, -qwe, 0])
					square([chamfer, chamfer]);

			// исключаем из него кольцо круглой формы со смещением
			rotate_extrude(convexity=10, $fn=fn)
				translate([ext_diam/2 - chamfer + qwe, chamfer - qwe*2, 0])
					circle(chamfer);
		}

		//  точно такую же операцию проделываем  с другой стороны цилиндра
		difference()
		{
			rotate_extrude(convexity=10, $fn=fn)
				translate([ext_diam/2 - chamfer + qwe, height_one_wall + height_two_wall +qwe - chamfer, 0])
					square([chamfer, chamfer]);

			rotate_extrude(convexity=10, $fn=fn)
				translate([ext_diam/2 - chamfer + qwe, height_one_wall + height_two_wall +qwe*2 - chamfer, 0])
					circle(chamfer);
		}
		
		// вырезаем зажимной прорез, предварительно повернув его на 30 градусов
		// на случай если у основного цилиндра задать разрешение $fn=6
		// чтобы прорез оказался в в угле шестигранника
		rotate(30, [0,0,1])
			translate([-0.5, -1-max(one_wall, two_wall)/2,-qwe])
				cube([1,ext_diam, height_one_wall + height_two_wall + qwe * 2]);

		// вырезаем выемку под стяжной болт первого вала
		bolt(height_one_wall/2, false);

		// вырезаем вырезку под болт второго вала
		bolt(height_one_wall + height_two_wall/2, true);
	}
}
// создаем выемки под винт и гайку для сжатия валов
module bolt(height, rate=false)
{
	// задаем нужный наклон 
	rotate(90, [1,0,0])
	rotate(120, [0,1,0])
		union ()
		{
			// отверстике сквозное
			translate([ext_diam/2 - bolt, height, -ext_diam/2])
				cylinder(ext_diam, r=bolt/2, $fn=fn);

			// выемка для посадки головки винта
			translate([ext_diam/2 - bolt, height, rate ? -ext_diam/2 : ext_diam/4])
				cylinder(ext_diam/4, r=bolt*2/2, $fn=fn);

			// выемка для посадки шестигранной гайки
			translate([ext_diam/2 - bolt, height, rate ? ext_diam/4: -ext_diam/2])
				// разворачиваем на 30 радусов чтобы грань шестигранника
				// не была отвесной на 90градусов, при 3Д печати
				rotate(30, [0,0,1])
					cylinder(ext_diam/4, r=screw_nut_out_circle/2, $fn=6);
		}
   }
   coupling();