def __init__(self, logger=None, settings=None): Callback.Callbacks.__init__(self) if logger is not None: self.logger = logger else: self.logger = logging.Logger('TableViewBase') # Create settings and set defaults if settings is None: settings = Settings.SettingGroup(logger=self.logger) self.settings = settings # for debugging self.name = str(self) self.settings.addDefaults(color_alternate_rows=True, max_rows_for_col_resize=5000) # For callbacks for name in ( 'table-set', 'configure', ): self.enable_callback(name)
def __init__(self, logger, rgbmap=None, link=False, settings=None): Callback.Callbacks.__init__(self) self.logger = logger self.link_rgbmap = link if not rgbmap: rgbmap = RGBMap.RGBMapper(logger) # Create settings and set defaults if settings is None: settings = Settings.SettingGroup(logger=self.logger) self.settings = settings self._start_x = 0 self._sarr = None cbar = Viewers.CanvasView(logger=self.logger) width, height = 1, self.settings.get('cbar_height', 36) cbar.set_desired_size(width, height) cbar.enable_autozoom('off') cbar.enable_autocuts('off') # In web backend, JPEG rendering makes for mushy text ## settings = cbar.get_settings() ## settings.set(html5_canvas_format='png') # to respond quickly to contrast adjustment #cbar.defer_lagtime = 0.005 cbar.set_bg(0.4, 0.4, 0.4) # for debugging cbar.set_name('colorbar') self.cbar_view = cbar # add callbacks for contrast adjustment, etc. cbar.add_callback('configure', self.resize_cb) cbar.add_callback('cursor-down', self.cursor_press_cb) cbar.add_callback('cursor-move', self.cursor_drag_cb) cbar.add_callback('cursor-up', self.cursor_release_cb) cbar.add_callback('draw-up', self.draw_release_cb) cbar.add_callback('none-move', self.none_move_cb) cbar.add_callback('zoom-scroll', self.scroll_cb) cbar.add_callback('zoom-pinch', self.pinch_cb) #cbar.configure(width, height) iw = Viewers.GingaViewerWidget(viewer=cbar) self.widget = iw iw.resize(width, height) fontsize = self.settings.get('fontsize', 12) canvas = self.cbar_view.get_canvas() self.cbar = utils.ColorBar(offset=0, height=height, rgbmap=rgbmap, fontsize=fontsize) canvas.add(self.cbar, tag='colorbar') self.set_rgbmap(rgbmap) # For callbacks for name in ('motion', 'scroll'): self.enable_callback(name)
def save_profile(self, **params): if self.image == None: return profile = self.image.get('profile', None) if (profile == None): # If image has no profile then create one profile = Settings.SettingGroup() self.image.set(profile=profile) self.logger.debug("saving to image profile: params=%s" % (str(params))) profile.set(**params)
def get_image_profile(self, image): profile = image.get('profile', None) if profile is None: profile = Settings.SettingGroup() image.set(profile=profile) return profile
def __init__(self, logger, dist=None, settings=None, bpp=None): Callback.Callbacks.__init__(self) self.logger = logger # Create settings and set defaults if settings is None: settings = Settings.SettingGroup(logger=self.logger) self.settings = settings self.t_ = settings self.settings_keys = ['color_map', 'intensity_map', 'color_array', 'shift_array', 'color_algorithm', 'color_hashsize', ] # add our defaults self.t_.add_defaults(color_map='gray', intensity_map='ramp', color_algorithm='linear', color_hashsize=65535, color_array=None, shift_array=None) self.t_.get_setting('color_map').add_callback('set', self.color_map_set_cb) self.t_.get_setting('intensity_map').add_callback('set', self.intensity_map_set_cb) self.t_.get_setting('color_array').add_callback('set', self.color_array_set_cb) self.t_.get_setting('shift_array').add_callback('set', self.shift_array_set_cb) self.t_.get_setting('color_hashsize').add_callback('set', self.color_hashsize_set_cb) self.t_.get_setting('color_algorithm').add_callback('set', self.color_algorithm_set_cb) # For color and intensity maps self.cmap = None self.imap = None self.arr = None self.iarr = None self.carr = None self.sarr = None self.scale_pct = 1.0 # targeted bit depth per-pixel band of the output RGB array # (can be less than the data size of the output array) if bpp is None: bpp = 8 self.bpp = bpp # maximum value that we can generate in this range self.maxc = int(2 ** self.bpp - 1) # data size per pixel band in the output RGB array self._set_dtype() # For scaling algorithms hashsize = self.t_.get('color_hashsize', 65536) if dist is None: color_alg_name = self.t_.get('color_algorithm', 'linear') color_dist_class = ColorDist.get_dist(color_alg_name) dist = color_dist_class(hashsize) self.dist = dist # For callbacks for name in ('changed', ): self.enable_callback(name) self.suppress_changed = self.suppress_callback('changed', 'last') carr = self.t_.get('color_array', None) sarr = self.t_.get('shift_array', None) cm_name = self.t_.get('color_map', 'gray') self.set_color_map(cm_name) im_name = self.t_.get('intensity_map', 'ramp') self.set_intensity_map(im_name) # Initialize color array if carr is not None: self.set_carr(carr) else: self.calc_cmap() # Initialize shift array if sarr is not None: self.set_sarr(sarr) else: self.reset_sarr(callback=False)
def __init__(self, logger=None, rgbmap=None, settings=None): Callback.Callbacks.__init__(self) if logger != None: self.logger = logger else: self.logger = logging.Logger('FitsImageBase') # RGB mapper if rgbmap: self.rgbmap = rgbmap else: rgbmap = RGBMap.RGBMapper() self.rgbmap = rgbmap # Object that calculates auto cut levels self.autocuts = AutoCuts.AutoCuts(self.logger) # Dummy 1-pixel image self.image = AstroImage.AstroImage(numpy.zeros((1, 1)), logger=self.logger) # for debugging self.name = str(self) # Create settings and set defaults if settings == None: settings = Settings.SettingGroup(logger=self.logger) self.t_ = settings # for color mapping self.t_.addDefaults(color_map='ramp', intensity_map='ramp', color_algorithm='linear', color_hashsize=65535) for name in ('color_map', 'intensity_map', 'color_algorithm', 'color_hashsize'): self.t_.getSetting(name).add_callback('set', self.cmap_changed_cb) # Initialize RGBMap cmap_name = self.t_.get('color_map', 'ramp') try: cm = cmap.get_cmap(cmap_name) except KeyError: cm = cmap.get_cmap('ramp') rgbmap.set_cmap(cm) imap_name = self.t_.get('intensity_map', 'ramp') try: im = imap.get_imap(imap_name) except KeyError: im = imap.get_imap('ramp') rgbmap.set_imap(im) hash_size = self.t_.get('color_hashsize', 65535) rgbmap.set_hash_size(hash_size) hash_alg = self.t_.get('color_algorithm', 'linear') rgbmap.set_hash_algorithm(hash_alg) rgbmap.add_callback('changed', self.rgbmap_cb) # for cut levels self.t_.addDefaults(locut=0.0, hicut=0.0) for name in ('locut', 'hicut'): self.t_.getSetting(name).add_callback('set', self.cut_levels_cb) # for auto cut levels self.autocuts_options = ('on', 'override', 'off') self.t_.addDefaults( autocuts='override', autocut_method='histogram', autocut_hist_pct=AutoCuts.default_autocuts_hist_pct, autocut_bins=AutoCuts.default_autocuts_bins) for name in ('autocuts', 'autocut_method', 'autocut_hist_pct', 'autocut_bins'): self.t_.getSetting(name).add_callback('set', self.auto_levels_cb) # for zooming self.t_.addDefaults(zoomlevel=1.0, zoom_algorithm='step', scale_x_base=1.0, scale_y_base=1.0, zoom_rate=math.sqrt(2.0)) for name in ('zoom_rate', 'zoom_algorithm', 'scale_x_base', 'scale_y_base'): self.t_.getSetting(name).add_callback('set', self.zoomalg_change_cb) # max/min scaling self.t_.addDefaults(scale_max=10000.0, scale_min=0.00001) # autozoom options self.autozoom_options = ('on', 'override', 'off') self.t_.addDefaults(autozoom='on') # for panning self.t_makebg = False self.t_.addDefaults(reverse_pan=False, autocenter=True) # for transforms self.t_.addDefaults(flip_x=False, flip_y=False, swap_xy=False) for name in ('flip_x', 'flip_y', 'swap_xy'): self.t_.getSetting(name).add_callback('set', self.transform_cb) # desired rotation angle self.t_.addDefaults(rot_deg=0.0) self.t_.getSetting('rot_deg').add_callback('set', self.rotation_change_cb) # misc self.t_.addDefaults(use_embedded_profile=True, auto_orient=False) # PRIVATE IMPLEMENTATION STATE # image window width and height (see set_window_dimensions()) self._imgwin_wd = 1 self._imgwin_ht = 1 self._imgwin_set = False # center (and reference) pixel in the screen image (in pixel coords) self._ctr_x = 1 self._ctr_y = 1 # data indexes at the reference pixel (in data coords) self._org_x = 0 self._org_y = 0 # pan position self._pan_x = 0.0 self._pan_y = 0.0 # Origin in the data array of what is currently displayed (LL, UR) self._org_x1 = 0 self._org_y1 = 0 self._org_x2 = 0 self._org_y2 = 0 # offsets in the screen image for drawing (in screen coords) self._dst_x = 0 self._dst_y = 0 self._invertY = True # offsets in the screen image (in data coords) self._off_x = 0 self._off_y = 0 # desired scale factors self._scale_x = 1.0 self._scale_y = 1.0 # actual scale factors produced from desired ones self._org_scale_x = 0 self._org_scale_y = 0 self._cutout = None self._rotimg = None self._prergb = None self._rgbarr = None self.orientMap = { # tag: (flip_x, flip_y, swap_xy) 1: (False, True, False), 2: (True, True, False), 3: (True, False, False), 4: (False, False, False), 5: (True, False, True), 6: (True, True, True), 7: (False, True, True), 8: (False, False, True), } # For callbacks # TODO: we should be able to deprecate a lot of these with the new # settings callbacks for name in ('cut-set', 'zoom-set', 'pan-set', 'transform', 'rotate', 'image-set', 'configure', 'autocuts', 'autozoom'): self.enable_callback(name)
def __init__(self, logger=None, settings=None): Callback.Callbacks.__init__(self) if logger is not None: self.logger = logger else: self.logger = logging.Logger('PlotView') # Create settings and set defaults if settings is None: settings = Settings.SettingGroup(logger=self.logger) self.settings = settings self.settings.add_defaults(plot_bg='white', show_marker=False, linewidth=1, linestyle='-', linecolor='blue', markersize=6, markerwidth=0.5, markercolor='red', markerstyle='o', file_suffix='.png') # for debugging self.name = str(self) if not have_mpl: raise ImportError('Install matplotlib to use this plugin') top = Widgets.VBox() top.set_border_width(4) self.line_plot = plots.Plot(logger=self.logger, width=400, height=400) bg = self.settings.get('plot_bg', 'white') if plots.MPL_GE_2_0: kwargs = {'facecolor': bg} else: kwargs = {'axisbg': bg} self.line_plot.add_axis(**kwargs) self.plot_w = Plot.PlotWidget(self.line_plot) self.plot_w.resize(400, 400) # enable interactivity in the plot self.line_plot.connect_ui() self.line_plot.enable(zoom=True, pan=True) self.line_plot.add_callback('limits-set', self.limits_cb) ax = self.line_plot.ax ax.grid(True) top.add_widget(self.plot_w, stretch=1) captions = (('Log X', 'checkbutton', 'Log Y', 'checkbutton', 'Show Marker', 'checkbutton'), ('X Low:', 'label', 'x_lo', 'entry', 'X High:', 'label', 'x_hi', 'entry', 'Reset X', 'button'), ('Y Low:', 'label', 'y_lo', 'entry', 'Y High:', 'label', 'y_hi', 'entry', 'Reset Y', 'button'), ('Save', 'button')) # for now... orientation = 'vertical' w, b = Widgets.build_info(captions, orientation=orientation) self.w = b top.add_widget(w, stretch=0) b.log_x.set_state(self.line_plot.logx) b.log_x.add_callback('activated', self.log_x_cb) b.log_x.set_tooltip('Plot X-axis in log scale') b.log_y.set_state(self.line_plot.logy) b.log_y.add_callback('activated', self.log_y_cb) b.log_y.set_tooltip('Plot Y-axis in log scale') b.x_lo.add_callback('activated', lambda w: self.set_xlim_cb()) b.x_lo.set_tooltip('Set X lower limit') b.x_hi.add_callback('activated', lambda w: self.set_xlim_cb()) b.x_hi.set_tooltip('Set X upper limit') b.y_lo.add_callback('activated', lambda w: self.set_ylim_cb()) b.y_lo.set_tooltip('Set Y lower limit') b.y_hi.add_callback('activated', lambda w: self.set_ylim_cb()) b.y_hi.set_tooltip('Set Y upper limit') b.reset_x.add_callback('activated', lambda w: self.reset_xlim_cb()) b.reset_x.set_tooltip('Autoscale X limits') b.reset_y.add_callback('activated', lambda w: self.reset_ylim_cb()) b.reset_y.set_tooltip('Autoscale Y limits') b.show_marker.set_state(self.settings.get('show_marker', False)) b.show_marker.add_callback('activated', self.set_marker_cb) b.show_marker.set_tooltip('Mark data points') # Button to save plot self.save_plot = b.save self.save_plot.set_tooltip('Save table plot') self.save_plot.add_callback('activated', lambda w: self.save_cb()) self.save_plot.set_enabled(False) self.widget = top # For callbacks for name in ['image-set']: self.enable_callback(name)