Add Parts class to collect stand alone parts like knobs

This commit is contained in:
Florian Festi 2016-07-15 18:29:14 +02:00
parent d6bd708db5
commit a344211a09
2 changed files with 83 additions and 0 deletions

View File

@ -29,6 +29,7 @@ from boxes import edges
from boxes import formats
from boxes import gears
from boxes import pulley
from boxes import parts
### Helpers
@ -346,6 +347,7 @@ class Boxes:
# Gears
self.addPart(gears.Gears(self))
self.addPart(pulley.Pulley(self))
self.addPart(parts.Parts(self))
def adjustSize(self, l, e1=True, e2=True):
try:

81
boxes/parts.py Normal file
View File

@ -0,0 +1,81 @@
from math import *
def arcOnCircle(spanning_angle, outgoing_angle, r=1.0):
angle = spanning_angle+2*outgoing_angle
radius = r * sin(radians(0.5*spanning_angle))/sin(radians(180-outgoing_angle-0.5*spanning_angle))
return angle, abs(radius)
class Parts:
def __init__(self, boxes):
self.boxes = boxes
"""
def roundKnob(self, diameter, n=20, callback=None, move=""):
size = diameter+diameter/n+2*spacing
if self.move(size, size, move, before=True):
return
self.boxes.ctx.save()
self.moveTo(size/2, size/2)
self.cc(callback, None, 0, 0)
self.boxes.ctx.restore()
self.move(size, size, move, before=True)
"""
def __getattr__(self, name):
return getattr(self.boxes, name)
def disc(self, diameter, callback=None, move=""):
size = diameter+2*spacing
r = diameter/2.0
if self.move(size, size, move, before=True):
return
self.boxes.ctx.save()
self.moveTo(size/2, size/2)
self.cc(callback, None, 0, 0)
self.moveTo(r+self.burn,0, 90)
self.corner(360, r)
self.boxes.ctx.restore()
self.move(size, size, move, before=True)
def waivyKnob(self, diameter, n=20, angle=45, callback=None, move=""):
size = diameter+pi*diameter/n+2*self.boxes.spacing
if self.move(size, size, move, before=True):
return
self.boxes.ctx.save()
self.moveTo(size/2, size/2)
self.cc(callback, None, 0, 0)
self.moveTo(diameter/2, 0, angle)
a, r = arcOnCircle(360./n, angle, diameter/2)
a2, r2 = arcOnCircle(360./n, -angle, diameter/2)
for i in range(n//2):
self.boxes.corner(a, r)
self.boxes.corner(a2, r2)
self.boxes.ctx.restore()
self.move(size, size, move, before=True)
def concaveKnob(self, diameter, n=3, rounded=0.2, angle=70, callback=None, move=""):
size = diameter+2*self.boxes.spacing
if self.move(size, size, move, before=True):
return
self.boxes.ctx.save()
self.rectangularHole(size/2, size/2, size, size)
self.moveTo(size/2, size/2)
self.hole(0,0, 3)
self.hole(0,0, diameter/2)
self.cc(callback, None, 0, 0)
self.moveTo(diameter/2, 0, 90+angle)
a, r = arcOnCircle(360./n*(1-rounded), -angle, diameter/2)
print(360./n*(1-rounded), a, r)
if abs(a) < 0.01: # avoid trying to make a straight line as an arc
a, r = arcOnCircle(360./n*(1-rounded), -angle-0.01, diameter/2)
print(a, r)
for i in range(n):
self.boxes.corner(a, r)
self.corner(angle)
self.corner(360./n*rounded, diameter/2)
self.corner(angle)
self.boxes.ctx.restore()
self.move(size, size, move, before=True)