예제 #1
0
 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)
예제 #2
0
 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)
예제 #3
0
    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
예제 #4
0
 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