M3HoleDiam = 3.4; MountSize = 40; BodyWidth = 60; $fn = 100; difference() { MainBody(); M3MountHoles(); BottomZRodHoles(); } module M3MountHoles(){ edgeDistance = (MountSize-20)/2; translate([0, edgeDistance, edgeDistance]) M3Hole(40); translate([0, MountSize-edgeDistance, edgeDistance]) M3Hole(40); translate([0, edgeDistance, MountSize-edgeDistance]) M3Hole(40); translate([0, MountSize-edgeDistance, MountSize-edgeDistance]) M3Hole(40); } module BottomZRodHoles(){ xcenter = 49; ycenter = MountSize/2 - 10; holedistance = 10.6; translate([xcenter + holedistance/2, ycenter + holedistance/2, 0]) rotate([0,270,0]) M3Hole(5); translate([xcenter - holedistance/2, ycenter + holedistance/2, 0]) rotate([0,270,0]) M3Hole(5); translate([xcenter + holedistance/2, ycenter - holedistance/2, 0]) rotate([0,270,0]) M3Hole(5); translate([xcenter - holedistance/2, ycenter - holedistance/2, 0]) rotate([0,270,0]) M3Hole(5); // center hole translate([xcenter, ycenter, 0]) rotate([0,0,0]) cylinder(h = 5, d = 10.1); } module M3Hole(thickness) { rotate([0, 90, 0])cylinder(h = thickness, d = M3HoleDiam); } module MainBody() { // left mount plate cube([5, MountSize, MountSize]); // bottom frame plate translate([5, 0,0 ]) cube([BodyWidth, MountSize, 5]); // motorholder plate translate([0, MountSize,0 ]) cube([40+5, 5, 40]); // top rod holde translate([BodyWidth, 10,5 ]) cube([5, 20, 30]); translate([BodyWidth, 10, -35 ]) cube([5, 20, 35]); }