def add_arrow( self, a, page): for item in a.items: # polygons (arrow heads, etc.) if self.paper.type( item) == "polygon": a_color = self.paper.itemcget( item, "fill") l_color = self.paper.itemcget( item, "outline") l_width = float( self.paper.itemcget( item, "width")) s = graphics_style( stroke_color=self.paper.any_color_to_rgb_string( l_color), fill_color=self.paper.any_color_to_rgb_string( a_color), stroke_width=Screen.px_to_cm( l_width)) style_name = self.get_appropriate_style_name( s) ps = geometry.coordinate_flat_list_to_xy_tuples( self.paper.coords( item)) points = [map( Screen.px_to_cm, p) for p in ps] self.create_oo_polygon( points, page, style_name) # polylines - standard arrows elif self.paper.type( item) == "line": line_pin = a._pins.index( self.paper.itemcget( item, 'arrow')) end_pin, start_pin = None,None if line_pin==1 or line_pin==3: end_pin = 1 if line_pin==2 or line_pin==3: start_pin = 1 l_color = self.paper.itemcget( item, "fill") l_width = float( self.paper.itemcget( item, "width")) s = graphics_style( stroke_color=self.paper.any_color_to_rgb_string( l_color), marker_end=end_pin, marker_start=start_pin, stroke_width=Screen.px_to_cm( l_width)) style_name = self.get_appropriate_style_name( s) ps = geometry.coordinate_flat_list_to_xy_tuples( self.paper.coords( item)) points = [map( Screen.px_to_cm, p) for p in ps] if self.paper.itemcget( item, "smooth") == "0": self.create_oo_polyline( points, page, style_name) else: self.create_oo_bezier( points, page, style_name)
def add_arrow(self, a): """Add arrow item to SVG document. """ i = self._id for item in a.items: # polygons (arrow heads, etc.) if self.paper.type(item) == "polygon": points = geometry.coordinate_flat_list_to_xy_tuples( self.paper.coords(item)) ps = " ".join(["%.2f,%.2f" % (x, y) for (x, y) in points]) a_color = self.paper.itemcget(item, "fill") l_color = self.paper.itemcget(item, "outline") poly = dom_extensions.elementUnder( self.group, 'polygon', (('points', ps), ('stroke-width', '1'), ('fill-rule', 'evenodd'), ('fill', self.cc(l_color)), ('stroke', self.cc(l_color)))) # polylines - standard arrows elif self.paper.type(item) == "line": # the pins line_pin = a._pins.index(self.paper.itemcget(item, 'arrow')) if line_pin == 1 or line_pin == 3: d1, d2, d3 = map( int, self.paper.itemcget(item, "arrowshape").split()) defs = dom_extensions.elementUnder(self.group, 'defs') arrow_point = dom_extensions.elementUnder( defs, 'marker', (('id', 'Arrow' + str(i)), ('refX', str(d2)), ('refY', str(d3)), ('markerUnits', 'userSpaceOnUse'), ('markerWidth', str(d2)), ('markerHeight', str(2 * d3)), ('orient', 'auto'), ('stroke', self.cc(a.line_color)), ('fill', self.cc(a.line_color)))) dom_extensions.elementUnder( arrow_point, 'path', (('d', 'M %d %d L 0 0 L %d %d L 0 %d z' % (d2, d3, d2 - d1, d3, 2 * d3)), )) if line_pin == 2 or line_pin == 3: d1, d2, d3 = map( int, self.paper.itemcget(item, "arrowshape").split()) defs = dom_extensions.elementUnder(self.group, 'defs') arrow_point = dom_extensions.elementUnder( defs, 'marker', (('id', 'ArrowBack' + str(i)), ('refX', '0'), ('refY', str(d3)), ('markerUnits', 'userSpaceOnUse'), ('markerWidth', str(d2)), ('markerHeight', str(2 * d3)), ('orient', 'auto'), ('stroke', self.cc(a.line_color)), ('fill', self.cc(a.line_color)))) dom_extensions.elementUnder( arrow_point, 'path', (('d', 'M 0 %d L %d 0 L %d %d L %d %d z' % (d3, d2, d1, d3, d2, 2 * d3)), )) # the item if self.paper.itemcget(item, "smooth") != "0" and len( self.paper.coords(item)) > 4: # spline points = geometry.coordinate_flat_list_to_xy_tuples( self.paper.coords(item)) beziers = geometry.tkspline_to_quadratic_bezier(points) ps = 'M%.2f,%.2f Q%.2f,%.2f %.2f,%.2f' % (beziers[0]) for bez in beziers[1:]: ps += 'Q%.2f,%.2f %.2f,%.2f ' % (bez[2:]) line = dom_extensions.elementUnder( self.group, 'path', (('d', ps), ('stroke-width', str(a.line_width)), ('fill', 'none'), ('stroke', self.cc(a.line_color)))) else: # normal line points = geometry.coordinate_flat_list_to_xy_tuples( self.paper.coords(item)) ps = " ".join(["%.2f,%.2f" % (x, y) for (x, y) in points]) line = dom_extensions.elementUnder( self.group, 'polyline', (('points', ps), ('stroke-width', str(a.line_width)), ('fill', 'none'), ('stroke', self.cc(a.line_color)))) if line_pin == 1 or line_pin == 3: line.setAttribute('marker-end', 'url(#Arrow' + str(i) + ')') if line_pin == 2 or line_pin == 3: line.setAttribute('marker-start', 'url(#ArrowBack' + str(i) + ')') self._id += 1
def add_arrow( self, a): """adds arrow item to SVG document""" i = self._id for item in a.items: # polygons (arrow heads, etc.) if self.paper.type( item) == "polygon": points = geometry.coordinate_flat_list_to_xy_tuples( self.paper.coords( item)) ps = " ".join( ["%.2f,%.2f" % (x,y) for (x,y) in points]) a_color = self.paper.itemcget( item, "fill") l_color = self.paper.itemcget( item, "outline") poly = dom_extensions.elementUnder( self.group, 'polygon', (( 'points', ps), ( 'stroke-width', '1'), ( 'fill-rule', 'evenodd'), ( 'fill', self.cc( l_color)), ( 'stroke', self.cc( l_color)))) # polylines - standard arrows elif self.paper.type( item) == "line": # the pins line_pin = a._pins.index( self.paper.itemcget( item, 'arrow')) if line_pin == 1 or line_pin == 3: d1, d2, d3 = map( int, self.paper.itemcget( item, "arrowshape").split()) defs = dom_extensions.elementUnder( self.group, 'defs') arrow_point = dom_extensions.elementUnder( defs, 'marker', (('id','Arrow'+str(i)),('refX',str(d2)),('refY',str(d3)), ('markerUnits','userSpaceOnUse'), ('markerWidth',str(d2)),('markerHeight',str(2*d3)), ('orient','auto'), ('stroke', self.cc( a.line_color)), ('fill', self.cc( a.line_color)))) dom_extensions.elementUnder( arrow_point, 'path', (('d', 'M %d %d L 0 0 L %d %d L 0 %d z'%(d2, d3, d2-d1, d3, 2*d3)),)) if line_pin == 2 or line_pin == 3: d1, d2, d3 = map( int, self.paper.itemcget( item, "arrowshape").split()) defs = dom_extensions.elementUnder( self.group, 'defs') arrow_point = dom_extensions.elementUnder( defs, 'marker', (('id','ArrowBack'+str(i)),('refX','0'),('refY',str(d3)), ('markerUnits','userSpaceOnUse'), ('markerWidth',str(d2)),('markerHeight',str(2*d3)), ('orient','auto'), ('stroke', self.cc( a.line_color)), ('fill', self.cc( a.line_color)))) dom_extensions.elementUnder( arrow_point, 'path', (('d', 'M 0 %d L %d 0 L %d %d L %d %d z'%(d3, d2, d1, d3, d2, 2*d3)),)) # the item if self.paper.itemcget( item, "smooth") != "0" and len( self.paper.coords( item)) > 4: # spline points = geometry.coordinate_flat_list_to_xy_tuples( self.paper.coords( item)) beziers = geometry.tkspline_to_quadratic_bezier( points) ps = 'M%.2f,%.2f Q%.2f,%.2f %.2f,%.2f' % (beziers[0]) for bez in beziers[1:]: ps += 'Q%.2f,%.2f %.2f,%.2f ' % (bez[2:]) line = dom_extensions.elementUnder( self.group, 'path', (( 'd', ps), ( 'stroke-width', str( a.line_width)), ( 'fill', 'none'), ( 'stroke', self.cc( a.line_color)))) else: # normal line points = geometry.coordinate_flat_list_to_xy_tuples( self.paper.coords( item)) ps = " ".join( ["%.2f,%.2f" % (x,y) for (x,y) in points]) line = dom_extensions.elementUnder( self.group, 'polyline', (( 'points', ps), ( 'stroke-width', str( a.line_width)), ( 'fill', 'none'), ( 'stroke', self.cc( a.line_color)))) if line_pin == 1 or line_pin == 3: line.setAttribute( 'marker-end','url(#Arrow'+str(i)+')') if line_pin == 2 or line_pin == 3: line.setAttribute( 'marker-start','url(#ArrowBack'+str(i)+')') self._id += 1