diff --git a/boxes/Color.py b/boxes/Color.py index d16940a..884c12b 100644 --- a/boxes/Color.py +++ b/boxes/Color.py @@ -1,12 +1,16 @@ class Color: - BLACK = [ 0.0, 0.0, 0.0 ] - BLUE = [ 0.0, 0.0, 1.0 ] - GREEN = [ 0.0, 1.0, 0.0 ] - RED = [ 1.0, 0.0, 0.0 ] - WHITE = [ 1.0, 1.0, 1.0 ] + BLACK = [ 0.0, 0.0, 0.0 ] + BLUE = [ 0.0, 0.0, 1.0 ] + GREEN = [ 0.0, 1.0, 0.0 ] + RED = [ 1.0, 0.0, 0.0 ] + CYAN = [ 0.0, 1.0, 1.0 ] + YELLOW = [ 1.0, 1.0, 0.0 ] + MAGENTA = [ 1.0, 0.0, 1.0 ] + WHITE = [ 1.0, 1.0, 1.0 ] # TODO: Make this configurable OUTER_CUT = BLACK INNER_CUT = BLUE ANNOTATIONS = RED ETCHING = GREEN + ETCHING_DEEP = CYAN diff --git a/boxes/edges.py b/boxes/edges.py index 97f67f3..7efad96 100644 --- a/boxes/edges.py +++ b/boxes/edges.py @@ -1608,7 +1608,7 @@ class CabinetHingeEdge(BaseEdge): th = 4*e+3*t+self.boxes.spacing tw = max(e, 2*t) * pairs - if self.move(tw, th, move, True): + if self.move(tw, th, move, True, label="hinges"): return if self.settings.style == "outside": @@ -1631,7 +1631,7 @@ class CabinetHingeEdge(BaseEdge): 90, t, 90, (ax+t)-e, -90, l-3*t, (90, e)) self.moveTo(2*max(e, 1.5*t) + self.boxes.spacing) - self.move(tw, th, move) + self.move(tw, th, move, label="hinges") return if e <= 2*t: @@ -1651,7 +1651,7 @@ class CabinetHingeEdge(BaseEdge): if i % 2: self.moveTo(2*max(e, 2*t) + 2*self.boxes.spacing) - self.move(th, tw, move) + self.move(th, tw, move, label="hinges") ############################################################################# #### Slide-on lid diff --git a/boxes/generators/bintray.py b/boxes/generators/bintray.py index 682ebd0..e0760a8 100644 --- a/boxes/generators/bintray.py +++ b/boxes/generators/bintray.py @@ -117,28 +117,28 @@ class BinTray(Boxes): # outer walls e = ["F", "f", edges.SlottedEdge(self, self.sx[::-1], "G"), "f"] - self.rectangularWall(x, h, e, callback=[self.xHoles], move="right") - self.rectangularWall(y, h, "FFbF", callback=[self.yHoles, ], move="up") - self.rectangularWall(y, h, "FFbF", callback=[self.yHoles, ]) - self.rectangularWall(x, h, "Ffef", callback=[self.xHoles, ], move="left") + self.rectangularWall(x, h, e, callback=[self.xHoles], move="right", label="bottom") + self.rectangularWall(y, h, "FFbF", callback=[self.yHoles, ], move="up", label="left") + self.rectangularWall(y, h, "FFbF", callback=[self.yHoles, ], label="right") + self.rectangularWall(x, h, "Ffef", callback=[self.xHoles, ], move="left", label="top") self.rectangularWall(y, h, "FFBF", move="up only") # floor - self.rectangularWall(x, y, "ffff", callback=[self.xSlots, self.ySlots],move="right") + self.rectangularWall(x, y, "ffff", callback=[self.xSlots, self.ySlots],move="right", label="back") # Inner walls for i in range(len(self.sx) - 1): e = [edges.SlottedEdge(self, self.sy, "f"), "f", "B", "f"] - self.rectangularWall(y, hi, e, move="up") + self.rectangularWall(y, hi, e, move="up", label="inner vertical " + str(i+1)) for i in range(len(self.sy) - 1): e = [edges.SlottedEdge(self, self.sx, "f", slots=0.5 * hi), "f", edges.SlottedEdge(self, self.sx[::-1], "G"), "f"] - self.rectangularWall(x, hi, e, move="up") + self.rectangularWall(x, hi, e, move="up", label="inner horizontal " + str(i+1)) # Front walls for i in range(len(self.sy)): e = [edges.SlottedEdge(self, self.sx, "g"), "F", "e", "F"] - self.rectangularWall(x, self.sy[i]*self.front*2**0.5, e, callback=[self.frontHoles(i)], move="up") + self.rectangularWall(x, self.sy[i]*self.front*2**0.5, e, callback=[self.frontHoles(i)], move="up", label="retainer " + str(i+1)) diff --git a/boxes/generators/storageshelf.py b/boxes/generators/storageshelf.py index 7cc30d4..96c226e 100644 --- a/boxes/generators/storageshelf.py +++ b/boxes/generators/storageshelf.py @@ -31,7 +31,7 @@ class StorageShelf(_TopEdge): "top_edge") self.argparser.add_argument( "--retainer", action="store", type=float, default=0.0, - help="height of wall atthe front edges") + help="height of retaining wall at the front edges") self.argparser.add_argument( "--retainer_hole_edge", action="store", type=boolarg, default=False, help="use finger hole edge for retainer walls") @@ -92,15 +92,15 @@ class StorageShelf(_TopEdge): # outer walls # XXX retainer - self.rectangularWall(x, h, [b, "F", t1, "e"], callback=[None, self.hHoles, ], move="up") - self.rectangularWall(x, h, [b, "e", t3, "F"], callback=[None, self.hHoles, ], move="up") + self.rectangularWall(x, h, [b, "F", t1, "e"], callback=[None, self.hHoles, ], move="up", label="left") + self.rectangularWall(x, h, [b, "e", t3, "F"], callback=[None, self.hHoles, ], move="up", label="right") # floor if b != "e": e = "fffe" if self.retainer: e = "ffff" - self.rectangularWall(x, y, e, callback=[None, self.yHoles], move="up") + self.rectangularWall(x, y, e, callback=[None, self.yHoles], move="up", label="bottom") # inner walls @@ -111,22 +111,22 @@ class StorageShelf(_TopEdge): if self.retainer: e[3] = "f" - self.rectangularWall(x, y, e, move="up") + self.rectangularWall(x, y, e, move="up", label="inner horizontal " + str(i+1)) # top / lid if self.closedtop: e = "FFFe" if self.top_edge == "f" else "fffe" - self.rectangularWall(x, y, e, callback=[None, self.yHoles, ], move="up") + self.rectangularWall(x, y, e, callback=[None, self.yHoles, ], move="up", label="top") else: self.drawLid(x, y, self.top_edge) self.ctx.restore() - self.rectangularWall(x, h, "ffff", move="right only") + self.rectangularWall(x, h, "ffff", move="right only", label="invisible") # y walls # outer walls - self.rectangularWall(y, h, [b, "f", t2, "f"], callback=[self.ySlots, self.hSlots,], move="up") + self.rectangularWall(y, h, [b, "f", t2, "f"], callback=[self.ySlots, self.hSlots,], move="up", label="back") # inner walls for i in range(len(self.sy) - 1): @@ -135,7 +135,7 @@ class StorageShelf(_TopEdge): "e", "f"] if self.closedtop: e = [be, edges.SlottedEdge(self, self.sh, "e", slots=0.5 * x),"f", "f"] - self.rectangularWall(x, h, e, move="up") + self.rectangularWall(x, h, e, move="up", label="inner vertical " + str(i+1)) if self.retainer: @@ -144,4 +144,4 @@ class StorageShelf(_TopEdge): e = "FEeE" if self.retainer_hole_edge or (i == 0 and b == "h"): e = "hEeE" - self.rectangularWall(y, self.retainer, e, move="up") + self.rectangularWall(y, self.retainer, e, move="up", label="retainer " + str(i+1)) diff --git a/boxes/generators/trafficlight.py b/boxes/generators/trafficlight.py index 2d9e4cf..2ba76ea 100644 --- a/boxes/generators/trafficlight.py +++ b/boxes/generators/trafficlight.py @@ -85,13 +85,13 @@ When turned by 90°, it can be also used to create a bottle holder.""" def frontCB(self): self.hole(self.h/2, self.h/2, self.h/2-self.thickness) - def wall(self, h1, h2, w, edges="ffef", callback=None, move=""): + def wall(self, h1, h2, w, edges="ffef", callback=None, move="", label = ""): edges = [self.edges.get(e, e) for e in edges] edges += edges # append for wrapping around overallwidth = w + edges[-1].spacing() + edges[1].spacing() overallheight = max(h1, h2) + edges[0].spacing() + edges[2].spacing() - if self.move(overallwidth, overallheight, move, before=True): + if self.move(overallwidth, overallheight, move, before=True, label= label): return a = math.atan((h2-h1)/float(w)) @@ -112,7 +112,7 @@ When turned by 90°, it can be also used to create a bottle holder.""" edges[3](h1) self.edgeCorner(edges[3], edges[3 + 1], 90) - self.move(overallwidth, overallheight, move) + self.move(overallwidth, overallheight, move, label = label) def render(self): # adjust to the variables you want in the local scope @@ -126,44 +126,44 @@ When turned by 90°, it can be also used to create a bottle holder.""" self.addPart(ShadyEdge(self, None)) # back - self.rectangularWall(th, h, "FFFF", callback=[self.backCB], move="up") + self.rectangularWall(th, h, "FFFF", callback=[self.backCB], move="up", label = "back") if self.upright: # sides - self.rectangularWall(th, d, "fFsF", callback=[self.sideCB], move="up") - self.rectangularWall(th, d, "fFsF", callback=[self.sideCB], move="up") + self.rectangularWall(th, d, "fFsF", callback=[self.sideCB], move="up", label = "left") + self.rectangularWall(th, d, "fFsF", callback=[self.sideCB], move="up", label = "right") # horizontal Walls / blinds tops e = edges.CompoundEdge(self, "fF", (d, s)) e2 = edges.CompoundEdge(self, "Ff", (s, d)) for i in range(n): self.rectangularWall(h, d+s, ['f', e, 'e', e2], - move="right" if i<n-1 else "right up") + move="right" if i<n-1 else "right up", label="horizontal Wall " + str(i+1)) else: # bottom self.rectangularWall(th, d, "fFeF", callback=[self.sideCB], - move="up") + move="up", label="bottom") # top self.rectangularWall(th, d+s, "fFeF", callback=[self.topCB], - move="up") + move="up", label="top") # vertical walls for i in range(n): - self.wall(d, d+s, h, move="right" if i<n-1 else "right up") + self.wall(d, d+s, h, move="right" if i<n-1 else "right up", label="vertical wall " + str(i+1)) # fronts for i in range(n): self.rectangularWall(h, h, "efef", callback=[self.frontCB], - move="left" if i<n-1 else "left up") + move="left" if i<n-1 else "left up", label="front " + str(i+1)) if self.upright: # bottom wall - self.rectangularWall(h, d, "ffef", move="up") + self.rectangularWall(h, d, "ffef", move="up", label="bottom wall") else: # vertical wall - self.wall(d, d+s, h, move="up") + self.wall(d, d+s, h, move="up", label="vertical wall") # Colored windows for i in range(n): - self.parts.disc(h-2*t, move="right") + self.parts.disc(h-2*t, move="right", label="colored window " + str(i+1)) diff --git a/boxes/generators/ubox.py b/boxes/generators/ubox.py index 77dbebc..dc4fc5b 100644 --- a/boxes/generators/ubox.py +++ b/boxes/generators/ubox.py @@ -37,14 +37,14 @@ class UBox(_TopEdge, _ChestLid): help="additional lid") self.angle = 0 - def U(self, x, y, r, edge="e", move=None): + def U(self, x, y, r, edge="e", move=None, label=""): e = self.edges.get(edge, edge) w = self.edges["f"].spacing() tw = x+2*w th = y+w+e.spacing() - if self.move(tw, th, move, True): + if self.move(tw, th, move, True, label=label): return self.moveTo(w+r, w) @@ -57,9 +57,9 @@ class UBox(_TopEdge, _ChestLid): self.edges["f"](y-r) self.corner(90, r) - self.move(tw, th, move) + self.move(tw, th, move, label=label) - def Uwall(self, x, y, h, r, edges="ee", move=None): + def Uwall(self, x, y, h, r, edges="ee", move=None, label=""): e = [self.edges.get(edge, edge) for edge in edges] @@ -68,7 +68,7 @@ class UBox(_TopEdge, _ChestLid): tw = 2*y + x - 4*(cl-r) + e[0].spacing() + e[1].spacing() th = h + 2*w - if self.move(tw, th, move, True): + if self.move(tw, th, move, True, label=label): return self.moveTo(e[0].spacing()) @@ -86,7 +86,7 @@ class UBox(_TopEdge, _ChestLid): e[nr](h) self.edgeCorner(e[nr], "F") - self.move(tw, th, move) + self.move(tw, th, move, label=label) def render(self): x, y, h, r = self.x, self.y, self.h, self.radius @@ -96,10 +96,10 @@ class UBox(_TopEdge, _ChestLid): t1, t2, t3, t4 = self.topEdges(self.top_edge) - self.U(x, y, r, t1, move="right") - self.U(x, y, r, t3, move="up") - self.U(x, y, r, t3, move="left only") - self.Uwall(x, y, h, r, [t2, t4], move="up") + self.U(x, y, r, t1, move="right", label="left") + self.U(x, y, r, t3, move="up", label="right") + self.U(x, y, r, t3, move="left only", label="invisible") + self.Uwall(x, y, h, r, [t2, t4], move="up", label="wall") self.drawLid(x, h, self.top_edge) self.drawAddOnLid(x, h, self.lid) diff --git a/boxes/generators/universalbox.py b/boxes/generators/universalbox.py index 42cb876..35407f4 100644 --- a/boxes/generators/universalbox.py +++ b/boxes/generators/universalbox.py @@ -80,29 +80,29 @@ class UniversalBox(_TopEdge, _ChestLid): with self.saved_context(): self.rectangularWall(x, h, [b, sideedge, t1, sideedge], ignore_widths=[1, 6], - bedBolts=[d2], move="up") + bedBolts=[d2], move="up", label="left") self.rectangularWall(x, h, [b, sideedge, t3, sideedge], ignore_widths=[1, 6], - bedBolts=[d2], move="up") + bedBolts=[d2], move="up", label="right") if self.bottom_edge != "e": - self.rectangularWall(x, y, "ffff", bedBolts=[d2, d3, d2, d3], move="up") + self.rectangularWall(x, y, "ffff", bedBolts=[d2, d3, d2, d3], move="up", label="bottom") if self.top_edge in "fF": - self.set_source_color(Color.RED) + self.set_source_color(Color.MAGENTA) # I don't know why this part has a different color, but RED is not a good choice because RED is used for annotations self.rectangularWall(x+4*t, y+4*t, callback=[ - lambda:self.top_hole(x, y, self.top_edge)], move="up") + lambda:self.top_hole(x, y, self.top_edge)], move="up", label="top hole") self.set_source_color(Color.BLACK) self.drawLid(x, y, self.top_edge, [d2, d3]) self.drawAddOnLid(x, y, self.lid) self.rectangularWall(x, h, [b, sideedge, t3, sideedge], ignore_widths=[1, 6], - bedBolts=[d2], move="right only") + bedBolts=[d2], move="right only", label="invisible") self.rectangularWall(y, h, [b, "f", t2, "f"], ignore_widths=[1, 6], - bedBolts=[d3], move="up") + bedBolts=[d3], move="up", label="back") self.rectangularWall(y, h, [b, "f", t4, "f"], ignore_widths=[1, 6], - bedBolts=[d3], move="up") + bedBolts=[d3], move="up", label="front") diff --git a/boxes/lids.py b/boxes/lids.py index 23f2e5a..5bd7ec5 100644 --- a/boxes/lids.py +++ b/boxes/lids.py @@ -24,7 +24,7 @@ class _ChestLid(Boxes): r = d / 2.0 / math.cos(math.radians(angle)) return r - def side(self, x, angle=0, move=""): + def side(self, x, angle=0, move="", label=""): if "a" not in self.edges: s = edges.FingerJointSettings(self.thickness, True, finger=1.0, space=1.0) @@ -32,7 +32,7 @@ class _ChestLid(Boxes): t = self.thickness r = self.getR(x, angle) - if self.move(x+2*t, 0.5*x+3*t, move, True): + if self.move(x+2*t, 0.5*x+3*t, move, True, label=label): return self.moveTo(t, 0) @@ -43,9 +43,9 @@ class _ChestLid(Boxes): self.edges["a"](3*t) self.corner(90+angle) - self.move(x+2*t, 0.5*x+3*t, move, False) + self.move(x+2*t, 0.5*x+3*t, move, False, label=label) - def top(self, x, y, angle=0, move=None): + def top(self, x, y, angle=0, move=None, label=""): if "a" not in self.edges: s = edges.FingerJointSettings(self.thickness, True, finger=1.0, space=1.0) @@ -57,7 +57,7 @@ class _ChestLid(Boxes): tw = l + 6*t th = y+2*t - if self.move(tw, th, move, True): + if self.move(tw, th, move, True, label=label): return self.edges["A"](3*t) @@ -73,17 +73,17 @@ class _ChestLid(Boxes): self.edge(y+2*t) self.corner(90) - self.move(tw, th, move) + self.move(tw, th, move, label=label) def drawAddOnLid(self, x, y, style): if style == "flat": - self.rectangularWall(x, y, "eeee", move="right") - self.rectangularWall(x, y, "EEEE", move="up") + self.rectangularWall(x, y, "eeee", move="right", label="lid bottom") + self.rectangularWall(x, y, "EEEE", move="up", label="lid top") elif style == "chest": - self.side(x, move="right") - self.side(x, move="up") - self.side(x, move="left only") - self.top(x, y, move="up") + self.side(x, move="right", label="lid right") + self.side(x, move="up", label="lid left") + self.side(x, move="left only", label="invisible") + self.top(x, y, move="up", label="lid top") else: return False return True @@ -122,32 +122,32 @@ class _TopEdge(Boxes): def drawLid(self, x, y, top_edge, bedBolts=[None, None]): d2, d3 = bedBolts if top_edge == "c": - self.rectangularWall(x, y, "CCCC", bedBolts=[d2, d3, d2, d3], move="up") + self.rectangularWall(x, y, "CCCC", bedBolts=[d2, d3, d2, d3], move="up", label="top") elif top_edge == "f": - self.rectangularWall(x, y, "FFFF", move="up") + self.rectangularWall(x, y, "FFFF", move="up", label="top") elif top_edge in "FhŠ": - self.rectangularWall(x, y, "ffff", move="up") + self.rectangularWall(x, y, "ffff", move="up", label="top") elif top_edge == "L": - self.rectangularWall(x, y, "nlmE", move="up") + self.rectangularWall(x, y, "nlmE", move="up", label="lid top") elif top_edge == "i": - self.rectangularWall(x, y, "IEJe", move="up") + self.rectangularWall(x, y, "IEJe", move="up", label="lid top") elif top_edge == "k": outset = self.edges["k"].settings.outset self.edges["k"].settings.setValues(self.thickness, outset=True) lx = x/2.0-0.1*self.thickness self.edges['k'].settings.setValues(self.thickness, grip_length=5) - self.rectangularWall(lx, y, "IeJe", move="right") - self.rectangularWall(lx, y, "IeJe", move="up") - self.rectangularWall(lx, y, "IeJe", move="left only") + self.rectangularWall(lx, y, "IeJe", move="right", label="lid top left") + self.rectangularWall(lx, y, "IeJe", move="up", label="lid top right") + self.rectangularWall(lx, y, "IeJe", move="left only", label="invisible") self.edges["k"].settings.setValues(self.thickness, outset=outset) elif top_edge == "S": - self.rectangularWall(x, y, "ffff", move="up") - self.rectangularWall(x, 0, "sFeF", move="up") - self.rectangularWall(x, 0, "sFeF", move="up") - self.rectangularWall(y, 0, "sfef", move="up") - self.rectangularWall(y, 0, "sfef", move="up") + self.rectangularWall(x, y, "ffff", move="up", label="lid top") + self.rectangularWall(x, 0, "sFeF", move="up", label="lid top left") + self.rectangularWall(x, 0, "sFeF", move="up", label="lid top right") + self.rectangularWall(y, 0, "sfef", move="up", label="lid top front") + self.rectangularWall(y, 0, "sfef", move="up", label="lid top back") elif top_edge == "v": - self.rectangularWall(x, y, "VEEE", move="up") + self.rectangularWall(x, y, "VEEE", move="up", label="lid top") self.edges["v"].parts(move="up") else: return False diff --git a/boxes/parts.py b/boxes/parts.py index 5731439..9487bb3 100644 --- a/boxes/parts.py +++ b/boxes/parts.py @@ -25,7 +25,7 @@ class Parts: def __getattr__(self, name): return getattr(self.boxes, name) - def disc(self, diameter, hole=0, callback=None, move=""): + def disc(self, diameter, hole=0, callback=None, move="", label=""): """Simple disc :param diameter: diameter of the disc @@ -36,7 +36,7 @@ class Parts: size = diameter r = diameter / 2.0 - if self.move(size, size, move, before=True): + if self.move(size, size, move, before=True, label=label): return self.moveTo(size / 2, size / 2) @@ -47,7 +47,7 @@ class Parts: self.cc(callback, None, 0, 0) self.moveTo(r + self.burn, 0, 90) self.corner(360, r, tabs=6) - self.move(size, size, move) + self.move(size, size, move, label=label) def waivyKnob(self, diameter, n=20, angle=45, hole=0, callback=None, move=""): """Disc with a waivy edge to be easier to be gripped