/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/Model/resource.py
ViewVC logotype

Annotation of /branches/WIP-pyshapelib-bramz/Thuban/Model/resource.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1933 - (hide annotations)
Tue Nov 11 16:37:53 2003 UTC (21 years, 3 months ago) by bh
Original Path: trunk/thuban/Thuban/Model/resource.py
File MIME type: text/x-python
File size: 6945 byte(s)
* Thuban/Model/resource.py (get_system_proj_file): Add a filename
parameter so that this function can be used for all proj files in
Resource/Projections
(DEFAULT_PROJ_FILE, EPSG_PROJ_FILE): New. Predefined filenames for
get_system_proj_file

* Thuban/UI/projdialog.py (ProjFrame.__init__): Instead of one
ProjFile self.__sysProjFile use a dictionary of system ProjFile
objects self._sys_proj_files
(ProjFrame.build_dialog): Adapt to the new changes in the
ProjectionList constructor. Add a check button to toggle whether
EPSG projections are shown
(ProjFrame._OnShowEPSG): New. Handler for the epsg check button
events.
(ProjFrame.load_user_proj, ProjFrame.load_system_proj): Only show
the busy cursor if the files have not yet been loaded by the
dialog.
(ProjFrame.load_system_proj): Add a parameter for the name of the
proj file. Maintain the dictionary of system projections
self._sys_proj_files

* Thuban/UI/projlist.py (ProjectionList): Merge the system_projs,
user_projs parameters into one parameter proj_files which is a
list of proj files.
(ProjectionList._subscribe_proj_files)
(ProjectionList._unsubscribe_proj_files): New. Move
subscription/unsubscription of projfile messages to separate
methods
(ProjectionList.Destroy): The unsubscribe is now done in
_unsubscribe_proj_files
(ProjectionList.update_projections): We now have a list of proj
file objects
(ProjectionList.SetProjFiles): New method to set a new list of
proj file objects

* test/test_proj.py (ProjFileReadTests.test_get_system_proj_file):
Specify explicitly which system proj file to load.

