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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1480 - (hide annotations)
Thu Jul 24 17:52:48 2003 UTC (21 years, 7 months ago) by bh
Original Path: trunk/thuban/Thuban/Model/range.py
File MIME type: text/x-python
File size: 4631 byte(s)
Remove the #! line as
it annoys lintian which warns about these files not being
executable. The #1 isn't necessary here since if you absolutely
must execute them you can always say "python <filename>".

1 jonathan 887 # 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 jonathan 962 import types
18 jonathan 887
19 jonathan 962 _inf = float('1e1000') # FIXME: hack for infinite
20 jonathan 887
21     class Range:
22    
23 jonathan 901 number_re = '(?P<%s>-?(\d*\.?\d*([eE][\-+]?\d+)?|oo))'
24 jonathan 887 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 tkoester 993 self._SetRange(range)
31 jonathan 887
32 tkoester 993 def _SetRange(self, range):
33 jonathan 887 if isinstance(range, Range):
34 tkoester 993 self._SetRange(range.GetRange())
35 jonathan 887 elif range in [None, '']:
36 tkoester 993 self._SetRange(']-oo;oo[')
37 jonathan 962 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 jonathan 887 else:
51     self._range = range
52     match = self.parse_range.match(self._range)
53     if match:
54 tkoester 993 self._SetRange((match.group('left'),
55 jonathan 962 match.group('begin'),
56     match.group('end'),
57     match.group('right')))
58 jonathan 887 else:
59 jonathan 962 raise ValueError("can't parse range: %s" % (range,))
60 jonathan 887
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 tkoester 993 def float(self, value):
70     """convert string or number to float"""
71     if value == 'oo':
72 jonathan 887 return _inf
73 tkoester 993 elif value == '-oo':
74 jonathan 887 return -_inf
75     else:
76 tkoester 993 return float(value)
77 jonathan 887
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 jonathan 962 return "%g" % (value,)
91 jonathan 887
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