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

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

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

revision 900 by jonathan, Wed May 14 11:15:41 2003 UTC revision 1359 by jonathan, Wed Jul 2 10:51:49 2003 UTC
# Line 5  Line 5 
5  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
6  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
7    
8    """
9    Functions to generate Classifications
10    """
11    
12    __version__ = "$Revision$"
13    # $Source$
14    # $Id$
15    
16  import operator  import operator
17    
18  from color import Color  from color import Color, Transparent
19  from range import Range  from range import Range
20  from classification import Classification, ClassGroupSingleton, \  from classification import Classification, ClassGroupSingleton, \
21      ClassGroupRange, ClassGroupProperties      ClassGroupRange, ClassGroupProperties
22    
23  class ClassGenerator:  def generate_singletons(_list, ramp):
24        """Generate a new classification consisting solely of singletons.
     def GenSingletonsFromList(self, _list, numGroups, ramp):  
         """Generate a new classification consisting solely of singletons.  
   
         The resulting classification will consist of at most 'numGroups'  
         groups whose group properties ramp between 'prop1' and 'prop2'. There  
         could be fewer groups if '_list' contains fewer that 'numGroups' items.  
25    
26          _list -- any object that implements the iterator interface      The resulting classification will consist of one group for each
27        item in _list whose properties ramp between 'prop1' and 'prop2'.
         numGroups -- how many groups to generate. This can not be  
                      determined while the classification is being  
                      generated because the stepping values must  
                      be precalculated to ramp between prop1 and prop2.  
   
         ramp -- an object which implements the CustomRamp interface  
         """  
28    
29          clazz = Classification()      _list -- any object that implements the iterator interface
         if numGroups == 0: return clazz  
30    
31          ramp.SetNumGroups(numGroups)      ramp -- an object which implements the CustomRamp interface
32        """
33    
34          for value, prop in zip(_list, ramp):      clazz = Classification()
             clazz.AppendGroup(ClassGroupSingleton(value, prop))  
35    
36          return clazz      i = 0
37        maxValue = float(len(_list) - 1)
38        for value in _list:
39            prop = ramp.GetProperties(i / maxValue)
40            clazz.AppendGroup(ClassGroupSingleton(value, prop))
41            i += 1
42    
43      def GenSingletons(self, min, max, numGroups, ramp):      return clazz
44    
45          clazz = Classification()  def generate_uniform_distribution(min, max, numGroups, ramp, intStep = False):
46        """Generate a classification with numGroups range groups
47        each with the same interval.
48    
49          #step = int((max - min) / float(numGroups))      intStep -- force the calculated stepping to an integer.
50                   Useful if the values are integers but the
51                   number of groups specified doesn't evenly
52                   divide (max - min).
53        """
54    
55          if numGroups > 0:      clazz = Classification()
   
             step = int((max - min + 1) / float(numGroups))  
             cur_value = min  
   
             ramp.SetNumGroups(numGroups)  
   
             for prop in ramp:  
                 clazz.AppendGroup(ClassGroupSingleton(cur_value), prop)  
                 cur_value += step  
   
         return clazz  
   
     def GenUniformDistribution(self, min, max, numGroups,  
                                ramp, intStep = False):  
         """Generate a classification with numGroups range groups  
         each with the same interval.  
   
         intStep -- force the calculated stepping to an integer.  
                    Useful if the values are integers but the  
                    number of groups specified doesn't evenly  
                    divide (max - min).  
         """  
56    
57          clazz = Classification()      cur_min = min
         if numGroups == 0: return clazz  
58    
59          ramp.SetNumGroups(numGroups)      end = "["
60        maxValue = float(numGroups - 1)
61        for i in range(1, numGroups + 1):
62    
63          step = (max - min) / float(numGroups)          prop = ramp.GetProperties(float(i-1) / maxValue)
64    
65          if intStep:          if intStep:
66              step = int(step)              cur_max = min + int(round((i * (max - min + 1)) / maxValue))
67            else:
68                cur_max = min + (i * (max - min)) / maxValue
69    
70          cur_min = min          if i == numGroups:
71          cur_max = cur_min + step              cur_max = max
72                end = "]"
73    
74          i = 0          if cur_min == cur_max:
75          end = "["              _range = Range(("[", cur_min, cur_max, "]"))
76          for prop in ramp:          else:
77                _range = Range(("[", cur_min, cur_max, end))
78    
79              if i == (numGroups - 1):          clazz.AppendGroup(ClassGroupRange(_range, prop))
                 cur_max = max  
                 end = "]"  
