예제 #1
0
class AutopanTool(Tool_GViewApp):
    def __init__(self, app=None, startpath=None):
        Tool_GViewApp.__init__(self,app)

        self.init_menu()
        self.view=None
        self.second_view = None
        
        self.playing=0
        self.id=None
        self.tool = gview.GvAutopanTool()
        if os.name != 'nt':
            lp = os.environ.get('LD_LIBRARY_PATH', '')
        else:
            lp = os.environ.get('PATH', '')

        if 'Mesa' in lp:
            self.speed = 0.001
            self.default_speed = 0.001
        else:
            self.speed = 0.01
            self.default_speed = 0.01
            
        self.active = 0
        self.dialog = None
        self.ext = None

    def init_menu(self):
        self.menu_entries.set_entry("Tools/Autopan",1,
                                    self.showgui_cb)

    def showgui_cb(self, *args):
        if self.dialog is None:
            self.dialog = gtk.Window()
            self.dialog.set_title('Autopan Tool')
            self.dialog.connect('delete-event',self.close)
            table = gtk.Table(9,4)
            table.set_border_width(10)
            table.set_row_spacings(10)
            table.set_col_spacings(10)
            vbox = gtk.VBox()
            self.dialog.add(vbox)
            vbox.pack_start(table)

            iconbar = gtk.Toolbar()
            iconbar.set_orientation(gtk.ORIENTATION_HORIZONTAL)
            iconbar.set_style(gtk.TOOLBAR_ICONS)
            iconbar.set_show_arrow(False)
            arrows = []
            atypes = [gtk.STOCK_MEDIA_REWIND,gtk.STOCK_GO_UP,
                      gtk.STOCK_GO_DOWN,gtk.STOCK_MEDIA_PLAY]

            cbs = [self.rewind_cb, self.speed_up_cb, self.speed_down_cb,
                   self.play_cb]
            tooltips = ['Rewind', 'Speed Up', 'Slow Down', 'Play']
            for atype,cb,tt in map(None,atypes,cbs, tooltips):
                arr = gtk.ToolButton(atype)
                arr.set_border_width(0)
                arr.set_tooltip_text(tt)
#                arr.set_relief(gtk.RELIEF_NONE)
#                arr.add(gtk.Arrow(atype))
                arr.connect('clicked',cb)
                arrows.append(arr)
        
#            vbox = gtk.VBox(spacing=0, homogeneous=False)
#            vbox.pack_start(arrows[1], expand=False)
#            vbox.pack_start(arrows[2], expand=False)
        
            # Now put them in the toolbar
