/[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 613 by jonathan, Mon Apr 7 08:55:55 2003 UTC revision 873 by jonathan, Fri May 9 16:30:54 2003 UTC
# Line 23  on the mapping algorithm. Line 23  on the mapping algorithm.
23  # fix for people using python2.1  # fix for people using python2.1
24  from __future__ import nested_scopes  from __future__ import nested_scopes
25    
26  import copy  import copy, operator
27    
28  from Thuban import _  from Thuban import _
29    
30  from types import *  import types
31    
32  from messages import \  from messages import \
33      LAYER_PROJECTION_CHANGED, \      LAYER_PROJECTION_CHANGED, \
# Line 35  from messages import \ Line 35  from messages import \
35      LAYER_VISIBILITY_CHANGED      LAYER_VISIBILITY_CHANGED
36    
37  from Thuban.Model.color import Color  from Thuban.Model.color import Color
38    from Thuban.Model.range import Range
39    
40  import Thuban.Model.layer  import Thuban.Model.layer
41    
# Line 73  class Classification: Line 74  class Classification:
74      def __deepcopy__(self, memo):      def __deepcopy__(self, memo):
75          clazz = Classification()          clazz = Classification()
76    
77            # note: the only thing that isn't copied is the layer reference
78            clazz.field = self.field
79            clazz.fieldType = self.fieldType
80          clazz.__groups[0] = copy.deepcopy(self.__groups[0])          clazz.__groups[0] = copy.deepcopy(self.__groups[0])
81    
82          for i in range(1, len(self.__groups)):          for i in range(1, len(self.__groups)):
83              clazz.__groups.append(copy.deepcopy(self.__groups[i]))              clazz.__groups.append(copy.deepcopy(self.__groups[i]))
84    
         print "Classification.__deepcopy__"  
85          return clazz          return clazz
86    
87      def __SendNotification(self):      def __SendNotification(self):
# Line 220  class Classification: Line 223  class Classification:
223    
224          lineWidth -- an integer > 0.          lineWidth -- an integer > 0.
225          """          """
226          assert isinstance(lineWidth, IntType)          assert isinstance(lineWidth, types.IntType)
227          self.GetDefaultGroup().GetProperties().SetLineWidth(lineWidth)          self.GetDefaultGroup().GetProperties().SetLineWidth(lineWidth)
228          self.__SendNotification()          self.__SendNotification()
229                    
# Line 426  class ClassGroupProperties: Line 429  class ClassGroupProperties:
429                   and fill color = Color.Transparent                   and fill color = Color.Transparent
430          """          """
431    
432          self.stroke = None          #self.stroke = None
433          self.strokeWidth = 0          #self.strokeWidth = 0
434          self.fill = None          #self.fill = None
435    
436          if props is not None:          if props is not None:
437              self.SetProperties(props)              self.SetProperties(props)
# Line 447  class ClassGroupProperties: Line 450  class ClassGroupProperties:
450                    
451      def GetLineColor(self):      def GetLineColor(self):
452          """Return the line color as a Color object."""          """Return the line color as a Color object."""
453          return self.stroke          return self.__stroke
454    
455      def SetLineColor(self, color):      def SetLineColor(self, color):
456          """Set the line color.          """Set the line color.
# Line 456  class ClassGroupProperties: Line 459  class ClassGroupProperties:
459          """          """
460    
461          assert isinstance(color, Color)          assert isinstance(color, Color)
462          self.stroke = color          self.__stroke = color
463    
464      def GetLineWidth(self):      def GetLineWidth(self):
465          """Return the line width."""          """Return the line width."""
466          return self.strokeWidth          return self.__strokeWidth
467    
468      def SetLineWidth(self, lineWidth):      def SetLineWidth(self, lineWidth):
469          """Set the line width.          """Set the line width.
470    
471          lineWidth -- the new line width. This must be > 0.          lineWidth -- the new line width. This must be > 0.
472          """          """
473          assert isinstance(lineWidth, IntType)          assert isinstance(lineWidth, types.IntType)
474          if (lineWidth < 1):          if (lineWidth < 1):
475              raise ValueError(_("lineWidth < 1"))              raise ValueError(_("lineWidth < 1"))
476    
477          self.strokeWidth = lineWidth          self.__strokeWidth = lineWidth
478    
479      def GetFill(self):      def GetFill(self):
480          """Return the fill color as a Color object."""          """Return the fill color as a Color object."""
481          return self.fill          return self.__fill
482    
483      def SetFill(self, fill):      def SetFill(self, fill):
484          """Set the fill color.          """Set the fill color.
# Line 484  class ClassGroupProperties: Line 487  class ClassGroupProperties:
487          """          """
488    
489          assert isinstance(fill, Color)          assert isinstance(fill, Color)
490          self.fill = fill          self.__fill = fill
491    
492      def __eq__(self, other):      def __eq__(self, other):
493          """Return true if 'props' has the same attributes as this class"""          """Return true if 'props' has the same attributes as this class"""
494    
495            #
496            # using 'is' over '==' results in a huge performance gain
497            # in the renderer
498            #
499          return isinstance(other, ClassGroupProperties)   \          return isinstance(other, ClassGroupProperties)   \
500              and self.stroke      == other.GetLineColor() \              and (self.__stroke is other.__stroke or      \
501              and self.strokeWidth == other.GetLineWidth() \                   self.__stroke == other.__stroke)        \
502              and self.fill        == other.GetFill()              and (self.__fill is other.__fill or          \
503                     self.__fill == other.__fill)            \
504                and self.__strokeWidth == other.__strokeWidth
505    
506      def __ne__(self, other):      def __ne__(self, other):
507          return not self.__eq__(other)          return not self.__eq__(other)
# Line 503  class ClassGroupProperties: Line 512  class ClassGroupProperties:
512      def __deepcopy__(self):      def __deepcopy__(self):
513          return ClassGroupProperties(self)          return ClassGroupProperties(self)
514    
515        def __repr__(self):
516            return repr((self.__stroke, self.__strokeWidth, self.__fill))
517    
518  class ClassGroup:  class ClassGroup:
519      """A base class for all Groups within a Classification"""      """A base class for all Groups within a Classification"""
520    
521      def __init__(self, label = ""):      def __init__(self, label = "", props = None, group = None):
522          """Constructor.          """Constructor.
523    
524          label -- A string representing the Group's label          label -- A string representing the Group's label
525          """          """
526    
527          self.label = None          if group is not None:
528                self.SetLabel(copy.copy(group.GetLabel()))
529          self.SetLabel(label)              self.SetProperties(copy.copy(group.GetProperties()))
530                self.SetVisible(group.IsVisible())
531            else:
532                self.SetLabel(label)
533                self.SetProperties(props)
534                self.SetVisible(True)
535    
536      def GetLabel(self):      def GetLabel(self):
537          """Return the Group's label."""          """Return the Group's label."""
# Line 526  class ClassGroup: Line 543  class ClassGroup:
543          label -- a string representing the Group's label. This must          label -- a string representing the Group's label. This must
544                   not be None.                   not be None.
545          """          """
546          assert isinstance(label, StringType)          assert isinstance(label, types.StringTypes)
547          self.label = label          self.label = label
548    
549      def GetDisplayText(self):      def GetDisplayText(self):
# Line 542  class ClassGroup: Line 559  class ClassGroup:
559          return False          return False
560    
561      def GetProperties(self):      def GetProperties(self):
562          """Return the properties associated with the given value.          """Return the properties associated with the given value."""
563    
564          Returns None. This needs to be overridden by all subclasses.          return self.prop
         """  
         assert False, "GetProperties must be overridden by subclass!"  
         return None  
565    
566        def SetProperties(self, prop):
567            """Set the properties associated with this Group.
568    
569            prop -- a ClassGroupProperties object. if prop is None,
570                    a default set of properties is created.
571            """
572    
573            if prop is None: prop = ClassGroupProperties()
574            assert isinstance(prop, ClassGroupProperties)
575            self.prop = prop
576    
577        def IsVisible(self):
578            return self.visible
579    
580        def SetVisible(self, visible):
581            self.visible = visible
582    
583        def __eq__(self, other):
584            return isinstance(other, ClassGroup) \
585                and self.label == other.label \
586                and self.GetProperties() == other.GetProperties()
587    
588        def __ne__(self, other):
589            return not self.__eq__(other)
590    
591        def __repr__(self):
592            return repr(self.label) + ", " + repr(self.GetProperties())
593            
594  class ClassGroupSingleton(ClassGroup):  class ClassGroupSingleton(ClassGroup):
595      """A Group that is associated with a single value."""      """A Group that is associated with a single value."""
596    
597      def __init__(self, value = 0, prop = None, label = ""):      def __init__(self, value = 0, props = None, label = "", group = None):
598          """Constructor.          """Constructor.
599    
600          value -- the associated value.          value -- the associated value.
# Line 563  class ClassGroupSingleton(ClassGroup): Line 604  class ClassGroupSingleton(ClassGroup):
604    
605          label -- a label for this group.          label -- a label for this group.
606          """          """
607          ClassGroup.__init__(self, label)          ClassGroup.__init__(self, label, props, group)
   
         self.prop = None  
         self.value = None  
608    
609          self.SetValue(value)          self.SetValue(value)
         self.SetProperties(prop)  
610    
611      def __copy__(self):      def __copy__(self):
612          return ClassGroupSingleton(self.GetValue(),          return ClassGroupSingleton(self.GetValue(),
# Line 577  class ClassGroupSingleton(ClassGroup): Line 614  class ClassGroupSingleton(ClassGroup):
614                                     self.GetLabel())                                     self.GetLabel())
615    
616      def __deepcopy__(self, memo):      def __deepcopy__(self, memo):
617          return ClassGroupSingleton(copy.copy(self.GetValue()),          return ClassGroupSingleton(self.GetValue(), group = self)
                                    copy.copy(self.GetProperties()),  
                                    copy.copy(self.GetLabel()))  
618    
619      def GetValue(self):      def GetValue(self):
620          """Return the associated value."""          """Return the associated value."""
621          return self.value          return self.__value
622    
623      def SetValue(self, value):      def SetValue(self, value):
624          """Associate this Group with the given value."""          """Associate this Group with the given value."""
625          self.value = value          self.__value = value
626    
627      def Matches(self, value):      def Matches(self, value):
628          """Determine if the given value matches the associated Group value."""          """Determine if the given value matches the associated Group value."""
629    
630          """Returns True if the value matches, False otherwise."""          """Returns True if the value matches, False otherwise."""
631    
632          return self.value == value          return self.__value == value
   
     def GetProperties(self):  
         """Return the Properties associated with this Group."""  
   
         return self.prop  
   
     def SetProperties(self, prop):  
         """Set the properties associated with this Group.  
   
         prop -- a ClassGroupProperties object. if prop is None,  
                 a default set of properties is created.  
         """  
   
         if prop is None: prop = ClassGroupProperties()  
         assert isinstance(prop, ClassGroupProperties)  
         self.prop = prop  
633    
634      def GetDisplayText(self):      def GetDisplayText(self):
635          label = self.GetLabel()          label = self.GetLabel()
# Line 620  class ClassGroupSingleton(ClassGroup): Line 639  class ClassGroupSingleton(ClassGroup):
639          return str(self.GetValue())          return str(self.GetValue())
640    
641      def __eq__(self, other):      def __eq__(self, other):
642          return isinstance(other, ClassGroupSingleton) \          return ClassGroup.__eq__(self, other) \
643              and self.GetProperties() == other.GetProperties() \              and isinstance(other, ClassGroupSingleton) \
644              and self.GetValue() == other.GetValue()              and self.__value == other.__value
645    
646      def __ne__(self, other):      def __repr__(self):
647          return not self.__eq__(other)          return "(" + repr(self.__value) + ", " + ClassGroup.__repr__(self) + ")"
648    
649  class ClassGroupDefault(ClassGroup):  class ClassGroupDefault(ClassGroup):
650      """The default Group. When values do not match any other      """The default Group. When values do not match any other
651         Group within a Classification, the properties from this         Group within a Classification, the properties from this
652         class are used."""         class are used."""
653    
654      def __init__(self, prop = None, label = ""):      def __init__(self, props = None, label = "", group = None):
655          """Constructor.          """Constructor.
656    
657          prop -- a ClassGroupProperites object. If prop is None a default          prop -- a ClassGroupProperites object. If prop is None a default
# Line 641  class ClassGroupDefault(ClassGroup): Line 660  class ClassGroupDefault(ClassGroup):
660          label -- a label for this group.          label -- a label for this group.
661          """          """
662    
663          ClassGroup.__init__(self, label)          ClassGroup.__init__(self, label, props, group)
         self.SetProperties(prop)  
664    
665      def __copy__(self):      def __copy__(self):
666          return ClassGroupDefault(self.GetProperties(), self.GetLabel())          return ClassGroupDefault(self.GetProperties(), self.GetLabel())
667    
668      def __deepcopy__(self, memo):      def __deepcopy__(self, memo):
669          return ClassGroupDefault(copy.copy(self.GetProperties()),          return ClassGroupDefault(label = self.GetLabel(), group = self)
                                  copy.copy(self.GetLabel()))  
670    
671      def Matches(self, value):      def Matches(self, value):
672          return True          return True
673    
     def GetProperties(self):  
         """Return the Properties associated with this Group."""  
         return self.prop  
   
     def SetProperties(self, prop):  
         """Set the properties associated with this Group.  
   
         prop -- a ClassGroupProperties object. if prop is None,  
                 a default set of properties is created.  
         """  
   
         if prop is None: prop = ClassGroupProperties()  
         assert isinstance(prop, ClassGroupProperties)  
         self.prop = prop  
   
674      def GetDisplayText(self):      def GetDisplayText(self):
675          label = self.GetLabel()          label = self.GetLabel()
676    
# Line 677  class ClassGroupDefault(ClassGroup): Line 679  class ClassGroupDefault(ClassGroup):
679          return _("DEFAULT")          return _("DEFAULT")
680    
681      def __eq__(self, other):      def __eq__(self, other):
682          return isinstance(other, ClassGroupDefault) \          return ClassGroup.__eq__(self, other) \
683                and isinstance(other, ClassGroupDefault) \
684              and self.GetProperties() == other.GetProperties()              and self.GetProperties() == other.GetProperties()
685    
686      def __ne__(self, other):      def __repr__(self):
687          return not self.__eq__(other)          return "(" + ClassGroup.__repr__(self) + ")"
688    
689  class ClassGroupRange(ClassGroup):  class ClassGroupRange(ClassGroup):
690      """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
691         set of properties."""         set of properties."""
692    
693      def __init__(self, min = 0, max = 1, prop = None, label = ""):      def __init__(self, min = 0, max = 1, props = None, label = "", group=None):
694          """Constructor.          """Constructor.
695    
696          The minumum value must be strictly less than the maximum.          The minumum value must be strictly less than the maximum.
# Line 702  class ClassGroupRange(ClassGroup): Line 705  class ClassGroupRange(ClassGroup):
705          label -- a label for this group.          label -- a label for this group.
706          """          """
707    
708          ClassGroup.__init__(self, label)          ClassGroup.__init__(self, label, props, group)
   
         self.min = self.max = 0  
         self.prop = None  
709    
710            #self.__min = self.__max = 0
711            #self.__range = Range("[" + repr(float(min)) + ";" +
712                                       #repr(float(max)) + "[")
713          self.SetRange(min, max)          self.SetRange(min, max)
         self.SetProperties(prop)  
714    
715      def __copy__(self):      def __copy__(self):
716          return ClassGroupRange(self.GetMin(),          return ClassGroupRange(min = self.__range,
717                                 self.GetMax(),                                 max = None,
718                                 self.GetProperties(),                                 props = self.GetProperties(),
719                                 self.GetLabel())                                 label = self.GetLabel())
720    
721      def __deepcopy__(self, memo):      def __deepcopy__(self, memo):
722          return ClassGroupRange(copy.copy(self.GetMin()),          return ClassGroupRange(min = copy.copy(self.__range),
723                                 copy.copy(self.GetMax()),                                 max = copy.copy(self.GetMax()),
724                                 copy.copy(self.GetProperties()),                                 group = self)
                                copy.copy(self.GetLabel()))  
725    
726      def GetMin(self):      def GetMin(self):
727          """Return the range's minimum value."""          """Return the range's minimum value."""
728          return self.min          return self.__range.GetRange()[1]
729    
730      def SetMin(self, min):      def SetMin(self, min):
731          """Set the range's minimum value.          """Set the range's minimum value.
# Line 733  class ClassGroupRange(ClassGroup): Line 734  class ClassGroupRange(ClassGroup):
734                 maximum value. Use SetRange() to change both min and max values.                 maximum value. Use SetRange() to change both min and max values.
735          """          """
736            
737          self.SetRange(min, self.max)          self.SetRange(min, self.__range.GetRange()[2])
738    
739      def GetMax(self):      def GetMax(self):
740          """Return the range's maximum value."""          """Return the range's maximum value."""
741          return self.max          return self.__range.GetRange()[2]
742    
743      def SetMax(self, max):      def SetMax(self, max):
744          """Set the range's maximum value.          """Set the range's maximum value.
# Line 745  class ClassGroupRange(ClassGroup): Line 746  class ClassGroupRange(ClassGroup):
746          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
747                 minimum value. Use SetRange() to change both min and max values.                 minimum value. Use SetRange() to change both min and max values.
748          """          """
749          self.SetRange(self.min, max)          self.SetRange(self.__range.GetRange()[1], max)
750    
751      def SetRange(self, min, max):      def SetRange(self, min, max = None):
752          """Set a new range.          """Set a new range.
753    
754          Note that min must be strictly less than max.          Note that min must be strictly less than max.
# Line 756  class ClassGroupRange(ClassGroup): Line 757  class ClassGroupRange(ClassGroup):
757          min -- the new maximum value          min -- the new maximum value
758          """          """
759    
760          if min >= max:          if isinstance(min, Range):
761              raise ValueError(_("ClassGroupRange: %i(min) >= %i(max)!") %              self.__range = min
762                               (min, max))          else:
763          self.min = min              if max is None:
764          self.max = max                  raise ValueError()
765    
766                self.__range = Range("[" + repr(float(min)) + ";" +
767                                           repr(float(max)) + "[")
768    
769      def GetRange(self):      def GetRange(self):
770          """Return the range as a tuple (min, max)"""          """Return the range as a string"""
771          return (self.min, self.max)          #return (self.__min, self.__max)
772            return self.__range.string(self.__range.GetRange())
773    
774      def Matches(self, value):      def Matches(self, value):
775          """Determine if the given value lies with the current range.          """Determine if the given value lies with the current range.
# Line 772  class ClassGroupRange(ClassGroup): Line 777  class ClassGroupRange(ClassGroup):
777          The following check is used: min <= value < max.          The following check is used: min <= value < max.
778          """          """
779    
780          return self.min <= value < self.max          return operator.contains(self.__range, value)
781            #return self.__min <= value < self.__max
     def GetProperties(self):  
         """Return the Properties associated with this Group."""  
         return self.prop  
   
     def SetProperties(self, prop):  
         """Set the properties associated with this Group.  
   
         prop -- a ClassGroupProperties object. if prop is None,  
                 a default set of properties is created.  
         """  
         if prop is None: prop = ClassGroupProperties()  
         assert isinstance(prop, ClassGroupProperties)  
         self.prop = prop  
782    
783      def GetDisplayText(self):      def GetDisplayText(self):
784          label = self.GetLabel()          label = self.GetLabel()
785    
786          if label != "": return label          if label != "": return label
787    
788          return _("%s - %s") % (self.GetMin(), self.GetMax())          #return _("%s - %s") % (self.GetMin(), self.GetMax())
789            #return repr(self.__range)
790            return self.__range.string(self.__range.GetRange())
791    
792      def __eq__(self, other):      def __eq__(self, other):
793          return isinstance(other, ClassGroupRange) \          return ClassGroup.__eq__(self, other) \
794              and self.GetProperties() == other.GetProperties() \              and isinstance(other, ClassGroupRange) \
795              and self.GetRange() == other.GetRange()              and self.__range == other.__range
796                #and self.__min == other.__min \
797      def __ne__(self, other):              #and self.__max == other.__max
798          return not self.__eq__(other)  
799        def __repr__(self):
800            return "(" + str(self.__range) + ClassGroup.__repr__(self) + ")"
801            #return "(" + repr(self.__min) + ", " + repr(self.__max) + ", " + \
802                   #ClassGroup.__repr__(self) + ")"
803    
804  class ClassGroupMap(ClassGroup):  class ClassGroupMap(ClassGroup):
805      """Currently, this class is not used."""      """Currently, this class is not used."""

Legend:
Removed from v.613  
changed lines
  Added in v.873

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26