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

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

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

revision 267 by bh, Thu Aug 22 10:25:30 2002 UTC revision 465 by jonathan, Wed Mar 5 18:18:06 2003 UTC
# Line 2  Line 2 
2  # Authors:  # Authors:
3  # Jan-Oliver Wagner <[email protected]>  # Jan-Oliver Wagner <[email protected]>
4  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
5    # Jonathan Coles <[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 GRASS for details.  # Read the file COPYING coming with GRASS for details.
# Line 18  import xml.sax Line 19  import xml.sax
19  import xml.sax.handler  import xml.sax.handler
20  from xml.sax import make_parser, ErrorHandler  from xml.sax import make_parser, ErrorHandler
21    
22    from Thuban import _
23    from Thuban.common import *
24    
25  from Thuban.Model.session import Session  from Thuban.Model.session import Session
26  from Thuban.Model.map import Map  from Thuban.Model.map import Map
27  from Thuban.Model.layer import Layer  from Thuban.Model.layer import Layer
28  from Thuban.Model.color import Color  from Thuban.Model.color import Color
29  from Thuban.Model.proj import Projection  from Thuban.Model.proj import Projection
30    from Thuban.Model.classification import Classification, \
31        ClassGroupDefault, ClassGroupSingleton, ClassGroupRange, ClassGroupMap, \
32        ClassGroupProperties
33    
34    
35  def parse_color(color):  def parse_color(color):
# Line 33  def parse_color(color): Line 40  def parse_color(color):
40      """      """
41      color = string.strip(color)      color = string.strip(color)
42      if color == "None":      if color == "None":
43          result = None          result = Color.None
44      elif color[0] == '#':      elif color[0] == '#':
45          if len(color) == 7:          if len(color) == 7:
46              r = string.atoi(color[1:3], 16) / 255.0              r = string.atoi(color[1:3], 16) / 255.0
# Line 41  def parse_color(color): Line 48  def parse_color(color):
48              b = string.atoi(color[5:7], 16) / 255.0              b = string.atoi(color[5:7], 16) / 255.0
49              result = Color(r, g, b)              result = Color(r, g, b)
50          else:          else:
51              raise ValueError("Invalid hexadecimal color specification %s"              raise ValueError(_("Invalid hexadecimal color specification %s")
52                               % color)                               % color)
53      else:      else:
54          raise ValueError("Invalid color specification %s" % color)          raise ValueError(_("Invalid color specification %s") % color)
55      return result      return result
56    
57    
58  class ProcessSession(xml.sax.handler.ContentHandler):  class ProcessSession(xml.sax.handler.ContentHandler):
59    
60      # Dictionary mapping element names (or (URI, element name) pairs for      # Dictionary mapping element names (or (URI, element name) pairs for
61      # documents using amespaces) to method names. The methods should      # documents using namespaces) to method names. The methods should
62      # accept the same parameters as the startElement (or startElementNS)      # accept the same parameters as the startElement (or startElementNS)
63      # methods. The start_dispatcher is used by the default startElement      # methods. The start_dispatcher is used by the default startElement
64      # and startElementNS methods to call a method for the open tag of an      # and startElementNS methods to call a method for the open tag of an
# Line 144  class ProcessSession(xml.sax.handler.Con Line 151  class ProcessSession(xml.sax.handler.Con
151          stroke = parse_color(attrs.get((None, 'stroke'), "#000000"))          stroke = parse_color(attrs.get((None, 'stroke'), "#000000"))
152          stroke_width = int(attrs.get((None, 'stroke_width'), "1"))          stroke_width = int(attrs.get((None, 'stroke_width'), "1"))
153          self.aLayer = layer_class(title, filename, fill = fill,          self.aLayer = layer_class(title, filename, fill = fill,
154                                    stroke = stroke, stroke_width = stroke_width)                                    stroke = stroke, lineWidth = stroke_width)
155      start_dispatcher['layer'] = "start_layer"      start_dispatcher['layer'] = "start_layer"
156    
157      def end_layer(self, name, qname):      def end_layer(self, name, qname):
158          self.aMap.AddLayer(self.aLayer)          self.aMap.AddLayer(self.aLayer)
159      end_dispatcher['layer'] = "end_layer"      end_dispatcher['layer'] = "end_layer"
160    
161        def start_classification(self, name, qname, attrs):
162            field = attrs.get((None, 'field'), None)
163    
164            fieldType = attrs.get((None, 'field_type'), None)
165            dbFieldType = self.aLayer.GetFieldType(field)
166    
167            if fieldType != dbFieldType:
168                raise ValueError(_("xml field type differs from database!"))
169    
170            # setup conversion routines depending on the kind of data
171            # we will be seeing later on
172            if fieldType == FIELDTYPE_STRING:
173                self.conv = str
174            elif fieldType == FIELDTYPE_INT:
175                self.conv = lambda p: int(float(p))
176            elif fieldType == FIELDTYPE_DOUBLE:
177                self.conv = float
178    
179            self.aLayer.GetClassification().SetField(field)
180    
181        start_dispatcher['classification'] = "start_classification"
182    
183        def end_classification(self, name, qname):
184            pass
185        end_dispatcher['classification'] = "end_classification"
186    
187        def start_clnull(self, name, qname, attrs):
188            self.cl_group = ClassGroupDefault()
189            self.cl_group.SetLabel(attrs.get((None, 'label'), ""))
190            self.cl_prop = ClassGroupProperties()
191        start_dispatcher['clnull'] = "start_clnull"
192    
193        def end_clnull(self, name, qname):
194            self.cl_group.SetProperties(self.cl_prop)
195            self.aLayer.GetClassification().SetDefaultGroup(self.cl_group)
196            del self.cl_group, self.cl_prop
197        end_dispatcher['clnull'] = "end_clnull"
198    
199        def start_clpoint(self, name, qname, attrs):
200            attrib_value = attrs.get((None, 'value'), "0")
201    
202            #try:
203                #value  = Str2Num(attrib_value)
204            #except:
205                #value  = attrib_value
206    
207            value = self.conv(attrib_value)
208    
209            self.cl_group = ClassGroupSingleton(value)
210            self.cl_group.SetLabel(attrs.get((None, 'label'), ""))
211            self.cl_prop = ClassGroupProperties()
212    
213        start_dispatcher['clpoint'] = "start_clpoint"
214    
215        def end_clpoint(self, name, qname):
216            self.cl_group.SetProperties(self.cl_prop)
217            self.aLayer.GetClassification().AddGroup(self.cl_group)
218            del self.cl_group, self.cl_prop
219        end_dispatcher['clpoint'] = "end_clpoint"
220    
221        def start_clrange(self, name, qname, attrs):
222    
223            try:
224                min = self.conv(attrs.get((None, 'min'), "0"))
225                max = self.conv(attrs.get((None, 'max'), "0"))
226                #min = Str2Num(attrs.get((None, 'min'), "0"))
227                #max = Str2Num(attrs.get((None, 'max'), "0"))
228            except ValueError:
229                raise ValueError(_("Classification range is not a number!"))
230    
231            self.cl_group = ClassGroupRange(min, max)
232            self.cl_group.SetLabel(attrs.get((None, 'label'), ""))
233            self.cl_prop = ClassGroupProperties()
234    
235        start_dispatcher['clrange'] = "start_clrange"
236    
237        def end_clrange(self, name, qname):
238            self.cl_group.SetProperties(self.cl_prop)
239            self.aLayer.GetClassification().AddGroup(self.cl_group)
240            del self.cl_group, self.cl_prop
241        end_dispatcher['clrange'] = "end_clrange"
242    
243        def start_cldata(self, name, qname, attrs):
244            self.cl_prop.SetLineColor(
245                parse_color(attrs.get((None, 'stroke'), "None")))
246            self.cl_prop.SetLineWidth(
247                int(attrs.get((None, 'stroke_width'), "0")))
248            self.cl_prop.SetFill(parse_color(attrs.get((None, 'fill'), "None")))
249        start_dispatcher['cldata'] = "start_cldata"
250    
251        def end_cldata(self, name, qname):
252            pass
253        end_dispatcher['cldata'] = "end_cldata"
254    
255      def start_table(self, name, qname, attrs):      def start_table(self, name, qname, attrs):
256          print "table title: %s" % attrs.get('title', None)          print "table title: %s" % attrs.get('title', None)
257      start_dispatcher['table'] = "start_table"      start_dispatcher['table'] = "start_table"

Legend:
Removed from v.267  
changed lines
  Added in v.465

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26