[GRASS-SVN] r35704 - grass/branches/releasebranch_6_4/gui/wxpython/gui_modules

svn_grass at osgeo.org svn_grass at osgeo.org
Sun Feb 1 12:08:16 EST 2009


Author: martinl
Date: 2009-02-01 12:08:16 -0500 (Sun, 01 Feb 2009)
New Revision: 35704

Modified:
   grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/dbm.py
   grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/gcmd.py
   grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/georect.py
   grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/goutput.py
   grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/gselect.py
Log:
wxGUI: fix vector georectifier and related issues


Modified: grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/dbm.py
===================================================================
--- grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/dbm.py	2009-02-01 17:05:16 UTC (rev 35703)
+++ grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/dbm.py	2009-02-01 17:08:16 UTC (rev 35704)
@@ -92,27 +92,30 @@
     Support virtual list class
     """
     def __init__(self, parent, log, mapDBInfo, layer):
-        wx.ListCtrl.__init__(self, parent=parent, id=wx.ID_ANY,
-                             style=wx.LC_REPORT | wx.LC_HRULES |
-                             wx.LC_VRULES | wx.LC_VIRTUAL | wx.LC_SORT_ASCENDING)
-
         #
         # initialize variables
         #
+        self.parent  = parent
         self.log     = log
         self.mapDBInfo = mapDBInfo
         self.layer   = layer
+        
+        self.columns = {} # <- LoadData()
 
-        self.columns = {} # <- LoadData()
+        wx.ListCtrl.__init__(self, parent=parent, id=wx.ID_ANY,
+                             style=wx.LC_REPORT | wx.LC_HRULES |
+                             wx.LC_VRULES | wx.LC_VIRTUAL | wx.LC_SORT_ASCENDING)
         
-        # self.selectedCats         = []
-        # self.lastTurnSelectedCats = [] # just temporary, for comparation
-
+        try:
+            keyColumn = self.LoadData(layer)
+        except gcmd.DBMError, e:
+            e.Show()
+            return
+        
         #
         # add some attributes (colourful background for each item rows)
         #
         self.attr1 = wx.ListItemAttr()
-        # self.attr1.SetBackgroundColour("light blue")
         self.attr1.SetBackgroundColour(wx.Colour(238,238,238))
         self.attr2 = wx.ListItemAttr()
         self.attr2.SetBackgroundColour("white")
@@ -122,9 +125,7 @@
         self.sm_dn = self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_GO_DOWN, wx.ART_TOOLBAR,
                                                           (16,16)))
         self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
-
-        keyColumn = self.LoadData(layer)
-
+        
         # setup mixins
         listmix.ListCtrlAutoWidthMixin.__init__(self)
         listmix.ColumnSorterMixin.__init__(self, len(self.columns))
@@ -134,20 +135,12 @@
             self.SortListItems(col=keyColumn, ascending=True) 
         else:
             self.SortListItems(col=0, ascending=True) 
-
+        
         # events
         self.Bind(wx.EVT_LIST_ITEM_SELECTED,   self.OnItemSelected)
         self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected)
         self.Bind(wx.EVT_LIST_COL_CLICK,       self.OnColumnClick)     # sorting
-        # self.Bind(wx.EVT_LIST_DELETE_ITEM, self.OnItemDelete, self.list)
-        # self.Bind(wx.EVT_LIST_COL_RIGHT_CLICK, self.OnColRightClick, self.list)
-        # self.Bind(wx.EVT_LIST_COL_BEGIN_DRAG, self.OnColBeginDrag, self.list)
-        # self.Bind(wx.EVT_LIST_COL_DRAGGING, self.OnColDragging, self.list)
-        # self.Bind(wx.EVT_LIST_COL_END_DRAG, self.OnColEndDrag, self.list)
-        # self.Bind(wx.EVT_LIST_BEGIN_LABEL_EDIT, self.OnBeginEdit, self.list)
-        # self.list.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick)
-        # self.list.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
-
+        
     def Update(self, mapDBInfo):
         """Update list according new mapDBInfo description"""
         self.mapDBInfo = mapDBInfo
@@ -167,7 +160,13 @@
         
         tableName    = self.mapDBInfo.layers[layer]['table']
         keyColumn    = self.mapDBInfo.layers[layer]['key']
-        self.columns = self.mapDBInfo.tables[tableName]
+        try:
+            self.columns = self.mapDBInfo.tables[tableName]
+        except KeyError:
+            raise gcmd.DBMError(message=_("Attribute table <%s> not found. "
+                                          "For creating the table switch to "
+                                          "'Manage layers' tab.") % tableName,
+                                parent=self.parent)
         
         cmd = ["v.db.select",
                "-c", "--q",
@@ -416,6 +415,13 @@
         """Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py"""
         return (self.sm_dn, self.sm_up)
 
+    def IsEmpty(self):
+        """Check if list if empty"""
+        if self.columns:
+            return False
+        
+        return True
+    
 class AttributeManager(wx.Frame):
     """
     GRASS Attribute manager main window
