diff --git a/gridfinity-rebuilt-baseplate.scad b/gridfinity-rebuilt-baseplate.scad index b9885de..202dbcb 100644 --- a/gridfinity-rebuilt-baseplate.scad +++ b/gridfinity-rebuilt-baseplate.scad @@ -50,22 +50,29 @@ fity = 0; // [-1:0.1:1] // baseplate styles style_plate = 0; // [0: thin, 1:weighted, 2:skeletonized, 3: screw together, 4: screw together minimal] -// enable magnet hole -enable_magnet = true; // hole styles style_hole = 2; // [0:none, 1:countersink, 2:counterbore] +/* [Magnet Hole] */ +// Baseplate will have holes for 6mm Diameter x 2mm high magnets. +enable_magnet = true; +// Magnet holes will have crush ribs to hold the magnet. +crush_ribs = true; +// Magnet holes will have a chamfer to ease insertion. +chamfer_holes = true; + +hole_options = bundle_hole_options(refined_hole=false, magnet_hole=enable_magnet, screw_hole=false, crush_ribs=crush_ribs, chamfer=chamfer_holes, supportless=false); // ===== IMPLEMENTATION ===== // color("tomato") -gridfinityBaseplate(gridx, gridy, l_grid, distancex, distancey, style_plate, enable_magnet, style_hole, fitx, fity); +gridfinityBaseplate(gridx, gridy, l_grid, distancex, distancey, style_plate, hole_options, style_hole, fitx, fity); // ===== CONSTRUCTION ===== // -module gridfinityBaseplate(gridx, gridy, length, dix, diy, sp, sm, sh, fitx, fity) { +module gridfinityBaseplate(gridx, gridy, length, dix, diy, sp, hole_options, sh, fitx, fity) { assert(gridx > 0 || dix > 0, "Must have positive x grid amount!"); assert(gridy > 0 || diy > 0, "Must have positive y grid amount!"); @@ -75,7 +82,7 @@ module gridfinityBaseplate(gridx, gridy, length, dix, diy, sp, sm, sh, fitx, fit dx = max(gx*length-bp_xy_clearance, dix); dy = max(gy*length-bp_xy_clearance, diy); - off = calculate_offset(sp, sm, sh); + off = calculate_offset(sp, hole_options[1], sh); offsetx = dix < dx ? 0 : (gx*length-bp_xy_clearance-dix)/2*fitx*-1; offsety = diy < dy ? 0 : (gy*length-bp_xy_clearance-diy)/2*fity*-1; @@ -105,10 +112,8 @@ module gridfinityBaseplate(gridx, gridy, length, dix, diy, sp, sm, sh, fitx, fit hole_pattern(){ - if (sm) { - mirror([0, 0, 1]) - block_base_hole(bundle_hole_options(magnet_hole=true)); - } + mirror([0, 0, 1]) + block_base_hole(hole_options); translate([0,0,-off-TOLLERANCE]) if (sh == 1) cutter_countersink(); diff --git a/tests/gridfinity-rebuilt-baseplate.json b/tests/gridfinity-rebuilt-baseplate.json index 86b19a3..ee97ef5 100644 --- a/tests/gridfinity-rebuilt-baseplate.json +++ b/tests/gridfinity-rebuilt-baseplate.json @@ -8,6 +8,8 @@ "d_screw_head": "5", "distancex": "0", "distancey": "0", + "chamfer_holes": "true", + "crush_ribs": "true", "enable_magnet": "true", "fitx": "0", "fity": "0", diff --git a/tests/test_baseplate.py b/tests/test_baseplate.py index 0593061..9984310 100644 --- a/tests/test_baseplate.py +++ b/tests/test_baseplate.py @@ -38,13 +38,42 @@ class TestBasePlateHoles(unittest.TestCase): self.scad_runner.camera_arguments = self.scad_runner.camera_arguments.with_rotation(CameraRotations.AngledTop) self.scad_runner.create_image([], Path('no_holes_top.png')) - def test_only_magnet_holes(self): + def test_plain_magnet_holes(self): vars = self.scad_runner.parameters vars["enable_magnet"] = True vars["style_hole"] = 0 - self.scad_runner.create_image([], Path('only_magnet_holes_bottom.png')) + vars["chamfer_holes"] = False + vars["crush_ribs"] = False + self.scad_runner.create_image([], Path('magnet_holes_bottom.png')) self.scad_runner.camera_arguments = self.scad_runner.camera_arguments.with_rotation(CameraRotations.AngledTop) - self.scad_runner.create_image([], Path('only_magnet_holes_top.png')) + self.scad_runner.create_image([], Path('plain_magnet_holes_top.png')) + + def test_chamfered_magnet_holes(self): + vars = self.scad_runner.parameters + vars["enable_magnet"] = True + vars["style_hole"] = 0 + vars["chamfer_holes"] = True + vars["crush_ribs"] = False + self.scad_runner.camera_arguments = self.scad_runner.camera_arguments.with_rotation(CameraRotations.AngledTop) + self.scad_runner.create_image([], Path('chamfered_magnet_holes.png')) + + def test_ribbed_magnet_holes(self): + vars = self.scad_runner.parameters + vars["enable_magnet"] = True + vars["style_hole"] = 0 + vars["chamfer_holes"] = False + vars["crush_ribs"] = True + self.scad_runner.camera_arguments = self.scad_runner.camera_arguments.with_rotation(CameraRotations.AngledTop) + self.scad_runner.create_image([], Path('ribbed_magnet_holes.png')) + + def test_chamfered_and_ribbed_magnet_holes(self): + vars = self.scad_runner.parameters + vars["enable_magnet"] = True + vars["style_hole"] = 0 + vars["chamfer_holes"] = True + vars["crush_ribs"] = True + self.scad_runner.camera_arguments = self.scad_runner.camera_arguments.with_rotation(CameraRotations.AngledTop) + self.scad_runner.create_image([], Path('chamfered_and_ribbed_magnet_holes.png')) def test_only_countersunk_screw_holes(self): vars = self.scad_runner.parameters @@ -65,6 +94,8 @@ class TestBasePlateHoles(unittest.TestCase): def test_magnet_and_countersunk_screw_holes(self): vars = self.scad_runner.parameters vars["enable_magnet"] = True + vars["chamfer_holes"] = False + vars["crush_ribs"] = False vars["style_hole"] = 1 self.scad_runner.create_image([], Path('magnet_and_countersunk_screw_holes_bottom.png')) self.scad_runner.camera_arguments = self.scad_runner.camera_arguments.with_rotation(CameraRotations.AngledTop) @@ -73,6 +104,8 @@ class TestBasePlateHoles(unittest.TestCase): def test_magnet_and_counterbored_screw_holes(self): vars = self.scad_runner.parameters vars["enable_magnet"] = True + vars["chamfer_holes"] = False + vars["crush_ribs"] = False vars["style_hole"] = 2 self.scad_runner.create_image([], Path('magnet_and_counterbored_screw_holes_bottom.png')) self.scad_runner.camera_arguments = self.scad_runner.camera_arguments.with_rotation(CameraRotations.AngledTop)