// Variables $fn = 100; vthickness = 3.5; vdepth = 115; vrampwidth = 70; vrampheight = 30; vramplength = 70; vwidth = 240; vtowerheight = 45; vdiameter = 110; vcrossdiameter = 52; vwheelwidth = 25; vwheeldiameter = 100; vrampslope = rampface(); // Functions function rampface() = sqrt((vramplength*vramplength+vrampheight*vrampheight)); // Modules module triangle(inlen, inwid, extrusion) { linear_extrude(height = extrusion) polygon(points=[[0,0],[0,inlen],[inwid,0]],path=[[0,1,2]]); } module tower() { difference() { translate([vwidth/2,vdepth/2,0]) cylinder(vtowerheight, d=vdiameter); translate([vwidth/2,vdepth/2,-1]) cylinder(vtowerheight+2, d=vdiameter-2*vthickness); translate([vwidth/2/2-1,vdepth/2,vtowerheight+7]) rotate([0,90,0]) cylinder(vdiameter+vthickness*2+7,d=vcrossdiameter-vthickness*2); cutout1(); } } module cutout1() { translate([vwidth/2-vwheelwidth/2+0.5,2,vrampheight]) cube([vwheelwidth,vdiameter+2,30]); } // Main build // Base with text, tower and ramp cutout difference() { cube([vwidth,vdepth,vthickness]); translate([vwidth/2,vdepth/2,-1]) cylinder(10, d=vdiameter); translate([vwidth/2-vrampwidth/2,-1,-1]) cube([vrampwidth,20,vthickness+2]); translate([15,30,-1]) rotate([0,0,45]) linear_extrude(height = 5.5) text("COOPER", size = 15, font = "STENCIL"); translate([180,30,-1]) rotate([0,0,45]) linear_extrude(height = 5.5) text("COOPER", size = 15, font = "STENCIL"); translate([10,vdepth-10,-1]) rotate([0,0,270]) triangle(30,30,5); translate([60,10,-1]) rotate([0,0,90]) triangle(30,30,5); translate([vwidth-10,10,-1]) rotate([0,0,90]) triangle(30,30,5); translate([175,vdepth-10,-1]) rotate([0,0,270]) triangle(30,30,5); } // Ramps translate([vwidth/2-vrampwidth/2,15,0]) rotate([0,-90,180]) linear_extrude(height = vthickness) polygon(points=[[0,0],[vrampheight,0],[0,vramplength]], paths=[[0,1,2]]); translate([vwidth/2+vrampwidth/2-3.5,15,0]) rotate([0,-90,180]) linear_extrude(height = vthickness) polygon(points=[[0,0],[vrampheight,0],[0,vramplength]], paths=[[0,1,2]]); difference() { translate([vwidth/2-vrampwidth/2,-vramplength+15,0]) rotate([20,0,0]) linear_extrude(height=vthickness) square([vrampwidth,vrampslope]); translate([vwidth/2-15.5+vthickness,vdepth/2,vtowerheight]) rotate([0,90,0]) cylinder(vwheelwidth, d=vwheeldiameter); } // Tower tower(); // Cap on tower difference() { translate([vwidth/2,vdepth/2,vtowerheight]) cylinder(vthickness, d=vdiameter); translate([vwidth/2-12,vdepth/2,vtowerheight]) rotate([0,90,0]) cylinder(vwheelwidth, d=vwheeldiameter); translate([vwidth/2/2-1,vdepth/2,vtowerheight+7]) rotate([0,90,0]) cylinder(vdiameter+vthickness*2+7,d=vcrossdiameter-vthickness*2); cutout1(); } // Wheel slot difference() { translate([vwidth/2-15.5,vdepth/2,vtowerheight]) rotate([0,90,0]) cylinder(vwheelwidth+vthickness*2, d=vwheeldiameter+vthickness*2); translate([vwidth/2-15.5+vthickness,vdepth/2,vtowerheight]) rotate([0,90,0]) cylinder(vwheelwidth, d=vwheeldiameter); translate([0,0,vtowerheight]) cube([200,150,vwheeldiameter/2+5]); translate([0,0,-20]) cube([200,150,20]); translate([vwidth/2/2-1,vdepth/2,vtowerheight+7]) rotate([0,90,0]) cylinder(vdiameter+vthickness*2+7,d=vcrossdiameter-vthickness*2); cutout1(); } // Cross cylinder for pegs difference() { translate([vwidth/2-34,vdepth/2,vtowerheight+7]) rotate([0,90,0]) cylinder(70,d=vcrossdiameter); translate([vwidth/2-35,vdepth/2,vtowerheight+7]) rotate([0,90,0]) cylinder(70+2,d=vcrossdiameter-vthickness*2); translate([vwidth/2-15.5+vthickness,vdepth/2,vtowerheight]) rotate([0,90,0]) cylinder(vwheelwidth, d=vwheeldiameter); translate([0,0,vtowerheight+3.5]) cube([200,150,vwheeldiameter/2+5]); translate([0,0,-20]) cube([200,150,20]); }