80    
81            cur_min = cur_max
82    
83              # this check guards against rounding issues      return clazz
             if cur_min != cur_max:  
                 range = Range("[" + str(float(cur_min)) + ";" +  
                                     str(float(cur_max)) + end)  
                 clazz.AppendGroup(ClassGroupRange(range, None, prop))  
84    
85              cur_min = cur_max  def generate_quantiles(_list, percents, ramp, _range):
86              cur_max += step      """Generates a Classification which has groups of ranges that
87              i += 1      represent quantiles of _list at the percentages given in percents.
88        Only the values that fall within _range are considered.
89    
90          return clazz      Returns a tuple (adjusted, Classification) where adjusted is
91        True if the Classification does not exactly represent the given
92        range, or if the Classification is empty.
93    
94        _list -- a sort list of values
95    
96      def GenQuantiles(self, _list, percents, ramp, _range):      percents -- a sorted list of floats in the range 0.0-1.0 which
97          """Generates a Classification which has groups of ranges that                  represent the upper bound of each quantile. the
98          represent quantiles of _list at the percentages given in percents.                  union of all percentiles should be the entire
99          Only the values that fall within _range are considered.                  range from 0.0-1.0
100    
101          Returns a tuple (adjusted, Classification) where adjusted is      ramp -- an object which implements the CustomRamp interface
         True if the Classification does not exactly represent the given  
         range, or if the Classification is empty.  
102    
103          _list -- a sort list of values      _range -- a Range object
104    
105          percents -- a sorted list of floats in the range 0.0-1.0 which      Raises a Value Error if 'percents' has fewer than two items, or
106                      represent the upper bound of each quantile      does not cover the entire range.
107        """
108    
109          ramp -- an object which implements the CustomRamp interface      clazz = Classification()
110        quantiles = calculate_quantiles(_list, percents, _range)
111        adjusted = True
112    
113          _range -- a Range object      if quantiles is not None:
         """  
114    
115          clazz = Classification()          numGroups = len(quantiles[3])
         quantiles = self.CalculateQuantiles(_list, percents, _range)  
         adjusted = True  
116    
117          if quantiles is not None:          if numGroups != 0:
118    
119              numGroups = len(quantiles[3])              adjusted = quantiles[0]
120    
121              if numGroups != 0:              start, min, endMax, right = _range.GetRange()
122    
123                  adjusted = quantiles[0]              oldp = 0
124                i = 1
125                end = "]"
126    
127                  ramp.SetNumGroups(numGroups)              maxValue = float(numGroups - 1)
128                for (q, p) in quantiles[3]:
129    
130                  start, min, endMax, right = _range.GetRange()                  prop = ramp.GetProperties(float(i-1) / maxValue)
131    
132                  if str(min) == '-inf':                  if i == numGroups:
133                      min = "-oo"                      max = endMax
134                  elif str(min) == 'inf':                      end = right
135                      min = "oo"                  else:
136                        max = _list[q]
137    
138                  if str(endMax) == '-inf':                  group = ClassGroupRange(Range((start, min, max, end)), prop)
139                      endMax = "-oo"      
140                  elif str(endMax) == 'inf':                  group.SetLabel("%s%% - %s%%" % (round(oldp*100, 2),
141                      endMax = "oo"                                                  round(p*100, 2)))
142                    oldp = p
143                    start = "]"
144                    min = max
145                    clazz.AppendGroup(group)
146                    i += 1
147    
148                  oldp = 0      return (adjusted, clazz)
                 i = 1  
                 end = "]"  
