1#include <BOSL2/std.scad>
  2
  3dimensions = [83,36,25]; // mm
  4rib_count = [4,3];
  5rib_thickness = 2; // mm
  6wall_thickness = 2; // mm
  7rounding = 4; // mm
  8
  9dove_tail_dimensions = [4,5,2]; // mm
 10dove_tail_part_thickness = 2; // mm
 11tolerance = 0.2; // mm
 12
 13rtl_sdr_body_dimensions = [61,18,15]; // mm
 14rtl_sdr_sda_connector_offset = 7; // mm
 15rtl_sdr_usb_connector_dimensions = [11,12,5]; // mm
 16rtl_sdr_usb_connector_offset = 7; // mm
 17
 18rf_filter_body_dimensions = [54,30.5,19]; // mm
 19rf_filter_output_sda_connector_offset = [15.5,12]; // mm
 20rf_filter_input_sda_connector_offset = [18,11]; // mm
 21
 22sda_connector_dimensions = [10,12]; // mm (diameter,length)
 23
 24resolution = 100;
 25top_part = true;
 26dovetail_part = true;
 27rf_filter_part = true;
 28
 29text_contents = ["Flamingo","OnTake's"];
 30text_depth = 1; // mm
 31font_size = 10; // mm
 32font = "Iosevka Heavy";
 33
 34module rtl_sdr(){
 35      cuboid(rtl_sdr_body_dimensions);
 36     translate([rtl_sdr_body_dimensions.x/2+sda_connector_dimensions.x/2,0,-rtl_sdr_body_dimensions.z/2+rtl_sdr_sda_connector_offset]) xcyl(d=sda_connector_dimensions.x,h=sda_connector_dimensions.y,$fn=resolution);
 37    
 38     translate([-rtl_sdr_body_dimensions.x/2-rtl_sdr_usb_connector_dimensions.x/2,0,-rtl_sdr_body_dimensions.z/2+rtl_sdr_usb_connector_offset]) cuboid(rtl_sdr_usb_connector_dimensions);
 39}
 40
 41module rf_filter(){
 42      cuboid(rf_filter_body_dimensions);
 43     translate([rf_filter_body_dimensions.x/2+sda_connector_dimensions.x/2,rf_filter_output_sda_connector_offset.x-rf_filter_body_dimensions.y/2,-rf_filter_body_dimensions.z/2+rf_filter_output_sda_connector_offset.y]) xcyl(d=sda_connector_dimensions.x,h=sda_connector_dimensions.y,$fn=resolution);
 44    
 45     translate([-rf_filter_body_dimensions.x/2-sda_connector_dimensions.x/2,rf_filter_input_sda_connector_offset.x-rf_filter_body_dimensions.y/2,-rf_filter_body_dimensions.z/2+rf_filter_input_sda_connector_offset.y]) xcyl(d=sda_connector_dimensions.x,h=sda_connector_dimensions.y,$fn=resolution);
 46}
 47
 48module dovetail(flip=false){
 49    difference(){
 50    prismoid(size1=[dimensions.x-rounding*2-dove_tail_part_thickness,dove_tail_dimensions.x],size2=[dimensions.x-rounding*2-dove_tail_part_thickness,dove_tail_dimensions.y],h=dove_tail_dimensions.z,anchor=LEFT+BOTTOM);
 51     if (flip){   
 52         translate([0,-max(dove_tail_dimensions.x,dove_tail_dimensions.y)/2,0]) cuboid([dimensions.x-rounding*2-dove_tail_part_thickness,max(dove_tail_dimensions.x,dove_tail_dimensions.y),dove_tail_dimensions.z],anchor=LEFT+BOTTOM);
 53     } else {
 54         translate([0,max(dove_tail_dimensions.x,dove_tail_dimensions.y)/2,0]) cuboid([dimensions.x-rounding*2-dove_tail_part_thickness,max(dove_tail_dimensions.x,dove_tail_dimensions.y),dove_tail_dimensions.z],anchor=LEFT+BOTTOM);
 55         }
 56    }
 57}
 58if (dovetail_part){
 59    difference(){
 60        prismoid(size1=[dimensions.x-rounding*2+tolerance*2,dove_tail_dimensions.x+tolerance*2+dove_tail_part_thickness*2],size2=[dimensions.x-rounding*2+tolerance*2,dove_tail_dimensions.y+tolerance*2+dove_tail_part_thickness*2],h=dove_tail_dimensions.z+tolerance+dove_tail_part_thickness,anchor=LEFT+BOTTOM);
 61        prismoid(size1=[dimensions.x-rounding*2+tolerance*2-dove_tail_part_thickness,dove_tail_dimensions.x+tolerance*2],size2=[dimensions.x-rounding*2+tolerance*2-dove_tail_part_thickness,dove_tail_dimensions.y+tolerance*2],h=dove_tail_dimensions.z+tolerance,anchor=LEFT+BOTTOM);
 62        }
 63    } else {
 64difference(){
 65union(){
 66difference(){
 67    cuboid([dimensions.x,dimensions.y,dimensions.z/2],anchor=LEFT+BOTTOM+FRONT,edges=[BOTTOM,LEFT+FRONT,LEFT+BACK,RIGHT+FRONT,RIGHT+BACK],rounding=rounding,$fn=resolution);
 68    translate([wall_thickness,wall_thickness,wall_thickness]) cuboid([dimensions.x-wall_thickness*2,dimensions.y-wall_thickness*2,dimensions.z/2],anchor=LEFT+BOTTOM+FRONT,edges=[BOTTOM,LEFT+FRONT,LEFT+BACK,RIGHT+FRONT,RIGHT+BACK],rounding=rounding-wall_thickness,$fn=resolution);
 69    
 70
 71}
 72    for (i=[1:rib_count.x]){
 73        translate([dimensions.x/(rib_count.x+1)*i-rib_thickness/2,0,0])
 74    cuboid([rib_thickness,dimensions.y,dimensions.z/2],anchor=LEFT+BOTTOM+FRONT,edges=[BOTTOM+FRONT,BOTTOM+BACK],rounding=rounding,$fn=resolution);
 75        }
 76        
 77         for (i=[1:rib_count.y]){
 78        translate([0,dimensions.y/(rib_count.y+1)*i-rib_thickness/2,0])
 79    cuboid([dimensions.x,rib_thickness,dimensions.z/2],anchor=LEFT+BOTTOM+FRONT,edges=[BOTTOM+LEFT,BOTTOM+RIGHT],rounding=rounding,$fn=resolution);
 80        }
 81        translate([rounding,0,dimensions.z/2]) rotate([90,0,0]) dovetail();
 82        translate([rounding,dimensions.y,dimensions.z/2]) rotate([-90,0,0]) dovetail(flip=true);
 83}
 84translate([dimensions.x/2,dimensions.y/2,dimensions.z/2]) 
 85if (top_part){
 86    rotate([180,0,0]) 
 87    if (rf_filter_part){
 88        rf_filter();
 89    } else {
 90        rtl_sdr();
 91    }
 92} else {
 93if (rf_filter_part){
 94        rf_filter();
 95    } else {
 96        rtl_sdr();
 97    }
 98    }
 99    
100    translate ([dimensions.x/2,dimensions.y/2,text_depth]) rotate ([180,0,0]) linear_extrude(text_depth)
101   if (top_part){ text(text_contents.x,size=font_size,font=font,halign="center",valign="center");
102   } else { text(text_contents.y,size=font_size,font=font,halign="center",valign="center");
103   }
104}
105}