def __draw_lines_hide(self, gc, x, y, transform=None): """ x and y are equal length arrays, draw lines connecting each point in x, y """ if debugPS: self._pswriter.write('% draw_lines \n') if transform: if transform.need_nonlinear(): x, y, mask = transform.nonlinear_only_numerix(x, y, returnMask=1) else: mask = ones(x.shape) vec6 = transform.as_vec6_val() a, b, c, d, tx, ty = vec6 sx, sy = get_vec6_scales(vec6) start = 0 end = 1000 points = zip(x, y) write = self._pswriter.write write('gsave\n') self.push_gc(gc) write('[%f %f %f %f %f %f] concat\n' % (a, b, c, d, tx, ty)) while start < len(x): # put moveto on all the bad data and on the first good # point after the bad data codes = where(mask[start:end + 1], 'l', 'm') ind = nonzero(mask[start:end + 1] == 0) + 1 if ind[-1] >= len(codes): ind = ind[:-1] put(codes, ind, 'm') thisx = x[start:end + 1] thisy = y[start:end + 1] to_draw = izip(thisx, thisy, codes) if not to_draw: break ps = ['%1.3f %1.3f m' % to_draw.next()[:2]] ps.extend(["%1.3f %1.3f %c" % tup for tup in to_draw]) # we don't want to scale the line width, etc so invert the # scale for the stroke ps.append('\ngsave %f %f scale stroke grestore\n' % (1. / sx, 1. / sy)) write('\n'.join(ps)) start = end end += 1000 write("grestore\n")
def __draw_lines_hide(self, gc, x, y, transform=None): """ x and y are equal length arrays, draw lines connecting each point in x, y """ if debugPS: self._pswriter.write('% draw_lines \n') if transform: if transform.need_nonlinear(): x, y, mask = transform.nonlinear_only_numerix(x, y, returnMask=1) else: mask = ones(x.shape) vec6 = transform.as_vec6_val() a,b,c,d,tx,ty = vec6 sx, sy = get_vec6_scales(vec6) start = 0 end = 1000 points = zip(x,y) write = self._pswriter.write write('gsave\n') self.push_gc(gc) write('[%f %f %f %f %f %f] concat\n'%(a,b,c,d,tx,ty)) while start < len(x): # put moveto on all the bad data and on the first good # point after the bad data codes = where(mask[start:end+1], 'l', 'm') ind = nonzero(mask[start:end+1]==0)+1 if ind[-1]>=len(codes): ind = ind[:-1] put(codes, ind, 'm') thisx = x[start:end+1] thisy = y[start:end+1] to_draw = izip(thisx, thisy, codes) if not to_draw: break ps = ['%1.3f %1.3f m' % to_draw.next()[:2]] ps.extend(["%1.3f %1.3f %c" % tup for tup in to_draw]) # we don't want to scale the line width, etc so invert the # scale for the stroke ps.append('\ngsave %f %f scale stroke grestore\n'%(1./sx,1./sy)) write('\n'.join(ps)) start = end end += 1000 write("grestore\n")
def draw_markers(self, gc, path, rgbFace, x, y, transform): if _debug: print "%s.%s()" % (self.__class__.__name__, _fn_name()) ctx = gc.ctx if transform.need_nonlinear(): x, y = transform.nonlinear_only_numerix(x, y) x, y = transform.numerix_x_y(x, y) # do nonlinear and affine transform # TODO - use cairo transform # matrix worked for dotted lines, but not markers in line_styles.py # it upsets/transforms generate_path() ? # need to flip y too, and update generate_path() ? # the a,b,c,d,tx,ty affine which transforms x and y # vec6 = transform.as_vec6_val() # not used (yet) # matrix_old = ctx.get_matrix() # ctx.set_matrix (cairo.Matrix (*vec6)) path_list = [path.vertex() for i in range(path.total_vertices())] def generate_path(path_list): for code, xp, yp in path_list: if code == agg.path_cmd_move_to: ctx.move_to(xp, -yp) elif code == agg.path_cmd_line_to: ctx.line_to(xp, -yp) elif code == agg.path_cmd_end_poly: ctx.close_path() for x, y in izip(x, y): ctx.save() ctx.new_path() ctx.translate(x, self.height - y) generate_path(path_list) if rgbFace: ctx.save() ctx.set_source_rgb(*rgbFace) # later - set alpha also? ctx.fill_preserve() ctx.restore() # undo colour change and restore path ctx.stroke() ctx.restore() # undo translate()
def draw_markers(self, gc, path, rgbFace, x, y, transform): if DEBUG: print 'backend_cairo.RendererCairo.%s()' % _fn_name() ctx = gc.ctx if transform.need_nonlinear(): x,y = transform.nonlinear_only_numerix(x, y) x, y = transform.numerix_x_y(x, y) # the a,b,c,d,tx,ty affine which transforms x and y #vec6 = transform.as_vec6_val() # not used (yet) # todo - use cairo transform # matrix worked for dotted lines, but not markers in line_styles.py # it upsets/transforms generate_path() ? #matrix_old = ctx.matrix #matrix = cairo.Matrix (*vec6) #ctx.set_matrix (matrix) path_list = [path.vertex() for i in range(path.total_vertices())] def generate_path (path_list): for code, xp, yp in path_list: if code == agg.path_cmd_move_to: ctx.move_to (xp, -yp) elif code == agg.path_cmd_line_to: ctx.line_to (xp, -yp) elif code == agg.path_cmd_end_poly: ctx.close_path() for x,y in izip(x,y): ctx.save() ctx.new_path() ctx.translate(x, self.height - y) generate_path (path_list) if rgbFace: ctx.save() ctx.set_rgb_color (*rgbFace) # later - set alpha also? ctx.fill() ctx.restore() # undo colour change and restore path ctx.stroke() ctx.restore() # undo translate()
def draw_markers(self, gc, path, rgbFace, x, y, transform): if _debug: print '%s.%s()' % (self.__class__.__name__, _fn_name()) ctx = gc.ctx if transform.need_nonlinear(): x, y = transform.nonlinear_only_numerix(x, y) x, y = transform.numerix_x_y(x, y) # do nonlinear and affine transform # TODO - use cairo transform # matrix worked for dotted lines, but not markers in line_styles.py # it upsets/transforms generate_path() ? # need to flip y too, and update generate_path() ? # the a,b,c,d,tx,ty affine which transforms x and y #vec6 = transform.as_vec6_val() # not used (yet) #matrix_old = ctx.get_matrix() #ctx.set_matrix (cairo.Matrix (*vec6)) path_list = [path.vertex() for i in range(path.total_vertices())] def generate_path(path_list): for code, xp, yp in path_list: if code == agg.path_cmd_move_to: ctx.move_to(xp, -yp) elif code == agg.path_cmd_line_to: ctx.line_to(xp, -yp) elif code == agg.path_cmd_end_poly: ctx.close_path() for x, y in izip(x, y): ctx.save() ctx.new_path() ctx.translate(x, self.height - y) generate_path(path_list) if rgbFace: ctx.save() ctx.set_source_rgb(*rgbFace) # later - set alpha also? ctx.fill_preserve() ctx.restore() # undo colour change and restore path ctx.stroke() ctx.restore() # undo translate()
def draw_lines(self, gc, x, y, transform=None): if DEBUG: print 'backend_cairo.RendererCairo.%s()' % _fn_name() if transform: if transform.need_nonlinear(): x, y = transform.nonlinear_only_numerix(x, y) x, y = transform.numerix_x_y(x, y) ctx = gc.ctx matrix_old = ctx.matrix ctx.set_matrix (self.matrix_flipy) points = izip(x,y) x, y = points.next() ctx.new_path() ctx.move_to (x, y) for x,y in points: ctx.line_to (x, y) ctx.stroke() ctx.set_matrix (matrix_old)
def draw_lines(self, gc, x, y, transform=None): if _debug: print '%s.%s()' % (self.__class__.__name__, _fn_name()) if transform: if transform.need_nonlinear(): x, y = transform.nonlinear_only_numerix(x, y) x, y = transform.numerix_x_y(x, y) ctx = gc.ctx matrix_old = ctx.get_matrix() ctx.set_matrix (self.matrix_flipy) points = izip(x,y) x, y = points.next() ctx.new_path() ctx.move_to (x, y) for x,y in points: ctx.line_to (x, y) self._fill_and_stroke (ctx, None) ctx.set_matrix (matrix_old)
def draw_lines(self, gc, x, y, transform=None): """ x and y are equal length arrays, draw lines connecting each point in x, y """ if debugPS: self._pswriter.write('% draw_lines \n') if transform: # this won't be called if draw_markers is hidden #if transform.need_nonlinear(): # x, y = transform.nonlinear_only_numerix(x, y) x, y = transform.numerix_x_y(x, y) start = 0 end = 1000 points = zip(x, y) while start < len(x): to_draw = izip(x[start:end], y[start:end]) ps = ["%1.3f %1.3f m" % to_draw.next()] ps.extend(["%1.3f %1.3f l" % point for point in to_draw]) self._draw_ps("\n".join(ps), gc, None) start = end end += 1000
def draw_lines(self, gc, x, y, transform=None): """ x and y are equal length arrays, draw lines connecting each point in x, y """ if debugPS: self._pswriter.write('% draw_lines \n') if transform: # this won't be called if draw_markers is hidden #if transform.need_nonlinear(): # x, y = transform.nonlinear_only_numerix(x, y) x, y = transform.numerix_x_y(x, y) start = 0 end = 1000 points = zip(x,y) while start < len(x): to_draw = izip(x[start:end],y[start:end]) ps = ["%1.3f %1.3f m" % to_draw.next()] ps.extend(["%1.3f %1.3f l" % point for point in to_draw]) self._draw_ps("\n".join(ps), gc, None) start = end end += 1000
def draw_lines(self, gc, x, y, transform=None): if _debug: print '%s.%s()' % (self.__class__.__name__, _fn_name()) if transform: if transform.need_nonlinear(): x, y = transform.nonlinear_only_numerix(x, y) x, y = transform.numerix_x_y(x, y) ctx = gc.ctx matrix_old = ctx.get_matrix() ctx.set_matrix(self.matrix_flipy) points = izip(x, y) x, y = points.next() ctx.new_path() ctx.move_to(x, y) for x, y in points: ctx.line_to(x, y) self._fill_and_stroke(ctx, None) ctx.set_matrix(matrix_old)
def _draw_markers(self, gc, path, rgbFace, x, y, transform): """ Draw the markers defined by path at each of the positions in x and y. path coordinates are points, x and y coords will be transformed by the transform """ if debugPS: self._pswriter.write('% draw_markers \n') return if rgbFace: if rgbFace[0] == rgbFace[0] and rgbFace[0] == rgbFace[2]: ps_color = '%1.3f setgray' % rgbFace[0] else: ps_color = '%1.3f %1.3f %1.3f setrgbcolor' % rgbFace #if transform.need_nonlinear(): # x,y,mask = transform.nonlinear_only_numerix(x, y, returnMask=1) #else: # mask = ones(x.shape) x, y = transform.numerix_x_y(x, y) # the a,b,c,d,tx,ty affine which transforms x and y #vec6 = transform.as_vec6_val() #theta = (180 / pi) * math.atan2 (vec6[1], src[0]) # this defines a single vertex. We need to define this as ps # function, properly stroked and filled with linewidth etc, # and then simply iterate over the x and y and call this # function at each position. Eg, this is the path that is # relative to each x and y offset. # construct the generic marker command: ps_cmd = ['gsave'] ps_cmd.append('newpath') ps_cmd.append('translate') while 1: code, xp, yp = path.vertex() if code == agg.path_cmd_stop: ps_cmd.append('closepath') # Hack, path_cmd_end_poly not found break elif code == agg.path_cmd_move_to: ps_cmd.append('%1.3f %1.3f m' % (xp, yp)) elif code == agg.path_cmd_line_to: ps_cmd.append('%1.3f %1.3f l' % (xp, yp)) elif code == agg.path_cmd_curve3: pass elif code == agg.path_cmd_curve4: pass elif code == agg.path_cmd_end_poly: pass ps_cmd.append('closepath') elif code == agg.path_cmd_mask: pass else: pass #print code if rgbFace: ps_cmd.append('gsave') ps_cmd.append(ps_color) ps_cmd.append('fill') ps_cmd.append('grestore') ps_cmd.append('stroke') ps_cmd.append('grestore') # undo translate() ps_cmd = '\n'.join(ps_cmd) #self._pswriter.write(' '.join(['/marker {', ps_cmd, '} bind def\n'])) #self._pswriter.write('[%s]' % ';'.join([float(val) for val in vec6])) # Now evaluate the marker command at each marker location: start = 0 end = 1000 while start < len(x): to_draw = izip(x[start:end], y[start:end]) ps = ['%1.3f %1.3f marker' % point for point in to_draw] self._draw_ps("\n".join(ps), gc, None) start = end end += 1000
def _draw_markers(self, gc, path, rgbFace, x, y, transform): """ Draw the markers defined by path at each of the positions in x and y. path coordinates are points, x and y coords will be transformed by the transform """ if debugPS: self._pswriter.write('% draw_markers \n') return if rgbFace: if rgbFace[0]==rgbFace[0] and rgbFace[0]==rgbFace[2]: ps_color = '%1.3f setgray' % rgbFace[0] else: ps_color = '%1.3f %1.3f %1.3f setrgbcolor' % rgbFace #if transform.need_nonlinear(): # x,y,mask = transform.nonlinear_only_numerix(x, y, returnMask=1) #else: # mask = ones(x.shape) x, y = transform.numerix_x_y(x, y) # the a,b,c,d,tx,ty affine which transforms x and y #vec6 = transform.as_vec6_val() #theta = (180 / pi) * math.atan2 (vec6[1], src[0]) # this defines a single vertex. We need to define this as ps # function, properly stroked and filled with linewidth etc, # and then simply iterate over the x and y and call this # function at each position. Eg, this is the path that is # relative to each x and y offset. # construct the generic marker command: ps_cmd = ['gsave'] ps_cmd.append('newpath') ps_cmd.append('translate') while 1: code, xp, yp = path.vertex() if code == agg.path_cmd_stop: ps_cmd.append('closepath') # Hack, path_cmd_end_poly not found break elif code == agg.path_cmd_move_to: ps_cmd.append('%1.3f %1.3f m' % (xp,yp)) elif code == agg.path_cmd_line_to: ps_cmd.append('%1.3f %1.3f l' % (xp,yp)) elif code == agg.path_cmd_curve3: pass elif code == agg.path_cmd_curve4: pass elif code == agg.path_cmd_end_poly: pass ps_cmd.append('closepath') elif code == agg.path_cmd_mask: pass else: pass #print code if rgbFace: ps_cmd.append('gsave') ps_cmd.append(ps_color) ps_cmd.append('fill') ps_cmd.append('grestore') ps_cmd.append('stroke') ps_cmd.append('grestore') # undo translate() ps_cmd = '\n'.join(ps_cmd) #self._pswriter.write(' '.join(['/marker {', ps_cmd, '} bind def\n'])) #self._pswriter.write('[%s]' % ';'.join([float(val) for val in vec6])) # Now evaluate the marker command at each marker location: start = 0 end = 1000 while start < len(x): to_draw = izip(x[start:end],y[start:end]) ps = ['%1.3f %1.3f marker' % point for point in to_draw] self._draw_ps("\n".join(ps), gc, None) start = end end += 1000