[GRASS-SVN] r39573 - grass/trunk/gui/wxpython/gui_modules

svn_grass at osgeo.org svn_grass at osgeo.org
Sun Oct 18 23:59:06 EDT 2009


Author: cmbarton
Date: 2009-10-18 23:59:06 -0400 (Sun, 18 Oct 2009)
New Revision: 39573

Modified:
   grass/trunk/gui/wxpython/gui_modules/location_wizard.py
Log:
Backport from develbranch_6 r39554. Major enhancement and fix. All projection parameters now selectable by user. Summary page shows g.proj output (i.e., what will show up in GRASS). State Plane projection will bring up a warning box instructing user to use EPSG or custom PROJ4 string. Fixed a number of minor and a few major bugs.

Modified: grass/trunk/gui/wxpython/gui_modules/location_wizard.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/location_wizard.py	2009-10-19 03:56:29 UTC (rev 39572)
+++ grass/trunk/gui/wxpython/gui_modules/location_wizard.py	2009-10-19 03:59:06 UTC (rev 39573)
@@ -11,7 +11,7 @@
  - CoordinateSystemPage
  - ProjectionsPage
  - ItemList
- - ProjTypePage
+ - ProjParamsPage
  - DatumPage
  - EllipsePage
  - GeoreferencedFilePage
@@ -111,26 +111,24 @@
         self.title = wx.StaticText(parent=self, id=wx.ID_ANY, label=title)
         self.title.SetFont(wx.Font(13, wx.SWISS, wx.NORMAL, wx.BOLD))
 
-        # main sizer
+        # main sizers
+        self.pagesizer = wx.BoxSizer(wx.VERTICAL)
         self.sizer = wx.GridBagSizer(vgap=0, hgap=0)
         
     def DoLayout(self):
         """!Do page layout"""
       
-        tmpsizer = wx.BoxSizer(wx.VERTICAL)
 
