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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2734 - (show annotations)
Thu Mar 1 12:42:59 2007 UTC (18 years ago) by bramz
File MIME type: text/x-python
File size: 4631 byte(s)
made a copy
1 # Copyright (C) 2002, 2003 by Intevation GmbH
2 # Authors:
3 # Thomas Koester <[email protected]>
4 #
5 # This program is free software under the GPL (>=v2)
6 # Read the file COPYING coming with the software for details.
7
8 """
9 Range class for Scientific Parameter
10 """
11
12 __version__ = "$Revision$"
13 # $Source$
14 # $Id$
15
16 import re
17 import types
18
19 _inf = float('1e1000') # FIXME: hack for infinite
20
21 class Range:
22
23 number_re = '(?P<%s>-?(\d*\.?\d*([eE][\-+]?\d+)?|oo))'
24 brace_re = '(?P<%s>[][])'
25 range_re = '^' + brace_re % 'left' + number_re % 'begin' + \
26 ';' + number_re % 'end' + brace_re % 'right' + '$'
27 parse_range = re.compile(range_re)
28
29 def __init__(self, range=None):
30 self._SetRange(range)
31
32 def _SetRange(self, range):
33 if isinstance(range, Range):
34 self._SetRange(range.GetRange())
35 elif range in [None, '']:
36 self._SetRange(']-oo;oo[')
37 elif type(range) == types.TupleType:
38 if (len(range) == 4 and range[0] in ['[', ']']
39 and range[3] in ['[', ']']):
40 self._left = range[0]
41 self._begin = self.float(range[1])
42 self._end = self.float(range[2])
43 self._right = range[3]
44 if (self._begin > self._end or
45 (self._begin == self._end and
46 (self._left != '[' or self._right != ']'))):
47 raise ValueError("illegal range: %s" % (range,))
48 else:
49 raise ValueError("can't parse range: %r" % (range,))
50 else:
51 self._range = range
52 match = self.parse_range.match(self._range)
53 if match:
54 self._SetRange((match.group('left'),
55 match.group('begin'),
56 match.group('end'),
57 match.group('right')))
58 else:
59 raise ValueError("can't parse range: %s" % (range,))
60
61 def GetRange(self):
62 """return internal representation of range
63
64 4-tuple ('[' or ']', begin(float), end(float), '[' or ']')
65
66 """
67 return (self._left, self._begin, self._end, self._right)
68
69 def float(self, value):
70 """convert string or number to float"""
71 if value == 'oo':
72 return _inf
73 elif value == '-oo':
74 return -_inf
75 else:
76 return float(value)
77
78 def _float2string(self, value):
79 """convert float value to string
80
81 (minus) infinity will be converted to (-)oo,
82 scientific notation will be used if necessary.
83
84 """
85 if value == _inf:
86 return 'oo'
87 elif value == -_inf:
88 return '-oo'
89 else:
90 return "%g" % (value,)
91
92 def string(self, range):
93 """convert internal representation to string"""
94 left, begin, end, right = range
95 return "%s%s;%s%s" % (left, self._float2string(begin),
96 self._float2string(end), right)
97
98 def __contains__(self, value):
99 if self._left == ']':
100 contains = value > self._begin
101 else:
102 contains = value >= self._begin
103 if self._right == '[':
104 contains = contains and (value < self._end)
105 else:
106 contains = contains and (value <= self._end)
107 return contains
108
109 def __eq__(self, other):
110 return (self.GetRange() == other.GetRange())
111
112 def __ne__(self, other):
113 return not self.__eq__(other)
114
115 def __str__(self):
116 return self.string(self.GetRange())
117
118
119 def _test():
120 range1 = Range(']0;99]')
121 print 'range1 =', range1, range1.GetRange()
122 for i in [-0.1, 0, 0.1, 9.9, 99, 99.9]:
123 print '%4.1f in range1 =' % i, i in range1
124 range2 = Range(']-oo;10[')
125 print 'range2 =', range2, range2.GetRange()
126 for i in [-0.1, 0, 0.1, 9.9, 10, 10.1]:
127 print '%4.1f not in range2 =' % i, i not in range2
128 range3 = Range(']1e-1;1E2]')
129 print 'range3 =', range3, range3.GetRange()
130 for i in [0, 0.1, 0.11, 10, 100, 101]:
131 print '%4.1f not in range3 =' % i, i not in range3
132 print 'range3 != range2 =', range3 != range2
133 print 'range3 != Range("]1e-1;1E2]") =', range3 != Range("]1e-1;1E2]")
134
135 range4 = Range('')
136 print 'range4 =', range4, range4.GetRange()
137
138 range5 = Range(']0;99E+00]')
139 print 'range5 =', range5, range5.GetRange()
140 range6 = Range(']0;99E+01]')
141 print 'range6 =', range6, range6.GetRange()
142 range7 = Range(']0;99E-01]')
143 print 'range7 =', range7, range7.GetRange()
144
145 if __name__ == "__main__":
146 _test()

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26