/[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 1387 by jonathan, Thu Jul 10 14:53:03 2003 UTC revision 1759 by bh, Fri Sep 26 18:36:01 2003 UTC
# Line 20  from range import Range Line 20  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, ramp, fixes=(None, None, None)):  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 one group for each      The resulting classification will consist of one group for each
# Line 29  def generate_singletons(_list, ramp, fix Line 29  def generate_singletons(_list, ramp, fix
29      _list -- a list of values for each singleton      _list -- a list of values for each singleton
30    
31      ramp -- an object which implements the CustomRamp interface      ramp -- an object which implements the CustomRamp interface
   
     fixes -- a tuple (lineColor, lineWidth, fillColor) such that  
              if any item is not None, the appropriate property will  
              be fixed to that item value.  
32      """      """
33    
34      clazz = Classification()      clazz = Classification()
# Line 43  def generate_singletons(_list, ramp, fix Line 39  def generate_singletons(_list, ramp, fix
39    
40      for value in _list:      for value in _list:
41          prop = ramp.GetProperties(i / maxValue)          prop = ramp.GetProperties(i / maxValue)
         if fixes[0] is not None: prop.SetLineColor(fixes[0])  
         if fixes[1] is not None: prop.SetLineWidth(fixes[1])  
         if fixes[2] is not None: prop.SetFill(fixes[2])  
42          clazz.AppendGroup(ClassGroupSingleton(value, prop))          clazz.AppendGroup(ClassGroupSingleton(value, prop))
43          i += 1          i += 1
44    
45      return clazz      return clazz
46    
47  def generate_uniform_distribution(min, max, numGroups, ramp, intStep = False,  def generate_uniform_distribution(min, max, numGroups, ramp, intStep = False):
                                   fixes = (None, None, None)):  
48      """Generate a classification with numGroups range groups      """Generate a classification with numGroups range groups
49      each with the same interval.      each with the same interval.
50    
# Line 60  def generate_uniform_distribution(min, m Line 52  def generate_uniform_distribution(min, m
52                 Useful if the values are integers but the                 Useful if the values are integers but the
53                 number of groups specified doesn't evenly                 number of groups specified doesn't evenly
54                 divide (max - min).                 divide (max - min).
   
     fixes -- a tuple (lineColor, lineWidth, fillColor) such that  
              if any item is not None, the appropriate property will  
              be fixed to that item value.  
55      """      """
56    
57      clazz = Classification()      clazz = Classification()
# Line 92  def generate_uniform_distribution(min, m Line 80  def generate_uniform_distribution(min, m
80          else:          else:
81              _range = Range(("[", cur_min, cur_max, end))              _range = Range(("[", cur_min, cur_max, end))
82    
         if fixes[0] is not None: prop.SetLineColor(fixes[0])  
         if fixes[1] is not None: prop.SetLineWidth(fixes[1])  
         if fixes[2] is not None: prop.SetFill(fixes[2])  
   
83          clazz.AppendGroup(ClassGroupRange(_range, prop))          clazz.AppendGroup(ClassGroupRange(_range, prop))
84    
85          cur_min = cur_max          cur_min = cur_max
86    
87      return clazz      return clazz
88    
89  def generate_quantiles(_list, percents, ramp, _range, fixes=(None, None, None)):  def generate_quantiles(_list, percents, ramp, _range):
90      """Generates a Classification which has groups of ranges that      """Generates a Classification which has groups of ranges that
91      represent quantiles of _list at the percentages given in percents.      represent quantiles of _list at the percentages given in percents.
92      Only the values that fall within _range are considered.      Only the values that fall within _range are considered.
# Line 122  def generate_quantiles(_list, percents, Line 106  def generate_quantiles(_list, percents,
106    
107      _range -- a Range object      _range -- a Range object
108    
     fixes -- a tuple (lineColor, lineWidth, fillColor) such that  
              if any item is not None, the appropriate property will  
              be fixed to that item value.  
   
109      Raises a Value Error if 'percents' has fewer than two items, or      Raises a Value Error if 'percents' has fewer than two items, or
110      does not cover the entire range.      does not cover the entire range.
111      """      """
# Line 160  def generate_quantiles(_list, percents, Line 140  def generate_quantiles(_list, percents,
140                  else:                  else:
141                      max = _list[q]                      max = _list[q]
142    
                 if fixes[0] is not None: prop.SetLineColor(fixes[0])  
                 if fixes[1] is not None: prop.SetLineWidth(fixes[1])  
                 if fixes[2] is not None: prop.SetFill(fixes[2])  
   
143                  group = ClassGroupRange(Range((start, min, max, end)), prop)                  group = ClassGroupRange(Range((start, min, max, end)), prop)
144            
145                  group.SetLabel("%s%% - %s%%" % (round(oldp*100, 2),                  group.SetLabel("%s%% - %s%%" % (round(oldp*100, 2),
# Line 176  def generate_quantiles(_list, percents, Line 152  def generate_quantiles(_list, percents,
152    
153      return (adjusted, clazz)      return (adjusted, clazz)
154    
 def GenQuantiles0(_list, percents, ramp, _range):  
     """Same as GenQuantiles, but the first class won't be added to  
     the classification.  
   
     Returns a tuple (adjusted, Classification, upper_class0) where  
     upper_class0 is the highest value inside the first class.  
   
     _list -- a sort list of values  
   
     percents -- a sorted list of floats in the range 0.0-1.0 which  
                 represent the upper bound of each quantile. the  
                 union of all percentiles should be the entire  
                 range from 0.0-1.0  
   
     ramp -- an object which implements the CustomRamp interface  
   
     _range -- a Range object  
   
     Raises a Value Error if 'percents' has fewer than two items, or  
     does not cover the entire range.  
     """  
   
     clazz = Classification()  
     quantiles = calculate_quantiles(_list, percents, _range)  
     adjusted = True  
   
     if quantiles is not None:  
   
         numGroups = len(quantiles[3]) - 1  
   
         if numGroups > 0:  
             adjusted = quantiles[0]  
   
             start, min, endMax, right = _range.GetRange()  
   
             class0 = quantiles[3][0]  
             min = _list[class0[0]]  
             oldp = class0[1]  
             i = 1  
             end = "]"  
   
             maxValue = float(numGroups - 1)  
             if maxValue < 1: maxValue = 1  
             for (q, p) in quantiles[3][1:]:  
                 prop = ramp.GetProperties(float(i-1) / maxValue)  
   
                 if i == numGroups:  
                     max = endMax  
                     end = right  
                 else:  
                     max = _list[q]  
   
                 group = ClassGroupRange(Range((start, min, max, end)), 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, _list[class0[0]])  
   
155    
156  def calculate_quantiles(_list, percents, _range):  def calculate_quantiles(_list, percents, _range):
157      """Calculate quantiles for the given _list of percents from the      """Calculate quantiles for the given _list of percents from the
# Line 401  def calculate_quantiles(_list, percents, Line 313  def calculate_quantiles(_list, percents,
313  class CustomRamp:  class CustomRamp:
314    
315      def __init__(self, prop1, prop2):      def __init__(self, prop1, prop2):
316            """Create a ramp between prop1 and prop2."""
317          self.prop1 = prop1          self.prop1 = prop1
318          self.prop2 = prop2          self.prop2 = prop2
319    
320      def GetRamp(self):      def GetRamp(self):
321            """Return this ramp."""
322          return self          return self
323    
324      def GetProperties(self, index):      def GetProperties(self, index):
# Line 434  class CustomRamp: Line 348  class CustomRamp:
348          return newProps          return newProps
349    
350      def __SetProperty(self, color1, color2, index, setf):      def __SetProperty(self, color1, color2, index, setf):
351            """Use setf to set the appropriate property for the point
352            index percent between color1 and color2. setf is a function
353            to call that accepts a Color object or Transparent.
354            """
355    
356          if color1 is Transparent and color2 is Transparent:          if color1 is Transparent and color2 is Transparent:
357              setf(Transparent)              setf(Transparent)
# Line 454  class CustomRamp: Line 372  class CustomRamp:
372                  (color2.blue  - color1.blue)  * index + color1.blue))                  (color2.blue  - color1.blue)  * index + color1.blue))
373    
374  class MonochromaticRamp(CustomRamp):  class MonochromaticRamp(CustomRamp):
375        """Helper class to make ramps between two colors."""
376    
377      def __init__(self, start, end):      def __init__(self, start, end):
378            """Create a Monochromatic Ramp.
379    
380            start -- starting Color
381    
382            end -- ending Color
383            """
384          sp = ClassGroupProperties()          sp = ClassGroupProperties()
385          sp.SetLineColor(start)          sp.SetLineColor(start)
386          sp.SetFill(start)          sp.SetFill(start)
# Line 465  class MonochromaticRamp(CustomRamp): Line 391  class MonochromaticRamp(CustomRamp):
391    
392          CustomRamp.__init__(self, sp, ep)          CustomRamp.__init__(self, sp, ep)
393    
394  GreyRamp       = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, 0))  grey_ramp         = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, 0))
395  RedRamp        = MonochromaticRamp(Color(1, 1, 1),  Color(.8, 0, 0))  red_ramp          = MonochromaticRamp(Color(1, 1, 1),  Color(.8, 0, 0))
396  GreenRamp      = MonochromaticRamp(Color(1, 1, 1),  Color(0, .8, 0))  green_ramp        = MonochromaticRamp(Color(1, 1, 1),  Color(0, .8, 0))
397  BlueRamp       = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, .8))  blue_ramp         = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, .8))
398  GreenToRedRamp = MonochromaticRamp(Color(0, .8, 0), Color(1, 0, 0))  green_to_red_ramp = MonochromaticRamp(Color(0, .8, 0), Color(1, 0, 0))
399    
400  class HotToColdRamp:  class HotToColdRamp:
401        """A ramp that generates properties with colors ranging from
402        'hot' colors (e.g. red, orange) to 'cold' colors (e.g. green, blue)
403        """
404    
405      def GetRamp(self):      def GetRamp(self):
406            """Return this ramp."""
407          return self          return self
408    
409      def GetProperties(self, index):      def GetProperties(self, index):
# Line 504  class HotToColdRamp: Line 434  class HotToColdRamp:
434    
435          return prop          return prop
436    
437    class FixedRamp:
438        """FixedRamp allows particular properties of a ramp to be
439        held constant over the ramp.
440        """
441    
442        def __init__(self, ramp, fixes):
443            """
444            ramp -- a source ramp to get the default properties
445    
446            fixes -- a tuple (lineColor, lineWidth, fillColor) such that
447                 if any item is not None, the appropriate property will
448                 be fixed to that item value.
449            """
450    
451            self.fixes = fixes
452            self.ramp = ramp
453    
454        def GetRamp(self):
455            """Return this ramp."""
456            return self
457    
458        def GetProperties(self, index):
459            """Return a ClassGroupProperties object whose properties
460            represent a point at 'index' between the properties in
461            the ramp that initialized this FixedRamp.
462    
463            index -- a value such that 0 <= index <= 1
464            """
465    
466            props = self.ramp.GetProperties(index)
467            if self.fixes[0] is not None: props.SetLineColor(self.fixes[0])
468            if self.fixes[1] is not None: props.SetLineWidth(self.fixes[1])
469            if self.fixes[2] is not None: props.SetFill(self.fixes[2])
470    
471            return props

Legend:
Removed from v.1387  
changed lines
  Added in v.1759

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26