Compare commits
12 Commits
Author | SHA1 | Date |
---|---|---|
Brian S. Stephan | b43b79ce19 | |
Brian S. Stephan | f93f20997a | |
Brian S. Stephan | 70b45fa18b | |
Brian S. Stephan | e50629d372 | |
Brian S. Stephan | 01d4d95f24 | |
Brian S. Stephan | 4cefdfa26b | |
Brian S. Stephan | dabfc4258b | |
Brian S. Stephan | a7206add7c | |
Brian S. Stephan | d70a2f90c6 | |
Brian S. Stephan | 0513da125f | |
Brian S. Stephan | e7543dceb0 | |
Brian S. Stephan | 45439cbf6d |
|
@ -9,11 +9,47 @@ I do not request the copyright of contributions be assigned to me or to the proj
|
|||
be allowed to relicense your contributions. My personal oath is to maintain inbound=outbound in my open source projects,
|
||||
and the expectation is authors are responsible for their contributions.
|
||||
|
||||
I am following the the [Developer Certificate of Origin (DCO)](https://developercertificate.org/), also available at
|
||||
`DCO.txt`. The DCO is a way for contributors to certify that they wrote or otherwise have the right to license their
|
||||
code contributions to the project. Contributors must sign-off that they adhere to these requirements by adding a
|
||||
`Signed-off-by` line to their commit message, and/or, for frequent contributors, by signing off on their entry in
|
||||
`MAINTAINERS.md`.
|
||||
I am following the [Developer Certificate of Origin (DCO)](https://developercertificate.org/), reproduced below. The DCO
|
||||
is a way for contributors to certify that they wrote or otherwise have the right to license their code contributions to
|
||||
the project. Contributors must sign-off that they adhere to these requirements by adding a `Signed-off-by` line to their
|
||||
commit message, and/or, for frequent contributors, by signing off on their entry in `MAINTAINERS.md`.
|
||||
|
||||
```
|
||||
Developer Certificate of Origin
|
||||
Version 1.1
|
||||
|
||||
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this
|
||||
license document, but changing it is not allowed.
|
||||
|
||||
|
||||
Developer's Certificate of Origin 1.1
|
||||
|
||||
By making a contribution to this project, I certify that:
|
||||
|
||||
(a) The contribution was created in whole or in part by me and I
|
||||
have the right to submit it under the open source license
|
||||
indicated in the file; or
|
||||
|
||||
(b) The contribution is based upon previous work that, to the best
|
||||
of my knowledge, is covered under an appropriate open source
|
||||
license and I have the right under that license to submit that
|
||||
work with modifications, whether created in whole or in part
|
||||
by me, under the same open source license (unless I am
|
||||
permitted to submit under a different license), as indicated
|
||||
in the file; or
|
||||
|
||||
(c) The contribution was provided directly to me by some other
|
||||
person who certified (a), (b) or (c) and I have not modified
|
||||
it.
|
||||
|
||||
(d) I understand and agree that this project and the contribution
|
||||
are public and that a record of the contribution (including all
|
||||
personal information I submit with it, including my sign-off) is
|
||||
maintained indefinitely and may be redistributed consistent with
|
||||
this project or the open source license(s) involved.
|
||||
```
|
||||
|
||||
This process is followed by a number of open source projects, most notably the Linux kernel. Here's the gist of it:
|
||||
|
||||
|
|
34
DCO.txt
34
DCO.txt
|
@ -1,34 +0,0 @@
|
|||
Developer Certificate of Origin
|
||||
Version 1.1
|
||||
|
||||
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this
|
||||
license document, but changing it is not allowed.
|
||||
|
||||
|
||||
Developer's Certificate of Origin 1.1
|
||||
|
||||
By making a contribution to this project, I certify that:
|
||||
|
||||
(a) The contribution was created in whole or in part by me and I
|
||||
have the right to submit it under the open source license
|
||||
indicated in the file; or
|
||||
|
||||
(b) The contribution is based upon previous work that, to the best
|
||||
of my knowledge, is covered under an appropriate open source
|
||||
license and I have the right under that license to submit that
|
||||
work with modifications, whether created in whole or in part
|
||||
by me, under the same open source license (unless I am
|
||||
permitted to submit under a different license), as indicated
|
||||
in the file; or
|
||||
|
||||
(c) The contribution was provided directly to me by some other
|
||||
person who certified (a), (b) or (c) and I have not modified
|
||||
it.
|
||||
|
||||
(d) I understand and agree that this project and the contribution
|
||||
are public and that a record of the contribution (including all
|
||||
personal information I submit with it, including my sign-off) is
|
||||
maintained indefinitely and may be redistributed consistent with
|
||||
this project or the open source license(s) involved.
|
|
@ -0,0 +1,4 @@
|
|||
# The Attic
|
||||
|
||||
This directory includes abandoned pieces that I'd like to revisit some time, but I cannot support or recommend using
|
||||
as-is. Print at your own caution, or better yet, maybe fix them!
|
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
* A stick mount that fits rectangular (non-extended) BSS sticks.
|
||||
*
|
||||
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
include <../parameters.scad>
|
||||
include <../components.scad>
|
||||
|
||||
holder_x = 114;
|
||||
holder_y = 60;
|
||||
holder_z = 45;
|
||||
tall_holder_post = frame_y-10;
|
||||
|
||||
module stick_holder() {
|
||||
difference() {
|
||||
cube([holder_x, holder_y, holder_z], center=true);
|
||||
translate([14, 0, 132]) rotate([90, -40, 0]) frame_solid();
|
||||
}
|
||||
}
|
||||
|
||||
module mount() {
|
||||
difference() {
|
||||
union() {
|
||||
// lowest post
|
||||
translate([62, -frame_z-25, holder_z/2]) stick_holder(); // top = 45
|
||||
|
||||
// middle post
|
||||
translate([0, 0, ((tall_holder_post)/2)/2])
|
||||
cube([holder_x, holder_y, (tall_holder_post)/2], center=true);
|
||||
translate([0, 0, ((tall_holder_post)/2)+holder_z/2]) stick_holder(); // top = 139
|
||||
|
||||
// highest post
|
||||
translate([-62, frame_z+25, tall_holder_post/2])
|
||||
cube([holder_x, holder_y, tall_holder_post], center=true);
|
||||
translate([-62, frame_z+25, tall_holder_post+holder_z/2]) stick_holder(); // top = 233
|
||||
|
||||
// post stabilizers
|
||||
translate([31, -41, holder_z/2]) cube([52, 23, holder_z], center=true);
|
||||
translate([-31, 41, ((tall_holder_post/2)+holder_z)/2])
|
||||
cube([52, 23, (tall_holder_post/2)+holder_z], center=true);
|
||||
|
||||
// base
|
||||
hull() {
|
||||
translate([110, 103, -2.5]) cylinder(r=15, h=5, center=true);
|
||||
translate([110, -103, -2.5]) cylinder(r=15, h=5, center=true);
|
||||
translate([-110, 103, -2.5]) cylinder(r=15, h=5, center=true);
|
||||
translate([-110, -103, -2.5]) cylinder(r=15, h=5, center=true);
|
||||
}
|
||||
|
||||
// placard
|
||||
translate([0, -112, 15]) cube([frame_y, 5, 30], center=true);
|
||||
|
||||
/* // test */
|
||||
/* translate([62+14, -frame_z-25, 132+holder_z/2]) rotate([90, -40, 0]) frame_solid(); */
|
||||
/* translate([14, 0, 132+(frame_y/2)-20+holder_z/2]) rotate([90, -40, 0]) frame_solid(); */
|
||||
/* translate([-62+14, frame_z+25, 132+tall_holder_post+holder_z/2]) rotate([90, -40, 0]) frame_solid(); */
|
||||
}
|
||||
// text on the placard
|
||||
translate([-frame_z*3.3/2.5, -holder_x, 15]) rotate([90, 0, 0])
|
||||
linear_extrude(1) text("Buildable Stick System", font="Noto Sans");
|
||||
translate([-frame_z*3.3/2.5, -holder_x, 4]) rotate([90, 0, 0])
|
||||
linear_extrude(1) text("v4 by bss", font="Noto Sans", size=6);
|
||||
}
|
||||
}
|
||||
|
||||
mount();
|
|
@ -5,45 +5,32 @@ Just some miscellaneous notes for any dear reader, or more likely, my own forget
|
|||
## Putting a BSS Stick Together
|
||||
|
||||
Assembly of a stick is pretty straightforward, but there are some choices that can make it easier or harder. The
|
||||
following is the most consistent way I've found to put one together. This is assuming a v4.1 or beyond stick, with two
|
||||
following is the most consistent way I've found to put one together. This is assuming a v4.2 or beyond stick, with two
|
||||
panels to make a long standard stick, and the frame made of pieces.
|
||||
|
||||
1. Prepare the frame top pieces --- `frame-piece-top-{left,right}`: this is your best shot to get auxillary buttons,
|
||||
1. Prepare the frame top pieces --- `frame-piece-top-left-or-right`: this is your best shot to get auxillary buttons,
|
||||
panel connectors, and the like installed, so do it now, and give them a good tighten. You shouldn't need to adjust
|
||||
these again, so finish their installation while the pieces are free.
|
||||
1. This of course includes decorative plates --- e.g. `misc-decorative-plate-aux-control-three-button-cluster` ---
|
||||
you may choose to use. These are held to the top pieces by the buttons or component mounting screws.
|
||||
2. Start the top panels --- `top-panel-(inset|overhang)-*`: you want both to get the components installed now
|
||||
when it's easy, and to make sure that the overall assembly works with your components, so again get your buttons,
|
||||
lever, etc., in place.
|
||||
lever, etc., in place. You can secure them at this point.
|
||||
1. If you are using a button decorative plate that spans two panels --- e.g.
|
||||
`src/misc-decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one` --- don't tighten the buttons all the way,
|
||||
as you may need some wiggle to align the panels to the frame in a later step.
|
||||
2. If the above isn't the case, you can tighten all your buttons now.
|
||||
3. If using a lever, don't forget the lever mount spacer --- `src/misc-lever-mount-sanwa-seimitsu` --- if you want
|
||||
`src/misc-decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one` --- take care to align the two panels as
|
||||
tightly as possible, and accurately, as they will be hard to adjust once everything is secured and in the frame.
|
||||
2. If using a lever, don't forget the lever mount spacer --- `src/misc-lever-mount-sanwa-seimitsu` --- if you want
|
||||
it, and tighten those mounting bolts now as well.
|
||||
3. Create the frame box by combining your `frame-piece-*` parts together. This will be relatively stable just via
|
||||
friction fit.
|
||||
4. Rest the frame top-up on a desk, and put the standoffs through the holes.
|
||||
5. Insert the top panels into the frame. The friction on this will probably be tight, and you may not be able to muscle
|
||||
it in on your own. Get the panel posts at least partially into the frame columns, in any event. If you get all the
|
||||
panels completely in, the next steps will be easier, but it's not imperative.
|
||||
6. Start the bolts for the top panels. Get it so that the bolts catch the standoffs, but don't tighten them completely.
|
||||
You will want some wiggle when connecting the bottom panels, which is maybe the hardest part. Depending on your bolts
|
||||
and how deep into the frame you got the top panels, you might need to push the standoffs up the column in order to
|
||||
catch them with the bolts.
|
||||
4. Rest the frame top-up on a desk, and put the standoffs through the holes. This will probably be tight, and you may
|
||||
even need a rubber mallet or similar to drive the standoffs through the holes.
|
||||
5. Insert the top panels into the frame.
|
||||
6. Insert the bolts for the top panels, make any last adjustments, and tighten them.
|
||||
7. At this point you have an open box with access to all your components. Do all of your wiring.
|
||||
1. Tighten the buttons and etc. if you didn't in step 2.
|
||||
2. TEST YOUR BOARD AND COMPONENTS NOW! You don't want to have to undo the rest of the steps for something trivial,
|
||||
trust me.
|
||||
8. Insert the bottom panels into the frame. This may be difficult. If you got the top panels into the frame in step 4,
|
||||
and left the bolts loose in step 5, you can make the standoffs rise outside of the frame column, which makes it
|
||||
easier to line up the standoffs with the bottom panel posts.
|
||||
9. Drive the bottom bolts into the standoffs. You probably don't have the panels all the way into the frame, but if you
|
||||
can at least get the standoffs in the posts, you can catch them with the bottom bolts, and then let them guide the
|
||||
panels into the frame.
|
||||
10. Tighten all the bolts. If you didn't get the top panels flush in step 4, you can apply the same logic as in step 8
|
||||
and tighten the bolts to guide the panels into the frame.
|
||||
8. Insert the bottom panels into the frame.
|
||||
9. Insert the bottom bolts for the bottom panels, and tighten them.
|
||||
|
||||
In the end, this should be extremely sturdy. None of the frame or panels should be loose at all, and you should be able
|
||||
to move, flip, gently toss, etc. the stick without anything moving or feeling loose.
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 59 KiB |
|
@ -27,17 +27,8 @@ perfect pattern, making the long lines stand out even more.
|
|||
seem to have issues with filling curves and you still want to try to maximize contact with walls. Concentric is great
|
||||
here if you dial it in.
|
||||
|
||||
Panels may have tiny gaps against the circular button cutouts; this is largely not a problem as buttom rims, decorative
|
||||
plates, etc. will cover it up. However, I've had some interesting results with:
|
||||
|
||||
* Initial layer line width: 0.42mm (down .08mm)
|
||||
* Initial layer height: 0.25mm (up .05mm)
|
||||
* Initial layer nozzle temperature: 230°C (up 10°C)
|
||||
* Initial layer bed temperature: 70°C (up 5°C)
|
||||
* Initial layer pattern: concentric
|
||||
|
||||
These are good defaults and print awesome parts, with the only exception being the top panels, which benefit from using
|
||||
a Hilbert curve initial layer pattern instead of concentric.
|
||||
The concentric pattern is a good default and prints awesome parts, with the only exception being the top panels, which
|
||||
benefit from using a Hilbert curve initial layer pattern instead of concentric.
|
||||
|
||||
## Materials
|
||||
|
||||
|
|
|
@ -5,8 +5,10 @@
|
|||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <frame-left.scad>
|
||||
use <frame-right.scad>
|
||||
use <frame-piece-bottom-left-or-right.scad>
|
||||
use <frame-piece-interconnect.scad>
|
||||
use <frame-piece-side.scad>
|
||||
use <frame-piece-top-left-or-right.scad>
|
||||
use <top-panel-overhang-left-lever-and-dir_arc-plus-w-30mm.scad>
|
||||
use <top-panel-overhang-right-sega-2p-plus-one-plus-control-with-mount.scad>
|
||||
use <bottom-panel-overhang-left.scad>
|
||||
|
@ -17,8 +19,13 @@ use <misc-dustwasher-lsx-nobi.scad>
|
|||
|
||||
color("#C12E1F") translate([-panel_x/2-25, 0, frame_z/2+75]) top_panel_left_lever_and_dir_arc_w_30mm();
|
||||
color("#C12E1F") translate([panel_x/2+25, 0, frame_z/2+75]) top_panel_right_sega_2p_plus_one_plus_control_with_mount();
|
||||
color("black") translate([-frame_x/2+5-25, 0, -2.5]) left_frame();
|
||||
color("black") translate([frame_x/2+25, 0, -2.5]) right_frame();
|
||||
color("black") translate([-frame_x/2+5-25, 35, -2.5]) top_left_or_right_frame_piece();
|
||||
color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-25, 35, -2.5]) top_left_or_right_frame_piece();
|
||||
color("black") translate([-frame_x/2+5-50, 0, -2.5]) side_frame_piece();
|
||||
color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-50, 0, -2.5]) side_frame_piece();
|
||||
color("black") translate([-frame_x/2+5-25, -35, -2.5]) bottom_left_or_right_frame_piece();
|
||||
color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-25, -35, -2.5]) bottom_left_or_right_frame_piece();
|
||||
color("black") interconnect_frame_piece();
|
||||
color("#C12E1F") translate([-panel_x/2-25, 0, -5-frame_z/2-75]) bottom_panel_left();
|
||||
color("#C12E1F") translate([panel_x/2+25, 0, -5-frame_z/2-75]) bottom_panel_right();
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ module frame_hex_bolt_hole() {
|
|||
}
|
||||
|
||||
module frame_interchange_hole() {
|
||||
cylinder(r=18, h=50, $fn=4, center=true);
|
||||
cylinder(r=35, h=50, $fn=50, center=true);
|
||||
}
|
||||
|
||||
module neutrik_d_hole() {
|
||||
|
@ -164,32 +164,7 @@ module levermountcountersinks() {
|
|||
}
|
||||
|
||||
module base_panel() {
|
||||
difference() {
|
||||
union() {
|
||||
cube([panel_x, panel_y, panel_z], center=true);
|
||||
// add posts that sink into the frame, just to give
|
||||
// a somewhat more sturdy/tight connection
|
||||
translate([panel_to_frame_point_x, panel_to_frame_point_y, -panel_z])
|
||||
scale([1.5, 1.5, 0.1]) frame_hex_bolt_hole();
|
||||
translate([-panel_to_frame_point_x, panel_to_frame_point_y, -panel_z])
|
||||
scale([1.5, 1.5, 0.1]) frame_hex_bolt_hole();
|
||||
translate([panel_to_frame_point_x, -panel_to_frame_point_y, -panel_z])
|
||||
scale([1.5, 1.5, 0.1]) frame_hex_bolt_hole();
|
||||
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, -panel_z])
|
||||
scale([1.5, 1.5, 0.1]) frame_hex_bolt_hole();
|
||||
}
|
||||
// the posts mentioned above need space for the actual hex bolts
|
||||
// used in connecting to the frame
|
||||
translate([panel_to_frame_point_x, panel_to_frame_point_y, -panel_z])
|
||||
scale([1, 1, 0.1]) frame_hex_bolt_hole();
|
||||
translate([-panel_to_frame_point_x, panel_to_frame_point_y, -panel_z])
|
||||
scale([1, 1, 0.1]) frame_hex_bolt_hole();
|
||||
translate([panel_to_frame_point_x, -panel_to_frame_point_y, -panel_z])
|
||||
scale([1, 1, 0.1]) frame_hex_bolt_hole();
|
||||
translate([-panel_to_frame_point_x, -panel_to_frame_point_y, -panel_z])
|
||||
scale([1, 1, 0.1]) frame_hex_bolt_hole();
|
||||
}
|
||||
|
||||
cube([panel_x, panel_y, panel_z], center=true);
|
||||
}
|
||||
|
||||
module base_bottom_panel() {
|
||||
|
@ -260,7 +235,7 @@ module panel_with_raised_overhang() {
|
|||
}
|
||||
}
|
||||
|
||||
module frame_box() {
|
||||
module frame_solid() {
|
||||
difference() {
|
||||
top_points = [
|
||||
// top bevel
|
||||
|
@ -310,6 +285,12 @@ module frame_box() {
|
|||
translate(p) cylinder(r=2, h=frame_bevel_height, center=true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module frame_box() {
|
||||
difference() {
|
||||
frame_solid();
|
||||
// cut out the middle to make it a box
|
||||
cube([panel_x-(panel_support_width*2), panel_y-(panel_support_width*2), frame_z+5], center=true);
|
||||
}
|
||||
|
@ -340,7 +321,8 @@ module frame_connection_holes() {
|
|||
}
|
||||
|
||||
module frame_cable_routing_hole() {
|
||||
translate([frame_x/2, 0, 0]) rotate([0, 90, 0]) frame_interchange_hole();
|
||||
// frame_y/12 is a hack for "kinda a bit above the center point"
|
||||
translate([frame_x/2, frame_y/12, 25]) rotate([0, 90, 0]) frame_interchange_hole();
|
||||
}
|
||||
|
||||
module base_frame() {
|
||||
|
@ -360,16 +342,6 @@ module frame() {
|
|||
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();
|
||||
|
||||
// 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();
|
||||
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();
|
||||
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();
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <frame-piece-top-left.scad>
|
||||
use <frame-piece-top-left-or-right.scad>
|
||||
use <frame-piece-bottom-left-or-right.scad>
|
||||
|
||||
module side_frame_piece() {
|
||||
|
@ -14,7 +14,7 @@ module side_frame_piece() {
|
|||
// side piece is left/right agnostic
|
||||
frame();
|
||||
// minus the top and bottom
|
||||
top_left_frame_piece();
|
||||
top_left_or_right_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);
|
||||
|
|
|
@ -7,7 +7,7 @@ include <parameters.scad>
|
|||
include <components.scad>
|
||||
use <frame-left.scad>
|
||||
|
||||
module top_left_frame_piece() {
|
||||
module top_left_or_right_frame_piece() {
|
||||
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
|
||||
intersection() {
|
||||
left_frame();
|
||||
|
@ -23,4 +23,4 @@ module top_left_frame_piece() {
|
|||
}
|
||||
}
|
||||
|
||||
top_left_frame_piece();
|
||||
top_left_or_right_frame_piece();
|
|
@ -1,26 +0,0 @@
|
|||
/*
|
||||
* 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 and lip on the right
|
||||
translate([frame_x/2-frame_wall/2, 0, 0])
|
||||
cube([frame_wall, frame_y, 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();
|
Loading…
Reference in New Issue