Compare commits
7 Commits
365faebfcb
...
155cba6d85
Author | SHA1 | Date |
---|---|---|
Brian S. Stephan | 155cba6d85 | |
Brian S. Stephan | 0708540ac7 | |
Brian S. Stephan | 4c224b8a60 | |
Brian S. Stephan | e2e6acc0ca | |
Brian S. Stephan | 3b886d3994 | |
Brian S. Stephan | d97f68a5cd | |
Brian S. Stephan | 390df34f2b |
|
@ -8,7 +8,7 @@ include <components.scad>
|
|||
|
||||
module bottom_panel_solo() {
|
||||
difference() {
|
||||
overhang_plate();
|
||||
rotate([180, 0, 0]) base_panel_with_raised_overhang();
|
||||
rotate([180, 0, 0]) panel_holes();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,7 +57,7 @@ module frame_hex_bolt_hole() {
|
|||
}
|
||||
|
||||
module frame_interchange_hole() {
|
||||
cylinder(r=15, h=50, $fn=50, center=true);
|
||||
cylinder(r=18, h=50, $fn=4, center=true);
|
||||
}
|
||||
|
||||
module neutrik_d_hole() {
|
||||
|
@ -83,7 +83,7 @@ module rocker_20mm_mount() {
|
|||
|
||||
// space for a neutrik D mount or 24mm button - Z is to cut the whole inside without affecting panel lip
|
||||
module frame_cutout() {
|
||||
cube([30.5, 8, frame_z-(panel_z*2)-2], center=true);
|
||||
cube([30.5, 8, frame_z-(panel_z*2)], center=true);
|
||||
}
|
||||
|
||||
// bank of three 24mm buttons, commonly on a frame face
|
||||
|
@ -195,7 +195,7 @@ module base_panel() {
|
|||
}
|
||||
|
||||
module base_bottom_panel() {
|
||||
cube([panel_x, panel_y, panel_z], center=true);
|
||||
mirror([0, 0, 1]) base_panel();
|
||||
}
|
||||
|
||||
module panel() {
|
||||
|
@ -244,15 +244,35 @@ module panel_with_raised_overhang() {
|
|||
module frame_box() {
|
||||
difference() {
|
||||
top_points = [
|
||||
// top part, majority of shape
|
||||
[(frame_x/2)-3, (frame_y/2)-3, panel_z/2],
|
||||
[-(frame_x/2)+3, (frame_y/2)-3, panel_z/2],
|
||||
[(frame_x/2)-3, -(frame_y/2)+3, panel_z/2],
|
||||
[-(frame_x/2)+3, -(frame_y/2)+3, panel_z/2],
|
||||
// top bevel
|
||||
[(frame_x/2)-4, (frame_y/2)-4, frame_z/2-frame_bevel_height/2],
|
||||
[-(frame_x/2)+4, (frame_y/2)-4, frame_z/2-frame_bevel_height/2],
|
||||
[(frame_x/2)-4, -(frame_y/2)+4, frame_z/2-frame_bevel_height/2],
|
||||
[-(frame_x/2)+4, -(frame_y/2)+4, frame_z/2-frame_bevel_height/2],
|
||||
];
|
||||
base_points = [
|
||||
// majority of shape
|
||||
[(frame_x/2)-2, (frame_y/2)-2, 0],
|
||||
[-(frame_x/2)+2, (frame_y/2)-2, 0],
|
||||
[(frame_x/2)-2, -(frame_y/2)+2, 0],
|
||||
[-(frame_x/2)+2, -(frame_y/2)+2, 0],
|
||||
];
|
||||
bottom_points = [
|
||||
// bottom bevel
|
||||
[(frame_x/2)-4, (frame_y/2)-4, -frame_z/2+frame_bevel_height/2],
|
||||
[-(frame_x/2)+4, (frame_y/2)-4, -frame_z/2+frame_bevel_height/2],
|
||||
[(frame_x/2)-4, -(frame_y/2)+4, -frame_z/2+frame_bevel_height/2],
|
||||
[-(frame_x/2)+4, -(frame_y/2)+4, -frame_z/2+frame_bevel_height/2],
|
||||
];
|
||||
hull() {
|
||||
for (p = top_points) {
|
||||
translate(p) cylinder(r=3, h=frame_z-panel_z, center=true);
|
||||
translate(p) cylinder(r=2, h=frame_bevel_height, center=true);
|
||||
}
|
||||
for (p = base_points) {
|
||||
translate(p) cylinder(r=2, h=frame_z-(frame_bevel_height*2), center=true);
|
||||
}
|
||||
for (p = bottom_points) {
|
||||
translate(p) cylinder(r=2, h=frame_bevel_height, center=true);
|
||||
}
|
||||
}
|
||||
// cut out the middle to make it a box
|
||||
|
@ -300,18 +320,12 @@ module frame() {
|
|||
difference() {
|
||||
base_frame();
|
||||
translate([0, 0, frame_z/2]) scale([1, 1, 2]) base_panel();
|
||||
translate([0, 0, -frame_z/2]) scale([1, 1, 2]) base_panel();
|
||||
translate([0, 0, -frame_z/2]) scale([1, 1, 2]) bottom_panel();
|
||||
translate([panel_to_frame_point_x, panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
|
||||
translate([-panel_to_frame_point_x, panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
|
||||
translate([panel_to_frame_point_x, -panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
|
||||
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, 0]) frame_hex_bolt_hole();
|
||||
|
||||
// comfort bevel
|
||||
translate([frame_x/2, 0, frame_z/2]) rotate([0, 45, 0]) cube([4, frame_y+0.01, 4], center=true);
|
||||
translate([-frame_x/2, 0, frame_z/2]) rotate([0, 45, 0]) cube([4, frame_y+0.01, 4], center=true);
|
||||
translate([0, frame_y/2, frame_z/2]) rotate([45, 0, 0]) cube([frame_x+0.01, 4, 4], center=true);
|
||||
translate([0, -frame_y/2, frame_z/2]) rotate([45, 0, 0]) cube([frame_x+0.01, 4, 4], center=true);
|
||||
|
||||
// slightly larger holes than the posts in the base_panel
|
||||
translate([panel_to_frame_point_x, panel_to_frame_point_y, frame_z/2-panel_z-5])
|
||||
scale([1.55, 1.55, 0.2]) frame_hex_bolt_hole();
|
||||
|
|
|
@ -24,15 +24,15 @@ module left_frame() {
|
|||
frame_cable_routing_hole();
|
||||
|
||||
// aux button holes
|
||||
translate([-35, 101.5, panel_z/2]) rotate([270, 0, 0]) aux_control_three_button_cluster();
|
||||
translate([-35, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
|
||||
translate([-72, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
|
||||
translate([2, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
|
||||
translate([-35, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
|
||||
translate([-35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
translate([-72, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
translate([2, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
|
||||
// neutrix button hole
|
||||
translate([frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
|
||||
translate([frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, 0])
|
||||
rotate([90, 0, 0]) neutrik_d_mount();
|
||||
translate([frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness-4, 1])
|
||||
translate([frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness-4, 0])
|
||||
frame_cutout();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,15 +27,15 @@ module middle_frame() {
|
|||
mirror([1, 0, 0]) frame_cable_routing_hole();
|
||||
|
||||
// neutrik mounts for connector, switches
|
||||
translate([0, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
|
||||
translate([0, (frame_y/2)-neutrik_panel_thickness, 0])
|
||||
rotate([90, 0, 0]) neutrik_d_mount();
|
||||
translate([0, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
|
||||
translate([-40, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
|
||||
translate([0, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
translate([-40, (frame_y/2)-neutrik_panel_thickness, 0])
|
||||
rotate([90, 0, 0]) neutrik_d_mount();
|
||||
translate([-40, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
|
||||
translate([40, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
|
||||
translate([-40, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
translate([40, (frame_y/2)-neutrik_panel_thickness, 0])
|
||||
rotate([90, 0, 0]) neutrik_d_mount();
|
||||
translate([40, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
|
||||
translate([40, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
|
@ -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();
|
|
@ -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();
|
|
@ -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();
|
|
@ -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();
|
|
@ -24,15 +24,15 @@ module right_frame() {
|
|||
mirror([1, 0, 0]) frame_cable_routing_hole();
|
||||
|
||||
// aux button holes
|
||||
translate([35, 101.5, panel_z/2]) rotate([270, 0, 0]) aux_control_three_button_cluster();
|
||||
translate([35, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
|
||||
translate([72, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
|
||||
translate([-2, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
|
||||
translate([35, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
|
||||
translate([35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
translate([72, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
translate([-2, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
|
||||
// neutrix button hole
|
||||
translate([-frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, panel_z/2])
|
||||
translate([-frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness, 0])
|
||||
rotate([90, 0, 0]) neutrik_d_mount();
|
||||
translate([-frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness-4, 1])
|
||||
translate([-frame_center_to_neutrik, (frame_y/2)-neutrik_panel_thickness-4, 0])
|
||||
frame_cutout();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,25 +11,25 @@ module solo_frame() {
|
|||
frame();
|
||||
|
||||
// neutrik mounts for connector, switches
|
||||
translate([0, (frame_y/2)-2.5, panel_z/2]) rotate([90, 0, 0]) neutrik_d_mount();
|
||||
translate([0, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
|
||||
translate([-40, (frame_y/2)-2.5, panel_z/2]) rotate([90, 0, 0]) neutrik_d_mount();
|
||||
translate([-40, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
|
||||
translate([40, (frame_y/2)-2.5, panel_z/2]) rotate([90, 0, 0]) neutrik_d_mount();
|
||||
translate([40, (frame_y/2)-neutrik_panel_thickness-4, 1]) frame_cutout();
|
||||
translate([0, (frame_y/2)-2.5, 0]) rotate([90, 0, 0]) neutrik_d_mount();
|
||||
translate([0, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
translate([-40, (frame_y/2)-2.5, 0]) rotate([90, 0, 0]) neutrik_d_mount();
|
||||
translate([-40, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
translate([40, (frame_y/2)-2.5, 0]) rotate([90, 0, 0]) neutrik_d_mount();
|
||||
translate([40, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
|
||||
// aux button holes
|
||||
translate([-frame_x/2+2.5, 0, panel_z/2]) rotate([90, 0, 270])
|
||||
translate([-frame_x/2+2.5, 0, 0]) rotate([90, 0, 270])
|
||||
aux_control_three_button_cluster();
|
||||
translate([(frame_x/2)-neutrik_panel_thickness-4, 0, 1]) rotate([0, 0, 90]) frame_cutout();
|
||||
translate([(frame_x/2)-neutrik_panel_thickness-4, -37, 1]) rotate([0, 0, 90]) frame_cutout();
|
||||
translate([(frame_x/2)-neutrik_panel_thickness-4, 37, 1]) rotate([0, 0, 90]) frame_cutout();
|
||||
translate([(frame_x/2)-neutrik_panel_thickness-4, 0, 0]) rotate([0, 0, 90]) frame_cutout();
|
||||
translate([(frame_x/2)-neutrik_panel_thickness-4, -37, 0]) rotate([0, 0, 90]) frame_cutout();
|
||||
translate([(frame_x/2)-neutrik_panel_thickness-4, 37, 0]) rotate([0, 0, 90]) frame_cutout();
|
||||
|
||||
translate([frame_x/2+2.5, 0, panel_z/2]) rotate([90, 0, 270])
|
||||
translate([frame_x/2+2.5, 0, 0]) rotate([90, 0, 270])
|
||||
aux_control_three_button_cluster();
|
||||
translate([-(frame_x/2)+neutrik_panel_thickness+4, 0, 1]) rotate([0, 0, 90]) frame_cutout();
|
||||
translate([-(frame_x/2)+neutrik_panel_thickness+4, -37, 1]) rotate([0, 0, 90]) frame_cutout();
|
||||
translate([-(frame_x/2)+neutrik_panel_thickness+4, 37, 1]) rotate([0, 0, 90]) frame_cutout();
|
||||
translate([-(frame_x/2)+neutrik_panel_thickness+4, 0, 0]) rotate([0, 0, 90]) frame_cutout();
|
||||
translate([-(frame_x/2)+neutrik_panel_thickness+4, -37, 0]) rotate([0, 0, 90]) frame_cutout();
|
||||
translate([-(frame_x/2)+neutrik_panel_thickness+4, 37, 0]) rotate([0, 0, 90]) frame_cutout();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -37,6 +37,10 @@ frame_x = 233;
|
|||
frame_y = 208;
|
||||
frame_z = 57;
|
||||
|
||||
// this sinks the bottom and top of the frame inward a bit, and is used to math out two shapes
|
||||
// when creating the frame box
|
||||
frame_bevel_height = 2;
|
||||
|
||||
frame_center_to_neutrik = 70;
|
||||
|
||||
// depth of the "lip" of the frame that the top plate sets into/supports the overhang
|
||||
|
|
Loading…
Reference in New Issue