From 01af694fee35962ba574cb076dc50218e92831f2 Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Sat, 20 Jul 2013 10:49:45 +0200 Subject: [PATCH] Make Edges and their settings callable objects Hexholes, grip and latch still need to be converted --- box.py | 14 +- boxes.py | 628 ++++++++++++++++++++++++++++++++--------------- flexbox.py | 30 +-- flexbox2.py | 18 +- lamp.py | 91 ++++--- silverwarebox.py | 24 +- 6 files changed, 523 insertions(+), 282 deletions(-) diff --git a/box.py b/box.py index 1be0070..526ce15 100755 --- a/box.py +++ b/box.py @@ -15,21 +15,17 @@ class Box(Boxes): d3 = Bolts(3) self.moveTo(t, t) - self.rectangularWall(x, h, "FfeF", bedBolts=[d2]) - self.moveTo(x+3*t, 0) + self.rectangularWall(x, h, "FfeF", bedBolts=[d2], move="right") + self.rectangularWall(y, h, "FfeF", bedBolts=[d3], move="up") self.rectangularWall(y, h, "FfeF", bedBolts=[d3]) - self.moveTo(-x-3*t, h+3*t) - - self.rectangularWall(x, h, "FfeF", bedBolts=[d2]) - self.moveTo(x+3*t, 0) - self.rectangularWall(y, h, "FfeF", bedBolts=[d3]) - self.moveTo(-x-2*t, h+5*t) + self.rectangularWall(x, h, "FfeF", bedBolts=[d2], move="left up") self.rectangularWall(x, y, "ffff", bedBolts=[d2, d3, d2, d3]) self.ctx.stroke() self.surface.flush() - + self.surface.finish() b = Box(100, 150, 70) +b.edges["f"].settings.setValues(b.thickness, space=3, finger=2) b.render() diff --git a/boxes.py b/boxes.py index f3c0fb9..39839c5 100755 --- a/boxes.py +++ b/boxes.py @@ -61,19 +61,339 @@ class Bolts(BoltPolicy): #print pos, result, ((float(pos)*(self.bolts+1)/self.fingers)-0.01), ((float(pos+1)*(self.bolts+1)/self.fingers)-0.01) return result + +############################################################################# +### Settings +############################################################################# + +class Settings: + absolute_params = { } + relative_params = { } + + def __init__(self, thickness, relative=True, **kw): + self.values = self.absolute_params.copy() + + factor = 1.0 + if relative: + factor = thickness + for name, value in self.relative_params.iteritems(): + self.values[name] = value * factor + self.setValues(thickness, relative, **kw) + + def setValues(self, thickness, relative=True, **kw): + factor = 1.0 + if relative: + factor = thickness + for name, value in kw.iteritems(): + if name in self.absolute_params: + self.values[name] = value + elif name in self.relative_params: + self.values[name] = value * factor + else: + raise ValueError, "Unknown parameter for %s: %s" % ( + self.__class__.__name__, name) + + def __getattr__(self, name): + return self.values[name] + +############################################################################# +### Edges +############################################################################# + + +class Edge: + char = 'e' + + def __init__(self, boxes, settings): + self.boxes = boxes + self.ctx = boxes.ctx + self.settings = settings + + def __getattr__(self, name): + """Hack for using unalter code form Boxes class""" + return getattr(self.boxes, name) + + def __call__(self, length, **kw): + self.ctx.move_to(0,0) + self.ctx.line_to(length, 0) + self.ctx.translate(*self.ctx.get_current_point()) + + def width(self): + return 0.0 + + def margin(self): + return self.boxes.spacing + + def spacing(self): + return self.width() + self.margin() + + def startAngle(self): + return 0.0 + + def endAngle(self): + return 0.0 + +class OutSetEdge(Edge): + char = 'E' + + def width(self): + return self.boxes.thickness + + +class FingerJointSettings(Settings): + relative_params = { + "space" : 1.0, + "finger" : 1.0, + } + +class FingerJointEdge(Edge): + char = 'f' + positive = True + + def __call__(self, length, + bedBolts=None, bedBoltSettings=None, **kw): + positive = self.positive + space, finger = self.settings.space, self.settings.finger + + fingers = int((length-space) // (space+finger)) + if bedBolts: + fingers = bedBolts.numFingers(fingers) + leftover = length - fingers*(space+finger) - space + s, f, thickness = space, finger, self.thickness + d, d_nut, h_nut, l, l1 = bedBoltSettings or self.bedBoltSettings + p = 1 if positive else -1 + + self.edge(leftover/2.0) + for i in xrange(fingers): + if not positive and bedBolts and bedBolts.drawBolt(i): + self.hole(0.5*space, + 0.5*self.thickness, 0.5*d) + if positive and bedBolts and bedBolts.drawBolt(i): + self.bedBoltHole(s, bedBoltSettings) + else: + self.edge(s) + self.corner(-90*p) + self.edge(thickness) + self.corner(90*p) + self.edge(f) + self.corner(90*p) + self.edge(thickness) + self.corner(-90*p) + self.edge(s+leftover/2.0) + + def margin(self): + return self.boxes.spacing + self.boxes.thickness + +class FingerJointEdgeCounterPart(FingerJointEdge): + char = 'F' + positive = False + + def width(self): + return self.boxes.thickness + + def margin(self): + return self.boxes.spacing + +class FingerHoleEdge(Edge): + char = 'h' + + def __call__(self, length, dist=None, + bedBolts=None, bedBoltSettings=None, **kw): + if dist is None: + dist = self.fingerHoleEdgeWidth * self.thickness + self.ctx.save() + self.moveTo(0, dist+self.thickness/2) + self.fingerHoles(length, bedBolts, bedBoltSettings) + self.ctx.restore() + # XXX continue path + self.ctx.move_to(0, 0) + self.ctx.line_to(length, 0) + self.ctx.translate(*self.ctx.get_current_point()) + + def width(self): + return (self.fingerHoleEdgeWidth+1) * self.thickness + +class DoveTailSettings(Settings): + absolute_params = { + "angle" : 50, + } + relative_params = { + "size" : 3, + "depth" : 1.5, + "radius" : 0.2, + } + +class DoveTailJoint(Edge): + char = 'd' + positive = True + + def __call__(self, length, **kw): + s = self.settings + radius = max(s.radius, self.boxes.burn) # no smaller than burn + positive = self.positive + a = s.angle + 90 + alpha = 0.5*math.pi - math.pi*s.angle/180.0 + + l1 = radius/math.tan(alpha/2.0) + diffx = 0.5*s.depth/math.tan(alpha) + l2 = 0.5*s.depth / math.sin(alpha) + + sections = int((length) // (s.size*2)) + leftover = length - sections*s.size*2 + + p = 1 if positive else -1 + + self.edge((s.size+leftover)/2.0+diffx-l1) + for i in xrange(sections): + self.corner(-1*p*a, radius) + self.edge(2*(l2-l1)) + self.corner(p*a, radius) + self.edge(2*(diffx-l1)+s.size) + self.corner(p*a, radius) + self.edge(2*(l2-l1)) + self.corner(-1*p*a, radius) + if i