1 jonathan 696 # Copyright (c) 2003 by Intevation GmbH
2     # Authors:
3     # Jonathan Coles <[email protected]>
4     #
5     # This program is free software under the GPL (>=v2)
6     # Read the file COPYING coming with Thuban for details.
7    
8 bh 1542 """Handle resources loaded from files such as projections"""
9    
10     __version__ = "$Revision$"
11     # $Source$
12     # $Id$
13    
14    
15 jonathan 696 import os
16 frank 1132 import os.path
17 bh 1830 import weakref
18 frank 1132
19 jonathan 696 import Thuban
20 jonathan 875 from Thuban import _
21    
22 frank 1149 from Thuban.Lib.fileutil import get_application_dir
23    
24 jonathan 1161 from Thuban.Model.xmlreader import XMLReader
25     from Thuban.Model.xmlwriter import XMLWriter
26 jonathan 696 from Thuban.Model.proj import Projection, ProjFile
27 jonathan 727 from xml.sax import SAXParseException
28 jonathan 696
29     projdir = \
30     os.path.join(Thuban.__path__[0], os.pardir, "Resources", "Projections")
31    
32    
33     PROJ_EXT = ".proj"
34    
35 jonathan 1161 has_gdal_support = lambda: False
36     try:
37 jonathan 1230 # first try to see if our extension module is there. if it
38     # wasn't even compiled, we obviously don't have gdal support.
39     import gdalwarp
40    
41     # now try to import the python extension. if this doesn't
42     # exist then we can't do anything.
43 jonathan 1161 import gdal
44 jonathan 1230
45 jonathan 1161 """Return True if the gdal library is available."""
46     has_gdal_support = lambda: True
47     except ImportError:
48     pass
49    
50 bh 1830 projfile_cache = weakref.WeakValueDictionary()
51    
52     def clear_proj_file_cache():
53     """Clear the cache of ProjFile objects maintained by read_proj_file.
54    
55     This function is probably only useful for the test suite.
56     """
57     projfile_cache.clear()
58    
59 jonathan 1161 def read_proj_file(filename):
60 bh 1786 """Read a .proj file and return a ProjFile object and warnings
61    
62     The return value is a tuple with the ProjFile object and a list of
63     strings with warnings messages that might have been generated by the
64 bh 1830 proj file parser.
65 bh 1786
66 bh 1830 The objects returned cached so that reading the same file
67     (identified by its absolute name) several times yields the same
68     ProjFile object. The cache uses weak references so the objects will
69     be removed from the cache once the last reference an object in the
70     cache is removed.
71    
72 bh 1786 Raises IOError if the file cannot be opened, OSError if the file
73     cannot be read and SAXParseException if the file is not valid XML.
74 jonathan 718 """
75 bh 1830 filename = os.path.abspath(filename)
76     if filename in projfile_cache:
77     return projfile_cache[filename], []
78     else:
79     handler = ProjFileReader()
80     handler.read(filename)
81     proj_file = handler.GetProjFile()
82     projfile_cache[filename] = proj_file
83     return proj_file, handler.GetWarnings()
84 jonathan 696
85 jonathan 1161 def write_proj_file(pf):
86 jonathan 727 """Write a single .proj file
87    
88     Raises IOError if the file cannot be written.
89     """
90    
91 jonathan 696 saver = ProjFileSaver(pf)
92 jonathan 739 saver.write(pf.GetFilename())
93 jonathan 696
94    
95 bh 1933 # Constants for the get_system_proj_file function
96     DEFAULT_PROJ_FILE = "defaults.proj"
97     EPSG_PROJ_FILE = "epsg.proj"
98 jonathan 696
99 bh 1933 def get_system_proj_file(filename):
100     """Return the projections from the indicated file and a list with warnings
101 jonathan 696
102 bh 1933 The filename argument should be the name of a file in the directory
103     with Thuban's default projection files (Resources/Projections/). If
104     possible callers should not use hardwired string literal for the
105     name to avoid unnecessary duplication. Instead they should use one
106     of the predefined constants, currently DEFAULT_PROJ_FILE or
107     EPSG_PROJ_FILE.
108    
109     The return value is a tuple with the projections in a ProjFile
110     object and a list of strings with warning messages. The warnings
111     list is usually empty but may contain messages about ignored errors.
112    
113 bh 1786 If the file could could not be opened return an empty projection
114 bh 1933 file object set to store data in the indicated default file.
115 jonathan 696 """
116 bh 1933 fullname = os.path.join(projdir, filename)
117 jonathan 727 try:
118 bh 1933 return read_proj_file(fullname)
119 bh 1786 except (OSError, IOError, SAXParseException), val:
120 bh 1933 msg = _('Could not read "%s": %s') % (fullname, str(val))
121     return ProjFile(fullname), [msg]
122 jonathan 696
123 bh 1786 def get_user_proj_file():
124     """Return the user's projections and a list with warnings
125 jonathan 696
126 bh 1786 The projections read from the user's thuban projection file (usually
127     in ~/.thuban/user.proj). The return value is a tuple with the
128     projections in a ProjFile object and a list of strings with warning
129     messages. The warnings list is usually empty but may contain
130     messages about ignored errors.
131    
132     If the file could could not be opened return an empty projection
133     file object set to store data in the default file.
134 jonathan 727 """
135 jonathan 1189 usrdir = get_application_dir()
136 jonathan 727 filename = os.path.join(usrdir, "user.proj")
137     try:
138 bh 1786 return read_proj_file(filename)
139 jan 1791 except (OSError, IOError, SAXParseException), val:
140 bh 1786 msg = _('Could not read "%s": %s') % (filename, str(val))
141     return ProjFile(filename), [msg]
142 jonathan 727
143 bh 1786
144 jonathan 709 class ProjFileReader(XMLReader):
145 jonathan 696
146 jonathan 709 def __init__(self):
147     XMLReader.__init__(self)
148 bh 1786 self.projfile = ProjFile("")
149     self.warnings = []
150 jonathan 709
151     XMLReader.AddDispatchers(self,
152     {'projection': ("start_projection", "end_projection"),
153     'parameter': ("start_parameter", None)})
154 bh 1786
155 jonathan 709 def read(self, file_or_filename):
156     XMLReader.read(self, file_or_filename)
157    
158 bh 1786 self.projfile.SetFilename(XMLReader.GetFilename(self))
159    
160 jonathan 696 def start_projection(self, name, qname, attrs):
161     self.params = []
162 bh 1786 name = self.encode(attrs.get((None, 'name')))
163     if name is None:
164     name = _("Unknown")
165     self.name = name
166 bh 1816 self.epsg = self.encode(attrs.get((None, 'epsg')))
167 jonathan 696
168     def end_projection(self, name, qname):
169 bh 1786 try:
170 bh 1816 proj = Projection(self.params, self.name, epsg = self.epsg)
171 bh 1786 except IOError, val:
172     self.warnings.append(_('Error in projection "%s": %s')
173     % (self.name, str(val)))
174     else:
175     self.projfile.Add(proj)
176 jonathan 696
177     def start_parameter(self, name, qname, attrs):
178     s = attrs.get((None, 'value'))
179     s = str(s) # we can't handle unicode in proj
180     self.params.append(s)
181    
182     def GetProjFile(self):
183 bh 1786 return self.projfile
184 jonathan 696
185 bh 1786 def GetWarnings(self):
186     """Return the list of warning messages that may have been produced"""
187     return self.warnings
188    
189    
190 jonathan 709 class ProjFileSaver(XMLWriter):
191 jonathan 696
192     def __init__(self, pf):
193 jonathan 709 XMLWriter.__init__(self)
194     self.__pf = pf
195 jonathan 696
196     def write(self, file_or_filename):
197 jonathan 709 XMLWriter.write(self, file_or_filename)
198 jonathan 696
199 bh 1755 self.write_header("projectionlist", "projfile.dtd")
200 jonathan 709 self.write_projfile(self.__pf)
201 jonathan 696 self.close()
202    
203     def write_projfile(self, pf):
204    
205     self.open_element("projectionlist")
206    
207     for p in pf.GetProjections():
208 bh 1816 attrs = {"name": p.GetName()}
209     if p.EPSGCode():
210     attrs["epsg"] = p.EPSGCode()
211     self.open_element("projection", attrs)
212 jonathan 696
213 jonathan 709 for param in p.GetAllParameters():
214 jonathan 696 self.write_element("parameter", {"value": param})
215    
216     self.close_element("projection")
217    
218     self.close_element("projectionlist")
219    
220    

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26