Merge pull request #171 from EmperorArthur/fix_wall_profile

Update Stacking Lip Profile
This commit is contained in:
Ruud 2024-04-18 20:07:55 +02:00 committed by GitHub
commit cf1666fa2c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 83 additions and 38 deletions

View file

@ -125,7 +125,6 @@ module gridfinityInit(gx, gy, h, h0 = 0, l = l_grid, sl = 0) {
$dh = h; $dh = h;
$dh0 = h0; $dh0 = h0;
$style_lip = sl; $style_lip = sl;
color("tomato") {
difference() { difference() {
color("firebrick") color("firebrick")
block_bottom(h0==0?$dh-0.1:h0, gx, gy, l); block_bottom(h0==0?$dh-0.1:h0, gx, gy, l);
@ -133,9 +132,8 @@ module gridfinityInit(gx, gy, h, h0 = 0, l = l_grid, sl = 0) {
} }
color("royalblue") color("royalblue")
block_wall(gx, gy, l) { block_wall(gx, gy, l) {
if ($style_lip == 0) profile_wall(); if ($style_lip == 0) profile_wall(h);
else profile_wall2(); else profile_wall2(h);
}
} }
} }
// Function to include in the custom() module to individually slice bins // Function to include in the custom() module to individually slice bins
@ -362,51 +360,76 @@ module refined_hole() {
} }
} }
module profile_wall_sub_sub() { /**
* @brief Stacking lip based on https://gridfinity.xyz/specification/
* @details Also includes a support base.
*/
module stacking_lip() {
// Technique: Descriptive constant names are useful, but can be unweildy.
// Use abbreviations if they are going to be re-used repeatedly in a small piece of code.
inner_slope = stacking_lip_inner_slope_height_mm;
wall_height = stacking_lip_wall_height_mm;
support_wall = stacking_lip_support_wall_height_mm;
s_total = stacking_lip_support_height_mm;
polygon([ polygon([
[0,0], [0, 0], // Inner tip
[d_wall/2,0], [inner_slope, inner_slope], // Go out 45 degrees
[d_wall/2,$dh-1.2-d_wall2+d_wall/2], [inner_slope, inner_slope+wall_height], // Vertical increase
[d_wall2-d_clear,$dh-1.2], [stacking_lip_depth, stacking_lip_height], // Go out 45 degrees
[d_wall2-d_clear,$dh+h_base], [stacking_lip_depth, -s_total], // Down to support bottom
[0,$dh+h_base] [0, -support_wall], // Up and in
[0, 0] // Close the shape. Tehcnically not needed.
]); ]);
} }
module profile_wall_sub() { /**
* @brief Stacking lip with a with a chamfered (rounded) top.
* @details Based on https://gridfinity.xyz/specification/
* Also includes a support base.
*/
module stacking_lip_chamfered() {
radius_center_y = h_lip - r_f1;
union() {
// Create rounded top
intersection() {
translate([0, radius_center_y, 0])
square([stacking_lip_depth, stacking_lip_height]);
offset(r = r_f1)
offset(delta = -r_f1)
stacking_lip();
}
// Remove pointed top
difference(){ difference(){
profile_wall_sub_sub(); stacking_lip();
color("red") translate([0, radius_center_y, 0])
offset(delta = d_clear) square([stacking_lip_depth*2, stacking_lip_height*2]);
translate([r_base-d_clear,$dh,0]) }
mirror([1,0,0])
profile_base();
} }
} }
module profile_wall() { /**
translate([r_base,0,0]) * @brief External wall profile, with a stacking lip.
mirror([1,0,0]) * @details Translated so a 90 degree rotation produces the expected outside radius.
difference() { */
profile_wall_sub(); module profile_wall(height_mm) {
difference() { assert(is_num(height_mm))
translate([0, $dh+h_base-d_clear*sqrt(2), 0]) translate([r_base - stacking_lip_depth, 0, 0]){
circle(r_base/2); translate([0, height_mm, 0])
offset(r = r_f1) stacking_lip_chamfered();
offset(delta = -r_f1) translate([stacking_lip_depth-d_wall/2, 0, 0])
profile_wall_sub(); square([d_wall/2, height_mm]);
}
// remove any negtive geometry in edge cases
mirror([0,1,0])
square(100*l_grid);
} }
} }
// lipless profile // lipless profile
module profile_wall2() { module profile_wall2(height_mm) {
assert(is_num(height_mm))
translate([r_base,0,0]) translate([r_base,0,0])
mirror([1,0,0]) mirror([1,0,0])
square([d_wall,$dh]); square([d_wall, height_mm]);
} }
module block_wall(gx, gy, l) { module block_wall(gx, gy, l) {

View file

@ -1,8 +1,6 @@
// height of the base // height of the base
h_base = 5; h_base = 5;
// outside rounded radius of bin
r_base = 4;
// lower base chamfer "radius" // lower base chamfer "radius"
r_c1 = 0.8; r_c1 = 0.8;
// upper base chamfer "radius" // upper base chamfer "radius"
@ -18,6 +16,11 @@ r_fo3 = 1.6 / 2;
// length of a grid unit // length of a grid unit
l_grid = 42; l_grid = 42;
// Outside rounded radius of bin
// Per spec, matches radius of upper base section.
r_base = r_fo1;
// screw hole radius // screw hole radius
r_hole1 = 1.5; r_hole1 = 1.5;
// magnet hole radius // magnet hole radius
@ -55,6 +58,25 @@ h_lip = 3.548;
d_wall2 = r_base-r_c1-d_clear*sqrt(2); d_wall2 = r_base-r_c1-d_clear*sqrt(2);
d_magic = -2*d_clear-2*d_wall+d_div; d_magic = -2*d_clear-2*d_wall+d_div;
// Stacking Lip
// Based on https://gridfinity.xyz/specification/
stacking_lip_inner_slope_height_mm = 0.7;
stacking_lip_wall_height_mm = 1.8;
stacking_lip_outer_slope_height_mm = 1.9;
stacking_lip_depth =
stacking_lip_inner_slope_height_mm +
stacking_lip_outer_slope_height_mm;
stacking_lip_height =
stacking_lip_inner_slope_height_mm +
stacking_lip_wall_height_mm +
stacking_lip_outer_slope_height_mm;
// Extracted from `profile_wall_sub_sub`.
stacking_lip_support_wall_height_mm = 1.2;
stacking_lip_support_height_mm =
stacking_lip_support_wall_height_mm + d_wall2;
// Baseplate constants // Baseplate constants
// Baseplate bottom part height (part added with weigthed=true) // Baseplate bottom part height (part added with weigthed=true)