8 Commits

Author SHA1 Message Date
f4c9c91d91 fix an issue with frame wall + small button screw-in space
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-07 14:25:09 -05:00
bbe1ab25d7 reorganize the READMEs a bit and put both in the .zip
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-07 11:13:03 -05:00
cb82933e50 docs updates for v4.4.1
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-07 10:37:05 -05:00
a1fc85c069 rename the overhang solo lever + 6 button and add a board mount
this makes it essentially the same as the inset panel, just as an
overhang variant

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-07 10:35:44 -05:00
850bbdf5b9 demo for the solo panel stick I'm working on
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-06 09:52:29 -05:00
7e42129594 add an inset solo panel, room for lever + 6 buttons + 2 aux
good for classic/mini consoles and MiSTer?

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-06 09:46:47 -05:00
66719f84c6 adjust solo lever + 6 button panel
this tested better and allows a bit of space for two aux buttons

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-06 09:33:50 -05:00
184664cceb tweak the area around button holes for screw-ins
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-06 09:26:00 -05:00
22 changed files with 128 additions and 1868 deletions

5
.gitignore vendored
View File

@@ -1,8 +1,3 @@
build/
venv/
*.egg-info/
.tox/
*.pyc
*.sw*
.coverage

View File

@@ -1,2 +0,0 @@
[MESSAGES CONTROL]
disable = W,C,R

View File

@@ -2,6 +2,35 @@
Included is a summary of changes to the project, by version. Details can be found in the commit history.
## v4.4.2
### Bugfixes
* Fix a regression with the small button screw-in space cutting into the frame wall supports. The screw-in space is
potentially more important for some nuts than the thickness of the frame wall supports, so the latter have been
thinned slightly.
## v4.4.1
### Features
* A new lever + Sega 2P 6 button panel has been added. The overhang version hadn't been updated in forever, but the
inset panel moved stuff around in a way that allowed a couple aux buttons to fit in, so those have been added to the
overhang panel as well.
* A horizontal stripe frame windowed piece has been added. YMMV may vary a bit on this vs. an empty window --- you can
see less of the inner object with the stripes, but it's a bit more stable.
### Improvements
* The frame wall slashes have been made a bit more reusable.
* The area around button holes for screw-ins has been tweaked to be a bit smaller for 30mm buttons and a bit larger for
24mm buttons.
### Miscellaneous
* A bottom overhang panel was positioned incorrectly in the demo file; this has been fixed.
* Added a demo of the one-panel overhang lever + 6 button stick.
## v4.4.0
### Features

View File

@@ -1,7 +1,8 @@
all:
python build.py
mkdir -p ./build/docs
cp ./docs/README-objects.md ./build/README.md
cp ./README.md ./build/README.md
cp ./docs/README-objects.md ./build/README-objects.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

View File

@@ -67,6 +67,9 @@ about what the types of parts are and how to use them:
* 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. Additional documentation regarding assembling the stick is available
in `docs/assembly-and-tips.md`.
## 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
@@ -161,12 +164,13 @@ to hang out and discuss issues and features and whatnot.
Written by and copyright Brian S. Stephan (<bss@incorporeal.org>).
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 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.
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/>.

View File

@@ -5,3 +5,7 @@ Notes for "next time".
## v4.x
* Engraving some cosmetic stuff? Or maybe a place to mount other plates on the top?
## v5
* Finishing the build123d rewrite?

View File

