2022-10-13 22:35:21 +00:00
|
|
|
include <../config.scad>
|
2022-10-14 01:18:51 +00:00
|
|
|
include <../modules.scad>
|
|
|
|
include <../grid.scad>
|
2022-10-10 07:53:43 +00:00
|
|
|
|
|
|
|
module module_side(width, depth, height, screw_step) {
|
|
|
|
|
|
|
|
// same parameters as, and handed through by, module_base()
|
|
|
|
|
|
|
|
screws_per_side = grid_elements(depth, screw_step);
|
|
|
|
screw_grid_margin = grid_margin(depth, screws_per_side, screw_step);
|
|
|
|
|
|
|
|
difference() {
|
|
|
|
rotate([0, 90, 0]){
|
|
|
|
color(COLOR_WOOD){
|
|
|
|
cube([height, depth, MODULE_THICKNESS]); // main plate
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// screw holes and barrel nut holes
|
|
|
|
translate([
|
|
|
|
MODULE_THICKNESS / 2,
|
|
|
|
screw_grid_margin,
|
|
|
|
0
|
|
|
|
]){
|
2022-10-14 01:18:51 +00:00
|
|
|
for ( xy = grid(1, screws_per_side, 1, screw_step) ) {
|
2022-10-10 07:53:43 +00:00
|
|
|
translate(xy){
|
|
|
|
// top
|
|
|
|
translate([
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
MODULE_THICKNESS - MODULE_SCREW_LENGTH
|
|
|
|
]) {
|
|
|
|
screw_hole();
|
|
|
|
barrel_nut_hole();
|
|
|
|
}
|
|
|
|
|
|
|
|
// bottom
|
|
|
|
translate([
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0 - height - MODULE_THICKNESS
|
|
|
|
]) {
|
|
|
|
translate([0, 0, MODULE_SCREW_LENGTH]){
|
|
|
|
rotate([180, 0, 0]) {
|
|
|
|
screw_hole();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
translate([0, 0, MODULE_SCREW_LENGTH - BARREL_NUT_DIAMETER]){
|
|
|
|
barrel_nut_hole();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module module_base_fit(width_inner, depth_inner, height_inner, num_screws=4) {
|
|
|
|
|
|
|
|
// shorthand to create a base module guaranteed to fit the passed dimensions
|
|
|
|
|
|
|
|
width_outer = _MODULE_RAIL_OFFSET + MODULE_SLIDE_WIDTH + MODULE_THICKNESS + width_inner + MODULE_THICKNESS + MODULE_SLIDE_WIDTH + _MODULE_RAIL_OFFSET;
|
|
|
|
depth_outer = MODULE_THICKNESS + depth_inner + MODULE_THICKNESS;
|
|
|
|
|
|
|
|
width_gridunits = grid_units_length(width_outer);
|
|
|
|
depth_gridunits = grid_units_length(depth_outer);
|
|
|
|
screw_step = floor(depth_gridunits / (num_screws));
|
|
|
|
|
|
|
|
echo("base from measurements:");
|
|
|
|
echo(width_outer);
|
|
|
|
echo(width_gridunits);
|
|
|
|
echo(depth_gridunits);
|
|
|
|
echo(screw_step);
|
|
|
|
|
|
|
|
module_base(width_gridunits, depth_gridunits, height_inner, screw_step);
|
|
|
|
}
|
|
|
|
|
|
|
|
module module_base(width_gridunits, depth_gridunits, height_inner, screw_step=3){
|
|
|
|
|
|
|
|
/* Module base. For use as basis of custom-built or designed modules.
|
|
|
|
* Aligned to fit a module_rail_set of the same gridunit dimensions.
|
|
|
|
*/
|
|
|
|
|
|
|
|
// final width and depth
|
|
|
|
//width = grid_length(width_gridunits) - ((_MODULE_RAIL_OFFSET + MODULE_SLIDE_WIDTH) * 2);
|
|
|
|
width = grid_length(width_gridunits) - _MODULE_RAIL_OFFSET - MODULE_SLIDE_WIDTH - MODULE_THICKNESS - MODULE_THICKNESS - MODULE_SLIDE_WIDTH - _MODULE_RAIL_OFFSET;
|
|
|
|
depth = grid_length(depth_gridunits);
|
|
|
|
|
|
|
|
screws_per_side = grid_elements(depth, screw_step);
|
|
|
|
screw_grid_margin = grid_margin(depth, screws_per_side, screw_step);
|
|
|
|
|
2022-10-14 01:18:51 +00:00
|
|
|
screw_grid = grid(1, screws_per_side, 1, screw_step);
|
2022-10-10 07:53:43 +00:00
|
|
|
|
2022-10-10 12:04:25 +00:00
|
|
|
/*
|
|
|
|
echo("=== MODULE_BASE ===");
|
|
|
|
echo(width_gridunits=width_gridunits, width=width);
|
|
|
|
echo(depth_gridunits=depth_gridunits, depth=depth);
|
|
|
|
echo(height_inner=height_inner);
|
|
|
|
echo(screw_step=screw_step);
|
|
|
|
echo(screws_per_side=screws_per_side);
|
|
|
|
echo(screw_grid_margin=screw_grid_margin);
|
|
|
|
*/
|
2022-10-10 07:53:43 +00:00
|
|
|
|
|
|
|
// align to rail
|
|
|
|
translate([_MODULE_RAIL_OFFSET, 0, -MODULE_RAIL_MARGIN_TOP]) {
|
|
|
|
//translate([0, 0, -MODULE_RAIL_MARGIN_TOP]) {
|
|
|
|
|
|
|
|
// top side, including slide
|
|
|
|
translate([0, 0, -MODULE_THICKNESS]){
|
|
|
|
|
|
|
|
difference(){
|
|
|
|
|
|
|
|
// main plate
|
|
|
|
color(COLOR_WOOD){
|
|
|
|
cube([
|
|
|
|
MODULE_SLIDE_WIDTH + MODULE_THICKNESS + width + MODULE_THICKNESS + MODULE_SLIDE_WIDTH,
|
|
|
|
depth,
|
|
|
|
MODULE_THICKNESS
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// screw holes
|
|
|
|
translate([
|
|
|
|
MODULE_SLIDE_WIDTH + MODULE_THICKNESS / 2,
|
|
|
|
screw_grid_margin,
|
|
|
|
MODULE_THICKNESS - MODULE_SCREW_LENGTH
|
|
|
|
]){
|
|
|
|
for ( xy = screw_grid ) {
|
|
|
|
translate(xy){
|
|
|
|
|
|
|
|
// left
|
|
|
|
screw_hole();
|
|
|
|
|
|
|
|
// right
|
|
|
|
translate([width + MODULE_THICKNESS, 0, 0]){
|
|
|
|
screw_hole();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// left side
|
|
|
|
translate([MODULE_SLIDE_WIDTH, 0, -MODULE_THICKNESS]){
|
|
|
|
module_side(width, depth, height_inner, screw_step);
|
|
|
|
}
|
|
|
|
|
|
|
|
// right side
|
|
|
|
translate([MODULE_SLIDE_WIDTH + MODULE_THICKNESS + width, 0, -MODULE_THICKNESS]){
|
|
|
|
module_side(width, depth, height_inner, screw_step);
|
|
|
|
}
|
|
|
|
|
|
|
|
// bottom side
|
|
|
|
translate([
|
|
|
|
MODULE_SLIDE_WIDTH,
|
|
|
|
0,
|
|
|
|
0 - MODULE_THICKNESS - height_inner - MODULE_THICKNESS
|
|
|
|
]){
|
|
|
|
|
|
|
|
difference() {
|
2022-10-14 01:18:51 +00:00
|
|
|
color(COLORSCHEME == "semantic" ? COLOR_SEMANTIC_USABLE_SURFACE : COLOR_WOOD) {
|
2022-10-10 07:53:43 +00:00
|
|
|
cube([ // main plate
|
|
|
|
MODULE_THICKNESS + width + MODULE_THICKNESS,
|
|
|
|
depth,
|
|
|
|
MODULE_THICKNESS
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// screw holes
|
|
|
|
|
|
|
|
translate([
|
|
|
|
MODULE_THICKNESS / 2,
|
|
|
|
screw_grid_margin,
|
|
|
|
0
|
|
|
|
]) {
|
|
|
|
for ( xy = screw_grid ) {
|
|
|
|
translate(concat(xy, MODULE_SCREW_LENGTH)){
|
|
|
|
|
|
|
|
// left
|
|
|
|
rotate([180, 0, 0]){
|
|
|
|
screw_hole();
|
|
|
|
}
|
|
|
|
|
|
|
|
// right
|
|
|
|
translate([width + MODULE_THICKNESS, 0, 0]){
|
|
|
|
rotate([180, 0, 0]){
|
|
|
|
screw_hole();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// screws and barrel nuts
|
|
|
|
translate([
|
|
|
|
MODULE_SLIDE_WIDTH + MODULE_THICKNESS / 2,
|
|
|
|
screw_grid_margin
|
|
|
|
]) {
|
|
|
|
for ( xy = screw_grid ) {
|
|
|
|
translate(xy){
|
|
|
|
|
|
|
|
// top
|
|
|
|
translate([
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
-MODULE_SCREW_LENGTH
|
|
|
|
]){
|
|
|
|
|
|
|
|
// left
|
|
|
|
screw();
|
|
|
|
barrel_nut();
|
|
|
|
|
|
|
|
// right
|
|
|
|
translate([width + MODULE_THICKNESS, 0]){
|
|
|
|
screw();
|
|
|
|
barrel_nut();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// bottom
|
|
|
|
translate([
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
MODULE_SCREW_LENGTH - MODULE_THICKNESS - height_inner - MODULE_THICKNESS
|
|
|
|
]){
|
|
|
|
|
|
|
|
// left
|
|
|
|
rotate([180, 0, 0]){
|
|
|
|
screw();
|
|
|
|
barrel_nut();
|
|
|
|
}
|
|
|
|
|
|
|
|
// right
|
|
|
|
translate([width + MODULE_THICKNESS, 0]){
|
|
|
|
rotate([180, 0, 0]){
|
|
|
|
screw();
|
|
|
|
barrel_nut();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} // end rail alignment translate
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
module module_rail_left(depth_gridunits, screw_step){
|
|
|
|
|
|
|
|
/* A rail that can be affixed to the underside
|
|
|
|
* of a desk and hold one side of a module.
|
|
|
|
* Aligned so 0,0,0 is the position of the first screws' center
|
|
|
|
*/
|
|
|
|
|
|
|
|
overall_height = MODULE_RAIL_MARGIN_TOP + MODULE_THICKNESS + MODULE_THICKNESS;
|
2022-10-10 12:04:25 +00:00
|
|
|
num_screws = grid_elements((depth_gridunits + screw_step) * GRID_SIZE, screw_step);
|
2022-10-10 07:53:43 +00:00
|
|
|
depth_outer = MODULE_RAIL_MARGIN_SCREW + grid_length(depth_gridunits) + MODULE_RAIL_MARGIN_SCREW;
|
2022-10-14 01:18:51 +00:00
|
|
|
screw_grid = grid(1, num_screws, 1, screw_step);
|
2022-10-10 07:53:43 +00:00
|
|
|
|
|
|
|
difference(){
|
2022-10-14 01:18:51 +00:00
|
|
|
color(COLORSCHEME == "semantic" ? COLOR_SEMANTIC_LOAD_BEARING : COLOR_WOOD) {
|
|
|
|
translate([-MODULE_RAIL_BASE_WIDTH / 2, -MODULE_RAIL_MARGIN_SCREW, -overall_height]){ // 0-align to top, center screw holes on x axis
|
|
|
|
translate([0, 0, MODULE_THICKNESS]){
|
|
|
|
cube([MODULE_RAIL_BASE_WIDTH, depth_outer, MODULE_THICKNESS + MODULE_RAIL_MARGIN_TOP]);
|
|
|
|
}
|
|
|
|
cube([MODULE_RAIL_BASE_WIDTH + MODULE_SLIDE_WIDTH, depth_outer, MODULE_THICKNESS]);
|
2022-10-10 07:53:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for ( xy = screw_grid ) {
|
|
|
|
translate(concat(xy, -MODULE_SCREW_LENGTH)){
|
|
|
|
screw_hole();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module module_rail_right(depth_gridunits, screw_step){
|
|
|
|
|
|
|
|
/* Ditto, but for the right side.
|
|
|
|
*/
|
|
|
|
|
2022-10-10 12:04:25 +00:00
|
|
|
mirror ([1, 0, 0]) {
|
|
|
|
module_rail_left(depth_gridunits, screw_step);
|
2022-10-10 07:53:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module module_rail_set(width_gridunits, depth_gridunits, screw_step){
|
|
|
|
module_rail_left(depth_gridunits, screw_step);
|
|
|
|
|
|
|
|
translate([grid_length(width_gridunits), 0]){
|
|
|
|
module_rail_right(depth_gridunits, screw_step);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// demo setup with rails
|
|
|
|
/*module_rail_left(600);
|
|
|
|
|
|
|
|
translate([
|
|
|
|
MODULE_SLIDE_WIDTH + MODULE_RAIL_BASE_WIDTH + MODULE_SLIDE_WIDTH + 800 + MODULE_SLIDE_WIDTH, // + MODULE_RAIL_MARGIN_SIDE + 800 + MODULE_RAIL_MARGIN_SIDE + MODULE_SLIDE_WIDTH + MODULE_RAIL_BASE_WIDTH,
|
|
|
|
600,
|
|
|
|
0
|
|
|
|
]){
|
|
|
|
rotate([0,0, 180]){
|
|
|
|
module_rail_left(600);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
translate([MODULE_SLIDE_WIDTH - MODULE_RAIL_BASE_WIDTH / 2 + MODULE_RAIL_MARGIN_SIDE, 0, -MODULE_RAIL_MARGIN_TOP]){
|
|
|
|
module_base(800, 600, 700, 4);
|
|
|
|
}*/
|
|
|
|
|
|
|
|
//module_side(800, 600, 700, 3);
|
|
|
|
//module_base(800, 600, 700, 3);
|
|
|
|
//module_base_fit(550, 600, 700, 5);
|
|
|
|
|
|
|
|
//screw_hole();
|
|
|
|
//screw();
|
|
|
|
//barrel_nut();
|
|
|
|
/*translate([0, 0, -200]){
|
|
|
|
//module_rail_left(12, 3);
|
|
|
|
module_rail_right(12, 3);
|
|
|
|
}*/
|
|
|
|
|
|
|
|
/*module_rail_set(10, 15, 2);
|
|
|
|
module_base(10, 15, 700, 2);*/
|
|
|
|
|
|
|
|
|
2022-10-14 01:18:51 +00:00
|
|
|
/*for(xy = grid(15, 15, 1, 1)){
|
2022-10-10 07:53:43 +00:00
|
|
|
translate(xy) { screw(); }
|
|
|
|
}*/
|
|
|
|
|
|
|
|
/*module newtransl() {
|
|
|
|
translate([100, 100, 100]) {
|
|
|
|
children();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
newtransl(){
|
|
|
|
screw();
|
|
|
|
}*/
|
|
|
|
|
|
|
|
// a bunch of demo instances to make reasonably sure no wonkiness occurs
|
|
|
|
module_base(8, 8, 300, 1);
|
|
|
|
module_rail_set(8, 8, 1);
|
|
|
|
|
|
|
|
translate ([1100, 0]) {
|
|
|
|
module_base(9, 9, 300, 2);
|
|
|
|
module_rail_set(9, 9, 2);
|
|
|
|
}
|
|
|
|
|
2022-10-10 12:04:25 +00:00
|
|
|
|
2022-10-10 07:53:43 +00:00
|
|
|
translate ([2200, 0]) {
|
|
|
|
module_base(13, 5, 600, 3);
|
|
|
|
module_rail_set(13, 5, 3);
|
|
|
|
}
|
|
|
|
|
|
|
|
translate ([3300, 0]){
|
|
|
|
module_base(17, 9, 200, 3);
|
|
|
|
module_rail_set(17, 9, 3);
|
|
|
|
}
|
|
|
|
|
|
|
|
translate ([0, 1000]) {
|
|
|
|
module_base(12, 17, 500, 5);
|
|
|
|
module_rail_set(12, 17, 5);
|
|
|
|
}
|
|
|
|
|
|
|
|
translate ([1100, 1000]) {
|
|
|
|
module_base(20, 20, 500, 6);
|
|
|
|
module_rail_set(20, 20, 6);
|
|
|
|
}
|
|
|
|
|
|
|
|
translate ([2200, 1000]) {
|
|
|
|
module_base(15, 30, 800, 9);
|
|
|
|
module_rail_set(15, 30, 9);
|
|
|
|
}
|
|
|
|
|
|
|
|
translate ([3300, 1000]) {
|
|
|
|
module_base(19, 17, 300, 3);
|
|
|
|
module_rail_set(19, 17, 3);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// try making something to fit a 19" rack
|
|
|
|
/*rack_width_gridunits = grid_units_length(550);
|
|
|
|
rack_depth_gridunits = grid_units_length(650);
|
|
|
|
module_base(rack_width_gridunits, rack_depth_gridunits, 700, 3);
|
|
|
|
module_rail_set(rack_width_gridunits, rack_depth_gridunits, 3);*/
|