--- /dev/null
+$fn = 100;
+
+gap = 10;
+drive_thickness = 27;
+overdraw = 5;
+height = 10;
+thickness = 5;
+
+drive_width = 101.6;
+
+pin_depth = 6;
+pin_d = 2.56;
+pin_dist = 41.61;
+pin_height = 6.4;
+
+drive_count = 3;
+
+frame_clearance = 3;
+
+length = 2 * frame_clearance + drive_count * drive_thickness + gap * (drive_count - 1);
+
+over_desk = 40;
+
+insert_d = 4.5;
+insert_depth = min(overdraw, 6);
+
+screw_d = 3;
+
+hat_screw_d = 2.5;
+hat_hole_dist = [58, 49];
+
+module horizontal()
+{
+ union()
+ {
+ cube([length, height, thickness], center = false);
+ for (i = [0:drive_count - 1])
+ translate([frame_clearance + pin_height + i * (drive_thickness + gap), height / 2 + pin_d / 2, 0])
+ cylinder(d = pin_d, h = thickness + pin_depth);
+ }
+}
+
+module insert()
+{
+ difference()
+ {
+ cube([insert_depth, height, height]);
+ translate([0, height / 2, height / 2])
+ rotate(90, [0, 1, 0])
+ cylinder(h = height, d = insert_d);
+ }
+}
+
+module leg()
+{
+ union()
+ {
+ translate([0, -over_desk, 0])
+ cube([overdraw, pin_dist + height + over_desk, thickness], center = false);
+ translate([0, 0, thickness])
+ insert();
+ translate([0, pin_dist, thickness])
+ insert();
+ }
+}
+
+module bracket()
+{
+ horizontal();
+ translate([0, pin_dist, 0])
+ horizontal();
+ translate([-overdraw, 0, 0])
+ leg();
+ translate([length, 0, 0])
+ mirror([1, 0, 0])
+ leg();
+}
+
+outer_width = 2 * thickness + drive_width;
+outer_height = pin_dist + height;
+inner_width = outer_width - 2 * (thickness + height);
+inner_height = outer_height - 2 * height;
+
+module plate_base()
+{
+ difference()
+ {
+ square([outer_width, outer_height], center = true);
+ for (i = [-1:2:1], j = [-1:2:1])
+ translate([i * (outer_width / 2 - height / 2 - thickness) , j * (outer_height / 2 - height / 2)])
+ circle(d = screw_d);
+ }
+}
+
+module blank_plate()
+{
+ linear_extrude(thickness)
+ translate([outer_width / 2, outer_height / 2])
+ difference()
+ {
+ plate_base();
+ square([inner_width, inner_height], center = true);
+ }
+}
+
+module hat_screw_hole_base()
+{
+ base_length = 7;
+ translate([base_length / 2, 0])
+ difference()
+ {
+ square(base_length, center = true);
+ circle(d = hat_screw_d);
+ }
+}
+
+module hat_holder()
+{
+ holder_inner_height = max(56, inner_height);
+ holder_height = holder_inner_height + 2 * height;
+ linear_extrude(thickness)
+ translate([outer_width / 2, outer_height / 2])
+ union()
+ {
+ difference()
+ {
+ union()
+ {
+ plate_base();
+ translate([0, -holder_height / 2])
+ square([outer_width, holder_height - outer_height], center = true);
+ }
+ translate([0, -(holder_height - outer_height) / 2])
+ square([inner_width, holder_inner_height], center = true);
+ }
+ translate([-(inner_width - hat_hole_dist.x) / 2, -(holder_height - outer_height) / 2, 0])
+ for (i = [-1:2:1], j = [-1:2:1])
+ translate([i * hat_hole_dist.x / 2, j * hat_hole_dist.y / 2])
+ hat_screw_hole_base();
+ }
+}
+
+rotate(90, [1, 0, 0])
+{
+ bracket();
+ translate([0, 0, thickness * 2 + drive_width])
+ mirror([0, 0, 1])
+ bracket();
+
+ translate([-overdraw, 0, 0])
+ rotate(-90, [0, 1, 0])
+ blank_plate();
+
+ translate([length + thickness, 0, 0])
+ rotate(-90, [0, 1, 0])
+ hat_holder();
+}