From 0ba0c19af2f217114cc87d8748945e0bcf37461c Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Tue, 7 Jun 2016 20:20:35 +0200 Subject: [PATCH] Detect size of drawing and set svg viewport accordingly Remove width and height parameter from Boxes.open() Code for detecting the size ignores text. Until this is fixed you need to surround text by lines of some sort. --- boxes/__init__.py | 18 ++++++++++-------- boxes/generators/_template.py | 4 ++-- boxes/generators/box.py | 2 +- boxes/generators/box2.py | 2 +- boxes/generators/box3.py | 2 +- boxes/generators/castle.py | 2 +- boxes/generators/drillbox.py | 2 +- boxes/generators/flexbox.py | 5 +---- boxes/generators/flexbox2.py | 5 +---- boxes/generators/flexbox3.py | 2 +- boxes/generators/flextest.py | 2 +- boxes/generators/folder.py | 2 +- boxes/generators/lamp.py | 2 +- boxes/generators/magazinefile.py | 2 +- boxes/generators/printer.py | 2 +- boxes/generators/silverwarebox.py | 2 +- boxes/generators/trayinsert.py | 3 +-- boxes/generators/traylayout.py | 3 +-- boxes/generators/typetray.py | 2 +- 19 files changed, 29 insertions(+), 35 deletions(-) diff --git a/boxes/__init__.py b/boxes/__init__.py index 353d98d..1498181 100755 --- a/boxes/__init__.py +++ b/boxes/__init__.py @@ -21,6 +21,7 @@ from argparse import ArgumentParser import re from functools import wraps from boxes import edges +from boxes import svgutil ### Helpers @@ -173,22 +174,18 @@ class Boxes: "--burn", action="store", type=float, default=0.05, help="burn correction in mm") - def open(self, width, height): + def open(self): """ Prepare for rendering Call this function from your .render() method - - :param width: width of canvas in mm - :param height: height of canvas in mm - """ self.spacing = 2*self.burn + 0.5 * self.thickness self.fingerHoleEdgeWidth = 1.0 # multitudes of self.thickness self.bedBoltSettings = (3, 5.5, 2, 20, 15) #d, d_nut, h_nut, l, l1 self.hexHolesSettings = (5, 3, 'circle') # r, dist, style - self._init_surface(width, height) + self._init_surface(1000, 1000) self._buildObjects() def buildArgParser(self, *l): @@ -329,7 +326,7 @@ class Boxes: """Implement this method in your sub class. You will typically need to call .parseArgs() before calling this one""" - self.open(100, 100) + self.open() # Change settings and creat new Edges and part classes here raise NotImplemented self.close() @@ -385,6 +382,11 @@ class Boxes: self.surface.flush() self.surface.finish() + + svg = svgutil.SVGFile(self.output) + svg.getEnvelope() + svg.rewriteViewPort() + return f = open(self.output, "r+") s = f.read(1024) pos = s.find('pt"') @@ -1111,7 +1113,7 @@ class DemoBox(Boxes): def render(self): """ """ x, y, h, t = self.x, self.y, self.h, self.thickness - self.open(2*x+10*self.thickness, y+2*h+20*self.thickness) + self.open() self.ctx.save() self.moveTo(t, t) diff --git a/boxes/generators/_template.py b/boxes/generators/_template.py index 8fead5a..73e3d1a 100644 --- a/boxes/generators/_template.py +++ b/boxes/generators/_template.py @@ -32,8 +32,8 @@ class Box(Boxes): # adjust to the variables you want in the local scope x, y, h = self.x, self.y, self.h t = self.thickness - # Calculate canvas size and pass as width and height - self.open(width=x+y+40, height=y+2*h+50) + # Initialize canvas + self.open() # Change settings of default edges if needed. E.g.: self.edges["f"].settings.setValues(self.thickness, space=3, finger=3, diff --git a/boxes/generators/box.py b/boxes/generators/box.py index 8478a4c..208f093 100755 --- a/boxes/generators/box.py +++ b/boxes/generators/box.py @@ -29,7 +29,7 @@ class Box(Boxes): def render(self): x, y, h = self.x, self.y, self.h t = self.thickness - self.open(width=max(x+y,2*x)+10*t, height=y+2*h+12*t) + self.open() d2 = [edges.Bolts(2)] d3 = [edges.Bolts(3)] diff --git a/boxes/generators/box2.py b/boxes/generators/box2.py index 4a62214..8de63b9 100755 --- a/boxes/generators/box2.py +++ b/boxes/generators/box2.py @@ -32,7 +32,7 @@ class Box(Boxes): def render(self): x, y, h = self.x, self.y, self.h - self.open(width=x+y+40, height=y+2*h+50) + self.open() b = self.edges.get(self.bottom_edge, self.edges["F"]) t = self.edges.get(self.top_edge, self.edges["e"]) diff --git a/boxes/generators/box3.py b/boxes/generators/box3.py index 906d181..6e3e577 100755 --- a/boxes/generators/box3.py +++ b/boxes/generators/box3.py @@ -30,7 +30,7 @@ class Box(Boxes): x, y, h = self.x, self.y, self.h t = self.thickness - self.open(width=x+y+10*t, height=y+h+10*t) + self.open() d2 = [edges.Bolts(2)] d3 = [edges.Bolts(3)] diff --git a/boxes/generators/castle.py b/boxes/generators/castle.py index d960e51..c52045b 100755 --- a/boxes/generators/castle.py +++ b/boxes/generators/castle.py @@ -22,7 +22,7 @@ class Castle(Boxes): Boxes.__init__(self) def render(self, t_x=70, t_h=250, w1_x=300, w1_h=120, w2_x=100, w2_h=120): - self.open(800, 600) + self.open() s = edges.FingerJointSettings(self.thickness, relative=False, space = 10, finger=10, height=10, width=self.thickness) diff --git a/boxes/generators/drillbox.py b/boxes/generators/drillbox.py index 1368ac3..55d982d 100755 --- a/boxes/generators/drillbox.py +++ b/boxes/generators/drillbox.py @@ -53,7 +53,7 @@ in 0.5mm steps, 3 holes each size""" x, y, h = self.x, self.y, self.h t = self.thickness - self.open(width=x+y+40, height=3*y+2*h+16*t) + self.open() self.edges["f"].settings.setValues(self.thickness, space=3, finger=3, surroundingspaces=1) diff --git a/boxes/generators/flexbox.py b/boxes/generators/flexbox.py index 15bfb2c..22b4cc4 100755 --- a/boxes/generators/flexbox.py +++ b/boxes/generators/flexbox.py @@ -76,10 +76,7 @@ class FlexBox(boxes.Boxes): self.latchsize = 8 * self.thickness c4 = math.pi * r * 0.5 - width = 2*x + 2*y - 8*r + 4*c4 + 4*self.thickness - height = y + h + 8*self.thickness - - self.open(width, height) + self.open() self.moveTo(self.thickness, self.thickness) self.surroundingWall() diff --git a/boxes/generators/flexbox2.py b/boxes/generators/flexbox2.py index f7b8527..d14420e 100755 --- a/boxes/generators/flexbox2.py +++ b/boxes/generators/flexbox2.py @@ -71,10 +71,7 @@ class FlexBox(Boxes): self.c4 = c4 = math.pi * self.radius * 0.5 self.latchsize = 8*self.thickness - width = 2*self.x + self.y - 3*self.radius + 2*c4 + 7*self.thickness + self.latchsize # lock - height = self.y + self.h + 8*self.thickness - - self.open(width, height) + self.open() self.fingerJointSettings = (4, 4) diff --git a/boxes/generators/flexbox3.py b/boxes/generators/flexbox3.py index c25b80f..6b2d47d 100755 --- a/boxes/generators/flexbox3.py +++ b/boxes/generators/flexbox3.py @@ -109,7 +109,7 @@ class FlexBox(Boxes): width = 2*x + y - 2*r + c4 + 14*thickness + 3*h # lock height = y + z + 8*thickness - self.open(width, height) + self.open() self.edges["f"].settings.setValues( self.thickness, finger=2, space=2, surroundingspaces=1) diff --git a/boxes/generators/flextest.py b/boxes/generators/flextest.py index f4647e4..fbc5c0e 100755 --- a/boxes/generators/flextest.py +++ b/boxes/generators/flextest.py @@ -33,7 +33,7 @@ class FlexTest(Boxes): def render(self): x, y = self.x, self.y - self.open(x+60, y+20) + self.open() self.edges["X"].settings.setValues( self.thickness, relative=True, diff --git a/boxes/generators/folder.py b/boxes/generators/folder.py index 8b14e3b..5e1cd3a 100755 --- a/boxes/generators/folder.py +++ b/boxes/generators/folder.py @@ -31,7 +31,7 @@ class Folder(Boxes): def render(self): x, y, r, h = self.x, self.y, self.r, self.h c2 = math.pi * h - self.open(width=2*x+3*h+20, height=y+20) + self.open() self.moveTo(r+self.thickness, self.thickness) self.edge(x-r) self.edges["X"](c2, y) diff --git a/boxes/generators/lamp.py b/boxes/generators/lamp.py index 8cf58da..12ac1c6 100755 --- a/boxes/generators/lamp.py +++ b/boxes/generators/lamp.py @@ -77,7 +77,7 @@ class Lamp(Boxes): h : height box """ - self.open(width=1000, height=1000) + self.open() #self.edges["f"].settings = (5, 5) # XXX diff --git a/boxes/generators/magazinefile.py b/boxes/generators/magazinefile.py index ad139c0..86c2bf6 100755 --- a/boxes/generators/magazinefile.py +++ b/boxes/generators/magazinefile.py @@ -64,7 +64,7 @@ class Box(Boxes): self.hi = hi = self.hi or (h / 2.0) t = self.thickness - self.open(width=x+y+8*t, height=x+h+hi+4*t) + self.open() self.ctx.save() self.rectangularWall(x, h, "Ffef", move="up") diff --git a/boxes/generators/printer.py b/boxes/generators/printer.py index 1a7fa6c..a98206e 100755 --- a/boxes/generators/printer.py +++ b/boxes/generators/printer.py @@ -121,7 +121,7 @@ class Printer(Boxes): self.move(overallwidth, overallheight, move) def render(self): - self.open(650, 600) + self.open() self.edges["f"].settings.setValues(self.thickness, surroundingspaces=0) self.ctx.save() for i in range(3): diff --git a/boxes/generators/silverwarebox.py b/boxes/generators/silverwarebox.py index 5ecbdd4..1fb6ceb 100755 --- a/boxes/generators/silverwarebox.py +++ b/boxes/generators/silverwarebox.py @@ -70,7 +70,7 @@ using flex for rounded corners""" def render(self): x, y, h, r = 250, 250/1.618, 120, 30 - self.open(750, 450) + self.open() t = self.thickness b = self.burn diff --git a/boxes/generators/trayinsert.py b/boxes/generators/trayinsert.py index fa177a9..5350c78 100755 --- a/boxes/generators/trayinsert.py +++ b/boxes/generators/trayinsert.py @@ -28,8 +28,7 @@ class TrayInsert(Boxes): h = self.h t = self.thickness - self.open(width=max(x, y) + 4*t, - height=(len(self.sx)+len(self.sy)-2)*(h+t)+2*t) + self.open() self.moveTo(t, t) # Inner walls diff --git a/boxes/generators/traylayout.py b/boxes/generators/traylayout.py index 5f18e9c..5cb578a 100755 --- a/boxes/generators/traylayout.py +++ b/boxes/generators/traylayout.py @@ -105,8 +105,7 @@ class Layout(Boxes): for f in line: hasfloor |= f - self.open(max((lx+1)*sum(self.y), (ly+1)*sum(self.x))+lx*ly*4*t, - 2*self.h + hasfloor*sum(self.y) + 12*t) + self.open() self.edges["s"] = boxes.edges.Slot(self, self.hi/2.0) self.edges["C"] = boxes.edges.CrossingFingerHoleEdge(self, self.hi) diff --git a/boxes/generators/typetray.py b/boxes/generators/typetray.py index 93c5f09..af22f67 100755 --- a/boxes/generators/typetray.py +++ b/boxes/generators/typetray.py @@ -78,7 +78,7 @@ class TypeTray(Boxes): hi = self.hi = self.hi or h t = self.thickness - self.open(width=2*max(x,y)+10*t, height=(len(self.sx)+len(self.sy))*(h+2*t)+4*t) + self.open() self.moveTo(t, t) # outer walls