/[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 1157 by jonathan, Thu Jun 12 12:39:54 2003 UTC revision 1335 by jonathan, Tue Jul 1 16:09:09 2003 UTC
# Line 15  __version__ = "$Revision$" Line 15  __version__ = "$Revision$"
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  def generate_singletons(_list, numGroups, ramp):  def generate_singletons(_list, ramp):
24      """Generate a new classification consisting solely of singletons.      """Generate a new classification consisting solely of singletons.
25    
26      The resulting classification will consist of at most 'numGroups'      The resulting classification will consist of one group for each
27      groups whose group properties ramp between 'prop1' and 'prop2'. There      item in _list whose properties ramp between 'prop1' and 'prop2'.
     could be fewer groups if '_list' contains fewer that 'numGroups' items.  
28    
29      _list -- any object that implements the iterator interface      _list -- any object that implements the iterator interface
30    
     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.  
   
31      ramp -- an object which implements the CustomRamp interface      ramp -- an object which implements the CustomRamp interface
32      """      """
33    
34      clazz = Classification()      clazz = Classification()
     if numGroups == 0: return clazz  
   
     ramp.SetNumGroups(numGroups)  
35    
36      for value, prop in zip(_list, ramp):      i = 0
37        for value in _list:
38            prop = ramp.GetProperties(float(i) / len(_list))
39          clazz.AppendGroup(ClassGroupSingleton(value, prop))          clazz.AppendGroup(ClassGroupSingleton(value, prop))
40            i += 1
41    
42      return clazz      return clazz
43    
# Line 58  def generate_uniform_distribution(min, m Line 52  def generate_uniform_distribution(min, m
52      """      """
53    
54      clazz = Classification()      clazz = Classification()
     if numGroups == 0: return clazz  
   
     ramp.SetNumGroups(numGroups)  
55    
56      cur_min = min      cur_min = min
57    
     i = 1  
58      end = "["      end = "["
59      for prop in ramp:      for i in range(1, numGroups + 1):
60    
61            prop = ramp.GetProperties(float(i-1) / numGroups)
62    
63          if intStep:          if intStep:
64              cur_max = min + int(round((i * (max - min + 1)) / float(numGroups)))              cur_max = min + int(round((i * (max - min + 1)) / float(numGroups)))
# Line 78  def generate_uniform_distribution(min, m Line 70  def generate_uniform_distribution(min, m
70              end = "]"              end = "]"
71    
72          if cur_min == cur_max:          if cur_min == cur_max:
73              range = Range(("[", cur_min, cur_max, "]"))              _range = Range(("[", cur_min, cur_max, "]"))
74          else:          else:
75              range = Range(("[", cur_min, cur_max, end))              _range = Range(("[", cur_min, cur_max, end))
76    
77          clazz.AppendGroup(ClassGroupRange(range, None, prop))          clazz.AppendGroup(ClassGroupRange(_range, None, prop))
78    
79          cur_min = cur_max          cur_min = cur_max
         i += 1  
80    
81      return clazz      return clazz
82    
   
83  def generate_quantiles(_list, percents, ramp, _range):  def generate_quantiles(_list, percents, ramp, _range):
84      """Generates a Classification which has groups of ranges that      """Generates a Classification which has groups of ranges that
85      represent quantiles of _list at the percentages given in percents.      represent quantiles of _list at the percentages given in percents.
# Line 126  def generate_quantiles(_list, percents, Line 116  def generate_quantiles(_list, percents,
116    
117              adjusted = quantiles[0]              adjusted = quantiles[0]
118    
             ramp.SetNumGroups(numGroups)  
   
119              start, min, endMax, right = _range.GetRange()              start, min, endMax, right = _range.GetRange()
120    
121              oldp = 0              oldp = 0
122              i = 1              i = 1
123              end = "]"              end = "]"
124    
125              for (q, p), prop in zip(quantiles[3], ramp):              for (q, p) in quantiles[3]:
126    
127                    prop = ramp.GetProperties(float(i-1) / numGroups)
128    
129                  if i == numGroups:                  if i == numGroups:
130                      max = endMax                      max = endMax
131                      end = right                      end = right
# Line 187  def GenQuantiles0(_list, percents, ramp, Line 178  def GenQuantiles0(_list, percents, ramp,
178          if numGroups > 0:          if numGroups > 0:
179              adjusted = quantiles[0]              adjusted = quantiles[0]
180    
             ramp.SetNumGroups(numGroups)  
   
181              start, min, endMax, right = _range.GetRange()              start, min, endMax, right = _range.GetRange()
182    
183              class0 = quantiles[3][0]              class0 = quantiles[3][0]
# Line 197  def GenQuantiles0(_list, percents, ramp, Line 186  def GenQuantiles0(_list, percents, ramp,
186              i = 1              i = 1
187              end = "]"              end = "]"
188    
189              for (q, p), prop in zip(quantiles[3][1:], ramp):              for (q, p) in quantiles[3][1:]:
190                    prop = ramp.GetProperties(float(i) / numGroups)
191    
192                  if i == numGroups:                  if i == numGroups:
193                      max = endMax                      max = endMax
194                      end = right                      end = right
# Line 256  def calculate_quantiles(_list, percents, Line 247  def calculate_quantiles(_list, percents,
247      if len(percents) <= 1:      if len(percents) <= 1:
248          raise ValueError("percents parameter must have more than one item")          raise ValueError("percents parameter must have more than one item")
249    
250      if percents[len(percents) - 1] != 1.0:      if percents[-1] != 1.0:
251          raise ValueError("percents does not cover the entire range")          raise ValueError("percents does not cover the entire range")
252    
253      #      #
# Line 375  def calculate_quantiles(_list, percents, Line 366  def calculate_quantiles(_list, percents,
366                  [(q, (q - minIndex+1) / float(numValues)) \                  [(q, (q - minIndex+1) / float(numValues)) \
367                   for q in quantiles])                   for q in quantiles])
368    
 CLR  = 0  
 STEP = 1  