@@ -537,6 +543,14 @@
                 continue
 
             panel = wx.Panel(parent=self.browsePage, id=wx.ID_ANY)
+            win = VirtualAttributeList(panel, self.log,
+                                       self.mapDBInfo, layer)
+            if win.IsEmpty():
+                del panel
+                continue
+            
+            win.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnDataItemActivated)
+
             self.layerPage[layer] = {'browsePage': panel.GetId()}
 
             self.browsePage.AddPage(page=panel, text=" %d / %s %s" % \
@@ -554,9 +568,6 @@
 
             sqlSizer = wx.StaticBoxSizer(sqlBox, wx.VERTICAL)
 
-            win = VirtualAttributeList(panel, self.log,
-                                       self.mapDBInfo, layer)
-            win.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnDataItemActivated)
             win.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnDataRightUp) #wxMSW
             win.Bind(wx.EVT_RIGHT_UP,            self.OnDataRightUp) #wxGTK
             if UserSettings.Get(group='atm', key='leftDbClick', subkey='selection') == 0:
@@ -659,7 +670,7 @@
             self.OnChangeSql(None)
             self.log.write(_("Number of loaded records: %d") % \
                            self.FindWindowById(self.layerPage[self.layer]['data']).GetItemCount())
-        except IndexError:
+        except (IndexError, KeyError):
             self.layer = None
         
     def __createManageTablePage(self, onlyLayer=-1):
@@ -668,9 +679,15 @@
             if onlyLayer > 0 and layer != onlyLayer:
                 continue
             
+            if not self.layerPage.has_key(layer):
+                continue
+            
             panel = wx.Panel(parent=self.manageTablePage, id=wx.ID_ANY)
             self.layerPage[layer]['tablePage'] = panel.GetId()
-            self.manageTablePage.AddPage(page=panel, text=" %d / %s %s" % (layer, _("Table"), self.mapDBInfo.layers[layer]['table']))
+            self.manageTablePage.AddPage(page=panel,
+                                         text=" %d / %s %s" % (layer,
+                                                               _("Table"),
+                                                               self.mapDBInfo.layers[layer]['table']))
             
             pageSizer = wx.BoxSizer(wx.VERTICAL)
             
@@ -2561,7 +2578,8 @@
                                   '--q',
                                   'driver=%s' % driver,
                                   'database=%s' % database,
-                                  'table=%s' % table])
+                                  'table=%s' % table],
+                                 rerr = None)
 
         for column in cmdColumn.ReadStdOutput():
             columns.append(column)
@@ -3302,7 +3320,11 @@
         
     def GetColumns(self, table):
         """Return list of columns names (based on their index)"""
-        names = [''] * len(self.tables[table].keys())
+        try:
+            names = [''] * len(self.tables[table].keys())
+        except KeyError:
+            return []
+        
         for name, desc in self.tables[table].iteritems():
             names[desc['index']] = name
 

Modified: grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/gcmd.py
===================================================================
--- grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/gcmd.py	2009-02-01 17:05:16 UTC (rev 35703)
+++ grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/gcmd.py	2009-02-01 17:08:16 UTC (rev 35704)
@@ -64,7 +64,7 @@
         self.parent = parent
         self.title = title
         