#            iconbar.insert(arrows[0], 'Rewind', 'Rewind')
#            iconbar.insert(vbox, 'Adjust speed', 'Adjust speed')
#            iconbar.insert(arrows[3], 'Play', 'Play')
            iconbar.insert(arrows[0], -1)
            iconbar.insert(arrows[1], -1)
            iconbar.insert(arrows[2], -1)
            iconbar.insert(arrows[3], -1)

            table.attach(iconbar,0,1,0,1)
            but = gtk.Button(stock=gtk.STOCK_MEDIA_STOP)
            table.attach(but,1,2,0,1)
            but.connect('clicked',self.stop_pan_cb)
            
            but = gtk.Button(stock=gtk.STOCK_MEDIA_PAUSE)
            table.attach(but,2,3,0,1)
            but.connect('clicked',self.pause_pan_cb)

            label = gtk.Label('Block Size Mode:')
            label.set_alignment(0,0.5)
            table.attach(label,0,1,1,2)
            self.block_size_menu = gvutils.GvOptionMenu(
         ('Relative to Pan Extents','View Coordinates','Constant Resolution'),
                self.block_mode_changed)
            table.attach(self.block_size_menu,1,3,1,2)
            
            self.block_label_list=['Block x size (0-1):',
                                  'Block x size:',
                                  'View units/Pixel:']
            self.block_label = gtk.Label(self.block_label_list[0])
            self.block_label.set_alignment(0,0.5)
            table.attach(self.block_label,0,1,2,3)
            self.block_entry = gtk.Entry()
            self.block_entry.set_editable(True)
            self.block_entry.set_text('0.125')
            self.block_entry.connect('leave-notify-event',
                                     self.block_size_changed)
            table.attach(self.block_entry,1,3,2,3)

            label = gtk.Label('Overlap (0-1):')
            label.set_alignment(0,0.5)
            table.attach(label,0,1,3,4)
            self.overlap_entry = gtk.Entry()
            self.overlap_entry.set_editable(True)
            self.overlap_entry.set_text('0.1')
            self.overlap_entry.connect('leave-notify-event',
                                     self.overlap_changed)
            table.attach(self.overlap_entry,1,3,3,4)

            label = gtk.Label('Path type:')
            label.set_alignment(0,0.5)
            table.attach(label,0,1,4,5)
            self.path_menu = gvutils.GvOptionMenu(
                           ('0','1','2','3','4'),
                self.path_changed)
            table.attach(self.path_menu,1,3,4,5)

            label = gtk.Label('Show trail:')
            label.set_alignment(0,0.5)
            table.attach(label,0,1,5,6)
            self.trail_menu = gvutils.GvOptionMenu(
                           ('No','Yes'),
                self.trail_changed)
            table.attach(self.trail_menu,1,2,5,6)
            button = gtk.Button('Clear Trail')
            table.attach(button,2,3,5,6)
            button.connect('clicked', self.clear_trail)

            label = gtk.Label('Trail Color:')
            label.set_alignment(0,0.5)
            table.attach(label,0,1,6,7)

            self.trail_color = ColorControl('Trail Color', self.trail_color_cb)
            table.attach(self.trail_color,1,3,6,7)
            self.trail_color.set_color((1.0,0.75,0.0,0.5))
            self.second_view = gview.GvViewArea()
            self.second_view.set_size_request(300,300)
            
            table.attach(self.second_view,0,3,7,8)
            
            self.dialog.show_all()
            self.dialog.connect('delete-event',self.close)

        self.viewtitle = args[1]
        self.dialog.present()

    def close(self,*args):
        if self.view is not None:
            self.tool.deactivate(self.view)
        self.playing = 0
        self.active = 0
        self.view = None
        self.dialog.hide()
        return True

    def path_changed(self, *args):
        path_type = int(self.path_menu.get_history())
        self.tool.set_standard_path(path_type)

    def block_mode_changed(self,*args):
        mode = self.block_size_menu.get_history()
        self.block_label.set_text(self.block_label_list[mode])
        self.block_size_changed()

    def trail_changed(self, *args):
        if self.view is None:
            return

        self.tool.set_trail_mode(self.second_view,
                                 self.trail_menu.get_history())

    def trail_color_cb(self,*args):
        if self.view is not None:
            self.tool.set_trail_color(self.second_view,
                                  self.trail_color.current_color[0],
                                  self.trail_color.current_color[1],
                                  self.trail_color.current_color[2],
                                  self.trail_color.current_color[3])


    def clear_trail(self, *args):
        self.tool.clear_trail()

    def block_size_changed(self, *args):
        if self.active == 0 or self.playing == 0:
            return
        mode = self.block_size_menu.get_history()
        defaults = [0.1, 0.1*self.ext[2], 0.1*self.ext[2]]
        try:
            xorres = abs(float(self.block_entry.get_text()))
        except:
            if mode == 0:
                msg = 'Relative block size must be a number, 0-1!'
            elif mode == 1:
                msg = 'Block size must be a number!'
            elif mode == 2:
                msg = 'Resolution must be a number!'
            gvutils.error(msg)
            xorres = defaults[mode]
            self.block_size_entry.set_text(str(xorres))

        if (mode == 0) and ((xorres < 0) or (xorres > 1)):
            msg = 'Relative block size must be a number, 0-1!'
            gvutils.error(msg)
            xorres = defaults[mode]
            self.block_size_entry.set_text(str(xorres))

        if mode < 2:
            self.tool.set_block_x_size(xorres, mode)
        else:
            self.tool.set_x_resolution(xorres)

    def overlap_changed(self,*args):
        if self.active == 0:
            return
        txt = self.overlap_entry.get_text()
        try:
            val = float(txt)
        except:
            gvutils.error('Overlap must be a number, 0 <= overlap < 1!')
            val = 0.1
            self.overlap_entry.set_text('0.1')

        if (val < 0) or (val >= 1):
            gvutils.error('Overlap must be a number, 0 <= overlap < 1!')
            val = 0.1
            self.overlap_entry.set_text('0.1')

        self.tool.set_overlap(val)
        

    def pause_pan_cb(self, *args):
        self.playing = 2
        self.tool.pause()
        
    def stop_pan_cb(self, *args):
