module wing() { polyhedron( points = [ [-1, -1, 0], [-1, 1, 0], [-1, 0, 6], [31, 0, 0], ], faces = [ [1, 0, 3], // bottom [0, 2, 3], // left [0, 1, 2], // back [3, 2, 1], // right ] ); }; // screw bump 13mm long, 7mm high, round top and sides (triangle like rather than cylindrical) module bump() { linear_extrude(height=7) { hull() { translate([0,-5,0]) { circle(4, $fn=100); }; translate([13/2, -9, 0]) { circle(.1, $fn=50); }; translate([-13/2, -9, 0]) { circle(.1, $fn=50); }; }; }; }; module thing() { union() { // 13mm x40mm long cylinder translate([0, 0, 15]) { cylinder(40, 13/2, 13/2, $fn=360); }; // cone, 17mm top, 21mm base, 15mm tall translate([0, 0, 0]) { cylinder(15, 21/2, 17/2, $fn=360); }; // 2x long wings, 31mm x 2mm starting at 6mm tall and ending at 0 at 90 degree offset from key translate([21/2, 0, 0]) { wing(); }; mirror([1, 0, 0]) { translate([21/2, 0, 0]) { wing(); }; }; // key top is 15mm tall 10mm protrusion for edge of cone top angling down to 0mm at an offset of 16mm from cone bottom, 4mm wide translate([-2, 8, 0]) { cube([4, 11, 15], center=false); }; translate([0, 19, 0]) { polyhedron(points=[ [-2, 0, 0], [2, 0, 0], [-2, 0, 15], [2, 0, 15], [-2, 6, 0], [2, 6, 0], ], faces = [ [0, 1, 5, 4 ], // bottom [2, 4, 5, 3], // top [0, 4, 2], // left [0, 2, 3, 1], // back [5, 1, 3], // right ]); }; translate([0, -8, 9.1]) { rotate(90, v=[1, 0, 0]) { bump(); }; }; // screw protrudes by about 2mm from back // bend top is about 34mm high }; }; %thing(); difference() { translate([0, 5, 25/2+0.01]) { cube([92, 59, 25], center=true); }; thing(); }; translate([0, 10, 0]) { difference() { cube([112, 79, 10], center=true); cube([92, 59, 10], center=true); }; };