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

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

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

revision 268 by bh, Thu Aug 22 10:25:43 2002 UTC revision 366 by jonathan, Mon Jan 27 11:48:17 2003 UTC
# Line 17  import string Line 17  import string
17    
18  import Thuban.Lib.fileutil  import Thuban.Lib.fileutil
19    
20    from Thuban.Model.color import Color
21    
22    #
23    # one level of indention
24    #
25    TAB = "    "
26    
27  def relative_filename(dir, filename):  def relative_filename(dir, filename):
28      """Return a filename relative to dir for the absolute file name absname.      """Return a filename relative to dir for the absolute file name absname.
29    
# Line 51  class Saver: Line 58  class Saver:
58      pass the namespaces to the default implementation.      pass the namespaces to the default implementation.
59      """      """
60    
61    
62      def __init__(self, session):      def __init__(self, session):
63          self.session = session          self.session = session
64    
# Line 68  class Saver: Line 76  class Saver:
76          presence of a write method) all filenames will be absolut          presence of a write method) all filenames will be absolut
77          filenames.          filenames.
78          """          """
79    
80            self.indent_level = 0
81    
82          if hasattr(file_or_filename, "write"):          if hasattr(file_or_filename, "write"):
83              # it's a file object              # it's a file object
84              self.file = file_or_filename              self.file = file_or_filename
# Line 79  class Saver: Line 90  class Saver:
90          self.write_header()          self.write_header()
91          self.write_session(self.session)          self.write_session(self.session)
92    
93      def write_element(self, element, attrs, empty = 0, indentation = ""):          if self.indent_level != 0:
94          # Helper function to write an element open tag with attributes              raise ValueError("indent_level still positive!")
95          self.file.write("%s<%s" % (indentation, element))  
96        def write_attribs(self, attrs):
97          for name, value in attrs.items():          for name, value in attrs.items():
98                if isinstance(value, Color):
99                    value = value.hex()
100                else:
101                    value = str(value)
102              self.file.write(' %s="%s"' % (escape(name), escape(value)))              self.file.write(' %s="%s"' % (escape(name), escape(value)))
103          if empty:      
104              self.file.write("/>\n")      def open_element(self, element, attrs = {}):
105          else:          # Helper function to write an element open tag with attributes
106              self.file.write(">\n")          self.file.write("%s<%s" % (TAB*self.indent_level, element))
107            self.write_attribs(attrs)
108            self.file.write(">\n")
109    
110            self.indent_level += 1
111    
112        def close_element(self, element):
113            self.indent_level -= 1
114            if self.indent_level < 0:
115                raise ValueError("close_element called too many times!")
116            self.file.write("%s</%s>\n" % (TAB*self.indent_level, element))
117    
118        def write_element(self, element, attrs = {}):
119            # Helper function to write an element open tag with attributes
120            self.file.write("%s<%s" % (TAB*self.indent_level, element))
121            self.write_attribs(attrs)
122            self.file.write("/>\n")
123    
124      def write_header(self):      def write_header(self):
125          """Write the XML header"""          """Write the XML header"""
126          write = self.file.write          self.file.write('<?xml version="1.0" encoding="UTF-8"?>\n')
127          write('<?xml version="1.0" encoding="UTF-8"?>\n')          self.file.write('<!DOCTYPE session SYSTEM "thuban.dtd">\n')
         write('<!DOCTYPE session SYSTEM "thuban.dtd">\n')  
