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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 741 - (show annotations)
Fri Apr 25 09:14:27 2003 UTC (21 years, 10 months ago) by jonathan
Original Path: trunk/thuban/Thuban/UI/projdialog.py
File MIME type: text/x-python
File size: 30832 byte(s)
(ProjFrame._OnAddToList): Renamed from
        ProjFrame._OnSaveAs. Removed old dead code from previous
        implementation.
(ProjFrame._OnExport): Add support for exporting more than one
        projection to a single file.
(ProjFrame.__FillAvailList): use string formatting (% operator)
        to build strings that are (partly) translated. Fixes RTbug #1818.

1 #!/usr/bin/env python
2 # generated by wxGlade 0.2.1 on Thu Apr 17 11:51:39 2003
3
4 import os, sys
5 from wxPython.wx import *
6
7 from Thuban import _
8
9 from Thuban.Model.proj import Projection, ProjFile
10
11 from Thuban.Model.resource import GetUserProjFiles, GetSystemProjFiles, \
12 ReadProjFile, WriteProjFile
13 from Thuban.UI.dialogs import NonModalDialog
14
15
16 ID_PROJ_ADVANCED = 4001
17 ID_PROJ_PROJCHOICE = 4002
18 ID_PROJ_ADDTOLIST = 4003
19 ID_PROJ_NEW = 4004
20 ID_PROJ_TRY = 4005
21 ID_PROJ_REVERT = 4006
22 ID_PROJ_OK = 4007
23 ID_PROJ_CLOSE = 4008
24 ID_PROJ_AVAIL = 4009
25 ID_PROJ_SAVE = 4010
26 ID_PROJ_IMPORT = 4011
27 ID_PROJ_EXPORT = 4012
28 ID_PROJ_REMOVE = 4013
29 ID_PROJ_PROJNAME = 4014
30
31 CLIENT_PROJ = 0
32 CLIENT_PROJFILE = 1
33
34 class ProjFrame(NonModalDialog):
35
36 def __init__(self, parent, name, receiver, *args, **kwds):
37 """Initialize the projection dialog.
38
39 receiver -- An object that implements the following methods:
40 SetProjection(projection)
41 GetProjection()
42 """
43
44 self.receiver = receiver
45 self.originalProjection = -1
46 self.curProjPanel = None
47
48 self.projPanels = []
49 self.projPanels.append(
50 ("tmerc", _("Transverse Mercator"), TMPanel))
51 self.projPanels.append(
52 ("utm", _("Universal Transverse Mercator"), UTMPanel))
53 self.projPanels.append(
54 ("lcc", _("Lambert Conic Conformal"), LCCPanel))
55 self.projPanels.append(
56 ("latlong", _("Geographic"), GeoPanel))
57
58 NonModalDialog.__init__(self, parent, name, "")
59 # originally generate by wxGlade
60 self.panel_1 = wxPanel(self, -1)
61 self.panel_edit = wxPanel(self, -1)
62 self.panel_buttons = wxPanel(self, -1)
63 self.label_5 = wxStaticText(self.panel_1, -1, _("Available Projections:"))
64 self.availprojs = wxListBox(self.panel_1, ID_PROJ_AVAIL, style=wxLB_EXTENDED |wxLB_SORT)
65 self.projfilepath = wxStaticText(self.panel_1, -1, "")
66 self.label_2 = wxStaticText(self.panel_edit, -1, _("Name:"))
67 self.projname = wxTextCtrl(self.panel_edit, ID_PROJ_PROJNAME, "")
68 self.label_3 = wxStaticText(self.panel_edit, -1, _("Projection:"))
69 self.projchoice = wxChoice(self.panel_edit, ID_PROJ_PROJCHOICE)
70 self.button_import = wxButton(self.panel_1, ID_PROJ_IMPORT, _("Import..."))
71 self.button_export = wxButton(self.panel_1, ID_PROJ_EXPORT, _("Export..."))
72 self.button_remove = wxButton(self.panel_1, ID_PROJ_REMOVE, _("Remove"))
73 self.button_new = wxButton(self.panel_edit, ID_PROJ_NEW, _("New"))
74 self.button_save = wxButton(self.panel_edit, ID_PROJ_SAVE,_("Save"))
75 self.button_add = wxButton(self.panel_edit, ID_PROJ_ADDTOLIST,
76 _("Add to List"))
77 self.button_try = wxButton(self.panel_buttons, ID_PROJ_TRY, _("Try"))
78 self.button_revert = wxButton(self.panel_buttons, ID_PROJ_REVERT, _("Revert"))
79 self.button_ok = wxButton(self.panel_buttons, ID_PROJ_OK, _("OK"))
80 self.button_close = wxButton(self.panel_buttons, ID_PROJ_CLOSE, _("Close"))
81
82 self.__set_properties()
83 self.__do_layout()
84 # wxGlade
85
86 self.__DoOnProjAvail()
87
88 EVT_BUTTON(self, ID_PROJ_TRY, self._OnTry)
89 EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)
90 EVT_BUTTON(self, ID_PROJ_OK, self._OnOK)
91 EVT_BUTTON(self, ID_PROJ_CLOSE, self._OnClose)
92 EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)
93 EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)
94 EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)
95 EVT_BUTTON(self, ID_PROJ_EXPORT, self._OnExport)
96 EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)
97
98 EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)
99 EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)
100 EVT_BUTTON(self, ID_PROJ_ADDTOLIST, self._OnAddToList)
101
102 EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)
103
104 def GetReceiver(self):
105 return self.receiver
106
107 def _OnTry(self, event):
108 self.__SetProjection()
109
110 def _OnRevert(self, event):
111 if self.originalProjection != -1:
112 self.receiver.SetProjection(self.originalProjection)
113
114 def _OnOK(self, event):
115 self.__SetProjection()
116 self.Close()
117
118 def _OnClose(self, event):
119 self.Close()
120
121 def _OnNew(self, event):
122 self.__DoOnNew()
123
124 def _OnSave(self, event):
125
126 sel = self.availprojs.GetSelections()
127 assert len(sel) == 1, "button shouldn't be enabled"
128
129 proj, projfile = self.availprojs.GetClientData(sel[0])
130
131 assert proj is not None and projfile is not None
132
133 newproj = self.__GetProjection()
134
135 if newproj is not None:
136 projfile.Remove(proj)
137 projfile.Add(newproj)
138 try:
139 WriteProjFile(projfile)
140 except IOError, (errno, errstr):
141 wxMessageDialog(self,
142 _("The following error occured:\n") +
143 projfile.GetFilename() + "\n" + errstr,
144 _("Error"), wxOK | wxICON_ERROR).ShowModal()
145 self.__FillAvailList()
146
147 def _OnAddToList(self, event):
148
149 proj = self.__GetProjection()
150 if proj is not None:
151 self.__usrProjFile.Add(proj)
152 try:
153 WriteProjFile(self.__usrProjFile)
154 except IOError, (errno, errstr):
155 wxMessageDialog(self,
156 _("The following error occured:\n") +
157 self.__usrProjFile.GetFilename() + "\n" + errstr,
158 _("Error"), wxOK | wxICON_ERROR).ShowModal()
159 self.__FillAvailList()
160
161 def _OnProjAvail(self, event):
162 self.__DoOnProjAvail()
163
164 def _OnImport(self, event):
165
166 dlg = wxFileDialog(self, _("Import"), style = wxOPEN)
167
168 if dlg.ShowModal() == wxID_OK:
169 path = dlg.GetPath()
170
171 try:
172 projFile = ReadProjFile(path)
173 for proj in projFile.GetProjections():
174 self.__usrProjFile.Add(proj)
175 WriteProjFile(self.__usrProjFile)
176 except IOError, (errno, errstr):
177 wxMessageDialog(self,
178 _("The following error occured:\n") +
179 dlg.GetPath() + "\n" + errstr,
180 _("Error"), wxOK | wxICON_ERROR).ShowModal()
181
182 self.__FillAvailList()
183
184 dlg.Destroy()
185
186 def _OnExport(self, event):
187
188 sel = self.availprojs.GetSelections()
189 assert len(sel) != 0, "button should be disabled"
190
191 dlg = wxFileDialog(self, _("Export"),
192 style = wxSAVE|wxOVERWRITE_PROMPT)
193
194 if dlg.ShowModal() == wxID_OK:
195 path = dlg.GetPath()
196
197 projFile = ProjFile(path)
198
199 for i in sel:
200 proj = self.availprojs.GetClientData(i)[CLIENT_PROJ]
201 if proj is not None:
202 projFile.Add(proj)
203
204 try:
205 WriteProjFile(projFile)
206 except IOError, (errno, errstr):
207 wxMessageDialog(self,
208 _("The following error occured:\n") +
209 dlg.GetPath() + "\n" + errstr,
210 _("Error"), wxOK | wxICON_ERROR).ShowModal()
211
212 dlg.Destroy()
213
214 def _OnRemove(self, event):
215
216 sel = self.availprojs.GetSelections()
217 assert len(sel) != 0, "button should be disabled!"
218
219 #
220 # remove the items backwards so the indices don't change
221 #
222 sel = list(sel)
223 sel.sort()
224 sel.reverse()
225
226 newselection = -1
227 if len(sel) == 1:
228 newselection = sel[0] - 1
229 if newselection < 0:
230 newselection = 0
231
232 for i in sel:
233 proj, projfile = self.availprojs.GetClientData(i)
234
235 #
236 # this could be the case if they selected <None> or
237 # the currently used projection
238 #
239 if proj is not None and projfile is not None:
240 projfile.Remove(proj)
241
242 try:
243 WriteProjFile(projfile)
244 except IOError, (errno, errstr):
245 wxMessageDialog(self,
246 _("The following error occured:\n") +
247 projfile.GetFilename() + "\n" + errstr,
248 _("Error"), wxOK | wxICON_ERROR).ShowModal()
249
250
251 self.__FillAvailList()
252
253 #
254 # this *could* produce incorrect results if the .proj files
255 # change between the last list update and this selection
256 # because the list has been repopulated.
257 #
258 if newselection != -1 and self.availprojs.GetCount() > 0:
259 self.availprojs.SetSelection(newselection)
260
261 def _OnProjName(self, event):
262 self.__VerifyButtons()
263
264 def __VerifyButtons(self):
265 sel = self.availprojs.GetSelections()
266
267 self.button_import.Enable(True)
268 self.button_export.Enable(True)
269 self.button_save.Enable(True)
270 self.button_remove.Enable(True)
271
272 self.panel_edit.Enable(True)
273
274 if len(sel) == 0:
275 self.button_import.Enable(True)
276 self.button_export.Enable(False)
277 self.button_remove.Enable(False)
278
279 elif len(sel) == 1:
280
281 proj, projFile = self.availprojs.GetClientData(sel[0])
282
283 self.button_save.Enable(len(self.projname.GetValue()) > 0)
284 self.button_add.Enable(len(self.projname.GetValue()) > 0)
285
286 if proj is None:
287 self.button_export.Enable(False)
288 self.button_remove.Enable(False)
289
290 if projFile is None:
291 self.button_save.Enable(False)
292
293 else:
294 self.panel_edit.Enable(False)
295
296 def __DoOnNew(self):
297 sel = self.availprojs.GetSelections()
298 if len(sel) != 0:
299 self.availprojs.SetSelection(sel, False)
300 self.projname.Clear()
301 self.curProjPanel.Clear()
302
303 def __DoOnProjAvail(self):
304
305 sel = self.availprojs.GetSelections()
306 if len(sel) == 1:
307
308 proj = self.availprojs.GetClientData(sel[0])[CLIENT_PROJ]
309 projfile = self.availprojs.GetClientData(sel[0])[CLIENT_PROJFILE]
310
311 if proj is None:
312 # user selected <None>
313 self.projname.Clear()
314 else:
315
316 if projfile is not None:
317 self.projfilepath.SetLabel(projfile.GetFilename())
318 else:
319 # only None if the currently used projection is selected
320 self.projfilepath.SetLabel("")
321
322 self.projname.SetValue(proj.GetName())
323
324 myProjType = proj.GetParameter("proj")
325 i = 0
326 for projType, name, clazz in self.projPanels:
327 if myProjType == projType:
328 self.projchoice.SetSelection(i)
329 self.__DoOnProjChoice()
330 self.curProjPanel.SetProjection(proj)
331 i += 1
332
333 self.__VerifyButtons()
334
335 def _OnProjChoice(self, event):
336 self.__DoOnProjChoice()
337
338 def __DoOnProjChoice(self):
339 choice = self.projchoice
340
341 sel = choice.GetSelection()
342 if sel != -1:
343
344 clazz, obj = choice.GetClientData(sel)
345
346 if obj is None:
347 obj = clazz(self.panel_edit, self.receiver)
348 choice.SetClientData(sel, [clazz, obj])
349
350 if self.curProjPanel is not None:
351 self.curProjPanel.Hide()
352 self.sizer_projctrls.Remove(self.curProjPanel)
353
354 self.curProjPanel = obj
355 self.curProjPanel.Show()
356
357 self.sizer_projctrls.Add(self.curProjPanel, 1,
358 wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
359 self.sizer_projctrls.Layout()
360 self.Layout()
361 self.topBox.SetSizeHints(self)
362
363 def __SetProjection(self):
364
365 #
366 # save the original projection only once in case
367 # we try to apply several different projections
368 #
369 if self.originalProjection == -1:
370 self.originalProjection = self.receiver.GetProjection()
371
372 self.receiver.SetProjection(self.__GetProjection())
373
374 def __GetProjection(self):
375 """Return the packaged projection.
376
377 Could be None.
378 """
379
380 proj = None
381
382 if self.curProjPanel is not None:
383 proj = Projection(self.curProjPanel.GetParameters())
384 proj.SetName(self.projname.GetValue())
385
386 return proj
387
388 def __FillAvailList(self):
389 self.availprojs.Clear()
390
391 #
392 # the list can never be empty. there will always be
393 # at least this one item
394 #
395 self.availprojs.Append("<None>", (None, None))
396
397 self.__sysProjFile = None
398 self.__usrProjFile = None
399
400 projfile = GetSystemProjFiles()
401 if len(projfile) > 0:
402 projfile = projfile[0]
403 for proj in projfile.GetProjections():
404 self.availprojs.Append(proj.GetName(), [proj, projfile])
405 self.__sysProjFile = projfile
406
407 projfile = GetUserProjFiles()
408 if len(projfile) > 0:
409 projfile = projfile[0]
410 for proj in projfile.GetProjections():
411 self.availprojs.Append(proj.GetName(), [proj, projfile])
412 self.__usrProjFile = projfile
413
414 # projfiles = GetSystemProjFiles()
415 # for projfile in projfiles:
416 # for proj in projfile.GetProjections():
417 # self.availprojs.Append(proj.GetName(), [proj, projfile])
418 # self.__sysProjFiles = projfiles
419
420 # projfiles = GetUserProjFiles()
421 # for projfile in projfiles:
422 # for proj in projfile.GetProjections():
423 # self.availprojs.Append(proj.GetName(), [proj, projfile])
424 # self.__usrProjFiles = projfiles
425
426 proj = self.receiver.GetProjection()
427 if proj is not None:
428 self.availprojs.Append(_("%s (current)") % proj.GetName(),
429 [proj, None])
430
431 for proj, name, clazz in self.projPanels:
432 self.projchoice.Append(name, [clazz, None])
433
434 def __set_properties(self):
435 self.__FillAvailList()
436
437 # begin wxGlade: ProjFrame.__set_properties
438 self.SetTitle(_("Projections"))
439 self.availprojs.SetSelection(0)
440 self.projchoice.SetSelection(0)
441 # end wxGlade
442
443 self.projname.SetMaxLength(32)
444
445 def __do_layout(self):
446 # originally generated by wxGlade
447
448 self.topBox = wxBoxSizer(wxVERTICAL)
449 self.sizer_panel = wxBoxSizer(wxVERTICAL)
450 sizer_6 = wxBoxSizer(wxHORIZONTAL)
451 self.sizer_mainctrls = wxBoxSizer(wxHORIZONTAL)
452 self.sizer_edit = wxStaticBoxSizer(wxStaticBox(self.panel_edit, -1, _("Edit")), wxHORIZONTAL)
453 sizer_11 = wxBoxSizer(wxVERTICAL)
454 self.sizer_projctrls = wxBoxSizer(wxVERTICAL)
455 sizer_14 = wxBoxSizer(wxHORIZONTAL)
456 sizer_13 = wxBoxSizer(wxHORIZONTAL)
457 sizer_15 = wxBoxSizer(wxVERTICAL)
458 sizer_15.Add(self.button_import, 0, wxALL, 4)
459 sizer_15.Add(self.button_export, 0, wxALL, 4)
460 sizer_15.Add(20, 20, 0, wxEXPAND, 0)
461 sizer_15.Add(self.button_remove, 0, wxALL|wxALIGN_BOTTOM, 4)
462
463 # list controls
464 grid_sizer_1 = wxFlexGridSizer(3, 2, 0, 0)
465 grid_sizer_1.Add(self.label_5, 0, wxLEFT|wxRIGHT|wxTOP, 4)
466 grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)
467 grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
468 grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)
469 grid_sizer_1.Add(self.projfilepath, 0, wxALL|wxADJUST_MINSIZE, 4)
470 grid_sizer_1.AddGrowableRow(1)
471 grid_sizer_1.AddGrowableCol(0)
472
473 # edit controls
474 sizer_13.Add(self.label_2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
475 sizer_13.Add(self.projname, 1, wxALL, 4)
476 self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)
477 sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
478 sizer_14.Add(self.projchoice, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
479 self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)
480 self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)
481 sizer_11.Add(self.button_new, 0, wxALL|wxEXPAND, 4)
482 sizer_11.Add(self.button_save, 0, wxALL|wxEXPAND, 4)
483 sizer_11.Add(self.button_add, 0, wxALL|wxEXPAND, 4)
484 self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)
485
486 sizer_6.Add(20, 20, 1, wxEXPAND, 0)
487 sizer_6.Add(self.button_try, 0, wxALL, 4)
488 sizer_6.Add(20, 20, 1, 0, 0)
489 sizer_6.Add(self.button_revert, 0, wxALL, 4)
490 sizer_6.Add(20, 20, 1, 0, 0)
491 sizer_6.Add(self.button_ok, 0, wxALL, 4)
492 sizer_6.Add(20, 20, 1, 0, 0)
493 sizer_6.Add(self.button_close, 0, wxALL, 4)
494 sizer_6.Add(20, 20, 1, wxEXPAND, 0)
495
496 self.panel_1.SetAutoLayout(1)
497 self.panel_1.SetSizer(grid_sizer_1)
498 grid_sizer_1.Fit(self.panel_1)
499 grid_sizer_1.SetSizeHints(self.panel_1)
500
501 self.panel_edit.SetAutoLayout(1)
502 self.panel_edit.SetSizer(self.sizer_edit)
503 self.sizer_edit.Fit(self.panel_edit)
504 self.sizer_edit.SetSizeHints(self.panel_edit)
505
506 self.panel_buttons.SetAutoLayout(1)
507 self.panel_buttons.SetSizer(sizer_6)
508 sizer_6.Fit(self.panel_buttons)
509 sizer_6.SetSizeHints(self.panel_buttons)
510
511 self.sizer_mainctrls.Add(self.panel_1, 0,
512 wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)
513 self.sizer_mainctrls.Add(self.panel_edit, 1,
514 wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)
515
516 self.topBox.Add(self.sizer_mainctrls, 1, wxALL|wxEXPAND, 4)
517 self.topBox.Add(self.panel_buttons, 0, wxEXPAND, 0)
518
519 self.SetAutoLayout(1)
520 self.SetSizer(self.topBox)
521 self.topBox.Fit(self)
522 self.topBox.SetSizeHints(self)
523 self.Layout()
524
525 # end of class ProjFrame
526
527
528 class ProjPanel(wxPanel):
529 """Base class for all projection panels."""
530
531 def __init__(self, parent):
532 wxPanel.__init__(self, parent, -1)
533
534 self.__ellps = wxChoice(self, -1)
535 self.ellpsData = [("bessel", _("Bessel 1841")),
536 ("clrk66", _("Clarke 1866")),
537 ("clrk80", _("Clarke 1880")),
538 ("GRS80" , _("GRS 1980 (IUGG, 1980)")),
539 ("intl" , _("International 1909 (Hayford)")),
540 ("WGS84" , _("WGS 84"))]
541
542 for tag, name in self.ellpsData:
543 self.__ellps.Append(name, tag)
544
545 self.__ellps.SetSelection(0)
546
547 def _DoLayout(self, childPanel = None):
548
549 panelSizer = wxBoxSizer(wxVERTICAL)
550
551 if childPanel is not None:
552 panelSizer.Add(childPanel, 0, wxALL|wxEXPAND, 4)
553
554 sizer = wxBoxSizer(wxHORIZONTAL)
555 sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0, wxALL, 4)
556 sizer.Add(self.__ellps, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
557 panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)
558
559 self.SetAutoLayout(1)
560 self.SetSizer(panelSizer)
561 panelSizer.Fit(self)
562 panelSizer.SetSizeHints(self)
563 self.Layout()
564
565 def SetProjection(self, proj):
566 if proj is not None:
567 param = proj.GetParameter("ellps")
568 i = 0
569 for tag, name in self.ellpsData:
570 if param == tag:
571 self.__ellps.SetSelection(i)
572 return # returning early!
573 i += 1
574
575 #
576 # if proj is none, or the parameter couldn't be found...
577 #
578 self.__ellps.SetSelection(0)
579
580 def GetParameters(self):
581 return ["ellps=" + self.__ellps.GetClientData(
582 self.__ellps.GetSelection())]
583
584
585 ID_TMPANEL_LAT = 4001
586 ID_TMPANEL_LONG = 4002
587 ID_TMPANEL_FASLE_EAST = 4003
588 ID_TMPANEL_FALSE_NORTH = 4004
589 ID_TMPANEL_SCALE = 4005
590
591 class UnknownProjPanel(ProjPanel):
592 def __init__(self, parent, receiver):
593 ProjPanel.__init__(self, parent)
594
595 self._DoLayout()
596
597 def _DoLayout(self):
598 sizer = wxBoxSizer(wxVERTICAL)
599
600 sizer.Add(wxStaticText(self, -1,
601 _("Thuban does not know the parameters for the " +
602 "current projection and cannot display a " +
603 "configuration panel.")))
604
605 ProjPanel._DoLayout(self, sizer)
606
607 def GetProjName(self):
608 return "Unknown"
609
610 def SetProjection(self, proj):
611 pass
612
613 def GetParameters(self):
614 return None
615
616 class TMPanel(ProjPanel):
617 """Projection panel for Transverse Mercator."""
618
619 def __init__(self, parent, receiver):
620 ProjPanel.__init__(self, parent)
621
622 self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)
623 self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)
624 self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)
625 self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)
626 self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)
627
628 self._DoLayout()
629
630 def _DoLayout(self):
631
632 sizer = wxFlexGridSizer(4, 4, 0, 0)
633 sizer.Add(wxStaticText(self, -1, _("Latitude:")), 0, wxALL, 4)
634 sizer.Add(self.__latitude, 0, wxALL, 4)
635 sizer.Add(wxStaticText(self, -1, _("False Easting:")), 0, wxALL, 4)
636 sizer.Add(self.__falseEast, 0, wxALL, 4)
637 sizer.Add(wxStaticText(self, -1, _("Longitude:")), 0, wxALL, 4)
638 sizer.Add(self.__longitude, 0, wxALL, 4)
639 sizer.Add(wxStaticText(self, -1, _("False Northing:")), 0, wxALL, 4)
640 sizer.Add(self.__falseNorth, 0, wxALL, 4)
641 sizer.Add(wxStaticText(self, -1, _("Scale Factor:")), 0, wxALL, 4)
642 sizer.Add(self.__scale, 0, wxALL, 4)
643
644 ProjPanel._DoLayout(self, sizer)
645
646 def GetProjName(self):
647 return _("Transverse Mercator")
648
649 def SetProjection(self, proj):
650 ProjPanel.SetProjection(self, proj)
651
652 self.__latitude.SetValue(proj.GetParameter("lat_0"))
653 self.__longitude.SetValue(proj.GetParameter("lon_0"))
654 self.__falseEast.SetValue(proj.GetParameter("x_0"))
655 self.__falseNorth.SetValue(proj.GetParameter("y_0"))
656 self.__scale.SetValue(proj.GetParameter("k"))
657
658 ProjPanel.SetProjection(self, proj)
659
660 def GetParameters(self):
661 params = ["proj=tmerc",
662 "lat_0=" + self.__latitude.GetValue(),
663 "lon_0=" + self.__longitude.GetValue(),
664 "x_0=" + self.__falseEast.GetValue(),
665 "y_0=" + self.__falseNorth.GetValue(),
666 "k=" + self.__scale.GetValue()]
667 params.extend(ProjPanel.GetParameters(self))
668 return params
669
670 def Clear(self):
671 self.__latitude.Clear()
672 self.__longitude.Clear()
673 self.__falseEast.Clear()
674 self.__falseNorth.Clear()
675 self.__scale.Clear()
676
677 ProjPanel.Clear(self)
678
679 ID_UTMPANEL_ZONE = 4001
680 ID_UTMPANEL_SOUTH = 4002
681 ID_UTMPANEL_PROP = 4003
682
683 class UTMPanel(ProjPanel):
684 """Projection Panel for Universal Transverse Mercator."""
685
686 def __init__(self, parent, receiver):
687 ProjPanel.__init__(self, parent)
688
689 self.receiver = receiver
690
691 self.__zone = wxSpinCtrl(self, ID_UTMPANEL_ZONE, "1", min=1, max=60)
692 self.__south = wxCheckBox(self, ID_UTMPANEL_SOUTH,
693 _("Southern Hemisphere"))
694 self.__propButton = wxButton(self, ID_UTMPANEL_PROP, _("Propose"))
695
696 self._DoLayout()
697
698 EVT_BUTTON(self, ID_UTMPANEL_PROP, self._OnPropose)
699
700 def _DoLayout(self):
701
702 sizer = wxBoxSizer(wxVERTICAL)
703 psizer = wxBoxSizer(wxHORIZONTAL)
704 psizer.Add(wxStaticText(self, -1, _("Zone:")), 0, wxALL, 4)
705 psizer.Add(self.__zone, 0, wxALL, 4)
706 psizer.Add(self.__propButton, 0, wxALL, 4)
707 sizer.Add(psizer, 0, wxALL, 4)
708 sizer.Add(self.__south, 0, wxALL, 4)
709
710 ProjPanel._DoLayout(self, sizer)
711
712 def GetProjName(self):
713 return _("Universal Transverse Mercator")
714
715 def SetProjection(self, proj):
716 self.__zone.SetValue(int(proj.GetParameter("zone")))
717 self.__south.SetValue(proj.GetParameter("south") != "")
718 ProjPanel.SetProjection(self, proj)
719
720 def GetParameters(self):
721 params = ["proj=utm", "zone=" + str(self.__zone.GetValue())]
722 if self.__south.IsChecked():
723 params.append("south")
724
725 params.extend(ProjPanel.GetParameters(self))
726 return params
727
728 def Clear(self):
729 self.__zone.SetValue(1)
730 self.__south.SetValue(False)
731 ProjPanel.Clear(self)
732
733 def _OnPropose(self, event):
734 UTMProposeZoneDialog
735 dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())
736 if dlg.ShowModal() == wxID_OK:
737 self.__zone.SetValue(dlg.GetProposedZone())
738
739 class LCCPanel(ProjPanel):
740 """Projection Panel for Lambert Conic Conformal."""
741
742 def __init__(self, parent, receiver):
743 ProjPanel.__init__(self, parent)
744
745 self.__fspLatitude = wxTextCtrl(self, -1)
746 self.__sspLatitude = wxTextCtrl(self, -1)
747 self.__originLat = wxTextCtrl(self, -1)
748 self.__meridian = wxTextCtrl(self, -1)
749 self.__falseEast = wxTextCtrl(self, -1)
750 self.__falseNorth = wxTextCtrl(self, -1)
751
752 self._DoLayout()
753
754 def _DoLayout(self):
755
756 sizer = wxFlexGridSizer(6, 2, 0, 0)
757 sizer.Add(wxStaticText(self, -1,
758 _("Latitude of first standard parallel:")))
759 sizer.Add(self.__fspLatitude, 0, wxALL, 4)
760 sizer.Add(wxStaticText(self, -1,
761 _("Latitude of second standard parallel:")))
762 sizer.Add(self.__sspLatitude, 0, wxALL, 4)
763 sizer.Add(wxStaticText(self, -1, _("Latitude of origin:")))
764 sizer.Add(self.__originLat, 0, wxALL, 4)
765 sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))
766 sizer.Add(self.__meridian, 0, wxALL, 4)
767 sizer.Add(wxStaticText(self, -1, _("False Easting:")))
768 sizer.Add(self.__falseEast, 0, wxALL, 4)
769 sizer.Add(wxStaticText(self, -1, _("False Northing:")))
770 sizer.Add(self.__falseNorth, 0, wxALL, 4)
771
772 ProjPanel._DoLayout(self, sizer)
773
774 def GetProjName(self):
775 return _("Lambert Conic Conformal")
776
777 def SetProjection(self, proj):
778 self.__fspLatitude.SetValue(proj.GetParameter("lat_1"))
779 self.__sspLatitude.SetValue(proj.GetParameter("lat_2"))
780 self.__originLat.SetValue(proj.GetParameter("lat_0"))
781 self.__meridian.SetValue(proj.GetParameter("lon_0"))
782 self.__falseEast.SetValue(proj.GetParameter("x_0"))
783 self.__falseNorth.SetValue(proj.GetParameter("y_0"))
784
785 ProjPanel.SetProjection(self, proj)
786
787 def GetParameters(self):
788 params = ["proj=lcc",
789 "lat_1=" + self.__fspLatitude.GetValue(),
790 "lat_2=" + self.__sspLatitude.GetValue(),
791 "lat_0=" + self.__originLat.GetValue(),
792 "lon_0=" + self.__meridian.GetValue(),
793 "x_0=" + self.__falseEast.GetValue(),
794 "y_0=" + self.__falseNorth.GetValue()]
795
796 params.extend(ProjPanel.GetParameters(self))
797 return params
798
799 def Clear(self):
800 self.__fspLatitude.Clear()
801 self.__sspLatitude.Clear()
802 self.__originLat.Clear()
803 self.__meridian.Clear()
804 self.__falseEast.Clear()
805 self.__falseNorth.Clear()
806
807 ProjPanel.Clear(self)
808
809 class GeoPanel(ProjPanel):
810 """Projection Panel for a Geographic Projection."""
811
812 def __init__(self, parent, receiver):
813 ProjPanel.__init__(self, parent)
814 ProjPanel._DoLayout(self, None)
815
816 def GetProjName(self):
817 return _("Geographic")
818
819 def SetProjection(self, proj):
820 ProjPanel.SetProjection(self, proj)
821
822 def GetParameters(self):
823 params = ["proj=latlong"]
824 params.extend(ProjPanel.GetParameters(self))
825 return params
826
827 def Clear(self):
828 ProjPanel.Clear(self)
829
830
831 ID_UTM_PROPOSE_ZONE_DIALOG_TAKE = 4001
832 ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002
833 class UTMProposeZoneDialog(wxDialog):
834
835 """Propose a sensible Zone considering the current map extent."""
836
837 def __init__(self, parent, (x, y, x2, y2)):
838 wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),
839 wxDefaultPosition, wxSize(200, 100))
840 self.parent = parent
841 #x, y, x2, y2 = elf.parent.parent.map_bounding_box
842 x = x + 180
843 x2 = x2 + 180
844 center = (x2 - x) / 2 + x
845 self.proposedZone = int(center / 6 + 1)
846 self.dialogLayout()
847
848 def dialogLayout(self):
849 topBox = wxBoxSizer(wxVERTICAL)
850
851 textBox = wxBoxSizer(wxVERTICAL)
852 textBox.Add(wxStaticText(self, -1, _("The current map extent center " +
853 "lies in UTM Zone")),
854 0, wxALIGN_CENTER|wxALL, 4)
855 textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),
856 0, wxALIGN_CENTER|wxALL, 4)
857
858 topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)
859
860 buttonBox = wxBoxSizer(wxHORIZONTAL)
861 buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,
862 _("Take")), 0, wxALL, 4)
863 buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL,
864 _("Cancel")), 0, wxALL, 4)
865 topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)
866 EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)
867 EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)
868
869 self.SetAutoLayout(True)
870 self.SetSizer(topBox)
871 topBox.Fit(self)
872 topBox.SetSizeHints(self)
873
874 def OnTake(self, event):
875 self.EndModal(wxID_OK)
876
877 def OnCancel(self, event):
878 self.EndModal(wxID_CANCEL)
879
880 def GetProposedZone(self):
881 return self.proposedZone

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26