def __init__(self, logger, rgbmap=None): QtGui.QWidget.__init__(self) Callback.Callbacks.__init__(self) self.logger = logger self.pixmap = None if not rgbmap: rgbmap = RGBMap.RGBMapper() self.set_rgbmap(rgbmap) self._start_x = 0 # for drawing range self.t_showrange = True self.t_font = 'Sans Serif' self.t_fontsize = 8 self.t_spacing = 40 self.loval = 0 self.hival = 0 self._interval = {} self._avg_pixels_per_range_num = 70 # For callbacks for name in ('motion', 'scroll'): self.enable_callback(name) hpolicy = QtGui.QSizePolicy.MinimumExpanding vpolicy = QtGui.QSizePolicy.MinimumExpanding self.setSizePolicy(hpolicy, vpolicy) # in order to generate mouse events with no buttons down self.setMouseTracking(True)
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 rebuild_cmaps(self): """Builds a color RGB image containing color bars of all the possible color maps and their labels. """ self.logger.info("building color maps image") ht, wd, sep = self._cmht, self._cmwd, self._cmsep viewer = self.p_view # put the canvas into pick mode canvas = viewer.get_canvas() canvas.delete_all_objects() # get the list of color maps cm_names = self.cm_names num_cmaps = len(cm_names) viewer.configure_surface(500, (ht + sep) * num_cmaps) # create a bunch of color bars and make one large compound object # with callbacks for clicking on individual color bars l2 = [] ColorBar = canvas.get_draw_class('drawablecolorbar') Text = canvas.get_draw_class('text') #ch_rgbmap = chviewer.get_rgbmap() #dist = ch_rgbmap.get_dist() dist = None #imap = ch_rgbmap.get_imap() logger = viewer.get_logger() for i, name in enumerate(cm_names): rgbmap = RGBMap.RGBMapper(logger, dist=dist) rgbmap.set_cmap(cmap.get_cmap(name)) #rgbmap.set_imap(imap) x1, y1 = self._cmxoff, i * (ht + sep) x2, y2 = x1 + wd, y1 + ht cbar = ColorBar(x1, y1, x2, y2, cm_name=name, showrange=False, rgbmap=rgbmap, coord='canvas') l2.append(cbar) l2.append( Text(x2 + sep, y2, name, color='white', fontsize=16, coord='canvas')) Compound = canvas.get_draw_class('compoundobject') obj = Compound(*l2) canvas.add(obj) self._max_y = y2 rgb_img = self.p_view.get_image_as_array() self.r_image.set_data(rgb_img)
def __init__(self, logger, rgbmap=None, link=False): gtk.DrawingArea.__init__(self) Callback.Callbacks.__init__(self) self.surface = None self.logger = logger self.link_rgbmap = link if not rgbmap: rgbmap = RGBMap.RGBMapper(logger) self.set_rgbmap(rgbmap) self._start_x = 0 self._sarr = None # for drawing range self.t_showrange = True self.t_font = 'Sans Serif' self.t_fontsize = 10 self.t_spacing = 40 self.loval = 0.0 self.hival = 0.0 self._interval = {} self._avg_pixels_per_range_num = 70 self.mark_pos = None # For callbacks for name in ('motion', 'scroll'): self.enable_callback(name) if not gtksel.have_gtk3: self.connect("expose_event", self.expose_event) else: self.connect("draw", self.draw_event) self.connect("configure_event", self.configure_event) self.connect("size-request", self.size_request) self.connect("motion_notify_event", self.motion_notify_event) self.connect("button_press_event", self.button_press_event) self.connect("button_release_event", self.button_release_event) self.connect("scroll_event", self.scroll_event) mask = self.get_events() self.set_events(mask | gtk.gdk.EXPOSURE_MASK | gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK | gtk.gdk.SCROLL_MASK)
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)