128    
129      def write_session(self, session, attrs = None, namespaces = ()):      def write_session(self, session, attrs = None, namespaces = ()):
130          """Write the session and its contents          """Write the session and its contents
# Line 116  class Saver: Line 147  class Saver:
147          attrs["title"] = session.title          attrs["title"] = session.title
148          for name, uri in namespaces:          for name, uri in namespaces:
149              attrs["xmlns:" + name] = uri              attrs["xmlns:" + name] = uri
150          self.write_element("session", attrs)          self.open_element("session", attrs)
151          for map in session.Maps():          for map in session.Maps():
152              self.write_map(map)              self.write_map(map)
153          self.file.write('</session>\n')          self.close_element("session")
154    
155      def write_map(self, map):      def write_map(self, map):
156          """Write the map and its contents.          """Write the map and its contents.
# Line 130  class Saver: Line 161  class Saver:
161          and finally call write_label_layer to write the label layer.          and finally call write_label_layer to write the label layer.
162          """          """
163          write = self.file.write          write = self.file.write
164          write('\t<map title="%s">\n' % escape(map.title))          self.open_element('map title="%s"' % escape(map.title))
165          self.write_projection(map.projection)          self.write_projection(map.projection)
166          for layer in map.Layers():          for layer in map.Layers():
167              self.write_layer(layer)              self.write_layer(layer)
168          self.write_label_layer(map.LabelLayer())          self.write_label_layer(map.LabelLayer())
169          write('\t</map>\n')          self.close_element('map')
170    
171      def write_projection(self, projection):      def write_projection(self, projection):
172          """Write the projection.          """Write the projection.
173          """          """
174          if projection and len(projection.params) > 0:          if projection and len(projection.params) > 0:
175              self.file.write('\t\t<projection>\n')              self.open_element("projection")
176              for param in projection.params:              for param in projection.params:
177                  self.file.write('\t\t\t<parameter value="%s"/>\n'                  self.write_element('parameter value="%s"' % escape(param))
178                                  % escape(param))              self.close_element("projection")
             self.file.write('\t\t</projection>\n')  
179    
180      def write_layer(self, layer, attrs = None):      def write_layer(self, layer, attrs = None):
181          """Write the layer.          """Write the layer.
# Line 169  class Saver: Line 199  class Saver:
199              attrs["stroke"] = "None"              attrs["stroke"] = "None"
200          else:          else:
201              attrs["stroke"] = stroke.hex()              attrs["stroke"] = stroke.hex()
202          self.write_element("layer", attrs, empty = 1, indentation = "\t\t")  
203            self.open_element("layer", attrs)
204            self.write_classification(layer)
205            self.close_element("layer")
206    
207        def write_classification(self, layer, attrs = None):
208            if attrs is None:
209                attrs = {}
210    
211            lc = layer.classification
212    
213            field = lc.field
214    
215            #
216            # there isn't a classification of anything
217            # so don't do anything
218            #
219            if field is None: return
220    
221            attrs["field"] = field
222            self.open_element("classification", attrs)
223    
224            if lc.NullData is not None:
225                self.open_element("clnull")
226                self.write_element("cldata", lc.NullData)
227                self.close_element("clnull")
228    
229            if lc.points != {}:
230                for value, data in lc.points.items():
231                    self.open_element('clpoint value="%s"' % (escape(str(value))))
232                    self.write_element("cldata", data)
233                    self.close_element('clpoint')
234              
235            if lc.ranges != []:
236                for p in lc.ranges:
237                    self.open_element('clrange min="%s" max="%s"'
238                        % (escape(str(p[0])), escape(str(p[1]))))
239                    self.write_element("cldata", p[2])
240                    self.close_element('clrange')
241    
242            self.close_element("classification")
243    
244      def write_label_layer(self, layer):      def write_label_layer(self, layer):
245          """Write the label layer.          """Write the label layer.
246          """          """
247          labels = layer.Labels()          labels = layer.Labels()
248          if labels:          if labels:
249              self.file.write('\t\t<labellayer>\n')              self.open_element('labellayer')
250              for label in labels:              for label in labels:
251                  self.file.write(('\t\t\t<label x="%g" y="%g" text="%s"'                  self.write_element(('label x="%g" y="%g" text="%s"'
252                                   ' halign="%s" valign="%s"/>\n')                                      ' halign="%s" valign="%s"')
253                                  % (label.x, label.y, label.text, label.halign,                                  % (label.x, label.y, label.text, label.halign,
254                                     label.valign))                                     label.valign))
255              self.file.write('\t\t</labellayer>\n')              self.close_element('labellayer')
256    
257    
258    

Legend:
Removed from v.268  
changed lines
  Added in v.366

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26