#        gview.gv_data_registry_dump()
        self.tool.pause()
        self.playing = 0
        if self.ext is not None:
            if self.view is not None:    
                self.view.fit_extents(self.ext[0],self.ext[1],
                                  self.ext[2],self.ext[3])
                self.tool.deactivate(self.view) 
            self.ext = None   
        self.view = None

    def speed_up_cb(self, *args):
        if self.active == 0:
            return
        self.speed *= 1.25
        self.tool.set_speed(self.speed)

    def speed_down_cb(self, *args):
        if self.active == 0:
            return
        self.speed /= 1.25
        self.tool.set_speed(self.speed)
    
    def rewind_cb(self, *args):
        self.speed = -1*self.default_speed
        if self.playing == 1:
            self.tool.set_speed(self.speed)
            return

        if self.playing == 2:
            self.tool.set_speed(self.speed)
            self.tool.play()
            return
        
        self.setup_playing()
        
        
    def play_cb(self, *args):
        self.speed = self.default_speed
        if self.playing == 1:
            self.tool.set_speed(self.speed)
            return

        if self.playing == 2:
            self.tool.set_speed(self.speed)
            self.tool.play()
            return
        
        self.setup_playing()

    def setup_playing(self, *args):
        if self.view is not None:
            self.tool.deactivate(self.view)
            
        for view in self.app.view_manager.view_list:
            if self.viewtitle in view.title:
                self.app.view_manager.set_active_view(view)
                self.view = view.viewarea
                self.tool.activate(self.view)
                self.tool.register_view(self.second_view,0,1,
                                        self.trail_menu.get_history())
                self.tool.set_trail_color(self.second_view,
                                  self.trail_color.current_color[0],
                                  self.trail_color.current_color[1],
                                  self.trail_color.current_color[2],
                                  self.trail_color.current_color[3])


        # update the secondary view with a background raster
        plyr = self.view.active_layer()
        rst = None
        ds = None
        try:
            rst = plyr.get_parent()
            ds = rst.get_dataset()
        except:
            llist = self.view.list_layers()
            llist.reverse()
            for plyr in llist:
                try:
                    rst = plyr.get_parent()
                    ds = rst.get_dataset()
                    break
                except:
                    pass

        if ds is None:
            gvutils.error('Error- no raster to pan over in active view!')
            return

        dtype = gdal.GetDataTypeName(ds.GetRasterBand(1).DataType)
        
        xsize = ds.RasterXSize
        ysize = ds.RasterYSize
        while (xsize > 512) and (ysize > 512):
            xsize = xsize/2
            ysize = ysize/2
            
        srcrect = [0,0,ds.RasterXSize, ds.RasterYSize]
        dstrect = [0,0,xsize,ysize]

        vrt = vrtutils.VRTDatasetConstructor(xsize,ysize)
        
        vrtOpts = vrtutils.VRTCreationOptions(ds.RasterCount)
        vrtOpts.set_src_window(srcrect)
        vrtOpts.set_dst_window(dstrect)
        
        fname = ds.GetDescription()
        
        lyrs = self.second_view.list_layers()
        for lyr in lyrs:
            self.second_view.remove_layer(lyr)

        gcps = ds.GetGCPs()
        if len(gcps) > 0:
            vrt.SetGCPs(gcps,ds.GetGCPProjection(), vrt_options=vrtOpts)
        else:
            gt = ds.GetGeoTransform()
            if gt != (0.0,1.0,0.0,0.0,0.0,1.0):
                vrt.SetSRS(ds.GetProjection())
            vrt.SetGeoTransform(gt)
                
        for idx in range(0,plyr.sources):
            rst = plyr.get_data(idx)
            if rst is not None:
                cmin = plyr.min_get(idx)
                cmax = plyr.max_get(idx)
                srcdiff=cmax-cmin
                if abs(srcdiff) > 0.0:
                    ratio = 255/srcdiff
                else:
                    ratio = 1.0
                offset = -cmin*ratio
                
                vrt.AddSimpleBand(fname,rst.get_band_number(),dtype,
                                  srcrect,dstrect,ScaleOffset=offset,
                                  ScaleRatio = ratio)
                        
        ds2 = gview.manager.get_dataset(vrt.GetVRTString())
        raster = gview.manager.get_dataset_raster( ds2, 1 )
        options = []
        if ( ds2.RasterCount == 1 ):
            raster_layer = gview.GvRasterLayer( raster, options,
                                       rl_mode = gview.RLM_AUTO ) 
        else:
            raster_layer = gview.GvRasterLayer( raster, options,
                                       rl_mode = gview.RLM_RGBA )

            if ( raster_layer.get_mode() == gview.RLM_RGBA ):

                green_raster = gview.manager.get_dataset_raster( ds2, 2)
                raster_layer.set_source( 1, green_raster ) 
                if ( ds2.RasterCount > 2 ):
                    blue_raster = \
                              gview.manager.get_dataset_raster( ds2, 3 )
                    raster_layer.set_source( 2, blue_raster )

                if ( ds2.RasterCount > 3 ):
                    band = ds2.GetRasterBand(4)
                    if ( band.GetRasterColorInterpretation() ==
                         gdal.GCI_AlphaBand ):
                        raster_layer.blend_mode_set(
                                                gview.RL_BLEND_FILTER )
                        alpha_raster = \
                              gview.manager.get_dataset_raster( ds2, 4 )
                        raster_layer.set_source( 3, alpha_raster )
                        
        self.second_view.add_layer(raster_layer)

        self.active = 1
        xmin,ymin,xmax,ymax = self.view.get_extents()
        xwidth = xmax-xmin
        ywidth = ymax-ymin
        self.ext = (xmin,ymin,xwidth,ywidth)
        self.tool.set_extents((xmin,ymin,xwidth,ywidth))
        self.playing = 1
        self.tool.set_speed(self.speed)
        self.block_size_changed()
        self.overlap_changed()
        self.tool.play()        
