Compare commits

...

2 Commits

5 changed files with 381 additions and 28 deletions

View File

@ -58,23 +58,24 @@ grid_size_x_gridunits = grid_elements(grid_size_x_mm, 1);
grid_size_y_gridunits = grid_elements(grid_size_y_mm, 1);
for(xy = grid(grid_size_x_gridunits, grid_size_y_gridunits, 1, 1)){
translate([
LEG_OFFSET_X + LEG_BASE_DIAMETER,
FRAME_MAJOR_STRUT_WIDTH + (MODULE_RAIL_BASE_WIDTH / 2),
MODULE_RAIL_MARGIN_SCREW,
MAIN_HEIGHT - MODULE_SCREW_LENGTH
]) {
translate(xy) { screw_hole(); }
//translate(xy) { screw_hole(); }
}
}
// rack module placeholder
translate([
200,
FRAME_MAJOR_STRUT_WIDTH + (MODULE_RAIL_BASE_WIDTH / 2),
MODULE_RAIL_MARGIN_SCREW,
MAIN_HEIGHT - TOP_THICKNESS
_BELOW_FRAME
]) {
rack_width_gridunits = grid_units_length(550);
rack_depth_gridunits = grid_units_length(650);
//rack_depth_gridunits = grid_units_length(650);
rack_depth_gridunits = grid_units_length(600);
module_base(rack_width_gridunits, rack_depth_gridunits, 600, 3);
module_rail_set(rack_width_gridunits, rack_depth_gridunits, 3);
}

View File

@ -19,16 +19,22 @@ COLOR_SEMANTIC_LOAD_BEARING = [1, 0.5, 0];
// All measurements in mm
// Outer measurements
MAIN_WIDTH = 1800;
MAIN_HEIGHT = 700;
MAIN_WIDTH = 1400;
MAIN_HEIGHT = 800;
MAIN_DEPTH = 900;
TOP_THICKNESS = 25;
BACKPLATE_THICKNESS = 15;
STAND_THICKNESS = 60;
STAND_HEIGHT = 500;
STAND_DEPTH = 150;
STAND_THICKNESS = 20;
STAND_DEPTH = 200;
FRAME_THICKNESS = STAND_THICKNESS; // safe to change independently of STAND_THICKNESS
//FRAME_MAJOR_STRUT_WIDTH = STAND_DEPTH; // safe to change independently of STAND_DEPTH, but MUST fit legs! TODO: Sanity check!
FRAME_MAJOR_STRUT_WIDTH = 80; // safe to change independently of STAND_DEPTH, but MUST fit legs! TODO: Sanity check!
FRAME_MINOR_STRUT_WIDTH = 20;
CABLE_TRAY_HEIGHT = 150;
CABLE_TRAY_LIP = 50; // backplate -> |_. <- lip
@ -55,11 +61,9 @@ LEG_DIAMETER = 50;
LEG_BASE_DIAMETER = 100;
LEG_BASE_THICKNESS = 10;
// offset of the legs' *center* not how far their bases are from edges!
LEG_OFFSET_X = 100;
LEG_OFFSET_Y = LEG_OFFSET_X;
SIDETABLE_DEPTH = MAIN_DEPTH;
SIDETABLE_WIDTH = MAIN_DEPTH * 2;
SIDETABLE_DEPTH = MAIN_DEPTH; // safe to change independently of MAIN_DEPTH but can lead to module incompatibilities
SIDETABLE_WIDTH = MAIN_DEPTH * 2; // safe to change independently of MAIN_DEPTH
// Stuff from subs/base.scad
GRID_SIZE = 50;
@ -75,7 +79,6 @@ MODULE_RAIL_BASE_WIDTH = 50;
MODULE_RAIL_MARGIN_SIDE = 5;
MODULE_RAIL_MARGIN_TOP = 10; // MODULE_THICKNESS;
MODULE_RAIL_MARGIN_SCREW = GRID_SIZE;
_MODULE_RAIL_OFFSET = MODULE_RAIL_BASE_WIDTH / 2 + MODULE_RAIL_MARGIN_SIDE; // offset on x axis for modules cause by size of rail
MODULE_SCREW_LENGTH = 120; // length WITHOUT the screw head
SCREW_DIAMETER = 8;
@ -88,14 +91,26 @@ BARREL_NUT_DIAMETER = 15;
* These are considered "private" variables and MUST NOT be modified!
*/
_BACKPLATE_HEIGHT = STAND_HEIGHT - STAND_THICKNESS;
// helper vars for vertical dimensions
_BELOW_TOP = MAIN_HEIGHT - TOP_THICKNESS;
_BELOW_FRAME = _BELOW_TOP - FRAME_THICKNESS;
_BELOW_STAND = _BELOW_FRAME - STAND_HEIGHT;
// calculated element dimensions
_BACKPLATE_HEIGHT = FRAME_THICKNESS + STAND_HEIGHT - STAND_THICKNESS;
_CABLE_TRAY_WIDTH = MAIN_WIDTH - 2 * STAND_THICKNESS;
_CABLE_TRAY_DEPTH = STAND_DEPTH - CABLE_TRAY_THICKNESS;
_CABLE_TRAY_OFFSET_Y = MAIN_HEIGHT - TOP_THICKNESS - CABLE_TRAY_HEIGHT;
_LEG_OFFSET = FRAME_MAJOR_STRUT_WIDTH / 2;
_LEG_HEIGHT = MAIN_HEIGHT - TOP_THICKNESS;
_FOOT_HEIGHT = MAIN_HEIGHT - TOP_THICKNESS - STAND_HEIGHT;
LEG_OFFSET_X = _LEG_OFFSET;
LEG_OFFSET_Y = _LEG_OFFSET;
_LEG_HEIGHT = _BELOW_FRAME;
_FOOT_HEIGHT = _BELOW_STAND;
_FOOT_OFFSET_Y = MAIN_DEPTH - ((STAND_DEPTH + BACKPLATE_THICKNESS) / 2);
_LEG_TO_FOOT = _FOOT_OFFSET_Y - LEG_OFFSET_Y;
_MODULE_RAIL_OFFSET = MODULE_RAIL_BASE_WIDTH / 2 + MODULE_RAIL_MARGIN_SIDE; // offset on x axis for modules cause by size of rail

