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

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

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

revision 1249 by jonathan, Fri Jun 20 09:27:19 2003 UTC revision 1353 by jonathan, Wed Jul 2 09:36:54 2003 UTC
# Line 29  from messages import \ Line 29  from messages import \
29      LAYER_LEGEND_CHANGED, \      LAYER_LEGEND_CHANGED, \
30      LAYER_VISIBILITY_CHANGED      LAYER_VISIBILITY_CHANGED
31    
32  from Thuban.Model.color import Color  from Thuban.Model.color import Color, Transparent, Black
33  from Thuban.Model.range import Range  from Thuban.Model.range import Range
34    
35  import Thuban.Model.layer  import Thuban.Model.layer
# Line 56  class Classification: Line 56  class Classification:
56          self.fieldType = None          self.fieldType = None
57          self.__groups = []          self.__groups = []
58    
         self.__setLayerLock = False  
   
59          self.SetDefaultGroup(ClassGroupDefault())          self.SetDefaultGroup(ClassGroupDefault())
60    
61          self.SetLayer(layer)          self.SetFieldInfo(field, None)
62          self.SetField(field)  
63            self._set_layer(layer)
64    
65      def __iter__(self):      def __iter__(self):
66          return ClassIterator(self.__groups)          return ClassIterator(self.__groups)
# Line 84  class Classification: Line 83  class Classification:
83          if self.layer is not None:          if self.layer is not None:
84              self.layer.ClassChanged()              self.layer.ClassChanged()
85            
     def SetField(self, field):  
         """Set the name of the data table field to use.  
           
         If there is no layer then the field type is set to None,  
         otherwise the layer is queried to find the type of the  
         field data  
   
         field -- if None then all values map to the default data  
         """  
   
         if field == "":  
             field = None  
   
   
         if field is None:  
             if self.layer is not None:  
                 self.fieldType = None  
         else:  
             if self.layer is not None:  
                 fieldType = self.layer.GetFieldType(field)  
                 if fieldType is None:  
                     raise ValueError("'%s' was not found in the layer's table."  
                                      % self.field)  
   
                 #  
                 # unfortunately we cannot call SetFieldType() because it  
                 # requires the layer to be None  
                 #  
                 self.fieldType = fieldType  
                 #self.SetFieldType(fieldType)  
   
         self.field = field  
   
         self.__SendNotification()  
   
86      def GetField(self):      def GetField(self):
87          """Return the name of the field."""          """Return the name of the field."""
88          return self.field          return self.field
# Line 127  class Classification: Line 91  class Classification:
91          """Return the field type."""          """Return the field type."""
92          return self.fieldType          return self.fieldType
93    
94      def SetFieldType(self, type):      def SetFieldInfo(self, name, type):
95          """Set the type of the field used by this classification.          """Set the classified field name to 'name' and it's field
96            type to 'type'
97    
98            If this classification has an owning layer a ValueError
99            exception will be thrown either the field or field type
100            mismatch the information in the layer's table.
101    
102            If the field info is successful set and the class has
103            an owning layer, the layer will be informed that the
104            classification has changed.
105            """
106    
107            if name == "":
108                name = None
109    
110            if self.layer is None:
111                self.field = name
112                self.fieldType = type
113            elif name is None:
114                self.field = None
115                self.fieldType = None
116            else:
117                #
118                # verify that the field exists in the layer and that
119                # the type is correct.
120                #
121                fieldType = self.layer.GetFieldType(name)
122                if fieldType is None:
123                    raise ValueError("'%s' was not found in the layer's table."
124                                     % self.field)
125                elif type is not None and fieldType != type:
126                    raise ValueError("type doesn't match layer's field type for %s"
127                                     % self.field)
128    
129          A ValueError is raised if the owning layer is not None and              self.field = name
130          'type' is different from the current field type.              self.fieldType = fieldType
         """  
131    
132          if type != self.fieldType:          self.__SendNotification()
             if self.layer is not None:  
                 raise ValueError()  
             else:  
                 self.fieldType = type  
                 self.__SendNotification()  
133    
134      def SetLayer(self, layer):      def _set_layer(self, layer):
135          """Set the owning Layer of this classification.          """Internal: Set the owning Layer of this classification.
136    
137          A ValueError exception will be thrown either the field or          A ValueError exception will be thrown either the field or
138          field type mismatch the information in the layer's table.          field type mismatch the information in the layer's table.
         """  
139    
140          # prevent infinite recursion when calling SetClassification()          If the layer is successful set, the layer will be informed
141          if self.__setLayerLock: return          that the classification has changed.
142            """
         self.__setLayerLock = True  
143    
144          if layer is None:          if layer is None:
145              if self.layer is not None:              self.layer = None
                 l = self.layer  
                 self.layer = None  
                 l.SetClassification(None)  
146          else:          else:
             assert isinstance(layer, Thuban.Model.layer.Layer)  
   
147              old_layer = self.layer              old_layer = self.layer
   
148              self.layer = layer              self.layer = layer
149    
150              try:              try:
151                  self.SetField(self.GetField()) # this sync's the fieldType                  # this sync's the fieldType
152                    # and sends a notification to the layer
153                    self.SetFieldInfo(self.GetField(), None)
154              except ValueError:              except ValueError:
155                  self.layer = old_layer                  self.layer = old_layer
                 self.__setLayerLock = False  
156                  raise ValueError                  raise ValueError
             else:  
                 self.layer.SetClassification(self)  
   
         self.__setLayerLock = False  
157    
158      def GetLayer(self):      def GetLayer(self):
159          """Return the parent layer."""          """Return the parent layer."""
160          return self.layer          return self.layer
161    
   
