Compare commits
66 Commits
v4.1.0
...
build123d-
| Author | SHA1 | Date | |
|---|---|---|---|
|
d4217405e1
|
|||
|
0dcd1cb5ff
|
|||
|
e63a5da6a2
|
|||
|
82d914c30c
|
|||
|
903b9b40ff
|
|||
|
9fd3658518
|
|||
|
bd7b908712
|
|||
|
61a67109ce
|
|||
|
ff85423cee
|
|||
|
ca655012c5
|
|||
|
3059e01b8f
|
|||
|
2911b23db4
|
|||
|
00a1bbc065
|
|||
|
6726233beb
|
|||
|
bc68f8b0dc
|
|||
|
de3914fa85
|
|||
|
92d3f9e6d5
|
|||
|
8168797be3
|
|||
|
244ace1b4a
|
|||
|
db887b668f
|
|||
|
dccd2836b2
|
|||
|
2ed9b12ed3
|
|||
|
de0fcfd160
|
|||
|
4e65445e16
|
|||
|
d578890d96
|
|||
|
db41aa1183
|
|||
|
0d954c2630
|
|||
|
60b52eb10d
|
|||
|
63c7ade41d
|
|||
|
eaaa92004f
|
|||
|
cf218ecc1d
|
|||
|
8fd77375b7
|
|||
|
a9911820c9
|
|||
|
b9ba201c99
|
|||
|
3bd36cfbdf
|
|||
|
89e25bd001
|
|||
|
a6803450f8
|
|||
|
e41f3f4c6c
|
|||
|
3ec6132547
|
|||
|
b43b79ce19
|
|||
|
f93f20997a
|
|||
|
70b45fa18b
|
|||
|
e50629d372
|
|||
|
01d4d95f24
|
|||
|
4cefdfa26b
|
|||
|
dabfc4258b
|
|||
|
a7206add7c
|
|||
|
d70a2f90c6
|
|||
|
0513da125f
|
|||
|
e7543dceb0
|
|||
|
45439cbf6d
|
|||
|
b21cb75816
|
|||
|
882a34db55
|
|||
|
90f5670c2a
|
|||
|
96342f1b16
|
|||
|
7bc6acfb93
|
|||
|
16f41fe245
|
|||
|
c8881fc172
|
|||
|
1f8b5d527b
|
|||
|
edf5729a85
|
|||
|
3a1494c021
|
|||
|
9125105b42
|
|||
|
cadf2bf210
|
|||
|
0993c0f292
|
|||
|
954ce38f07
|
|||
|
832d5ede8b
|
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,3 +1,8 @@
|
||||
build/
|
||||
venv/
|
||||
*.egg-info/
|
||||
.tox/
|
||||
|
||||
*.pyc
|
||||
*.sw*
|
||||
.coverage
|
||||
|
||||
85
CHANGELOG.md
Normal file
85
CHANGELOG.md
Normal file
@@ -0,0 +1,85 @@
|
||||
# CHANGELOG
|
||||
|
||||
Included is a summary of changes to the project, by version. Details can be found in the commit history.
|
||||
|
||||
## v4.4.0
|
||||
|
||||
### Features
|
||||
|
||||
* New "windowed" frame box walls have been added, which allow for seeing through the outer wall to something else, such
|
||||
as an inner wall of a different color, or for people who like showing off their wiring, nothing.
|
||||
* An attempt at a two-panel "shiokenstar" layout has been added.
|
||||
* The "plates" decorative plate for my favorite layout was altered since I wasn't using it anyway.
|
||||
|
||||
### Improvements
|
||||
|
||||
* The frame routing hole, in either the whole frames or the interconnect, is a semicircle on one side, making it easier
|
||||
to wire (and rewire) a completed arcade stick, and it also makes button layouts that span the connection point more
|
||||
possible.
|
||||
* Less of the inner wall is cut out for e.g. Neutrik and aux buttons now, removing the possibility for inset panels to
|
||||
allow for a tiny bit of light to seep the cracks and giving panels a bit more support.
|
||||
* The piece-based frame walls now meet at 45 degree angles at the corners, which makes for fewer print anomalies to
|
||||
catch your hand or clothing on. These 45 degree angles are not used for the TE1-style extended panels, which still
|
||||
meet at 90 degree angles.
|
||||
* All of the core arcade stick parts, and extras, have been reorganized and renamed into subdirectories that make their
|
||||
purpose more obvious. This also makes it clearer what you're looking at when looking at the project file structure.
|
||||
Documentation was updated throughout for this change.
|
||||
|
||||
### Miscellaneous
|
||||
|
||||
* A stand for showing off inset-based sticks has been added to extras. This may get more love in a future release.
|
||||
* The blown up demo now uses frame pieces, as these are quickly becoming the standard build.
|
||||
* Cleanups to CONTRIBUTING.md
|
||||
* Demos have been given their own place in the repository.
|
||||
* The Makefile has been altered to use a Python script to build the files, due to the complexity of reorganizing the
|
||||
project into subdirectories.
|
||||
* An abandoned floating stand has been moved into the attic --- it barely works right.
|
||||
|
||||
## v4.3.x
|
||||
|
||||
This finally removed the posts added to the panels introduced in v4.0.
|
||||
|
||||
## v4.2.x
|
||||
|
||||
This added TE1-like bevels to the repository, which look pretty neat.
|
||||
|
||||
## v4.1.0
|
||||
|
||||
Having improved the internals in v4.0.0, this broke out the frame into modular pieces, making them easier and more
|
||||
reliable to print, with only a trivial effect on the overall stability of the stick. This also made the bottom panels
|
||||
identical to the top, easing reuse.
|
||||
|
||||
## v4.0.x
|
||||
|
||||
This was an experiment that didn't survive scrutiny to add more posts to the frames and panels, in order to improve the
|
||||
friction fit, but it really just make the whole thing more obnoxious to work with. However, this redesign also came with
|
||||
some key improvements to the construction of the stick, which has made the subsequent releases easier to work with.
|
||||
|
||||
## v3.3.x
|
||||
|
||||
Largely a cleanup, this improved the component reuse and added more complete licensing information to the project.
|
||||
|
||||
## v3.2.x
|
||||
|
||||
This improved the frame height to accommodate more levers in inset panels, along with some cleanup.
|
||||
|
||||
## v3.1.x
|
||||
|
||||
This added panels for more layouts with more buttons, establishing my go-to of a lever, a directional arc with an extra
|
||||
button in a W-as-in-WASD position, and a Sega 2P-inspired 9-button action button layout.
|
||||
|
||||
## v3.0.x
|
||||
|
||||
I think the project really took shape at this point, as it resized the panels and frames to accommodate a two-panel
|
||||
layout for nice, long sticks.
|
||||
|
||||
## v2.0.x
|
||||
|
||||
This added the overhang plates to the mix, while still sticking to the three-panel design. It also started adding
|
||||
dustwashers and decorative plates, which improved the aesthetics of the project.
|
||||
|
||||
## v1.0.x
|
||||
|
||||
This was a simple three-panel stick that was somewhat ridiculously long, but worked, and built a lot of the foundation
|
||||
for the project. Its start as being inspired by the Open Stick really showed at this point, but things were coming
|
||||
together.
|
||||
@@ -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.
|
||||
21
Makefile
21
Makefile
@@ -1,15 +1,12 @@
|
||||
SRC_FILES := $(wildcard ./src/*.scad)
|
||||
SRC_FILES := $(filter-out ./src/all-together-demo.scad, $(SRC_FILES))
|
||||
SRC_FILES := $(filter-out ./src/blown-up-demo.scad, $(SRC_FILES))
|
||||
SRC_FILES := $(filter-out ./src/components.scad, $(SRC_FILES))
|
||||
SRC_FILES := $(filter-out ./src/roundedcube.scad, $(SRC_FILES))
|
||||
all: $(SRC_FILES)
|
||||
mkdir -p ./build
|
||||
for file in $^ ; do \
|
||||
openscad -o $${file}.stl $${file} ; \
|
||||
mv $${file}.stl ./build/ ; \
|
||||
done
|
||||
zip ./build/buildable-stick-system-`git describe --dirty`-stls.zip ./build/*
|
||||
all:
|
||||
python build.py
|
||||
mkdir -p ./build/docs
|
||||
cp ./docs/README-objects.md ./build/README.md
|
||||
cp ./docs/assembly-and-tips.md ./build/docs/assembly-and-tips.md
|
||||
cp ./docs/printing-and-materials.md ./build/docs/printing-and-materials.md
|
||||
cp ./LICENSE ./build/LICENSE
|
||||
cp ./CHANGELOG.md ./build/CHANGELOG.md
|
||||
pushd ./build; zip ./buildable-stick-system-`git describe --dirty`-stls.zip . -r; popd
|
||||
|
||||
clean:
|
||||
rm -rf ./build
|
||||
|
||||
109
README.md
109
README.md
@@ -2,11 +2,16 @@
|
||||
|
||||
Files for 3D printing an arcade stick.
|
||||
|
||||
Have you ever wanted to conjure your own arcade stick out of the ether (well, plastic), or to prototype a new layout or
|
||||
design before sending it to a custom builder? Do you just love having your space filled with arcade stick enclosures,
|
||||
because you keep making different variants, colorways, and so on? Or do you simply want a good stick on the cheap, and
|
||||
know someone or a library with a 3D printer? The Buildable Stick System may be the project for you!
|
||||
|
||||

|
||||
|
||||
[OpenSCAD-based illustration of how the components for an overhang panel-based stick fit together.]
|
||||
|
||||

|
||||

|
||||
|
||||
[Photo of a completed inset panel-based stick.]
|
||||
|
||||
@@ -25,29 +30,48 @@ starting with an existing object and constructing what you'd like with new or ex
|
||||
## 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
|
||||
about when/how to use specific parts:
|
||||
about what the types of parts are and how to use them:
|
||||
|
||||
* `foo-panel-inset`s --- these fit flush into a frame, creating a closed box enclosure.
|
||||
* `foo-panel-overhang`s --- these have a tray that fits into a frame with the actual face extending beyond the frame,
|
||||
creating an ice cream sandwich enclosure.
|
||||
* These also yield a bit more space inside the box, for tall levers or whatever.
|
||||
* `frame`s (non-pieces) --- these create the box of the enclosure, as one part. These can be hard to print well ---
|
||||
shrinkage forces tend to curl up the corners no matter what you do, and some points need supports --- but if you don't
|
||||
care about that because you're printing an ice cream sandwich, they are simpler than...
|
||||
* `frame-piece`s --- these break up the frame box into four faces, and are held together by friction fit and the hex
|
||||
bolts. This is more stable than you might expect, but it does introduce some variability in the overall sturdiness of
|
||||
the enclosure compared with the frame as one box piece.
|
||||
* The `interconnect` replaces the need to bolt multiple frames together.
|
||||
* `frames/`
|
||||
* `complete/` --- these are the four walls of the frame as one piece, in a couple variations for combining into
|
||||
larger arcade sticks. They are simple to assemble, but you have fewer modularity/customization options, and they
|
||||
are harder to print because the physics of the material cooling will probably pull the corners up. They also need
|
||||
supports, since the top and bottom of the frame both have trays for panels to go into. Use at your own risk.
|
||||
* `pieces/`
|
||||
* `box/` --- these are the same four walls (generally speaking) as in the complete frames above, broken out into
|
||||
modular pieces to print separately. Because they are separate pieces, you can mix and match colors, and you
|
||||
can lay them all face down on the print surface for better adhesion and surface patterns. There are also
|
||||
variants here, the "windowed" pieces, for doing two-tone variants and that kind of thing.
|
||||
* `extended/` --- the frame walls are pulled out to create MCZ TE-style extended sides. Rather than getting a
|
||||
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
|
||||
|
||||
These items all fit on a 256mm^2 print bed; I use a Bambu Lab P1P based on what I've learned from the
|
||||
OpenStickCommunity. Standard settings seem sufficiently sturdy for my purposes, though the slicer has done a couple
|
||||
weird things, in my experience.
|
||||
|
||||
My preferred settings are 3 wall loops with 20% gyroid sparse infill. This gives the models a bit more weight and
|
||||
stability, but something like 2 wall loops, 15% grid sparse infill is fine and does not lead to a weak enclosure. The
|
||||
costs below have been made against my settings.
|
||||
OpenStickCommunity. Standard settings seem sufficiently sturdy, but see `docs/materials-and-printing.md` for more
|
||||
thoughts and settings based on my tinkering with prints.
|
||||
|
||||
## Assembling
|
||||
|
||||
@@ -56,14 +80,14 @@ What you'll need beyond these objects:
|
||||
* An arcade stick board (I recommend [TheTrain's RP2040 Advanced Breakout
|
||||
Board](https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Advanced%20Breakout%20Board))
|
||||
* 4 M3 8mm hex bolts to secure the PCB to a panel
|
||||
* Per frame and plate combo:
|
||||
* Per frame and panel combo:
|
||||
* 4 45mm M4 hex brass standoffs (or equivalent)
|
||||
* 8 M4 countersunk hex bolts
|
||||
* Overhang plates should use 12-16mm length bolts since they are taller
|
||||
* Inset plates should probably use 8-12mm bolts --- some standoffs aren't threaded the whole way, making 16mm
|
||||
* Overhang panels 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
|
||||
too long to go flush
|
||||
* If making the 45mm standoffs from multiple smaller ones, make sure they have enough length to take your bolts!
|
||||
* Per frame connection point:
|
||||
* Per frame connection point (only necessary if you are using complete frames and not frame pieces):
|
||||
* 8 16mm M4 bolts
|
||||
* 8 M4 flange nuts
|
||||
* For a lever:
|
||||
@@ -78,7 +102,7 @@ What you'll need beyond these objects:
|
||||
## Rough Costs
|
||||
|
||||
This is a rough estimate of the cost to produce one of these sticks, assuming a usual 2-frame design and layout.
|
||||
Filament masses from Bambu Studio estimates, using Bambu PLA Basic.
|
||||
Filament masses from Bambu Studio estimates, using Bambu PLA Basic, 20% gyroid infill and 3 wall loops.
|
||||
|
||||
* Left and right frame: **$10.42 USD** (208.50g each, as of 2024-02-22)
|
||||
* Left and right (inset) top panels: **~$6.40 USD** (~128g each, as of 2024-02-22)
|
||||
@@ -92,14 +116,14 @@ Filament masses from Bambu Studio estimates, using Bambu PLA Basic.
|
||||
of 2023-09-12)
|
||||
* 4 M3 flange nuts to connect Neutrik D plates to frames: **$0.34 USD** (you can get a pack of 100 on Amazon for $8.50,
|
||||
as of 2023-09-12)
|
||||
* 8 45mm M4 spacers to connect panels to frames: **$2.40 USD** (you can get a pack of 10 on AliExpress for $3, as of
|
||||
* 8 45mm M4 standoffs to connect panels to frames: **$2.40 USD** (you can get a pack of 10 on AliExpress for $3, as of
|
||||
2023-09-12)
|
||||
* You could 3D print these too, but you're probably better off with brass ones as they give some weight to the
|
||||
stick anyway
|
||||
* You can also use a shorter length with longer bolts, or combine multiple spacers, 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
|
||||
* 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 plates 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 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 panels to frames: **$0.72 USD** (you can get a pack of 100 on Amazon for $9, as of
|
||||
2023-09-12)
|
||||
|
||||
With an enclosure coming in around $31, depending on your choices --- say, ~$30 for TheTrain's RP2040 Advanced Breakout
|
||||
@@ -133,14 +157,7 @@ to hang out and discuss issues and features and whatnot.
|
||||
|
||||
## Attribution
|
||||
|
||||
Inspired by the incredible work of [TheTrain](https://github.com/TheTrainGoes) on the [OpenStickCommunity Fightstick
|
||||
Case](https://github.com/OpenStickCommunity/Hardware/tree/main/Fightstick%20Case), itself based on the incredible work
|
||||
by [Dash n'Mash](https://twitter.com/Dash_xx_Mash?s=20). Original work Copyright 2023 TheTrain, [licensed under CC BY
|
||||
4.0](https://creativecommons.org/licenses/by/4.0/).
|
||||
|
||||
Made possible by the amazing efforts of [slagcoin](https://www.slagcoin.com/).
|
||||
|
||||
## Author and Licensing
|
||||
### Author and Licensing
|
||||
|
||||
Written by and copyright Brian S. Stephan (<bss@incorporeal.org>).
|
||||
|
||||
@@ -153,3 +170,23 @@ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Gen
|
||||
|
||||
You should have received a copy of the GNU General Public License along with the Buildable Stick System. If not, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
### Lineage
|
||||
|
||||
Inspired by the incredible work of [TheTrain](https://github.com/TheTrainGoes) on the [OpenStickCommunity Fightstick
|
||||
Case](https://github.com/OpenStickCommunity/Hardware/tree/main/Fightstick%20Case), itself based on the incredible work
|
||||
by [Dash n'Mash](https://twitter.com/Dash_xx_Mash?s=20). Original work Copyright 2023 TheTrain, [licensed under CC BY
|
||||
4.0](https://creativecommons.org/licenses/by/4.0/).
|
||||
|
||||
Made possible by the amazing efforts of [slagcoin](https://www.slagcoin.com/).
|
||||
|
||||
### Distributing BSS Sticks
|
||||
|
||||
Under the terms of the GPLv3, you must inform the receiver of the "object code" of their rights under the GPLv3. This is
|
||||
a bit of a gray area for physical objects, but likely applies to distribution of modified or unmodified STL, STEP, etc.
|
||||
files at a minimum. The easiest way to satisfy the GPLv3 in either situation is to provide a link to the source code
|
||||
(either the unmodified mainline project, or your copy, with modifications listed in a "prominent notice"); something
|
||||
like the below should suffice in either electronic or printed form:
|
||||
|
||||
> This arcade stick is part of the Buildable Stick System, version X.Y.Z; the source code to this program is available
|
||||
> under the terms of the GNU General Public License, at [LINK].
|
||||
|
||||
2
TODO.md
2
TODO.md
@@ -4,4 +4,4 @@ Notes for "next time".
|
||||
|
||||
## v4.x
|
||||
|
||||
* Engraving some cosmetic stuff? Or maybe a place to mount other plates?
|
||||
* Engraving some cosmetic stuff? Or maybe a place to mount other plates on the top?
|
||||
|
||||
4
attic/README.md
Normal file
4
attic/README.md
Normal file
@@ -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!
|
||||
68
attic/extras/tower-of-hovering-power-mount.scad
Normal file
68
attic/extras/tower-of-hovering-power-mount.scad
Normal file
@@ -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();
|
||||
50
build.py
Normal file
50
build.py
Normal file
@@ -0,0 +1,50 @@
|
||||
"""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()
|
||||
38
demo/all-together-demo-extended.scad
Normal file
38
demo/all-together-demo-extended.scad
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* 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();
|
||||
35
demo/all-together-demo.scad
Normal file
35
demo/all-together-demo.scad
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* 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();
|
||||
34
demo/blown-up-demo.scad
Normal file
34
demo/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 <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]) rotate([0, 0, 180])
|
||||
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();
|
||||
79
docs/README-objects.md
Normal file
79
docs/README-objects.md
Normal file
@@ -0,0 +1,79 @@
|
||||
# The Buildable Stick System
|
||||
|
||||
Files for 3D printing an arcade stick.
|
||||
|
||||
## Objects
|
||||
|
||||
The following notes document the objects in the Buildable Stick System and how you can use them:
|
||||
|
||||
* `frames/`
|
||||
* `complete/` --- these are the four walls of the frame as one piece, in a couple variations for combining into
|
||||
larger arcade sticks. They are simple to assemble, but you have fewer modularity/customization options, and they
|
||||
are harder to print because the physics of the material cooling will probably pull the corners up. They also need
|
||||
supports, since the top and bottom of the frame both have trays for panels to go into. Use at your own risk.
|
||||
* `pieces/`
|
||||
* `box/` --- these are the same four walls (generally speaking) as in the complete frames above, broken out into
|
||||
modular pieces to print separately. Because they are separate pieces, you can mix and match colors, and you
|
||||
can lay them all face down on the print surface for better adhesion and surface patterns. There are also
|
||||
variants here, the "windowed" pieces, for doing two-tone variants and that kind of thing.
|
||||
* `extended/` --- the frame walls are pulled out to create MCZ TE-style extended sides. Rather than getting a
|
||||
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.
|
||||
|
||||
Feel free to request or contribute to more objects, see the links to Git repos below.
|
||||
|
||||
## Printing and Assembling
|
||||
|
||||
Additional documentation regarding printing the objects and assembling the stick are available in
|
||||
`docs/printing-and-materials.md` and `docs/assembly-and-tips.md`, respectively.
|
||||
|
||||
## Author and Licensing
|
||||
|
||||
Written by and copyright Brian S. Stephan (<bss@incorporeal.org>).
|
||||
|
||||
These arcade stick parts are from the Buildable Stick System; the source code to this program is available under the
|
||||
terms of the GNU General Public License, at:
|
||||
|
||||
* <https://github.com/bsstephan/buildable-stick-system>, or
|
||||
* <https://git.incorporeal.org/bss/buildable-stick-system>
|
||||
|
||||
See the tags/releases for the version of the source code corresponding to the STLs you received.
|
||||
|
||||
The Buildable Stick System is free software: you can redistribute it and/or modify it under the terms of the GNU General
|
||||
Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
|
||||
later version.
|
||||
|
||||
The Buildable Stick System is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
|
||||
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with the Buildable Stick System. If not, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
## Lineage
|
||||
|
||||
Inspired by the incredible work of [TheTrain](https://github.com/TheTrainGoes) on the [OpenStickCommunity Fightstick
|
||||
Case](https://github.com/OpenStickCommunity/Hardware/tree/main/Fightstick%20Case), itself based on the incredible work
|
||||
by [Dash n'Mash](https://twitter.com/Dash_xx_Mash?s=20). Original work Copyright 2023 TheTrain, [licensed under CC BY
|
||||
4.0](https://creativecommons.org/licenses/by/4.0/).
|
||||
52
docs/assembly-and-tips.md
Normal file
52
docs/assembly-and-tips.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# Assembly and Tips
|
||||
|
||||
Just some miscellaneous notes for any dear reader, or more likely, my own forgetful self.
|
||||
|
||||
## 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.2 or beyond stick, with two
|
||||
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.
|
||||
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. You could also do the decorative plates and related buttons, but it might be just as well to leave those for step 7,
|
||||
just to make sure the buttons don't get in the way of other buttons or a lever or so on.
|
||||
2. Start the top panels: 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. You can secure them at
|
||||
this point.
|
||||
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
|
||||
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,
|
||||
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
|
||||
just via 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
|
||||
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.
|
||||
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.
|
||||
|
||||
## Removing Inset Panels
|
||||
|
||||
As of v4.1 (or in v3), the top and bottom inset panels both insert into the frame, inside the frame "lip", meaning that
|
||||
when everything is put together, they create a flush surface (more or less). This can make them hard to get out, as you
|
||||
can't grab anything to get any leverage, and especially with v4.1, the plastic posts to aid the friction fit make it
|
||||
even harder to muscle out --- in fact, even if you could get an edge and start yanking, you'd probably just break some
|
||||
of the plastic.
|
||||
|
||||
You can instead use the reverse side and the hex standoffs to push a panel out, as so:
|
||||
|
||||
1. Loosen, or completely remove, the hex bolts for the panel you would like to remove.
|
||||
2. Flip the stick over, and remove the hex bolts on the opposite side.
|
||||
3. Screw in longer bolts, or anything else that'll fit into the hole without going flush against the panel.
|
||||
4. Push the long bolts in, thus pushing the standoffs, thus pushing the desired panel out from within.
|
||||
5. You may have to even get a mallet and tap on a bolt, occasionally, as everything can be *pretty* tight.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 66 KiB |
BIN
docs/finished-v4.1.jpg
Normal file
BIN
docs/finished-v4.1.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 89 KiB |
BIN
docs/finished-v4.2.jpg
Normal file
BIN
docs/finished-v4.2.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 277 KiB |
BIN
docs/finished-v4.4.jpg
Normal file
BIN
docs/finished-v4.4.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 372 KiB |
@@ -1,25 +0,0 @@
|
||||
# Materials
|
||||
|
||||
bss's random thoughts and notes on 3D printing materials.
|
||||
|
||||
## Bambu Lab PLA
|
||||
|
||||
### Basic
|
||||
|
||||
* In general, nice texture, but under direct light, you can see a bit of the infill pattern through the walls. Not super
|
||||
distracting, but it's there.
|
||||
|
||||
#### White
|
||||
|
||||
* Walls are practically translucent, you can almost always see the infill. Do not use for major components.
|
||||
* Looks perfectly good for thin things like the Neutrik plates, decorative pieces, that kind of thing.
|
||||
|
||||
### Matte
|
||||
|
||||
* I don't like the texture as much, but they do produce nice non-primary color colorways, and you don't see the infill.
|
||||
* Seems like their plastic treatment leaves some plate residue, so be better about cleaning it or you'll get ghosts.
|
||||
|
||||
## Hatchbox PLA
|
||||
|
||||
* **Blue:** very blue. Wife likes it.
|
||||
* **White:** more opaque than the Bambu PLA mentioned above, makes a pretty decent (still slightly translucent) frame.
|
||||
58
docs/printing-and-materials.md
Normal file
58
docs/printing-and-materials.md
Normal file
@@ -0,0 +1,58 @@
|
||||
# Printing and Materials
|
||||
|
||||
bss's random thoughts and notes on the actual printing of the Buildable Stick System.
|
||||
|
||||
## Printing Settings
|
||||
|
||||
My preferred settings are 3 wall loops with 20% gyroid sparse infill. This gives the models a bit more weight and
|
||||
strength against bowing forces, but something more default, like 2 wall loops, 15% grid sparse infill, is fine and does
|
||||
not lead to a weak enclosure.
|
||||
|
||||
### Working With Flatness
|
||||
|
||||
A lot of the pieces are long and flat, so I recommend really dialing in your printer settings. The frame pieces make
|
||||
corner curling of the frame less of a problem, but you may still get it on the panels and the beveled frame pieces.
|
||||
|
||||
#### Bottom Layer Notes
|
||||
|
||||
Considering the visible layer (usually, the bottom layer) pattern is ideal. Monotonic prints fast but creates long,
|
||||
uniform lines that create reflection patterns on long, flat surfaces. This can be especially distracting for the top
|
||||
panels and their decorative plates, since they're what you're looking at 90% of the time, and the holes break up a
|
||||
perfect pattern, making the long lines stand out even more.
|
||||
|
||||
* **Top panels:** using a non-uniform pattern reduces if not eliminates the problem of the surface catching the light,
|
||||
but for some patterns, it may come at the expense of time. Other patterns may improve beyond monotonic, but hilbert
|
||||
curve seems to be the gold standard.
|
||||
* **Circle-centric decorative plates:** don't use complex patterns like Archimedean chords on decorative plates, as they
|
||||
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.
|
||||
|
||||
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
|
||||
|
||||
Some notes on PLA brands, usages, etc.
|
||||
|
||||
### Bambu Lab PLA
|
||||
|
||||
#### Basic
|
||||
|
||||
* In general, nice texture, but under direct light, you can see a bit of the infill pattern through the walls. Not super
|
||||
distracting, but it's there.
|
||||
|
||||
##### White
|
||||
|
||||
* Walls are practically translucent, you can almost always see the infill. 3 wall loops and a varying infill pattern
|
||||
definitely help here.
|
||||
* Looks perfectly good for thin things like the Neutrik plates, decorative pieces, that kind of thing.
|
||||
|
||||
#### Matte
|
||||
|
||||
* I don't like the texture as much, but they do produce nice non-primary color colorways, and you don't see the infill.
|
||||
* Seems like their plastic treatment leaves some plate residue, so be better about cleaning it or you'll get ghosts.
|
||||
|
||||
### Hatchbox PLA
|
||||
|
||||
* **Blue:** very blue. Wife likes it.
|
||||
* **White:** more opaque than the Bambu PLA mentioned above, makes a pretty decent (still slightly translucent) frame.
|
||||
53
pyproject.toml
Normal file
53
pyproject.toml
Normal file
@@ -0,0 +1,53 @@
|
||||
[build-system]
|
||||
requires = ["setuptools>=61.0", "setuptools_scm[toml]>=6.2"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "buildable-stick-system"
|
||||
description = "Files for 3D printing an arcade stick."
|
||||
readme = "README.md"
|
||||
license = {text = "GPL-3.0-or-later"}
|
||||
authors = [
|
||||
{name = "Brian S. Stephan", email = "bss@incorporeal.org"},
|
||||
]
|
||||
requires-python = "<3.12,>=3.9"
|
||||
dependencies = ["build123d"]
|
||||
dynamic = ["version"]
|
||||
classifiers = [
|
||||
# TODO
|
||||
]
|
||||
|
||||
[project.urls]
|
||||
# TODO
|
||||
|
||||
[project.optional-dependencies]
|
||||
dev = ["bandit", "flake8", "flake8-blind-except", "flake8-builtins", "flake8-docstrings",
|
||||
"flake8-executable", "flake8-fixme", "flake8-isort", "flake8-logging-format", "flake8-mutable",
|
||||
"flake8-pyproject", "mypy", "pip-tools", "pytest", "pytest-asyncio", "pytest-cov", "reuse",
|
||||
"setuptools-scm", "tox", "twine"]
|
||||
gui = ["cadquery>=2.2", "CQ-Editor@git+https://github.com/jdegenstein/jmwright-CQ-Editor"]
|
||||
|
||||
[project.scripts]
|
||||
# TODO
|
||||
|
||||
[tool.flake8]
|
||||
enable-extensions = "G,M"
|
||||
exclude = [".tox/", "venv/", "_version.py", "tests/test-files/"]
|
||||
extend-ignore = "T101"
|
||||
max-complexity = 10
|
||||
max-line-length = 120
|
||||
|
||||
[tool.isort]
|
||||
line_length = 120
|
||||
|
||||
[tool.mypy]
|
||||
ignore_missing_imports = true
|
||||
|
||||
[tool.pytest]
|
||||
python_files = ["*_tests.py", "tests.py", "test_*.py"]
|
||||
|
||||
[tool.setuptools]
|
||||
# TODO
|
||||
|
||||
[tool.setuptools_scm]
|
||||
# TODO
|
||||
644
requirements/requirements-dev-and-gui.txt
Normal file
644
requirements/requirements-dev-and-gui.txt
Normal file
@@ -0,0 +1,644 @@
|
||||
#
|
||||
# This file is autogenerated by pip-compile with Python 3.11
|
||||
# by the following command:
|
||||
#
|
||||
# pip-compile --extra=dev --extra=gui --output-file=requirements/requirements-dev-and-gui.txt
|
||||
#
|
||||
alabaster==0.7.16
|
||||
# via sphinx
|
||||
anytree==2.12.1
|
||||
# via build123d
|
||||
arrow==1.3.0
|
||||
# via cookiecutter
|
||||
astroid==3.2.2
|
||||
# via pylint
|
||||
asttokens==2.4.1
|
||||
# via stack-data
|
||||
atomicwrites==1.4.1
|
||||
# via spyder
|
||||
attrs==23.2.0
|
||||
# via
|
||||
# jsonschema
|
||||
# referencing
|
||||
autopep8==2.0.4
|
||||
# via python-lsp-server
|
||||
babel==2.15.0
|
||||
# via sphinx
|
||||
backports-tarfile==1.2.0
|
||||
# via jaraco-context
|
||||
bandit==1.7.9
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
beautifulsoup4==4.12.3
|
||||
# via nbconvert
|
||||
binaryornot==0.4.4
|
||||
# via
|
||||
# cookiecutter
|
||||
# reuse
|
||||
black==24.4.2
|
||||
# via python-lsp-black
|
||||
bleach==6.1.0
|
||||
# via nbconvert
|
||||
boolean-py==4.0
|
||||
# via
|
||||
# license-expression
|
||||
# reuse
|
||||
build==1.2.1
|
||||
# via pip-tools
|
||||
build123d==0.4.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
cachetools==5.3.3
|
||||
# via tox
|
||||
cadquery==2.4.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
cadquery-ocp==7.7.2
|
||||
# via
|
||||
# build123d
|
||||
# cadquery
|
||||
# ocpsvg
|
||||
casadi==3.6.5
|
||||
# via cadquery
|
||||
certifi==2024.6.2
|
||||
# via requests
|
||||
cffi==1.16.0
|
||||
# via cryptography
|
||||
chardet==5.2.0
|
||||
# via
|
||||
# binaryornot
|
||||
# python-debian
|
||||
# spyder
|
||||
# tox
|
||||
charset-normalizer==3.3.2
|
||||
# via requests
|
||||
click==8.1.7
|
||||
# via
|
||||
# black
|
||||
# cookiecutter
|
||||
# pip-tools
|
||||
cloudpickle==3.0.0
|
||||
# via
|
||||
# spyder
|
||||
# spyder-kernels
|
||||
colorama==0.4.6
|
||||
# via tox
|
||||
comm==0.2.2
|
||||
# via ipykernel
|
||||
cookiecutter==2.6.0
|
||||
# via spyder
|
||||
coverage[toml]==7.5.4
|
||||
# via pytest-cov
|
||||
cq-editor @ git+https://github.com/jdegenstein/jmwright-CQ-Editor
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
cryptography==42.0.8
|
||||
# via secretstorage
|
||||
debugpy==1.8.2
|
||||
# via ipykernel
|
||||
decorator==5.1.1
|
||||
# via ipython
|
||||
defusedxml==0.7.1
|
||||
# via nbconvert
|
||||
diff-match-patch==20230430
|
||||
# via
|
||||
# spyder
|
||||
# three-merge
|
||||
dill==0.3.8
|
||||
# via pylint
|
||||
distlib==0.3.8
|
||||
# via virtualenv
|
||||
docstring-to-markdown==0.15
|
||||
# via python-lsp-server
|
||||
docutils==0.21.2
|
||||
# via
|
||||
# readme-renderer
|
||||
# sphinx
|
||||
executing==2.0.1
|
||||
# via stack-data
|
||||
ezdxf==1.3.1
|
||||
# via
|
||||
# build123d
|
||||
# cadquery
|
||||
fastjsonschema==2.20.0
|
||||
# via nbformat
|
||||
filelock==3.15.4
|
||||
# via
|
||||
# tox
|
||||
# virtualenv
|
||||
flake8==7.0.0
|
||||
# via
|
||||
# buildable-stick-system (pyproject.toml)
|
||||
# flake8-builtins
|
||||
# flake8-docstrings
|
||||
# flake8-executable
|
||||
# flake8-isort
|
||||
# flake8-mutable
|
||||
# flake8-pyproject
|
||||
# python-lsp-server
|
||||
flake8-blind-except==0.2.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-builtins==2.5.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-docstrings==1.7.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-executable==2.1.3
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-fixme==1.1.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-isort==6.1.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-logging-format==2024.24.12
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-mutable==1.2.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-pyproject==1.2.3
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
fonttools==4.53.0
|
||||
# via ezdxf
|
||||
idna==3.7
|
||||
# via requests
|
||||
imagesize==1.4.1
|
||||
# via sphinx
|
||||
importlib-metadata==8.0.0
|
||||
# via
|
||||
# keyring
|
||||
# twine
|
||||
# yapf
|
||||
inflection==0.5.1
|
||||
# via qstylizer
|
||||
iniconfig==2.0.0
|
||||
# via pytest
|
||||
intervaltree==3.1.0
|
||||
# via spyder
|
||||
ipykernel==6.29.5
|
||||
# via
|
||||
# qtconsole
|
||||
# spyder-kernels
|
||||
ipython==8.26.0
|
||||
# via
|
||||
# build123d
|
||||
# cq-editor
|
||||
# ipykernel
|
||||
# spyder
|
||||
# spyder-kernels
|
||||
isort==5.13.2
|
||||
# via
|
||||
# flake8-isort
|
||||
# pylint
|
||||
jaraco-classes==3.4.0
|
||||
# via keyring
|
||||
jaraco-context==5.3.0
|
||||
# via keyring
|
||||
jaraco-functools==4.0.1
|
||||
# via keyring
|
||||
jedi==0.19.1
|
||||
# via
|
||||
# ipython
|
||||
# python-lsp-server
|
||||
# spyder
|
||||
jeepney==0.8.0
|
||||
# via
|
||||
# keyring
|
||||
# secretstorage
|
||||
jellyfish==1.0.4
|
||||
# via spyder
|
||||
jinja2==3.1.4
|
||||
# via
|
||||
# cookiecutter
|
||||
# nbconvert
|
||||
# reuse
|
||||
# sphinx
|
||||
jsonschema==4.22.0
|
||||
# via
|
||||
# nbformat
|
||||
# spyder
|
||||
jsonschema-specifications==2023.12.1
|
||||
# via jsonschema
|
||||
jupyter-client==8.6.2
|
||||
# via
|
||||
# ipykernel
|
||||
# nbclient
|
||||
# qtconsole
|
||||
# spyder-kernels
|
||||
jupyter-core==5.7.2
|
||||
# via
|
||||
# ipykernel
|
||||
# jupyter-client
|
||||
# nbclient
|
||||
# nbconvert
|
||||
# nbformat
|
||||
# qtconsole
|
||||
jupyterlab-pygments==0.3.0
|
||||
# via nbconvert
|
||||
keyring==25.2.1
|
||||
# via
|
||||
# spyder
|
||||
# twine
|
||||
license-expression==30.3.0
|
||||
# via reuse
|
||||
logbook==1.7.0.post0
|
||||
# via cq-editor
|
||||
markdown-it-py==3.0.0
|
||||
# via rich
|
||||
markupsafe==2.1.5
|
||||
# via
|
||||
# jinja2
|
||||
# nbconvert
|
||||
matplotlib-inline==0.1.7
|
||||
# via
|
||||
# ipykernel
|
||||
# ipython
|
||||
mccabe==0.7.0
|
||||
# via
|
||||
# flake8
|
||||
# pylint
|
||||
# python-lsp-server
|
||||
mdurl==0.1.2
|
||||
# via markdown-it-py
|
||||
mistune==3.0.2
|
||||
# via nbconvert
|
||||
more-itertools==10.3.0
|
||||
# via
|
||||
# jaraco-classes
|
||||
# jaraco-functools
|
||||
multimethod==1.9.1
|
||||
# via cadquery
|
||||
mypy==1.10.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
mypy-extensions==1.0.0
|
||||
# via
|
||||
# black
|
||||
# mypy
|
||||
nbclient==0.10.0
|
||||
# via nbconvert
|
||||
nbconvert==7.16.4
|
||||
# via spyder
|
||||
nbformat==5.10.4
|
||||
# via
|
||||
# nbclient
|
||||
# nbconvert
|
||||
nest-asyncio==1.6.0
|
||||
# via ipykernel
|
||||
nh3==0.2.17
|
||||
# via readme-renderer
|
||||
nlopt==2.7.1
|
||||
# via cadquery
|
||||
nptyping==2.0.1
|
||||
# via cadquery
|
||||
numpy==1.26.4
|
||||
# via
|
||||
# build123d
|
||||
# casadi
|
||||
# ezdxf
|
||||
# nlopt
|
||||
# nptyping
|
||||
# numpy-stl
|
||||
# pyqtgraph
|
||||
# scipy
|
||||
# svgpathtools
|
||||
numpy-stl==3.1.1
|
||||
# via build123d
|
||||
numpydoc==1.7.0
|
||||
# via spyder
|
||||
ocpsvg==0.2.1
|
||||
# via build123d
|
||||
packaging==24.1
|
||||
# via
|
||||
# black
|
||||
# build
|
||||
# ipykernel
|
||||
# nbconvert
|
||||
# pyproject-api
|
||||
# pytest
|
||||
# pytoolconfig
|
||||
# qtconsole
|
||||
# qtpy
|
||||
# setuptools-scm
|
||||
# sphinx
|
||||
# tox
|
||||
pandocfilters==1.5.1
|
||||
# via nbconvert
|
||||
parso==0.8.4
|
||||
# via
|
||||
# jedi
|
||||
# spyder
|
||||
path==16.14.0
|
||||
# via
|
||||
# cadquery
|
||||
# cq-editor
|
||||
pathspec==0.12.1
|
||||
# via black
|
||||
pbr==6.0.0
|
||||
# via stevedore
|
||||
pexpect==4.9.0
|
||||
# via
|
||||
# ipython
|
||||
# spyder
|
||||
pickleshare==0.7.5
|
||||
# via spyder
|
||||
pip-tools==7.4.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
pkginfo==1.10.0
|
||||
# via twine
|
||||
platformdirs==4.2.2
|
||||
# via
|
||||
# black
|
||||
# jupyter-core
|
||||
# pylint
|
||||
# pytoolconfig
|
||||
# tox
|
||||
# virtualenv
|
||||
# yapf
|
||||
pluggy==1.5.0
|
||||
# via
|
||||
# pytest
|
||||
# python-lsp-server
|
||||
# tox
|
||||
prompt-toolkit==3.0.47
|
||||
# via ipython
|
||||
psutil==6.0.0
|
||||
# via
|
||||
# ipykernel
|
||||
# spyder
|
||||
ptyprocess==0.7.0
|
||||
# via pexpect
|
||||
pure-eval==0.2.2
|
||||
# via stack-data
|
||||
py-lib3mf==2.3.1
|
||||
# via build123d
|
||||
pycodestyle==2.11.1
|
||||
# via
|
||||
# autopep8
|
||||
# flake8
|
||||
# python-lsp-server
|
||||
pycparser==2.22
|
||||
# via cffi
|
||||
pydocstyle==6.3.0
|
||||
# via
|
||||
# flake8-docstrings
|
||||
# python-lsp-server
|
||||
pyflakes==3.2.0
|
||||
# via
|
||||
# flake8
|
||||
# python-lsp-server
|
||||
pygments==2.18.0
|
||||
# via
|
||||
# ipython
|
||||
# nbconvert
|
||||
# qtconsole
|
||||
# readme-renderer
|
||||
# rich
|
||||
# sphinx
|
||||
# spyder
|
||||
pylint==3.2.5
|
||||
# via
|
||||
# python-lsp-server
|
||||
# spyder
|
||||
pylint-venv==3.0.3
|
||||
# via spyder
|
||||
pyls-spyder==0.4.0
|
||||
# via spyder
|
||||
pyparsing==3.1.2
|
||||
# via ezdxf
|
||||
pyproject-api==1.7.1
|
||||
# via tox
|
||||
pyproject-hooks==1.1.0
|
||||
# via
|
||||
# build
|
||||
# pip-tools
|
||||
pyqt5==5.15.10
|
||||
# via
|
||||
# cq-editor
|
||||
# pyqtwebengine
|
||||
# spyder
|
||||
pyqt5-qt5==5.15.14
|
||||
# via pyqt5
|
||||
pyqt5-sip==12.13.0
|
||||
# via
|
||||
# pyqt5
|
||||
# pyqtwebengine
|
||||
pyqtgraph==0.13.7
|
||||
# via cq-editor
|
||||
pyqtwebengine==5.15.6
|
||||
# via spyder
|
||||
pyqtwebengine-qt5==5.15.14
|
||||
# via pyqtwebengine
|
||||
pytest==8.2.2
|
||||
# via
|
||||
# buildable-stick-system (pyproject.toml)
|
||||
# pytest-asyncio
|
||||
# pytest-cov
|
||||
pytest-asyncio==0.23.7
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
pytest-cov==5.0.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
python-dateutil==2.9.0.post0
|
||||
# via
|
||||
# arrow
|
||||
# jupyter-client
|
||||
python-debian==0.1.49
|
||||
# via reuse
|
||||
python-lsp-black==2.0.0
|
||||
# via spyder
|
||||
python-lsp-jsonrpc==1.1.2
|
||||
# via python-lsp-server
|
||||
python-lsp-server[all]==1.11.0
|
||||
# via
|
||||
# pyls-spyder
|
||||
# python-lsp-black
|
||||
# spyder
|
||||
python-slugify==8.0.4
|
||||
# via cookiecutter
|
||||
python-utils==3.8.2
|
||||
# via numpy-stl
|
||||
pytoolconfig[global]==1.3.1
|
||||
# via rope
|
||||
pyxdg==0.28
|
||||
# via spyder
|
||||
pyyaml==6.0.1
|
||||
# via
|
||||
# bandit
|
||||
# cookiecutter
|
||||
pyzmq==26.0.3
|
||||
# via
|
||||
# ipykernel
|
||||
# jupyter-client
|
||||
# qtconsole
|
||||
# spyder
|
||||
# spyder-kernels
|
||||
qdarkstyle==3.2.3
|
||||
# via spyder
|
||||
qstylizer==0.2.3
|
||||
# via spyder
|
||||
qtawesome==1.3.1
|
||||
# via spyder
|
||||
qtconsole==5.5.2
|
||||
# via spyder
|
||||
qtpy==2.4.1
|
||||
# via
|
||||
# qdarkstyle
|
||||
# qtawesome
|
||||
# qtconsole
|
||||
# spyder
|
||||
readme-renderer==43.0
|
||||
# via twine
|
||||
referencing==0.35.1
|
||||
# via
|
||||
# jsonschema
|
||||
# jsonschema-specifications
|
||||
requests==2.32.3
|
||||
# via
|
||||
# cookiecutter
|
||||
# cq-editor
|
||||
# requests-toolbelt
|
||||
# sphinx
|
||||
# twine
|
||||
requests-toolbelt==1.0.0
|
||||
# via twine
|
||||
reuse==3.0.2
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
rfc3986==2.0.0
|
||||
# via twine
|
||||
rich==13.7.1
|
||||
# via
|
||||
# bandit
|
||||
# cookiecutter
|
||||
# twine
|
||||
rope==1.13.0
|
||||
# via python-lsp-server
|
||||
rpds-py==0.18.1
|
||||
# via
|
||||
# jsonschema
|
||||
# referencing
|
||||
rtree==1.2.0
|
||||
# via spyder
|
||||
scipy==1.14.0
|
||||
# via svgpathtools
|
||||
secretstorage==3.3.3
|
||||
# via keyring
|
||||
setuptools-scm==8.1.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
six==1.16.0
|
||||
# via
|
||||
# anytree
|
||||
# asttokens
|
||||
# bleach
|
||||
# python-dateutil
|
||||
snowballstemmer==2.2.0
|
||||
# via
|
||||
# pydocstyle
|
||||
# sphinx
|
||||
sortedcontainers==2.4.0
|
||||
# via intervaltree
|
||||
soupsieve==2.5
|
||||
# via beautifulsoup4
|
||||
sphinx==7.3.7
|
||||
# via
|
||||
# numpydoc
|
||||
# spyder
|
||||
sphinxcontrib-applehelp==1.0.8
|
||||
# via sphinx
|
||||
sphinxcontrib-devhelp==1.0.6
|
||||
# via sphinx
|
||||
sphinxcontrib-htmlhelp==2.0.5
|
||||
# via sphinx
|
||||
sphinxcontrib-jsmath==1.0.1
|
||||
# via sphinx
|
||||
sphinxcontrib-qthelp==1.0.7
|
||||
# via sphinx
|
||||
sphinxcontrib-serializinghtml==1.1.10
|
||||
# via sphinx
|
||||
spyder==5.5.5
|
||||
# via cq-editor
|
||||
spyder-kernels==2.5.2
|
||||
# via spyder
|
||||
stack-data==0.6.3
|
||||
# via ipython
|
||||
stevedore==5.2.0
|
||||
# via bandit
|
||||
svgelements==1.9.6
|
||||
# via ocpsvg
|
||||
svgpathtools==1.6.1
|
||||
# via
|
||||
# build123d
|
||||
# ocpsvg
|
||||
svgwrite==1.4.3
|
||||
# via svgpathtools
|
||||
tabulate==0.9.0
|
||||
# via numpydoc
|
||||
text-unidecode==1.3
|
||||
# via python-slugify
|
||||
textdistance==4.6.2
|
||||
# via spyder
|
||||
three-merge==0.1.1
|
||||
# via spyder
|
||||
tinycss2==1.3.0
|
||||
# via
|
||||
# nbconvert
|
||||
# qstylizer
|
||||
tomli==2.0.1
|
||||
# via yapf
|
||||
tomlkit==0.12.5
|
||||
# via pylint
|
||||
tornado==6.4.1
|
||||
# via
|
||||
# ipykernel
|
||||
# jupyter-client
|
||||
tox==4.15.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
traitlets==5.14.3
|
||||
# via
|
||||
# comm
|
||||
# ipykernel
|
||||
# ipython
|
||||
# jupyter-client
|
||||
# jupyter-core
|
||||
# matplotlib-inline
|
||||
# nbclient
|
||||
# nbconvert
|
||||
# nbformat
|
||||
# qtconsole
|
||||
trianglesolver==1.2
|
||||
# via build123d
|
||||
twine==5.1.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
types-python-dateutil==2.9.0.20240316
|
||||
# via arrow
|
||||
typing-extensions==4.12.2
|
||||
# via
|
||||
# build123d
|
||||
# ezdxf
|
||||
# ipython
|
||||
# mypy
|
||||
# python-utils
|
||||
typish==1.9.3
|
||||
# via cadquery
|
||||
ujson==5.10.0
|
||||
# via
|
||||
# python-lsp-jsonrpc
|
||||
# python-lsp-server
|
||||
urllib3==2.2.2
|
||||
# via
|
||||
# requests
|
||||
# twine
|
||||
virtualenv==20.26.3
|
||||
# via tox
|
||||
watchdog==4.0.1
|
||||
# via spyder
|
||||
wcwidth==0.2.13
|
||||
# via prompt-toolkit
|
||||
webencodings==0.5.1
|
||||
# via
|
||||
# bleach
|
||||
# tinycss2
|
||||
whatthepatch==1.0.5
|
||||
# via python-lsp-server
|
||||
wheel==0.43.0
|
||||
# via pip-tools
|
||||
wurlitzer==3.1.1
|
||||
# via spyder-kernels
|
||||
yapf==0.40.2
|
||||
# via python-lsp-server
|
||||
zipp==3.19.2
|
||||
# via importlib-metadata
|
||||
|
||||
# The following packages are considered to be unsafe in a requirements file:
|
||||
# pip
|
||||
# setuptools
|
||||
295
requirements/requirements-dev.txt
Normal file
295
requirements/requirements-dev.txt
Normal file
@@ -0,0 +1,295 @@
|
||||
#
|
||||
# This file is autogenerated by pip-compile with Python 3.11
|
||||
# by the following command:
|
||||
#
|
||||
# pip-compile --extra=dev --output-file=requirements/requirements-dev.txt
|
||||
#
|
||||
anytree==2.12.1
|
||||
# via build123d
|
||||
asttokens==2.4.1
|
||||
# via stack-data
|
||||
backports-tarfile==1.2.0
|
||||
# via jaraco-context
|
||||
bandit==1.7.9
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
binaryornot==0.4.4
|
||||
# via reuse
|
||||
boolean-py==4.0
|
||||
# via
|
||||
# license-expression
|
||||
# reuse
|
||||
build==1.2.1
|
||||
# via pip-tools
|
||||
build123d==0.5.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
cachetools==5.3.3
|
||||
# via tox
|
||||
cadquery-ocp==7.7.2
|
||||
# via
|
||||
# build123d
|
||||
# ocpsvg
|
||||
certifi==2024.6.2
|
||||
# via requests
|
||||
cffi==1.16.0
|
||||
# via cryptography
|
||||
chardet==5.2.0
|
||||
# via
|
||||
# binaryornot
|
||||
# python-debian
|
||||
# tox
|
||||
charset-normalizer==3.3.2
|
||||
# via requests
|
||||
click==8.1.7
|
||||
# via pip-tools
|
||||
colorama==0.4.6
|
||||
# via tox
|
||||
coverage[toml]==7.5.4
|
||||
# via pytest-cov
|
||||
cryptography==42.0.8
|
||||
# via secretstorage
|
||||
decorator==5.1.1
|
||||
# via ipython
|
||||
distlib==0.3.8
|
||||
# via virtualenv
|
||||
docutils==0.21.2
|
||||
# via readme-renderer
|
||||
executing==2.0.1
|
||||
# via stack-data
|
||||
ezdxf==1.3.1
|
||||
# via build123d
|
||||
filelock==3.15.4
|
||||
# via
|
||||
# tox
|
||||
# virtualenv
|
||||
flake8==7.1.0
|
||||
# via
|
||||
# buildable-stick-system (pyproject.toml)
|
||||
# flake8-builtins
|
||||
# flake8-docstrings
|
||||
# flake8-executable
|
||||
# flake8-isort
|
||||
# flake8-mutable
|
||||
# flake8-pyproject
|
||||
flake8-blind-except==0.2.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-builtins==2.5.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-docstrings==1.7.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-executable==2.1.3
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-fixme==1.1.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-isort==6.1.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-logging-format==2024.24.12
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-mutable==1.2.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
flake8-pyproject==1.2.3
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
fonttools==4.53.0
|
||||
# via ezdxf
|
||||
idna==3.7
|
||||
# via requests
|
||||
importlib-metadata==8.0.0
|
||||
# via
|
||||
# keyring
|
||||
# twine
|
||||
iniconfig==2.0.0
|
||||
# via pytest
|
||||
ipython==8.26.0
|
||||
# via build123d
|
||||
isort==5.13.2
|
||||
# via flake8-isort
|
||||
jaraco-classes==3.4.0
|
||||
# via keyring
|
||||
jaraco-context==5.3.0
|
||||
# via keyring
|
||||
jaraco-functools==4.0.1
|
||||
# via keyring
|
||||
jedi==0.19.1
|
||||
# via ipython
|
||||
jeepney==0.8.0
|
||||
# via
|
||||
# keyring
|
||||
# secretstorage
|
||||
jinja2==3.1.4
|
||||
# via reuse
|
||||
keyring==25.2.1
|
||||
# via twine
|
||||
license-expression==30.3.0
|
||||
# via reuse
|
||||
markdown-it-py==3.0.0
|
||||
# via rich
|
||||
markupsafe==2.1.5
|
||||
# via jinja2
|
||||
matplotlib-inline==0.1.7
|
||||
# via ipython
|
||||
mccabe==0.7.0
|
||||
# via flake8
|
||||
mdurl==0.1.2
|
||||
# via markdown-it-py
|
||||
more-itertools==10.3.0
|
||||
# via
|
||||
# jaraco-classes
|
||||
# jaraco-functools
|
||||
mypy==1.10.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
mypy-extensions==1.0.0
|
||||
# via mypy
|
||||
nh3==0.2.17
|
||||
# via readme-renderer
|
||||
numpy==1.26.4
|
||||
# via
|
||||
# build123d
|
||||
# ezdxf
|
||||
# numpy-stl
|
||||
# scipy
|
||||
# svgpathtools
|
||||
numpy-stl==3.1.1
|
||||
# via build123d
|
||||
ocpsvg==0.2.1
|
||||
# via build123d
|
||||
packaging==24.1
|
||||
# via
|
||||
# build
|
||||
# pyproject-api
|
||||
# pytest
|
||||
# setuptools-scm
|
||||
# tox
|
||||
parso==0.8.4
|
||||
# via jedi
|
||||
pbr==6.0.0
|
||||
# via stevedore
|
||||
pexpect==4.9.0
|
||||
# via ipython
|
||||
pip-tools==7.4.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
pkginfo==1.10.0
|
||||
# via twine
|
||||
platformdirs==4.2.2
|
||||
# via
|
||||
# tox
|
||||
# virtualenv
|
||||
pluggy==1.5.0
|
||||
# via
|
||||
# pytest
|
||||
# tox
|
||||
prompt-toolkit==3.0.47
|
||||
# via ipython
|
||||
ptyprocess==0.7.0
|
||||
# via pexpect
|
||||
pure-eval==0.2.2
|
||||
# via stack-data
|
||||
py-lib3mf==2.3.1
|
||||
# via build123d
|
||||
pycodestyle==2.12.0
|
||||
# via flake8
|
||||
pycparser==2.22
|
||||
# via cffi
|
||||
pydocstyle==6.3.0
|
||||
# via flake8-docstrings
|
||||
pyflakes==3.2.0
|
||||
# via flake8
|
||||
pygments==2.18.0
|
||||
# via
|
||||
# ipython
|
||||
# readme-renderer
|
||||
# rich
|
||||
pyparsing==3.1.2
|
||||
# via ezdxf
|
||||
pyproject-api==1.7.1
|
||||
# via tox
|
||||
pyproject-hooks==1.1.0
|
||||
# via
|
||||
# build
|
||||
# pip-tools
|
||||
pytest==8.2.2
|
||||
# via
|
||||
# buildable-stick-system (pyproject.toml)
|
||||
# pytest-asyncio
|
||||
# pytest-cov
|
||||
pytest-asyncio==0.23.7
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
pytest-cov==5.0.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
python-debian==0.1.49
|
||||
# via reuse
|
||||
python-utils==3.8.2
|
||||
# via numpy-stl
|
||||
pyyaml==6.0.1
|
||||
# via bandit
|
||||
readme-renderer==43.0
|
||||
# via twine
|
||||
requests==2.32.3
|
||||
# via
|
||||
# requests-toolbelt
|
||||
# twine
|
||||
requests-toolbelt==1.0.0
|
||||
# via twine
|
||||
reuse==3.0.2
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
rfc3986==2.0.0
|
||||
# via twine
|
||||
rich==13.7.1
|
||||
# via
|
||||
# bandit
|
||||
# twine
|
||||
scipy==1.14.0
|
||||
# via svgpathtools
|
||||
secretstorage==3.3.3
|
||||
# via keyring
|
||||
setuptools-scm==8.1.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
six==1.16.0
|
||||
# via
|
||||
# anytree
|
||||
# asttokens
|
||||
snowballstemmer==2.2.0
|
||||
# via pydocstyle
|
||||
stack-data==0.6.3
|
||||
# via ipython
|
||||
stevedore==5.2.0
|
||||
# via bandit
|
||||
svgelements==1.9.6
|
||||
# via ocpsvg
|
||||
svgpathtools==1.6.1
|
||||
# via
|
||||
# build123d
|
||||
# ocpsvg
|
||||
svgwrite==1.4.3
|
||||
# via svgpathtools
|
||||
tox==4.15.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
traitlets==5.14.3
|
||||
# via
|
||||
# ipython
|
||||
# matplotlib-inline
|
||||
trianglesolver==1.2
|
||||
# via build123d
|
||||
twine==5.1.1
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
typing-extensions==4.12.2
|
||||
# via
|
||||
# build123d
|
||||
# ezdxf
|
||||
# ipython
|
||||
# mypy
|
||||
# python-utils
|
||||
urllib3==2.2.2
|
||||
# via
|
||||
# requests
|
||||
# twine
|
||||
virtualenv==20.26.3
|
||||
# via tox
|
||||
wcwidth==0.2.13
|
||||
# via prompt-toolkit
|
||||
wheel==0.43.0
|
||||
# via pip-tools
|
||||
zipp==3.19.2
|
||||
# via importlib-metadata
|
||||
|
||||
# The following packages are considered to be unsafe in a requirements file:
|
||||
# pip
|
||||
# setuptools
|
||||
508
requirements/requirements-gui.txt
Normal file
508
requirements/requirements-gui.txt
Normal file
@@ -0,0 +1,508 @@
|
||||
#
|
||||
# This file is autogenerated by pip-compile with Python 3.11
|
||||
# by the following command:
|
||||
#
|
||||
# pip-compile --extra=gui --output-file=requirements/requirements-gui.txt
|
||||
#
|
||||
alabaster==0.7.16
|
||||
# via sphinx
|
||||
anytree==2.12.1
|
||||
# via build123d
|
||||
arrow==1.3.0
|
||||
# via cookiecutter
|
||||
astroid==3.2.2
|
||||
# via pylint
|
||||
asttokens==2.4.1
|
||||
# via stack-data
|
||||
atomicwrites==1.4.1
|
||||
# via spyder
|
||||
attrs==23.2.0
|
||||
# via
|
||||
# jsonschema
|
||||
# referencing
|
||||
autopep8==2.0.4
|
||||
# via python-lsp-server
|
||||
babel==2.15.0
|
||||
# via sphinx
|
||||
backports-tarfile==1.2.0
|
||||
# via jaraco-context
|
||||
beautifulsoup4==4.12.3
|
||||
# via nbconvert
|
||||
binaryornot==0.4.4
|
||||
# via cookiecutter
|
||||
black==24.4.2
|
||||
# via python-lsp-black
|
||||
bleach==6.1.0
|
||||
# via nbconvert
|
||||
build123d==0.5.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
cadquery==2.4.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
cadquery-ocp==7.7.2
|
||||
# via
|
||||
# build123d
|
||||
# cadquery
|
||||
# ocpsvg
|
||||
casadi==3.6.5
|
||||
# via cadquery
|
||||
certifi==2024.6.2
|
||||
# via requests
|
||||
cffi==1.16.0
|
||||
# via cryptography
|
||||
chardet==5.2.0
|
||||
# via
|
||||
# binaryornot
|
||||
# spyder
|
||||
charset-normalizer==3.3.2
|
||||
# via requests
|
||||
click==8.1.7
|
||||
# via
|
||||
# black
|
||||
# cookiecutter
|
||||
cloudpickle==3.0.0
|
||||
# via
|
||||
# spyder
|
||||
# spyder-kernels
|
||||
comm==0.2.2
|
||||
# via ipykernel
|
||||
cookiecutter==2.6.0
|
||||
# via spyder
|
||||
cq-editor @ git+https://github.com/jdegenstein/jmwright-CQ-Editor
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
cryptography==42.0.8
|
||||
# via secretstorage
|
||||
debugpy==1.8.2
|
||||
# via ipykernel
|
||||
decorator==5.1.1
|
||||
# via ipython
|
||||
defusedxml==0.7.1
|
||||
# via nbconvert
|
||||
diff-match-patch==20230430
|
||||
# via
|
||||
# spyder
|
||||
# three-merge
|
||||
dill==0.3.8
|
||||
# via pylint
|
||||
docstring-to-markdown==0.15
|
||||
# via python-lsp-server
|
||||
docutils==0.21.2
|
||||
# via sphinx
|
||||
executing==2.0.1
|
||||
# via stack-data
|
||||
ezdxf==1.3.1
|
||||
# via
|
||||
# build123d
|
||||
# cadquery
|
||||
fastjsonschema==2.20.0
|
||||
# via nbformat
|
||||
flake8==7.0.0
|
||||
# via python-lsp-server
|
||||
fonttools==4.53.0
|
||||
# via ezdxf
|
||||
idna==3.7
|
||||
# via requests
|
||||
imagesize==1.4.1
|
||||
# via sphinx
|
||||
importlib-metadata==8.0.0
|
||||
# via
|
||||
# keyring
|
||||
# yapf
|
||||
inflection==0.5.1
|
||||
# via qstylizer
|
||||
intervaltree==3.1.0
|
||||
# via spyder
|
||||
ipykernel==6.29.5
|
||||
# via
|
||||
# qtconsole
|
||||
# spyder-kernels
|
||||
ipython==8.26.0
|
||||
# via
|
||||
# build123d
|
||||
# cq-editor
|
||||
# ipykernel
|
||||
# spyder
|
||||
# spyder-kernels
|
||||
isort==5.13.2
|
||||
# via pylint
|
||||
jaraco-classes==3.4.0
|
||||
# via keyring
|
||||
jaraco-context==5.3.0
|
||||
# via keyring
|
||||
jaraco-functools==4.0.1
|
||||
# via keyring
|
||||
jedi==0.19.1
|
||||
# via
|
||||
# ipython
|
||||
# python-lsp-server
|
||||
# spyder
|
||||
jeepney==0.8.0
|
||||
# via
|
||||
# keyring
|
||||
# secretstorage
|
||||
jellyfish==1.0.4
|
||||
# via spyder
|
||||
jinja2==3.1.4
|
||||
# via
|
||||
# cookiecutter
|
||||
# nbconvert
|
||||
# sphinx
|
||||
jsonschema==4.22.0
|
||||
# via
|
||||
# nbformat
|
||||
# spyder
|
||||
jsonschema-specifications==2023.12.1
|
||||
# via jsonschema
|
||||
jupyter-client==8.6.2
|
||||
# via
|
||||
# ipykernel
|
||||
# nbclient
|
||||
# qtconsole
|
||||
# spyder-kernels
|
||||
jupyter-core==5.7.2
|
||||
# via
|
||||
# ipykernel
|
||||
# jupyter-client
|
||||
# nbclient
|
||||
# nbconvert
|
||||
# nbformat
|
||||
# qtconsole
|
||||
jupyterlab-pygments==0.3.0
|
||||
# via nbconvert
|
||||
keyring==25.2.1
|
||||
# via spyder
|
||||
logbook==1.7.0.post0
|
||||
# via cq-editor
|
||||
markdown-it-py==3.0.0
|
||||
# via rich
|
||||
markupsafe==2.1.5
|
||||
# via
|
||||
# jinja2
|
||||
# nbconvert
|
||||
matplotlib-inline==0.1.7
|
||||
# via
|
||||
# ipykernel
|
||||
# ipython
|
||||
mccabe==0.7.0
|
||||
# via
|
||||
# flake8
|
||||
# pylint
|
||||
# python-lsp-server
|
||||
mdurl==0.1.2
|
||||
# via markdown-it-py
|
||||
mistune==3.0.2
|
||||
# via nbconvert
|
||||
more-itertools==10.3.0
|
||||
# via
|
||||
# jaraco-classes
|
||||
# jaraco-functools
|
||||
multimethod==1.9.1
|
||||
# via cadquery
|
||||
mypy-extensions==1.0.0
|
||||
# via black
|
||||
nbclient==0.10.0
|
||||
# via nbconvert
|
||||
nbconvert==7.16.4
|
||||
# via spyder
|
||||
nbformat==5.10.4
|
||||
# via
|
||||
# nbclient
|
||||
# nbconvert
|
||||
nest-asyncio==1.6.0
|
||||
# via ipykernel
|
||||
nlopt==2.7.1
|
||||
# via cadquery
|
||||
nptyping==2.0.1
|
||||
# via cadquery
|
||||
numpy==1.26.4
|
||||
# via
|
||||
# build123d
|
||||
# casadi
|
||||
# ezdxf
|
||||
# nlopt
|
||||
# nptyping
|
||||
# numpy-stl
|
||||
# pyqtgraph
|
||||
# scipy
|
||||
# svgpathtools
|
||||
numpy-stl==3.1.1
|
||||
# via build123d
|
||||
numpydoc==1.7.0
|
||||
# via spyder
|
||||
ocpsvg==0.2.1
|
||||
# via build123d
|
||||
packaging==24.1
|
||||
# via
|
||||
# black
|
||||
# ipykernel
|
||||
# nbconvert
|
||||
# pytoolconfig
|
||||
# qtconsole
|
||||
# qtpy
|
||||
# sphinx
|
||||
pandocfilters==1.5.1
|
||||
# via nbconvert
|
||||
parso==0.8.4
|
||||
# via
|
||||
# jedi
|
||||
# spyder
|
||||
path==16.14.0
|
||||
# via
|
||||
# cadquery
|
||||
# cq-editor
|
||||
pathspec==0.12.1
|
||||
# via black
|
||||
pexpect==4.9.0
|
||||
# via
|
||||
# ipython
|
||||
# spyder
|
||||
pickleshare==0.7.5
|
||||
# via spyder
|
||||
platformdirs==4.2.2
|
||||
# via
|
||||
# black
|
||||
# jupyter-core
|
||||
# pylint
|
||||
# pytoolconfig
|
||||
# yapf
|
||||
pluggy==1.5.0
|
||||
# via python-lsp-server
|
||||
prompt-toolkit==3.0.47
|
||||
# via ipython
|
||||
psutil==6.0.0
|
||||
# via
|
||||
# ipykernel
|
||||
# spyder
|
||||
ptyprocess==0.7.0
|
||||
# via pexpect
|
||||
pure-eval==0.2.2
|
||||
# via stack-data
|
||||
py-lib3mf==2.3.1
|
||||
# via build123d
|
||||
pycodestyle==2.11.1
|
||||
# via
|
||||
# autopep8
|
||||
# flake8
|
||||
# python-lsp-server
|
||||
pycparser==2.22
|
||||
# via cffi
|
||||
pydocstyle==6.3.0
|
||||
# via python-lsp-server
|
||||
pyflakes==3.2.0
|
||||
# via
|
||||
# flake8
|
||||
# python-lsp-server
|
||||
pygments==2.18.0
|
||||
# via
|
||||
# ipython
|
||||
# nbconvert
|
||||
# qtconsole
|
||||
# rich
|
||||
# sphinx
|
||||
# spyder
|
||||
pylint==3.2.5
|
||||
# via
|
||||
# python-lsp-server
|
||||
# spyder
|
||||
pylint-venv==3.0.3
|
||||
# via spyder
|
||||
pyls-spyder==0.4.0
|
||||
# via spyder
|
||||
pyparsing==3.1.2
|
||||
# via ezdxf
|
||||
pyqt5==5.15.10
|
||||
# via
|
||||
# cq-editor
|
||||
# pyqtwebengine
|
||||
# spyder
|
||||
pyqt5-qt5==5.15.14
|
||||
# via pyqt5
|
||||
pyqt5-sip==12.13.0
|
||||
# via
|
||||
# pyqt5
|
||||
# pyqtwebengine
|
||||
pyqtgraph==0.13.7
|
||||
# via cq-editor
|
||||
pyqtwebengine==5.15.6
|
||||
# via spyder
|
||||
pyqtwebengine-qt5==5.15.14
|
||||
# via pyqtwebengine
|
||||
python-dateutil==2.9.0.post0
|
||||
# via
|
||||
# arrow
|
||||
# jupyter-client
|
||||
python-lsp-black==2.0.0
|
||||
# via spyder
|
||||
python-lsp-jsonrpc==1.1.2
|
||||
# via python-lsp-server
|
||||
python-lsp-server[all]==1.11.0
|
||||
# via
|
||||
# pyls-spyder
|
||||
# python-lsp-black
|
||||
# spyder
|
||||
python-slugify==8.0.4
|
||||
# via cookiecutter
|
||||
python-utils==3.8.2
|
||||
# via numpy-stl
|
||||
pytoolconfig[global]==1.3.1
|
||||
# via rope
|
||||
pyxdg==0.28
|
||||
# via spyder
|
||||
pyyaml==6.0.1
|
||||
# via cookiecutter
|
||||
pyzmq==26.0.3
|
||||
# via
|
||||
# ipykernel
|
||||
# jupyter-client
|
||||
# qtconsole
|
||||
# spyder
|
||||
# spyder-kernels
|
||||
qdarkstyle==3.2.3
|
||||
# via spyder
|
||||
qstylizer==0.2.3
|
||||
# via spyder
|
||||
qtawesome==1.3.1
|
||||
# via spyder
|
||||
qtconsole==5.5.2
|
||||
# via spyder
|
||||
qtpy==2.4.1
|
||||
# via
|
||||
# qdarkstyle
|
||||
# qtawesome
|
||||
# qtconsole
|
||||
# spyder
|
||||
referencing==0.35.1
|
||||
# via
|
||||
# jsonschema
|
||||
# jsonschema-specifications
|
||||
requests==2.32.3
|
||||
# via
|
||||
# cookiecutter
|
||||
# cq-editor
|
||||
# sphinx
|
||||
rich==13.7.1
|
||||
# via cookiecutter
|
||||
rope==1.13.0
|
||||
# via python-lsp-server
|
||||
rpds-py==0.18.1
|
||||
# via
|
||||
# jsonschema
|
||||
# referencing
|
||||
rtree==1.2.0
|
||||
# via spyder
|
||||
scipy==1.14.0
|
||||
# via svgpathtools
|
||||
secretstorage==3.3.3
|
||||
# via keyring
|
||||
six==1.16.0
|
||||
# via
|
||||
# anytree
|
||||
# asttokens
|
||||
# bleach
|
||||
# python-dateutil
|
||||
snowballstemmer==2.2.0
|
||||
# via
|
||||
# pydocstyle
|
||||
# sphinx
|
||||
sortedcontainers==2.4.0
|
||||
# via intervaltree
|
||||
soupsieve==2.5
|
||||
# via beautifulsoup4
|
||||
sphinx==7.3.7
|
||||
# via
|
||||
# numpydoc
|
||||
# spyder
|
||||
sphinxcontrib-applehelp==1.0.8
|
||||
# via sphinx
|
||||
sphinxcontrib-devhelp==1.0.6
|
||||
# via sphinx
|
||||
sphinxcontrib-htmlhelp==2.0.5
|
||||
# via sphinx
|
||||
sphinxcontrib-jsmath==1.0.1
|
||||
# via sphinx
|
||||
sphinxcontrib-qthelp==1.0.7
|
||||
# via sphinx
|
||||
sphinxcontrib-serializinghtml==1.1.10
|
||||
# via sphinx
|
||||
spyder==5.5.5
|
||||
# via cq-editor
|
||||
spyder-kernels==2.5.2
|
||||
# via spyder
|
||||
stack-data==0.6.3
|
||||
# via ipython
|
||||
svgelements==1.9.6
|
||||
# via ocpsvg
|
||||
svgpathtools==1.6.1
|
||||
# via
|
||||
# build123d
|
||||
# ocpsvg
|
||||
svgwrite==1.4.3
|
||||
# via svgpathtools
|
||||
tabulate==0.9.0
|
||||
# via numpydoc
|
||||
text-unidecode==1.3
|
||||
# via python-slugify
|
||||
textdistance==4.6.2
|
||||
# via spyder
|
||||
three-merge==0.1.1
|
||||
# via spyder
|
||||
tinycss2==1.3.0
|
||||
# via
|
||||
# nbconvert
|
||||
# qstylizer
|
||||
tomli==2.0.1
|
||||
# via yapf
|
||||
tomlkit==0.12.5
|
||||
# via pylint
|
||||
tornado==6.4.1
|
||||
# via
|
||||
# ipykernel
|
||||
# jupyter-client
|
||||
traitlets==5.14.3
|
||||
# via
|
||||
# comm
|
||||
# ipykernel
|
||||
# ipython
|
||||
# jupyter-client
|
||||
# jupyter-core
|
||||
# matplotlib-inline
|
||||
# nbclient
|
||||
# nbconvert
|
||||
# nbformat
|
||||
# qtconsole
|
||||
trianglesolver==1.2
|
||||
# via build123d
|
||||
types-python-dateutil==2.9.0.20240316
|
||||
# via arrow
|
||||
typing-extensions==4.12.2
|
||||
# via
|
||||
# build123d
|
||||
# ezdxf
|
||||
# ipython
|
||||
# python-utils
|
||||
typish==1.9.3
|
||||
# via cadquery
|
||||
ujson==5.10.0
|
||||
# via
|
||||
# python-lsp-jsonrpc
|
||||
# python-lsp-server
|
||||
urllib3==2.2.2
|
||||
# via requests
|
||||
watchdog==4.0.1
|
||||
# via spyder
|
||||
wcwidth==0.2.13
|
||||
# via prompt-toolkit
|
||||
webencodings==0.5.1
|
||||
# via
|
||||
# bleach
|
||||
# tinycss2
|
||||
whatthepatch==1.0.5
|
||||
# via python-lsp-server
|
||||
wurlitzer==3.1.1
|
||||
# via spyder-kernels
|
||||
yapf==0.40.2
|
||||
# via python-lsp-server
|
||||
zipp==3.19.2
|
||||
# via importlib-metadata
|
||||
|
||||
# The following packages are considered to be unsafe in a requirements file:
|
||||
# setuptools
|
||||
89
requirements/requirements.txt
Normal file
89
requirements/requirements.txt
Normal file
@@ -0,0 +1,89 @@
|
||||
#
|
||||
# This file is autogenerated by pip-compile with Python 3.11
|
||||
# by the following command:
|
||||
#
|
||||
# pip-compile --output-file=requirements/requirements.txt
|
||||
#
|
||||
anytree==2.12.1
|
||||
# via build123d
|
||||
asttokens==2.4.1
|
||||
# via stack-data
|
||||
build123d==0.5.0
|
||||
# via buildable-stick-system (pyproject.toml)
|
||||
cadquery-ocp==7.7.2
|
||||
# via
|
||||
# build123d
|
||||
# ocpsvg
|
||||
decorator==5.1.1
|
||||
# via ipython
|
||||
executing==2.0.1
|
||||
# via stack-data
|
||||
ezdxf==1.3.1
|
||||
# via build123d
|
||||
fonttools==4.53.0
|
||||
# via ezdxf
|
||||
ipython==8.26.0
|
||||
# via build123d
|
||||
jedi==0.19.1
|
||||
# via ipython
|
||||
matplotlib-inline==0.1.7
|
||||
# via ipython
|
||||
numpy==1.26.4
|
||||
# via
|
||||
# build123d
|
||||
# ezdxf
|
||||
# numpy-stl
|
||||
# scipy
|
||||
# svgpathtools
|
||||
numpy-stl==3.1.1
|
||||
# via build123d
|
||||
ocpsvg==0.2.1
|
||||
# via build123d
|
||||
parso==0.8.4
|
||||
# via jedi
|
||||
pexpect==4.9.0
|
||||
# via ipython
|
||||
prompt-toolkit==3.0.47
|
||||
# via ipython
|
||||
ptyprocess==0.7.0
|
||||
# via pexpect
|
||||
pure-eval==0.2.2
|
||||
# via stack-data
|
||||
py-lib3mf==2.3.1
|
||||
# via build123d
|
||||
pygments==2.18.0
|
||||
# via ipython
|
||||
pyparsing==3.1.2
|
||||
# via ezdxf
|
||||
python-utils==3.8.2
|
||||
# via numpy-stl
|
||||
scipy==1.14.0
|
||||
# via svgpathtools
|
||||
six==1.16.0
|
||||
# via
|
||||
# anytree
|
||||
# asttokens
|
||||
stack-data==0.6.3
|
||||
# via ipython
|
||||
svgelements==1.9.6
|
||||
# via ocpsvg
|
||||
svgpathtools==1.6.1
|
||||
# via
|
||||
# build123d
|
||||
# ocpsvg
|
||||
svgwrite==1.4.3
|
||||
# via svgpathtools
|
||||
traitlets==5.14.3
|
||||
# via
|
||||
# ipython
|
||||
# matplotlib-inline
|
||||
trianglesolver==1.2
|
||||
# via build123d
|
||||
typing-extensions==4.12.2
|
||||
# via
|
||||
# build123d
|
||||
# ezdxf
|
||||
# ipython
|
||||
# python-utils
|
||||
wcwidth==0.2.13
|
||||
# via prompt-toolkit
|
||||
@@ -1,27 +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 <frame-left.scad>
|
||||
use <frame-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, 0, -2.5]) left_frame();
|
||||
color("black") translate([frame_x/2+25, 0, -2.5]) right_frame();
|
||||
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();
|
||||
@@ -1,14 +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 <bottom-panel-overhang-left.scad>
|
||||
|
||||
module bottom_panel_right() {
|
||||
rotate([0, 0, 180]) bottom_panel_left();
|
||||
}
|
||||
|
||||
bottom_panel_right();
|
||||
1
src/bss/__init__.py
Normal file
1
src/bss/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
"""The Buildable Stick System, code to generate arcade stick components."""
|
||||
68
src/bss/core.py
Normal file
68
src/bss/core.py
Normal file
@@ -0,0 +1,68 @@
|
||||
"""Shared parameters and foundational objects.
|
||||
|
||||
Reminder that the default unit is millimeters.
|
||||
|
||||
SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
"""
|
||||
import build123d as bd
|
||||
|
||||
####################
|
||||
# measurements for holes and connectors
|
||||
####################
|
||||
HOLE_TOLERANCE = 0.15
|
||||
|
||||
M4_BOLT_RADIUS = 2 + HOLE_TOLERANCE
|
||||
M4_BOLT_COUNTERSINK_RADIUS = M4_BOLT_RADIUS + 2
|
||||
|
||||
####################
|
||||
# basic dimensions necessary for proper object composition
|
||||
####################
|
||||
|
||||
# these are for ONE frame box, not the overall case, which may be composed
|
||||
# of multiple frames
|
||||
FRAME_X = 233
|
||||
FRAME_Y = 208
|
||||
FRAME_Z = 57
|
||||
|
||||
# the "wall" is the space inside the frame that is reserved to make a lip for panels
|
||||
FRAME_WALL = 4
|
||||
|
||||
# panel dimensions for either an inset panel or the inner tray of an overhang panel
|
||||
PANEL_X = FRAME_X - (FRAME_WALL * 2)
|
||||
PANEL_Y = FRAME_Y - (FRAME_WALL * 2)
|
||||
PANEL_Z = 5
|
||||
|
||||
# the center point of where the standoff and bolts connecting a panel to a frame go,
|
||||
# relative to a centered object
|
||||
PANEL_TO_FRAME_POINT_OFFSET = 10
|
||||
PANEL_TO_FRAME_POINT_X = (PANEL_X/2) - PANEL_TO_FRAME_POINT_OFFSET
|
||||
PANEL_TO_FRAME_POINT_Y = (PANEL_Y/2) - PANEL_TO_FRAME_POINT_OFFSET
|
||||
|
||||
####################
|
||||
# commonly used button dimensions
|
||||
####################
|
||||
|
||||
BUTTON_30MM_RADIUS = 15 + HOLE_TOLERANCE
|
||||
BUTTON_24MM_RADIUS = 12 + HOLE_TOLERANCE
|
||||
|
||||
# carve out space for snap-ins
|
||||
# judgng by https://www.slagcoin.com/joystick/attributes_brands.html 2.5mm is good for everything
|
||||
BUTTON_SNAP_IN_THICKNESS = 2.5
|
||||
|
||||
# make sure the carve out space is also enough for screw-in nuts
|
||||
# slagcoin has screw-in nut diameter at 36mm for 30mm buttons, 29.5 for 24mm buttons
|
||||
# radius + value below should leave space for the nut and for fingers to grab the nut
|
||||
BUTTON_30MM_RADIUS_CONNECTOR_SPACE = 6
|
||||
|
||||
####################
|
||||
# arcade stick parts that are relevant in a number of contexts
|
||||
####################
|
||||
|
||||
|
||||
class CutoutButtonHole(bd.CounterBoreHole):
|
||||
"""Use an inverted counter bore hole as the button hole with the extra thin space for snap-ins."""
|
||||
|
||||
def __init__(self, radius, **kwargs):
|
||||
"""Initialize the inverted counter bore hole with the right thinness for e.g. a panel to take snap-ins."""
|
||||
super().__init__(radius, radius+BUTTON_30MM_RADIUS_CONNECTOR_SPACE, BUTTON_SNAP_IN_THICKNESS, **kwargs)
|
||||
31
src/bss/layouts.py
Normal file
31
src/bss/layouts.py
Normal file
@@ -0,0 +1,31 @@
|
||||
"""Button and other component layouts for use in panels.
|
||||
|
||||
SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
"""
|
||||
import build123d as bd
|
||||
|
||||
from bss import core
|
||||
|
||||
####################
|
||||
# collected points and related data, to be used to construct a layout
|
||||
####################
|
||||
|
||||
# 3x3, centered on top left (P1) button
|
||||
SEGA_2P_SIX_BUTTON = {'radius': core.BUTTON_30MM_RADIUS,
|
||||
'positions': [(0, 0), (30.5, 11 + 9), (30.5 + 36, 11 + 9),
|
||||
(0, -19 - 9 - 11), (30.5, -19), (30.5 + 36, -19)]}
|
||||
|
||||
####################
|
||||
# Layouts are Locations with extra stuff to document what it is
|
||||
####################
|
||||
|
||||
|
||||
class Layout(bd.Locations):
|
||||
"""A set of button positions that can be adjusted relative to some parameters."""
|
||||
|
||||
def __init__(self, layout, *args, distance_scale=1.00, **kwargs):
|
||||
"""Lay out the points for the buttons, etc. but can be scaled."""
|
||||
self.points = list(map(lambda x: (x[0] * distance_scale, x[1] * distance_scale), layout['positions']))
|
||||
self.button_radius = layout['radius']
|
||||
super().__init__(self.points, *args, **kwargs)
|
||||
45
src/bss/panels.py
Normal file
45
src/bss/panels.py
Normal file
@@ -0,0 +1,45 @@
|
||||
"""The base panel from which all other panels inherit.
|
||||
|
||||
SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
"""
|
||||
import logging
|
||||
|
||||
import build123d as bd
|
||||
|
||||
from bss import core, layouts
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Panel(bd.BasePartObject):
|
||||
"""A panel meant to be secured to the top or bottom of a base.
|
||||
|
||||
This is a hard box by default as an inset panel will be flush with the frame.
|
||||
"""
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
"""Create our part."""
|
||||
with bd.BuildPart() as panel:
|
||||
bd.Box(core.PANEL_X, core.PANEL_Y, core.PANEL_Z)
|
||||
logger.info(panel.faces().sort_by(bd.Axis.Z))
|
||||
with bd.Locations(panel.faces().sort_by(bd.Axis.Z)[-1]):
|
||||
with bd.Locations((core.PANEL_TO_FRAME_POINT_X, core.PANEL_TO_FRAME_POINT_Y),
|
||||
(-core.PANEL_TO_FRAME_POINT_X, core.PANEL_TO_FRAME_POINT_Y),
|
||||
(-core.PANEL_TO_FRAME_POINT_X, -core.PANEL_TO_FRAME_POINT_Y),
|
||||
(core.PANEL_TO_FRAME_POINT_X, -core.PANEL_TO_FRAME_POINT_Y)):
|
||||
bd.CounterSinkHole(core.M4_BOLT_RADIUS, core.M4_BOLT_COUNTERSINK_RADIUS)
|
||||
super().__init__(panel.part, *args, **kwargs)
|
||||
|
||||
|
||||
with bd.BuildPart() as sega_2p_panel:
|
||||
panel = Panel()
|
||||
with layouts.Layout(layouts.SEGA_2P_SIX_BUTTON):
|
||||
with bd.Locations((5, 45)):
|
||||
with bd.Locations(panel.faces().sort_by(bd.Axis.Z)[0]):
|
||||
core.CutoutButtonHole(layouts.SEGA_2P_SIX_BUTTON['radius'])
|
||||
|
||||
try:
|
||||
show_object(sega_2p_panel)
|
||||
except NameError:
|
||||
pass
|
||||
@@ -55,7 +55,7 @@ module frame_hex_bolt_hole() {
|
||||
}
|
||||
|
||||
module frame_interchange_hole() {
|
||||
cylinder(r=18, h=50, $fn=4, center=true);
|
||||
cylinder(r=37, h=50, $fn=50, center=true);
|
||||
}
|
||||
|
||||
module neutrik_d_hole() {
|
||||
@@ -79,9 +79,10 @@ module rocker_20mm_mount() {
|
||||
translate([-9.5, -12, 0]) neutrik_d_screw_hole();
|
||||
}
|
||||
|
||||
// space for a neutrik D mount or 24mm button - Z is to cut the whole inside without affecting panel lip
|
||||
// space for a neutrik D mount or 24mm button --- Z is meant to leave some lip now that frames
|
||||
// are primarily printed on their side
|
||||
module frame_cutout() {
|
||||
cube([30.5, 8, frame_z-(panel_z*2)], center=true);
|
||||
cube([30.5, 8, frame_z-(panel_z*3)], center=true);
|
||||
}
|
||||
|
||||
// bank of three 24mm buttons, commonly on a frame face
|
||||
@@ -164,36 +165,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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module base_bottom_panel() {
|
||||
mirror([0, 0, 1]) base_panel();
|
||||
cube([panel_x, panel_y, panel_z], center=true);
|
||||
}
|
||||
|
||||
module panel() {
|
||||
@@ -203,13 +175,6 @@ module panel() {
|
||||
}
|
||||
}
|
||||
|
||||
module bottom_panel() {
|
||||
difference() {
|
||||
base_bottom_panel();
|
||||
mirror([0, 0, 1]) panel_holes();
|
||||
}
|
||||
}
|
||||
|
||||
module overhang_plate() {
|
||||
top_points = [
|
||||
// top bevel
|
||||
@@ -260,7 +225,7 @@ module panel_with_raised_overhang() {
|
||||
}
|
||||
}
|
||||
|
||||
module frame_box() {
|
||||
module frame_solid() {
|
||||
difference() {
|
||||
top_points = [
|
||||
// top bevel
|
||||
@@ -310,6 +275,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);
|
||||
}
|
||||
@@ -319,7 +290,11 @@ module frame_mount_column() {
|
||||
cube([frame_mount_column_width, frame_mount_column_width, frame_z], center=true);
|
||||
// add some corners back to do a lame chamfer
|
||||
linear_extrude(height=frame_z, center=true)
|
||||
polygon([[10, 10], [-20, 10], [10, -20]]);
|
||||
polygon([
|
||||
[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() {
|
||||
@@ -340,7 +315,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+1, 25]) rotate([0, 90, 0]) frame_interchange_hole();
|
||||
}
|
||||
|
||||
module base_frame() {
|
||||
@@ -355,24 +331,30 @@ module frame() {
|
||||
difference() {
|
||||
base_frame();
|
||||
translate([0, 0, frame_z/2]) scale([1, 1, 2]) base_panel();
|
||||
translate([0, 0, -frame_z/2]) scale([1, 1, 2]) bottom_panel();
|
||||
translate([0, 0, -frame_z/2]) scale([1, 1, 2]) base_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();
|
||||
|
||||
// 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();
|
||||
}
|
||||
}
|
||||
|
||||
/* MISC SHAPES --- for cutting out decorative panels, frame wall windows, etc. */
|
||||
|
||||
// for cutting out slashes from the frame outer wall
|
||||
module slash_cutout() {
|
||||
polyhedron([
|
||||
[slash_inner_displacement/2, -frame_wall/2, -slash_height/2],
|
||||
[(slash_inner_displacement/2+slash_width), -frame_wall/2, -slash_height/2],
|
||||
[(slash_inner_displacement/2+slash_width), frame_wall/2, -slash_height/2],
|
||||
[slash_inner_displacement/2, frame_wall/2, -slash_height/2],
|
||||
[-(slash_inner_displacement/2+slash_width), -frame_wall/2, slash_height/2],
|
||||
[-slash_inner_displacement/2, -frame_wall/2, slash_height/2],
|
||||
[-slash_inner_displacement/2, frame_wall/2, slash_height/2],
|
||||
[-(slash_inner_displacement/2+slash_width), frame_wall/2, slash_height/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]]);
|
||||
}
|
||||
|
||||
/* LAYOUTS */
|
||||
|
||||
// Directional Arc (both hands)
|
||||
@@ -484,3 +466,8 @@ module sega_2p_plus_one() {
|
||||
// just my guesstimate on this one
|
||||
translate([0, -19-9-11-19-9-11, 0]) sega_2p_p1();
|
||||
}
|
||||
|
||||
module shiokenstar() {
|
||||
translate([-172, 32, 0]) dir_arc_24mm_directionals();
|
||||
sega_2p();
|
||||
}
|
||||
|
||||
19
src/extras/stand-base.scad
Normal file
19
src/extras/stand-base.scad
Normal file
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
include <../parameters.scad>
|
||||
include <../components.scad>
|
||||
use <stand.scad>
|
||||
|
||||
module stand_base() {
|
||||
difference() {
|
||||
cube([frame_x, stand_y*2, 3], center=true);
|
||||
translate([0, 0, 1.5]) rotate([180, 0, 0]) stand();
|
||||
translate([-frame_x*0.4, 0, 1.5]) rotate([180, 0, 0]) stand();
|
||||
translate([frame_x*0.4, 0, 1.5]) rotate([180, 0, 0]) stand();
|
||||
}
|
||||
}
|
||||
|
||||
stand_base();
|
||||
29
src/extras/stand.scad
Normal file
29
src/extras/stand.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>
|
||||
|
||||
base_extra = 10;
|
||||
back_extra_multiplier = 4.25;
|
||||
rotation_alignment = 15;
|
||||
|
||||
module stand() {
|
||||
difference() {
|
||||
union() {
|
||||
/* front lip piece */
|
||||
translate([0, 0, stand_z/2]) cube([stand_x, stand_y, stand_z], center=true);
|
||||
/* back supporting piece */
|
||||
translate([0, (stand_y-rotation_alignment)/4, stand_z*back_extra_multiplier/2])
|
||||
cube([stand_x, (stand_y+rotation_alignment)/2, stand_z*back_extra_multiplier], center=true);
|
||||
/* base */
|
||||
translate([0, 0, 0.5]) cube([stand_x+base_extra, stand_y+base_extra, 1], center=true);
|
||||
}
|
||||
/* cut out the actual frame solid */
|
||||
translate([0, rotation_alignment, (frame_y/2)+7]) rotate([65, 0, 0]) frame_solid();
|
||||
}
|
||||
}
|
||||
|
||||
stand();
|
||||
@@ -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-left.scad>
|
||||
|
||||
module top_left_frame_piece() {
|
||||
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
|
||||
intersection() {
|
||||
left_frame();
|
||||
difference() {
|
||||
// include the whole top wall (including mount columns)
|
||||
translate([0, (frame_y/2)-(piece_width/2), 0]) cube([frame_x, piece_width, frame_z], center=true);
|
||||
// ...minus the frame wall 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_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();
|
||||
@@ -24,9 +24,9 @@ module left_frame() {
|
||||
frame_cable_routing_hole();
|
||||
|
||||
// aux button holes
|
||||
translate([-35, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
|
||||
translate([-35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
translate([-72, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
translate([-35.25, 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([-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
|
||||
@@ -24,9 +24,9 @@ module right_frame() {
|
||||
mirror([1, 0, 0]) frame_cable_routing_hole();
|
||||
|
||||
// aux button holes
|
||||
translate([35, 101.5, 0]) rotate([270, 0, 0]) aux_control_three_button_cluster();
|
||||
translate([35, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
translate([72, (frame_y/2)-neutrik_panel_thickness-4, 0]) frame_cutout();
|
||||
translate([35.25, 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([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
|
||||
28
src/frames/pieces/box/front-or-back-aux-and-neutrik.scad
Normal file
28
src/frames/pieces/box/front-or-back-aux-and-neutrik.scad
Normal file
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <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();
|
||||
31
src/frames/pieces/box/front-or-back-inner-wall.scad
Normal file
31
src/frames/pieces/box/front-or-back-inner-wall.scad
Normal file
@@ -0,0 +1,31 @@
|
||||
/* 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();
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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 backslashes() {
|
||||
translate([-60, -(frame_y-frame_wall)/2, 0]) slash_cutout();
|
||||
translate([-40, -(frame_y-frame_wall)/2, 0]) slash_cutout();
|
||||
translate([-20, -(frame_y-frame_wall)/2, 0]) slash_cutout();
|
||||
translate([0, -(frame_y-frame_wall)/2, 0]) slash_cutout();
|
||||
translate([20, -(frame_y-frame_wall)/2, 0]) slash_cutout();
|
||||
translate([40, -(frame_y-frame_wall)/2, 0]) slash_cutout();
|
||||
translate([60, -(frame_y-frame_wall)/2, 0]) slash_cutout();
|
||||
}
|
||||
|
||||
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();
|
||||
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* 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();
|
||||
@@ -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 <front-or-back.scad>
|
||||
use <front-or-back-inner-wall.scad>
|
||||
|
||||
module front_stripe() {
|
||||
cube([frame_x-(frame_mount_column_width*1.75)*2, frame_wall, 6], center=true);
|
||||
}
|
||||
|
||||
module windowed_front_or_back_box_frame_piece() {
|
||||
difference() {
|
||||
front_or_back_box_frame_piece();
|
||||
// subtract frame wall windows
|
||||
translate([0, -(frame_y-frame_wall)/2, 18]) front_stripe();
|
||||
translate([0, -(frame_y-frame_wall)/2, 9]) front_stripe();
|
||||
translate([0, -(frame_y-frame_wall)/2, 0]) front_stripe();
|
||||
translate([0, -(frame_y-frame_wall)/2, -9]) front_stripe();
|
||||
translate([0, -(frame_y-frame_wall)/2, -18]) front_stripe();
|
||||
// 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();
|
||||
23
src/frames/pieces/box/front-or-back-windowed.scad
Normal file
23
src/frames/pieces/box/front-or-back-windowed.scad
Normal file
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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();
|
||||
@@ -5,9 +5,9 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <frame-left.scad>
|
||||
use <frames/complete/left-frame.scad>
|
||||
|
||||
module bottom_left_or_right_frame_piece() {
|
||||
module front_or_back_box_frame_piece() {
|
||||
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
|
||||
intersection() {
|
||||
left_frame();
|
||||
@@ -16,11 +16,15 @@ module bottom_left_or_right_frame_piece() {
|
||||
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);
|
||||
cube([frame_wall, frame_y-frame_wall*2, 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
|
||||
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, frame_z/4], center=true);
|
||||
cube([frame_x, frame_y-(panel_support_width+frame_wall)*2, inner_frame_z/3], center=true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bottom_left_or_right_frame_piece();
|
||||
front_or_back_box_frame_piece();
|
||||
35
src/frames/pieces/box/side-inner-wall.scad
Normal file
35
src/frames/pieces/box/side-inner-wall.scad
Normal file
@@ -0,0 +1,35 @@
|
||||
/* 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();
|
||||
29
src/frames/pieces/box/side-windowed-backslashes.scad
Normal file
29
src/frames/pieces/box/side-windowed-backslashes.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 <side.scad>
|
||||
use <side-inner-wall.scad>
|
||||
|
||||
module backslashes() {
|
||||
translate([-(frame_x-frame_wall)/2, -40, 0]) rotate([0, 0, -90]) slash_cutout();
|
||||
translate([-(frame_x-frame_wall)/2, -20, 0]) rotate([0, 0, -90]) slash_cutout();
|
||||
translate([-(frame_x-frame_wall)/2, 0, 0]) rotate([0, 0, -90]) slash_cutout();
|
||||
translate([-(frame_x-frame_wall)/2, 20, 0]) rotate([0, 0, -90]) slash_cutout();
|
||||
translate([-(frame_x-frame_wall)/2, 40, 0]) rotate([0, 0, -90]) slash_cutout();
|
||||
}
|
||||
|
||||
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();
|
||||
22
src/frames/pieces/box/side-windowed-forwardslashes.scad
Normal file
22
src/frames/pieces/box/side-windowed-forwardslashes.scad
Normal file
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* 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();
|
||||
29
src/frames/pieces/box/side-windowed-horiz-stripes.scad
Normal file
29
src/frames/pieces/box/side-windowed-horiz-stripes.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 <side.scad>
|
||||
use <side-inner-wall.scad>
|
||||
|
||||
module side_stripe() {
|
||||
cube([frame_wall, frame_y-(frame_mount_column_width*1.75)*2, 6], center=true);
|
||||
}
|
||||
|
||||
module windowed_side_box_frame_piece() {
|
||||
difference() {
|
||||
side_box_frame_piece();
|
||||
// subtract frame wall windows
|
||||
translate([-(frame_x-frame_wall)/2, 0, 18]) side_stripe();
|
||||
translate([-(frame_x-frame_wall)/2, 0, 9]) side_stripe();
|
||||
translate([-(frame_x-frame_wall)/2, 0, 0]) side_stripe();
|
||||
translate([-(frame_x-frame_wall)/2, 0, -9]) side_stripe();
|
||||
translate([-(frame_x-frame_wall)/2, 0, -18]) side_stripe();
|
||||
// subtract the inner wall area that will be provided by the other piece
|
||||
side_inner_wall_frame_piece();
|
||||
}
|
||||
}
|
||||
|
||||
windowed_side_box_frame_piece();
|
||||
23
src/frames/pieces/box/side-windowed.scad
Normal file
23
src/frames/pieces/box/side-windowed.scad
Normal file
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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();
|
||||
@@ -5,20 +5,19 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <frame-piece-top-left.scad>
|
||||
use <frame-piece-bottom-left-or-right.scad>
|
||||
use <front-or-back.scad>
|
||||
|
||||
module side_frame_piece() {
|
||||
module side_box_frame_piece() {
|
||||
piece_width = panel_support_width+frame_wall+frame_mount_column_width;
|
||||
difference() {
|
||||
// side piece is left/right agnostic
|
||||
frame();
|
||||
// minus the top and bottom
|
||||
top_left_frame_piece();
|
||||
bottom_left_or_right_frame_piece();
|
||||
front_or_back_box_frame_piece();
|
||||
rotate([180, 0, 0]) front_or_back_box_frame_piece();
|
||||
// and just chop out the rest of the frame
|
||||
translate([piece_width, 0, 0]) cube([frame_x, frame_y+1, frame_z+1], center=true);
|
||||
}
|
||||
}
|
||||
|
||||
side_frame_piece();
|
||||
side_box_frame_piece();
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <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();
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* 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();
|
||||
37
src/frames/pieces/extended/front-or-back.scad
Normal file
37
src/frames/pieces/extended/front-or-back.scad
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* 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();
|
||||
38
src/frames/pieces/extended/side-extended-to-bottom.scad
Normal file
38
src/frames/pieces/extended/side-extended-to-bottom.scad
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* 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/complete/left-frame.scad>
|
||||
use <frames/pieces/box/side.scad>
|
||||
use <front-or-back.scad>
|
||||
|
||||
module side_and_bottom_frame_piece_wall() {
|
||||
// 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
|
||||
// not creating a clean thing to cut, so we just take the whole wall and use that
|
||||
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();
|
||||
}
|
||||
|
||||
module side_and_bottom_frame_piece_extension() {
|
||||
// combine the original with a shrunken piece to "pull" the wall out
|
||||
hull() {
|
||||
linear_extrude(height=frame_extension_y) scale([0.5, 0.90, 1]) side_and_bottom_frame_piece_wall();
|
||||
linear_extrude(height=frame_bevel_height) side_and_bottom_frame_piece_wall();
|
||||
}
|
||||
}
|
||||
|
||||
module extra_extended_left_or_right_frame_piece() {
|
||||
difference() {
|
||||
side_box_frame_piece();
|
||||
// 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]) rotate([0, -90, 0]) side_and_bottom_frame_piece_extension();
|
||||
}
|
||||
|
||||
extra_extended_left_or_right_frame_piece();
|
||||
37
src/frames/pieces/extended/side.scad
Normal file
37
src/frames/pieces/extended/side.scad
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* 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/complete/left-frame.scad>
|
||||
use <frames/pieces/box/side.scad>
|
||||
use <front-or-back-clean-for-extended-side.scad>
|
||||
|
||||
module side_frame_piece_wall() {
|
||||
// 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
|
||||
// not creating a clean thing to cut, so we just take the whole wall and use that
|
||||
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() {
|
||||
// combine the original with a shrunken piece to "pull" the wall out
|
||||
hull() {
|
||||
linear_extrude(height=frame_extension_y) scale([0.5, 0.85, 1]) side_frame_piece_wall();
|
||||
linear_extrude(height=frame_bevel_height) side_frame_piece_wall();
|
||||
}
|
||||
}
|
||||
|
||||
module extended_bottom_left_or_right_frame_piece() {
|
||||
difference() {
|
||||
side_box_frame_piece();
|
||||
// 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]) rotate([0, -90, 0]) side_frame_piece_extension();
|
||||
}
|
||||
|
||||
extended_bottom_left_or_right_frame_piece();
|
||||
@@ -5,11 +5,11 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <frame-piece-side.scad>
|
||||
use <box/side.scad>
|
||||
|
||||
module interconnect_frame_half_piece() {
|
||||
translate([frame_x/2-frame_wall, 0, 0]) difference() {
|
||||
side_frame_piece();
|
||||
side_box_frame_piece();
|
||||
rotate([0, 0, 180]) side_chopper();
|
||||
}
|
||||
}
|
||||
@@ -1,50 +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() 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 <components.scad>
|
||||
use <misc-neutrik-d-plate.scad>
|
||||
use <neutrik-d-plate.scad>
|
||||
|
||||
module aux_connectors_two_neutrik_cluster_decorative_plate() {
|
||||
difference() {
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <misc-neutrik-d-plate.scad>
|
||||
use <neutrik-d-plate.scad>
|
||||
|
||||
module aux_control_three_button_cluster_decorative_plate() {
|
||||
difference() {
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* 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();
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <misc-neutrik-d-plate.scad>
|
||||
use <neutrik-d-plate.scad>
|
||||
|
||||
module neutrik_d_plate_24mm() {
|
||||
difference() {
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <misc-neutrik-d-plate.scad>
|
||||
use <neutrik-d-plate.scad>
|
||||
|
||||
module rocker_plate_20mm() {
|
||||
difference() {
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <top-panel-inset-dir_arc-plus-w-30mm-plus-one.scad>
|
||||
use <dir_arc-plus-w-30mm-plus-one-panel.scad>
|
||||
|
||||
module dir_arc_w_30mm_plus_one_panel_with_mount() {
|
||||
dir_arc_w_30mm_plus_one_panel();
|
||||
@@ -6,7 +6,7 @@
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
|
||||
module top_panel_inset_lever_and_dir_arc_w_30mm() {
|
||||
module lever_and_dir_arc_w_30mm_panel() {
|
||||
difference() {
|
||||
panel();
|
||||
dir_arc_w_30mm();
|
||||
@@ -15,4 +15,4 @@ module top_panel_inset_lever_and_dir_arc_w_30mm() {
|
||||
}
|
||||
}
|
||||
|
||||
top_panel_inset_lever_and_dir_arc_w_30mm();
|
||||
lever_and_dir_arc_w_30mm_panel();
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <top-panel-inset-lever.scad>
|
||||
use <lever-panel.scad>
|
||||
|
||||
module lever_panel_with_mount() {
|
||||
lever_panel();
|
||||
@@ -6,4 +6,4 @@
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
|
||||
bottom_panel();
|
||||
panel();
|
||||
@@ -5,11 +5,11 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <top-panel-inset-sega-2p-plus-one-plus-control.scad>
|
||||
use <sega-2p-plus-one-plus-control-panel.scad>
|
||||
|
||||
module top_panel_inset_sega_2p_plus_one_plus_control_with_mount() {
|
||||
top_panel_inset_sega_2p_plus_one_plus_control();
|
||||
module sega_2p_plus_one_plus_control_panel_with_mount() {
|
||||
sega_2p_plus_one_plus_control_panel();
|
||||
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
|
||||
}
|
||||
|
||||
top_panel_inset_sega_2p_plus_one_plus_control_with_mount();
|
||||
sega_2p_plus_one_plus_control_panel_with_mount();
|
||||
@@ -6,7 +6,7 @@
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
|
||||
module top_panel_inset_sega_2p_plus_one_plus_control() {
|
||||
module sega_2p_plus_one_plus_control_panel() {
|
||||
difference() {
|
||||
panel();
|
||||
sega_2p_plus_one();
|
||||
@@ -15,4 +15,4 @@ module top_panel_inset_sega_2p_plus_one_plus_control() {
|
||||
}
|
||||
}
|
||||
|
||||
top_panel_inset_sega_2p_plus_one_plus_control();
|
||||
sega_2p_plus_one_plus_control_panel();
|
||||
16
src/panels/inset/shiokenstar-left-panel.scad
Normal file
16
src/panels/inset/shiokenstar-left-panel.scad
Normal file
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
|
||||
module shiokenstar_left_panel() {
|
||||
difference() {
|
||||
translate([-frame_x/2+frame_wall, 0, 0]) panel();
|
||||
translate([75, 0, 0]) shiokenstar();
|
||||
}
|
||||
}
|
||||
|
||||
shiokenstar_left_panel();
|
||||
16
src/panels/inset/shiokenstar-right-panel.scad
Normal file
16
src/panels/inset/shiokenstar-right-panel.scad
Normal file
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
|
||||
module shiokenstar_right_panel() {
|
||||
difference() {
|
||||
translate([frame_x/2-frame_wall, 0, 0]) panel();
|
||||
translate([75, 0, 0]) shiokenstar();
|
||||
}
|
||||
}
|
||||
|
||||
shiokenstar_right_panel();
|
||||
@@ -6,7 +6,7 @@
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
|
||||
module top_panel_left_lever_and_dir_arc_w_30mm() {
|
||||
module lever_and_dir_arc_w_30mm_left_overhang_panel() {
|
||||
difference() {
|
||||
panel_with_raised_overhang();
|
||||
dir_arc_w_30mm();
|
||||
@@ -16,4 +16,4 @@ module top_panel_left_lever_and_dir_arc_w_30mm() {
|
||||
}
|
||||
}
|
||||
|
||||
top_panel_left_lever_and_dir_arc_w_30mm();
|
||||
lever_and_dir_arc_w_30mm_left_overhang_panel();
|
||||
@@ -7,7 +7,7 @@ include <parameters.scad>
|
||||
include <components.scad>
|
||||
|
||||
// combine the lever mount and generic plate, with mounting holes
|
||||
module top_panel_left_lever() {
|
||||
module lever_left_overhang_panel() {
|
||||
difference() {
|
||||
// base plate
|
||||
panel_with_raised_overhang();
|
||||
@@ -18,4 +18,4 @@ module top_panel_left_lever() {
|
||||
}
|
||||
}
|
||||
|
||||
top_panel_left_lever();
|
||||
lever_left_overhang_panel();
|
||||
@@ -5,14 +5,14 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <bottom-panel-overhang-solo.scad>
|
||||
use <solo-panel.scad>
|
||||
|
||||
module bottom_panel_left() {
|
||||
module left_or_right_overhang_panel() {
|
||||
difference() {
|
||||
bottom_panel_solo();
|
||||
solo_overhang_panel();
|
||||
// chop the right edge off
|
||||
side_chopper();
|
||||
}
|
||||
}
|
||||
|
||||
bottom_panel_left();
|
||||
left_or_right_overhang_panel();
|
||||
@@ -5,11 +5,11 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <top-panel-overhang-middle-dir_arc-plus-w-30mm.scad>
|
||||
use <middle-dir_arc-plus-w-30mm-panel.scad>
|
||||
|
||||
module top_panel_middle_dir_arc_w_30mm_with_mount() {
|
||||
top_panel_middle_dir_arc_w_30mm();
|
||||
module dir_arc_w_30mm_middle_overhang_panel_with_mount() {
|
||||
dir_arc_w_30mm_middle_overhang_panel();
|
||||
translate([-15, -40, -(panel_z/2) - 3]) rotate([0, 0, -45]) pcb_mount();
|
||||
}
|
||||
|
||||
top_panel_middle_dir_arc_w_30mm_with_mount();
|
||||
dir_arc_w_30mm_middle_overhang_panel_with_mount();
|
||||
@@ -6,7 +6,7 @@
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
|
||||
module top_panel_middle_dir_arc_w_30mm() {
|
||||
module dir_arc_w_30mm_middle_overhang_panel() {
|
||||
difference() {
|
||||
panel_with_raised_overhang();
|
||||
dir_arc_w_30mm();
|
||||
@@ -15,4 +15,4 @@ module top_panel_middle_dir_arc_w_30mm() {
|
||||
}
|
||||
}
|
||||
|
||||
top_panel_middle_dir_arc_w_30mm();
|
||||
dir_arc_w_30mm_middle_overhang_panel();
|
||||
@@ -5,14 +5,13 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <bottom-panel-overhang-left.scad>
|
||||
use <bottom-panel-overhang-right.scad>
|
||||
use <left-or-right-panel.scad>
|
||||
|
||||
module bottom_panel_middle() {
|
||||
module middle_overhang_panel() {
|
||||
intersection() {
|
||||
bottom_panel_left();
|
||||
bottom_panel_right();
|
||||
left_or_right_overhang_panel();
|
||||
mirror([1, 0, 0]) left_or_right_overhang_panel();
|
||||
}
|
||||
}
|
||||
|
||||
bottom_panel_middle();
|
||||
middle_overhang_panel();
|
||||
@@ -5,11 +5,11 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <top-panel-overhang-right-sega-2p-plus-one.scad>
|
||||
use <right-sega-2p-plus-one-panel.scad>
|
||||
|
||||
module top_panel_right_sega_2p_plus_one_with_mount() {
|
||||
top_panel_right_sega_2p_plus_one();
|
||||
module sega_2p_plus_one_with_mount_right_overhang_panel() {
|
||||
sega_2p_plus_one_right_overhang_panel();
|
||||
translate([30, -50, -(panel_z/2) - 3]) pcb_mount();
|
||||
}
|
||||
|
||||
top_panel_right_sega_2p_plus_one_with_mount();
|
||||
sega_2p_plus_one_with_mount_right_overhang_panel();
|
||||
@@ -6,7 +6,7 @@
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
|
||||
module top_panel_right_sega_2p_plus_one() {
|
||||
module sega_2p_plus_one_right_overhang_panel() {
|
||||
difference() {
|
||||
panel_with_raised_overhang();
|
||||
sega_2p_plus_one();
|
||||
@@ -14,4 +14,4 @@ module top_panel_right_sega_2p_plus_one() {
|
||||
}
|
||||
}
|
||||
|
||||
top_panel_right_sega_2p_plus_one();
|
||||
sega_2p_plus_one_right_overhang_panel();
|
||||
@@ -5,14 +5,14 @@
|
||||
|
||||
include <parameters.scad>
|
||||
include <components.scad>
|
||||
use <top-panel-overhang-right-sega-2p-plus-one-plus-control-with-mount.scad>
|
||||
use <right-sega-2p-plus-one-plus-control-panel-with-mount.scad>
|
||||
|
||||
module top_panel_right_sega_2p_plus_one_plus_control_with_mount_with_oled() {
|
||||
module sega_2p_plus_one_plus_control_right_overhang_panel_with_mount_with_oled() {
|
||||
difference() {
|
||||
top_panel_right_sega_2p_plus_one_plus_control_with_mount();
|
||||
sega_2p_plus_one_plus_control_right_overhang_panel_with_mount();
|
||||
translate([75, 77.5, 0]) oled_ssd1306_mount_cutout();
|
||||
}
|
||||
translate([75, 77.5, 0.5]) oled_ssd1306_mount();
|
||||
}
|
||||
|
||||
top_panel_right_sega_2p_plus_one_plus_control_with_mount_with_oled();
|
||||
sega_2p_plus_one_plus_control_right_overhang_panel_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 <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();
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user