219
fiddling.scad Normal file
View File

@ -0,0 +1,219 @@
$vpf = 65;
// all measurements in mm
LAYER_SPACE = 0; // space between sandwich layers in rendering
LAYER_COUNT = 4; // used for misc calculations, updated by hands if you add/remove layers from the sandwich
GRID_SIZE = 50;
RACKUNIT = 45;
BOARD_THICKNESS = 16;
SANDWICH_HEIGHT = LAYER_COUNT * BOARD_THICKNESS;
DESK_WIDTH = 1400;
DESK_DEPTH = 800;
DESK_TOP_OFFSET = 10; // offset between top desk plate and stand, so cables can be fit under fully mounted STAND_TOP_RACKUNITS
FRAME = 80;
STRUT_DEPTH = 40;
STRUT_INTERVAL = 100; // must be multiple of 50 (i.e. grid size) to align with grid
STRUT_OFFSET = 50 + (STRUT_DEPTH / 2);
MAIN_SUPPORT_DEPTH = 600;
STAND_DEPTH_INNER = 200;
STAND_DEPTH_OUTER = STAND_DEPTH_INNER + BOARD_THICKNESS;
STAND_WIDTH = DESK_WIDTH + ( 2 * BOARD_THICKNESS );
STAND_TOP_RACKUNITS = 2;
STAND_BOTTOM_RACKUNITS = 4;
STAND_BELOW_SANDWICH = 550; // measurements 61.5-62cm leg-to-bottom-pipe, 7cm foot-to-bottom-pipe
STAND_ABOVE_SANDWICH = RACKUNIT * STAND_TOP_RACKUNITS; // INNER height above the sandwich, i.e. how big a thing you can screw into the opening
STAND_HEIGHT_INNER = STAND_BELOW_SANDWICH - BOARD_THICKNESS + SANDWICH_HEIGHT + STAND_ABOVE_SANDWICH;
// bottom board, important to fit STAND_BELOW_SANDWICH *with* the bottom board
STAND_HEIGHT_OUTER = STAND_HEIGHT_INNER + ( 2 * BOARD_THICKNESS );
function layer_y ( layer ) = layer * (BOARD_THICKNESS + LAYER_SPACE);
module board(width, length) {
/*echo("----------------------------------------");
echo("Board:");
echo(width=width, length=length);
echo("----------------------------------------");*/
echo(width, " x ", length);
cube([width, length, BOARD_THICKNESS]);
}
module board_side(depth, height) {
/*echo("----------------------------------------");
echo("Board (side):");
echo(depth=depth, height=height);
echo("----------------------------------------");*/
echo(depth, " x ", height);
cube([BOARD_THICKNESS, depth, height]);
}
module board_back(width, height) {
/*echo("----------------------------------------");
echo("Board (back):");
echo(width=width, height=height);
echo("----------------------------------------");*/
echo(width, " x ", height);
cube([width, BOARD_THICKNESS, height]);
}
// layer 0
board(FRAME, DESK_DEPTH);
translate([DESK_WIDTH - FRAME, 0, 0]){
board(FRAME, DESK_DEPTH);
}
// layer 1
translate([0, 0, layer_y(1)]){
// bottom board with grid
board(DESK_WIDTH, DESK_DEPTH - STAND_DEPTH_INNER);
// small left/right frame pieces to make sandwhich sides seamless (i.e. no holes in vertical space)
translate([0, DESK_DEPTH - STAND_DEPTH_INNER]){
color("orange"){
board(FRAME, STAND_DEPTH_INNER);
translate([DESK_WIDTH - FRAME, 0, 0]){
board(FRAME, STAND_DEPTH_INNER);
}
}
}
}
// layer 2
translate([0, 0, layer_y(2)]){
// main left/right frame pieces
board(FRAME, DESK_DEPTH);
translate([DESK_WIDTH - FRAME, 0, 0]){
board(FRAME, DESK_DEPTH);
}
// struts
translate([FRAME / 2, STRUT_OFFSET]) {
color("orange"){
for (offset=[0:STRUT_INTERVAL:DESK_DEPTH - STAND_DEPTH_INNER - STRUT_OFFSET - STRUT_DEPTH]) {
translate([0, offset]){
board(DESK_WIDTH - FRAME, STRUT_DEPTH);
}
}
}
}
}
// layer 3
translate([0, 0, layer_y(3)]){
// the actually usable deskTOP
board(DESK_WIDTH, DESK_DEPTH - STAND_DEPTH_INNER - DESK_TOP_OFFSET);
// small left/right frame pieces to make sandwhich sides seamless (i.e. no holes in vertical space)
translate([0, DESK_DEPTH - STAND_DEPTH_INNER - DESK_TOP_OFFSET]){
color("orange"){
board(FRAME, STAND_DEPTH_INNER + DESK_TOP_OFFSET);
translate([DESK_WIDTH - FRAME, 0]){
board(FRAME, STAND_DEPTH_INNER + DESK_TOP_OFFSET);
}
}
}
}
// stand, only if LAYER_SPACE is 0
if (LAYER_SPACE == 0) {
translate([0, DESK_DEPTH - STAND_DEPTH_INNER]){
// stand top piece
translate([-BOARD_THICKNESS, 0, SANDWICH_HEIGHT + STAND_ABOVE_SANDWICH]){
board(STAND_WIDTH, STAND_DEPTH_OUTER);
}
// tray top supports
translate([0, 0, SANDWICH_HEIGHT]){
color("orange"){
translate([FRAME - BOARD_THICKNESS, 0]){
board_side(STAND_DEPTH_INNER, STAND_ABOVE_SANDWICH);
}
translate([DESK_WIDTH - FRAME, 0]){
board_side(STAND_DEPTH_INNER, STAND_ABOVE_SANDWICH);
}
}
}
// stand backplate
translate([-BOARD_THICKNESS, STAND_DEPTH_INNER, -STAND_BELOW_SANDWICH + BOARD_THICKNESS]){
board_back(STAND_WIDTH, STAND_HEIGHT_INNER);
}
// alignment for bottom of stand
translate([0, 0, -STAND_BELOW_SANDWICH]){
// stand bottom piece
translate([-BOARD_THICKNESS, 0]){
board(STAND_WIDTH, STAND_DEPTH_OUTER);
}
translate([0, 0, BOARD_THICKNESS]){
// stand sidepieces
translate([-BOARD_THICKNESS, 0]){
board_side(STAND_DEPTH_INNER, STAND_HEIGHT_INNER);
}
translate([DESK_WIDTH, 0]){
board_side(STAND_DEPTH_INNER, STAND_HEIGHT_INNER);
}
// main support, triangular
color("red"){
translate([DESK_WIDTH / 2, STAND_DEPTH_INNER - MAIN_SUPPORT_DEPTH]){
// left
translate([-BOARD_THICKNESS, 0]){
board_side(MAIN_SUPPORT_DEPTH, STAND_BELOW_SANDWICH);
}
board_side(MAIN_SUPPORT_DEPTH, STAND_BELOW_SANDWICH);
}
}
}
}
// aligned to surface of tray
translate([0, 0, - ( STAND_BOTTOM_RACKUNITS * RACKUNIT )]){
// tray bottom
translate([0, 0, -BOARD_THICKNESS]){
board(DESK_WIDTH, STAND_DEPTH_INNER);
}
// tray bottom supports (vertical stress transfer for backside of frame
color("orange"){
translate([FRAME - BOARD_THICKNESS, 0]){
board_side(STAND_DEPTH_INNER, (STAND_BOTTOM_RACKUNITS * RACKUNIT));
}
translate([DESK_WIDTH - FRAME, 0]){
board_side(STAND_DEPTH_INNER, (STAND_BOTTOM_RACKUNITS * RACKUNIT));
}
}
// tray 10" montage piece left
translate([FRAME + 254, 0]){
board_side(STAND_DEPTH_INNER, (STAND_TOP_RACKUNITS * RACKUNIT) + SANDWICH_HEIGHT + (STAND_BOTTOM_RACKUNITS * RACKUNIT));
}
// tray 10" montage piece right
translate([DESK_WIDTH - BOARD_THICKNESS - FRAME - 254, 0]){
board_side(STAND_DEPTH_INNER, (STAND_TOP_RACKUNITS * RACKUNIT) + SANDWICH_HEIGHT + (STAND_BOTTOM_RACKUNITS * RACKUNIT));
}
}
}
}

