/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/projdialog.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/UI/projdialog.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 976 by frank, Thu May 22 11:39:31 2003 UTC revision 1786 by bh, Wed Oct 8 10:39:11 2003 UTC
# Line 2  Line 2 
2  # Authors:  # Authors:
3  # Jonathan Coles <[email protected]>  # Jonathan Coles <[email protected]>
4  # Frank Koormann <[email protected]>  # Frank Koormann <[email protected]>
5    # Jan-Oliver Wagner <[email protected]>
6  #  #
7  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
8  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
9                                                                                    
10  import os, sys, math  """Projection dialog"""
11    
12    __version__ = "$Revision$"
13    # $Source$
14    # $Id$
15    
16    import os
17  from wxPython.wx import *  from wxPython.wx import *
18    
19  from Thuban import _  from Thuban import _
20    
21  from Thuban.Model.proj import Projection, ProjFile  from Thuban.Model.proj import Projection, ProjFile
22    
23  from Thuban.Model.resource import GetUserProjFiles, GetSystemProjFiles, \  from Thuban.Model.resource import get_user_proj_file, get_system_proj_file, \
24                                    ReadProjFile, WriteProjFile                                    read_proj_file, write_proj_file
25  from Thuban.UI.dialogs import NonModalDialog  from Thuban.UI.dialogs import NonModalNonParentDialog
26    
27    
28  ID_PROJ_ADVANCED  = 4001  ID_PROJ_ADVANCED  = 4001
# Line 33  ID_PROJ_PROJNAME  = 4014 Line 40  ID_PROJ_PROJNAME  = 4014
40  CLIENT_PROJ = 0  CLIENT_PROJ = 0
41  CLIENT_PROJFILE = 1  CLIENT_PROJFILE = 1
42    
43  class ProjFrame(NonModalDialog):  class ProjFrame(NonModalNonParentDialog):
44    
45      def __init__(self, parent, name, title, receiver):      def __init__(self, parent, name, title, receiver):
46          """Initialize the projection dialog.          """Initialize the projection dialog.
# Line 57  class ProjFrame(NonModalDialog): Line 64  class ProjFrame(NonModalDialog):
64          self.projPanels.append(          self.projPanels.append(
65              ("latlong", _("Geographic"), GeoPanel))              ("latlong", _("Geographic"), GeoPanel))
66    
67          NonModalDialog.__init__(self, parent, name, title)          NonModalNonParentDialog.__init__(self, parent, name, title)
68          # originally generate by wxGlade          # originally generate by wxGlade
69          self.panel_1 = wxPanel(self, -1)          self.panel_1 = wxPanel(self, -1)
70          self.panel_edit = wxPanel(self, -1)          self.panel_edit = wxPanel(self, -1)
# Line 100  class ProjFrame(NonModalDialog): Line 107  class ProjFrame(NonModalDialog):
107    
108          self.__set_properties()          self.__set_properties()
109          self.__do_layout()          self.__do_layout()
110    
111          # wxGlade          # wxGlade
112    
113            # Fill the projection choice list.
114            for proj, name, clazz in self.projPanels:
115                self.projchoice.Append(name, [clazz, None])
116    
117          self.originalProjection = self.receiver.GetProjection()          self.originalProjection = self.receiver.GetProjection()
118    
119          self.__DoOnProjAvail()          self.__DoOnProjAvail()
# Line 124  class ProjFrame(NonModalDialog): Line 136  class ProjFrame(NonModalDialog):
136    
137          EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)          EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)
138    
   
139      def OnApply(self, event):      def OnApply(self, event):
140          self.__SetProjection()          self.__SetProjection()
141          self.haveTried = True          self.haveTried = True
# Line 144  class ProjFrame(NonModalDialog): Line 155  class ProjFrame(NonModalDialog):
155              self.receiver.SetProjection(self.originalProjection)              self.receiver.SetProjection(self.originalProjection)
156              self.haveTried = False              self.haveTried = False
157    
   