-    def __str__(self):
+    def Show(self):
         dlg = wx.MessageDialog(parent=self.parent,
                                caption=self.title,
                                message=self.message,
@@ -77,8 +77,11 @@
 
         dlg.ShowModal()
         
+    def __str__(self):
+        self.Show()
+        
         return ''
-
+    
 class GStdError(GException):
     """Generic exception"""
 

Modified: grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/georect.py
===================================================================
--- grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/georect.py	2009-02-01 17:05:16 UTC (rev 35703)
+++ grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/georect.py	2009-02-01 17:08:16 UTC (rev 35704)
@@ -1,25 +1,29 @@
 """
 @package georect.py
 
-Georectification module for GRASS GIS. Includes ground control
+ at brief Georectification module for GRASS GIS. Includes ground control
 point management and interactive point and click GCP creation
 
 Classes:
- - Georectify
+ - GeorectWizard
+ - LocationPage
+ - GroupPage
+ - DispMapPage
  - GCP
- - GRMap
+ - GCPList
+ - VectGroup
+ - EditGCP
  - GrSettingsDialog
 
-COPYRIGHT: (C) 2006-2008 by the GRASS Development Team
-           This program is free software under the GNU General Public
-           License (>=v2). Read the file COPYING that comes with GRASS
-           for details.
+(C) 2006-2008 by the GRASS Development Team
 
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
 @author Michael Barton
-Updated by Martin Landa <landa.martin gmail.com>
+ at author Updated by Martin Landa <landa.martin gmail.com>
 """
 
-# recheck once completed to see how many of these are still needed
 import os
 import sys
 import tempfile
@@ -111,12 +115,14 @@
         self.grouppage = GroupPage(self.wizard, self)
         self.mappage = DispMapPage(self.wizard, self)
 
-        # Set the initial order of the pages
+        #
+        # set the initial order of the pages
+        #
         self.startpage.SetNext(self.grouppage)
         self.grouppage.SetPrev(self.startpage)
         self.grouppage.SetNext(self.mappage)
         self.mappage.SetPrev(self.grouppage)
-        
+
         #
         # do pages layout
         #
@@ -164,14 +170,14 @@
             if maptype == 'cell':
                 rendertype = 'raster'
                 cmdlist = ['d.rast', 'map=%s' % xy_map]
-            elif maptype == 'vector':
+            else: # -> vector layer
                 rendertype = 'vector'
                 cmdlist = ['d.vect', 'map=%s' % xy_map]
-
+            
             self.Map.AddLayer(type=rendertype, command=cmdlist, l_active=True,
                               name=utils.GetLayerNameFromCmd(cmdlist),
                               l_hidden=False, l_opacity=1.0, l_render=False)
-
+            
             #
             # start GCP form
             #
@@ -307,8 +313,10 @@
         #
         self.sizer.AddGrowableCol(2)
         # map type
-        self.rb_maptype = wx.RadioBox(parent=self, id=wx.ID_ANY, label=' %s ' % _("Map type to georectify"),
-                                      choices=[_('raster'), _('vector')], majorDimension=wx.RA_SPECIFY_COLS)
+        self.rb_maptype = wx.RadioBox(parent=self, id=wx.ID_ANY,
+                                      label=' %s ' % _("Map type to georectify"),
+                                      choices=[_('raster'), _('vector')],
+                                      majorDimension=wx.RA_SPECIFY_COLS)
         self.sizer.Add(item=self.rb_maptype,
                        flag=wx.ALIGN_CENTER | wx.ALL | wx.EXPAND, border=5,
                        pos=(1, 1), span=(1, 2))
@@ -353,7 +361,7 @@
             maptype = 'cell'
         else:
             maptype = 'vector'
-
+        
     def OnLocation(self, event):
         """Sets source location for map(s) to georectify"""
         self.xylocation = event.GetString()
@@ -393,9 +401,9 @@
             wx.MessageBox(_('You must select a valid location and mapset in order to continue'))
             event.Veto()
             return
-        else:
-            self.parent.SetSrcEnv(self.xylocation, self.xymapset)
-
+        
+        self.parent.SetSrcEnv(self.xylocation, self.xymapset)
+        
     def OnEnterPage(self, event=None):
         if self.xylocation == '' or self.xymapset == '':
             wx.FindWindowById(wx.ID_FORWARD).Enable(False)
@@ -440,8 +448,17 @@
         self.sizer.Add(item=wx.StaticText(parent=self, id=wx.ID_ANY, label=_('Create group if none exists')),
                        flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5,
                        pos=(2, 1))
+        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
         self.btn_mkgroup = wx.Button(parent=self, id=wx.ID_ANY, label=_("Create/edit group..."))
-        self.sizer.Add(item=self.btn_mkgroup,
+        self.btn_vgroup = wx.Button(parent=self, id=wx.ID_ANY, label=_("Add vector map to group..."))
+        self.btn_vgroup.Hide()
+        btnSizer.Add(item=self.btn_mkgroup,
+                     flag=wx.RIGHT, border=5)
+
+        btnSizer.Add(item=self.btn_vgroup,
+                     flag=wx.LEFT, border=5)
+        
+        self.sizer.Add(item=btnSizer,
                        flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5,
                        pos=(2, 2))
         
@@ -459,7 +476,6 @@
         # bindings
         #
         self.Bind(wx.EVT_COMBOBOX, self.OnGroup, self.cb_group)
-        self.Bind(wx.EVT_BUTTON, self.OnMkGroup, self.btn_mkgroup)
         self.Bind(wx.EVT_TEXT, self.OnExtension, self.ext_txt)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
@@ -470,19 +486,25 @@
         
     def OnMkGroup(self, event):
         """Create new group in source location/mapset"""
-        global maptype
+        menuform.GUI().ParseCommand(['i.group'],
+                                    completed=(self.GetOptData, None, ''),
+                                    parentframe=self.parent.parent, modal=True)
 
-        # open dialog
-        if maptype == 'cell':
-            menuform.GUI().ParseCommand(['i.group'],
-                                        completed=(self.GetOptData, None, ''),
-                                        parentframe=self.parent.parent, modal=True)
-        elif maptype == 'vector':
-            dlg = VectGroup(self, wx.ID_ANY, self.grassdatabase, self.xylocation, self.xymapset, self.xygroup)
-            if dlg.ShowModal() == wx.ID_OK:
-                dlg.MakeVGroup()
-                self.OnEnterPage()
+    def OnVGroup(self, event):
+        """Add vector maps to group"""
+        dlg = VectGroup(parent = self,
+                        id = wx.ID_ANY,
+                        grassdb = self.grassdatabase,
+                        location = self.xylocation,
+                        mapset = self.xymapset,
+                        group = self.xygroup)
 
+        if dlg.ShowModal() != wx.ID_OK:
+            return
+
+        dlg.MakeVGroup()
+        self.OnEnterPage()
+        
     def GetOptData(self, dcmd, layer, params, propwin):
         """Process i.group"""
         # update the page
@@ -507,47 +529,64 @@
             return
 
     def OnEnterPage(self, event=None):
+        global maptype
+        
         self.groupList = []
-        tmplist = []
 
         self.xylocation = self.parent.gisrc_dict['LOCATION_NAME']
         self.xymapset = self.parent.gisrc_dict['MAPSET']
 
         # create a list of groups in selected mapset
-        if os.path.isdir(os.path.join(self.grassdatabase,self.xylocation,self.xymapset,'group')):
-            tmplist = os.listdir(os.path.join(self.grassdatabase, self.xylocation, self.xymapset, 'group'))
-        else:
-            tmplist = []
-        # if (event and event.GetDirection()) and self.xygroup == '':
-        #             if tmplist == []:
-        #                 wx.MessageBox(_('No map/imagery groups exist to georectify. '
-        #                                 'You will need to create one.'))
-        #             else:
-        for item in tmplist:
-            if os.path.isdir(os.path.join(self.grassdatabase, self.xylocation, self.xymapset, 'group', item)):
-                self.groupList.append(item)
-                
+        if os.path.isdir(os.path.join(self.grassdatabase,
+                                      self.xylocation,
+                                      self.xymapset,
+                                      'group')):
+            tmplist = os.listdir(os.path.join(self.grassdatabase,
+                                              self.xylocation,
+                                              self.xymapset,
+                                              'group'))
+            for item in tmplist:
+                if os.path.isdir(os.path.join(self.grassdatabase,
+                                              self.xylocation,
+                                              self.xymapset,
+                                              'group',
+                                              item)):
+                    self.groupList.append(item)
+        
+        if maptype == 'cell':
+            self.btn_vgroup.Hide()
+            self.Bind(wx.EVT_BUTTON, self.OnMkGroup, self.btn_mkgroup)
+
+        elif maptype == 'vector':
+            self.btn_vgroup.Show()
+            self.Bind(wx.EVT_BUTTON, self.OnMkGroup, self.btn_mkgroup)
+            self.Bind(wx.EVT_BUTTON, self.OnVGroup, self.btn_vgroup)
+        
         utils.ListSortLower(self.groupList)
         self.cb_group.SetItems(self.groupList)
-        if len(self.groupList) > 0:
+        
+        if len(self.groupList) > 0 and \
+                self.xygroup == '':
             self.cb_group.SetSelection(0)
             self.xygroup = self.groupList[0]
-            
-        if self.xygroup == '' or self.extension == '':
+        
+        if self.xygroup == '' or \
+                self.extension == '':
             wx.FindWindowById(wx.ID_FORWARD).Enable(False)
         else:
             wx.FindWindowById(wx.ID_FORWARD).Enable(True)
-
+        
         # switch to source
         self.parent.SwitchEnv('new')
-
+    
 class DispMapPage(TitledPage):
     """
     Select ungeoreferenced map to display for interactively
     setting ground control points (GCPs).
     """
     def __init__(self, wizard, parent):
-        TitledPage.__init__(self, wizard, _("Select image/map to display for ground control point (GCP) creation"))
+        TitledPage.__init__(self, wizard,
+                            _("Select image/map to display for ground control point (GCP) creation"))
 
         self.parent = parent
         global maptype
@@ -558,8 +597,10 @@
         self.sizer.Add(item=wx.StaticText(parent=self, id=wx.ID_ANY, label=_('Select display image/map:')),
                        flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5,
                        pos=(1, 1))
-        self.selection = gselect.Select(self, id=wx.ID_ANY, size=globalvar.DIALOG_GSELECT_SIZE,
-                                        type=maptype)
+        
+        self.selection = gselect.Select(self, id=wx.ID_ANY,
+                                        size=globalvar.DIALOG_GSELECT_SIZE)
+        
         self.sizer.Add(item=self.selection,
                        flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5,
                        pos=(1, 2))
@@ -597,7 +638,8 @@
         global maptype
         global xy_map
         
-        self.selection.SetElementList(maptype)
+        self.selection.SetElementList(maptype,
+                                      mapsets = [self.parent.newmapset, ])
 
         if xy_map == '':
             wx.FindWindowById(wx.ID_FORWARD).Enable(False)
@@ -998,7 +1040,7 @@
         
         if self.CheckGCPcount(msg=True) == False:
             return
-                
+
         if maptype == 'cell':
             self.grwiz.SwitchEnv('new')
             cmdlist = ['i.rectify','-a','group=%s' % self.xygroup,
@@ -1008,48 +1050,101 @@
             
             self.parent.goutput.RunCmd(cmdlist, compReg=False,
                                        switchPage=True)
-
+            
             time.sleep(.1)
             self.grwiz.SwitchEnv('original')
 
         elif maptype == 'vector':
-            # loop through all vectors in VREF and move resulting vector to target location
-            f = open(self.vgrpfile)
+            # loop through all vectors in VREF
+            # and move resulting vector to target location
+            f = open(self.file['vgrp'])
             vectlist = []
             try:
-                for vect in f:
-                    vect = vect.strip(' \n')
+                for vect in f.readlines():
+                    vect = vect.strip('\n')
+                    if len(vect) < 1:
+                        continue
                     vectlist.append(vect)
             finally:
                 f.close()
             for vect in vectlist:
-                outname = vect+'_'+self.extension
-                cmdlist = ['v.transform', '--q', 'input=%s' % vect, 'output=%s' % outname, 'pointsfile=%s' % self.pointsfile]
-                                
-                p = gcmd.Command(cmd=cmdlist)
-                stdout = p.ReadStdOutput()
-                msg = '****'+outname+'****\n'
-                for line in stdout:
-                    msg = msg+line+'\n'
-                wx.MessageBox(msg)
+                self.grwiz.SwitchEnv('new')
+                self.outname = vect + '_' + self.extension
+                self.parent.goutput.WriteLog(text = _('Transforming <%s>...') % vect,
+                                             switchPage = True)
                 
-            if p.returncode == 0:
-                wx.MessageBox("All maps were georectified successfully")
-                for vect in vectlist:
-                    outname = vect+'_'+self.extension
-                    xyvpath = os.path.join(self.grassdatabase,self.xylocation,self.xymapset,'vector',outname)
-                    vpath = os.path.join(self.grassdatabase,self.currentlocation,self.currentmapset,'vector',outname)
-                    if os.path.isfile(vpath):
-                        wx.MessageBox("%s already exists. Change extension name and georectify again" % outname)
-                    else:
-                        shutil.move(xyvpath, vpath)                
-                                    
-                wx.MessageBox('For vector files with attribute tables, you will need to manually copy the tables to the new location')
-            else:
-                wx.MessageBox('Some maps were not georectified successfully')
-        else:
+                xyLayer = []
+                for layer in grass.vector_db(map = vect).itervalues():
+                    xyLayer.append((layer['driver'],
+                                    layer['database'],
+                                    layer['table']))
+                self.parent.goutput.RunCmd(['v.transform',
+                                            '--o',
+                                            'input=%s' % vect,
+                                            'output=%s' % self.outname,
+                                            'pointsfile=%s' % self.file['points']],
+                                           switchPage = True,
+                                           onDone = self.OnGeorectDone)
+
+                dbConnect = grass.db_connection()
+                for layer in xyLayer:                
+                    self.parent.goutput.RunCmd(['db.copy',
+                                                '--q',
+                                                '--o',
+                                                'from_driver=%s' % layer[0],
+                                                'from_database=%s' % layer[1],
+                                                'from_table=%s' % layer[2],
+                                                'to_driver=%s' % dbConnect['driver'],
+                                                'to_database=%s' % dbConnect['database'],
+                                                'to_table=%s' % layer[2] + '_' + self.extension])
+            
+    def OnGeorectDone(self, **kargs):
+        """Print final message"""
+        global maptype
+        if maptype == 'cell':
             return
+
+        returncode = kargs['returncode']
         
+        xyvpath = os.path.join(self.grassdatabase,
+                               self.xylocation,
+                               self.xymapset,
+                               'vector',
+                               self.outname)
+        vpath = os.path.join(self.grassdatabase,
+                             self.currentlocation,
+                             self.currentmapset,
+                             'vector',
+                             self.outname)
+        
+        if os.path.isdir(vpath):
+            self.parent.goutput.WriteWarning(_('Vector map <%s> already exists. '
+                                               'Change extension name and '
+                                               'georectify again.') % self.outname)
+        else:
+            if returncode == 0:
+                if not os.path.isdir(os.path.join(self.grassdatabase,
+                                                  self.currentlocation,
+                                                  self.currentmapset,
+                                                  'vector')):
+                    os.mkdir(os.path.join(self.grassdatabase,
+                                          self.currentlocation,
+                                          self.currentmapset,
+                                          'vector'))
+                shutil.move(xyvpath, vpath)        
+                
+                self.parent.goutput.WriteCmd(_('Vector map <%s> georectified '
+                                               'successfully') % self.outname)
+                # copy attributes
+                self.parent.goutput.WriteLog(_('Copying attributes...'))
+                
+            else:
+                self.parent.goutput.WriteError(_('Georectification of vector map <%s> failed') %
+                                               self.outname)
+                
+        del self.outname
+        self.grwiz.SwitchEnv('original')
+        
     def OnSettings(self, event):
         """Georectifier settings"""
         dlg = GrSettingsDialog(parent=self, id=wx.ID_ANY, title=_('Georectifier settings'))
@@ -1295,97 +1390,131 @@
 class VectGroup(wx.Dialog):
     """
     Dialog to create a vector group (VREF file) for georectifying
+
+    @todo Replace by g.group
     """
-
     def __init__(self, parent, id, grassdb, location, mapset, group,
-                style=wx.DEFAULT_DIALOG_STYLE):
-  
-        wx.Dialog.__init__(self, parent, id, style=style)
+                 style=wx.DEFAULT_DIALOG_STYLE):
         
+        wx.Dialog.__init__(self, parent, id, style=style,
+                           title = _("Create vector map group"))
+        
         self.grassdatabase = grassdb
         self.xylocation = location
         self.xymapset = mapset
         self.xygroup = group
         
+        #
         # get list of valid vector directories
-        vectlist = os.listdir(os.path.join(self.grassdatabase,self.xylocation,self.xymapset,'vector'))
+        #
+        vectlist = os.listdir(os.path.join(self.grassdatabase,
+                                           self.xylocation,
+                                           self.xymapset,
+                                           'vector'))
         for dir in vectlist:
-            if os.path.isfile(os.path.join(self.grassdatabase,self.xylocation,self.xymapset,'vector',dir,'coor')):
-                pass
-            else:
+            if not os.path.isfile(os.path.join(self.grassdatabase,
+                                           self.xylocation,
+                                           self.xymapset,
+                                           'vector',
+                                           dir,
+                                           'coor')):
                 vectlist.remove(dir)
         
-        self.vgrouplist = []
-        self.vgrpfile = os.path.join(self.grassdatabase,self.xylocation,self.xymapset,'group',self.xygroup,'VREF')
+        utils.ListSortLower(vectlist)
+        
+        # path to vref file
+        self.vgrpfile = os.path.join(self.grassdatabase,
+                                     self.xylocation,
+                                     self.xymapset,
+                                     'group',
+                                     self.xygroup,
+                                     'VREF')
+        
+        #
+        # buttons
+        #
+        self.btnCancel = wx.Button(parent = self,
+                                   id = wx.ID_CANCEL)
+        self.btnOK = wx.Button(parent = self,
+                                   id = wx.ID_OK)
+        self.btnOK.SetDefault()
+
+
+        #
+        # list of vector maps
+        #
+        self.listMap = wx.CheckListBox(parent = self, id = wx.ID_ANY,
+                                      choices = vectlist)
+        
         if os.path.isfile(self.vgrpfile):
             f = open(self.vgrpfile)
             try:
-                for line in f:
-                    if line != '':
-                        self.vgrouplist.append(line.strip(' \n'))
+                checked = []
+                for line in f.readlines():
+                    line = line.replace('\n', '')
+                    if len(line) < 1:
+                        continue
+                    checked.append(line)
+                self.listMap.SetCheckedStrings(checked)
             finally:
                 f.close()
-        
-        self.btnCancel = wx.Button(self, wx.ID_CANCEL)
-        self.btnSubmit = wx.Button(self, wx.ID_OK)
-        self.btnSubmit.SetDefault()
+                
+        line = wx.StaticLine(parent = self,
+                             id = wx.ID_ANY, size = (20, -1),
+                             style = wx.LI_HORIZONTAL)
 
+        #
+        # layout
+        #
         sizer = wx.BoxSizer(wx.VERTICAL)
         
         box = wx.BoxSizer(wx.HORIZONTAL)
-        label = wx.StaticText(parent=self, id=wx.ID_ANY,
-                              label='Select vector map(s) to add to group:')
-        box.Add(label, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT, border=5)
-        self.addmap = wx.CheckListBox(self, -1, wx.DefaultPosition, wx.DefaultSize, vectlist)
-        box.Add(self.addmap, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT| wx.LEFT, border=5)
-        sizer.Add(box, flag=wx.ALIGN_RIGHT | wx.ALL, border=3)
+        box.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
+                                     label = _('Select vector map(s) to add to group:')),
+                flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT,
+                border = 5)
+
+        box.Add(item = self.listMap,
+                flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT,
+                border = 5)
+
         
