Refine the open box

This commit is contained in:
2025-07-02 13:20:39 -04:00
committed by savanni
parent 651a905260
commit caeaa2829c
3 changed files with 113 additions and 98 deletions

View File

@@ -11,9 +11,9 @@ cutout_threshold = 1;
battery_length = 71;
battery_width = 18.75;
cell_holder_length = battery_length + wall_thickness * 2;
cell_holder_width = battery_width + wall_thickness * 2;
cell_holder_height = battery_width + wall_thickness;
battery_holder_length = battery_length + wall_thickness * 2;
battery_holder_width = battery_width + wall_thickness * 2;
battery_holder_height = battery_width + wall_thickness;
battery_contact_thickness = .6;
// battery_contact_thickness = 1;
@@ -27,11 +27,12 @@ converter_length = 22.25;
converter_height = 5;
include <./common.scad>;
include <../common/lib.scad>;
// box(20, 10, 10);
// color("blue", 0.5) cube([10, 20, 10], center = true);
/*
module cell_cradle(width, height) {
difference() {
translate([0, 0, -height / 2]) cube([width,
@@ -103,9 +104,10 @@ module battery_slot() {
}
}
module converter_box() {
module converter_slot() {
box_length = wall_thickness * 2 + converter_height;
box_width = cell_holder_width * 2 - wall_thickness;
difference() {
box(box_length, box_width, cell_holder_height);
@@ -154,5 +156,14 @@ module battery_case() {
}
battery_case();
// battery_case();
battery_slot();
*/
module battery_slot() {
open_box([battery_holder_length, battery_holder_width, battery_holder_height], bevel=1);
}
// battery_slot();
open_box([battery_holder_length, battery_holder_width, battery_holder_height], thickness = 2, bevel = 1);

96
3d-models/common/lib.scad Normal file
View File

@@ -0,0 +1,96 @@
module hexagon(r, h) {
cylinder(r = r, h = h, center = 2, $fn = 6);
}
// A rounded cube is a cube with a bevel on all of the corners.
// dimensions -- [x, y, z], centered around the origin.
// bevel -- default 0, the radius of the bevel.
module rounded_cube(dimensions, bevel = 0) {
x = dimensions[0];
y = dimensions[1];
z = dimensions[2];
adjusted_bevel = bevel*2 >= x ? x / 2
: bevel*2 >= y ? y / 2
: bevel*2 >= z ? z / 2
: bevel;
if (adjusted_bevel > 0) {
hull() {
translate([-x / 2 + adjusted_bevel, -y / 2 + adjusted_bevel, -z / 2 + adjusted_bevel]) sphere(r = adjusted_bevel);
translate([ x / 2 - adjusted_bevel, -y / 2 + adjusted_bevel, -z / 2 + adjusted_bevel]) sphere(r = adjusted_bevel);
translate([ x / 2 - adjusted_bevel, y / 2 - adjusted_bevel, -z / 2 + adjusted_bevel]) sphere(r = adjusted_bevel);
translate([-x / 2 + adjusted_bevel, y / 2 - adjusted_bevel, -z / 2 + adjusted_bevel]) sphere(r = adjusted_bevel);
translate([-x / 2 + adjusted_bevel, -y / 2 + adjusted_bevel, z / 2 - adjusted_bevel]) sphere(r = adjusted_bevel);
translate([ x / 2 - adjusted_bevel, -y / 2 + adjusted_bevel, z / 2 - adjusted_bevel]) sphere(r = adjusted_bevel);
translate([ x / 2 - adjusted_bevel, y / 2 - adjusted_bevel, z / 2 - adjusted_bevel]) sphere(r = adjusted_bevel);
translate([-x / 2 + adjusted_bevel, y / 2 - adjusted_bevel, z / 2 - adjusted_bevel]) sphere(r = adjusted_bevel);
}
} else {
cube(dimensions, center = true);
}
}
// A channel is a three-sided box. It has an open top and open ends so that wires
// could go directly through it. The dimensions specify the outer size of the box.
// dimensions -- [x, y, z], centered around the origin
// thickness -- the thickness of the walls of the box. Effectively the thickness
// should never be less then or equal to zero. The thickness subtracts from the interior
// of the box so that the exterior dimensions do not change no matter the thickness.
// bevel -- optional, the radius of the bevel
module channel(dimensions, thickness, bevel = 0) {
length = dimensions[0];
width = dimensions[1];
height = dimensions[2];
y_offset = width - thickness;
z_offset = height - thickness;
union() {
translate([0, 0, -z_offset / 2]) rounded_cube([length, width, thickness], bevel);
translate([0, -y_offset / 2, 0])
rotate([90, 0, 0])
rounded_cube([length, height, thickness], bevel);
translate([0, y_offset / 2, 0])
rotate([90, 0, 0])
rounded_cube([length, height, thickness], bevel);
}
}
module open_box(dimensions, thickness, bevel = 0) {
length = dimensions[0];
width = dimensions[1];
height = dimensions[2];
x_offset = length - thickness;
union() {
channel(dimensions, thickness, bevel);
translate([-x_offset / 2, 0, 0])
rotate([90, 0, 0])
rotate([0, 90, 0])
rounded_cube([width, height, wall_thickness], bevel);
translate([x_offset / 2, 0, 0])
rotate([90, 0, 0])
rotate([0, 90, 0])
rounded_cube([width, height, wall_thickness], bevel);
}
}
/*
module box_side_slider(dimensions) {
length = dimensions[0];
width = dimensions[1];
height = dimensions[2];
difference() {
box_face([width - wall_thickness * 2 + 4, height, wall_thickness], bevel);
translate([-1, -1, 1]) cube([4-threshold, height+2, 4-threshold]);
color("red") translate([width - wall_thickness * 2 + 1, -1, 1]) cube([4-threshold, height+2, 4-threshold]);
}
}
*/

