$fn=200; include // Calculate optimal rows and columns n = 1; rows = floor(sqrt(n)); cols = ceil(n/rows); module knobs(size = 1) { difference() { union() { translate([-15,-15,0]) { linear_extrude(height = size) import("../svg/screw.svg"); } translate([0,0,size]) { cylinder(5, d=size); } } // M5 screw hole color("red", alpha=1) { union() { translate([0,0,5]) { DIN931("M5"); } translate([0,0,2.5]) { DIN931("M5"); } cylinder(20, d=5.5); } } } } // Create a 2D array of squares for(i = [0:rows-1]) { for(j = [0:cols-1]) { translate([35*j,35*i,0]) { knobs(size = 10); } } }