-        box = wx.BoxSizer(wx.HORIZONTAL)
-        label = wx.StaticText(parent=self, id=wx.ID_ANY,
-                              label='Select vector map(s) to remove from group:')
-        box.Add(label, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT, border=5)
-        self.remmap = wx.CheckListBox(self, -1, wx.DefaultPosition, wx.DefaultSize, self.vgrouplist)
-        box.Add(self.remmap, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT| wx.LEFT, border=5)
-        sizer.Add(box, flag=wx.ALIGN_RIGHT | wx.ALL, border=3)
-
+        sizer.Add(box, flag = wx.ALIGN_RIGHT | wx.ALL,
+                  border = 3)
+        
+        sizer.Add(item = line, proportion = 0,
+                  flag = wx.GROW | wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT,
+                  border = 5)
+        
         # buttons
         btnSizer = wx.StdDialogButtonSizer()
         btnSizer.AddButton(self.btnCancel)
-        btnSizer.AddButton(self.btnSubmit)
+        btnSizer.AddButton(self.btnOK)
         btnSizer.Realize()
 
-        sizer.Add(item=btnSizer, proportion=0,
-                  flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
-
+        sizer.Add(item = btnSizer, proportion = 0,
+                  flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER,
+                  border = 5)
+        
         self.SetSizer(sizer)
         sizer.Fit(self)
         self.Layout()
         
-        self.Bind(wx.EVT_CHECKLISTBOX, self.AddVect, self.addmap)
-        self.Bind(wx.EVT_CHECKLISTBOX, self.RemoveVect, self.remmap)
-
-    def AddVect(self, event):
-        index = event.GetSelection()
-        label = self.addmap.GetString(index)
-        if self.addmap.IsChecked(index):
-            self.vgrouplist.append(label)
-        self.addmap.SetSelection(index)    
-        event.Skip()
+    def MakeVGroup(self):
+        """Create VREF file"""
+        vgrouplist = []
+        for item in range(self.listMap.GetCount()):
+            if not self.listMap.IsChecked(item):
+                continue
+            vgrouplist.append(self.listMap.GetString(item))
         
-    def RemoveVect(self, event):
-        index = event.GetSelection()
-        label = self.remmap.GetString(index)
-        if self.remmap.IsChecked(index):
-            self.vgrouplist.remove(label)
-        self.remmap.SetSelection(index)    
-        event.Skip()
+        f = open(self.vgrpfile, mode='w')
+        try:
+            for vect in vgrouplist:
+                f.write(vect + '\n')
+        finally:
+            f.close()
         
-    def MakeVGroup(self):
-        f = open(self.vgrpfile, mode='w')
-        for vect in self.vgrouplist:
-            f.write(vect+'\n')
-         
-
 class EditGPC(wx.Dialog):
     def __init__(self, parent, data, id=wx.ID_ANY,
                  title=_("Edit GCP"),

Modified: grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/goutput.py
===================================================================
--- grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/goutput.py	2009-02-01 17:05:16 UTC (rev 35703)
+++ grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/goutput.py	2009-02-01 17:08:16 UTC (rev 35704)
@@ -61,17 +61,17 @@
 
         self.start()
 
-    def RunCmd(self, callable, *args, **kwds):
+    def RunCmd(self, callable, onDone, *args, **kwds):
         CmdThread.requestId += 1
 
         self.requestCmd = None
-        self.requestQ.put((CmdThread.requestId, callable, args, kwds))
+        self.requestQ.put((CmdThread.requestId, callable, onDone, args, kwds))
         
         return CmdThread.requestId
 
     def run(self):
         while True:
-            requestId, callable, args, kwds = self.requestQ.get()
+            requestId, callable, onDone, args, kwds = self.requestQ.get()
             
             requestTime = time.time()
             event = wxCmdRun(cmd=args[0],
@@ -96,10 +96,11 @@
             
             time.sleep(.1)
             
-            event = wxCmdDone(aborted=aborted,
-                              returncode=returncode,
-                              time=requestTime,
-                              pid=requestId)
+            event = wxCmdDone(aborted = aborted,
+                              returncode = returncode,
+                              time = requestTime,
+                              pid = requestId,
+                              onDone = onDone)
             
             wx.PostEvent(self.parent, event)
 
@@ -213,7 +214,8 @@
 
         return False
 
-    def WriteLog(self, text, style=None, wrap=None):
+    def WriteLog(self, text, style = None, wrap = None,
+                 switchPage = False):
         """Generic method for writing log message in 
         given style
 
@@ -221,6 +223,10 @@
         @param style text style (see GMStc)
         @param stdout write to stdout or stderr
         """
+        if switchPage and \
+                self.parent.notebook.GetSelection() != self.parent.goutput.pageid:
+            self.parent.notebook.SetSelection(self.parent.goutput.pageid)
+        
         if not style:
             style = self.cmd_output.StyleDefault
         
@@ -244,16 +250,21 @@
         self.cmd_output.EnsureCaretVisible()
         
     def WriteCmdLog(self, line, pid=None):
-        """Write out line in selected style"""
+        """Write message in selected style"""
         if pid:
             line = '(' + str(pid) + ') ' + line
         self.WriteLog(line, style=self.cmd_output.StyleCommand)
 
     def WriteWarning(self, line):
-        """Write out line in warning style"""
+        """Write message in warning style"""
         self.WriteLog(line, style=self.cmd_output.StyleWarning)
 
-    def RunCmd(self, command, compReg=True, switchPage=False):
+    def WriteError(self, line):
+        """Write message in error style"""
+        self.WriteLog(line, style=self.cmd_output.StyleError)
+
+    def RunCmd(self, command, compReg=True, switchPage=False,
+               onDone = None):
         """
         Run in GUI GRASS (or other) commands typed into
         console command text widget, and send stdout output to output
@@ -269,6 +280,7 @@
         @param command command (list)
         @param compReg if true use computation region
         @param switchPage switch to output page
+        @param onDone function to be called when command is finished
         """
         
         # map display window available ?
@@ -320,10 +332,13 @@
                 #
                 
                 # switch to 'Command output'
-                if switchPage and \
-                        self.parent.notebook.GetSelection() != self.parent.goutput.pageid:
-                    self.parent.notebook.SetSelection(self.parent.goutput.pageid)
-
+                if switchPage:
+                    if self.parent.notebook.GetSelection() != self.parent.goutput.pageid:
+                        self.parent.notebook.SetSelection(self.parent.goutput.pageid)
+                    
+                    self.parent.SetFocus() # -> set focus
+                    self.parent.Raise()
+                
                 # activate computational region (set with g.region)
                 # for all non-display commands.
                 if compReg:
@@ -338,8 +353,9 @@
                 else:
                     # process GRASS command with argument
                     self.cmdThread.RunCmd(GrassCmd,
+                                          onDone,
                                           cmdlist,
-                                          self.cmd_stdout, self.cmd_stderr)
+                                          self.cmd_stdout, self.cmd_stderr)                                          
                     
                     self.cmd_output_timer.Start(50)
 
@@ -494,6 +510,9 @@
                 # stopped deamon
                 pass
         
+        if event.onDone:
+            event.onDone(returncode = event.returncode)
+        
         self.console_progressbar.SetValue(0) # reset progress bar on '0%'
 
         self.cmd_output_timer.Stop()

Modified: grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/gselect.py
===================================================================
--- grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/gselect.py	2009-02-01 17:05:16 UTC (rev 35703)
+++ grass/branches/releasebranch_6_4/gui/wxpython/gui_modules/gselect.py	2009-02-01 17:08:16 UTC (rev 35704)
@@ -34,7 +34,7 @@
 
 class Select(wx.combo.ComboCtrl):
     def __init__(self, parent, id, size,
-                 type, multiple=False, mapsets=None, exceptOf=[]):
+                 type=None, multiple=False, mapsets=None, exceptOf=[]):
         """
         Custom control to create a ComboBox with a tree control
         to display and select GIS elements within acessible mapsets.
@@ -50,13 +50,17 @@
 
         self.SetPopupControl(self.tcp)
         self.SetPopupExtents(0,100)
-        self.tcp.GetElementList(type, mapsets, exceptOf)
-        self.tcp.SetData(type, mapsets, exceptOf, multiple)
+        if type:
+            self.tcp.GetElementList(type, mapsets, exceptOf)
+            self.tcp.SetData(type = type, mapsets = mapsets,
+                             exceptOf = exceptOf, multiple = multiple)
 
-    def SetElementList(self, type):
+    def SetElementList(self, type, mapsets = None, exceptOf = []):
         self.tcp.seltree.DeleteAllItems()
         self.tcp.GetElementList(type)
-
+        self.tcp.SetData(type = type, mapsets = mapsets,
+                         exceptOf = exceptOf)
+        
 class TreeCtrlComboPopup(wx.combo.ComboPopup):
     """
     Create a tree ComboBox for selecting maps and other GIS elements
@@ -302,12 +306,16 @@
 
         evt.Skip()
 
-    def SetData(self, type, mapsets, exceptOf, multiple):
-        """Select multiple items?"""
-        self.type = type
-        self.mapsets = mapsets
-        self.exceptOf = exceptOf
-        self.multiple = multiple
+    def SetData(self, **kargs):
+        """Set object properties"""
+        if kargs.has_key('type'):
+            self.type = kargs['type']
+        if kargs.has_key('mapsets'):
+            self.mapsets = kargs['mapsets']
+        if kargs.has_key('exceptOf'):
+            self.exceptOf = kargs['exceptOf']
+        if kargs.has_key('multiple'):
+            self.multiple = kargs['multiple']
         
 class VectorDBInfo:
     """Class providing information about attribute tables
@@ -369,7 +377,8 @@
                                                 "-c", "--q",
                                                 "table=%s" % self.layers[layer]["table"],
                                                 "driver=%s" % self.layers[layer]["driver"],
-                                                "database=%s" % self.layers[layer]["database"]])
+                                                "database=%s" % self.layers[layer]["database"]],
+                                           rerr = None)
 
 
             columns = {} # {name: {type, length, [values], [ids]}}



More information about the grass-commit mailing list