xantronix-z32/case/top.scad

269 lines
9.5 KiB
OpenSCAD

include <support.scad>
include <keyboard.scad>
include <logo.scad>
module top_case(with_keyboard=false, as_flat=false) {
eps = 0.01;
accent_width = 1.0000;
accent_depth = 0.5;
accent_y_stride = (keyboard_pcb_length - accent_width) / 5.0;
accent_y_bottom = keyboard_y_offset;
vent_width = 2.0000;
vent_length = wall_width;
vent_height = 12.0000;
vent_count = 33;
vent_x_first = keyboard_x_offset + keyboard_pcb_width - vent_count * 2*vent_width;
vent_y_offset = case_length_bottom - vent_length;
screw_post_lower_y_offset = (keyboard_y_offset - 2 * wall_width) / 2 + wall_width;
screw_post_middle_y_offset = screw_post_lower_y_offset + 66.00;
screw_post_upper_y_offset = screw_post_middle_y_offset + 64.00;
screw_post_x_offset = (keyboard_x_offset - 2 * wall_width) / 2 + wall_width + 0.25;
screw_post_corner_height = 12.00;
screw_post_middle_height = 29.30;
screw_posts = [
/* Upper row */
[screw_post_x_offset, screw_post_upper_y_offset, screw_post_corner_height],
[case_width_bottom / 2, case_length_bottom - 10.0, screw_post_middle_height],
[case_width_bottom - screw_post_x_offset, screw_post_upper_y_offset, screw_post_corner_height],
/* Middle row */
[screw_post_x_offset, screw_post_middle_y_offset, screw_post_corner_height],
[case_width_bottom - screw_post_x_offset, screw_post_middle_y_offset, screw_post_corner_height],
/* Bottom row */
[screw_post_x_offset, screw_post_lower_y_offset, screw_post_corner_height],
[case_width_bottom / 2, screw_post_lower_y_offset, screw_post_corner_height],
[case_width_bottom - screw_post_x_offset, screw_post_lower_y_offset, screw_post_corner_height]
];
module fascia() {
difference() {
cube([case_width_bottom, case_length_bottom, wall_width]);
if (with_keyboard) {
translate([keyboard_x_offset, keyboard_y_offset, -eps])
cube([keyboard_pcb_width, keyboard_pcb_length, wall_width + 2*eps]);
}
}
}
module vents() {
for (i = [0:vent_count-1]) {
x = vent_x_first + (i * 2*vent_width);
translate([x, vent_y_offset-eps, wall_height - vent_height])
cube([vent_width, vent_length+2*eps, vent_height+eps]);
}
}
module accents() {
for (y = [accent_y_bottom: accent_y_stride: case_length_bottom]) {
/* Top */
translate([-eps, y - eps, wall_height - accent_depth])
cube([case_width_bottom+2*eps, accent_width + 2*eps, accent_depth+eps]);
/* Right */
translate([case_width_bottom - accent_depth, y, -eps])
cube([accent_depth+eps, accent_width+eps, wall_height+2*eps]);
/* Left */
translate([-eps, y, -eps])
cube([accent_depth+eps, accent_width, wall_height+2*eps]);
}
}
module screw_posts() {
module screw_post(h) {
linear_extrude(h)
difference() {
circle(d=screw_post_diameter_outer);
circle(d=screw_post_diameter_inner);
}
}
for (post = screw_posts) {
translate([post[0], post[1], wall_height - wall_width - post[2]])
screw_post(post[2] + eps);
}
}
module supports() {
support_length_vert = case_length_bottom - 2 * wall_width;
support_length_horiz = case_width_bottom - 2 * wall_width;
support_height = 0.7500 * wall_height;
support_width = 1.2500;
support_x_interval = (case_width_bottom + 2 * wall_width - support_width) / 7;
support_y_interval = (case_length_bottom + 2 * wall_width - support_width) / 5;
for (x = [support_x_interval: support_x_interval: case_width_bottom - wall_width]) {
translate([x, wall_width - eps, wall_height - wall_width])
support([support_length_vert + 2*eps, support_height], support_width);
}
for (y = [support_y_interval: support_y_interval: case_length_bottom - wall_width]) {
translate([wall_width - eps, y, wall_height - wall_width])
rotate([0, 0, -90])
support([support_length_horiz + 2*eps, support_height], support_width);
}
}
module keyboard_supports() {
support_width = 1.2500;
support_height = keyboard_switch_height - wall_width;
support_x_interval = (keyboard_pcb_width + 2 * wall_width - support_width) / 6;
support_x_offset = keyboard_x_offset - wall_width;
support_y_interval = (keyboard_pcb_length + 2 * wall_width - support_width) / 4;
support_y_offset = keyboard_y_offset;
/* Upper vertical supports */
upper_support_length = case_length_bottom
- keyboard_pcb_length
- keyboard_y_offset
- 2 * wall_width;
upper_support_y_offset = keyboard_y_offset
+ keyboard_pcb_length
+ wall_width;
/* Lower vertical supports */
lower_support_length = keyboard_y_offset - 2 * wall_width;
lower_support_y_offset = wall_width;
/* Left horizontal supports */
left_support_length = keyboard_x_offset - 2 * wall_width;
left_support_x_offset = wall_width;
/* Right horizontal supports */
right_support_length = case_width_bottom
- keyboard_pcb_width
- keyboard_x_offset
- 2 * wall_width;
right_support_x_offset = keyboard_x_offset
+ keyboard_pcb_width
+ wall_width;
for (x = [0: support_x_interval: keyboard_pcb_width + 2 * wall_width]) {
translate([support_x_offset + x,
upper_support_y_offset - eps,
wall_height - wall_width])
support([upper_support_length + 2*eps, support_height], support_width);
translate([support_x_offset + x,
lower_support_y_offset - eps,
wall_height - wall_width])
support([lower_support_length + 2*eps, support_height], support_width);
}
for (y = [0: support_y_interval: keyboard_pcb_length + 2 * wall_width]) {
translate([right_support_x_offset - eps,
support_y_offset + y - wall_width + support_width,
wall_height - wall_width])
rotate([0, 0, -90])
support([right_support_length + 2*eps, support_height], support_width);
translate([left_support_x_offset - eps,
support_y_offset + y - wall_width + support_width,
wall_height - wall_width])
rotate([0, 0, -90])
support([left_support_length + 2*eps, support_height], support_width);
}
}
module badges() {
translate([keyboard_x_offset,
keyboard_y_offset + keyboard_pcb_length + keyboard_switch_length + accent_width,
wall_height - accent_depth])
linear_extrude(accent_depth + eps)
logotype(size=10);
sextile_width = 16.0;
sextile_y = keyboard_y_offset + (keyboard_switch_width + accent_width) / 2;
sextile_x = case_width_bottom - sextile_width;
translate([sextile_x, sextile_y, wall_height - accent_depth])
linear_extrude(accent_depth + eps)
sextile(width=sextile_width);
}
module body() {
translate([0, 0, wall_height - wall_width])
fascia();
/* Upper */
translate([wall_width, case_length_bottom - wall_width_upper, 0])
cube([case_width_bottom - 2*wall_width, wall_width_upper, wall_lip_upper]);
translate([0, case_length_bottom - wall_width, wall_lip_upper - eps])
cube([case_width_bottom, wall_width, wall_height - wall_lip_upper + eps]);
/* Right */
translate([case_width_bottom - wall_width, 0, 0])
cube([wall_width, case_length_bottom, wall_height]);
/* Lower */
cube([case_width_bottom, wall_width, wall_height]);
/* Left */
cube([wall_width, case_length_bottom, wall_height]);
}
module model() {
difference() {
body();
accents();
vents();
badges();
}
screw_posts();
if (with_keyboard) {
z_offset = wall_height - keyboard_switch_height;
keyboard_supports();
translate([keyboard_x_offset, keyboard_y_offset, z_offset])
keyboard_deck(wall_width);
} else {
supports();
}
}
module flat() {
square([wall_width, case_length_bottom], false);
square([case_width_bottom, wall_width], false);
translate([case_width_bottom - wall_width, 0, 0])
square([wall_width, case_length_bottom], false);
translate([0, case_length_bottom - wall_width, 0])
square([case_width_bottom, wall_width], false);
for (screw_post = screw_posts) {
x = screw_post[0];
y = screw_post[1];
translate([x, y, 0])
difference() {
circle(d=screw_post_diameter_outer);
circle(d=screw_post_diameter_inner);
}
}
}
if (as_flat) {
flat();
} else {
model();
}
}
top_case(with_keyboard);