149    
150                  for (q, p), prop in zip(quantiles[3], ramp):  def GenQuantiles0(_list, percents, ramp, _range):
151                      if i == numGroups:      """Same as GenQuantiles, but the first class won't be added to
152                          max = endMax      the classification.
                         end = right  
                     else:  
                         max = _list[q]  
153    
154                      group = ClassGroupRange(Range(start + str(min) + ";" +      Returns a tuple (adjusted, Classification, upper_class0) where
155                                                            str(max) + end),      upper_class0 is the highest value inside the first class.
                                             None, prop)  
           
                     group.SetLabel("%s%% - %s%%" % (round(oldp*100, 2),  
                                                     round(p*100, 2)))  
                     oldp = p  
                     start = "]"  
                     min = max  
                     clazz.AppendGroup(group)  
                     i += 1  
   
         return (adjusted, clazz)  
   
     def CalculateQuantiles(self, _list, percents, _range):  
         """Calculate quantiles for the given _list of percents from the  
         sorted list of values that are in range.  
                                                                                   
         This may not actually generate len(percents) quantiles if  
         many of the values that fall on quantile borders are the same.  
   
         Returns a tuple of the form:  
             (adjusted, minIndex, maxIndex, [quantile_list])  
   
         where adjusted is True if the the quantile percentages differ from  
         those supplied, minIndex is the index into _list where the  
         minimum value used is located, maxIndex is the index into _list  
         where the maximum value used is located, and quantile_list is a  
         list of tuples of the form: (list_index, quantile_percentage)  
   
         Returns None, if no quantiles could be generated based on the  
         given range or input list.  
156    
157          _list -- a sort list of values      _list -- a sort list of values
158    
159          percents -- a sorted list of floats in the range 0.0-1.0 which      percents -- a sorted list of floats in the range 0.0-1.0 which
160                      represent the upper bound of each quantile                  represent the upper bound of each quantile. the
161                    union of all percentiles should be the entire
162                    range from 0.0-1.0
163    
164          _range -- a Range object      ramp -- an object which implements the CustomRamp interface
         """  
       
         quantiles = []  
         adjusted = False  
165    
166          if len(percents) != 0:      _range -- a Range object
                                                                                 
             #  
             # find what part of the _list range covers  
             #  
             minIndex = -1  
             maxIndex = -2  
             for i in xrange(0, len(_list), 1):  
                 if operator.contains(_range, _list[i]):  
                     minIndex = i  
                     break  
   
             for i in xrange(len(_list)-1, -1, -1):  
                 if operator.contains(_range, _list[i]):  
                     maxIndex = i  
                     break  
   
             numValues = maxIndex - minIndex + 1  
   
             if numValues > 0:  
   
                 #  
                 # build a list of unique indices into list of where each  
                 # quantile *should* be. set adjusted if the resulting  
                 # indices are different  
                 #  
                 quantiles = {}  
                 for p in percents:  
                     index = min(minIndex + int(p*numValues)-1, maxIndex)  
   
                     adjusted = adjusted \  
                         or quantiles.has_key(index) \  
                         or ((index - minIndex + 1) / float(numValues)) != p  
   
                     quantiles[index] = 0  
   
                 quantiles = quantiles.keys()  
                 quantiles.sort()  
   
                 #  
                 # the current quantile index must be strictly greater than  
                 # the lowerBound  
                 #  
                 lowerBound = minIndex - 1  
       
                 for qindex in xrange(len(quantiles)):  
                     if lowerBound >= maxIndex:  
                         # discard higher quantiles  
                         quantiles = quantiles[:qindex]  
                         break  
       
                     # lowerBound + 1 is always a valid index  
       
                     #  
                     # bump up the current quantile index to be a usable index  
                     # if it currently falls below the lowerBound  
                     #  
                     if quantiles[qindex] <= lowerBound:  
                         quantiles[qindex] = lowerBound + 1  
           
                     listIndex = quantiles[qindex]  
                     value = _list[listIndex]  
       
                     #  
                     # look for similar values around the quantile index  
                     #  
                     lindex = listIndex - 1  
                     while lindex > lowerBound and value == _list[lindex]:  
                         lindex -= 1  
                     lcount = (listIndex - 1) - lindex  
       
                     rindex = listIndex + 1  
                     while rindex < maxIndex + 1 and value == _list[rindex]:  
                         rindex += 1  
                     rcount = (listIndex + 1) - rindex  
       
                     #  
                     # adjust the current quantile index based on how many  
                     # numbers in the _list are the same as the current value  
                     #  
                     newIndex = listIndex  
                     if lcount == rcount:  
                         if lcount != 0:  
                             #  
                             # there are an equal number of numbers to the left  
                             # and right, try going to the left first unless  
                             # doing so creates an empty quantile.  
                             #  
                             if lindex != lowerBound:  
                                 newIndex = lindex  
                             else:  
                                 newIndex = rindex - 1  
       
                     elif lcount < rcount:  
                         # there are fewer items to the left, so  
                         # try going to the left first unless  
                         # doing so creates an empty quantile.  
                         if lindex != lowerBound:  
                             newIndex = lindex  
                         else:  
                             newIndex = rindex - 1  
       
                     elif rcount < lcount:  
                         # there are fewer items to the right, so go to the right  
                         newIndex = rindex - 1  
       
                     adjusted = adjusted or newIndex != listIndex  
167    
168                      quantiles[qindex] = newIndex      Raises a Value Error if 'percents' has fewer than two items, or
169                      lowerBound = quantiles[qindex]      does not cover the entire range.
170            """
         #  
         # since quantiles is only set if the code is at least a little  
         # successful, an empty list will be generated in the case that  
         # we fail to get to the real body of the algorithm  
         #  
         if len(quantiles) == 0:  
             return None  
         else:  
             return (adjusted, minIndex, maxIndex,  
                     [(q, (q - minIndex+1) / float(numValues)) \  
                      for q in quantiles])  