158      def _OnNew(self, event):      def _OnNew(self, event):
159    
160          # clear all selections          # clear all selections
# Line 175  class ProjFrame(NonModalDialog): Line 185  class ProjFrame(NonModalDialog):
185          if newproj is not None:          if newproj is not None:
186              projfile.Replace(proj, newproj)              projfile.Replace(proj, newproj)
187              try:              try:
188                  WriteProjFile(projfile)                  write_proj_file(projfile)
189              except IOError, (errno, errstr):              except IOError, (errno, errstr):
190                  self.__ShowError(projfile.GetFilename(), errstr)                  self.__ShowError(projfile.GetFilename(), errstr)
191              self.availprojs.SetClientData(sel[0], [newproj, projfile])              self.availprojs.SetClientData(sel[0], [newproj, projfile])
192    
193                self.__FillAvailList( selectProj = newproj.GetName())
194    
195      def _OnAddToList(self, event):      def _OnAddToList(self, event):
196    
197          proj = self.__GetProjection()          proj = self.__GetProjection()
198          if proj is not None:          if proj is not None:
199              self.__usrProjFile.Add(proj)              self.__usrProjFile.Add(proj)
200              try:              try:
201                  WriteProjFile(self.__usrProjFile)                  write_proj_file(self.__usrProjFile)
202              except IOError, (errno, errstr):              except IOError, (errno, errstr):
203                  self.__ShowError(self.__userProjFile.GetFilename(), errstr)                  self.__ShowError(self.__userProjFile.GetFilename(), errstr)
204    
205              self.__FillAvailList()              self.__FillAvailList( selectProj = proj.GetName())
206    
207      def _OnProjAvail(self, event):      def _OnProjAvail(self, event):
208          self.__DoOnProjAvail()          self.__DoOnProjAvail()
209    
210        def show_warnings(self, title, filename, warnings):
211            """Show the warnings (a list of strings) in a dialog
212    
213            If the list is empty no dialog will be shown.
214            """
215            if warnings:
216                text = (_('Warnings when reading "%s":\n\n%s')
217                        % (filename, "\n\n".join(warnings)))
218                self.parent.RunMessageBox(title, text)
219    
220      def _OnImport(self, event):      def _OnImport(self, event):
221    
222          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)
# Line 203  class ProjFrame(NonModalDialog): Line 225  class ProjFrame(NonModalDialog):
225              path = dlg.GetPath()              path = dlg.GetPath()
226    
227              try:              try:
228                  projFile = ReadProjFile(path)                  projFile, warnings = read_proj_file(path)
229                    self.show_warnings(_("Warnings"), path, warnings)
230                  for proj in projFile.GetProjections():                  for proj in projFile.GetProjections():
231                      self.__usrProjFile.Add(proj)                      self.__usrProjFile.Add(proj)
232                  WriteProjFile(self.__usrProjFile)                  write_proj_file(self.__usrProjFile)
233              except IOError, (errno, errstr):              except IOError, (errno, errstr):
234                  self.__ShowError(dlg.GetPath(), errstr)                  self.__ShowError(dlg.GetPath(), errstr)
235    
# Line 233  class ProjFrame(NonModalDialog): Line 256  class ProjFrame(NonModalDialog):
256                      projFile.Add(proj)                      projFile.Add(proj)
257    
258              try:              try:
259                  WriteProjFile(projFile)                  write_proj_file(projFile)
260              except IOError, (errno, errstr):              except IOError, (errno, errstr):
261                  self.__ShowError(dlg.GetPath(), errstr)                  self.__ShowError(dlg.GetPath(), errstr)
262    
# Line 268  class ProjFrame(NonModalDialog): Line 291  class ProjFrame(NonModalDialog):
291                  projfile.Remove(proj)                  projfile.Remove(proj)
292    
293          try:          try:
294              WriteProjFile(projfile)              write_proj_file(projfile)
295          except IOError, (errno, errstr):          except IOError, (errno, errstr):
296              self.__ShowError(projfile.GetFilename(), errstr)              self.__ShowError(projfile.GetFilename(), errstr)
297    
# Line 366  class ProjFrame(NonModalDialog): Line 389  class ProjFrame(NonModalDialog):
389              if proj is None:              if proj is None:
390                  # user selected <None>                  # user selected <None>
391                  self.projname.Clear()                  self.projname.Clear()
392                                    self.projfilepath.SetLabel(_("Projection File: "))
393              else:              else:
394                            
395                  if projfile is not None:                  if projfile is not None:
396                      self.projfilepath.SetLabel(projfile.GetFilename())                      self.projfilepath.SetLabel(_("Projection File: ") +
397                            os.path.basename(projfile.GetFilename()))
398                  else:                  else:
399                      # only None if the currently used projection is selected                      # only None if the currently used projection is selected
400                      self.projfilepath.SetLabel("")                      self.projfilepath.SetLabel(_("Projection File: "))
401    
402                  self.projname.SetValue(proj.GetName())                  self.projname.SetValue(proj.GetName())
403    
# Line 469  class ProjFrame(NonModalDialog): Line 493  class ProjFrame(NonModalDialog):
493    
494          return None          return None
495    
496      def __FillAvailList(self, selectCurrent = False):      def __FillAvailList(self, selectCurrent = False, selectProj = None):
497          """Populate the list of available projections.          """Populate the list of available projections.
498                    
499          selectCurrent -- if True, select the projection used by          selectCurrent -- if True, select the projection used by
500                           the receiver, otherwise select nothing.                           the receiver, otherwise select nothing.
501            selectProj    -- if set, select the projection found under the
502                             specified name. This overwrites any other
503                             selection estimate.
504          """          """
505    
506          self.availprojs.Clear()          self.availprojs.Clear()
# Line 484  class ProjFrame(NonModalDialog): Line 511  class ProjFrame(NonModalDialog):
511          #          #
512          self.availprojs.Append("<None>", (None, None))          self.availprojs.Append("<None>", (None, None))
513    
514          projfile = GetSystemProjFiles()          projfile, warnings = get_system_proj_file()
515          projfile = projfile[0]          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
516          for proj in projfile.GetProjections():          for proj in projfile.GetProjections():
517              self.availprojs.Append(proj.GetName(), [proj, projfile])              self.availprojs.Append(proj.GetName(), [proj, projfile])
518          self.__sysProjFile = projfile          self.__sysProjFile = projfile
519    
520          projfile = GetUserProjFiles()          projfile, warnings = get_user_proj_file()
521          projfile = projfile[0]          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
522          for proj in projfile.GetProjections():          for proj in projfile.GetProjections():
523              self.availprojs.Append(proj.GetName(), [proj, projfile])              self.availprojs.Append(proj.GetName(), [proj, projfile])
524          self.__usrProjFile = projfile          self.__usrProjFile = projfile
525    
         for proj, name, clazz in self.projPanels:  
             self.projchoice.Append(name, [clazz, None])  
   
