From 1810fad1eda74a710f3e14d05309191adddb7acc Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Sat, 23 Jan 2010 17:52:26 +0000 Subject: autogeneration of dock details --- diff --git a/block.py b/block.py index 0255659..3133479 100644 --- a/block.py +++ b/block.py @@ -119,43 +119,56 @@ class Block: if name in BASIC_STYLE: svg.expand(40,0) self._make_basic_block(sprite_list, svg, x, y) - self.docks = (('flow',True,0,2),('flow',False,0,self.height-yoff)) + self.docks = (('flow', True, svg.docks[0][0], svg.docks[0][1]), + ('flow', False,svg.docks[1][0], svg.docks[1][1])) elif name in BASIC_STYLE_HEAD: svg.expand(40,0) svg.set_slot(False) + svg.set_cap(True) self._make_basic_block(sprite_list, svg, x, y) - self.docks = (('start',True,0,2),('flow',False,0,self.height-yoff)) + self.docks = (('start', True, svg.docks[0][0], svg.docks[0][1]), + ('flow', False, svg.docks[1][0], svg.docks[1][1])) elif name in BASIC_STYLE_HEAD_1ARG: svg.expand(40,0) svg.set_innie([True]) svg.set_slot(False) + svg.set_cap(True) self._make_basic_block(sprite_list, svg, x, y) - self.docks = (('start',True,0,0), ('string',False,self.width,12), - ('flow',False,0,self.height-yoff)) + self.docks = (('start', True, svg.docks[0][0], svg.docks[0][1]), + ('string', False, svg.docks[1][0], svg.docks[1][1]), + ('flow', False, svg.docks[2][0], svg.docks[2][1])) elif name in BASIC_STYLE_TAIL: svg.expand(40,0) svg.set_tab(False) self._make_basic_block(sprite_list, svg, x, y) - self.docks = (('flow',True,0,2),('unavailable',False,0,0)) + self.docks = (('flow', True, svg.docks[0][0], svg.docks[0][1]), + ('unavailable', False, 0, 0)) elif name in BASIC_STYLE_1ARG: svg.expand(25,0) svg.set_innie([True]) self._make_basic_block(sprite_list, svg, x, y) - self.docks = (('flow',True,0,2), - ('number',False,self.width-xoff,12), - ('flow',False,0,self.height-yoff)) + self.docks = (('flow', True, svg.docks[0][0], svg.docks[0][1]), + ('number', False, svg.docks[1][0], svg.docks[1][1]), + ('flow', False, svg.docks[2][0], svg.docks[2][1])) elif name in BASIC_STYLE_2ARG: svg.expand(25,0) svg.set_innie([True,True]) self._make_basic_block(sprite_list, svg, x, y) - self.docks = (('flow',True,0,2), - ('number',False,self.width-xoff,12), - ('number',False,self.width-xoff,54), - ('flow',False,0,self.height-yoff)) + self.docks = (('flow', True, svg.docks[0][0], svg.docks[0][1]), + ('number', False, svg.docks[1][0], svg.docks[1][1]), + ('number', False, svg.docks[2][0], svg.docks[2][1]), + ('flow', False, svg.docks[3][0], svg.docks[3][1])) elif name in BOX_STYLE: svg.expand(60,0) self._make_basic_box(sprite_list, svg, x, y) - self.docks = (('number',True,0,12),('unavailable',False,0,12)) + self.docks = (('number', True, svg.docks[0][0], svg.docks[0][1]), + ('unavailable', False, 0, 0)) + elif name in BOX_STYLE_1ARG: + svg.expand(60,0) + svg.set_innie([True]) + self._make_basic_box(sprite_list, svg, x, y) + self.docks = (('number', True, svg.docks[0][0], svg.docks[0][1]), + ('string', False, svg.docks[1][0], svg.docks[1][1])) elif name in NUMBER_STYLE: svg.expand(25,0) svg.set_innie([True,True]) @@ -163,9 +176,14 @@ class Block: svg.set_tab(False) svg.set_slot(False) self._make_basic_block(sprite_list, svg, x, y) - self.docks = (('number',True,0,12), - ('number',False,self.width-xoff,12), - ('number',False,self.width-xoff,54)) + """ + NOTE: + The "outie" is added last, so the dock order in the NUMBER_STYLE + needs to be modified. + """ + self.docks = (('number', True, svg.docks[2][0], svg.docks[2][1]), + ('number', False, svg.docks[0][0], svg.docks[0][1]), + ('number', False, svg.docks[1][0], svg.docks[1][1])) elif name in NUMBER_STYLE_1ARG: svg.expand(25,0) svg.set_innie([True]) @@ -173,8 +191,8 @@ class Block: svg.set_tab(False) svg.set_slot(False) self._make_basic_block(sprite_list, svg, x, y) - self.docks = (('number',True,0,12), - ('number',False,self.width-xoff,12)) + self.docks = (('number', True, svg.docks[1][0], svg.docks[1][1]), + ('number', False, svg.docks[0][0], svg.docks[0][1])) elif name in NUMBER_STYLE_PORCH: svg.expand(25,0) svg.set_innie([True,True]) @@ -184,57 +202,61 @@ class Block: svg.set_porch(True) self._make_basic_block(sprite_list, svg, x, y) xoff += svg._porch - self.docks = (('number',True,0,12), - ('number',False,self.width-xoff-xoff,12), - ('number',False,self.width-xoff,64)) + self.docks = (('number', True, svg.docks[2][0], svg.docks[2][1]), + ('number', False, svg.docks[0][0], svg.docks[0][1]), + ('number', False, svg.docks[1][0], svg.docks[1][1])) elif name in COMPARE_STYLE: self._make_boolean_compare(sprite_list, svg, x, y) - self.docks = (('bool',True,0,self.height-12), - ('number',False,self.width-xoff,12), - ('number',False,self.width-xoff,54)) + self.docks = (('bool', True, svg.docks[0][0], svg.docks[0][1]), + ('number', False, svg.docks[1][0], svg.docks[1][1]), + ('number', False, svg.docks[2][0], svg.docks[2][1])) elif name in BOOLEAN_STYLE: svg.expand(15,0) self._make_boolean_and_or(sprite_list, svg, x, y) - self.docks = (('bool',True,0,self.height-12), - ('bool',False,self.width-xoff,12), - ('bool',False,self.width-xoff,54)) + self.docks = (('bool', True, svg.docks[0][0], svg.docks[0][1]), + ('bool', False, svg.docks[1][0], svg.docks[1][1]), + ('bool', False, svg.docks[2][0], svg.docks[2][1])) elif name in NOT_STYLE: svg.expand(15,0) self._make_boolean_not(sprite_list, svg, x, y) - self.docks = (('bool',True,0,self.height-12), - ('bool',False,self.width-xoff,12)) + self.docks = (('bool', True, svg.docks[0][0], svg.docks[0][1]), + ('bool', False, svg.docks[1][0], svg.docks[1][1])) elif name in FLOW_STYLE: svg.expand(25,0) svg.set_slot(True) self._make_basic_flow(sprite_list, svg, x, y) - self.docks = (('flow',True,0,2), - ('flow',False,self.width/2, self.height-yoff)) + self.docks = (('flow', True, svg.docks[0][0], svg.docks[0][1]), + ('flow', False, svg.docks[0][0], svg.docks[0][1])) elif name in FLOW_STYLE_1ARG: svg.expand(25,0) svg.set_slot(True) svg.set_tab(True) svg.set_innie([True]) self._make_basic_flow(sprite_list, svg, x, y) - self.docks = (('flow',True,0,2), - ('number',False,self.width-xoff,12), - ('flow',False, 0, self.height-yoff), - ('flow',False,self.width/2, self.height-yoff)) + self.docks = (('flow', True, svg.docks[0][0], svg.docks[0][1]), + ('number', False, svg.docks[1][0], svg.docks[1][1]), + ('flow', False, svg.docks[2][0], svg.docks[2][1]), + ('flow', False, svg.docks[3][0], svg.docks[3][1])) elif name in FLOW_STYLE_BOOLEAN: svg.expand(25,0) svg.set_slot(True) svg.set_tab(True) svg.set_boolean(True) self._make_basic_flow(sprite_list, svg, x, y) - self.docks = (('flow',True,0,2), - ('bool',False,self.width-xoff,12), - ('flow',False, 0, self.height-yoff) - ('flow',False,self.width/2, self.height-yoff)) + self.docks = (('flow', True, svg.docks[0][0], svg.docks[0][1]), + ('bool', False, svg.docks[1][0], svg.docks[1][1]), + ('flow', False, svg.docks[2][0], svg.docks[2][1]), + ('flow', False, svg.docks[3][0], svg.docks[3][1])) else: svg.expand(40,0) self._make_basic_block(sprite_list, svg, x, y) - self.docks = (('flow',True,0,2),('flow',False,0,self.height-yoff)) + self.docks = (('flow', True, svg.docks[0][0], svg.docks[0][1]), + ('flow', False,svg.docks[1][0], svg.docks[1][1])) print "don't know how to create a block for %s" % (name) + print self.docks + print "w %s h %s" % (svg._width, svg._height) + # NEED TO PROCESS DEFAULTS if len(labels) > 0: if BLOCK_NAMES.has_key(name): diff --git a/sprite_factory.py b/sprite_factory.py index 46132a3..8d168f4 100755 --- a/sprite_factory.py +++ b/sprite_factory.py @@ -37,6 +37,7 @@ class SVG: self._max_y = 0 self._width = 0 self._height = 0 + self.docks = [] self._scale = 1 self._orientation = 0 self._radius = 8 @@ -49,6 +50,7 @@ class SVG: self._innie_y2 = (INNIE-self._stroke_width)/2 self._innie_spacer = SPACER self._slot = True + self._cap = False self._tab = True self._bool = False self._slot_x = 10 @@ -67,6 +69,7 @@ class SVG: svg = self._new_path(x, y) svg += self._rarc_to(1, -1) svg += self._do_slot() + svg += self._do_cap() svg += self._rline_to(self._expand_x, 0) xx = self._x svg += self._rarc_to(1, 1) @@ -156,12 +159,14 @@ class SVG: self._innie_spacer-self._stroke_width) svg += self._rarc_to(1, -1) svg += self._rline_to(self._radius/2.0+self._expand_x, 0) + xx = self._x svg += self._rline_to(0,self._radius/2.0) svg += self._do_boolean() svg += self._rline_to(0,self._radius*1.5+self._innie_y2+\ self._innie_spacer) svg += self._do_boolean() svg += self._rline_to(0,self._radius/2.0) + svg += self._line_to(xx, self._y) svg += self._end_boolean() return self._header() + svg @@ -171,9 +176,11 @@ class SVG: svg += self._rline_to(0,-self._stroke_width) svg += self._rarc_to(1, -1) svg += self._rline_to(self._radius/2.0+self._expand_x, 0) + xx = self._x svg += self._rline_to(0,self._radius/2.0) svg += self._do_boolean() svg += self._rline_to(0,self._radius/2.0) + svg += self._line_to(xx, self._y) svg += self._end_boolean() return self._header() + svg @@ -283,6 +290,13 @@ class SVG: def set_slot(self, flag=True): self._slot = flag + if self._slot is True: + self._cap = False + + def set_cap(self, flag=False): + self._cap = flag + if self._cap is True: + self._slot = False def set_tab(self, flag=True): self._tab = flag @@ -450,6 +464,8 @@ class SVG: def _do_slot(self): if self._slot is True: + self.docks.append((int(self._x*self._scale), + int(self._y*self._scale))) return "%s%s%s" % ( self._rline_to(0, self._slot_y), self._rline_to(self._slot_x, 0), @@ -457,18 +473,31 @@ class SVG: else: return self._rline_to(self._slot_x, 0) + def _do_cap(self): + if self._cap is True: + return "%s%s" % ( + self._rline_to(self._slot_x/2.0, -self._slot_y*2.0), + self._rline_to(self._slot_x/2.0, self._slot_y*2.0)) + else: + return "" + def _do_tab(self): if self._tab is True: - return "%s%s%s%s%s" % ( + s = "%s%s%s%s%s" % ( self._rline_to(-self._stroke_width, 0), self._rline_to(0, self._slot_y), self._rline_to(-self._slot_x+2*self._stroke_width, 0), self._rline_to(0, -self._slot_y), self._rline_to(-self._stroke_width, 0)) + self.docks.append((int(self._x*self._scale), + int(self._y*self._scale))) + return s else: return self._rline_to(-self._slot_x, 0) def _do_innie(self): + self.docks.append((int(self._x*self._scale), + int((self._y+self._innie_y2)*self._scale))) return "%s%s%s%s%s%s%s" % ( self._rline_to(-self._innie_x1, 0), self._rline_to(0, -self._innie_y1), @@ -481,6 +510,7 @@ class SVG: def _do_outie(self): if self._outie is not True: return self._rline_to(0, -self._innie_y2) + self.docks.append((int(self._x*self._scale), int(self._y*self._scale))) return "%s%s%s%s%s%s%s%s%s" % ( self._rline_to(0, -self._stroke_width), self._rline_to(-self._innie_x1-2*self._stroke_width, 0), @@ -502,11 +532,14 @@ class SVG: def _start_boolean(self, xoffset, yoffset): svg = self._new_path(xoffset, yoffset) self._radius -= self._stroke_width + self.docks.append((int(self._x*self._scale), int(self._y*self._scale))) svg += self._rarc_to(1, -1) self._radius += self._stroke_width return svg + self._rline_to(self._stroke_width, 0) def _do_boolean(self): + self.docks.append((int((self._x-self._radius)*self._scale), + int((self._y+self._radius)*self._scale))) return self._rarc_to(-1, 1, 90, 0, 0) + self._rarc_to(1, 1, 90, 0, 0) def _end_boolean(self): @@ -528,11 +561,13 @@ class SVG: self._scale def _calculate_x_y(self): + x = self._stroke_width/2.0 + y = self._stroke_width/2.0+self._radius if self._outie is True: - return(self._stroke_width/2.0+self._innie_x1+self._innie_x2, - self._radius+self._stroke_width/2.0) - else: - return(self._stroke_width/2.0, self._radius+self._stroke_width/2.0) + x += self._innie_x1+self._innie_x2 + if self._cap is True: + y += self._slot_y*2.0 + return(x, y) # # Command-line tools for testing -- cgit v0.9.1