369  class CustomRamp:  class CustomRamp:
370    
371      def __init__(self, prop1, prop2):      def __init__(self, prop1, prop2):
372          self.prop1 = prop1          self.prop1 = prop1
373          self.prop2 = prop2          self.prop2 = prop2
374    
         self.count = 0  
   
     def __iter__(self):  
         return self  
   
375      def GetRamp(self):      def GetRamp(self):
376          return self          return self
377    
378      def SetNumGroups(self, num):      def GetProperties(self, index):
379            """Return a ClassGroupProperties object whose properties
380          if num <= 0:          represent a point at 'index' between prop1 and prop2 in
381              return False          the constructor.
382    
383          self.count = int(num)          index -- a value such that 0 <= index <= 1
384          num = float(num)          """
385    
386          prop1 = self.prop1          if not (0 <= index <= 1):
387          prop2 = self.prop2              raise ValueError(_("invalid index"))
388    
389          clr = prop1.GetLineColor()          newProps = ClassGroupProperties()
390          lineColor2 = prop2.GetLineColor()  
391                    color1 = self.prop1.GetLineColor()
392          self.noLine = clr is not Color.Transparent \          color2 = self.prop2.GetLineColor()
393                          and lineColor2 is not Color.Transparent  
394            self.__SetProperty(color1, color2, index, newProps.SetLineColor)
395            self.__SetProperty(color1, color2, index, newProps.SetFill)
396          self.lineInfo = self.__GetColorInfo(prop1.GetLineColor(),  
397                                              prop2.GetLineColor(),          w = (self.prop2.GetLineWidth() - self.prop1.GetLineWidth()) \
398                                              num)              * index \
399                + self.prop1.GetLineWidth()
400          self.fillInfo = self.__GetColorInfo(prop1.GetFill(),  
401                                              prop2.GetFill(),          newProps.SetLineWidth(int(round(w)))
402                                              num)  
403            return newProps
404          self.lineWidth = prop1.GetLineWidth()  
405          self.lineWidthStep = (prop2.GetLineWidth() - self.lineWidth) / num      def __SetProperty(self, color1, color2, index, setf):
406    
407          return True          if color1 is Transparent and color2 is Transparent:
408                setf(Transparent)
409      def next(self):          elif color1 is Transparent:
410          if self.count == 0:              setf(Color(
411              raise StopIteration                   color2.red   * index,
412                     color2.green * index,
413          prop = ClassGroupProperties()                   color2.blue  * index))
414            elif color2 is Transparent:
415          if self.lineInfo is None:              setf(Color(
416              prop.SetLineColor(Color.Transparent)                   color1.red   * index,
417          else:                   color1.green * index,
418              prop.SetLineColor(Color(self.lineInfo[CLR][0] / 255,                   color1.blue  * index))
                                     self.lineInfo[CLR][1] / 255,  
                                     self.lineInfo[CLR][2] / 255))  
   
             self.lineInfo[CLR][0] += self.lineInfo[STEP][0]  
             self.lineInfo[CLR][1] += self.lineInfo[STEP][1]  
             self.lineInfo[CLR][2] += self.lineInfo[STEP][2]  
   
         if self.fillInfo is None:  
             prop.SetFill(Color.Transparent)  
