Skip to content

Commit

Permalink
add tuner_knob
Browse files Browse the repository at this point in the history
  • Loading branch information
bat52 committed Feb 6, 2025
1 parent a4ff06e commit fc6efdf
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 0 deletions.
90 changes: 90 additions & 0 deletions src/pylele/parts/tuner_knob.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#!/usr/bin/env python3

"""
Tuner Knob
"""

from math import sqrt, cos, sin, pi

import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '../../'))

from b13d.api.solid import Solid, test_loop, main_maker, Implementation
from b13d.api.core import Shape
from b13d.parts.pencil import Pencil

class TunerKnob(Solid):
""" Generate a Tunable Saddle """

def gen_parser(self, parser=None):
parser = super().gen_parser(parser=parser)
parser.add_argument("-d", "--knob_diameter", help="knob diameter [mm]", type=float, default=8)
parser.add_argument("-z", "--knob_height", help="knob height", type=float, default=16)
parser.add_argument("-rd", "--round_hole_diameter", help="round hole diameter", type=float, default=4.3)
parser.add_argument("-sd", "--square_hole_diam", help="squared hole size", type=float, default=3.6)
parser.add_argument("-gd", "--grip_diameter", help="grip hole diameter", type=float, default=1.5)
parser.add_argument("-ng", "--ngrip", help="number of grip holes", type=int, default=10)
return parser

def gen(self) -> Shape:
""" generate tuner knob """
# main knob
knob = self.api.cylinder_rounded_z(l=self.cli.knob_height,
rad=self.cli.knob_diameter/2,
domeRatio=0.5)

tol = self.api.tolerance()

# round hole
round_hole = self.api.cylinder_z(
l=self.cli.knob_height + tol,
rad=self.cli.round_hole_diameter/2
)

# squared hole
hole_sides = self.api.cylinder_z(
l=self.cli.knob_height + tol,
rad=self.cli.round_hole_diameter/2 + tol
)
hole_sides -= self.api.box(
self.cli.square_hole_diam,
self.cli.round_hole_diameter + 2*tol,
self.cli.knob_height + 2*tol,
)
hole_sides = hole_sides.intersection(knob.dup())

# grip
r = self.cli.knob_diameter/2
grip = None
for i in range(self.cli.ngrip):
grip_hole = self.api.cylinder_z(
l=self.cli.knob_height + tol,
rad=self.cli.grip_diameter/2
)
# calculate position
phi = 2*pi*i/self.cli.ngrip
xg = r * cos( phi )
yg = r * sin( phi )
grip_hole <<= (xg,yg,0)
grip = grip_hole + grip

return knob - round_hole + hole_sides - grip

def main(args=None):
""" Generate the tunable saddle """
return main_maker(module_name=__name__,
class_name='TunerKnob',
args=args)

def test_tuner_knob(self,apis=None):
""" Test Tuner Knob """
tests={'default':[]}
test_loop(module=__name__,tests=tests,apis=apis)

def test_tuner_knob_mock(self):
""" Test Tuner KNob Mock """
test_tuner_knob(self, apis=['mock'])

if __name__ == '__main__':
main()
1 change: 1 addition & 0 deletions src/pylele/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class PyleleTestMethods(unittest.TestCase):
from pylele.parts.tunable_bridge import test_tunable_bridge, test_tunable_bridge_mock
from pylele.parts.worm_gear import test_worm_gear, test_worm_gear_mock
from pylele.parts.worm_gear_holder import test_worm_gear_holder, test_worm_gear_holder_mock
from pylele.parts.tuner_knob import test_tuner_knob, test_tuner_knob_mock

## Pylele Individual Parts
from pylele.pylele2.frets import test_frets, test_frets_mock
Expand Down

0 comments on commit fc6efdf

Please sign in to comment.