예제 #2
0
    def showgui_cb(self, *args):
        if self.dialog is None:
            self.dialog = gtk.Window()
            self.dialog.set_title('Autopan Tool')
            self.dialog.connect('delete-event',self.close)
            table = gtk.Table(9,4)
            table.set_border_width(10)
            table.set_row_spacings(10)
            table.set_col_spacings(10)
            vbox = gtk.VBox()
            self.dialog.add(vbox)
            vbox.pack_start(table)

            iconbar = gtk.Toolbar()
            iconbar.set_orientation(gtk.ORIENTATION_HORIZONTAL)
            iconbar.set_style(gtk.TOOLBAR_ICONS)
            iconbar.set_show_arrow(False)
            arrows = []
            atypes = [gtk.STOCK_MEDIA_REWIND,gtk.STOCK_GO_UP,
                      gtk.STOCK_GO_DOWN,gtk.STOCK_MEDIA_PLAY]

            cbs = [self.rewind_cb, self.speed_up_cb, self.speed_down_cb,
                   self.play_cb]
            tooltips = ['Rewind', 'Speed Up', 'Slow Down', 'Play']
            for atype,cb,tt in map(None,atypes,cbs, tooltips):
                arr = gtk.ToolButton(atype)
                arr.set_border_width(0)
                arr.set_tooltip_text(tt)