View File

@ -14,6 +14,43 @@ module leg(height) {
}
}
module backplate(width) {
difference() {
// main plate
color(COLORSCHEME == "semantic" ? COLOR_SEMANTIC_LOAD_BEARING : COLOR_WOOD) {
cube([width, _BACKPLATE_HEIGHT, BACKPLATE_THICKNESS]);
}
translate([
-CUTOUT_OVERCOMMIT,
_BACKPLATE_HEIGHT - FRAME_THICKNESS,
-CUTOUT_OVERCOMMIT
]){
color(COLOR_CUTOUT) {
cube([
FRAME_MAJOR_STRUT_WIDTH + CUTOUT_OVERCOMMIT,
FRAME_THICKNESS,
CUTOUT_OVERCOMMIT + BACKPLATE_THICKNESS + CUTOUT_OVERCOMMIT]
);
}
}
translate([
MAIN_WIDTH - FRAME_MAJOR_STRUT_WIDTH,
_BACKPLATE_HEIGHT - FRAME_THICKNESS,
-CUTOUT_OVERCOMMIT
]){
color(COLOR_CUTOUT) {
cube([
FRAME_MAJOR_STRUT_WIDTH + CUTOUT_OVERCOMMIT,
FRAME_THICKNESS,
CUTOUT_OVERCOMMIT + BACKPLATE_THICKNESS + CUTOUT_OVERCOMMIT]
);
}
}
}
}
module stand_side() {
difference() {
@ -78,6 +115,80 @@ module spacer(length) {
}
}
module frame(width, depth) {
// frame left side
frame_side(depth);
// frame right side
translate([
width - FRAME_MAJOR_STRUT_WIDTH,
0
]) {
frame_side(depth);
}
frame_front(width);
}
module frame_side(depth) {
color(COLOR_STEEL) {
difference () {
cube([FRAME_MAJOR_STRUT_WIDTH, depth, FRAME_THICKNESS]);
translate([
-CUTOUT_OVERCOMMIT,
-CUTOUT_OVERCOMMIT,
FRAME_THICKNESS / 2
]) {
cube([
CUTOUT_OVERCOMMIT + FRAME_MAJOR_STRUT_WIDTH + CUTOUT_OVERCOMMIT,
FRAME_MAJOR_STRUT_WIDTH + CUTOUT_OVERCOMMIT,
FRAME_THICKNESS / 2 + CUTOUT_OVERCOMMIT
]);
}
}
}
}
module frame_front(width) {
color(COLOR_WOOD){
difference () {
cube([width, FRAME_MAJOR_STRUT_WIDTH, FRAME_THICKNESS]);
// left cutout
translate ([
-CUTOUT_OVERCOMMIT,
-CUTOUT_OVERCOMMIT,
-CUTOUT_OVERCOMMIT
]) {
cube([
CUTOUT_OVERCOMMIT + FRAME_MAJOR_STRUT_WIDTH,
CUTOUT_OVERCOMMIT + FRAME_MAJOR_STRUT_WIDTH + CUTOUT_OVERCOMMIT,
CUTOUT_OVERCOMMIT + FRAME_THICKNESS / 2
]);
}
// right cutout
translate ([
width - FRAME_MAJOR_STRUT_WIDTH,
-CUTOUT_OVERCOMMIT,
-CUTOUT_OVERCOMMIT
]) {
cube([
CUTOUT_OVERCOMMIT + FRAME_MAJOR_STRUT_WIDTH,
CUTOUT_OVERCOMMIT + FRAME_MAJOR_STRUT_WIDTH + CUTOUT_OVERCOMMIT,
CUTOUT_OVERCOMMIT + FRAME_THICKNESS / 2
]);
}
}
}
}
// Stuff that's used for subs:
module screw() {

View File

@ -3,10 +3,11 @@ include <../modules.scad>
module top_main() {
// top plate
translate([
0,
0,
MAIN_HEIGHT - TOP_THICKNESS
MAIN_HEIGHT - TOP_THICKNESS + 1000
]){
difference() {
@ -32,17 +33,14 @@ module top_main() {
}
}
// Backplate
_BACKPLATE_HEIGHT = STAND_HEIGHT - STAND_THICKNESS;
// backplate
translate([
0,
MAIN_DEPTH,
MAIN_HEIGHT - TOP_THICKNESS - _BACKPLATE_HEIGHT
_BELOW_TOP - _BACKPLATE_HEIGHT
]){
rotate([90, 0, 0]){
color(COLORSCHEME == "semantic" ? COLOR_SEMANTIC_LOAD_BEARING : COLOR_WOOD) {
cube([MAIN_WIDTH, _BACKPLATE_HEIGHT, BACKPLATE_THICKNESS]);
}
backplate(MAIN_WIDTH);
}
}
@ -50,7 +48,7 @@ module top_main() {
translate([
0,
MAIN_DEPTH - BACKPLATE_THICKNESS - STAND_DEPTH,
MAIN_HEIGHT - TOP_THICKNESS - STAND_HEIGHT
_BELOW_STAND
]){
color(COLORSCHEME == "semantic" ? COLOR_SEMANTIC_LOAD_BEARING : COLOR_WOOD) {
cube([MAIN_WIDTH, STAND_DEPTH + BACKPLATE_THICKNESS, STAND_THICKNESS]);
@ -61,7 +59,7 @@ module top_main() {
translate([
0,
MAIN_DEPTH - BACKPLATE_THICKNESS - STAND_DEPTH,
MAIN_HEIGHT - TOP_THICKNESS - STAND_HEIGHT + STAND_THICKNESS
_BELOW_STAND + STAND_THICKNESS
]){
rotate([90, 0, 90]){
stand_side();
@ -72,13 +70,22 @@ module top_main() {
translate([
MAIN_WIDTH - STAND_THICKNESS,
MAIN_DEPTH - BACKPLATE_THICKNESS - STAND_DEPTH,
MAIN_HEIGHT - TOP_THICKNESS - STAND_HEIGHT + STAND_THICKNESS
_BELOW_STAND + STAND_THICKNESS
]){
rotate([90, 0, 90]){
stand_side();
}
}
// frame (load bearing construction under table top)
translate([
0,
0,
_BELOW_TOP - FRAME_THICKNESS
]) {
frame(MAIN_WIDTH, MAIN_DEPTH);
}
// cable tray
// tray bottom