예제 #1
0
  def create_oo_bezier( self, points, page, gr_style_name):
    ps = [j for i in map(geometry.quadratic_beziere_to_polyline,
                         geometry.tkspline_to_quadratic_bezier(points))
              for j in i]
    maxX, maxY, minX, minY = None,None,None,None
    for (x,y) in ps:
      if not maxX or x > maxX:
        maxX = x
      if not minX or x < minX:
        minX = x
      if not maxY or y > maxY:
        maxY = y
      if not minY or y < minY:
        minY = y
    points_txt = ""
    for (sx, sy, cxa, cya, cxb, cyb, ex, ey) in geometry.tkspline_to_cubic_bezier( points):
      if not points_txt:
        points_txt += "m %d %d c " % (1000*(sx-minX), 1000*(sy-minY))
      points_txt += "%d %d %d %d %d %d " % (1000*(cxa-sx),1000*(cya-sy),1000*(cxb-sx),1000*(cyb-sy),1000*(ex-sx),1000*(ey-sy))

    line = dom_extensions.elementUnder( page, 'draw:path',
                                        (( 'svg:x', '%fcm' % minX),
                                         ( 'svg:y', '%fcm' % minY),
                                         ( 'svg:width', '%fcm' % (maxX-minX)),
                                         ( 'svg:height', '%fcm' % (maxY-minY)),
                                         ( 'svg:viewBox', '0 0 %d %d' % ((maxX-minX)*1000,(maxY-minY)*1000)),
                                         ( 'svg:d', points_txt),
                                         ( 'draw:layer', 'layout'),
                                         ( 'draw:style-name', gr_style_name)))
예제 #2
0
 def create_oo_bezier( self, points, page, gr_style_name):
   ps = reduce( operator.add, map( geometry.quadratic_beziere_to_polyline,
                                   geometry.tkspline_to_quadratic_bezier( points)))
   maxX, maxY, minX, minY = None,None,None,None
   for (x,y) in ps:
     if not maxX or x > maxX:
       maxX = x
     if not minX or x < minX:
       minX = x
     if not maxY or y > maxY:
       maxY = y
     if not minY or y < minY:
       minY = y
   points_txt = ""
   for (sx, sy, cxa, cya, cxb, cyb, ex, ey) in geometry.tkspline_to_cubic_bezier( points):
     if not points_txt:
       points_txt += "m %d %d c " % (1000*(sx-minX), 1000*(sy-minY))
     points_txt += "%d %d %d %d %d %d " % (1000*(cxa-sx),1000*(cya-sy),1000*(cxb-sx),1000*(cyb-sy),1000*(ex-sx),1000*(ey-sy))
   line = dom_extensions.elementUnder( page, 'draw:path',
                                       (( 'svg:x', '%fcm' % minX),
                                        ( 'svg:y', '%fcm' % minY),
                                        ( 'svg:width', '%fcm' % (maxX-minX)),
                                        ( 'svg:height', '%fcm' % (maxY-minY)),
                                        ( 'svg:viewBox', '0 0 %d %d' % ((maxX-minX)*1000,(maxY-minY)*1000)),
                                        ( 'svg:d', points_txt),
                                        ( 'draw:layer', 'layout'),
                                        ( 'draw:style-name', gr_style_name)))
예제 #3
0
 def add_polyline(self, o):
     # the item
     points = [p.get_xy() for p in o.points]
     if o.spline and len(o.points) > 2:
         # spline
         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(o.line_width)),
              ('fill', 'none'), ('stroke', self.cc(o.line_color))))
     else:
         # normal line
         ps = ''
         for (x, y) in points:
             ps += '%.2f,%.2f ' % (x, y)
         poly = dom_extensions.elementUnder(
             self.group, 'polyline',
             (('points', ps), ('stroke-width', str(o.line_width)),
              ('fill', 'none'), ('stroke', self.cc(o.line_color))))
예제 #4
0
 def add_polyline( self, o):
   # the item
   points = [p.get_xy() for p in o.points]
   if o.spline and len( o.points) > 2:
     # spline
     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( o.line_width)),
                                          ( 'fill', 'none'),
                                          ( 'stroke', self.cc( o.line_color))))
   else:
     # normal line
     ps = ''
     for (x,y) in points:
       ps += '%.2f,%.2f ' % (x,y)
     poly = dom_extensions.elementUnder( self.group, 'polyline',
                                         (( 'points', ps),
                                          ( 'stroke-width', str( o.line_width)),
                                          ( 'fill', 'none'),
                                          ( 'stroke', self.cc( o.line_color))))
예제 #5
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
예제 #6
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