/[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 1167 by jonathan, Thu Jun 12 12:42:34 2003 UTC revision 1789 by bh, Wed Oct 8 13:10:45 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 get_user_proj_files, get_system_proj_files, \  from Thuban.Model.resource import get_user_proj_file, get_system_proj_file, \
24                                    read_proj_file, write_proj_file                                    read_proj_file, write_proj_file
25  from Thuban.UI.dialogs import NonModalNonParentDialog  from Thuban.UI.dialogs import NonModalNonParentDialog
26    
# Line 129  class ProjFrame(NonModalNonParentDialog) Line 136  class ProjFrame(NonModalNonParentDialog)
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 149  class ProjFrame(NonModalNonParentDialog) Line 155  class ProjFrame(NonModalNonParentDialog)
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 202  class ProjFrame(NonModalNonParentDialog) Line 207  class ProjFrame(NonModalNonParentDialog)
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 210  class ProjFrame(NonModalNonParentDialog) Line 225  class ProjFrame(NonModalNonParentDialog)
225              path = dlg.GetPath()              path = dlg.GetPath()
226    
227              try:              try:
228                  projFile = read_proj_file(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                  write_proj_file(self.__usrProjFile)                  write_proj_file(self.__usrProjFile)
# Line 373  class ProjFrame(NonModalNonParentDialog) Line 389  class ProjFrame(NonModalNonParentDialog)
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 388  class ProjFrame(NonModalNonParentDialog) Line 405  class ProjFrame(NonModalNonParentDialog)
405                  i = 0                  i = 0
406                  for projType, name, clazz in self.projPanels:                  for projType, name, clazz in self.projPanels:
407                      if myProjType == projType:                      if myProjType == projType:
408                            self.projchoice.Enable(True)
409                          self.projchoice.SetSelection(i)                          self.projchoice.SetSelection(i)
410                          self.__DoOnProjChoice()                          self.__DoOnProjChoice()
411    
# Line 398  class ProjFrame(NonModalNonParentDialog) Line 416  class ProjFrame(NonModalNonParentDialog)
416                          assert self.curProjPanel is not None                          assert self.curProjPanel is not None
417    
418                          self.curProjPanel.SetProjection(proj)                          self.curProjPanel.SetProjection(proj)
419                            break
420                      i += 1                      i += 1
421                    else:
422                        self.projchoice.Disable()
423                        self._show_proj_panel(UnknownProjPanel(self.panel_edit,
424                                                               self.receiver))
425    
426          self.__VerifyButtons()          self.__VerifyButtons()
427    
# Line 420  class ProjFrame(NonModalNonParentDialog) Line 443  class ProjFrame(NonModalNonParentDialog)
443    
444          sel = choice.GetSelection()          sel = choice.GetSelection()
445          if sel != -1:          if sel != -1:
   
446              clazz, obj = choice.GetClientData(sel)              clazz, obj = choice.GetClientData(sel)
   
447              if obj is None:              if obj is None:
448                  obj = clazz(self.panel_edit, self.receiver)                  obj = clazz(self.panel_edit, self.receiver)
449                  choice.SetClientData(sel, [clazz, obj])                  choice.SetClientData(sel, [clazz, obj])
450                self._show_proj_panel(obj)
451    
452              if self.curProjPanel is not None:      def _show_proj_panel(self, panel):
453                  self.curProjPanel.Hide()          """Show the panel as the projection panel"""
454                  self.sizer_projctrls.Remove(self.curProjPanel)          if self.curProjPanel is not None:
455                self.curProjPanel.Hide()
456              self.curProjPanel = obj              self.sizer_projctrls.Remove(self.curProjPanel)
457              self.curProjPanel.Show()  
458            self.curProjPanel = panel
459              self.sizer_projctrls.Add(self.curProjPanel, 1,          self.curProjPanel.Show()
460                  wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)  
461              self.sizer_projctrls.Layout()          self.sizer_projctrls.Add(self.curProjPanel, 1,
462              self.Layout()              wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
463              self.topBox.SetSizeHints(self)          self.sizer_projctrls.Layout()
464            self.Layout()
465            self.topBox.SetSizeHints(self)
466    
467      def __SetProjection(self):      def __SetProjection(self):
468          """Set the receiver's projection."""          """Set the receiver's projection."""
# Line 494  class ProjFrame(NonModalNonParentDialog) Line 518  class ProjFrame(NonModalNonParentDialog)
518          #          #
519          self.availprojs.Append("<None>", (None, None))          self.availprojs.Append("<None>", (None, None))
520    
521          projfile = get_system_proj_files()          projfile, warnings = get_system_proj_file()
522          projfile = projfile[0]          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
523          for proj in projfile.GetProjections():          for proj in projfile.GetProjections():
524              self.availprojs.Append(proj.GetName(), [proj, projfile])              self.availprojs.Append(proj.GetName(), [proj, projfile])
525          self.__sysProjFile = projfile          self.__sysProjFile = projfile
526    
527          projfile = get_user_proj_files()          projfile, warnings = get_user_proj_file()
528          projfile = projfile[0]          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
529          for proj in projfile.GetProjections():          for proj in projfile.GetProjections():
530              self.availprojs.Append(proj.GetName(), [proj, projfile])              self.availprojs.Append(proj.GetName(), [proj, projfile])
531          self.__usrProjFile = projfile          self.__usrProjFile = projfile
# Line 565  class ProjFrame(NonModalNonParentDialog) Line 589  class ProjFrame(NonModalNonParentDialog)
589          grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)          grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)
590          grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)          grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
591          grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)          grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)
592          grid_sizer_1.Add(self.projfilepath, 0, wxALL|wxADJUST_MINSIZE, 4)          grid_sizer_1.Add(self.projfilepath, 0, wxEXPAND|wxALL|wxADJUST_MINSIZE, 4)
593          grid_sizer_1.AddGrowableRow(1)          grid_sizer_1.AddGrowableRow(1)
594          grid_sizer_1.AddGrowableCol(0)          grid_sizer_1.AddGrowableCol(0)
595    
# Line 684  ID_TMPANEL_FALSE_NORTH = 4004 Line 708  ID_TMPANEL_FALSE_NORTH = 4004
708  ID_TMPANEL_SCALE = 4005  ID_TMPANEL_SCALE = 4005
709    
710  class UnknownProjPanel(ProjPanel):  class UnknownProjPanel(ProjPanel):
711    
712        """Panel for unknown projection types"""
713    
714      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
715          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
716    
# Line 692  class UnknownProjPanel(ProjPanel): Line 719  class UnknownProjPanel(ProjPanel):
719      def _DoLayout(self):      def _DoLayout(self):
720          sizer = wxBoxSizer(wxVERTICAL)          sizer = wxBoxSizer(wxVERTICAL)
721    
722          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
723              _("Thuban does not know the parameters for the " +                                 _("Thuban does not know the parameters for the"
724                "current projection and cannot display a " +                                   " current projection\n"
725                "configuration panel.")))                                   "and cannot display a configuration panel.")))
726    
727          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
728    
# Line 826  class UTMPanel(ProjPanel): Line 853  class UTMPanel(ProjPanel):
853          ProjPanel.Clear(self)          ProjPanel.Clear(self)
854    
855      def _OnPropose(self, event):      def _OnPropose(self, event):
856          UTMProposeZoneDialog          """Call the propose dialog.
857            If the receiver (e.g. the current map) has no bounding box,
858            inform the user accordingly.
859            """
860            bb = self.receiver.BoundingBox()
861            if bb is None:
862                dlg = wxMessageDialog(self,
863                        _("Can not propose: No bounding box found."),
864                        _("Projection: Propose UTM Zone"),
865                        wxOK | wxICON_INFORMATION)
866                dlg.CenterOnParent()
867                result = dlg.ShowModal()
868                dlg.Destroy()
869                return
870    
871          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())
872          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
873              self.__zone.SetValue(dlg.GetProposedZone())              self.__zone.SetValue(dlg.GetProposedZone())
# Line 953  class GeoPanel(ProjPanel): Line 994  class GeoPanel(ProjPanel):
994  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001
995  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002
996  class UTMProposeZoneDialog(wxDialog):  class UTMProposeZoneDialog(wxDialog):
997                                                                                    
998      """Propose a sensible Zone considering the current map extent."""      """Propose a sensible Zone considering the current map extent."""
999                                                                                    
1000      def __init__(self, parent, (x, y, x2, y2)):      def __init__(self, parent, (x, y, x2, y2)):
1001          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),
1002                            wxDefaultPosition, wxSize(200, 100))                            wxDefaultPosition, wxSize(200, 100))
1003          self.parent = parent          self.parent = parent
         #x, y, x2, y2 = elf.parent.parent.map_bounding_box  
