// Толщина стенки wall = 2; // Высота внешняя height = 12; // Длина основной части (внутренняя) l1 = 15; // Длина носика (внутренняя) l2 = 20; // Ширина у основания (внутренняя) w = 15; // Толщина метала бокорезов toolWidth = 2.1; // Нижняя крышка cover(0); // Верхняя крышка cover(height - wall); // Корпус difference() { linear_extrude(height) polygon( [ // Полигон идёт против часовой стрелки [0, 0], [wall, 0], [wall, l1], [w / 2 + wall, l1 + l2], // Внутренний кончик носика [w + wall, l1], [w + wall, 0], [w + wall * 2, 0], [w + wall * 2, l1], [w / 2 + wall / 2 + wall, l1 + l2 + wall], // Внешний кончик носика [w / 2 - wall / 2 + wall, l1 + l2 + wall], [0, l1], ] ); // Вырезы translate([w + wall, 0, height / 2 - toolWidth]) // Правый вырез чуть ниже середины cube([wall, l1 / 2, toolWidth]); translate([0, 0, height / 2]) // Левый вырез чуть выше середины cube([wall, l1 / 2, toolWidth]); } // Крышка module cover(z) { translate([0, 0, z]) linear_extrude(wall) polygon( [ // Полигон идёт против часовой стрелки [0, 0], [w + wall * 2, 0], [w + wall * 2, l1], [w / 2 + wall / 2 + wall, l1 + l2 + wall], [w / 2 - wall / 2 + wall, l1 + l2 + wall], [0, l1], ] ); }