


























本章以一个“带盖电子小盒”为案例,综合使用参数、模块、布尔、孔位、螺丝柱、圆角板和命令行导出。案例不追求复杂外观,而强调工程结构的可复用写法。
假设需求:
$fn = 48;
part = "assembly"; // "base", "lid", "assembly"
box_size = [90, 55, 28];
wall = 2.4;
lid_thickness = 3;
corner_r = 5;
screw_d = 3.2;
screw_post_d = 9;
clearance = 0.3;
参数应集中在文件顶部,让用户不用阅读全部几何也能修改规格。
module rounded_rect_2d(size = [40, 20], r = 4) {
hull() {
for (x = [-size[0]/2+r, size[0]/2-r])
for (y = [-size[1]/2+r, size[1]/2-r])
translate([x,y]) circle(r = r);
}
}
module rounded_box_solid(size = [60,40,20], r = 4) {
linear_extrude(height = size[2], center = true)
rounded_rect_2d([size[0], size[1]], r);
}
这里使用二维 hull 后拉伸,性能比三维圆角更可控。
function screw_positions(size, inset) = [
[-size[0]/2+inset, -size[1]/2+inset],
[ size[0]/2-inset, -size[1]/2+inset],
[ size[0]/2-inset, size[1]/2-inset],
[-size[0]/2+inset, size[1]/2-inset]
];
把孔位写成函数可以让底壳和盖板共用,避免孔位不一致。
module base_shell() {
difference() {
rounded_box_solid(box_size, corner_r);
translate([0,0,wall])
rounded_box_solid([box_size[0]-2*wall, box_size[1]-2*wall, box_size[2]], max(corner_r-wall, 1));
translate([0, -box_size[1]/2, 3]) rotate([90,0,0])
cylinder(h = wall + 1, d = 10, center = true);
}
}
开腔时内部切除体向上偏移,保留底板厚度。线缆孔作为侧面圆柱切除。
module screw_posts() {
post_h = box_size[2] - wall - lid_thickness;
for (p = screw_positions(box_size, 10))
translate([p[0], p[1], -box_size[2]/2 + wall + post_h/2])
difference() {
cylinder(h = post_h, d = screw_post_d, center = true);
cylinder(h = post_h + 1, d = screw_d, center = true);
}
}
螺丝柱要考虑打印方向和强度。孔径是否需要攻丝、热熔铜螺母或自攻螺丝,应根据工艺调整。
module base() {
union() {
base_shell();
screw_posts();
}
}
实际项目还可以加入加强筋、卡扣、定位台阶和倒角。
module lid() {
difference() {
translate([0,0,box_size[2]/2 + lid_thickness/2 + clearance])
rounded_box_solid([box_size[0], box_size[1], lid_thickness], corner_r);
for (p = screw_positions(box_size, 10))
translate([p[0], p[1], box_size[2]/2 + lid_thickness/2 + clearance])
cylinder(h = lid_thickness + 1, d = screw_d, center = true);
}
}
盖板与底壳之间使用 clearance 留出装配间隙。若要隐藏螺丝头,可加入沉孔或沉头。
module assembly() {
color("lightgray") base();
color("skyblue", 0.6) lid();
}
if (part == "base") base();
else if (part == "lid") lid();
else assembly();
命令行:
openscad -D 'part="base"' -o base.stl box.scad
openscad -D 'part="lid"' -o lid.stl box.scad
openscad -D 'part="assembly"' -o assembly.png --imgsize=1200,800 box.scad
text 添加型号和方向标识。small、medium、large 三种规格。quality 参数控制导出精度。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。