/[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 484 by jonathan, Fri Mar 7 18:20:10 2003 UTC revision 602 by jonathan, Fri Apr 4 12:12:18 2003 UTC
# Line 59  class Classification: Line 59  class Classification:
59          self.field = None          self.field = None
60          self.fieldType = None          self.fieldType = None
61          self.groups = []          self.groups = []
         self.__sendMessages = False  
62    
63          self.__ToggleMessages(False)          self.__setLayerLock = False
64    
65          self.SetDefaultGroup(ClassGroupDefault())          self.SetDefaultGroup(ClassGroupDefault())
66    
67          self.SetLayer(layer)          self.SetLayer(layer)
68          self.SetField(field)          self.SetField(field)
69    
         self.__ToggleMessages(True)  
   
70      def __iter__(self):      def __iter__(self):
71          return ClassIterator(self.groups)          return ClassIterator(self.groups)
72    
73      def __ToggleMessages(self, on):      def __SendNotification(self):
74          self.__sendMessages = on          """Notify the layer that this class has changed."""
75            if self.layer is not None:
76      def __SendMessage(self, message):              self.layer.ClassChanged()
         """Send the message 'message' to the parent layer."""  
         if self.__sendMessages and self.layer is not None:  
             self.layer.changed(message, self.layer)  
77            
78      def SetField(self, field = None):      def SetField(self, field):
79          """Set the name of the data table field to use.          """Set the name of the data table field to use.
80                    
81             If there is no layer then the field type is set to None,             If there is no layer then the field type is set to None,
# Line 92  class Classification: Line 88  class Classification:
88          if field == "":          if field == "":
89              field = None              field = None
90    
         self.field = field  
91    
92          if self.layer is not None:          if field is None:
93              fieldType = self.layer.GetFieldType(field)              if self.layer is not None:
94                    self.fieldType = None
95          else:          else:
96              fieldType = None              if self.layer is not None:
97                    fieldType = self.layer.GetFieldType(field)
98                    if fieldType is None:
99                        raise ValueError("'%s' was not found in the layer's table."
100                                         % self.field)
101    
102                    #
103                    # unfortunately we cannot call SetFieldType() because it
104                    # requires the layer to be None
105                    #
106                    self.fieldType = fieldType
107                    #self.SetFieldType(fieldType)
108    
109          self.SetFieldType(fieldType)          self.field = field
   
         # XXX: if fieldType comes back None then field isn't in the table!  
110    
111          self.__SendMessage(LAYER_LEGEND_CHANGED)          self.__SendNotification()
112    
113      def GetField(self):      def GetField(self):
114          """Return the name of the field."""          """Return the name of the field."""
# Line 114  class Classification: Line 119  class Classification:
119          return self.fieldType          return self.fieldType
120    
121      def SetFieldType(self, type):      def SetFieldType(self, type):
122          self.fieldType = type          """Set the type of the field used by this classification.
123    
124      def SetLayer(self, layer):          A ValueError is raised if the owning layer is not None and
125          """Set the owning Layer of this classification."""          'type' is different from the current field type.
126            """
127    
128          if __debug__:          if type != self.fieldType:
129              if layer is not None:              if self.layer is not None:
130                  assert(isinstance(layer, Thuban.Model.layer.Layer))                  raise ValueError()
131                else:
132                    self.fieldType = type
133                    self.__SendNotification()
134    
135        def SetLayer(self, layer):
136            """Set the owning Layer of this classification.
137    
138               A ValueError exception will be thrown either the field or
139               field type mismatch the information in the layer's table.
140            """
141    
142          # prevent infinite recursion when calling SetClassification()          # prevent infinite recursion when calling SetClassification()
143          if self.layer is not None and layer == self.layer:          if self.__setLayerLock: return
             return  
144    
145          self.layer = layer          self.__setLayerLock = True
         self.SetField(self.GetField()) # XXX: this sync's the fieldType  
146    
147          if self.layer is not None:          if layer is None:
148              self.layer.SetClassification(self)              if self.layer is not None:
149                    l = self.layer
150                    self.layer = None
151                    l.SetClassification(None)
152            else:
153                assert isinstance(layer, Thuban.Model.layer.Layer)
154    
155          #self.__SendMessage(LAYER_LEGEND_CHANGED)              old_layer = self.layer
156    
157                self.layer = layer
158    
159                try:
160                    self.SetField(self.GetField()) # this sync's the fieldType
161                except ValueError:
162                    self.layer = old_layer
163                    self.__setLayerLock = False
164                    raise ValueError
165                else:
166                    self.layer.SetClassification(self)
167    
168            self.__setLayerLock = False
169    
170      def GetLayer(self):      def GetLayer(self):
171          """Return the parent layer."""          """Return the parent layer."""
# Line 145  class Classification: Line 177  class Classification:
177             group -- group that the value maps to.             group -- group that the value maps to.
178          """          """
179    
180          assert(isinstance(group, ClassGroupDefault))          assert isinstance(group, ClassGroupDefault)
181          self.AddGroup(group)          self.AddGroup(group)
182    
183      def GetDefaultGroup(self):      def GetDefaultGroup(self):
# Line 163  class Classification: Line 195  class Classification:
195    
196          fill -- a Color object.          fill -- a Color object.
197          """          """
198          assert(isinstance(fill, Color))          assert isinstance(fill, Color)
199          self.GetDefaultGroup().GetProperties().SetFill(fill)          self.GetDefaultGroup().GetProperties().SetFill(fill)
200          self.__SendMessage(LAYER_LEGEND_CHANGED)          self.__SendNotification()
201                    
202      def GetDefaultFill(self):      def GetDefaultFill(self):
203          """Return the default fill color."""          """Return the default fill color."""
# Line 176  class Classification: Line 208  class Classification:
208    
209          color -- a Color object.          color -- a Color object.
210          """          """
211          assert(isinstance(color, Color))          assert isinstance(color, Color)
212          self.GetDefaultGroup().GetProperties().SetLineColor(color)          self.GetDefaultGroup().GetProperties().SetLineColor(color)
213          self.__SendMessage(LAYER_LEGEND_CHANGED)          self.__SendNotification()
214                    
215      def GetDefaultLineColor(self):      def GetDefaultLineColor(self):
216          """Return the default line color."""          """Return the default line color."""
# Line 189  class Classification: Line 221  class Classification:
221    
222          lineWidth -- an integer > 0.          lineWidth -- an integer > 0.
223          """          """
224          assert(isinstance(lineWidth, IntType))          assert isinstance(lineWidth, IntType)
225          self.GetDefaultGroup().GetProperties().SetLineWidth(lineWidth)          self.GetDefaultGroup().GetProperties().SetLineWidth(lineWidth)
226          self.__SendMessage(LAYER_LEGEND_CHANGED)          self.__SendNotification()
227                    
228      def GetDefaultLineWidth(self):      def GetDefaultLineWidth(self):
229          """Return the default line width."""          """Return the default line width."""
# Line 203  class Classification: Line 235  class Classification:
235          item -- this must be a valid ClassGroup object          item -- this must be a valid ClassGroup object
236          """          """
237    
238          assert(isinstance(item, ClassGroup))          assert isinstance(item, ClassGroup)
239    
240          if len(self.groups) > 0 and isinstance(item, ClassGroupDefault):          if len(self.groups) > 0 and isinstance(item, ClassGroupDefault):
241              self.groups[0] = item              self.groups[0] = item
             #self.SetDefaultGroup(item)  
242          else:          else:
243              self.groups.append(item)              self.groups.append(item)
244    
245          self.__SendMessage(LAYER_LEGEND_CHANGED)          self.__SendNotification()
246    
247      def GetGroup(self, value):      def GetGroup(self, value):
248          """Return the associated group, or the default group.          """Return the associated group, or the default group.
# Line 359  class ClassGroupProperties: Line 390  class ClassGroupProperties:
390      def SetProperties(self, props):      def SetProperties(self, props):
391          """Set this class's properties to those in class props."""          """Set this class's properties to those in class props."""
392    
393          assert(isinstance(props, ClassGroupProperties))          assert isinstance(props, ClassGroupProperties)
394          self.SetLineColor(props.GetLineColor())          self.SetLineColor(props.GetLineColor())
395          self.SetLineWidth(props.GetLineWidth())          self.SetLineWidth(props.GetLineWidth())
396          self.SetFill(props.GetFill())          self.SetFill(props.GetFill())
# Line 374  class ClassGroupProperties: Line 405  class ClassGroupProperties:
405          color -- the color of the line. This must be a Color object.          color -- the color of the line. This must be a Color object.
406          """          """
407    
408          assert(isinstance(color, Color))          assert isinstance(color, Color)
409          self.stroke = color          #self.stroke = Color(color.red, color.green, color.blue)
410            self.stroke = copy.copy(color)
411    
412      def GetLineWidth(self):      def GetLineWidth(self):
413          """Return the line width."""          """Return the line width."""
# Line 386  class ClassGroupProperties: Line 418  class ClassGroupProperties:
418    
419          lineWidth -- the new line width. This must be > 0.          lineWidth -- the new line width. This must be > 0.
420          """          """
421          assert(isinstance(lineWidth, IntType))          assert isinstance(lineWidth, IntType)
422          if (lineWidth < 1):          if (lineWidth < 1):
423              raise ValueError(_("lineWidth < 1"))              raise ValueError(_("lineWidth < 1"))
424    
# Line 402  class ClassGroupProperties: Line 434  class ClassGroupProperties:
434          fill -- the color of the fill. This must be a Color object.          fill -- the color of the fill. This must be a Color object.
435          """          """
436    
437          assert(isinstance(fill, Color))          assert isinstance(fill, Color)
438          self.fill = fill          self.fill = copy.copy(fill)
439            #self.fill = Color(fill.red, fill.green, fill.blue)
440    
441      def __eq__(self, other):      def __eq__(self, other):
442          """Return true if 'props' has the same attributes as this class"""          """Return true if 'props' has the same attributes as this class"""
# Line 419  class ClassGroupProperties: Line 452  class ClassGroupProperties:
452      def __copy__(self):      def __copy__(self):
453          return ClassGroupProperties(self)          return ClassGroupProperties(self)
454    
455        def __deepcopy__(self):
456            return ClassGroupProperties(self)
457    
458  class ClassGroup:  class ClassGroup:
459      """A base class for all Groups within a Classification"""      """A base class for all Groups within a Classification"""
460    
# Line 442  class ClassGroup: Line 478  class ClassGroup:
478          label -- a string representing the Group's label. This must          label -- a string representing the Group's label. This must
479                   not be None.                   not be None.
480          """          """
481          assert(isinstance(label, StringType))          assert isinstance(label, StringType)
482          self.label = label          self.label = label
483    
484        def GetDisplayText(self):
485            assert False, "GetDisplay must be overridden by subclass!"
486            return ""
487    
488      def Matches(self, value):      def Matches(self, value):
489          """Determines if this Group is associated with the given value.          """Determines if this Group is associated with the given value.
490    
491          Returns False. This needs to be overridden by all subclasses.          Returns False. This needs to be overridden by all subclasses.
492          """          """
493            assert False, "GetMatches must be overridden by subclass!"
494          return False          return False
495    
496      def GetProperties(self):      def GetProperties(self):
# Line 457  class ClassGroup: Line 498  class ClassGroup:
498    
499          Returns None. This needs to be overridden by all subclasses.          Returns None. This needs to be overridden by all subclasses.
500          """          """
501            assert False, "GetProperties must be overridden by subclass!"
502          return None          return None
503    
504            
# Line 519  class ClassGroupSingleton(ClassGroup): Line 561  class ClassGroupSingleton(ClassGroup):
561          """          """
562    
563          if prop is None: prop = ClassGroupProperties()          if prop is None: prop = ClassGroupProperties()
564          assert(isinstance(prop, ClassGroupProperties))          assert isinstance(prop, ClassGroupProperties)
565          self.prop = prop          self.prop = prop
566    
567        def GetDisplayText(self):
568            label = self.GetLabel()
569    
570            if label != "": return label
571    
572            return str(self.GetValue())
573    
574      def __eq__(self, other):      def __eq__(self, other):
575          return isinstance(other, ClassGroupSingleton) \          return isinstance(other, ClassGroupSingleton) \
576              and self.GetProperties() == other.GetProperties() \              and self.GetProperties() == other.GetProperties() \
# Line 569  class ClassGroupDefault(ClassGroup): Line 618  class ClassGroupDefault(ClassGroup):
618          """          """
619    
620          if prop is None: prop = ClassGroupProperties()          if prop is None: prop = ClassGroupProperties()
621          assert(isinstance(prop, ClassGroupProperties))          assert isinstance(prop, ClassGroupProperties)
622          self.prop = prop          self.prop = prop
623    
624        def GetDisplayText(self):
625            label = self.GetLabel()
626    
627            if label != "": return label
628    
629            return "DEFAULT"
630    
631      def __eq__(self, other):      def __eq__(self, other):
632          return isinstance(other, ClassGroupDefault) \          return isinstance(other, ClassGroupDefault) \
633              and self.GetProperties() == other.GetProperties()              and self.GetProperties() == other.GetProperties()
# Line 681  class ClassGroupRange(ClassGroup): Line 737  class ClassGroupRange(ClassGroup):
737                  a default set of properties is created.                  a default set of properties is created.
738          """          """
739          if prop is None: prop = ClassGroupProperties()          if prop is None: prop = ClassGroupProperties()
740          assert(isinstance(prop, ClassGroupProperties))          assert isinstance(prop, ClassGroupProperties)
741          self.prop = prop          self.prop = prop
742    
743        def GetDisplayText(self):
744            label = self.GetLabel()
745    
746            if label != "": return label
747    
748            return _("%s - %s") % (self.GetMin(), self.GetMax())
749    
750      def __eq__(self, other):      def __eq__(self, other):
751          return isinstance(other, ClassGroupRange) \          return isinstance(other, ClassGroupRange) \
752              and self.GetProperties() == other.GetProperties() \              and self.GetProperties() == other.GetProperties() \
# Line 715  class ClassGroupMap(ClassGroup): Line 778  class ClassGroupMap(ClassGroup):
778      def GetPropertiesFromValue(self, value):      def GetPropertiesFromValue(self, value):
779          pass          pass
780    
781        def GetDisplayText(self):
782            return "Map: " + self.map_type
783    
784      #      #
785      # built-in mappings      # built-in mappings
786      #      #

Legend:
Removed from v.484  
changed lines
  Added in v.602

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26