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

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

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

revision 696 by jonathan, Wed Apr 16 16:39:49 2003 UTC revision 1755 by bh, Fri Sep 26 14:03:44 2003 UTC
# Line 5  Line 5 
5  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
6  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
7    
8    """Handle resources loaded from files such as projections"""
9    
10    __version__ = "$Revision$"
11    # $Source$
12    # $Id$
13    
14    
15  import os  import os
16    import os.path
17    
18  import Thuban  import Thuban
19  from Thuban.Model.load import XMLProcessor, load_xmlfile  from Thuban import _
20  from Thuban.Model.save import XMLSaver  
21    from Thuban.Lib.fileutil import get_application_dir
22    
23    from Thuban.Model.xmlreader import XMLReader
24    from Thuban.Model.xmlwriter import XMLWriter
25  from Thuban.Model.proj import Projection, ProjFile  from Thuban.Model.proj import Projection, ProjFile
26    from xml.sax import SAXParseException
27    
28  projdir = \  projdir = \
29          os.path.join(Thuban.__path__[0], os.pardir, "Resources", "Projections")          os.path.join(Thuban.__path__[0], os.pardir, "Resources", "Projections")
30    
 usrdir  = os.path.expanduser("~/.thuban")  
31    
32  PROJ_EXT = ".proj"  PROJ_EXT = ".proj"
33    
34  def ReadProjFile(filename):  has_gdal_support = lambda: False
35      """Read a single .proj file and return a ProjFile object."""  try:
36        # first try to see if our extension module is there. if it
37        # wasn't even compiled, we obviously don't have gdal support.
38        import gdalwarp
39    
40        # now try to import the python extension. if this doesn't
41        # exist then we can't do anything.
42        import gdal
43    
44        """Return True if the gdal library is available."""
45        has_gdal_support = lambda: True
46    except ImportError:
47        pass
48    
49    def read_proj_file(filename):
50        """Read a single .proj file and return a ProjFile object.
51        
52        Raises IOError if the file cannot be opened.
53        Raises OSError if the file cannot be read.
54        Raises SAXParseException if the file is not valid XML.
55        """
56    
57      projs = []      handler = ProjFileReader()
58      try:      handler.read(filename)
59          handler = ProjFileReader(filename)      return handler.GetProjFile()
60    
61          load_xmlfile(filename, handler)  def write_proj_file(pf):
62          pf = handler.GetProjFile()      """Write a single .proj file
     except OSError:  
         pass  
63    
64      return pf      Raises IOError if the file cannot be written.
65        """
66    
 def WriteProjFile(pf):  
67      saver = ProjFileSaver(pf)      saver = ProjFileSaver(pf)
68      saver.write(pf.GetFileName())      saver.write(pf.GetFilename())
69    
70  def GetProjections(dir):  def get_proj_files(dir):
71      """Read all .proj files in the given directory and      """Read all .proj files in the given directory and
72      return a list of ProjFile objects.      return a list of ProjFile objects.
73      """      """
74    
75      list = []      list = []
76      try:      try:
77          for file in filter(lambda s: s.endswith(PROJ_EXT), os.listdir(dir)):          dirlist = os.listdir(dir)
             filename = os.path.join(dir, file)  
             list.extend(ReadProjFile(filename))  
