Skip to content

Commit

Permalink
add pylele_neck_assembly
Browse files Browse the repository at this point in the history
  • Loading branch information
bat52 committed Aug 6, 2024
1 parent e91ade6 commit 851b5c7
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 2 deletions.
99 changes: 99 additions & 0 deletions pylele_neck_assembly.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#!/usr/bin/env python3

"""
Pylele Neck Assembly
"""

import os
from pylele_api import Shape
from pylele_base import LeleBase
from pylele_spines import LeleSpines
from pylele_fretboard_spines import LeleFretboardSpines
from pylele_head import LeleHead
from pylele_neck_joint import LeleNeckJoint
from pylele_neck import LeleNeck
from pylele_fretboard import LeleFretboard
from pylele_fretboard_assembly import LeleFretboardAssembly, pylele_fretboard_assembly_parser, FretType, NutType

class LeleNeckAssembly(LeleBase):
""" Pylele Neck Assembly Generator class """

def gen(self) -> Shape:
""" Generate Neck Assembly """

spCut = LeleSpines(cli=self.cli, isCut=True).mv(0, 0, self.cfg.joinCutTol)\
if self.cfg.numStrs > 1 else None
fbspCut = LeleFretboardSpines(cli=self.cli, isCut=True).mv(0, 0, -self.cfg.joinCutTol) \
if self.cfg.sepFretbd or self.cfg.sepNeck or self.cfg.sepTop else None
fbCut = LeleFretboard(cli=self.cli, isCut=True).mv(0, 0, -self.cfg.joinCutTol) if self.cfg.sepFretbd or self.cfg.sepTop else None
fretbd = LeleFretboardAssembly(cli=self.cli)

#f0Cut = Frets(cfg, isCut=True) \
# if cfg.sepFretbd or cfg.sepTop else None
neckJoiners = [LeleHead(cli=self.cli)]
neckCutters = []

if self.cfg.sepFretbd:
neckCutters.append(fbCut)
self.add_part(fretbd)
else:
neckJoiners.append(fretbd)

neckCutters.append(spCut)

if self.cfg.sepNeck:
neckJoiners.append(LeleNeckJoint(cli=self.cli, isCut=False))

if self.cfg.sepFretbd or self.cfg.sepTop:
neckCutters.extend([fbspCut])
# neckCutters.append(strCuts)

neck = LeleNeck(cli=self.cli,
joiners=neckJoiners,
cutters=neckCutters)

fretbd.gen_full()
self.add_parts(fretbd.get_parts())

self.shape = neck.gen_full()
return self.shape

def gen_parser(self,parser=None):
"""
pylele Command Line Interface
"""
return super().gen_parser( parser=pylele_fretboard_assembly_parser(parser=parser) )

def neck_assembly_main(args=None):
""" Generate Neck Assembly """
solid = LeleNeckAssembly(args=args)
solid.export_args() # from cli
solid.export_configuration()
solid.exportSTL()
return solid

def test_neck_assembly():
""" Test Neck Assembly """

component = 'neck_assembly'
tests = {
'cadquery' : ['-i','cadquery'],
'blender' : ['-i','blender'],
'fret_nails' : ['-ft', str(FretType.NAIL)],
'zerofret' : ['-nt', str(NutType.ZEROFRET)],
'separate_neck' : ['-N'],
'separate_fretboard' : ['-F'],
'separate_nut' : ['-NU'],
'separate_frets' : ['-FR'],
'separate_all' : ['-N','-FR','-NU','-F'],
}

for test,args in tests.items():
print(f'# Test {component} {test}')
outdir = os.path.join('./test',component,test)
args += ['-o', outdir]
# print(args)
neck_assembly_main(args=args)

if __name__ == '__main__':
neck_assembly_main()
13 changes: 11 additions & 2 deletions pylele_solid.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,16 @@ def check_has_api(self):

def has_parts(self) -> bool:
""" Return True if Solid is an assembly with a list of parts attribute """
if hasattr(self, 'parts') and not self.shape is None:
if hasattr(self, 'parts') and isinstance(self.parts,list):
return True
return False

def get_parts(self) -> list:
""" Returns the parts lists of an assembly """
if self.has_parts():
return self.parts
return []

def add_part(self,part):
""" Add a solid part to the parts list of this assembly """
assert isinstance(part, LeleSolid)
Expand All @@ -104,6 +110,9 @@ def add_part(self,part):
else:
self.parts = [part]

if part.has_parts():
self.parts += part.parts

def add_parts(self,parts):
""" Add a list of solid parts to the parts list of this assembly """
assert isinstance(parts, list)
Expand Down Expand Up @@ -237,7 +246,7 @@ def exportSTL(self, out_path=None) -> None:
if self.has_parts():
# this is an assembly, generate other parts
for part in self.parts:
assert isinstance(part,LeleSolid)
assert isinstance(part,LeleSolid), f'Wrong instance class {part}'
part.exportSTL(out_path=out_path)

def filletByNearestEdges(
Expand Down
5 changes: 5 additions & 0 deletions pylele_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@

# assemblies
from pylele_fretboard_assembly import test_fretboard_assembly
from pylele_neck_assembly import test_neck_assembly

def make_api_path_and_filename(api_name,test_path='./test'):
""" Makes Test API folder and filename """
Expand Down Expand Up @@ -168,6 +169,10 @@ def test_tail(self):
def test_fretboard_assembly(self):
""" Test Fretboard Assembly """
test_fretboard_assembly()

def test_neck_assembly(self):
""" Test Neck Assembly """
test_neck_assembly()

if __name__ == '__main__':
unittest.main()

0 comments on commit 851b5c7

Please sign in to comment.