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)))
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)))
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))))
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))))
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