Compare commits
No commits in common. "3059e01b8f4a7df407b93b44b60acdedd24bd54a" and "a9911820c92dd878063ff08bfbb5b802c3b166a8" have entirely different histories.
3059e01b8f
...
a9911820c9
12
Makefile
12
Makefile
@ -1,5 +1,9 @@
|
|||||||
all:
|
EXCLUDES = blown-up-demo components parameters
|
||||||
python build.py
|
OBJECTS := $(filter-out $(EXCLUDES),$(patsubst src/%.scad,%,$(wildcard src/*.scad)))
|
||||||
|
dir_guard=@mkdir -p ./build
|
||||||
|
|
||||||
|
all: $(OBJECTS)
|
||||||
|
$(dir_guard)
|
||||||
mkdir -p ./build/docs
|
mkdir -p ./build/docs
|
||||||
cp ./docs/README-objects.md ./build/README.md
|
cp ./docs/README-objects.md ./build/README.md
|
||||||
cp ./docs/assembly-and-tips.md ./build/docs/assembly-and-tips.md
|
cp ./docs/assembly-and-tips.md ./build/docs/assembly-and-tips.md
|
||||||
@ -7,5 +11,9 @@ all:
|
|||||||
cp ./LICENSE ./build/LICENSE
|
cp ./LICENSE ./build/LICENSE
|
||||||
pushd ./build; zip ./buildable-stick-system-`git describe --dirty`-stls.zip . -r; popd
|
pushd ./build; zip ./buildable-stick-system-`git describe --dirty`-stls.zip . -r; popd
|
||||||
|
|
||||||
|
$(OBJECTS):
|
||||||
|
$(dir_guard)
|
||||||
|
openscad -o build/$@.stl src/$@.scad
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf ./build
|
rm -rf ./build
|
||||||
|
61
README.md
61
README.md
@ -11,7 +11,7 @@ know someone or a library with a 3D printer? The Buildable Stick System may be t
|
|||||||
|
|
||||||
[OpenSCAD-based illustration of how the components for an overhang panel-based stick fit together.]
|
[OpenSCAD-based illustration of how the components for an overhang panel-based stick fit together.]
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
[Photo of a completed inset panel-based stick.]
|
[Photo of a completed inset panel-based stick.]
|
||||||
|
|
||||||
@ -30,42 +30,19 @@ starting with an existing object and constructing what you'd like with new or ex
|
|||||||
## Usage of Parts
|
## Usage of Parts
|
||||||
|
|
||||||
There are a lot of parts to pick from, but there are some structural variants to pay attention to; here's some help
|
There are a lot of parts to pick from, but there are some structural variants to pay attention to; here's some help
|
||||||
about what the types of parts are and how to use them:
|
about when/how to use specific parts:
|
||||||
|
|
||||||
* `frames/`
|
* `panel-inset` --- these fit flush into a frame, creating a closed box enclosure.
|
||||||
* `complete/` --- these are the four walls of the frame as one piece, in a couple variations for combining into
|
* `panel-overhang` --- these have a tray that fits into a frame with the actual face extending beyond the frame,
|
||||||
larger arcade sticks. They are simple to assemble, but you have fewer modularity/customization options, and they
|
creating an ice cream sandwich enclosure.
|
||||||
are harder to print because the physics of the material cooling will probably pull the corners up. They also need
|
* These also yield a bit more space inside the box, for tall levers or whatever.
|
||||||
supports, since the top and bottom of the frame both have trays for panels to go into. Use at your own risk.
|
* `frame` (non-pieces) --- these create the box of the enclosure, as one part. These can be hard to print well ---
|
||||||
* `pieces/`
|
shrinkage forces tend to curl up the corners no matter what you do, and some points need supports --- but if you don't
|
||||||
* `box/` --- these are the same four walls (generally speaking) as in the complete frames above, broken out into
|
care about that because you're printing an ice cream sandwich, they are simpler than...
|
||||||
modular pieces to print separately. Because they are separate pieces, you can mix and match colors, and you
|
* `frame-piece` --- these break up the frame box into four faces, and are held together by friction fit and the hex
|
||||||
can lay them all face down on the print surface for better adhesion and surface patterns. There are also
|
bolts. This is more stable than you might expect, but it does introduce some variability in the overall sturdiness of
|
||||||
variants here, the "windowed" pieces, for doing two-tone variants and that kind of thing.
|
the enclosure compared with the frame as one box piece.
|
||||||
* `extended/` --- the frame walls are pulled out to create MCZ TE-style extended sides. Rather than getting a
|
* The `interconnect` replaces the need to bolt multiple frames together.
|
||||||
box look, you get a longer slab with nice bevels. These look nice, but slightly fiddily to print (and of
|
|
||||||
course need more material) --- watch your surface adhesion.
|
|
||||||
* `interconnect` --- complete frames are bolted to one another, but for frame pieces, there is an interconnect
|
|
||||||
that stands in for the joined inner wall. You need this if you are combining multiple sets of walls, e.g. for
|
|
||||||
a two-panel-long stick.
|
|
||||||
* `panels/`
|
|
||||||
* `inset/` --- various panels, all of the same size, that fit into and flush with the frame, making the arcade stick
|
|
||||||
top or bottom. These work equally well with box or extended frames, and aside from using up a bit of the space
|
|
||||||
inside the frame, come with no downsides --- they print easily and are a pretty simple shape to tweak and remix.
|
|
||||||
* `overhang/` --- overhang panels have their plane extending over the edge of the frame, creating a bit of a
|
|
||||||
sandwich look. This is mostly an aesthetic choice, but they sit higher in the frame as well, the main panel being
|
|
||||||
over/under the frame rather than within it. This extra space is useful for taller levers. The only downside to
|
|
||||||
these is that they aren't as reusable as the inset panels, since the inset panels can go anywhere, but the
|
|
||||||
overhang panels must be designed to not overlap with other overhang panels, so you might have to make more custom
|
|
||||||
variants depending on where you put things.
|
|
||||||
* `misc/`
|
|
||||||
* Pieces that I haven't organized better (yet) --- there are decorative plates for top buttons and similar to give
|
|
||||||
more color variance and some layers to the arcade stick, some very simple dustwashers, plates that fit rocker
|
|
||||||
switches and the like in Neutrik D or 20mm holes, and a lever mount spacer for getting your lever shaft at the
|
|
||||||
desired height. You don't *need* any of these, but you'll probably use a few.
|
|
||||||
* `extras/`
|
|
||||||
* Various experiments and things not directly related to making an arcade stick. At time of writing, there's a
|
|
||||||
couple pieces for a little stand for the stick, solely for vanity purposes.
|
|
||||||
|
|
||||||
## Printing
|
## Printing
|
||||||
|
|
||||||
@ -80,14 +57,14 @@ What you'll need beyond these objects:
|
|||||||
* An arcade stick board (I recommend [TheTrain's RP2040 Advanced Breakout
|
* An arcade stick board (I recommend [TheTrain's RP2040 Advanced Breakout
|
||||||
Board](https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Advanced%20Breakout%20Board))
|
Board](https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Advanced%20Breakout%20Board))
|
||||||
* 4 M3 8mm hex bolts to secure the PCB to a panel
|
* 4 M3 8mm hex bolts to secure the PCB to a panel
|
||||||
* Per frame and panel combo:
|
* Per frame and plate combo:
|
||||||
* 4 45mm M4 hex brass standoffs (or equivalent)
|
* 4 45mm M4 hex brass standoffs (or equivalent)
|
||||||
* 8 M4 countersunk hex bolts
|
* 8 M4 countersunk hex bolts
|
||||||
* Overhang panels should use 12-16mm length bolts since they are taller
|
* Overhang plates should use 12-16mm length bolts since they are taller
|
||||||
* Inset panels should probably use 8-12mm bolts --- some standoffs aren't threaded the whole way, making 16mm
|
* Inset plates should probably use 8-12mm bolts --- some standoffs aren't threaded the whole way, making 16mm
|
||||||
too long to go flush
|
too long to go flush
|
||||||
* If making the 45mm standoffs from multiple smaller ones, make sure they have enough length to take your bolts!
|
* If making the 45mm standoffs from multiple smaller ones, make sure they have enough length to take your bolts!
|
||||||
* Per frame connection point (only necessary if you are using complete frames and not frame pieces):
|
* Per frame connection point:
|
||||||
* 8 16mm M4 bolts
|
* 8 16mm M4 bolts
|
||||||
* 8 M4 flange nuts
|
* 8 M4 flange nuts
|
||||||
* For a lever:
|
* For a lever:
|
||||||
@ -122,8 +99,8 @@ Filament masses from Bambu Studio estimates, using Bambu PLA Basic, 20% gyroid i
|
|||||||
stick anyway
|
stick anyway
|
||||||
* You can also use a shorter length with longer bolts, or combine multiple standoffs, if either of those yield better
|
* You can also use a shorter length with longer bolts, or combine multiple standoffs, if either of those yield better
|
||||||
prices
|
prices
|
||||||
* 8 16mm M4 bolts to connect top panels to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of
|
* 8 16mm M4 bolts to connect top plates to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of
|
||||||
* 8 12mm M4 bolts to connect bottom panels to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of
|
* 8 12mm M4 bolts to connect bottom plates to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of
|
||||||
2023-09-12)
|
2023-09-12)
|
||||||
|
|
||||||
With an enclosure coming in around $31, depending on your choices --- say, ~$30 for TheTrain's RP2040 Advanced Breakout
|
With an enclosure coming in around $31, depending on your choices --- say, ~$30 for TheTrain's RP2040 Advanced Breakout
|
||||||
|
2
TODO.md
2
TODO.md
@ -4,4 +4,4 @@ Notes for "next time".
|
|||||||
|
|
||||||
## v4.x
|
## v4.x
|
||||||
|
|
||||||
* Engraving some cosmetic stuff? Or maybe a place to mount other plates on the top?
|
* Engraving some cosmetic stuff? Or maybe a place to mount other plates?
|
||||||
|
50
build.py
50
build.py
@ -1,50 +0,0 @@
|
|||||||
"""Compile all OpenSCAD files into a build directory and package it with docs.
|
|
||||||
|
|
||||||
(a.k.a.: "make is hard"
|
|
||||||
|
|
||||||
SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
|
|
||||||
SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
"""
|
|
||||||
import os
|
|
||||||
import os.path
|
|
||||||
import re
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
PROJECT_ROOT = os.path.abspath(os.getcwd())
|
|
||||||
BUILD_DIR = os.path.join(PROJECT_ROOT, 'build/')
|
|
||||||
SOURCE_DIR = os.path.join(PROJECT_ROOT, 'src/')
|
|
||||||
|
|
||||||
EXCLUDES = ['components.scad', 'parameters.scad']
|
|
||||||
|
|
||||||
# set up our environment to point openscad at the right stuff
|
|
||||||
os.environ['OPENSCADPATH'] = SOURCE_DIR
|
|
||||||
|
|
||||||
# track processes to wait on
|
|
||||||
processes = []
|
|
||||||
|
|
||||||
os.chdir(SOURCE_DIR)
|
|
||||||
for root, dirs, files in os.walk('.'):
|
|
||||||
print(f"{root} {dirs} {files}")
|
|
||||||
# make the current directory so that openscad can write stuff into it
|
|
||||||
try:
|
|
||||||
os.makedirs(os.path.join(BUILD_DIR, root))
|
|
||||||
except FileExistsError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
input_dir = os.path.join(SOURCE_DIR, root)
|
|
||||||
output_dir = os.path.join(BUILD_DIR, root)
|
|
||||||
for file in files:
|
|
||||||
if not re.match(r'.*\.scad$', file):
|
|
||||||
continue
|
|
||||||
if file in EXCLUDES:
|
|
||||||
continue
|
|
||||||
|
|
||||||
stl_file = re.sub(r'\.scad$', '.stl', file)
|
|
||||||
input_ = os.path.join(input_dir, file)
|
|
||||||
output = os.path.join(output_dir, stl_file)
|
|
||||||
cmd = f'openscad -o {output} {input_}'
|
|
||||||
print(cmd)
|
|
||||||
processes.append(subprocess.Popen(cmd.split(' ')))
|
|
||||||
|
|
||||||
for process in processes:
|
|
||||||
process.wait()
|
|
@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
*/
|
|
||||||
|
|
||||||
include <parameters.scad>
|
|
||||||
include <components.scad>
|
|
||||||
use <frames/pieces/extended/front-or-back.scad>
|
|
||||||
use <frames/pieces/extended/side-extended-to-bottom.scad>
|
|
||||||
use <frames/pieces/extended/front-or-back-clean-for-extended-side-aux-and-neutrik.scad>
|
|
||||||
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
|
|
||||||
use <panels/inset/sega-2p-plus-one-plus-control-panel-with-mount.scad>
|
|
||||||
use <misc/decorative-plate-24mm-button.scad>
|
|
||||||
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one.scad>
|
|
||||||
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one-plates.scad>
|
|
||||||
use <misc/dustwasher-lsx-nobi.scad>
|
|
||||||
|
|
||||||
top_panel_color = "#5B6579";
|
|
||||||
bottom_panel_color = "#8E9089";
|
|
||||||
frame_top_bottom_color = "#8E9089";
|
|
||||||
frame_side_color = "#8E9089";
|
|
||||||
top_deco_color = "#8E9089";
|
|
||||||
|
|
||||||
color(top_panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z+0.01]) lever_and_dir_arc_w_30mm_panel();
|
|
||||||
color(top_panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_plus_one_plus_control_panel_with_mount();
|
|
||||||
color(frame_side_color) translate([-frame_x/2+4, 0, -2.5]) extra_extended_left_or_right_frame_piece();
|
|
||||||
color(frame_side_color) translate([frame_x/2-4, 0, -2.5]) mirror([1, 0, 0]) extra_extended_left_or_right_frame_piece();
|
|
||||||
color(frame_top_bottom_color) translate([-frame_x/2+4, 0, -2.5]) extended_front_or_back_frame_piece();
|
|
||||||
color(frame_top_bottom_color) translate([frame_x/2-4, 0, -2.5]) extended_front_or_back_frame_piece();
|
|
||||||
color(frame_top_bottom_color) translate([-frame_x/2+4, 0, -2.5]) rotate([180, 0, 0]) front_or_back_aux_and_neutrik_box_frame_piece_for_extended_side();
|
|
||||||
color(frame_top_bottom_color) translate([frame_x/2-4, 0, -2.5]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_box_frame_piece_for_extended_side();
|
|
||||||
color(bottom_panel_color) translate([-panel_x/2, 0, -5-frame_z/2+5]) panel();
|
|
||||||
color(bottom_panel_color) translate([panel_x/2, 0, -5-frame_z/2+5]) panel();
|
|
||||||
|
|
||||||
/* color(top_deco_color) translate([0, 0, 3+frame_z/2-4]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates(); */
|
|
||||||
color(top_deco_color) translate([0, 0, 3+frame_z/2-panel_z]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate();
|
|
||||||
color(top_deco_color) translate([-170, 20, 3+frame_z/2-panel_z]) lsx_nobi_dustwasher();
|
|
||||||
color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate();
|
|
@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
*/
|
|
||||||
|
|
||||||
include <parameters.scad>
|
|
||||||
include <components.scad>
|
|
||||||
use <frames/complete/left-frame.scad>
|
|
||||||
use <frames/pieces/box/side.scad>
|
|
||||||
use <frames/pieces/box/front-or-back.scad>
|
|
||||||
use <frames/pieces/box/front-or-back-aux-and-neutrik.scad>
|
|
||||||
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
|
|
||||||
use <panels/inset/sega-2p-plus-one-plus-control-panel-with-mount.scad>
|
|
||||||
use <misc/decorative-plate-24mm-button.scad>
|
|
||||||
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one.scad>
|
|
||||||
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one-plates.scad>
|
|
||||||
use <misc/dustwasher-lsx-nobi.scad>
|
|
||||||
|
|
||||||
panel_color = "red";
|
|
||||||
base_color = "gray";
|
|
||||||
top_deco_color = "white";
|
|
||||||
|
|
||||||
color(panel_color) translate([-panel_x/2, 0, frame_z/2-panel_z+0.01]) lever_and_dir_arc_w_30mm_panel();
|
|
||||||
color(panel_color) translate([panel_x/2, 0, frame_z/2-panel_z+0.01]) sega_2p_plus_one_plus_control_panel_with_mount();
|
|
||||||
color(base_color) translate([-frame_x/2+5, 0, -2.5]) left_frame();
|
|
||||||
color(base_color) translate([panel_x/2, 0, -2.5]) rotate([0, 180, 0]) side_box_frame_piece();
|
|
||||||
color(base_color) translate([panel_x/2, 0, -2.5]) front_or_back_box_frame_piece();
|
|
||||||
color(base_color) translate([panel_x/2, 0, -2.5]) rotate([180, 180, 0]) front_or_back_aux_and_neutrik_box_frame_piece();
|
|
||||||
color(base_color) translate([-panel_x/2, 0, -5-frame_z/2+5]) panel();
|
|
||||||
color(base_color) translate([panel_x/2, 0, -5-frame_z/2+5]) panel();
|
|
||||||
|
|
||||||
/* color(top_deco_color) translate([0, 0, 3+frame_z/2-4]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates(); */
|
|
||||||
color(top_deco_color) translate([0, 0, 3+frame_z/2-panel_z]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate();
|
|
||||||
color(top_deco_color) translate([-170, 20, 3+frame_z/2-panel_z]) lsx_nobi_dustwasher();
|
|
||||||
color(top_deco_color) translate([panel_x-24, 30, 3+frame_z/2-panel_z]) button_24mm_decorative_plate();
|
|
@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
*/
|
|
||||||
|
|
||||||
include <parameters.scad>
|
|
||||||
include <components.scad>
|
|
||||||
use <frames/pieces/interconnect.scad>
|
|
||||||
use <frames/pieces/box/side.scad>
|
|
||||||
use <frames/pieces/box/front-or-back.scad>
|
|
||||||
use <frames/pieces/box/front-or-back-aux-and-neutrik.scad>
|
|
||||||
use <panels/overhang/left-lever-and-dir_arc-plus-w-30mm-panel.scad>
|
|
||||||
use <panels/overhang/right-sega-2p-plus-one-plus-control-panel-with-mount.scad>
|
|
||||||
use <panels/overhang/left-or-right-panel.scad>
|
|
||||||
use <misc/decorative-plate-24mm-button.scad>
|
|
||||||
use <misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one.scad>
|
|
||||||
use <misc/dustwasher-lsx-nobi.scad>
|
|
||||||
|
|
||||||
color("#C12E1F") translate([-panel_x/2-25, 0, frame_z/2+75]) lever_and_dir_arc_w_30mm_left_overhang_panel();
|
|
||||||
color("#C12E1F") translate([panel_x/2+25, 0, frame_z/2+75]) sega_2p_plus_one_plus_control_right_overhang_panel_with_mount();
|
|
||||||
color("black") translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_box_frame_piece();
|
|
||||||
color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_box_frame_piece();
|
|
||||||
color("black") translate([-frame_x/2+5-50, 0, -2.5]) side_box_frame_piece();
|
|
||||||
color("black") rotate([0, 180, 0]) translate([-frame_x/2+5-50, 0, -2.5]) side_box_frame_piece();
|
|
||||||
color("black") rotate([180, 0, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_aux_and_neutrik_box_frame_piece();
|
|
||||||
color("black") rotate([180, 0, 0]) rotate([0, 180, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_aux_and_neutrik_box_frame_piece();
|
|
||||||
color("black") rotate([0, 180, 0]) interconnect_frame_piece();
|
|
||||||
color("#C12E1F") translate([-panel_x/2-25, 0, -5-frame_z/2-75]) left_or_right_overhang_panel();
|
|
||||||
color("#C12E1F") mirror([0, 1, 0]) translate([panel_x/2+25, 0, -5-frame_z/2-75]) left_or_right_overhang_panel();
|
|
||||||
|
|
||||||
color("black") translate([0, 0, 3+frame_z/2+150]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate();
|
|
||||||
color("black") translate([-195, 25, 3+frame_z/2+150]) lsx_nobi_dustwasher();
|
|
||||||
color("black") translate([panel_x, 25, 3+frame_z/2+150]) button_24mm_decorative_plate();
|
|
@ -6,40 +6,26 @@ Files for 3D printing an arcade stick.
|
|||||||
|
|
||||||
The following notes document the objects in the Buildable Stick System and how you can use them:
|
The following notes document the objects in the Buildable Stick System and how you can use them:
|
||||||
|
|
||||||
* `frames/`
|
* `bottom-panel-inset`: a simple solid panel that fits into the bottom of a frame box.
|
||||||
* `complete/` --- these are the four walls of the frame as one piece, in a couple variations for combining into
|
* `bottom-panel-overhang-*`: solid panels whose base fits into the bottom of a frame box, but have a longer sheet that
|
||||||
larger arcade sticks. They are simple to assemble, but you have fewer modularity/customization options, and they
|
extends beyond the frame, creating a sandwich kind of look; the various forms hang over more or less of the frame,
|
||||||
are harder to print because the physics of the material cooling will probably pull the corners up. They also need
|
expecting it will be connected to other frames.
|
||||||
supports, since the top and bottom of the frame both have trays for panels to go into. Use at your own risk.
|
* `frame-{left,middle,right,solo}`: the core frame of the stick, these are complete boxes; since they are long and
|
||||||
* `pieces/`
|
narrow, and need supports to print the space for the insets, these may be difficult to print nicely.
|
||||||
* `box/` --- these are the same four walls (generally speaking) as in the complete frames above, broken out into
|
* `frame-piece-*`: the core frame broken up by individual faces, which are easier to print and essentially just as
|
||||||
modular pieces to print separately. Because they are separate pieces, you can mix and match colors, and you
|
sturdy.
|
||||||
can lay them all face down on the print surface for better adhesion and surface patterns. There are also
|
* `frame-piece-*-extended*`: frame pieces that have been stretched out beyond the normal frame dimensions in order to
|
||||||
variants here, the "windowed" pieces, for doing two-tone variants and that kind of thing.
|
make a nice bevel on the sides and/or bottom; this, interestingly, tends to make the stick look a bit thinner than if
|
||||||
* `extended/` --- the frame walls are pulled out to create MCZ TE-style extended sides. Rather than getting a
|
it was just a simple box.
|
||||||
box look, you get a longer slab with nice bevels. These look nice, but slightly fiddily to print (and of
|
* `misc-decorative-plate-*`: things you can print to snazz up face buttons mounting, auxillary button points, etc..
|
||||||
course need more material) --- watch your surface adhesion.
|
* `misc-dustwasher-*`: simple dustwashers for levers.
|
||||||
* `interconnect` --- complete frames are bolted to one another, but for frame pieces, there is an interconnect
|
* `misc-lever-mount-*`: lever mounts of various shapes and depths to get the desired lever height when mounting a lever
|
||||||
that stands in for the joined inner wall. You need this if you are combining multiple sets of walls, e.g. for
|
to a panel (with the appropriate cutouts).
|
||||||
a two-panel-long stick.
|
* `misc-neutrik-*`: like the decorative plates, but these are a bit more necessary by their design.
|
||||||
* `panels/`
|
* `misc-rocker-*`: rocker SPDT switches don't have mounting holes, this allows you to attach them to the frame.
|
||||||
* `inset/` --- various panels, all of the same size, that fit into and flush with the frame, making the arcade stick
|
* `top-panel-inset-*`: various lever and/or button layouts for using as the face(s) of a stick.
|
||||||
top or bottom. These work equally well with box or extended frames, and aside from using up a bit of the space
|
* `top-panel-overhang-`: same idea as the inset top panels, but overhung over the frame to make the sandwich look; these
|
||||||
inside the frame, come with no downsides --- they print easily and are a pretty simple shape to tweak and remix.
|
also leave a bit more space inside the frame, which might accommodate a taller lever.
|
||||||
* `overhang/` --- overhang panels have their plane extending over the edge of the frame, creating a bit of a
|
|
||||||
sandwich look. This is mostly an aesthetic choice, but they sit higher in the frame as well, the main panel being
|
|
||||||
over/under the frame rather than within it. This extra space is useful for taller levers. The only downside to
|
|
||||||
these is that they aren't as reusable as the inset panels, since the inset panels can go anywhere, but the
|
|
||||||
overhang panels must be designed to not overlap with other overhang panels, so you might have to make more custom
|
|
||||||
variants depending on where you put things.
|
|
||||||
* `misc/`
|
|
||||||
* Pieces that I haven't organized better (yet) --- there are decorative plates for top buttons and similar to give
|
|
||||||
more color variance and some layers to the arcade stick, some very simple dustwashers, plates that fit rocker
|
|
||||||
switches and the like in Neutrik D or 20mm holes, and a lever mount spacer for getting your lever shaft at the
|
|
||||||
desired height. You don't *need* any of these, but you'll probably use a few.
|
|
||||||
* `extras/`
|
|
||||||
* Various experiments and things not directly related to making an arcade stick. At time of writing, there's a
|
|
||||||
couple pieces for a little stand for the stick, solely for vanity purposes.
|
|
||||||
|
|
||||||
Feel free to request or contribute to more objects, see the links to Git repos below.
|
Feel free to request or contribute to more objects, see the links to Git repos below.
|
||||||
|
|
||||||
|
@ -8,21 +8,21 @@ Assembly of a stick is pretty straightforward, but there are some choices that c
|
|||||||
following is the most consistent way I've found to put one together. This is assuming a v4.2 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.
|
panels to make a long standard stick, and the frame made of pieces.
|
||||||
|
|
||||||
1. Prepare the frame pieces: this is your best shot to get the e.g. Neutrik plates for the USB mount, SPDT switches, etc.
|
1. Prepare the frame top pieces --- `frame-piece-top-left-or-right`: this is your best shot to get auxillary buttons,
|
||||||
installed, so do it now, and give them a good tighten. You shouldn't need to adjust these again, so finish their
|
panel connectors, and the like installed, so do it now, and give them a good tighten. You shouldn't need to adjust
|
||||||
installation while the pieces are free.
|
these again, so finish their installation while the pieces are free.
|
||||||
1. You could also do the decorative plates and related buttons, but it might be just as well to leave those for step 7,
|
1. This of course includes decorative plates --- e.g. `misc-decorative-plate-aux-control-three-button-cluster` ---
|
||||||
just to make sure the buttons don't get in the way of other buttons or a lever or so on.
|
you may choose to use. These are held to the top pieces by the buttons or component mounting screws.
|
||||||
2. Start the top panels: you want both to get the components installed now when it's easy, and to make sure that the
|
2. Start the top panels --- `top-panel-(inset|overhang)-*`: you want both to get the components installed now
|
||||||
overall assembly works with your components, so again get your buttons, lever, etc., in place. You can secure them at
|
when it's easy, and to make sure that the overall assembly works with your components, so again get your buttons,
|
||||||
this point.
|
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.
|
1. If you are using a button decorative plate that spans two panels --- e.g.
|
||||||
`misc/decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one` --- take care to align the two panels as tightly
|
`src/misc-decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one` --- take care to align the two panels as
|
||||||
as possible, and accurately, as they will be hard to adjust once everything is secured and in the frame.
|
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 --- `misc/lever-mount-sanwa-seimitsu` --- if you want it,
|
2. If using a lever, don't forget the lever mount spacer --- `src/misc-lever-mount-sanwa-seimitsu` --- if you want
|
||||||
and tighten those mounting bolts now as well.
|
it, and tighten those mounting bolts now as well.
|
||||||
3. Create the frame box by combining your frame piece parts, box or extended, together. This will be relatively stable
|
3. Create the frame box by combining your `frame-piece-*` parts together. This will be relatively stable just via
|
||||||
just via friction fit.
|
friction fit.
|
||||||
4. Rest the frame top-up on a desk, and put the standoffs through the holes. This will probably be tight, and you may
|
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.
|
even need a rubber mallet or similar to drive the standoffs through the holes.
|
||||||
5. Insert the top panels into the frame.
|
5. Insert the top panels into the frame.
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 59 KiB |
Binary file not shown.
Before Width: | Height: | Size: 372 KiB |
34
src/blown-up-demo.scad
Normal file
34
src/blown-up-demo.scad
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
include <parameters.scad>
|
||||||
|
include <components.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>
|
||||||
|
use <bottom-panel-overhang-right.scad>
|
||||||
|
use <misc-decorative-plate-24mm-button.scad>
|
||||||
|
use <misc-decorative-plate-dir_arc-plus-w-30mm-and-sega-2p-plus-one.scad>
|
||||||
|
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, 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();
|
||||||
|
|
||||||
|
color("black") translate([0, 0, 3+frame_z/2+150]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate();
|
||||||
|
color("black") translate([-195, 25, 3+frame_z/2+150]) lsx_nobi_dustwasher();
|
||||||
|
color("black") translate([panel_x, 25, 3+frame_z/2+150]) button_24mm_decorative_plate();
|
@ -6,4 +6,4 @@
|
|||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
panel();
|
bottom_panel();
|
@ -5,14 +5,14 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <solo-panel.scad>
|
use <bottom-panel-overhang-solo.scad>
|
||||||
|
|
||||||
module left_or_right_overhang_panel() {
|
module bottom_panel_left() {
|
||||||
difference() {
|
difference() {
|
||||||
solo_overhang_panel();
|
bottom_panel_solo();
|
||||||
// chop the right edge off
|
// chop the right edge off
|
||||||
side_chopper();
|
side_chopper();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
left_or_right_overhang_panel();
|
bottom_panel_left();
|
@ -5,13 +5,14 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <left-or-right-panel.scad>
|
use <bottom-panel-overhang-left.scad>
|
||||||
|
use <bottom-panel-overhang-right.scad>
|
||||||
|
|
||||||
module middle_overhang_panel() {
|
module bottom_panel_middle() {
|
||||||
intersection() {
|
intersection() {
|
||||||
left_or_right_overhang_panel();
|
bottom_panel_left();
|
||||||
mirror([1, 0, 0]) left_or_right_overhang_panel();
|
bottom_panel_right();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
middle_overhang_panel();
|
bottom_panel_middle();
|
14
src/bottom-panel-overhang-right.scad
Normal file
14
src/bottom-panel-overhang-right.scad
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
include <parameters.scad>
|
||||||
|
include <components.scad>
|
||||||
|
use <bottom-panel-overhang-left.scad>
|
||||||
|
|
||||||
|
module bottom_panel_right() {
|
||||||
|
rotate([0, 0, 180]) bottom_panel_left();
|
||||||
|
}
|
||||||
|
|
||||||
|
bottom_panel_right();
|
@ -6,11 +6,11 @@
|
|||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
module solo_overhang_panel() {
|
module bottom_panel_solo() {
|
||||||
difference() {
|
difference() {
|
||||||
rotate([180, 0, 0]) base_panel_with_raised_overhang();
|
rotate([180, 0, 0]) base_panel_with_raised_overhang();
|
||||||
rotate([180, 0, 0]) panel_holes();
|
rotate([180, 0, 0]) panel_holes();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
solo_overhang_panel();
|
bottom_panel_solo();
|
@ -168,6 +168,10 @@ module base_panel() {
|
|||||||
cube([panel_x, panel_y, panel_z], center=true);
|
cube([panel_x, panel_y, panel_z], center=true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module base_bottom_panel() {
|
||||||
|
mirror([0, 0, 1]) base_panel();
|
||||||
|
}
|
||||||
|
|
||||||
module panel() {
|
module panel() {
|
||||||
difference() {
|
difference() {
|
||||||
base_panel();
|
base_panel();
|
||||||
@ -175,6 +179,13 @@ module panel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module bottom_panel() {
|
||||||
|
difference() {
|
||||||
|
base_bottom_panel();
|
||||||
|
mirror([0, 0, 1]) panel_holes();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module overhang_plate() {
|
module overhang_plate() {
|
||||||
top_points = [
|
top_points = [
|
||||||
// top bevel
|
// top bevel
|
||||||
@ -290,11 +301,7 @@ module frame_mount_column() {
|
|||||||
cube([frame_mount_column_width, frame_mount_column_width, frame_z], center=true);
|
cube([frame_mount_column_width, frame_mount_column_width, frame_z], center=true);
|
||||||
// add some corners back to do a lame chamfer
|
// add some corners back to do a lame chamfer
|
||||||
linear_extrude(height=frame_z, center=true)
|
linear_extrude(height=frame_z, center=true)
|
||||||
polygon([
|
polygon([[10, 10], [-20, 10], [10, -20]]);
|
||||||
[frame_mount_column_width/2, frame_mount_column_width/2],
|
|
||||||
[-frame_mount_column_width, frame_mount_column_width/2],
|
|
||||||
[frame_mount_column_width/2, -frame_mount_column_width]
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module side_chopper() {
|
module side_chopper() {
|
||||||
@ -331,7 +338,7 @@ module frame() {
|
|||||||
difference() {
|
difference() {
|
||||||
base_frame();
|
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]) 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();
|
||||||
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();
|
||||||
|
@ -24,9 +24,9 @@ module left_frame() {
|
|||||||
frame_cable_routing_hole();
|
frame_cable_routing_hole();
|
||||||
|
|
||||||
// aux button holes
|
// aux button holes
|
||||||
translate([-35.25, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
|
translate([-35, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
|
||||||
translate([-35.25, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
translate([-35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||||
translate([-72.25, (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();
|
translate([2, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||||
|
|
||||||
// neutrix button hole
|
// neutrix button hole
|
29
src/frame-piece-bottom-left-or-right-extended.scad
Normal file
29
src/frame-piece-bottom-left-or-right-extended.scad
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* 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-bottom-left-or-right.scad>
|
||||||
|
|
||||||
|
module bottom_piece_wall() {
|
||||||
|
// get a slice of the piece, to use it in extruding
|
||||||
|
projection(cut=true) rotate([-90, 0, 0]) translate([0, frame_y/2-frame_bevel_height, 0])
|
||||||
|
bottom_left_or_right_frame_piece();
|
||||||
|
}
|
||||||
|
|
||||||
|
module bottom_piece_extension() {
|
||||||
|
// combine the original with a shrunken piece to "pull" the wall out
|
||||||
|
hull() {
|
||||||
|
linear_extrude(height=frame_extension_y) scale([1, 0.5, 1]) bottom_piece_wall();
|
||||||
|
linear_extrude(height=frame_bevel_height) bottom_piece_wall();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module extended_bottom_left_or_right_frame_piece() {
|
||||||
|
bottom_left_or_right_frame_piece();
|
||||||
|
translate([0, -frame_y/2+frame_bevel_height*2, 0]) rotate([90, 0, 0]) bottom_piece_extension();
|
||||||
|
}
|
||||||
|
|
||||||
|
extended_bottom_left_or_right_frame_piece();
|
@ -5,9 +5,9 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <frames/complete/left-frame.scad>
|
use <frame-left.scad>
|
||||||
|
|
||||||
module front_or_back_box_frame_piece() {
|
module bottom_left_or_right_frame_piece() {
|
||||||
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
|
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
|
||||||
intersection() {
|
intersection() {
|
||||||
left_frame();
|
left_frame();
|
||||||
@ -16,15 +16,11 @@ module front_or_back_box_frame_piece() {
|
|||||||
translate([0, -(frame_y/2)+(piece_width/2), 0]) cube([frame_x, piece_width, frame_z], center=true);
|
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 left
|
// ...minus the frame wall and lip on the left
|
||||||
translate([-frame_x/2+frame_wall/2, 0, 0])
|
translate([-frame_x/2+frame_wall/2, 0, 0])
|
||||||
cube([frame_wall, frame_y-frame_wall*2, frame_z], center=true);
|
cube([frame_wall, frame_y, frame_z], center=true);
|
||||||
linear_extrude(height=frame_z, center=true) polygon([
|
|
||||||
[-frame_x/2, -frame_y/2], [-frame_x/2+frame_wall, -frame_y/2+frame_wall],
|
|
||||||
[-frame_x/2, -frame_y/2+frame_wall]
|
|
||||||
]);
|
|
||||||
// ...minus a slot for the combining piece to go into
|
// ...minus a slot for the combining piece to go into
|
||||||
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, inner_frame_z/3], center=true);
|
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
front_or_back_box_frame_piece();
|
bottom_left_or_right_frame_piece();
|
@ -5,11 +5,11 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <box/side.scad>
|
use <frame-piece-side.scad>
|
||||||
|
|
||||||
module interconnect_frame_half_piece() {
|
module interconnect_frame_half_piece() {
|
||||||
translate([frame_x/2-frame_wall, 0, 0]) difference() {
|
translate([frame_x/2-frame_wall, 0, 0]) difference() {
|
||||||
side_box_frame_piece();
|
side_frame_piece();
|
||||||
rotate([0, 0, 180]) side_chopper();
|
rotate([0, 0, 180]) side_chopper();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -5,16 +5,13 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <frames/complete/left-frame.scad>
|
use <frame-piece-bottom-left-or-right-extended.scad>
|
||||||
use <frames/pieces/box/side.scad>
|
use <frame-piece-side.scad>
|
||||||
use <front-or-back.scad>
|
|
||||||
|
|
||||||
module side_and_bottom_frame_piece_wall() {
|
module side_and_bottom_frame_piece_wall() {
|
||||||
// get a slice of the pieces, to use it in extruding
|
// get a slice of the pieces, to use it in extruding
|
||||||
// this doesn't use the side_frame_piece because of the 45 degree angle geometry
|
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_bevel_height, 0, 0])
|
||||||
// not creating a clean thing to cut, so we just take the whole wall and use that
|
side_frame_piece();
|
||||||
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_wall-(frame_bevel_height/2), 0, 0])
|
|
||||||
left_frame();
|
|
||||||
projection(cut=true) translate([0, -frame_y/2+frame_wall, 0]) rotate([90, 90, 0]) bottom_piece_extension();
|
projection(cut=true) translate([0, -frame_y/2+frame_wall, 0]) rotate([90, 90, 0]) bottom_piece_extension();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -28,7 +25,7 @@ module side_and_bottom_frame_piece_extension() {
|
|||||||
|
|
||||||
module extra_extended_left_or_right_frame_piece() {
|
module extra_extended_left_or_right_frame_piece() {
|
||||||
difference() {
|
difference() {
|
||||||
side_box_frame_piece();
|
side_frame_piece();
|
||||||
// chop off the old edge which is getting replaced with the extension
|
// chop off the old edge which is getting replaced with the extension
|
||||||
translate([-frame_x/2+frame_bevel_height/2, 0, 0]) cube([frame_bevel_height, frame_y, frame_z], center=true);
|
translate([-frame_x/2+frame_bevel_height/2, 0, 0]) cube([frame_bevel_height, frame_y, frame_z], center=true);
|
||||||
}
|
}
|
@ -5,16 +5,12 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <frames/complete/left-frame.scad>
|
use <frame-piece-side.scad>
|
||||||
use <frames/pieces/box/side.scad>
|
|
||||||
use <front-or-back-clean-for-extended-side.scad>
|
|
||||||
|
|
||||||
module side_frame_piece_wall() {
|
module side_frame_piece_wall() {
|
||||||
// get a slice of the piece, to use it in extruding
|
// get a slice of the piece, to use it in extruding
|
||||||
// this doesn't use the side_frame_piece because of the 45 degree angle geometry
|
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_bevel_height, 0, 0])
|
||||||
// not creating a clean thing to cut, so we just take the whole wall and use that
|
side_frame_piece();
|
||||||
projection(cut=true) rotate([0, 90, 0]) translate([frame_x/2-frame_wall-(frame_bevel_height/2), 0, 0])
|
|
||||||
left_frame();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module side_frame_piece_extension() {
|
module side_frame_piece_extension() {
|
||||||
@ -27,7 +23,7 @@ module side_frame_piece_extension() {
|
|||||||
|
|
||||||
module extended_bottom_left_or_right_frame_piece() {
|
module extended_bottom_left_or_right_frame_piece() {
|
||||||
difference() {
|
difference() {
|
||||||
side_box_frame_piece();
|
side_frame_piece();
|
||||||
// chop off the old edge which is getting replaced with the extension
|
// chop off the old edge which is getting replaced with the extension
|
||||||
translate([-frame_x/2+frame_bevel_height/2, 0, 0]) cube([frame_bevel_height, frame_y, frame_z], center=true);
|
translate([-frame_x/2+frame_bevel_height/2, 0, 0]) cube([frame_bevel_height, frame_y, frame_z], center=true);
|
||||||
}
|
}
|
@ -5,19 +5,20 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <front-or-back.scad>
|
use <frame-piece-top-left-or-right.scad>
|
||||||
|
use <frame-piece-bottom-left-or-right.scad>
|
||||||
|
|
||||||
module side_box_frame_piece() {
|
module side_frame_piece() {
|
||||||
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
|
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
|
||||||
difference() {
|
difference() {
|
||||||
// side piece is left/right agnostic
|
// side piece is left/right agnostic
|
||||||
frame();
|
frame();
|
||||||
// minus the top and bottom
|
// minus the top and bottom
|
||||||
front_or_back_box_frame_piece();
|
top_left_or_right_frame_piece();
|
||||||
rotate([180, 0, 0]) front_or_back_box_frame_piece();
|
bottom_left_or_right_frame_piece();
|
||||||
// and just chop out the rest of the frame
|
// 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);
|
translate([piece_width, 0, 0]) cube([frame_x, frame_y+1, frame_z+1], center=true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
side_box_frame_piece();
|
side_frame_piece();
|
26
src/frame-piece-top-left-or-right.scad
Normal file
26
src/frame-piece-top-left-or-right.scad
Normal 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_or_right_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 and lip on the left
|
||||||
|
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_left_or_right_frame_piece();
|
@ -24,9 +24,9 @@ module right_frame() {
|
|||||||
mirror([1, 0, 0]) frame_cable_routing_hole();
|
mirror([1, 0, 0]) frame_cable_routing_hole();
|
||||||
|
|
||||||
// aux button holes
|
// aux button holes
|
||||||
translate([35.25, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
|
translate([35, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
|
||||||
translate([35.25, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
translate([35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||||
translate([72.25, (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();
|
translate([-2, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||||
|
|
||||||
// neutrix button hole
|
// neutrix button hole
|
@ -1,28 +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 <front-or-back.scad>
|
|
||||||
|
|
||||||
module front_or_back_aux_and_neutrik_box_frame_piece() {
|
|
||||||
difference() {
|
|
||||||
front_or_back_box_frame_piece();
|
|
||||||
|
|
||||||
// aux button holes
|
|
||||||
translate([-35.25, -101.5, 0]) rotate([90, 0, 0]) aux_control_three_button_cluster();
|
|
||||||
translate([-35.25, -(frame_y/2)+neutrik_panel_thickness+4, 0]) frame_cutout();
|
|
||||||
translate([-72.25, -(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, 0])
|
|
||||||
rotate([270, 0, 0]) neutrik_d_mount();
|
|
||||||
translate([frame_center_to_neutrik, -(frame_y/2)+neutrik_panel_thickness+4, 0])
|
|
||||||
frame_cutout();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
front_or_back_aux_and_neutrik_box_frame_piece();
|
|
@ -1,31 +0,0 @@
|
|||||||
/* The inner top/bottom wall of the frame, for being displayed through a windowed part.
|
|
||||||
*
|
|
||||||
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
*/
|
|
||||||
|
|
||||||
include <parameters.scad>
|
|
||||||
include <components.scad>
|
|
||||||
use <front-or-back.scad>
|
|
||||||
|
|
||||||
module mount_column_cutout() {
|
|
||||||
intersection() {
|
|
||||||
frame_mount_column();
|
|
||||||
cube([frame_mount_column_width*3/2, frame_mount_column_width*3/2, inner_frame_z*5/8], center=true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module front_or_back_inner_wall_frame_piece() {
|
|
||||||
difference() {
|
|
||||||
front_or_back_box_frame_piece();
|
|
||||||
// minus the outer wall
|
|
||||||
translate([0, -(frame_y-frame_wall)/2, 0]) cube([frame_x, frame_wall, frame_z], center=true);
|
|
||||||
// minus half of the mounting posts (the other half provided by the outer wall)
|
|
||||||
translate([-panel_to_frame_point_x, -(panel_to_frame_point_y), 0]) rotate([0, 0, 180])
|
|
||||||
mount_column_cutout();
|
|
||||||
translate([panel_to_frame_point_x, -(panel_to_frame_point_y), 0]) rotate([0, 0, 270])
|
|
||||||
mount_column_cutout();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
front_or_back_inner_wall_frame_piece();
|
|
@ -1,40 +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 <front-or-back.scad>
|
|
||||||
use <front-or-back-inner-wall.scad>
|
|
||||||
|
|
||||||
module backslash() {
|
|
||||||
polyhedron([[5, -frame_y/2, -(frame_z-panel_z*3)/2], [20, -frame_y/2, -(frame_z-panel_z*3)/2],
|
|
||||||
[20, -frame_y/2+frame_wall, -(frame_z-panel_z*3)/2], [5, -frame_y/2+frame_wall, -(frame_z-panel_z*3)/2],
|
|
||||||
[-20, -frame_y/2, (frame_z-panel_z*3)/2], [-5, -frame_y/2, (frame_z-panel_z*3)/2],
|
|
||||||
[-5, -frame_y/2+frame_wall, (frame_z-panel_z*3)/2], [-20, -frame_y/2+frame_wall, (frame_z-panel_z*3)/2]],
|
|
||||||
[[0, 1, 2, 3], [4, 5, 1, 0], [7, 6, 5, 4], [5, 6, 2, 1], [6, 7, 3, 2], [7, 4, 0, 3]]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
module backslashes() {
|
|
||||||
translate([-60, 0, 0]) backslash();
|
|
||||||
translate([-40, 0, 0]) backslash();
|
|
||||||
translate([-20, 0, 0]) backslash();
|
|
||||||
backslash();
|
|
||||||
translate([20, 0, 0]) backslash();
|
|
||||||
translate([40, 0, 0]) backslash();
|
|
||||||
translate([60, 0, 0]) backslash();
|
|
||||||
}
|
|
||||||
|
|
||||||
module backslashes_windowed_front_or_back_box_frame_piece() {
|
|
||||||
difference() {
|
|
||||||
front_or_back_box_frame_piece();
|
|
||||||
// subtract slashes from the frame wall
|
|
||||||
backslashes();
|
|
||||||
// subtract the inner wall area that will be provided by the other piece
|
|
||||||
front_or_back_inner_wall_frame_piece();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
backslashes_windowed_front_or_back_box_frame_piece();
|
|
@ -1,22 +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 <front-or-back.scad>
|
|
||||||
use <front-or-back-inner-wall.scad>
|
|
||||||
use <front-or-back-windowed-backslashes.scad>
|
|
||||||
|
|
||||||
module forwardslashes_windowed_front_or_back_box_frame_piece() {
|
|
||||||
difference() {
|
|
||||||
front_or_back_box_frame_piece();
|
|
||||||
// subtract slashes from the frame wall
|
|
||||||
mirror([0, 0, 1]) backslashes();
|
|
||||||
// subtract the inner wall area that will be provided by the other piece
|
|
||||||
front_or_back_inner_wall_frame_piece();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
forwardslashes_windowed_front_or_back_box_frame_piece();
|
|
@ -1,23 +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 <front-or-back.scad>
|
|
||||||
use <front-or-back-inner-wall.scad>
|
|
||||||
|
|
||||||
module windowed_front_or_back_box_frame_piece() {
|
|
||||||
difference() {
|
|
||||||
front_or_back_box_frame_piece();
|
|
||||||
// subtract frame wall window
|
|
||||||
translate([0, -frame_y/2, 0])
|
|
||||||
cube([frame_x-frame_mount_column_width*3.5, (frame_wall+panel_support_width)*2,
|
|
||||||
frame_z-panel_z*3], center=true);
|
|
||||||
// subtract the inner wall area that will be provided by the other piece
|
|
||||||
front_or_back_inner_wall_frame_piece();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
windowed_front_or_back_box_frame_piece();
|
|
@ -1,35 +0,0 @@
|
|||||||
/* The inner side wall of the frame, for being displayed through a windowed part.
|
|
||||||
*
|
|
||||||
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
*/
|
|
||||||
|
|
||||||
include <parameters.scad>
|
|
||||||
include <components.scad>
|
|
||||||
use <side.scad>
|
|
||||||
|
|
||||||
module mount_column_cutout() {
|
|
||||||
intersection() {
|
|
||||||
frame_mount_column();
|
|
||||||
cube([frame_mount_column_width*3/2, frame_mount_column_width*3/2, inner_frame_z*21/24], center=true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module side_inner_wall_frame_piece() {
|
|
||||||
difference() {
|
|
||||||
side_box_frame_piece();
|
|
||||||
// minus the outer wall
|
|
||||||
translate([-(frame_x-frame_wall)/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
|
|
||||||
// minus half of the mounting posts (the other half provided by the outer wall)
|
|
||||||
translate([-panel_to_frame_point_x, panel_to_frame_point_y, inner_frame_z/2]) rotate([0, 0, 90])
|
|
||||||
mount_column_cutout();
|
|
||||||
translate([-panel_to_frame_point_x, -(panel_to_frame_point_y), -inner_frame_z/2]) rotate([0, 0, 180])
|
|
||||||
mount_column_cutout();
|
|
||||||
translate([-panel_to_frame_point_x, panel_to_frame_point_y, -inner_frame_z/2]) rotate([0, 0, 90])
|
|
||||||
mount_column_cutout();
|
|
||||||
translate([-panel_to_frame_point_x, -(panel_to_frame_point_y), inner_frame_z/2]) rotate([0, 0, 180])
|
|
||||||
mount_column_cutout();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
side_inner_wall_frame_piece();
|
|
@ -1,38 +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 <side.scad>
|
|
||||||
use <side-inner-wall.scad>
|
|
||||||
|
|
||||||
module backslash() {
|
|
||||||
polyhedron([[-frame_x/2, -5, -(frame_z-panel_z*3)/2], [-frame_x/2, -20, -(frame_z-panel_z*3)/2],
|
|
||||||
[-frame_x/2+frame_wall, -20, -(frame_z-panel_z*3)/2], [-frame_x/2+frame_wall, -5, -(frame_z-panel_z*3)/2],
|
|
||||||
[-frame_x/2, 20, (frame_z-panel_z*3)/2], [-frame_x/2, 5, (frame_z-panel_z*3)/2],
|
|
||||||
[-frame_x/2+frame_wall, 5, (frame_z-panel_z*3)/2], [-frame_x/2+frame_wall, 20, (frame_z-panel_z*3)/2]],
|
|
||||||
[[0, 1, 2, 3], [4, 5, 1, 0], [7, 6, 5, 4], [5, 6, 2, 1], [6, 7, 3, 2], [7, 4, 0, 3]]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
module backslashes() {
|
|
||||||
translate([0, -40, 0]) backslash();
|
|
||||||
translate([0, -20, 0]) backslash();
|
|
||||||
backslash();
|
|
||||||
translate([0, 20, 0]) backslash();
|
|
||||||
translate([0, 40, 0]) backslash();
|
|
||||||
}
|
|
||||||
|
|
||||||
module backslashes_windowed_side_box_frame_piece() {
|
|
||||||
difference() {
|
|
||||||
side_box_frame_piece();
|
|
||||||
// subtract slashes from the frame wall
|
|
||||||
backslashes();
|
|
||||||
// subtract the inner wall area that will be provided by the other piece
|
|
||||||
side_inner_wall_frame_piece();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
backslashes_windowed_side_box_frame_piece();
|
|
@ -1,22 +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 <side.scad>
|
|
||||||
use <side-inner-wall.scad>
|
|
||||||
use <side-windowed-backslashes.scad>
|
|
||||||
|
|
||||||
module forwardslashes_windowed_side_box_frame_piece() {
|
|
||||||
difference() {
|
|
||||||
side_box_frame_piece();
|
|
||||||
// subtract slashes from the frame wall
|
|
||||||
mirror([0, 0, 1]) backslashes();
|
|
||||||
// subtract the inner wall area that will be provided by the other piece
|
|
||||||
side_inner_wall_frame_piece();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
forwardslashes_windowed_side_box_frame_piece();
|
|
@ -1,23 +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 <side.scad>
|
|
||||||
use <side-inner-wall.scad>
|
|
||||||
|
|
||||||
module windowed_side_box_frame_piece() {
|
|
||||||
difference() {
|
|
||||||
side_box_frame_piece();
|
|
||||||
// subtract frame wall window
|
|
||||||
translate([-frame_x/2, 0, 0])
|
|
||||||
cube([(frame_wall+panel_support_width)*2, frame_y-frame_mount_column_width*3.5,
|
|
||||||
frame_z-panel_z*3], center=true);
|
|
||||||
// subtract the inner wall area that will be provided by the other piece
|
|
||||||
side_inner_wall_frame_piece();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
windowed_side_box_frame_piece();
|
|
@ -1,28 +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 <front-or-back-clean-for-extended-side.scad>
|
|
||||||
|
|
||||||
module front_or_back_aux_and_neutrik_box_frame_piece_for_extended_side() {
|
|
||||||
difference() {
|
|
||||||
front_or_back_box_frame_piece_for_extended_side();
|
|
||||||
|
|
||||||
// aux button holes
|
|
||||||
translate([-35.25, -101.5, 0]) rotate([90, 0, 0]) aux_control_three_button_cluster();
|
|
||||||
translate([-35.25, -(frame_y/2)+neutrik_panel_thickness+4, 0]) frame_cutout();
|
|
||||||
translate([-72.25, -(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, 0])
|
|
||||||
rotate([270, 0, 0]) neutrik_d_mount();
|
|
||||||
translate([frame_center_to_neutrik, -(frame_y/2)+neutrik_panel_thickness+4, 0])
|
|
||||||
frame_cutout();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
front_or_back_aux_and_neutrik_box_frame_piece_for_extended_side();
|
|
@ -1,18 +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 <frames/pieces/box/front-or-back.scad>
|
|
||||||
|
|
||||||
module front_or_back_box_frame_piece_for_extended_side() {
|
|
||||||
difference() {
|
|
||||||
front_or_back_box_frame_piece();
|
|
||||||
// ...minus the frame wall and lip on the left
|
|
||||||
translate([-frame_x/2+frame_wall/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
front_or_back_box_frame_piece_for_extended_side();
|
|
@ -1,37 +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 <front-or-back-clean-for-extended-side.scad>
|
|
||||||
|
|
||||||
module clean_front_or_back() {
|
|
||||||
difference() {
|
|
||||||
front_or_back_box_frame_piece_for_extended_side();
|
|
||||||
// chop off the lip we left on the basic piece
|
|
||||||
translate([-frame_x/2+frame_wall/2, 0, 0]) cube([frame_wall, frame_y, frame_z], center=true);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
module bottom_piece_wall() {
|
|
||||||
// get a slice of the piece (before the bevel), to use it in extruding
|
|
||||||
projection(cut=true) rotate([-90, 0, 0]) translate([0, frame_y/2-(frame_wall-frame_bevel_height)*3/2, 0])
|
|
||||||
clean_front_or_back();
|
|
||||||
}
|
|
||||||
|
|
||||||
module bottom_piece_extension() {
|
|
||||||
// combine the original with a shrunken piece to "pull" the wall out
|
|
||||||
hull() {
|
|
||||||
linear_extrude(height=frame_extension_y) scale([1, 0.5, 1]) bottom_piece_wall();
|
|
||||||
linear_extrude(height=(frame_wall-frame_bevel_height)) bottom_piece_wall();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module extended_front_or_back_frame_piece() {
|
|
||||||
clean_front_or_back();
|
|
||||||
translate([0, -frame_y/2+frame_wall, 0]) rotate([90, 0, 0]) bottom_piece_extension();
|
|
||||||
}
|
|
||||||
|
|
||||||
extended_front_or_back_frame_piece();
|
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <neutrik-d-plate.scad>
|
use <misc-neutrik-d-plate.scad>
|
||||||
|
|
||||||
module aux_connectors_two_neutrik_cluster_decorative_plate() {
|
module aux_connectors_two_neutrik_cluster_decorative_plate() {
|
||||||
difference() {
|
difference() {
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <neutrik-d-plate.scad>
|
use <misc-neutrik-d-plate.scad>
|
||||||
|
|
||||||
module aux_control_three_button_cluster_decorative_plate() {
|
module aux_control_three_button_cluster_decorative_plate() {
|
||||||
difference() {
|
difference() {
|
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
include <parameters.scad>
|
||||||
|
decorative_radius_scale = 1.5;
|
||||||
|
jumbo_decorative_radius_scale = 0;
|
||||||
|
include <components.scad>
|
||||||
|
|
||||||
|
module dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates() {
|
||||||
|
difference() {
|
||||||
|
// get a 2mm slice of the bigger button cylinders
|
||||||
|
union() {
|
||||||
|
translate([-panel_x/2, 0, -25]) {
|
||||||
|
hull() union() {
|
||||||
|
dir_arc_30mm_finger_buttons();
|
||||||
|
translate([-26.8, 57.2+12.9+34.5, 0]) dir_arc_30mm_thumb_button();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
translate([panel_x/2, 0, -25]) {
|
||||||
|
hull() sega_2p();
|
||||||
|
}
|
||||||
|
hull() {
|
||||||
|
translate([-panel_x/2, 0, -25]) dir_arc_30mm_thumb_button();
|
||||||
|
translate([panel_x/2, -19-9-11-19-9-11, -25]) sega_2p_p1();
|
||||||
|
}
|
||||||
|
difference() {
|
||||||
|
translate([-60, -8, 0]) cube(60, center=true);
|
||||||
|
translate([-98.35, -39.25, 0]) cylinder(h=50, r=48, $fn=50, center=true);
|
||||||
|
}
|
||||||
|
difference() {
|
||||||
|
translate([43.35, -10.30, 0]) cube(50, center=true);
|
||||||
|
translate([68.35, -35.30, 0]) cylinder(h=50, r=18, $fn=50, center=true);
|
||||||
|
}
|
||||||
|
difference() {
|
||||||
|
translate([-10, 55, 0]) cube(43, center=true);
|
||||||
|
translate([-5.15, 76.25, 0]) cylinder(h=50, r=27, $fn=50, center=true);
|
||||||
|
}
|
||||||
|
translate([-7, 0, 0]) cube(80, center=true);
|
||||||
|
}
|
||||||
|
translate([0, 0, -100]) cube([500, 500, 198], center=true);
|
||||||
|
translate([0, 0, 100]) cube([500, 500, 198], center=true);
|
||||||
|
// cut out the normal holes
|
||||||
|
translate([-panel_x/2, 0, -1]) dir_arc_w_30mm();
|
||||||
|
translate([panel_x/2, 0, -1]) sega_2p_plus_one();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates();
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <neutrik-d-plate.scad>
|
use <misc-neutrik-d-plate.scad>
|
||||||
|
|
||||||
module neutrik_d_plate_24mm() {
|
module neutrik_d_plate_24mm() {
|
||||||
difference() {
|
difference() {
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <neutrik-d-plate.scad>
|
use <misc-neutrik-d-plate.scad>
|
||||||
|
|
||||||
module rocker_plate_20mm() {
|
module rocker_plate_20mm() {
|
||||||
difference() {
|
difference() {
|
@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
*/
|
|
||||||
|
|
||||||
include <parameters.scad>
|
|
||||||
decorative_radius_scale = 1.5;
|
|
||||||
jumbo_decorative_radius_scale = 0;
|
|
||||||
include <components.scad>
|
|
||||||
|
|
||||||
module dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates() {
|
|
||||||
difference() {
|
|
||||||
// get a 2mm slice of the bigger button cylinders
|
|
||||||
union() {
|
|
||||||
translate([-panel_x/2, 0, -25]) hull() dir_arc_w_30mm();
|
|
||||||
translate([panel_x/2, 0, -25]) hull() sega_2p_plus_one();
|
|
||||||
}
|
|
||||||
translate([0, 0, -100]) cube([500, 500, 198], center=true);
|
|
||||||
translate([0, 0, 100]) cube([500, 500, 198], center=true);
|
|
||||||
// cut out the normal holes
|
|
||||||
translate([-panel_x/2, 0, -1]) dir_arc_w_30mm();
|
|
||||||
translate([panel_x/2, 0, -1]) sega_2p_plus_one();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate_of_plates();
|
|
@ -1,15 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
*/
|
|
||||||
|
|
||||||
include <parameters.scad>
|
|
||||||
include <components.scad>
|
|
||||||
use <right-sega-2p-plus-one-plus-control-panel.scad>
|
|
||||||
|
|
||||||
module sega_2p_plus_one_plus_control_right_overhang_panel_with_mount() {
|
|
||||||
sega_2p_plus_one_plus_control_right_overhang_panel();
|
|
||||||
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
|
|
||||||
}
|
|
||||||
|
|
||||||
sega_2p_plus_one_plus_control_right_overhang_panel_with_mount();
|
|
@ -67,9 +67,6 @@ panel_x = frame_x - (frame_wall * 2);
|
|||||||
panel_y = frame_y - (frame_wall * 2);
|
panel_y = frame_y - (frame_wall * 2);
|
||||||
panel_z = 5;
|
panel_z = 5;
|
||||||
|
|
||||||
// inside the frame
|
|
||||||
inner_frame_z = frame_z - (panel_z * 2);
|
|
||||||
|
|
||||||
// how much the top plate x/y is expanded to overhang the frame
|
// how much the top plate x/y is expanded to overhang the frame
|
||||||
// note that this is relative to the top plate (so the wall is added back)
|
// note that this is relative to the top plate (so the wall is added back)
|
||||||
panel_overhang_amount = 8.5;
|
panel_overhang_amount = 8.5;
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <dir_arc-plus-w-30mm-plus-one-panel.scad>
|
use <top-panel-inset-dir_arc-plus-w-30mm-plus-one.scad>
|
||||||
|
|
||||||
module dir_arc_w_30mm_plus_one_panel_with_mount() {
|
module dir_arc_w_30mm_plus_one_panel_with_mount() {
|
||||||
dir_arc_w_30mm_plus_one_panel();
|
dir_arc_w_30mm_plus_one_panel();
|
@ -6,7 +6,7 @@
|
|||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
module lever_and_dir_arc_w_30mm_panel() {
|
module top_panel_inset_lever_and_dir_arc_w_30mm() {
|
||||||
difference() {
|
difference() {
|
||||||
panel();
|
panel();
|
||||||
dir_arc_w_30mm();
|
dir_arc_w_30mm();
|
||||||
@ -15,4 +15,4 @@ module lever_and_dir_arc_w_30mm_panel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lever_and_dir_arc_w_30mm_panel();
|
top_panel_inset_lever_and_dir_arc_w_30mm();
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <lever-panel.scad>
|
use <top-panel-inset-lever.scad>
|
||||||
|
|
||||||
module lever_panel_with_mount() {
|
module lever_panel_with_mount() {
|
||||||
lever_panel();
|
lever_panel();
|
@ -5,11 +5,11 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <sega-2p-plus-one-plus-control-panel.scad>
|
use <top-panel-inset-sega-2p-plus-one-plus-control.scad>
|
||||||
|
|
||||||
module sega_2p_plus_one_plus_control_panel_with_mount() {
|
module top_panel_inset_sega_2p_plus_one_plus_control_with_mount() {
|
||||||
sega_2p_plus_one_plus_control_panel();
|
top_panel_inset_sega_2p_plus_one_plus_control();
|
||||||
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
|
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
|
||||||
}
|
}
|
||||||
|
|
||||||
sega_2p_plus_one_plus_control_panel_with_mount();
|
top_panel_inset_sega_2p_plus_one_plus_control_with_mount();
|
@ -6,7 +6,7 @@
|
|||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
module sega_2p_plus_one_plus_control_panel() {
|
module top_panel_inset_sega_2p_plus_one_plus_control() {
|
||||||
difference() {
|
difference() {
|
||||||
panel();
|
panel();
|
||||||
sega_2p_plus_one();
|
sega_2p_plus_one();
|
||||||
@ -15,4 +15,4 @@ module sega_2p_plus_one_plus_control_panel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sega_2p_plus_one_plus_control_panel();
|
top_panel_inset_sega_2p_plus_one_plus_control();
|
@ -6,11 +6,11 @@
|
|||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
module shiokenstar_left_panel() {
|
module top_panel_inset_shiokenstar_left() {
|
||||||
difference() {
|
difference() {
|
||||||
translate([-frame_x/2+frame_wall, 0, 0]) panel();
|
translate([-frame_x/2+frame_wall, 0, 0]) panel();
|
||||||
translate([75, 0, 0]) shiokenstar();
|
translate([75, 0, 0]) shiokenstar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
shiokenstar_left_panel();
|
top_panel_inset_shiokenstar_left();
|
@ -6,11 +6,11 @@
|
|||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
module shiokenstar_right_panel() {
|
module top_panel_inset_shiokenstar_right() {
|
||||||
difference() {
|
difference() {
|
||||||
translate([frame_x/2-frame_wall, 0, 0]) panel();
|
translate([frame_x/2-frame_wall, 0, 0]) panel();
|
||||||
translate([75, 0, 0]) shiokenstar();
|
translate([75, 0, 0]) shiokenstar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
shiokenstar_right_panel();
|
top_panel_inset_shiokenstar_right();
|
@ -6,7 +6,7 @@
|
|||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
module lever_and_dir_arc_w_30mm_left_overhang_panel() {
|
module top_panel_left_lever_and_dir_arc_w_30mm() {
|
||||||
difference() {
|
difference() {
|
||||||
panel_with_raised_overhang();
|
panel_with_raised_overhang();
|
||||||
dir_arc_w_30mm();
|
dir_arc_w_30mm();
|
||||||
@ -16,4 +16,4 @@ module lever_and_dir_arc_w_30mm_left_overhang_panel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lever_and_dir_arc_w_30mm_left_overhang_panel();
|
top_panel_left_lever_and_dir_arc_w_30mm();
|
@ -7,7 +7,7 @@ include <parameters.scad>
|
|||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
// combine the lever mount and generic plate, with mounting holes
|
// combine the lever mount and generic plate, with mounting holes
|
||||||
module lever_left_overhang_panel() {
|
module top_panel_left_lever() {
|
||||||
difference() {
|
difference() {
|
||||||
// base plate
|
// base plate
|
||||||
panel_with_raised_overhang();
|
panel_with_raised_overhang();
|
||||||
@ -18,4 +18,4 @@ module lever_left_overhang_panel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lever_left_overhang_panel();
|
top_panel_left_lever();
|
@ -5,11 +5,11 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <middle-dir_arc-plus-w-30mm-panel.scad>
|
use <top-panel-overhang-middle-dir_arc-plus-w-30mm.scad>
|
||||||
|
|
||||||
module dir_arc_w_30mm_middle_overhang_panel_with_mount() {
|
module top_panel_middle_dir_arc_w_30mm_with_mount() {
|
||||||
dir_arc_w_30mm_middle_overhang_panel();
|
top_panel_middle_dir_arc_w_30mm();
|
||||||
translate([-15, -40, -(panel_z/2) - 3]) rotate([0, 0, -45]) pcb_mount();
|
translate([-15, -40, -(panel_z/2) - 3]) rotate([0, 0, -45]) pcb_mount();
|
||||||
}
|
}
|
||||||
|
|
||||||
dir_arc_w_30mm_middle_overhang_panel_with_mount();
|
top_panel_middle_dir_arc_w_30mm_with_mount();
|
@ -6,7 +6,7 @@
|
|||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
module dir_arc_w_30mm_middle_overhang_panel() {
|
module top_panel_middle_dir_arc_w_30mm() {
|
||||||
difference() {
|
difference() {
|
||||||
panel_with_raised_overhang();
|
panel_with_raised_overhang();
|
||||||
dir_arc_w_30mm();
|
dir_arc_w_30mm();
|
||||||
@ -15,4 +15,4 @@ module dir_arc_w_30mm_middle_overhang_panel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dir_arc_w_30mm_middle_overhang_panel();
|
top_panel_middle_dir_arc_w_30mm();
|
@ -5,14 +5,14 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <right-sega-2p-plus-one-plus-control-panel-with-mount.scad>
|
use <top-panel-overhang-right-sega-2p-plus-one-plus-control-with-mount.scad>
|
||||||
|
|
||||||
module sega_2p_plus_one_plus_control_right_overhang_panel_with_mount_with_oled() {
|
module top_panel_right_sega_2p_plus_one_plus_control_with_mount_with_oled() {
|
||||||
difference() {
|
difference() {
|
||||||
sega_2p_plus_one_plus_control_right_overhang_panel_with_mount();
|
top_panel_right_sega_2p_plus_one_plus_control_with_mount();
|
||||||
translate([75, 77.5, 0]) oled_ssd1306_mount_cutout();
|
translate([75, 77.5, 0]) oled_ssd1306_mount_cutout();
|
||||||
}
|
}
|
||||||
translate([75, 77.5, 0.5]) oled_ssd1306_mount();
|
translate([75, 77.5, 0.5]) oled_ssd1306_mount();
|
||||||
}
|
}
|
||||||
|
|
||||||
sega_2p_plus_one_plus_control_right_overhang_panel_with_mount_with_oled();
|
top_panel_right_sega_2p_plus_one_plus_control_with_mount_with_oled();
|
@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
include <parameters.scad>
|
||||||
|
include <components.scad>
|
||||||
|
use <top-panel-overhang-right-sega-2p-plus-one-plus-control.scad>
|
||||||
|
|
||||||
|
module top_panel_right_sega_2p_plus_one_plus_control_with_mount() {
|
||||||
|
top_panel_right_sega_2p_plus_one_plus_control();
|
||||||
|
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
|
||||||
|
}
|
||||||
|
|
||||||
|
top_panel_right_sega_2p_plus_one_plus_control_with_mount();
|
@ -6,7 +6,7 @@
|
|||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
module sega_2p_plus_one_plus_control_right_overhang_panel() {
|
module top_panel_right_sega_2p_plus_one_plus_control() {
|
||||||
difference() {
|
difference() {
|
||||||
panel_with_raised_overhang();
|
panel_with_raised_overhang();
|
||||||
sega_2p_plus_one();
|
sega_2p_plus_one();
|
||||||
@ -15,4 +15,4 @@ module sega_2p_plus_one_plus_control_right_overhang_panel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sega_2p_plus_one_plus_control_right_overhang_panel();
|
top_panel_right_sega_2p_plus_one_plus_control();
|
@ -5,11 +5,11 @@
|
|||||||
|
|
||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
use <right-sega-2p-plus-one-panel.scad>
|
use <top-panel-overhang-right-sega-2p-plus-one.scad>
|
||||||
|
|
||||||
module sega_2p_plus_one_with_mount_right_overhang_panel() {
|
module top_panel_right_sega_2p_plus_one_with_mount() {
|
||||||
sega_2p_plus_one_right_overhang_panel();
|
top_panel_right_sega_2p_plus_one();
|
||||||
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
|
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
|
||||||
}
|
}
|
||||||
|
|
||||||
sega_2p_plus_one_with_mount_right_overhang_panel();
|
top_panel_right_sega_2p_plus_one_with_mount();
|
@ -6,7 +6,7 @@
|
|||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
module sega_2p_plus_one_right_overhang_panel() {
|
module top_panel_right_sega_2p_plus_one() {
|
||||||
difference() {
|
difference() {
|
||||||
panel_with_raised_overhang();
|
panel_with_raised_overhang();
|
||||||
sega_2p_plus_one();
|
sega_2p_plus_one();
|
||||||
@ -14,4 +14,4 @@ module sega_2p_plus_one_right_overhang_panel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sega_2p_plus_one_right_overhang_panel();
|
top_panel_right_sega_2p_plus_one();
|
@ -6,11 +6,11 @@
|
|||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
module dir_arc_24mm_6_button_solo_overhang_panel() {
|
module dir_arc_24mm_6_button_panel() {
|
||||||
difference() {
|
difference() {
|
||||||
panel_with_raised_overhang();
|
panel_with_raised_overhang();
|
||||||
translate([-71.5, -panel_y/2+122.5, 0]) dir_arc_24mm_6_button();
|
translate([-71.5, -panel_y/2+122.5, 0]) dir_arc_24mm_6_button();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dir_arc_24mm_6_button_solo_overhang_panel();
|
dir_arc_24mm_6_button_panel();
|
@ -6,11 +6,11 @@
|
|||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
module dir_arc_plus_w_24mm_8_button_solo_overhang_panel() {
|
module dir_arc_plus_w_24mm_8_button_panel() {
|
||||||
difference() {
|
difference() {
|
||||||
panel_with_raised_overhang();
|
panel_with_raised_overhang();
|
||||||
translate([-80.5, panel_y/6, 0]) dir_arc_plus_w_24mm_8_button();
|
translate([-80.5, panel_y/6, 0]) dir_arc_plus_w_24mm_8_button();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dir_arc_plus_w_24mm_8_button_solo_overhang_panel();
|
dir_arc_plus_w_24mm_8_button_panel();
|
@ -6,7 +6,7 @@
|
|||||||
include <parameters.scad>
|
include <parameters.scad>
|
||||||
include <components.scad>
|
include <components.scad>
|
||||||
|
|
||||||
module lever_and_sega_2p_6_button_solo_overhang_panel() {
|
module top_panel_solo_lever_and_sega_2p_6_button() {
|
||||||
difference() {
|
difference() {
|
||||||
// base plate
|
// base plate
|
||||||
union() {
|
union() {
|
||||||
@ -18,4 +18,4 @@ module lever_and_sega_2p_6_button_solo_overhang_panel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lever_and_sega_2p_6_button_solo_overhang_panel();
|
top_panel_solo_lever_and_sega_2p_6_button();
|
Loading…
x
Reference in New Issue
Block a user