Как добавить отверстие 2х2 мм в файл SCAD?
Я пытаюсь изменить этот код, чтобы создать небольшое отверстие размером 2 x 2 мм на короткой стороне коробки (чтобы вместить два провода, выходящие из батареи):
// Какой из них вы бы хотели увидеть?
part = "both"; // [box:Только коробка, верх: Только верхняя крышка, оба: коробка и верхняя крышка]
// Размер сопла вашего принтера в мм
nozzle_size = 0.35;
// Количество стенок, которые должен иметь отпечаток
number_of_walls = 3; // [1:5]
// Допуск (используйте 0,2 для FDM)
tolerance = 0.2; // [0.1:0.1:0.4]
// Внутренний размер X в мм
interior_x=70;
// Внутренний размер Y в мм
interior_y=21;
// Внутренний размер Z в мм
interior_z=17;
// радиус внутреннего угла в мм
radius=0; // [0:20]
// Какую часть плоской стороны X должен занимать крючок? (0 — без крючка)
x_hook_fraction = 0.5; // [0:0.1:1.0]
// Какую часть плоской стороны Y должен занимать крючок? (0 — без крючка)
y_hook_fraction = 0.5; // [0:0.1:1.0]
// Какая часть крючков должна иметь прорезь позади них? (0 — нет слота)
slot_length = 0.7; // [0:0.1:1]
/* Hidden */
$fn=100;
wall_thickness=nozzle_size*number_of_walls;
// Внешние размеры
x = interior_x + 2 * wall_thickness;
y = interior_y + 2 * wall_thickness;
z = interior_z + 2 * wall_thickness;
hook_thickness = 3 * nozzle_size;
top_cover_wall_thickness = hook_thickness + wall_thickness;
y_hook_length = (y - 2 * radius) * y_hook_fraction;
x_hook_length = (x - 2 * radius) * x_hook_fraction;
module box_interior () {
offset(r=radius) {
square([interior_x-2*radius, interior_y-2*radius], center=true);
}
}
module box_exterior () {
offset(r=wall_thickness) {
box_interior();
}
}
module bottom_box () {
difference(){
// Сплошной ящик
linear_extrude(z-wall_thickness){
box_exterior();
}
// Выдолбить
translate([0,0,wall_thickness]) linear_extrude(z){
box_interior();
}
left_slot();
rotate([180,180,0]) left_slot(); // правый слот
front_slot();
rotate([180,180,0]) front_slot(); // задний слот
}
left_hook(); // левый хук
rotate([180,180,0]) left_hook(); // правый хук
front_hook(); // передний крючок
rotate([180,180,0]) front_hook(); // задний хук
}
module left_hook () {
translate([(x-2*wall_thickness)/2,-y_hook_length/2,z-wall_thickness]) rotate([0,90,90]) {
base_hook(y_hook_length);
}
}
module front_hook () {
translate([-x_hook_length/2,-y/2+wall_thickness,z-wall_thickness]) rotate([90,90,90]) {
base_hook(x_hook_length);
}
}
module base_hook (hook_length) {
difference(){
linear_extrude(hook_length){
polygon(points=[[0,0],[2*hook_thickness,0],[hook_thickness,hook_thickness]]);
}
translate([hook_thickness, hook_thickness, 0]) rotate([45,0,0]) cube(2*hook_thickness, center=true);
translate([hook_thickness, hook_thickness, hook_length]) rotate([45,0,0]) cube(2*hook_thickness, center=true);
}
}
module left_slot () {
slot_length = y_hook_length*slot_length;
epsilon=2; // убеждаемся, что он определенно выступает
translate([x/2+epsilon,-slot_length/2,z]) rotate([0,90,90]) {
cube([2*hook_thickness, wall_thickness+epsilon, slot_length]);
}
}
module front_slot () {
slot_length = x_hook_length*slot_length;
epsilon=2; // убеждаемся, что он определенно выступает
translate([-slot_length/2,-y/2-epsilon,z]) rotate([90,90,90]) {
cube([2*hook_thickness, wall_thickness+epsilon, slot_length]);
}
}
module right_groove () {
translate([-tolerance/2+(x-2*wall_thickness)/2,-y_hook_length/2,wall_thickness+hook_thickness*2]) rotate([0,90,90]) linear_extrude(y_hook_length) {
base_groove();
}
}
module front_groove () {
translate([-x_hook_length/2,-y/2+wall_thickness+tolerance/2,wall_thickness+hook_thickness*2]) rotate([90,90,90]) linear_extrude(x_hook_length){
base_groove();
}
}
module base_groove () {
polygon(points=[[0,0],[0, -1], [2*hook_thickness, -1],[2*hook_thickness,0],[hook_thickness,hook_thickness]]);
}
module top_cover () {
// Верхняя грань
linear_extrude(wall_thickness) {
box_exterior();
}
difference(){
// Стенка верхней крышки
inset = wall_thickness + tolerance/2;
linear_extrude(wall_thickness+hook_thickness*2){
offset(r=-inset) {
box_exterior();
}
}
// Выдолбить
translate([0,0,wall_thickness]) linear_extrude(z){
offset(r=-wall_thickness*2) {
offset(r=-inset) {
box_exterior();
}
}
}
right_groove();
rotate([180,180,0]) right_groove();
front_groove();
rotate([180,180,0]) front_groove();
}
}
// левый_хук();
print_part();
module print_part() {
if (part == "box") {
bottom_box();
} else if (part == "top") {
top_cover();
} else if (part == "both") {
both();
} else {
both();
}
}
module both() {
translate([0,-(y/2+wall_thickness),0]) bottom_box();
translate([0,+(y/2+wall_thickness),0]) top_cover();
}
Я пробовал что-то подобное, но это не сработало:
// Добавляем отверстие на короткой стороне коробки
translate([interior_x / 2, interior_y - hole_size / 2, interior_z / 2])
cube([hole_size, hole_size, interior_z], center=true);
@stormist, 👍2
2 ответа
Лучший ответ:
▲ 1
Вам нужно использовать функцию difference()
в OpenSCAD, чтобы вычесть одну или несколько 3D-фигур из другой. Источник: Документация для функции разницы().
Для справки: ваш код уже делает это несколько раз. Примерно так:
module bottom_box () {
difference(){
// Существующий код...
// Вычитаем дырку
translate([hole_position_x, hole_position_y, hole_position_z])
cube([hole_size, hole_depth, hole_size], center=true);
}
// Остальная часть кода...
}
Простые примеры кубов
Вот пример Openscad, который можно протестировать в вашем браузере, представляющий простой куб с отверстием и без него (внизу):
Модель без отверстия
cube_size = 20;
module simple_cube() {
cube(cube_size);
}
simple_cube();
Модель с дыркой
cube_size = 20;
hole_size = 2;
module cube_with_hole() {
difference() {
cube(cube_size);
translate([cube_size / 2, cube_size / 2, 0])
cube([hole_size, hole_size, cube_size], center=true);
}
}
cube_with_hole();
,
@Bob Ortiz
▲ 0
Вам также понадобится добавлять эту функцию всякий раз, когда вам понадобятся отверстия минимального размера, в противном случае они ВСЕГДА будут слишком маленькими.
// Сегменты, используемые для окружностей/цилиндров, имеют свои *конечные точки* на радиусе. Это означает, что
// цилиндры, используемые для отверстий, будут слишком малы; *средние точки* должны быть на радиусе,
// не *конечные точки*. Эта функция возвращает радиусы правильного размера для отверстий с требуемым минимальным радиусом.
function midpoint_radius (endpoint_radius, num_facets) = endpoint_radius / cos(360/(num_facets*2));
Бонусные процедуры
// Устанавливает поворот на основе желаемой конечной точки
function rotateto(x=1,y=1,z=1) = [0,acos(z/norm([x,y,z])),atan2(y,x)];
// Автоматически переключается на желаемое качество круга в зависимости от нажатия клавиши <F5> или <F6>.
draft_quality = 12; // [12:6:360]
final_quality = 72; // [12:6:360]
smoothness = $preview ? draft_quality : final_quality;
// (Circles are divided in $fn сегментов линии.)
$fn = smoothness;
,
@Keith Olson
Смотрите также:
- Библиотека OpenSCAD для пустого пространства/отверстий
- Рендер OpenSCAD (F6) завершается ошибкой "ERROR: CGAL error in CGAL_Nef_polyhedron3()"
- Создание "куска пирога" в OpenSCAD?
- Каков самый простой способ изменить/изменить размер объекта внутри STL-файла?
- Будут ли 3D напечатные игральные кости честными?
- Действительно ли 3D-принтеры достигают точности 50 микрон (0,05 мм)?
- Файл слишком большой, чтобы открыть его в Tinkercad. Как уменьшить его?
- Являются ли самопересекающиеся сетки грязными с точки зрения 3D-печати?
Я добавил это в нижнее поле, но отверстия не появилось. Не знаю, где это портится., @stormist
Вы уверены, что все переменные верны и позиционирование правильное? Я бы отлаживал это шаг за шагом. Сначала сделайте фигуру сплошной и окрашенной в очевидный цвет, затем расположите ее правильно, а затем попытайтесь включить ее в функцию различия., @Bob Ortiz
@stormist Отверстие должно быть длиннее коробки. Отверстие должно выступать за коробку с обеих сторон (чтобы сдвинуть отверстие, возможно, понадобится перевод)., @Uwe
Измените эту строку: куб([дырка_размер, дырка_размер, куб_размер], центр=истина); на это: куб([hole_size,hole_size, Cube_size +hole_size], center=true); для более длинного выступающего отверстия., @Uwe