diff --git a/3dprint/panel.scad b/3dprint/panel.scad index 8169af7..bdf69a7 100644 --- a/3dprint/panel.scad +++ b/3dprint/panel.scad @@ -1,7 +1,7 @@ $fa = 1; $fs = 0.4; -panel_border = 5; +panel_border = 0; panel_width = 160 + 2*panel_border; panel_height = 100 + 2*panel_border; panel_thick = 1; @@ -15,31 +15,34 @@ enc_shaft_diam = 6; led_height = 12.7; led_width = 4*2.54; cutout_depth = panel_thick + 1; +guide_thick = 0.5; +guide_height = 2; +guide_length = 3; wiggle_room = 0.1; epsilon = 0.01; module cutout_rect(left, upper, width, height) { - translate([left + 5 - wiggle_room, - panel_height - 5 - upper - height - wiggle_room, 0]) + translate([left + panel_border - wiggle_room, + panel_height - panel_border - upper - height - wiggle_room, 0]) cube([width + 2*wiggle_room, height + 2*wiggle_room, cutout_depth+2*epsilon]); } module cutout_rect_c(c_x, c_y, width, height) { - translate([c_x + 5 - width/2 - wiggle_room, - panel_height - 5 - c_y - height/2 - wiggle_room, 0]) + translate([c_x + panel_border - width/2 - wiggle_room, + panel_height - panel_border - c_y - height/2 - wiggle_room, 0]) cube([width + 2*wiggle_room, height + 2*wiggle_room, cutout_depth+2*epsilon]); } module cutout_cyl(c_x, c_y, diam) { - translate([c_x + 5 - wiggle_room, panel_height - 5 - c_y - wiggle_room, 0]) + translate([c_x + panel_border - wiggle_room, panel_height - panel_border - c_y - wiggle_room, 0]) cylinder(r=diam/2 + wiggle_room, h=cutout_depth+2*epsilon); } module screw_point(c_x, c_y, length = 5) { - translate([c_x + 5, panel_height - 5 - c_y, -length]) + translate([c_x + panel_border, panel_height - panel_border - c_y, -length]) difference() { cylinder(r=5.2/2+1, h=length); translate([0, 0, -epsilon]) @@ -47,62 +50,143 @@ module screw_point(c_x, c_y, length = 5) { } } -function col_x(col) = (5.5+col*8)*2.54; - - -difference() { - union() { - cube([panel_width, panel_height, panel_thick]); - screw_point(2*2.54, 1.5*2.54); - screw_point(61*2.54, 2.5*2.54); - screw_point(2*2.54, 37.5*2.54, length=12); - screw_point(61*2.54, 37.5*2.54, length=12); +module button_guide(c_x, c_y, width, height) { + translate([c_x + panel_border - width/2 - wiggle_room - guide_thick, + panel_height - panel_border - c_y - height/2 - wiggle_room - guide_thick, -panel_thick-guide_height/2]) { + cube([guide_length, guide_thick, guide_height]); + cube([guide_thick, guide_length, guide_height]); } - translate([0, 0, -cutout_depth+panel_thick-epsilon]) union() { - // HDG led - cutout_rect(8.9, 5.5, 3*led_width, led_height); - // ALT led - cutout_rect(8.9+2*led_width, 5.5 + led_height + 3*2.54, 5*led_width, led_height); - // VS led - cutout_rect(8.9+6*led_width, 5.5, 5*led_width, led_height); - // AS led - cutout_rect(8.9+10*led_width, 5.5 + led_height + 3*2.54, 4*led_width, led_height); - - // HDG rot - cutout_cyl(15.24, 55, enc_shaft_diam); - // ALT rot - cutout_cyl(15.24+16*2.54, 55, enc_shaft_diam); - // VS rot - cutout_cyl(15.24+32*2.54, 55, enc_shaft_diam); - // AS rot - cutout_cyl(15.24+48*2.54, 55, enc_shaft_diam); - - // ALT INTV - cutout_rect_c(15.24+(16+6.5)*2.54, 55, button_small_width, - button_small_height); - // SPD INTV - cutout_rect_c(15.24+(48+6.5)*2.54, 55, button_small_width, - button_small_height); - // c/o - cutout_rect_c(15.24+(32+9.5)*2.54, 55-2.54, button_small_width, - button_small_height); - - row_1_led_y = 55+5*2.54; - row_1_but_y = 55+8*2.54; - - for (col = [0:6]) { - // HDG, LNAV, ALT, VNAV, VS, FLC, SPD - cutout_cyl(col_x(col), row_1_led_y, led_diam); - cutout_rect_c(col_x(col), row_1_but_y, button_width, button_height); - } - - row_2_led_y = 55+12*2.54; - row_2_but_y = 55+15*2.54; - - for (col = [0, 1.5, 2.5, 3.5, 4.5, 6]) { - // APR, LVL, FD, AP, A/T, N1 - cutout_cyl(col_x(col), row_2_led_y, led_diam); - cutout_rect_c(col_x(col), row_2_but_y, button_width, button_height); - } + translate([c_x + panel_border + width/2 + wiggle_room, + panel_height - panel_border - c_y - height/2 - wiggle_room - guide_thick, -panel_thick-guide_height/2]) { + translate([-guide_length+guide_thick, 0, 0]) cube([guide_length, guide_thick, guide_height]); + cube([guide_thick, guide_length, guide_height]); + } + translate([c_x + panel_border - width/2 - wiggle_room - guide_thick, + panel_height - panel_border - c_y + height/2 + wiggle_room, -panel_thick-guide_height/2]) { + cube([guide_length, guide_thick, guide_height]); + translate([0, -guide_length+guide_thick, 0]) cube([guide_thick, guide_length, guide_height]); + } + translate([c_x + panel_border + width/2 + wiggle_room, + panel_height - panel_border - c_y + height/2 + wiggle_room, -panel_thick-guide_height/2]) { + translate([-guide_length+guide_thick, 0, 0]) cube([guide_length, guide_thick, guide_height]); + translate([0, -guide_length+guide_thick, 0]) cube([guide_thick, guide_length, guide_height]); } } + +function col_x(col) = (5.5+col*8)*2.54; + +panel_angle = 60; +bottom_border = 10; +top_border = 10; +top_shelf = 15; + +module panel() { + row_1_but_y = 55+8*2.54; + row_2_but_y = 55+15*2.54; + + buttons = concat([[15.24+(16+6.5)*2.54, 55, button_small_width, button_small_height], + [15.24+(48+6.5)*2.54, 55, button_small_width, button_small_height], + [15.24+(32+9.5)*2.54, 55-2.54, button_small_width, button_small_height]], + [for (col = [0:6]) [col_x(col), row_1_but_y, button_width, button_height]], + [for (col = [0, 1.5, 2.5, 3.5, 4.5, 6]) [col_x(col), row_2_but_y, button_width, button_height]]); + + difference() { + union() { + cube([panel_width, panel_height, panel_thick]); + for (but = buttons) { + button_guide(but[0], but[1], but[2], but[3]); + } + screw_point(2*2.54, 1.5*2.54); + screw_point(61*2.54, 2.5*2.54); + screw_point(2*2.54, 37.5*2.54, length=12); + screw_point(61*2.54, 37.5*2.54, length=12); + } + translate([0, 0, -cutout_depth+panel_thick-epsilon]) union() { + // HDG led + cutout_rect(8.9, 5.5, 3*led_width, led_height); + // ALT led + cutout_rect(8.9+2*led_width, 5.5 + led_height + 3*2.54, 5*led_width, led_height); + // VS led + cutout_rect(8.9+6*led_width, 5.5, 5*led_width, led_height); + // AS led + cutout_rect(8.9+10*led_width, 5.5 + led_height + 3*2.54, 4*led_width, led_height); + + // HDG rot + cutout_cyl(15.24, 55, enc_shaft_diam); + // ALT rot + cutout_cyl(15.24+16*2.54, 55, enc_shaft_diam); + // VS rot + cutout_cyl(15.24+32*2.54, 55, enc_shaft_diam); + // AS rot + cutout_cyl(15.24+48*2.54, 55, enc_shaft_diam); + + for (but = buttons) { + cutout_rect_c(but[0], but[1], but[2], but[3]); + } + + + row_1_led_y = 55+5*2.54; + + for (col = [0:6]) { + // HDG, LNAV, ALT, VNAV, VS, FLC, SPD + cutout_cyl(col_x(col), row_1_led_y, led_diam); + } + + row_2_led_y = 55+12*2.54; + + for (col = [0, 1.5, 2.5, 3.5, 4.5, 6]) { + // APR, LVL, FD, AP, A/T, N1 + cutout_cyl(col_x(col), row_2_led_y, led_diam); + } + } + } + translate([0, -bottom_border/2, 0]) rotate([0, 90, 0]) screw_block(); + translate([0, panel_height+top_border/2-2.5, 0]) rotate([0, 90, 0]) screw_block(); + translate([160, -bottom_border/2, -5]) rotate([0, -90, 0]) screw_block(); + translate([160, panel_height+top_border/2-2.5, -5]) rotate([0, -90, 0]) screw_block(); + + translate([0, 0, -12]) cube([160, 100, 1]); // dummy PCB + translate([0, -bottom_border, 0]) cube([160, bottom_border, 1]); + translate([0, 100, 0]) cube([160, top_border, 1]); + rotate([0, -90, 0]) translate([0, 0, -160]) linear_extrude(height=160) + polygon([[0, 100+top_border], [1, 100+top_border], + [0, 100+top_border+panel_thick/tan(panel_angle)+epsilon]]); +} + +module screw_block() { + difference() { + cube([5, 5, 10]); + translate([2.5, 2.5, -epsilon]) cylinder(r=1, h=7+epsilon); + } +} + + +rotate([panel_angle, 0, 0]) { + // panel part + panel(); +} + // case part + difference() { + union() { + translate([0, -bottom_border*cos(panel_angle), -bottom_border*sin(panel_angle)]) + cube([160, top_shelf + cos(panel_angle)*(100+bottom_border+top_border), 1]); + + translate([0, (100+top_border)*cos(panel_angle), (100+top_border)*sin(panel_angle)]) + translate([0, -panel_thick*sin(panel_angle), -panel_thick*cos(panel_angle)]) + cube([160, top_shelf+panel_thick*sin(panel_angle), 1]); + translate([0, (100+top_border)*cos(panel_angle)+top_shelf-panel_thick, + -bottom_border*sin(panel_angle)+panel_thick]) + //translate([0, (100+top_border)*cos(panel_angle), (100+top_border)*sin(panel_angle)]) + //rotate([-90, 0, 0]) + // translate([0, panel_thick*cos(panel_angle), top_shelf-panel_thick]) + cube([160, 1+epsilon, + (100+bottom_border+top_border)*sin(panel_angle)-3*panel_thick*cos(panel_angle)]); + } + rotate([panel_angle, 0, 0]) panel(); + } + # union() { + polyhedron([[0, -bottom_border, 1], + [0, panel_height+top_border, 1], + [0, panel_height+top_border, 0]]); + } +