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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 75 - (show annotations)
Mon Feb 4 19:22:22 2002 UTC (23 years, 1 month ago) by bh
Original Path: trunk/thuban/Thuban/Model/load.py
File MIME type: text/x-python
File size: 5690 byte(s)
	* Thuban/Model/load.py (ProcessSession.startElement): Read the
	stroke_width attribute

1 # Copyright (C) 2001, 2002 by Intevation GmbH
2 # Authors:
3 # Jan-Oliver Wagner <[email protected]>
4 #
5 # This program is free software under the GPL (>=v2)
6 # Read the file COPYING coming with GRASS for details.
7
8 """
9 Parser for thuban session files.
10 """
11
12 __version__ = "$Revision$"
13
14 import sys, string, os
15 from Thuban.Model.session import Session
16 from Thuban.Model.map import Map
17 from Thuban.Model.layer import Layer
18 from Thuban.Model.color import Color
19 from Thuban.Model.proj import Projection
20
21 oldPython=0
22
23 if not sys.__dict__.has_key("version_info"):
24 # We can assume to have python 1.5.2 or lower here now
25 oldPython=1
26
27 if oldPython:
28 try:
29 from xml.sax.saxexts import make_parser
30 from xml.sax.saxlib import HandlerBase
31 from xml.sax import saxutils
32 except ImportError:
33 sys.stdout.write(("You need to have Python-XML installed or"
34 " a modern Python!\n"
35 "Check www.python.org/sigs/xml-sig/\n\n"))
36 raise
37 else:
38 # Do the python 2.0 standard xml thing and map it on the old names
39 import xml.sax
40 import xml.sax.handler
41 HandlerBase=xml.sax.handler.ContentHandler
42 from xml.sax import make_parser
43
44 class testSAXContentHandler(HandlerBase):
45 # SAX compliant
46 def characters(self, ch, start, length):
47 pass
48
49 def test_for_broken_SAX():
50 ch=testSAXContentHandler()
51 try:
52 xml.sax.parseString("""<?xml version="1.0"?>
53 <child1 name="paul">Text goes here</child1>
54 """,ch)
55 except TypeError:
56 return 1
57 return 0
58
59
60 def parse_color(color):
61 """
62 Return the color object for the string color. Color may be either
63 'None' or of the form '#RRGGBB' in the usual HTML color notation
64 """
65 color = string.strip(color)
66 if color == "None":
67 result = None
68 elif color[0] == '#':
69 if len(color) == 7:
70 r = string.atoi(color[1:3], 16) / 255.0
71 g = string.atoi(color[3:5], 16) / 255.0
72 b = string.atoi(color[5:7], 16) / 255.0
73 result = Color(r, g, b)
74 else:
75 raise ValueError("Invalid hexadecimal color specification %s"
76 % color)
77 else:
78 raise ValueError("Invalid color specification %s" % color)
79 return result
80
81
82 class ProcessSession(HandlerBase):
83
84 def __init__(self, directory):
85 """Inititialize the Sax handler.
86
87 directory is the directory containing the session file. It's
88 needed to interpret embedded relative filenames
89 """
90 self.directory = directory
91 self.chars = ''
92 self.theSession = None
93 self.aMap = None
94 self.aLayer = None
95
96 def startElement(self, name, attrs):
97 if name == 'session':
98 self.theSession = Session(attrs.get('title', None))
99 elif name == 'map':
100 self.aMap = Map(attrs.get('title', None))
101 elif name == 'projection':
102 self.ProjectionParams = [ ]
103 elif name == 'parameter':
104 self.ProjectionParams.append(attrs.get('value', None))
105 elif name == 'layer':
106 title = attrs.get('title', "")
107 filename = attrs.get('filename', "")
108 filename = os.path.join(self.directory, filename)
109 fill = parse_color(attrs.get('fill', "None"))
110 stroke = parse_color(attrs.get('stroke', "#000000"))
111 stroke_width = int(attrs.get("stroke_width", "1"))
112 self.aLayer = Layer(title, filename, fill = fill, stroke = stroke,
113 stroke_width = stroke_width)
114 elif name == 'table':
115 print "table title: %s" % attrs.get('title', None)
116 elif name == 'labellayer':
117 self.aLayer = self.aMap.LabelLayer()
118 elif name == 'label':
119 x = float(attrs['x'])
120 y = float(attrs['y'])
121 text = attrs['text']
122 halign = attrs['halign']
123 valign = attrs['valign']
124 self.aLayer.AddLabel(x, y, text, halign = halign, valign = valign)
125
126
127 if not oldPython and test_for_broken_SAX():
128 # works with python 2.0, but is not SAX compliant
129 def characters(self, ch):
130 self.my_characters(ch)
131 else:
132 # SAX compliant
133 def characters(self, ch, start, length):
134 self.my_characters(ch[start:start+length])
135
136 def my_characters(self, ch):
137 self.chars = self.chars + ch
138
139 def endElement(self, name):
140 # If it's not a parameter element, ignore it
141 if name == 'session':
142 #print "end of session"
143 pass
144 if name == 'map':
145 self.theSession.AddMap(self.aMap)
146 if name == 'projection':
147 self.aMap.SetProjection(Projection(self.ProjectionParams))
148 if name == 'layer':
149 self.aMap.AddLayer(self.aLayer)
150 if name == 'table':
151 #print "end of table"
152 pass
153
154 def load_session(filename):
155 """Load a Thuban session from the file object file"""
156 dir = os.path.dirname(filename)
157 file = open(filename)
158 handler = ProcessSession(dir)
159
160 if oldPython:
161 parser = make_parser()
162 parser.setDocumentHandler(handler)
163 parser.setErrorHandler(saxutils.ErrorPrinter())
164 parser.parseFile(file)
165 parser.close()
166 else:
167 xml.sax.parse(file,handler)
168 session = handler.theSession
169 # Newly loaded session aren't modified
170 session.UnsetModified()
171
172 return session
173
174 if __name__ == "__main__":
175 # find out the command to run
176 if len(sys.argv) > 1:
177 print "usage: cat <file> | " + sys.argv[0]
178 else:
179 parseSession(sys.stdin)

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26