-        tmpsizer.Add(item=self.title, proportion=0,
+        self.pagesizer.Add(item=self.title, proportion=0,
                      flag=wx.ALIGN_CENTRE | wx.ALL,
                      border=5)
-        tmpsizer.Add(item=wx.StaticLine(self, -1), proportion=0,
+        self.pagesizer.Add(item=wx.StaticLine(self, -1), proportion=0,
                      flag=wx.EXPAND | wx.ALL,
                      border=0)
-        tmpsizer.Add(item=self.sizer, proportion=1,
-                     flag=wx.EXPAND | wx.ALL,
-                     border=5)
+        self.pagesizer.Add(item=self.sizer)
 
         self.SetAutoLayout(True)
-        self.SetSizer(tmpsizer)
+        self.SetSizer(self.pagesizer)
         # tmpsizer.Fit(self)
         self.Layout()
 
@@ -300,8 +298,25 @@
 
     def OnEnterPage(self, event):
         global coordsys
-        if event.GetDirection() and not coordsys:
+        
+        if not coordsys:
             coordsys = "proj"
+            self.radio1.SetValue(True)
+        else:
+            if coordsys == 'proj':
+                self.radio1.SetValue(True)
+            if coordsys == "epsg":
+                self.radio2.SetValue(True)
+            if coordsys == "file":
+                self.radio3.SetValue(True)
+            if coordsys == "wkt":
+                self.radio4.SetValue(True)
+            if coordsys == "custom":
+                self.radio5.SetValue(True)
+            if coordsys == "xy":
+                self.radio6.SetValue(True)
+                
+        if event.GetDirection():
             self.SetNext(self.parent.projpage)
             self.parent.sumpage.SetPrev(self.parent.datumpage)
             
@@ -346,6 +361,7 @@
         self.parent = parent
         self.proj = ''
         self.projdesc = ''
+        self.p4proj = ''
 
         # text input
         self.tproj = self.MakeTextCtrl("", size=(200,-1))
@@ -355,7 +371,7 @@
                                      style=wx.TE_PROCESS_ENTER)
 
         # projection list
-        self.projlist = ItemList(self, data=self.parent.projections.items(),
+        self.projlist = ItemList(self, data=self.parent.projdesc.items(),
                                  columns=[_('Code'), _('Description')])
         self.projlist.resizeLastColumn(30) 
 
@@ -394,27 +410,31 @@
         # self.Layout()
 
     def OnPageChanging(self,event):
-        if event.GetDirection() and self.proj not in self.parent.projections:
+        if event.GetDirection() and self.proj not in self.parent.projections.keys():
             event.Veto()
-        if self.proj == 'utm':
-            self.parent.projtypepage.text_utm.SetEditable(True)
-            self.parent.projtypepage.hemischoices = ['north','south']
-        else:
-            self.parent.projtypepage.text_utm.SetValue('')
-            self.parent.projtypepage.text_utm.SetEditable(False)
-            self.parent.projtypepage.hemischoices = []
 
     def OnText(self, event):
         """!Projection name changed"""
         self.proj = event.GetString().lower()
+        self.p4proj = ''
         nextButton = wx.FindWindowById(wx.ID_FORWARD)
         if len(self.proj) == 0 and nextButton.IsEnabled():
             nextButton.Enable(False)
         
-        if self.proj in self.parent.projections:
-            self.projdesc = self.parent.projections[self.proj]
-            if not nextButton.IsEnabled():
-                nextButton.Enable()
+        if self.proj in self.parent.projections.keys():
+            if self.proj == 'stp':
+                wx.MessageBox('State Plan Projection must be entered as an EPSG code or a custom PROJ4 string', 
+                              'Warning', wx.ICON_WARNING)
+                self.proj = ''
+                self.tproj.SetValue(self.proj)
+                nextButton.Enable(False)
+                return
+            elif self.proj.lower() == 'll':
+                self.p4proj = '+proj=longlat'
+            else:
+                self.p4proj = '+proj=' + self.proj.lower()
+            self.projdesc = self.parent.projections[self.proj][0]
+            nextButton.Enable()
 
     def OnEnterPage(self, event):
         if len(self.proj) == 0:
@@ -432,7 +452,7 @@
             self.proj, self.projdesc = self.projlist.Search(index=[0,1], pattern=event.GetString())
         except:
             self.proj = self.projdesc = ''
-
+            
         event.Skip()
 
     def OnItemSelected(self, event):
@@ -441,8 +461,9 @@
 
         # set values
         self.proj = self.projlist.GetItem(index, 0).GetText().lower()
-        self.projdesc = self.projlist.GetItem(index, 0).GetText()
         self.tproj.SetValue(self.proj)
+        
+        event.Skip()
 
 class ItemList(wx.ListCtrl,
                listmix.ListCtrlAutoWidthMixin,
@@ -524,26 +545,15 @@
             self.DeleteAllItems()
             row = 0
             for value in data:
-                # index = self.InsertStringItem(sys.maxint, str(value[0]))
                 self.itemDataMap[row] = [value[0]]
                 for i in range(1, len(value)):
-                    # try:
-                    # self.SetStringItem(index, i, str(value[i]))
-                    # except:
-                    # self.SetStringItem(index, i, unicode(str(value[i]), 'latin1'))
-                    self.itemDataMap[row].append(value[i])
-                # self.SetItemData(index, row)
+                     self.itemDataMap[row].append(value[i])
                 self.itemIndexMap.append(row)
                 row += 1
 
             self.SetItemCount(row)
             
             # set column width
-#            for i in range(self.GetColumnCount()):
-#                self.SetColumnWidth(i, wx.LIST_AUTOSIZE)
-#            for i in range(self.GetColumnCount()):z
-#            if self.GetColumnWidth(i) < 80:
-#            self.SetColumnWidth(i, 80)
             self.SetColumnWidth(0, 80)
             self.SetColumnWidth(1, 300)
             
@@ -633,108 +643,174 @@
 
         data = []
         pattern = pattern.lower()
-        for idx in index:
-            for i in range(len(self.sourceData)):
+        for i in range(len(self.sourceData)):
+            for idx in index:
                 try:
                     value = str(self.sourceData[i][idx]).lower()
                     if pattern in value:
                         data.append(self.sourceData[i])
+                        break
                 except UnicodeDecodeError:
                     # osgeo4w problem (should be fixed)
                     pass
 
         self.Populate(data)
         if len(data) > 0:
-            
             return data[0]
         else:
 #            self.Populate(self.sourceData)
             return []
 
-class ProjTypePage(TitledPage):
+class ProjParamsPage(TitledPage):
     """
     Wizard page for selecting method of setting coordinate system parameters
     (select coordinate system option)
     """
 
     def __init__(self, wizard, parent):
-        TitledPage.__init__(self, wizard, _("Choose method of specifying georeferencing parameters"))
+        TitledPage.__init__(self, wizard, _("Choose projection parameters"))
         global coordsys
 
         self.utmzone = ''
         self.utmhemisphere = ''
         self.hemischoices = ["north","south"]
         self.parent = parent
+        self.panel = ''
+        self.prjparamsizer = ''
+        self.pentry = {}
+        self.pdesc = {}
+        self.ptype = {}
+        self.pval = {}
+        self.proj4param = {}
+        self.pcount = 0
+        self.paramlist = []
+        self.p4projparams = ''
+        self.projdesc = ''
+        
+        radioSBox = wx.StaticBox(parent=self, id=wx.ID_ANY,
+                               label=" %s " % _("Select datum or ellipsoid (next page)"))
+        radioSBSizer = wx.StaticBoxSizer(radioSBox)
+        self.sizer.Add(radioSBSizer, pos=(0,1), span=(1,2), 
+                           flag=wx.EXPAND | wx.ALIGN_TOP | wx.TOP, border=10)
 
-        self.radio1 = wx.RadioButton(parent=self, id=wx.ID_ANY, label=_("Select datum with associated ellipsoid"),
-                                     style = wx.RB_GROUP)
+        self.radio1 = wx.RadioButton(parent=self, id=wx.ID_ANY, 
+                                label=_("Datum with associated ellipsoid"),
+                                style = wx.RB_GROUP)
         self.radio2 = wx.RadioButton(parent=self, id=wx.ID_ANY,
-                                     label=_("Select ellipsoid"))
-        self.title_utm = self.MakeLabel(_("Set zone for UTM projection:"))
-        self.text_utm = self.MakeTextCtrl(size=(100,-1))
-        self.label_utm = self.MakeLabel(_("Zone:"))
-        self.hemisphere = wx.Choice(parent=self, id=wx.ID_ANY, size=(100, -1),
-                                    choices=self.hemischoices)
-        self.label_hemisphere = self.MakeLabel(_("Hemisphere for zone:"))
+                                label=_("Ellipsoid only"))   
 
-        # layout
-        self.sizer.AddGrowableCol(2)
-        self.sizer.Add(item=self.radio1,
-                       flag=wx.ALIGN_LEFT, pos=(1, 1), span=(1, 2))
-        self.sizer.Add(item=self.radio2,
-                       flag=wx.ALIGN_LEFT, pos=(2, 1), span=(1, 2))
-        self.sizer.Add(item=self.title_utm,
-                       flag=wx.ALIGN_LEFT | wx.ALL,
-                       border=5, pos=(4, 1), span=(1, 2))
-        self.sizer.Add(item=self.label_utm,
-                       flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
-                       border=5, pos=(5, 1), span=(1, 1))
-        self.sizer.Add(item=self.text_utm,
-                       flag=wx.ALIGN_LEFT | wx.ALL, border=5,
-                       pos=(5, 2), span=(1, 1))
-        self.sizer.Add(item=self.label_hemisphere,
-                       flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
-                       border=5, pos=(6, 1), span=(1, 1))
-        self.sizer.Add(item=self.hemisphere,
-                       flag=wx.ALIGN_LEFT|wx.ALL,
-                       border=5, pos=(6, 2), span=(1, 1))
+        radioSBSizer.Add(item=self.radio1,
+                         flag=wx.ALIGN_LEFT | wx.RIGHT, border=20)
+        radioSBSizer.Add(item=self.radio2,
+                         flag=wx.ALIGN_LEFT)
 
-        self.title_utm.Hide()
-        self.text_utm.Hide()
-        self.label_utm.Hide()
-        self.hemisphere.Hide()
-        self.label_hemisphere.Hide()
-
         # bindings
         self.Bind(wx.EVT_RADIOBUTTON, self.SetVal, id=self.radio1.GetId())
         self.Bind(wx.EVT_RADIOBUTTON, self.SetVal, id=self.radio2.GetId())
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChange)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
+        
+    def OnParamEntry(self, event):
+        self.pval[event.GetId() - 2000] = event.GetString()
 
-        # do page layout
-        # self.DoLayout()
-
     def OnPageChange(self,event=None):
-        if event.GetDirection() and self.parent.projpage.proj == 'utm' and self.utmzone == '':
-            wx.MessageBox('You must set a zone for a UTM projection')
-            event.Veto()
-        self.title_utm.Hide()
-        self.text_utm.Hide()
-        self.label_utm.Hide()
-        self.hemisphere.Hide()
-        self.label_hemisphere.Hide()
+        if event.GetDirection():
+            self.p4projparams = ''
+            for num in range(self.pcount + 1):
+                if self.ptype[num] == 'bool':
+                    if self.pval[num] == 'N':
+                        continue
+                    else:
+                        self.p4projparams += (' +' + self.proj4param[num])
+                else:
+                    if self.pval[num] == '':
+                        wx.MessageBox('You must enter a value for %s' % self.pdesc[num],
+                                      'Something is missing!', wx.ICON_ERROR)
+                        event.Veto()
+                    else:
+                        self.p4projparams += (' +' + self.proj4param[num] + '=' + self.pval[num])
 
     def OnEnterPage(self,event):
-        if self.parent.projpage.proj == 'utm':
-            self.title_utm.Show()
-            self.text_utm.Show()
-            self.label_utm.Show()
-            self.hemisphere.Show()
-            self.label_hemisphere.Show()
+        self.projdesc = self.parent.projections[self.parent.projpage.proj][0]
+        try:
+            # page already formatted
+            if self.pagesizer.GetItem(self.panel) != '':
+                pass
+        except:
+            # entering page for the first time
+            paramSBox = wx.StaticBox(parent=self, id=wx.ID_ANY,
+                                   label=_(" Enter parameters for %s projection ") % self.projdesc)
+            paramSBSizer = wx.StaticBoxSizer(paramSBox)
+
+            self.panel = scrolled.ScrolledPanel(self, wx.ID_ANY)
+            self.prjparamsizer = wx.GridBagSizer(vgap=0, hgap=0) 
+
+            self.panel.SetupScrolling()
+
+#            this ought to work but it doesn't
+#            self.sizer.Add(paramSBSizer, pos=(2,1), span=(3,2), 
+#                           flag=wx.EXPAND )
+
+            self.pagesizer.Add(paramSBSizer, proportion=1, 
+                               flag=wx.EXPAND | wx.ALIGN_TOP | wx.ALL, border=10)
+            paramSBSizer.Add(self.panel, proportion=1, 
+                             flag=wx.ALIGN_CENTER|wx.EXPAND)
+
+            paramSBSizer.Fit(self.panel)
+            self.panel.SetSizer(self.prjparamsizer)
+                    
+        if event.GetDirection(): 
+            self.pcount = 0
+            self.prjparamsizer.Clear(True)
+            num = 0
             
-            self.Bind(wx.EVT_CHOICE, self.OnHemisphere, self.hemisphere)
-            self.Bind(wx.EVT_TEXT, self.GetUTM, self.text_utm)
+            for paramgrp in self.parent.projections[self.parent.projpage.proj][1]:
+                
+                # get parameters
+                self.pcount = num
+                self.ptype[num] = self.parent.paramdesc[paramgrp[0]][0]
+                self.proj4param[num] = self.parent.paramdesc[paramgrp[0]][1]
+                self.pdesc[num] = self.parent.paramdesc[paramgrp[0]][2]
 
+                # default values
+                if self.ptype[num] == 'bool': self.pval[num] = 'N'
+                elif self.ptype[num] == 'zone': self.pval[num] = '30' 
+                else: self.pval[num] = paramgrp[2]
+
+                label = wx.StaticText(self.panel, id=1000+num, label=self.pdesc[num], 
+                                      style=wx.ALIGN_RIGHT | wx.ST_NO_AUTORESIZE)
+                if self.ptype[num] == 'bool':
+                    self.pentry[num] = wx.Choice(self.panel, id=2000+num, size=(100,-1), 
+                                                 choices = ['N','Y'])  
+                    self.pentry[num].SetStringSelection(self.pval[num])
+                    self.Bind(wx.EVT_CHOICE, self.OnParamEntry)
+                elif self.ptype[num] == 'zone':
+                    zone = []
+                    for i in range(1, 61):
+                        zone.append(str(i))
+                    self.pentry[num] = wx.Choice(self.panel, id=2000+num, size=(100,-1), 
+                                                 choices = zone)  
+                    self.pentry[num].SetStringSelection(self.pval[num])
+                    self.Bind(wx.EVT_CHOICE, self.OnParamEntry)
+                else:
+                    self.pentry[num] = wx.TextCtrl(self.panel, id=2000+num, value=self.pval[num],
+                                                   size=(100,-1))
+                    self.Bind(wx.EVT_TEXT, self.OnParamEntry)
+                    if paramgrp[1] == 'noask':
+                        self.pentry[num].SetEditable(False)
+
+                self.prjparamsizer.Add(item=label, pos=(num, 1),
+                               flag=wx.ALIGN_RIGHT | wx.RIGHT, border=5)
+                self.prjparamsizer.Add(item=self.pentry[num], pos=(num, 2),
+                               flag=wx.ALIGN_LEFT | wx.LEFT, border=5)                
+                num += 1    
+                
+        self.panel.SetSize(self.panel.GetBestSize())
+        self.panel.Layout()
+        self.Layout()
+        self.Update()
+
+
         if not wx.FindWindowById(wx.ID_FORWARD).IsEnabled():
             wx.FindWindowById(wx.ID_FORWARD).Enable()
 
@@ -827,45 +903,46 @@
 
     def OnPageChanging(self, event):
         self.proj4params = ''
-        if event.GetDirection() and self.datum not in self.parent.datums:
-            event.Veto()
-        else:
-            # check for datum tranforms            
-            proj4string = self.parent.CreateProj4String() + ' +datum=%s' % self.datum
-            ret = gcmd.RunCommand('g.proj',
-                                  read = True,
-                                  proj4 = proj4string, 
-                                  datumtrans = '-1')
-            
-            if ret != '':
-                dtrans = ''
-                # open a dialog to select datum transform number
-                dlg = SelectTransformDialog(self.parent.parent, transforms=ret)
+        if event.GetDirection():
+            if self.datum not in self.parent.datums:
+                event.Veto()
+            else:
+                # check for datum tranforms            
+                proj4string = self.parent.CreateProj4String() + ' +datum=%s' % self.datum
+                ret = gcmd.RunCommand('g.proj',
+                                      read = True,
+                                      proj4 = proj4string, 
+                                      datumtrans = '-1')
                 
-                if dlg.ShowModal() == wx.ID_OK:
-                    dtrans = dlg.GetTransform()
-                    if dtrans == '':
+                if ret != '':
+                    dtrans = ''
+                    # open a dialog to select datum transform number
+                    dlg = SelectTransformDialog(self.parent.parent, transforms=ret)
+                    
+                    if dlg.ShowModal() == wx.ID_OK:
+                        dtrans = dlg.GetTransform()
+                        if dtrans == '':
+                            dlg.Destroy()
+                            event.Veto()
+                            return 'Datum transform is required.'
+                    else:
                         dlg.Destroy()
                         event.Veto()
                         return 'Datum transform is required.'
-                else:
-                    dlg.Destroy()
-                    event.Veto()
-                    return 'Datum transform is required.'
+                    
+                    self.parent.datumtrans = dtrans
                 
-                self.parent.datumtrans = dtrans
-                
         self.GetNext().SetPrev(self)
-
-        self.GetNext().SetPrev(self)
         self.parent.ellipsepage.ellipseparams = self.parent.ellipsoids[self.ellipsoid][1]
 
     def OnEnterPage(self,event):
-        if len(self.datum) == 0:
-            # disable 'next' button by default
-            wx.FindWindowById(wx.ID_FORWARD).Enable(False)
-        else:
-            wx.FindWindowById(wx.ID_FORWARD).Enable(True)
+        self.parent.datumtrans = 0
+        if event.GetDirection():
+            if len(self.datum) == 0:
+                # disable 'next' button by default when entering from previous page
+                wx.FindWindowById(wx.ID_FORWARD).Enable(False)
+            else:
+                wx.FindWindowById(wx.ID_FORWARD).Enable(True)
 
         event.Skip()
 
@@ -873,14 +950,17 @@
         self.datum = event.GetString().lower()
 
         nextButton = wx.FindWindowById(wx.ID_FORWARD)
-        if len(self.datum) == 0 and nextButton.IsEnabled():
+        if len(self.datum) == 0 or self.datum not in self.parent.datums:
             nextButton.Enable(False)
-        elif self.datum in self.parent.datums:
+        else:
             self.datumdesc = self.parent.datums[self.datum][0]
             self.ellipsoid = self.parent.datums[self.datum][1]
             self.datumparams = self.parent.datums[self.datum][2]
+            for p in self.datumparams:
+                if p in ['dx=0.0','dy=0.0','dz=0.0']: self.datumparams.remove(p)
             nextButton.Enable(True)
             
+        self.Update()    
         event.Skip()
 
     def OnDSearch(self, event):
@@ -892,14 +972,11 @@
 
         event.Skip()
 
-    def OnDatumSelected(self,event):
+    def OnDatumSelected(self, event):
         index = event.m_itemIndex
         item = event.GetItem()
 
         self.datum = self.datumlist.GetItem(index, 0).GetText()
-        self.datumdesc = self.parent.datums[self.datum][0]
-        self.ellipsoid = self.parent.datums[self.datum][1]
-        self.datumparams = self.parent.datums[self.datum][2]
         self.tdatum.SetValue(self.datum)
         
         event.Skip()
@@ -934,6 +1011,7 @@
 
         self.ellipselist = ItemList(self, data=data,
                                     columns=[_('Code'), _('Description')])
+        self.ellipselist.resizeLastColumn(30)                             
 
         # layout
         self.sizer.AddGrowableCol(4)
@@ -968,9 +1046,6 @@
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
 
-        # do page layout
-        # self.DoLayout()
-
     def OnEnterPage(self,event):
         if len(self.ellipse) == 0:
             # disable 'next' button by default
@@ -987,14 +1062,13 @@
         self.proj4params = ''
         self.GetNext().SetPrev(self)
         self.parent.datumpage.datumparams = ''
-        self.parent.datumpage.transparams = ''
         # self.GetNext().SetPrev(self) (???)
 
     def OnText(self, event):
         """!Ellipspoid code changed"""
         self.ellipse = event.GetString()
         nextButton = wx.FindWindowById(wx.ID_FORWARD)
-        if len(self.ellipse) == 0 and nextButton.IsEnabled():
+        if len(self.ellipse) == 0 or self.ellipse not in self.parent.ellipsoids:
             nextButton.Enable(False)
             self.ellipsedesc = ''
             self.ellipseparams = ''
@@ -1002,23 +1076,17 @@
         elif self.ellipse in self.parent.ellipsoids:
             self.ellipsedesc = self.parent.ellipsoids[self.ellipse][0]
             self.ellipseparams = self.parent.ellipsoids[self.ellipse][1]
-            if not nextButton.IsEnabled():
-                nextButton.Enable()
+            nextButton.Enable(True)
 
     def OnSearch(self, event):
         """!Search ellipsoid by desc"""
-        str =  event.GetString()
         try:
             self.ellipse, self.ellipsedesc = \
                 self.ellipselist.Search(index=[0,1], pattern=event.GetString())
             self.ellipseparams = self.parent.ellipsoids[self.ellipse][1]
-            self.proj4params = self.parent.ellipsoids[self.ellipse][2]
         except:
-            self.ellipse = self.ellipsedesc = ''
-            self.ellipseparams = self.proj4params = ''
+            self.ellipse = self.ellipsedesc = self.ellipseparams = ''
 
-        self.tellipse.SetValue(self.ellipse)
-
         event.Skip()
 
     def OnItemSelected(self,event):
@@ -1026,10 +1094,9 @@
         item = event.GetItem()
 
         self.ellipse = self.ellipselist.GetItem(index, 0).GetText()
-        self.ellipsedesc = self.parent.ellipsoids[self.ellipse][0]
-        self.ellipseparams = self.parent.ellipsoids[self.ellipse][1]
-
         self.tellipse.SetValue(self.ellipse)
+        
+        event.Skip()
 
 class GeoreferencedFilePage(TitledPage):
     """
@@ -1141,9 +1208,6 @@
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
 
-        # do page layout
-        # self.DoLayout()
-
     def OnEnterPage(self, event):
         if len(self.wktfile) == 0:
             # disable 'next' button by default
@@ -1284,15 +1348,14 @@
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
 
-        # do page layout
-        # self.DoLayout()
-
     def OnEnterPage(self, event):
-        if not self.epsgcode:
-            # disable 'next' button by default
-            wx.FindWindowById(wx.ID_FORWARD).Enable(False)
-        else:
-            wx.FindWindowById(wx.ID_FORWARD).Enable(True)
+        self.parent.datumtrans = 0
+        if event.GetDirection():
+            if not self.epsgcode:
+                # disable 'next' button by default
+                wx.FindWindowById(wx.ID_FORWARD).Enable(False)
+            else:
+                wx.FindWindowById(wx.ID_FORWARD).Enable(True)
 
         # load default epsg database file
         self.OnBrowseCodes(None)
@@ -1444,9 +1507,6 @@
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
 
-        # do page layout
-        # self.DoLayout()
-
     def OnEnterPage(self, event):
         if len(self.customstring) == 0:
             # disable 'next' button by default
@@ -1557,13 +1617,6 @@
         self.sizer.Add(item=(10,20),
                        flag=wx.ALIGN_CENTER_HORIZONTAL | wx.ALL,
                        border=5, pos=(5, 0), span=(1, 2))
-        # self.sizer.AddGrowableRow(6)
-        #self.sizer.Add(item=self.MakeLabel(_("You can set the default extents "
-        #                                     "and resolution after creating new location%s"
-        #                                     "or you can set them during a working session.") % os.linesep,
-        #                                   style=wx.ALIGN_CENTER),
-        #               flag=wx.ALIGN_CENTRE | wx.ALL, border=5, pos=(6, 0),
-        #               span=(1, 2))
 
     def OnEnterPage(self,event):
         """
@@ -1572,7 +1625,10 @@
 
         database = self.parent.startpage.grassdatabase
         location = self.parent.startpage.location
-
+        proj4string = self.parent.CreateProj4String()
+        epsgcode = self.parent.epsgpage.epsgcode
+        dtrans = self.parent.datumtrans
+        
         global coordsys
         if coordsys not in ['proj', 'epsg']:
             self.lproj4stringLabel.Hide()
@@ -1583,25 +1639,39 @@
             self.lproj4string.Show()
             self.lproj4stringLabel.SetLabel(_("PROJ.4 definition:"))
             if coordsys == 'proj':
-                self.lproj4string.SetLabel(self.parent.CreateProj4String())
+                ret, msg, err = gcmd.RunCommand('g.proj',
+                                       flags = 'j',
+                                       proj4 = proj4string,
+                                       datumtrans = dtrans,
+                                       location = location,
+                                       getErrorMsg = True,
+                                       read = True)
+            elif coordsys == 'epsg':
+                ret, msg, err = gcmd.RunCommand('g.proj',
+                                       flags = 'j',
+                                       epsg = epsgcode,
+                                       datumtrans = dtrans,
+                                       location = location,
+                                       getErrorMsg = True,
+                                       read = True)
+            
+            if ret == 0:
+                projlabel = ''
+                for line in msg.splitlines():
+                    projlabel = projlabel + '%s ' % line
+                self.lproj4string.SetLabel(projlabel)
             else:
-                self.lproj4string.SetLabel(self.parent.epsgpage.epsgCodeDict[self.parent.epsgpage.epsgcode][1])
+                wx.MessageBox(err, 'Error', wx.ICON_ERROR)
+
             self.lproj4string.Wrap(400)
             
-        projection = self.parent.projpage.proj
         projdesc = self.parent.projpage.projdesc
-        utmzone = self.parent.projtypepage.utmzone
-        utmhemisphere = self.parent.projtypepage.utmhemisphere
-        ellipse = self.parent.ellipsepage.ellipse
         ellipsedesc = self.parent.ellipsepage.ellipsedesc
-        datum = self.parent.datumpage.datum
         datumdesc = self.parent.datumpage.datumdesc
-        ellipsoid = self.parent.datumpage.ellipsoid
-        datumparams = self.parent.datumpage.datumparams
-
         self.ldatabase.SetLabel(str(database))
         self.llocation.SetLabel(str(location))
         label = ''
+        
         if coordsys == 'epsg':
             label = 'EPSG code %s (%s)' % (self.parent.epsgpage.epsgcode, self.parent.epsgpage.epsgdesc)
             self.lprojection.SetLabel(label)
@@ -1612,7 +1682,7 @@
             label = 'matches file %s' % self.parent.wktpage.wktfile
             self.lprojection.SetLabel(label)
         elif coordsys == 'proj':
-            label = ('%s, %s%s' % (projdesc, datumdesc, ellipsedesc))
+            label = ('%s, %s %s' % (projdesc, datumdesc, ellipsedesc))
             self.lprojection.SetLabel(label)
         elif coordsys == 'xy':
             label = ('XY coordinate system (not projected).')
@@ -1661,6 +1731,7 @@
         # datum transform number and list of datum transforms
         #
         self.datumtrans = 0
+        self.proj4string = ''
 
         #
         # define wizard pages
@@ -1671,7 +1742,7 @@
         self.csystemspage = CoordinateSystemPage(self.wizard, self)
         self.projpage = ProjectionsPage(self.wizard, self)
         self.datumpage = DatumPage(self.wizard, self)
-        self.projtypepage = ProjTypePage(self.wizard,self)
+        self.paramspage = ProjParamsPage(self.wizard,self)
         self.epsgpage = EPSGPage(self.wizard, self)
         self.filepage = GeoreferencedFilePage(self.wizard, self)
         self.wktpage = WKTPage(self.wizard, self)
@@ -1689,15 +1760,15 @@
         self.csystemspage.SetNext(self.sumpage)
 
         self.projpage.SetPrev(self.csystemspage)
-        self.projpage.SetNext(self.projtypepage)
+        self.projpage.SetNext(self.paramspage)
 
-        self.projtypepage.SetPrev(self.projpage)
-        self.projtypepage.SetNext(self.datumpage)
+        self.paramspage.SetPrev(self.projpage)
+        self.paramspage.SetNext(self.datumpage)
 
-        self.datumpage.SetPrev(self.projtypepage)
+        self.datumpage.SetPrev(self.paramspage)
         self.datumpage.SetNext(self.sumpage)
 
-        self.ellipsepage.SetPrev(self.projtypepage)
+        self.ellipsepage.SetPrev(self.paramspage)
         self.ellipsepage.SetNext(self.sumpage)
 
         self.epsgpage.SetPrev(self.csystemspage)
@@ -1721,7 +1792,7 @@
         self.csystemspage.DoLayout()
         self.projpage.DoLayout()
         self.datumpage.DoLayout()
-        self.projtypepage.DoLayout()
+        self.paramspage.DoLayout()
         self.epsgpage.DoLayout()
         self.filepage.DoLayout()
         self.wktpage.DoLayout()
@@ -1778,16 +1849,27 @@
     
     def __readData(self):
         """!Get georeferencing information from tables in $GISBASE/etc"""
-        # read projection definitions
-        f = open(os.path.join(globalvar.ETCDIR, "projections"), "r")
+
+        # read projection and parameters
+        f = open(os.path.join(globalvar.ETCDIR, "proj-parms.table"), "r")
         self.projections = {}
+        self.projdesc = {}
         for line in f.readlines():
-            line = line.expandtabs(1)
             line = line.strip()
-            if line == '' or line[0] == "#":
+            try:
+                proj, projdesc, params = line.split(':')
+                paramslist = params.split(';')
+                plist = []
+                for p in paramslist:
+                    if p == '': continue
+                    p1, pdefault = p.split(',')
+                    pterm, pask = p1.split('=')
+                    p = [pterm.strip(), pask.strip(), pdefault.strip()]
+                    plist.append(p)
+                self.projections[proj.lower().strip()] = (projdesc.strip(), plist)
+                self.projdesc[proj.lower().strip()] = projdesc.strip()
+            except:
                 continue
-            proj, projdesc = line.split(":", 1)
-            self.projections[proj.strip()] = projdesc.strip()
         f.close()
 
         # read datum definitions
@@ -1808,34 +1890,6 @@
             self.datums[datum] = (datumdesc.replace('_', ' '), ellipsoid, paramlist)
         f.close()
 
-        # read datum transforms parameters
-        f = open(os.path.join(globalvar.ETCDIR, "datumtransform.table"), "r")
-        self.transforms = {}
-        j = 1
-        for line in f.readlines():
-            if j < 10:
-                transcode = 'T0' + str(j)
-            else:
-               transcode = 'T' + str(j)
-            line = line.expandtabs(1)
-            line = line.strip()
-            if line == '' or line[0] == "#":
-                continue
-            datum, rest = line.split(" ", 1)
-            rest = rest.strip('" ')
-            params, rest = rest.split('"', 1)
-            params = params.strip()
-            rest = rest.strip('" ')
-            try:
-                region, info = rest.split('"', 1)
-                info = info.strip('" ')
-                info = region + ': ' + info
-            except:
-                info = rest
-            self.transforms[transcode] = (datum, info, params)
-            j += 1
-        f.close()
-
         # read ellipsiod definitions
         f = open(os.path.join(globalvar.ETCDIR, "ellipse.table"), "r")
         self.ellipsoids = {}
@@ -1851,6 +1905,18 @@
             paramslist = params.split()
             self.ellipsoids[ellipse] = (desc, paramslist)
         f.close()
+        
+        # read projection parameter description and parsing table
+        f = open(os.path.join(globalvar.ETCDIR, "proj-desc.table"), "r")
+        self.paramdesc = {}
+        for line in f.readlines():
+            line = line.strip()
+            try:
+                pparam, datatype, proj4term, desc = line.split(':')
+                self.paramdesc[pparam] = (datatype, proj4term, desc)
+            except:
+                continue
+        f.close()
 
     def OnWizFinished(self):
         database = self.startpage.grassdatabase
@@ -1965,19 +2031,16 @@
     def CreateProj4String(self):
         """!Constract PROJ.4 string"""
         location = self.startpage.location
-        proj = self.projpage.proj
+        proj = self.projpage.p4proj
         projdesc = self.projpage.projdesc
-        
-        utmzone = self.projtypepage.utmzone
-        utmhemisphere = self.projtypepage.utmhemisphere
-        
+        proj4params = self.paramspage.p4projparams
+                
         datum = self.datumpage.datum
         if self.datumpage.datumdesc:
             datumdesc = self.datumpage.datumdesc +' - ' + self.datumpage.ellipsoid
         else:
             datumdesc = ''
-        datumparams = self.datumpage.datumparams
-        
+        datumparams = self.datumpage.datumparams        
         ellipse = self.ellipsepage.ellipse
         ellipsedesc = self.ellipsepage.ellipsedesc
         ellipseparams = self.ellipsepage.ellipseparams
@@ -1985,34 +2048,25 @@
         #
         # creating PROJ.4 string
         #
-        if proj == 'll':
-            proj4string = '+proj=longlat'
-        elif proj == 'utm':
-            proj4string = '+proj=%s +zone=%s' % (utm, utmzone)
-            if utmhemisphere == 'south':
-                proj4string += '+south'
-        else:
-            proj4string = '+proj=%s ' % (proj)
-            
-        self.shortproj4string = proj4string
+
+        proj4string = '%s %s' % (proj, proj4params)
                             
-        proj4params = ''
         # set ellipsoid parameters
         for item in ellipseparams:
             if item[:4] == 'f=1/':
                 item = '+rf='+item[4:]
             else:
                 item = '+'+item
-            proj4params = '%s %s' % (proj4params, item)
+            proj4string = '%s %s' % (proj4string, item)
         # set datum and transform parameters if relevant
         if datumparams:
             for item in datumparams:
-                proj4params = '%s +%s' % (proj4params,item)
+                proj4string = '%s +%s' % (proj4string,item)
 
-        proj4params = '%s +no_defs' % proj4params
-
-        return '%s %s' % (proj4string, proj4params)
+        proj4string = '%s +no_defs' % proj4string
         
+        return proj4string
+        
     def Proj4Create(self, proj4string):
         """!Create a new location for selected projection
         
@@ -2691,7 +2745,6 @@
 
         sizer.Fit(panel)
 
-
         self.SetSize(self.GetBestSize())
         self.Layout()
         



More information about the grass-commit mailing list