//testNutsAndBolts(); module testNutsAndBolts() { $fn = 360; translate([0,15])nutHole(3, proj=2); boltHole(3, length= 30, proj=2); } MM = "mm"; INCH = "inch"; //Not yet supported //Based on: http://www.roymech.co.uk/Useful_Tables/Screws/Hex_Screws.htm METRIC_NUT_AC_WIDTHS = [ -1, //0 index is not used but reduces computation -1, -1, 6.40,//m3 8.10,//m4 9.20,//m5 11.50,//m6 -1, 15.00,//m8 -1, 19.60,//m10 -1, 22.10,//m12 -1, -1, -1, 27.70,//m16 -1, -1, -1, 34.60,//m20 -1, -1, -1, 41.60,//m24 -1, -1, -1, -1, -1, 53.1,//m30 -1, -1, -1, -1, -1, 63.5//m36 ]; METRIC_NUT_THICKNESS = [ -1, //0 index is not used but reduces computation -1, -1, 2.40,//m3 3.20,//m4 4.00,//m5 5.00,//m6 -1, 6.50,//m8 -1, 8.00,//m10 -1, 10.00,//m12 -1, -1, -1, 13.00,//m16 -1, -1, -1, 16.00//m20 -1, -1, -1, 19.00,//m24 -1, -1, -1, -1, -1, 24.00,//m30 -1, -1, -1, -1, -1, 29.00//m36 ]; COURSE_METRIC_BOLT_MAJOR_THREAD_DIAMETERS = [//based on max values -1, //0 index is not used but reduces computation -1, -1, 2.98,//m3 3.978,//m4 4.976,//m5 5.974,//m6 -1, 7.972,//m8 -1, 9.968,//m10 -1, 11.966,//m12 -1, -1, -1, 15.962,//m16 -1, -1, -1, 19.958,//m20 -1, -1, -1, 23.952,//m24 -1, -1, -1, -1, -1, 29.947,//m30 -1, -1, -1, -1, -1, 35.940//m36 ]; module nutHole(size, units=MM, tolerance = +0.0001, proj = -1) { //takes a metric screw/nut size and looksup nut dimensions radius = METRIC_NUT_AC_WIDTHS[size]/2+tolerance; height = METRIC_NUT_THICKNESS[size]+tolerance; if (proj == -1) { cylinder(r= radius, h=height, $fn = 6, center=[0,0]); } if (proj == 1) { circle(r= radius, $fn = 6); } if (proj == 2) { translate([-radius/2, 0]) square([radius*2, height]); } } module boltHole(size, units=MM, length, tolerance = +0.0001, proj = -1) { radius = COURSE_METRIC_BOLT_MAJOR_THREAD_DIAMETERS[size]/2+tolerance; //TODO: proper screw cap values capHeight = METRIC_NUT_THICKNESS[size]+tolerance; //METRIC_BOLT_CAP_HEIGHTS[size]+tolerance; capRadius = METRIC_NUT_AC_WIDTHS[size]/2+tolerance; //METRIC_BOLT_CAP_RADIUS[size]+tolerance; if (proj == -1) { translate([0, 0, -capHeight]) cylinder(r= capRadius, h=capHeight); cylinder(r = radius, h = length); } if (proj == 1) { circle(r = radius); } if (proj == 2) { translate([-capRadius/2, -capHeight]) square([capRadius*2, capHeight]); square([radius*2, length]); } }