rounded_cube.scad
1 /** 2 * rounded_cube.scad 3 * 4 * @copyright Justin Lin, 2017 5 * @license https://opensource.org/licenses/lgpl-3.0.html 6 * 7 * @see https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_cube.html 8 * 9 **/ 10 11 use <__comm__/__frags.scad> 12 use <__comm__/__nearest_multiple_of_4.scad> 13 14 module rounded_cube(size, corner_r, center = false) { 15 dimension = is_num(size) ? [size, size, size] : size; 16 half_dim = dimension / 2; 17 18 $fn = __nearest_multiple_of_4(__frags(corner_r)); 19 edge_d = corner_r * cos(180 / $fn); 20 21 half_dim_m_edge = half_dim - [edge_d, edge_d, edge_d]; 22 23 pair = [1, -1]; 24 corners = [ 25 for(z = pair, y = pair, x = pair) 26 [ 27 half_dim_m_edge.x * x, 28 half_dim_m_edge.y * y, 29 half_dim_m_edge.z * z 30 ] 31 ]; 32 33 module corner(i) { 34 translate(corners[i]) 35 sphere(corner_r); 36 } 37 38 center_pts = center ? [0, 0, 0] : half_dim; 39 40 // Don't use `hull() for(...) {...}` because it's slow. 41 translate(center_pts) 42 hull() { 43 corner(0); 44 corner(1); 45 corner(2); 46 corner(3); 47 corner(4); 48 corner(5); 49 corner(6); 50 corner(7); 51 } 52 53 // hook for testing 54 test_rounded_edge_corner_center($fn, corners, center_pts); 55 } 56 57 // override it to test 58 module test_rounded_edge_corner_center(corner_frags, corners, center_pts) { 59 60 }