526          #          #
527          # We add the current projection to the list at last.          # We add the current projection to the list at last.
528          # Since the list is resorted immediately a following FindString()          # Since the list is resorted immediately a following FindString()
# Line 517  class ProjFrame(NonModalDialog): Line 541  class ProjFrame(NonModalDialog):
541                  self.availprojs.SetSelection(                  self.availprojs.SetSelection(
542                          self.availprojs.FindString("<None>")                          self.availprojs.FindString("<None>")
543                      )                      )
544            if selectProj:
545                self.availprojs.SetSelection(
546                            self.availprojs.FindString(selectProj)
547                        )
548    
549                                    
550    
551      def __set_properties(self):      def __set_properties(self):
# Line 553  class ProjFrame(NonModalDialog): Line 582  class ProjFrame(NonModalDialog):
582          grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)          grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)
583          grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)          grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
584          grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)          grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)
585          grid_sizer_1.Add(self.projfilepath, 0, wxALL|wxADJUST_MINSIZE, 4)          grid_sizer_1.Add(self.projfilepath, 0, wxEXPAND|wxALL|wxADJUST_MINSIZE, 4)
586          grid_sizer_1.AddGrowableRow(1)          grid_sizer_1.AddGrowableRow(1)
587          grid_sizer_1.AddGrowableCol(0)          grid_sizer_1.AddGrowableCol(0)
588    
# Line 562  class ProjFrame(NonModalDialog): Line 591  class ProjFrame(NonModalDialog):
591          sizer_13.Add(self.projname, 1, wxALL, 4)          sizer_13.Add(self.projname, 1, wxALL, 4)
592          self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)          self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)
593          sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)          sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
594          sizer_14.Add(self.projchoice, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)          sizer_14.Add(self.projchoice, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4)
595          self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)          self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)
596          self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)          self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)
597          sizer_11.Add(self.button_new, 0, wxALL, 4)          sizer_11.Add(self.button_new, 0, wxEXPAND|wxALL, 4)
598          sizer_11.Add(self.button_add, 0, wxALL, 4)          sizer_11.Add(self.button_add, 0, wxEXPAND|wxALL, 4)
599          sizer_11.Add(20, 20, 0, wxEXPAND, 0)          sizer_11.Add(20, 20, 0, wxEXPAND, 0)
600          sizer_11.Add(self.button_save, 0, wxALL|wxALIGN_BOTTOM, 4)          sizer_11.Add(self.button_save, 0, wxEXPAND|wxALL|wxALIGN_BOTTOM, 4)
601          self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)          self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)
602    
603          sizer_6.Add(self.button_try, 0, wxRIGHT| wxEXPAND, 10)          sizer_6.Add(self.button_try, 0, wxRIGHT| wxEXPAND, 10)
# Line 633  class ProjPanel(wxPanel): Line 662  class ProjPanel(wxPanel):
662          sizer = wxBoxSizer(wxHORIZONTAL)          sizer = wxBoxSizer(wxHORIZONTAL)
663          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0,          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0,
664                                      wxALL|wxALIGN_CENTER_VERTICAL, 4)                                      wxALL|wxALIGN_CENTER_VERTICAL, 4)
665          sizer.Add(self.__ellps, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)          sizer.Add(self.__ellps, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4)
666          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)
667    
668          if childPanel is not None:          if childPanel is not None:
# Line 680  class UnknownProjPanel(ProjPanel): Line 709  class UnknownProjPanel(ProjPanel):
709      def _DoLayout(self):      def _DoLayout(self):
710          sizer = wxBoxSizer(wxVERTICAL)          sizer = wxBoxSizer(wxVERTICAL)
711    
712          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
713              _("Thuban does not know the parameters for the " +                                 _("Thuban does not know the parameters for the"
714                "current projection and cannot display a " +                                   " current projection and cannot display a"
715                "configuration panel.")))                                   " configuration panel.")))
716    
717          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
718    
# Line 814  class UTMPanel(ProjPanel): Line 843  class UTMPanel(ProjPanel):
843          ProjPanel.Clear(self)          ProjPanel.Clear(self)
844    
845      def _OnPropose(self, event):      def _OnPropose(self, event):
846          UTMProposeZoneDialog          """Call the propose dialog.
847            If the receiver (e.g. the current map) has no bounding box,
848            inform the user accordingly.
849            """
850            bb = self.receiver.BoundingBox()
851            if bb is None:
852                dlg = wxMessageDialog(self,
853                        _("Can not propose: No bounding box found."),
854                        _("Projection: Propose UTM Zone"),
855                        wxOK | wxICON_INFORMATION)
856                dlg.CenterOnParent()
857                result = dlg.ShowModal()
858                dlg.Destroy()
859                return
860    
861          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())
862          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
863              self.__zone.SetValue(dlg.GetProposedZone())              self.__zone.SetValue(dlg.GetProposedZone())
# Line 843  class LCCPanel(ProjPanel): Line 886  class LCCPanel(ProjPanel):
886          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
887              _("Latitude of second standard parallel:")))              _("Latitude of second standard parallel:")))
888          sizer.Add(self.__sspLatitude, 0, wxALL, 4)          sizer.Add(self.__sspLatitude, 0, wxALL, 4)
         sizer.Add(wxStaticText(self, -1, _("Latitude of origin:")))  
         sizer.Add(self.__originLat, 0, wxALL, 4)  