419          else:          else:
420              prop.SetFill(Color(self.fillInfo[CLR][0] / 255,              setf(Color(
421                              self.fillInfo[CLR][1] / 255,                  (color2.red   - color1.red)   * index + color1.red,
422                              self.fillInfo[CLR][2] / 255))                  (color2.green - color1.green) * index + color1.green,
423                    (color2.blue  - color1.blue)  * index + color1.blue))
             self.fillInfo[CLR][0] += self.fillInfo[STEP][0]  
             self.fillInfo[CLR][1] += self.fillInfo[STEP][1]  
             self.fillInfo[CLR][2] += self.fillInfo[STEP][2]  
   
   
         prop.SetLineWidth(int(self.lineWidth))  
         self.lineWidth        += self.lineWidthStep  
   
         self.count -= 1  
   
         return prop  
   
     def __GetColorInfo(self, color1, color2, numGroups):  
   
         if color1 is Color.Transparent and color2 is Color.Transparent:  
             #  
             # 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)  
   
   
         return (color, step)  
424    
425  class MonochromaticRamp(CustomRamp):  class MonochromaticRamp(CustomRamp):
426      def __init__(self, start, end):      def __init__(self, start, end):
# Line 498  class MonochromaticRamp(CustomRamp): Line 434  class MonochromaticRamp(CustomRamp):
434    
435          CustomRamp.__init__(self, sp, ep)          CustomRamp.__init__(self, sp, ep)
436    
437  class GreyRamp(MonochromaticRamp):  GreyRamp       = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, 0))
438      def __init__(self):  RedRamp        = MonochromaticRamp(Color(1, 1, 1),  Color(.8, 0, 0))
439          MonochromaticRamp.__init__(self, Color(1, 1, 1), Color(0, 0, 0))  GreenRamp      = MonochromaticRamp(Color(1, 1, 1),  Color(0, .8, 0))
440    BlueRamp       = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, .8))
441  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))  
442    
443  class HotToColdRamp:  class HotToColdRamp:
444    
     def __iter__(self):  
         return self  
           
445      def GetRamp(self):      def GetRamp(self):
446          return self          return self
447    
448      def SetNumGroups(self, num):      def GetProperties(self, index):
449          if num < 0:          """Return a ClassGroupProperties object whose properties
450              return False          represent a point at 'index' between "hot" and "cold".
451    
452          self.num = float(num)          index -- a value such that 0 <= index <= 1
453          self.index = 0          """
   
         return True  
   
     def next(self):  
         if self.index == self.num:  
             raise StopIteration  
454    
455          clr = [1.0, 1.0, 1.0]          clr = [1.0, 1.0, 1.0]
456    
457          if self.index < (.25 * self.num):          if index < .25:
458              clr[0] = 0              clr[0] = 0
459              clr[1] = 4 * self.index / self.num              clr[1] = 4 * index
460          elif self.index < (.5 * self.num):          elif index < .5:
461              clr[0] = 0              clr[0] = 0
462              clr[2] = 1 + 4 * (.25 * self.num - self.index) / self.num              clr[2] = 1 + 4 * (.25 - index)
463          elif self.index < (.75 * self.num):          elif index < .75:
464              clr[0] = 4 * (self.index - .5 * self.num) / self.num              clr[0] = 4 * (index - .5)
465              clr[2] = 0              clr[2] = 0
466          else:          else:
467              clr[1] = 1 + 4 * (.75 * self.num - self.index) / self.num              clr[1] = 1 + 4 * (.75 - index)
468              clr[2] = 0              clr[2] = 0
469    
         self.index += 1  
   
470          prop = ClassGroupProperties()          prop = ClassGroupProperties()
471          prop.SetLineColor(Color(clr[0], clr[1], clr[2]))          prop.SetLineColor(Color(clr[0], clr[1], clr[2]))
472          prop.SetFill(Color(clr[0], clr[1], clr[2]))          prop.SetFill(Color(clr[0], clr[1], clr[2]))
473    
474          return prop          return prop
475    

Legend:
Removed from v.1157  
changed lines
  Added in v.1335

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26