171    
172  CLR  = 0      clazz = Classification()
173  STEP = 1      quantiles = calculate_quantiles(_list, percents, _range)
174  class CustomRamp:      adjusted = True
175    
176      def __init__(self, prop1, prop2):      if quantiles is not None:
         self.prop1 = prop1  
         self.prop2 = prop2  
177    
178          self.count = 0          numGroups = len(quantiles[3]) - 1
179    
180      def __iter__(self):          if numGroups > 0:
181          return self              adjusted = quantiles[0]
182    
183      def GetRamp(self):              start, min, endMax, right = _range.GetRange()
         return self  
184    
185      def SetNumGroups(self, num):              class0 = quantiles[3][0]
186                min = _list[class0[0]]
187                oldp = class0[1]
188                i = 1
189                end = "]"
190    
191                maxValue = float(numGroups - 1)
192                for (q, p) in quantiles[3][1:]:
193                    prop = ramp.GetProperties(float(i-1) / maxValue)
194    
195                    if i == numGroups:
196                        max = endMax
197                        end = right
198                    else:
199                        max = _list[q]
200    
201                    group = ClassGroupRange(Range((start, min, max, end)), prop)
202        
203                    group.SetLabel("%s%% - %s%%" % (round(oldp*100, 2),
204                                                    round(p*100, 2)))
205                    oldp = p
206                    start = "]"
207                    min = max
208                    clazz.AppendGroup(group)
209                    i += 1
210    
211        return (adjusted, clazz, _list[class0[0]])
212    
213    
214    def calculate_quantiles(_list, percents, _range):
215        """Calculate quantiles for the given _list of percents from the
216        sorted list of values that are in range.
217                                                                                
218        This may not actually generate len(percents) quantiles if
219        many of the values that fall on quantile borders are the same.
220    
221        Returns a tuple of the form:
222            (adjusted, minIndex, maxIndex, [quantile_list])
223    
224        where adjusted is True if the the quantile percentages differ from
225        those supplied, minIndex is the index into _list where the
226        minimum value used is located, maxIndex is the index into _list
227        where the maximum value used is located, and quantile_list is a
228        list of tuples of the form: (list_index, quantile_percentage)
229    
230        Returns None, if no quantiles could be generated based on the
231        given range or input list.
232    
233        _list -- a sort list of values
234    
235        percents -- a sorted list of floats in the range 0.0-1.0 which
236                    represent the upper bound of each quantile. the
237                    union of all percentiles should be the entire
238                    range from 0.0-1.0
239    
240        _range -- a Range object
241    
242        Raises a Value Error if 'percents' has fewer than two items, or
243        does not cover the entire range.
244        """
245    
246        quantiles = []
247        adjusted = False
248    
249        if len(percents) <= 1:
250            raise ValueError("percents parameter must have more than one item")
251    
252        if percents[-1] != 1.0:
253            raise ValueError("percents does not cover the entire range")
254    
255        #
256        # find what part of the _list range covers
257        #
258        minIndex = -1
259        maxIndex = -2
260        for i in xrange(0, len(_list), 1):
261            if operator.contains(_range, _list[i]):
262                minIndex = i
263                break
264    
265        for i in xrange(len(_list)-1, -1, -1):
266            if operator.contains(_range, _list[i]):
267                maxIndex = i
268                break
269    
270          if num <= 0:      numValues = maxIndex - minIndex + 1
             return False  
