$fn=30; module case4(l, w, h, t) { difference() { translate([0, 0, - (t/2) ]) cube([l + t*2, w + t*2, h + t], true); cube([l, w, h + 0.1], true); }; } module case3(l, w, h, t) { difference() { translate([- (t/2 + 0.1), 0, - (t/2 + 0.1) ]) cube([l + t, w + t*2, h + t], true); cube([l + 0.1, w, h], true); }; } module case2(l, w, h, t) { difference() { translate([0, 0, - (t/2 + 0.1) ]) cube([l, w + t*2, h + t], true); cube([l + 0.2, w, h], true); } } module gps(l, w, h, t) { case4(l, w, h, t); } module beacon(l, w, h, t) { case3(l, w, h, t); } module bridge(l, w, h, t) { difference() { case3(l, w, h, t + 1); translate([-2, 0, -(ride_t + 1)]) cylinder(h + 3, 6, 6, true); } } gps_l = 23; gps_w = 22; gps_h = 12; ride_t = 2.3; beacon_l = 32; beacon_w = 22; beacon_h = 10; ant_hole_d = 6; bridge_l = ant_hole_d + 17; bridge_w = gps_w -ride_t; bridge_h = gps_h - 1; mount_h = 17; mount_ind = 5.5; mount_outd = mount_ind + ride_t; mount_dist = 23; module mount(h, d) { cylinder(h, d, d, true); } module holder() { difference() { union() { translate([0, 0, -10]) rotate([0, -15, 0]) union() { translate([0, 0, gps_h/2 + ride_t]) gps(gps_l, gps_w, gps_h, ride_t); translate([-ride_t, 0, -(beacon_h/2 + ride_t)]) rotate([180, 0, 180]) beacon(beacon_l, beacon_w, beacon_h, ride_t); translate([bridge_l/2 + gps_l/2 + ride_t + 2, 0, gps_h/2 - 0.5]) rotate([180, 0, 0]) bridge(bridge_l, bridge_w, bridge_h, ride_t); }; translate([bridge_l + gps_l/2 + ride_t, mount_dist/2, gps_h/2]) mount(mount_h, mount_outd); translate([bridge_l + gps_l/2 + ride_t, -mount_dist/2, gps_h/2]) mount(mount_h, mount_outd); }; union() { translate([bridge_l + gps_l/2 + ride_t, mount_dist/2, gps_h/2 + 1]) mount(mount_h + 3, mount_ind); translate([bridge_l + gps_l/2 + ride_t, -mount_dist/2, gps_h/2 + 1]) mount(mount_h + 3, mount_ind); }; }; } holder();