/ src / rounded_cube.scad
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  }