271    
272          self.count = int(num)      if numValues > 0:
         num = float(num)  
273    
274          prop1 = self.prop1          #
275          prop2 = self.prop2          # build a list of unique indices into list of where each
276            # quantile *should* be. set adjusted if the resulting
277            # indices are different
278            #
279            quantiles = {}
280            for p in percents:
281                index = min(minIndex + int(p*numValues)-1, maxIndex)
282    
283                adjusted = adjusted \
284                    or quantiles.has_key(index) \
285                    or ((index - minIndex + 1) / float(numValues)) != p
286    
287          clr = prop1.GetLineColor()              quantiles[index] = 0
         lineColor2 = prop2.GetLineColor()  
           
         self.noLine = clr is not Color.Transparent \  
                         and lineColor2 is not Color.Transparent  
288    
289            quantiles = quantiles.keys()
290            quantiles.sort()
291    
292          self.lineInfo = self.__GetColorInfo(prop1.GetLineColor(),          #
293                                              prop2.GetLineColor(),          # the current quantile index must be strictly greater than
294                                              num)          # the lowerBound
295            #
296            lowerBound = minIndex - 1
297    
298          self.fillInfo = self.__GetColorInfo(prop1.GetFill(),          for qindex in xrange(len(quantiles)):
299                                              prop2.GetFill(),              if lowerBound >= maxIndex:
300                                              num)                  # discard higher quantiles
301                    quantiles = quantiles[:qindex]
302                    break
303    
304          self.lineWidth = prop1.GetLineWidth()              # lowerBound + 1 is always a valid index
         self.lineWidthStep = (prop2.GetLineWidth() - self.lineWidth) / num  
305    
306          return True              #
307                # bump up the current quantile index to be a usable index
308                # if it currently falls below the lowerBound
309                #
310                if quantiles[qindex] <= lowerBound:
311                    quantiles[qindex] = lowerBound + 1
312    
313      def next(self):              listIndex = quantiles[qindex]
314          if self.count == 0:              value = _list[listIndex]
             raise StopIteration  
315    
316          prop = ClassGroupProperties()              #
317                # look for similar values around the quantile index
318                #
319                lindex = listIndex - 1
320                while lindex > lowerBound and value == _list[lindex]:
321                    lindex -= 1
322                lcount = (listIndex - 1) - lindex
323    
324                rindex = listIndex + 1
325                while rindex < maxIndex + 1 and value == _list[rindex]:
326                    rindex += 1
327                rcount = (listIndex + 1) - rindex
328    
329          if self.lineInfo is None:              #
330              prop.SetLineColor(Color.Transparent)              # adjust the current quantile index based on how many
331          else:              # numbers in the _list are the same as the current value
332              prop.SetLineColor(Color(self.lineInfo[CLR][0] / 255,              #
333                                      self.lineInfo[CLR][1] / 255,              newIndex = listIndex
334                                      self.lineInfo[CLR][2] / 255))              if lcount == rcount:
335                    if lcount != 0:
336              self.lineInfo[CLR][0] += self.lineInfo[STEP][0]                      #
337              self.lineInfo[CLR][1] += self.lineInfo[STEP][1]                      # there are an equal number of numbers to the left
338              self.lineInfo[CLR][2] += self.lineInfo[STEP][2]                      # and right, try going to the left first unless
339                        # doing so creates an empty quantile.
340                        #
341                        if lindex != lowerBound:
342                            newIndex = lindex
343                        else:
344                            newIndex = rindex - 1
345    
346          if self.fillInfo is None:              elif lcount < rcount:
347              prop.SetFill(Color.Transparent)                  # there are fewer items to the left, so
348          else:                  # try going to the left first unless
349              prop.SetFill(Color(self.fillInfo[CLR][0] / 255,                  # doing so creates an empty quantile.
350                              self.fillInfo[CLR][1] / 255,                  if lindex != lowerBound:
351                              self.fillInfo[CLR][2] / 255))                      newIndex = lindex
352                    else:
353                        newIndex = rindex - 1
354    
355                elif rcount < lcount:
356                    # there are fewer items to the right, so go to the right
357                    newIndex = rindex - 1
358    
359                adjusted = adjusted or newIndex != listIndex
360    
361                quantiles[qindex] = newIndex
362                lowerBound = quantiles[qindex]
363    
364        if len(quantiles) == 0:
365            return None
366        else:
367            return (adjusted, minIndex, maxIndex,
368                    [(q, (q - minIndex+1) / float(numValues)) \
369                     for q in quantiles])
370    
371              self.fillInfo[CLR][0] += self.fillInfo[STEP][0]  class CustomRamp:
             self.fillInfo[CLR][1] += self.fillInfo[STEP][1]  
             self.fillInfo[CLR][2] += self.fillInfo[STEP][2]  