162      #      #
163      # these SetDefault* methods are really only provided for      # these SetDefault* methods are really only provided for
164      # some backward compatibility. they should be considered      # some backward compatibility. they should be considered
# Line 321  class Classification: Line 299  class Classification:
299          items = []          items = []
300    
301          def build_color_item(text, color):          def build_color_item(text, color):
302              if color is Color.Transparent:              if color is Transparent:
303                  return ("%s: %s" % (text, _("None")), None)                  return ("%s: %s" % (text, _("None")), None)
304    
305              return ("%s: (%.3f, %.3f, %.3f)" %              return ("%s: (%.3f, %.3f, %.3f)" %
# Line 418  class ClassGroupProperties: Line 396  class ClassGroupProperties:
396    
397          props -- a ClassGroupProperties object. The class is copied if          props -- a ClassGroupProperties object. The class is copied if
398                   prop is not None. Otherwise, a default set of properties                   prop is not None. Otherwise, a default set of properties
399                   is created such that: line color = Color.Black, line width = 1,                   is created such that: line color = Black, line width = 1,
400                   and fill color = Color.Transparent                   and fill color = Transparent
401          """          """
402    
403          #self.stroke = None          #self.stroke = None
# Line 429  class ClassGroupProperties: Line 407  class ClassGroupProperties:
407          if props is not None:          if props is not None:
408              self.SetProperties(props)              self.SetProperties(props)
409          else:          else:
410              self.SetLineColor(Color.Black)              self.SetLineColor(Black)
411              self.SetLineWidth(1)              self.SetLineWidth(1)
412              self.SetFill(Color.Transparent)              self.SetFill(Transparent)
413    
414      def SetProperties(self, props):      def SetProperties(self, props):
415          """Set this class's properties to those in class props."""          """Set this class's properties to those in class props."""
# Line 681  class ClassGroupRange(ClassGroup): Line 659  class ClassGroupRange(ClassGroup):
659      """A Group that represents a range of values that map to the same      """A Group that represents a range of values that map to the same
660         set of properties."""         set of properties."""
661    
662      def __init__(self, min = 0, max = 1, props = None, label = "", group=None):      def __init__(self, _range = (0,1), props = None, label = "", group=None):
663          """Constructor.          """Constructor.
664    
665          The minumum value must be strictly less than the maximum.          The minumum value must be strictly less than the maximum.
666    
667          min -- the minimum range value          _range -- either a tuple (min, max) where min < max or
668                      a Range object
         max -- the maximum range value  
669    
670          prop -- a ClassGroupProperites object. If prop is None a default          prop -- a ClassGroupProperites object. If prop is None a default
671                   set of properties is created.                   set of properties is created.
# Line 701  class ClassGroupRange(ClassGroup): Line 678  class ClassGroupRange(ClassGroup):
678          #self.__min = self.__max = 0          #self.__min = self.__max = 0
679          #self.__range = Range("[" + repr(float(min)) + ";" +          #self.__range = Range("[" + repr(float(min)) + ";" +
680                                     #repr(float(max)) + "[")                                     #repr(float(max)) + "[")
681          self.SetRange(min, max)          self.SetRange(_range)
682    
683      def __copy__(self):      def __copy__(self):
684          return ClassGroupRange(min = self.__range,          return ClassGroupRange(self.__range,
                                max = None,  
685                                 props = self.GetProperties(),                                 props = self.GetProperties(),
686                                 label = self.GetLabel())                                 label = self.GetLabel())
687    
688      def __deepcopy__(self, memo):      def __deepcopy__(self, memo):
689          return ClassGroupRange(min = copy.copy(self.__range),          return ClassGroupRange(copy.copy(self.__range),
                                max = copy.copy(self.GetMax()),  
690                                 group = self)                                 group = self)
691    
692      def GetMin(self):      def GetMin(self):
# Line 725  class ClassGroupRange(ClassGroup): Line 700  class ClassGroupRange(ClassGroup):
700                 maximum value. Use SetRange() to change both min and max values.                 maximum value. Use SetRange() to change both min and max values.
701          """          """
702            
703          self.SetRange(min, self.__range.GetRange()[2])          self.SetRange((min, self.__range.GetRange()[2]))
704    
705      def GetMax(self):      def GetMax(self):
706          """Return the range's maximum value."""          """Return the range's maximum value."""
# Line 737  class ClassGroupRange(ClassGroup): Line 712  class ClassGroupRange(ClassGroup):
712          max -- the new maximum. Note that this must be greater than the current          max -- the new maximum. Note that this must be greater than the current
713                 minimum value. Use SetRange() to change both min and max values.                 minimum value. Use SetRange() to change both min and max values.
714          """          """
715          self.SetRange(self.__range.GetRange()[1], max)          self.SetRange((self.__range.GetRange()[1], max))
716    
717      def SetRange(self, min, max = None):      def SetRange(self, _range):
718          """Set a new range.          """Set a new range.
719    
720          Note that min must be strictly less than max.          _range -- Either a tuple (min, max) where min < max or
721                      a Range object.
722    
723          min -- the new minimum value          Raises ValueError on error.
         min -- the new maximum value  
724          """          """
725    
726          if isinstance(min, Range):          if isinstance(_range, Range):
727              self.__range = min              self.__range = _range
728            elif isinstance(_range, types.TupleType) and len(_range) == 2:
729                self.__range = Range(("[", _range[0], _range[1], "["))
730          else:          else:
731              if max is None:              raise ValueError()
                 raise ValueError()  
   
             self.__range = Range(("[", min, max, "["))  
732    
733      def GetRange(self):      def GetRange(self):
734          """Return the range as a string"""          """Return the range as a string"""

Legend:
Removed from v.1249  
changed lines
  Added in v.1353

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26