78      except OSError:      except OSError:
79          pass          pass # if we can't get a directory listing just return []
80        else:
81            for file in filter(lambda s: s.endswith(PROJ_EXT), dirlist):
82                try:
83                    filename = os.path.join(dir, file)
84                    list.append(read_proj_file(filename))
85                except (OSError, IOError, SAXParseException):
86                    pass # just move onto the next file
87    
88      return list      return list
89    
90  def GetSuppliedProjections():  def get_system_proj_files():
91      """Return a list of ProjFile objects from files that are      """Return a list of ProjFile objects from files that are
92      supplied by Thuban.      supplied by Thuban.
93    
94        If no files could not be opened return a list with one
95        empty projection file set to store data in the default file.
96      """      """
97      return GetProjections(projdir)      filename = os.path.join(projdir, "defaults.proj")
98        try:
99            return [read_proj_file(filename)]
100        except (OSError, IOError, SAXParseException):
101            return [ProjFile(filename)]
102    
103    def get_user_proj_files():
104        """Return a list of ProjFile objects from files that are user-defined.
105    
106  def GetUserProjections():      If no files could not be opened return a list with one
107      """Return a list of ProjFile objects from files that are user-defined."""      empty projection file set to store data in the default file.
108      return GetProjections(usrdir)      """
109    
110  class ProjFileReader(XMLProcessor):      usrdir  = get_application_dir()
111        filename = os.path.join(usrdir, "user.proj")
112        try:
113            return [read_proj_file(filename)]
114        except (OSError, IOError, SAXParseException):
115            return [ProjFile(filename)]
116    
117    class ProjFileReader(XMLReader):
118    
119        def __init__(self):
120            XMLReader.__init__(self)
121            self.__pf = ProjFile("")
122    
123            XMLReader.AddDispatchers(self,
124                {'projection': ("start_projection", "end_projection"),
125                 'parameter':  ("start_parameter", None)})
126                
127        def read(self, file_or_filename):
128            XMLReader.read(self, file_or_filename)
129    
130      def __init__(self, filename):          self.__pf.SetFilename(XMLReader.GetFilename(self))
         XMLProcessor.__init__(self, os.path.dirname(filename))  
           
         self.pf = ProjFile(filename)  
131                    
132      def start_projection(self, name, qname, attrs):      def start_projection(self, name, qname, attrs):
133          self.params = []          self.params = []
134          self.name = attrs.get((None, 'name'), "Unknown")          self.name = self.encode(attrs.get((None, 'name'), _("Unknown")))
     XMLProcessor.start_dispatcher['projection'] = "start_projection"  
135    
136      def end_projection(self, name, qname):      def end_projection(self, name, qname):
137          self.pf.Add(Projection(self.params, self.name))          self.__pf.Add(Projection(self.params, self.name))
     XMLProcessor.end_dispatcher['projection'] = "end_projection"  
138    
139      def start_parameter(self, name, qname, attrs):      def start_parameter(self, name, qname, attrs):
140          s = attrs.get((None, 'value'))          s = attrs.get((None, 'value'))
141          s = str(s) # we can't handle unicode in proj          s = str(s) # we can't handle unicode in proj
142          self.params.append(s)          self.params.append(s)
     XMLProcessor.start_dispatcher['parameter'] = "start_parameter"  
143    
144      def GetProjFile(self):      def GetProjFile(self):
145          return self.pf          return self.__pf
   
146    
147  class ProjFileSaver(XMLSaver):  class ProjFileSaver(XMLWriter):
148    
149      def __init__(self, pf):      def __init__(self, pf):
150          XMLSaver.__init__(self)          XMLWriter.__init__(self)
151          self.pf = pf          self.__pf = pf
152    
153      def write(self, file_or_filename):      def write(self, file_or_filename):
154          XMLSaver.write(self, file_or_filename)          XMLWriter.write(self, file_or_filename)
155    
156          self.write_header("projfile", "thuban.dtd")          self.write_header("projectionlist", "projfile.dtd")
157          self.write_projfile(self.pf)          self.write_projfile(self.__pf)
158          self.close()          self.close()
159    
160      def write_projfile(self, pf):      def write_projfile(self, pf):
# Line 107  class ProjFileSaver(XMLSaver): Line 164  class ProjFileSaver(XMLSaver):
164          for p in pf.GetProjections():          for p in pf.GetProjections():
165              self.open_element("projection", {"name": p.GetName()})              self.open_element("projection", {"name": p.GetName()})
166    
167              for param in p.GetParameters():              for param in p.GetAllParameters():
168                  self.write_element("parameter", {"value": param})                  self.write_element("parameter", {"value": param})
169    
170              self.close_element("projection")              self.close_element("projection")

Legend:
Removed from v.696  
changed lines
  Added in v.1755

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26