1004          x = x + 180          x = x + 180
1005          x2 = x2 + 180          x2 = x2 + 180
1006          center = (x2 - x) / 2 + x          center = (x2 - x) / 2 + x
1007          self.proposedZone = int(center / 6 + 1)          self.proposedZone = int(center / 6 + 1)
1008          self.dialogLayout()          self.dialogLayout()
1009                                                                                    
1010      def dialogLayout(self):      def dialogLayout(self):
1011          topBox = wxBoxSizer(wxVERTICAL)          topBox = wxBoxSizer(wxVERTICAL)
1012                                                                                    
1013          textBox = wxBoxSizer(wxVERTICAL)          textBox = wxBoxSizer(wxVERTICAL)
1014          textBox.Add(wxStaticText(self, -1, _("The current map extent center " +          textBox.Add(wxStaticText(self, -1, _("The current map extent center "
1015                                             "lies in UTM Zone")),                                               "lies in UTM Zone")),
1016                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
1017          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),
1018                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
1019                                                                                    
1020          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)
1021                                                                                    
1022          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
1023          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,
1024                        _("Take")), 0, wxALL, 4)                        _("Take")), 0, wxALL, 4)
# Line 987  class UTMProposeZoneDialog(wxDialog): Line 1027  class UTMProposeZoneDialog(wxDialog):
1027          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)
1028          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)
1029          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)
1030                                                                                    
1031          self.SetAutoLayout(True)          self.SetAutoLayout(True)
1032          self.SetSizer(topBox)          self.SetSizer(topBox)
1033          topBox.Fit(self)          topBox.Fit(self)
1034          topBox.SetSizeHints(self)          topBox.SetSizeHints(self)
1035                                                                                    
1036      def OnTake(self, event):      def OnTake(self, event):
1037          self.EndModal(wxID_OK)          self.EndModal(wxID_OK)
1038                                                                                    
1039      def OnCancel(self, event):      def OnCancel(self, event):
1040          self.EndModal(wxID_CANCEL)          self.EndModal(wxID_CANCEL)
1041    

Legend:
Removed from v.1167  
changed lines
  Added in v.1789

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26