#                arr.set_relief(gtk.RELIEF_NONE)
#                arr.add(gtk.Arrow(atype))
                arr.connect('clicked',cb)
                arrows.append(arr)
        
#            vbox = gtk.VBox(spacing=0, homogeneous=False)
#            vbox.pack_start(arrows[1], expand=False)
#            vbox.pack_start(arrows[2], expand=False)
        
            # Now put them in the toolbar
#            iconbar.insert(arrows[0], 'Rewind', 'Rewind')
#            iconbar.insert(vbox, 'Adjust speed', 'Adjust speed')
#            iconbar.insert(arrows[3], 'Play', 'Play')
            iconbar.insert(arrows[0], -1)
            iconbar.insert(arrows[1], -1)
            iconbar.insert(arrows[2], -1)
            iconbar.insert(arrows[3], -1)

            table.attach(iconbar,0,1,0,1)
            but = gtk.Button(stock=gtk.STOCK_MEDIA_STOP)
            table.attach(but,1,2,0,1)
            but.connect('clicked',self.stop_pan_cb)
            
            but = gtk.Button(stock=gtk.STOCK_MEDIA_PAUSE)
            table.attach(but,2,3,0,1)
            but.connect('clicked',self.pause_pan_cb)

            label = gtk.Label('Block Size Mode:')
            label.set_alignment(0,0.5)
            table.attach(label,0,1,1,2)
            self.block_size_menu = gvutils.GvOptionMenu(
         ('Relative to Pan Extents','View Coordinates','Constant Resolution'),
                self.block_mode_changed)
            table.attach(self.block_size_menu,1,3,1,2)
            
            self.block_label_list=['Block x size (0-1):',
                                  'Block x size:',
                                  'View units/Pixel:']
            self.block_label = gtk.Label(self.block_label_list[0])
            self.block_label.set_alignment(0,0.5)
            table.attach(self.block_label,0,1,2,3)
            self.block_entry = gtk.Entry()
            self.block_entry.set_editable(True)
            self.block_entry.set_text('0.125')
            self.block_entry.connect('leave-notify-event',
                                     self.block_size_changed)
            table.attach(self.block_entry,1,3,2,3)

            label = gtk.Label('Overlap (0-1):')
            label.set_alignment(0,0.5)
            table.attach(label,0,1,3,4)
            self.overlap_entry = gtk.Entry()
            self.overlap_entry.set_editable(True)
            self.overlap_entry.set_text('0.1')
            self.overlap_entry.connect('leave-notify-event',
                                     self.overlap_changed)
            table.attach(self.overlap_entry,1,3,3,4)

            label = gtk.Label('Path type:')
            label.set_alignment(0,0.5)
            table.attach(label,0,1,4,5)
            self.path_menu = gvutils.GvOptionMenu(
                           ('0','1','2','3','4'),
                self.path_changed)
            table.attach(self.path_menu,1,3,4,5)

            label = gtk.Label('Show trail:')
            label.set_alignment(0,0.5)
            table.attach(label,0,1,5,6)
            self.trail_menu = gvutils.GvOptionMenu(
                           ('No','Yes'),
                self.trail_changed)
            table.attach(self.trail_menu,1,2,5,6)
            button = gtk.Button('Clear Trail')
            table.attach(button,2,3,5,6)
            button.connect('clicked', self.clear_trail)

            label = gtk.Label('Trail Color:')
            label.set_alignment(0,0.5)
            table.attach(label,0,1,6,7)

            self.trail_color = ColorControl('Trail Color', self.trail_color_cb)
            table.attach(self.trail_color,1,3,6,7)
            self.trail_color.set_color((1.0,0.75,0.0,0.5))
            self.second_view = gview.GvViewArea()
            self.second_view.set_size_request(300,300)
            
            table.attach(self.second_view,0,3,7,8)
            
            self.dialog.show_all()
            self.dialog.connect('delete-event',self.close)

        self.viewtitle = args[1]
        self.dialog.present()
예제 #3
0
 def __init__(self, title, callback=None, cb_data=None):
     cc.__init__(self, title, callback, cb_data)