def adjust_selector (self): """ instantiate and/or adjust contents of ResultsRange object """ if self.results_selector is None: self.results_selector = ResultsRange(self.layout_parent) self.results_selector.setMaxValue(self.max_list_length) self.results_selector.set_offset_index(0) self.results_selector.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Minimum) self.layout.addWidget(self.results_selector, 1,0,Qt.AlignHCenter) self.results_selector.show() QObject.connect(self.results_selector, PYSIGNAL('result_index'), self.replay_data) QObject.connect(self.results_selector, PYSIGNAL('adjust_results_buffer_size'), self.set_results_buffer) self.results_selector.set_emit(False) self.results_selector.setRange(self.data_list_length-1) self.results_selector.setLabel(self.label) self.results_selector.set_emit(True)
def adjust_selector(self): """ instantiate and/or adjust contents of ResultsRange object """ if self.results_selector is None: self.results_selector = ResultsRange(self.layout_parent) self.results_selector.setMaxValue(self.max_list_length) self.results_selector.set_offset_index(0) self.results_selector.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) self.layout.addWidget(self.results_selector, 1, 0, Qt.AlignHCenter) self.results_selector.show() QObject.connect(self.results_selector, PYSIGNAL("result_index"), self.replay_data) QObject.connect(self.results_selector, PYSIGNAL("adjust_results_buffer_size"), self.set_results_buffer) self.results_selector.set_emit(False) self.results_selector.setRange(self.data_list_length - 1) self.results_selector.setLabel(self.label) self.results_selector.set_emit(True)
class SvgPlotter(GriddedPlugin): """ a class to visualize data from external svg graphics files """ _icon = pixmaps.bars3d viewer_name = "Svg Plotter"; def is_viewable (data): return len(data) > 0; is_viewable = staticmethod(is_viewable); def __init__(self,gw,dataitem,cellspec={},**opts): GriddedPlugin.__init__(self,gw,dataitem,cellspec=cellspec); """ a plugin for showing svg plots """ self._rec = None; self._wtop = None; self.dataitem = dataitem self.png_number = 0 self.data_list = [] self.data_list_labels = [] self.data_list_length = 0 self.max_list_length = 50 self.layout_created = False self.counter = -1 self.reset_plot_stuff() # back to 'real' work if dataitem and dataitem.data is not None: self.set_data(dataitem); def reset_plot_stuff(self): """ resets widgets to None. Needed if we have been putting out a message about Cache not containing results, etc """ self._svg_plotter = None self.plotPrinter = None self.results_selector = None self.status_label = None self.layout_parent = None self.layout = None def wtop (self): """ function needed by Oleg for reasons known only to him! """ return self._wtop; def create_layout_stuff(self): """ create grid layouts into which plotter widgets are inserted """ if self.layout_parent is None or not self.layout_created: self.layout_parent = QWidget(self.wparent()) self.layout = QGridLayout(self.layout_parent) self.set_widgets(self.layout_parent,self.dataitem.caption,icon=self.icon()) self.layout_created = True self._wtop = self.layout_parent; def update_status(self, status): if not status is None: self.status_label.setText(status) def grab_display(self, title=None): self.png_number = self.png_number + 1 png_str = str(self.png_number) if title is None: save_file = './meqbrowser' + png_str + '.png' else: save_file = title + png_str + '.png' save_file_no_space= save_file.replace(' ','_') result = QPixmap.grabWidget(self._svg_plotter).save(save_file_no_space, "PNG") def set_data (self,dataitem,default_open=None,**opts): """ this callback receives data from the meqbrowser, when the user has requested a plot. It decides whether the data is from a VellSet or visu data record, and after any necessary preprocssing forwards the data to one of the functions which does the actual plotting """ _dprint(3, '** in svg_plotter:set_data callback') self._rec = dataitem.data; _dprint(3, 'set_data: initial self._rec ', self._rec) # if we are single stepping through requests, Oleg may reset the # cache, so check for a non-data record situation if self._rec is None: return if isinstance(self._rec, bool): return self.label = ''; # extra label, filled in if possible # there's a problem here somewhere ... if dmi_typename(self._rec) != 'MeqResult': # data is not already a result? # try to put request ID in label rq_id_found = False data_failure = False try: if self._rec.cache.has_key("request_id"): self.label = "rq " + str(self._rec.cache.request_id); rq_id_found = True if self._rec.cache.has_key("result"): self._rec = self._rec.cache.result; # look for cache.result record if not rq_id_found and self._rec.has_key("request_id"): self.label = "rq " + str(self._rec.request_id); else: data_failure = True _dprint(3, 'we have req id ', self.label) except: data_failure = True if data_failure: _dprint(3, ' we have a data failure') # cached_result not found, display an empty viewer with a "no result # in this node record" message (the user can then use the Display with # menu to switch to a different viewer) Message = "No cache result record was found for this node, so no plot can be made." cache_message = QLabel(Message,self.wparent()) cache_message.setTextFormat(Qt.RichText) self._wtop = cache_message self.set_widgets(cache_message) self.reset_plot_stuff() return # update display with current data process_result = self.process_data() # add this data set to internal list for later replay if process_result: if self.max_list_length > 0: self.data_list.append(self._rec) self.data_list_labels.append(self.label) if len(self.data_list_labels) > self.max_list_length: del self.data_list_labels[0] del self.data_list[0] if len(self.data_list) != self.data_list_length: self.data_list_length = len(self.data_list) if self.data_list_length > 1: _dprint(3, 'calling adjust_selector') self.adjust_selector() def process_data (self): """ process the actual record structure associated with a Cache result """ process_result = False # are we dealing with an svg result? if self._rec.has_key("svg_plot"): self.create_layout_stuff() self.show_svg_plot() process_result = True # enable & highlight the cell self.enable(); self.flash_refresh(); _dprint(3, 'exiting process_data') return process_result def replay_data (self, data_index): """ call to redisplay contents of a result record stored in a results history buffer """ if data_index < len(self.data_list): self._rec = self.data_list[data_index] self.label = self.data_list_labels[data_index] self.results_selector.setLabel(self.label) process_result = self.process_data() def show_svg_plot(self, store_rec=True): """ process incoming vells data and attributes into the appropriate type of plot """ # if we are single stepping through requests, Oleg may reset the # cache, so check for a non-data record situation if store_rec and isinstance(self._rec, bool): return svg_plot = self._rec.svg_plot # print 'incoming plot string is ', svg_plot # print '***************************' # print 'handling svg_plot event - string has length ', len(svg_plot) # print '***************************' fd, file_name = tempfile.mkstemp(text='w',suffix='.svg',dir='/tmp') file = os.fdopen(fd,"w") try: result = file.writelines(svg_plot) except: try: result = file.writelines(svg_plot[1]) except: print 'There is nothing to plot!' return file.close() if not self._svg_plotter is None: self._svg_plotter.reparent(QWidget(), 0, QPoint()) self._svg_plotter = None if self._svg_plotter is None: self._svg_plotter = PictureDisplay(parent=self.layout_parent) self.layout.addWidget(self._svg_plotter, 0, 0) self.plotPrinter = plot_printer.plot_printer(self._svg_plotter) QObject.connect(self._svg_plotter,PYSIGNAL('do_print'), self.plotPrinter.do_print) QObject.connect(self._svg_plotter, PYSIGNAL('save_display'), self.grab_display) self._svg_plotter.loadPicture(file_name) self._svg_plotter.show() # finally, get rid of the temporary file # if False: # presently disabled, for testing try: os.system("/bin/rm -fr "+ file_name); except: pass # end show_svg_plot() def set_results_buffer (self, result_value): """ callback to set the number of results records that can be stored in a results history buffer """ if result_value < 0: return self.max_list_length = result_value if len(self.data_list_labels) > self.max_list_length: differ = len(self.data_list_labels) - self.max_list_length for i in range(differ): del self.data_list_labels[0] del self.data_list[0] if len(self.data_list) != self.data_list_length: self.data_list_length = len(self.data_list) self.show_svg_plot(store_rec=False) def adjust_selector (self): """ instantiate and/or adjust contents of ResultsRange object """ if self.results_selector is None: self.results_selector = ResultsRange(self.layout_parent) self.results_selector.setMaxValue(self.max_list_length) self.results_selector.set_offset_index(0) self.results_selector.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Minimum) self.layout.addWidget(self.results_selector, 1,0,Qt.AlignHCenter) self.results_selector.show() QObject.connect(self.results_selector, PYSIGNAL('result_index'), self.replay_data) QObject.connect(self.results_selector, PYSIGNAL('adjust_results_buffer_size'), self.set_results_buffer) self.results_selector.set_emit(False) self.results_selector.setRange(self.data_list_length-1) self.results_selector.setLabel(self.label) self.results_selector.set_emit(True)
class SvgPlotter(GriddedPlugin): """ a class to visualize data from external svg graphics files """ _icon = pixmaps.bars3d viewer_name = "Svg Plotter" def is_viewable(data): return len(data) > 0 is_viewable = staticmethod(is_viewable) def __init__(self, gw, dataitem, cellspec={}, **opts): GriddedPlugin.__init__(self, gw, dataitem, cellspec=cellspec) """ a plugin for showing svg plots """ self._rec = None self._wtop = None self.dataitem = dataitem self.png_number = 0 self.data_list = [] self.data_list_labels = [] self.data_list_length = 0 self.max_list_length = 50 self.layout_created = False self.counter = -1 self.reset_plot_stuff() # back to 'real' work if dataitem and dataitem.data is not None: self.set_data(dataitem) def reset_plot_stuff(self): """ resets widgets to None. Needed if we have been putting out a message about Cache not containing results, etc """ self._svg_plotter = None self.plotPrinter = None self.results_selector = None self.status_label = None self.layout_parent = None self.layout = None def wtop(self): """ function needed by Oleg for reasons known only to him! """ return self._wtop def create_layout_stuff(self): """ create grid layouts into which plotter widgets are inserted """ if self.layout_parent is None or not self.layout_created: self.layout_parent = QWidget(self.wparent()) self.layout = QGridLayout(self.layout_parent) self.set_widgets(self.layout_parent, self.dataitem.caption, icon=self.icon()) self.layout_created = True self._wtop = self.layout_parent def update_status(self, status): if not status is None: self.status_label.setText(status) def grab_display(self, title=None): self.png_number = self.png_number + 1 png_str = str(self.png_number) if title is None: save_file = "./meqbrowser" + png_str + ".png" else: save_file = title + png_str + ".png" save_file_no_space = save_file.replace(" ", "_") result = QPixmap.grabWidget(self._svg_plotter).save(save_file_no_space, "PNG") def set_data(self, dataitem, default_open=None, **opts): """ this callback receives data from the meqbrowser, when the user has requested a plot. It decides whether the data is from a VellSet or visu data record, and after any necessary preprocssing forwards the data to one of the functions which does the actual plotting """ _dprint(3, "** in svg_plotter:set_data callback") self._rec = dataitem.data _dprint(3, "set_data: initial self._rec ", self._rec) # if we are single stepping through requests, Oleg may reset the # cache, so check for a non-data record situation if self._rec is None: return if isinstance(self._rec, bool): return self.label = "" # extra label, filled in if possible # there's a problem here somewhere ... if dmi_typename(self._rec) != "MeqResult": # data is not already a result? # try to put request ID in label rq_id_found = False data_failure = False try: if self._rec.cache.has_key("request_id"): self.label = "rq " + str(self._rec.cache.request_id) rq_id_found = True if self._rec.cache.has_key("result"): self._rec = self._rec.cache.result # look for cache.result record if not rq_id_found and self._rec.has_key("request_id"): self.label = "rq " + str(self._rec.request_id) else: data_failure = True _dprint(3, "we have req id ", self.label) except: data_failure = True if data_failure: _dprint(3, " we have a data failure") # cached_result not found, display an empty viewer with a "no result # in this node record" message (the user can then use the Display with # menu to switch to a different viewer) Message = "No cache result record was found for this node, so no plot can be made." cache_message = QLabel(Message, self.wparent()) cache_message.setTextFormat(Qt.RichText) self._wtop = cache_message self.set_widgets(cache_message) self.reset_plot_stuff() return # update display with current data process_result = self.process_data() # add this data set to internal list for later replay if process_result: if self.max_list_length > 0: self.data_list.append(self._rec) self.data_list_labels.append(self.label) if len(self.data_list_labels) > self.max_list_length: del self.data_list_labels[0] del self.data_list[0] if len(self.data_list) != self.data_list_length: self.data_list_length = len(self.data_list) if self.data_list_length > 1: _dprint(3, "calling adjust_selector") self.adjust_selector() def process_data(self): """ process the actual record structure associated with a Cache result """ process_result = False # are we dealing with an svg result? if self._rec.has_key("svg_plot"): self.create_layout_stuff() self.show_svg_plot() process_result = True # enable & highlight the cell self.enable() self.flash_refresh() _dprint(3, "exiting process_data") return process_result def replay_data(self, data_index): """ call to redisplay contents of a result record stored in a results history buffer """ if data_index < len(self.data_list): self._rec = self.data_list[data_index] self.label = self.data_list_labels[data_index] self.results_selector.setLabel(self.label) process_result = self.process_data() def show_svg_plot(self, store_rec=True): """ process incoming vells data and attributes into the appropriate type of plot """ # if we are single stepping through requests, Oleg may reset the # cache, so check for a non-data record situation if store_rec and isinstance(self._rec, bool): return svg_plot = self._rec.svg_plot # print 'incoming plot string is ', svg_plot # print '***************************' # print 'handling svg_plot event - string has length ', len(svg_plot) # print '***************************' fd, file_name = tempfile.mkstemp(text="w", suffix=".svg", dir="/tmp") file = os.fdopen(fd, "w") try: result = file.writelines(svg_plot) except: try: result = file.writelines(svg_plot[1]) except: print "There is nothing to plot!" return file.close() if not self._svg_plotter is None: self._svg_plotter.reparent(QWidget(), 0, QPoint()) self._svg_plotter = None if self._svg_plotter is None: self._svg_plotter = PictureDisplay(parent=self.layout_parent) self.layout.addWidget(self._svg_plotter, 0, 0) self.plotPrinter = plot_printer.plot_printer(self._svg_plotter) QObject.connect(self._svg_plotter, PYSIGNAL("do_print"), self.plotPrinter.do_print) QObject.connect(self._svg_plotter, PYSIGNAL("save_display"), self.grab_display) self._svg_plotter.loadPicture(file_name) self._svg_plotter.show() # finally, get rid of the temporary file # if False: # presently disabled, for testing try: os.system("/bin/rm -fr " + file_name) except: pass # end show_svg_plot() def set_results_buffer(self, result_value): """ callback to set the number of results records that can be stored in a results history buffer """ if result_value < 0: return self.max_list_length = result_value if len(self.data_list_labels) > self.max_list_length: differ = len(self.data_list_labels) - self.max_list_length for i in range(differ): del self.data_list_labels[0] del self.data_list[0] if len(self.data_list) != self.data_list_length: self.data_list_length = len(self.data_list) self.show_svg_plot(store_rec=False) def adjust_selector(self): """ instantiate and/or adjust contents of ResultsRange object """ if self.results_selector is None: self.results_selector = ResultsRange(self.layout_parent) self.results_selector.setMaxValue(self.max_list_length) self.results_selector.set_offset_index(0) self.results_selector.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) self.layout.addWidget(self.results_selector, 1, 0, Qt.AlignHCenter) self.results_selector.show() QObject.connect(self.results_selector, PYSIGNAL("result_index"), self.replay_data) QObject.connect(self.results_selector, PYSIGNAL("adjust_results_buffer_size"), self.set_results_buffer) self.results_selector.set_emit(False) self.results_selector.setRange(self.data_list_length - 1) self.results_selector.setLabel(self.label) self.results_selector.set_emit(True)