modularize the frame into separate wall pieces

this provides a system for interlocking frame walls as separate pieces,
rather than a whole frame box as one piece. the primary motivation for
this was to improve print quality. these pieces can be printed flat side
down, meaning improvements due to:

1. printing the box required the long, thin bottom to be the side on the
   print surface, which meant shrinkage force would curl the corners
   with essentially no remedy outside of bed adhesive
2. printing the box bottom up created poor circles for the button holes,
   sometimes bad enough to be a visible problem, as well as making small
   flow glitches to stand out (especially on non-matte PLA)
3. printing the box also required supports when the frame bottom was
   inset-style, leading to an annoying post-print step
4. the outward side is now what rests on the print surface, yielding a
   nicer, more consistent surface

the box modules still exist in the event someone wants them, but I
personally will probably be focused on this method going forward. this
also opens up some exciting options regarding color mixing, different
side panel shapes, and the like, so I expect to see more of these even
if the boxes don't go away (especially since these new pieces are all
derived from the boxes anyway).

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
This commit is contained in:
Brian S. Stephan 2024-03-03 18:33:55 -06:00
parent 0708540ac7
commit 155cba6d85
Signed by: bss
GPG Key ID: 3DE06D3180895FCB
5 changed files with 130 additions and 0 deletions

View File

@ -0,0 +1,26 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frame-left.scad>
module bottom_left_or_right_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
intersection() {
left_frame();
difference() {
// include the whole bottom wall (including mount columns)
translate([0, -(frame_y/2)+(piece_width/2), 0]) cube([frame_x, piece_width, frame_z], center=true);
// ...minus the frame wall (lip) on the left but leaving the very bottom lip
translate([-frame_x/2+frame_wall/2, 0, 0])
cube([frame_wall, frame_y-(frame_wall*2), frame_z], center=true);
// ...minus a slot for the combining piece to go into
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true);
}
}
}
bottom_left_or_right_frame_piece();

View File

@ -0,0 +1,28 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frame-piece-side.scad>
module interconnect_frame_half_piece() {
translate([frame_x/2-frame_wall, 0, 0]) difference() {
side_frame_piece();
rotate([0, 0, 180]) side_chopper();
}
}
module interconnect_frame_piece() {
difference() {
union() {
// slight translate is to make this a 2-manifold in OpenSCAD
translate([-0.01, 0, 0]) interconnect_frame_half_piece();
mirror([1, 0, 0]) interconnect_frame_half_piece();
}
translate([-frame_x/2, 0, 0]) frame_cable_routing_hole();
}
}
interconnect_frame_piece();

24
src/frame-piece-side.scad Normal file
View File

@ -0,0 +1,24 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frame-piece-top-left.scad>
use <frame-piece-bottom-left-or-right.scad>
module side_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
difference() {
// side piece is left/right agnostic
frame();
// minus the top and bottom
top_left_frame_piece();
bottom_left_or_right_frame_piece();
// and just chop out the rest of the frame
translate([piece_width, 0, 0]) cube([frame_x, frame_y+1, frame_z+1], center=true);
}
}
side_frame_piece();

View File

@ -0,0 +1,26 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frame-left.scad>
module top_left_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
intersection() {
left_frame();
difference() {
// include the whole top wall (including mount columns)
translate([0, (frame_y/2)-(piece_width/2), 0]) cube([frame_x, piece_width, frame_z], center=true);
// ...minus the frame wall (lip) on the left but leaving the very top lip
translate([-frame_x/2+frame_wall/2, 0, 0])
cube([frame_wall, frame_y-(frame_wall*2), frame_z], center=true);
// ...minus a slot for the combining piece to go into
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true);
}
}
}
top_left_frame_piece();

View File

@ -0,0 +1,26 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frame-right.scad>
module top_right_frame_piece() {
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
intersection() {
right_frame();
difference() {
// include the whole top wall (including mount columns)
translate([0, (frame_y/2)-(piece_width/2), 0]) cube([frame_x, piece_width, frame_z], center=true);
// ...minus the frame wall (lip) on the left but leaving the very top lip
translate([frame_x/2-frame_wall/2, 0, 0])
cube([frame_wall, frame_y-(frame_wall*2), frame_z], center=true);
// ...minus a slot for the combining piece to go into
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true);
}
}
}
top_right_frame_piece();