889          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))
890          sizer.Add(self.__meridian, 0, wxALL, 4)          sizer.Add(self.__meridian, 0, wxALL, 4)
891            sizer.Add(wxStaticText(self, -1, _("Latitude of origin:")))
892            sizer.Add(self.__originLat, 0, wxALL, 4)
893          sizer.Add(wxStaticText(self, -1, _("False Easting:")))          sizer.Add(wxStaticText(self, -1, _("False Easting:")))
894          sizer.Add(self.__falseEast, 0, wxALL, 4)          sizer.Add(self.__falseEast, 0, wxALL, 4)
895          sizer.Add(wxStaticText(self, -1, _("False Northing:")))          sizer.Add(wxStaticText(self, -1, _("False Northing:")))
# Line 941  class GeoPanel(ProjPanel): Line 984  class GeoPanel(ProjPanel):
984  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001
985  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002
986  class UTMProposeZoneDialog(wxDialog):  class UTMProposeZoneDialog(wxDialog):
987                                                                                    
988      """Propose a sensible Zone considering the current map extent."""      """Propose a sensible Zone considering the current map extent."""
989                                                                                    
990      def __init__(self, parent, (x, y, x2, y2)):      def __init__(self, parent, (x, y, x2, y2)):
991          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),
992                            wxDefaultPosition, wxSize(200, 100))                            wxDefaultPosition, wxSize(200, 100))
993          self.parent = parent          self.parent = parent
         #x, y, x2, y2 = elf.parent.parent.map_bounding_box  