View File

@@ -1,92 +0,0 @@
module hexagon(r, h) {
cylinder(r = r, h = h, center = 2, $fn = 6);
}
module pill(length, bevel) {
hull() {
translate([0, 0, (-length / 2) + bevel]) sphere(r = bevel);
translate([0, 0, (length / 2) - bevel]) sphere(r = bevel);
}
}
module rounded_cube(dimensions, bevel = 0) {
x = dimensions[0];
y = dimensions[1];
z = dimensions[2];
if (bevel > 0) {
hull() {
translate([-x / 2 + bevel, -y / 2 + bevel, -z / 2 + bevel]) sphere(r = bevel);
translate([ x / 2 - bevel, -y / 2 + bevel, -z / 2 + bevel]) sphere(r = bevel);
translate([ x / 2 - bevel, y / 2 - bevel, -z / 2 + bevel]) sphere(r = bevel);
translate([-x / 2 + bevel, y / 2 - bevel, -z / 2 + bevel]) sphere(r = bevel);
translate([-x / 2 + bevel, -y / 2 + bevel, z / 2 - bevel]) sphere(r = bevel);
translate([ x / 2 - bevel, -y / 2 + bevel, z / 2 - bevel]) sphere(r = bevel);
translate([ x / 2 - bevel, y / 2 - bevel, z / 2 - bevel]) sphere(r = bevel);
translate([-x / 2 + bevel, y / 2 - bevel, z / 2 - bevel]) sphere(r = bevel);
}
} else {
cube(dimensions, center = true);
}
}
module box_face(dimensions, bevel = 0) {
x = dimensions[0];
y = dimensions[1];
z = dimensions[2];
if (bevel > 0) {
translate([0, 0, z / 2])
hull() {
pill(z, bevel);
translate([x, 0, 0])
pill(z, bevel);
translate([x, y, 0])
pill(z, bevel);
translate([0, y, 0])
pill(z, bevel);
}
} else {
cube(dimensions);
}
}
module channel(length, width, height, bevel) {
union() {
box_face([length, width, wall_thickness], bevel);
translate([0, wall_thickness - bevel, bevel])
rotate([90, 0, 0])
box_face([length, height, wall_thickness], bevel);
translate([0, width + bevel, bevel])
rotate([90, 0, 0])
box_face([length, height, wall_thickness], bevel);
}
}
module box(length, width, height, bevel = 0) {
union() {
channel(length, width, height, bevel);
translate([-bevel, 0, bevel])
rotate([90, 0, 0])
rotate([0, 90, 0])
box_face([width, height, wall_thickness], bevel);
translate([length - wall_thickness + bevel, 0, bevel])
rotate([90, 0, 0])
rotate([0, 90, 0])
box_face([width, height, wall_thickness], bevel);
}
}
module box_side_slider(length, width, height) {
difference() {
box_face([width - wall_thickness * 2 + 4, height, wall_thickness], bevel);
translate([-1, -1, 1]) cube([4-threshold, height+2, 4-threshold]);
color("red") translate([width - wall_thickness * 2 + 1, -1, 1]) cube([4-threshold, height+2, 4-threshold]);
}
}