372    
373        def __init__(self, prop1, prop2):
374            self.prop1 = prop1
375            self.prop2 = prop2
376    
377          prop.SetLineWidth(int(self.lineWidth))      def GetRamp(self):
378          self.lineWidth        += self.lineWidthStep          return self
379    
380          self.count -= 1      def GetProperties(self, index):
381            """Return a ClassGroupProperties object whose properties
382            represent a point at 'index' between prop1 and prop2 in
383            the constructor.
384    
385          return prop          index -- a value such that 0 <= index <= 1
386            """
387    
388      def __GetColorInfo(self, color1, color2, numGroups):          if not (0 <= index <= 1):
389                raise ValueError(_("invalid index"))
390    
391          if color1 is Color.Transparent and color2 is Color.Transparent:          newProps = ClassGroupProperties()
             #  
             # returning early  
             #  
             return None  
         elif color1 is not Color.Transparent and color2 is Color.Transparent:  
             color = [color1.red   * 255,  
                      color1.green * 255,  
                      color1.blue  * 255]  
             step = (0, 0, 0)  
         elif color1 is Color.Transparent and color2 is not Color.Transparent:  
             color = [color2.red   * 255,  
                      color2.green * 255,  
                      color2.blue  * 255]  
             step = (0, 0, 0)  
         else:  
             color = [color1.red   * 255,  
                      color1.green * 255,  
                      color1.blue  * 255]  
             step = ((color2.red   * 255 - color1.red   * 255)   / numGroups,  
                     (color2.green * 255 - color1.green * 255) / numGroups,  
                     (color2.blue  * 255 - color1.blue  * 255)  / numGroups)  