994          x = x + 180          x = x + 180
995          x2 = x2 + 180          x2 = x2 + 180
996          center = (x2 - x) / 2 + x          center = (x2 - x) / 2 + x
997          self.proposedZone = int(center / 6 + 1)          self.proposedZone = int(center / 6 + 1)
998          self.dialogLayout()          self.dialogLayout()
999                                                                                    
1000      def dialogLayout(self):      def dialogLayout(self):
1001          topBox = wxBoxSizer(wxVERTICAL)          topBox = wxBoxSizer(wxVERTICAL)
1002                                                                                    
1003          textBox = wxBoxSizer(wxVERTICAL)          textBox = wxBoxSizer(wxVERTICAL)
1004          textBox.Add(wxStaticText(self, -1, _("The current map extent center " +          textBox.Add(wxStaticText(self, -1, _("The current map extent center "
1005                                             "lies in UTM Zone")),                                               "lies in UTM Zone")),
1006                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
1007          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),
1008                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
1009                                                                                    
1010          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)
1011                                                                                    
1012          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
1013          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,
1014                        _("Take")), 0, wxALL, 4)                        _("Take")), 0, wxALL, 4)
# Line 975  class UTMProposeZoneDialog(wxDialog): Line 1017  class UTMProposeZoneDialog(wxDialog):
1017          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)
1018          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)
1019          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)
1020                                                                                    
1021          self.SetAutoLayout(True)          self.SetAutoLayout(True)
1022          self.SetSizer(topBox)          self.SetSizer(topBox)
1023          topBox.Fit(self)          topBox.Fit(self)
1024          topBox.SetSizeHints(self)          topBox.SetSizeHints(self)
1025                                                                                    
1026      def OnTake(self, event):      def OnTake(self, event):
1027          self.EndModal(wxID_OK)          self.EndModal(wxID_OK)
1028                                                                                    
1029      def OnCancel(self, event):      def OnCancel(self, event):
1030          self.EndModal(wxID_CANCEL)          self.EndModal(wxID_CANCEL)
1031    

Legend:
Removed from v.976  
changed lines
  Added in v.1786

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26