@@ -0,0 +1,28 @@
/*
* 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/lever-and-sega-2p-6-button-panel-with-aux-with-mount.scad>
use <misc/dustwasher-jlf.scad>
top_panel_color = "#5B6579";
bottom_panel_color = "#8E9089";
frame_top_bottom_color = "#8E9089";
frame_side_color = "#8E9089";
top_deco_color = "#000000";
color(top_panel_color) translate([0, 0, frame_z/2-panel_z+0.01]) lever_and_sega_2p_6_button_panel_with_aux_with_mount();
color(frame_side_color) translate([0, 0, -2.5]) extra_extended_left_or_right_frame_piece();
color(frame_side_color) translate([0, 0, -2.5]) mirror([1, 0, 0]) extra_extended_left_or_right_frame_piece();
color(frame_top_bottom_color) translate([0, 0, -2.5]) extended_front_or_back_frame_piece();
color(frame_top_bottom_color) translate([0, 0, -2.5]) rotate([180, 0, 0]) front_or_back_aux_and_neutrik_box_frame_piece_for_extended_side();
color(bottom_panel_color) translate([0, 0, -5-frame_z/2+5]) panel();
color(top_deco_color) translate([-65, 5, 3+frame_z/2-panel_z]) jlf_dustwasher();

View File

@@ -1,54 +1,11 @@
# The Buildable Stick System
Files for 3D printing an arcade stick.
Files for 3D printing an arcade stick. See `README.md` for the core documentation, this file is specific to distributed
objects.
## Objects
## Attribution
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
### Author and Licensing
Written by and copyright Brian S. Stephan (<bss@incorporeal.org>).
@@ -71,9 +28,13 @@ 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
### Distributing BSS Sticks
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/).
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].

View File

@@ -1,53 +0,0 @@
[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

View File

@@ -1,644 +0,0 @@
#
# 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

View File

@@ -1,295 +0,0 @@
#
# 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

View File

@@ -1,508 +0,0 @@
#
# 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

View File

@@ -1,89 +0,0 @@
#
# 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

View File

@@ -1 +0,0 @@
"""The Buildable Stick System, code to generate arcade stick components."""

View File

@@ -1,68 +0,0 @@
"""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)

View File

@@ -1,31 +0,0 @@
"""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)

View File

@@ -1,45 +0,0 @@
"""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

View File

@@ -28,10 +28,9 @@ module panel_holes() {
// for snap-ins, etc.
module button_24mm_hole() {
cylinder(r=small_button_radius, h=100, $fn=50, center=true);
// carve out space for snap-ins, leave 3mm
// slagcoin has screw-in nut diameter at 29.5mm, so radius+3 to leave some space
// carve out space for snap-ins and screw-in nuts
// translation is to leave 3mm thickness in the plate without recentering anything
translate([0, 0, -25]) cylinder(r=small_button_radius+3, h=49, $fn=50, center=true);
translate([0, 0, -25]) cylinder(r=small_button_radius+button_radius_connector_space, h=49, $fn=50, center=true);
// space for decorative button surround stuff
translate([0, 0, 50]) cylinder(r=small_button_radius*decorative_radius_scale, h=20, $fn=50, center=true);
translate([0, 0, 70]) cylinder(r=small_button_radius*jumbo_decorative_radius_scale, h=20, $fn=50, center=true);
@@ -41,10 +40,9 @@ module button_24mm_hole() {
// for snap-ins, etc.
module button_30mm_hole() {
cylinder(r=big_button_radius, h=100, $fn=50, center=true);
// carve out space for snap-ins, leave 3mm
// slagcoin has screw-in nut diameter at 36mm, so radius+6 to leave some space
// carve out space for snap-ins and screw-in nuts
// translation is to leave 3mm thickness in the plate without recentering anything
translate([0, 0, -25]) cylinder(r=big_button_radius+6, h=49, $fn=50, center=true);
translate([0, 0, -25]) cylinder(r=big_button_radius+button_radius_connector_space, h=49, $fn=50, center=true);
// space for decorative button surround stuff
translate([0, 0, 50]) cylinder(r=big_button_radius*decorative_radius_scale, h=20, $fn=50, center=true);
translate([0, 0, 70]) cylinder(r=big_button_radius*jumbo_decorative_radius_scale, h=20, $fn=50, center=true);
@@ -82,7 +80,7 @@ module rocker_20mm_mount() {
// 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*3)], center=true);
cube([35, 8, frame_z-(panel_z*3)], center=true);
}
// bank of three 24mm buttons, commonly on a frame face

View File

@@ -0,0 +1,25 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module lever_and_sega_2p_6_button_panel_with_aux_with_mount() {
difference() {
union() {
panel();
translate([45, -58, -panel_z/2]) rotate([0, 0, 13]) pcb_mount();
}
translate([90, -25, 0]) sega_2p_6_button();
translate([-65, 5, 0]) union() {
levermountholes();
levermountcountersinks();
}
translate([17, 70, 0]) button_24mm_hole();
translate([-17, 70, 0]) button_24mm_hole();
}
}
lever_and_sega_2p_6_button_panel_with_aux_with_mount();

View File

@@ -8,13 +8,17 @@ include <components.scad>
module lever_and_sega_2p_6_button_solo_overhang_panel() {
difference() {
// base plate
union() {
panel_with_raised_overhang();
translate([-60, 18, -((panel_z/2)+(lever_mount_z/2))]) levermountbase();
translate([45, -58, -panel_z/2]) rotate([0, 0, 13]) pcb_mount();
}
translate([95, -20, 0]) sega_2p_6_button();
translate([-60, 18, 0]) levermountholes();
translate([90, -25, 0]) sega_2p_6_button();
translate([-65, 5, 0]) union() {
levermountholes();
levermountcountersinks();
}
translate([17, 70, 0]) button_24mm_hole();
translate([-17, 70, 0]) button_24mm_hole();
}
}

View File

@@ -23,6 +23,11 @@ small_button_radius = 12 + hole_tolerance;
// 30mm button
big_button_radius = 15 + hole_tolerance;
// carve out space around buttons 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_radius_connector_space = 5;
// JLF mount dimensions
lever_mount_x = 53;
lever_mount_y = 95;

58
tox.ini
View File

@@ -1,58 +0,0 @@
# tox (https://tox.readthedocs.io/) is a tool for running tests
# in multiple virtualenvs. This configuration file will run the
# test suite on all supported python versions. To use it, "pip install tox"
# and then run "tox" from this directory.
[tox]
isolated_build = true
envlist = begin,py311,coverage,bandit,lint,reuse
[testenv]
allow_externals = pytest, coverage
deps =
-rrequirements/requirements-dev.txt
[testenv:begin]
# clean up potential previous coverage runs
skip_install = true
commands = coverage erase
[testenv:py311]
# run pytest with coverage
commands =
pytest --cov-append --cov={envsitepackagesdir}/bss/ --cov-branch
[testenv:coverage]
# report on coverage runs from above
skip_install = true
commands =
coverage report --fail-under=90 --show-missing
[testenv:bandit]
commands =
bandit ./src/bss/ -r
[testenv:lint]
# run style checks
commands =
flake8
mypy src/bss
- flake8 --disable-noqa --ignore= --select=E,W,F,C,D,A,G,B,I,T,M,DUO
[testenv:reuse]
# check license documentation
commands =
reuse lint
[coverage:paths]
source =
./
.tox/**/site-packages/
[coverage:run]
branch = True
omit =
**/_version.py
**/proto_snapshot/*