392    
393            color1 = self.prop1.GetLineColor()
394            color2 = self.prop2.GetLineColor()
395    
396          return (color, step)          self.__SetProperty(color1, color2, index, newProps.SetLineColor)
397            self.__SetProperty(color1, color2, index, newProps.SetFill)
398    
399            w = (self.prop2.GetLineWidth() - self.prop1.GetLineWidth()) \
400                * index \
401                + self.prop1.GetLineWidth()
402    
403            newProps.SetLineWidth(int(round(w)))
404    
405            return newProps
406    
407        def __SetProperty(self, color1, color2, index, setf):
408    
409            if color1 is Transparent and color2 is Transparent:
410                setf(Transparent)
411            elif color1 is Transparent:
412                setf(Color(
413                     color2.red   * index,
414                     color2.green * index,
415                     color2.blue  * index))
416            elif color2 is Transparent:
417                setf(Color(
418                     color1.red   * index,
419                     color1.green * index,
420                     color1.blue  * index))
421            else:
422                setf(Color(
423                    (color2.red   - color1.red)   * index + color1.red,
424                    (color2.green - color1.green) * index + color1.green,
425                    (color2.blue  - color1.blue)  * index + color1.blue))
426    
427  class MonochromaticRamp(CustomRamp):  class MonochromaticRamp(CustomRamp):
428      def __init__(self, start, end):      def __init__(self, start, end):
# Line 452  class MonochromaticRamp(CustomRamp): Line 436  class MonochromaticRamp(CustomRamp):
436    
437          CustomRamp.__init__(self, sp, ep)          CustomRamp.__init__(self, sp, ep)
438    
439  class GreyRamp(MonochromaticRamp):  GreyRamp       = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, 0))
440      def __init__(self):  RedRamp        = MonochromaticRamp(Color(1, 1, 1),  Color(.8, 0, 0))
441          MonochromaticRamp.__init__(self, Color(1, 1, 1), Color(0, 0, 0))  GreenRamp      = MonochromaticRamp(Color(1, 1, 1),  Color(0, .8, 0))
442    BlueRamp       = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, .8))
443  class RedRamp(MonochromaticRamp):  GreenToRedRamp = MonochromaticRamp(Color(1, .8, 1), Color(1, 0, 0))
     def __init__(self):  
         MonochromaticRamp.__init__(self, Color(1, 1, 1), Color(.8, 0, 0))  
   
 class GreenRamp(MonochromaticRamp):  
     def __init__(self):  
         MonochromaticRamp.__init__(self, Color(1, 1, 1), Color(0, .8, 0))  
   
 class BlueRamp(MonochromaticRamp):  
     def __init__(self):  
         MonochromaticRamp.__init__(self, Color(1, 1, 1), Color(0, 0, .8))  
   
 class GreenToRedRamp(MonochromaticRamp):  
     def __init__(self):  
         MonochromaticRamp.__init__(self, Color(0, .8, 0), Color(1, 0, 0))  
444    
445  class HotToColdRamp:  class HotToColdRamp:
446    
     def __iter__(self):  
         return self  
           
447      def GetRamp(self):      def GetRamp(self):
448          return self          return self
449    
450      def SetNumGroups(self, num):      def GetProperties(self, index):
451          if num < 0:          """Return a ClassGroupProperties object whose properties
452              return False          represent a point at 'index' between "hot" and "cold".
453    
454          self.num = float(num)          index -- a value such that 0 <= index <= 1
455          self.index = 0          """
   
         return True  
   
     def next(self):  
         if self.index == self.num:  
             raise StopIteration  
456    
457          clr = [1.0, 1.0, 1.0]          clr = [1.0, 1.0, 1.0]
458    
459          if self.index < (.25 * self.num):          if index < .25:
460              clr[0] = 0              clr[0] = 0
461              clr[1] = 4 * self.index / self.num              clr[1] = 4 * index
462          elif self.index < (.5 * self.num):          elif index < .5:
463              clr[0] = 0              clr[0] = 0
464              clr[2] = 1 + 4 * (.25 * self.num - self.index) / self.num              clr[2] = 1 + 4 * (.25 - index)
465          elif self.index < (.75 * self.num):          elif index < .75:
466              clr[0] = 4 * (self.index - .5 * self.num) / self.num              clr[0] = 4 * (index - .5)
467              clr[2] = 0              clr[2] = 0
468          else:          else:
469              clr[1] = 1 + 4 * (.75 * self.num - self.index) / self.num              clr[1] = 1 + 4 * (.75 - index)
470              clr[2] = 0              clr[2] = 0
471    
         self.index += 1  
   
472          prop = ClassGroupProperties()          prop = ClassGroupProperties()
473          prop.SetLineColor(Color(clr[0], clr[1], clr[2]))          prop.SetLineColor(Color(clr[0], clr[1], clr[2]))
474          prop.SetFill(Color(clr[0], clr[1], clr[2]))          prop.SetFill(Color(clr[0], clr[1], clr[2]))
475    
476          return prop          return prop
477    
 #class Colors16Ramp:  
 #  
     #def __iter__(self):  
         #return self  
 #  
     #def GetRamp(self):  
         #return self  
 #  
     #def SetNumGroups(self, num):  
         #if num < 0:  
             #return False  
 #  
         #self.index = 0  
 #  
         #return True  

Legend:
Removed from v.900  
changed lines
  Added in v.1359

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26