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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1912 - (hide annotations)
Mon Nov 3 13:55:41 2003 UTC (21 years, 4 months ago) by bh
Original Path: trunk/thuban/Thuban/Model/classification.py
File MIME type: text/x-python
File size: 23073 byte(s)
(Classification.__getattr__)
(Classification._compile_classification)
(Classification._clear_compiled_classification): New. Methods to
manage a 'compiled' representation of the classification groups
which is created on demand
(Classification.InsertGroup, Classification.RemoveGroup)
(Classification.ReplaceGroup): reset the compiled representation
(Classification.FindGroup): Use the compiled representation to
find the matching group
(ClassGroupRange.GetRangeTuple): New. Return the range as a tuple

1 bh 453 # Copyright (c) 2001, 2003 by Intevation GmbH
2 jonathan 371 # Authors:
3     # Jonathan Coles <[email protected]>
4     #
5     # This program is free software under the GPL (>=v2)
6     # Read the file COPYING coming with Thuban for details.
7    
8     __version__ = "$Revision$"
9    
10     """
11     A Classification provides a mapping from an input value
12     to data. This mapping can be specified in two ways.
13     First, specific values can be associated with data.
14     Second, ranges can be associated with data such that if
15     an input value falls with a range that data is returned.
16 jonathan 388 If no mapping can be found then default data will
17 jonathan 371 be returned. Input values must be hashable objects
18    
19 jonathan 613 See the description of FindGroup() for more information
20 jonathan 371 on the mapping algorithm.
21     """
22    
23 jonathan 1249 import copy, operator, types
24 jonathan 397
25 jonathan 613 from Thuban import _
26    
27     from messages import \
28     LAYER_PROJECTION_CHANGED, \
29     LAYER_LEGEND_CHANGED, \
30 jonathan 1426 LAYER_VISIBILITY_CHANGED,\
31     CLASS_CHANGED
32 jonathan 388
33 jonathan 1336 from Thuban.Model.color import Color, Transparent, Black
34 jonathan 873 from Thuban.Model.range import Range
35 jan 374
36 jonathan 436 import Thuban.Model.layer
37    
38 jonathan 1426 from Thuban.Lib.connector import Publisher
39    
40     class Classification(Publisher):
41 jonathan 613 """Encapsulates the classification of layer.
42    
43     The Classification divides some kind of data into Groups which
44     are associated with properties. Later the properties can be
45     retrieved by matching data values to the appropriate group.
46     """
47 jonathan 371
48 jonathan 1426 def __init__(self):
49     """Initialize a classification."""
50 jonathan 371
51 jonathan 613 self.__groups = []
52 jonathan 436
53     self.SetDefaultGroup(ClassGroupDefault())
54 jonathan 491
55 jonathan 428 def __iter__(self):
56 jonathan 613 return ClassIterator(self.__groups)
57 jonathan 428
58 jonathan 613 def __deepcopy__(self, memo):
59     clazz = Classification()
60    
61     clazz.__groups[0] = copy.deepcopy(self.__groups[0])
62    
63     for i in range(1, len(self.__groups)):
64     clazz.__groups.append(copy.deepcopy(self.__groups[i]))
65    
66     return clazz
67    
68 jonathan 491 def __SendNotification(self):
69     """Notify the layer that this class has changed."""
70 jonathan 1426 self.issue(CLASS_CHANGED)
71 bh 1912
72     def __getattr__(self, attr):
73     """Generate the compiled classification on demand"""
74     if attr == "_compiled_classification":
75     self._compile_classification()
76     return self._compiled_classification
77     raise AttributeError(attr)
78    
79     def _compile_classification(self):
80     """Generate the compiled classification
81    
82     The compiled classification is a more compact representation of
83     the classification groups that is also more efficient for
84     performing the classification.
85    
86     The compiled classification is a list of tuples. The first
87     element of the tuple is a string which describes the rest of the
88     tuple. There are two kinds of tuples:
89    
90     'singletons'
91    
92     The second element of the tuple is a dictionary which
93     combines several consecutive ClassGroupSingleton instances.
94     The dictionary maps the values of the singletons (as
95     returned by the GetValue() method) to the corresponding
96     group.
97    
98     'range'
99    
100     The tuple describes a ClassGroupRange instance. The tuples
101     second element is a tuple fo the form (lfunc, min, max,
102     rfunc, group) where group is the original group object,
103     lfunc and rfuct are comparison functions and min and max are
104     lower and upper bounds of the range. Given a value and such
105     a tuple the group matches if and only if
106    
107     lfunc(min, value) and rfunc(max, value)
108    
109     is true.
110    
111     The compiled classification is bound to
112     self._compile_classification.
113     """
114     compiled = []
115     for group in self.__groups[1:]:
116     if isinstance(group, ClassGroupSingleton):
117     if not compiled or compiled[-1][0] != "singletons":
118     compiled.append(("singletons", {}))
119     compiled[-1][1].setdefault(group.GetValue(), group)
120     elif isinstance(group, ClassGroupRange):
121     left, min, max, right = group.GetRangeTuple()
122     if left == "[":
123     lfunc = operator.le
124     elif left == "]":
125     lfunc = operator.lt
126     if right == "[":
127     rfunc = operator.gt
128     elif right == "]":
129     rfunc = operator.ge
130     compiled.append(("range", (lfunc, min, max, rfunc, group)))
131     else:
132     raise TypeError("Unknown group type %s", group)
133     self._compiled_classification = compiled
134    
135     def _clear_compiled_classification(self):
136     """Reset the compiled classification.
137    
138     If will be created on demand when self._compiled_classification
139     is accessed again.
140    
141     Call this method whenever self.__groups is modified.
142     """
143     try:
144     del self._compiled_classification
145     except:
146     pass
147    
148 jonathan 428 #
149     # these SetDefault* methods are really only provided for
150     # some backward compatibility. they should be considered
151     # for removal once all the classification code is finished.
152     #
153    
154 jonathan 388 def SetDefaultFill(self, fill):
155 jonathan 462 """Set the default fill color.
156    
157     fill -- a Color object.
158     """
159     self.GetDefaultGroup().GetProperties().SetFill(fill)
160 jonathan 491 self.__SendNotification()
161 jonathan 388
162     def GetDefaultFill(self):
163 jonathan 462 """Return the default fill color."""
164     return self.GetDefaultGroup().GetProperties().GetFill()
165 jonathan 388
166 jonathan 462 def SetDefaultLineColor(self, color):
167     """Set the default line color.
168    
169     color -- a Color object.
170     """
171     self.GetDefaultGroup().GetProperties().SetLineColor(color)
172 jonathan 491 self.__SendNotification()
173 jonathan 388
174 jonathan 462 def GetDefaultLineColor(self):
175     """Return the default line color."""
176     return self.GetDefaultGroup().GetProperties().GetLineColor()
177 jonathan 388
178 jonathan 462 def SetDefaultLineWidth(self, lineWidth):
179     """Set the default line width.
180    
181     lineWidth -- an integer > 0.
182     """
183 jonathan 873 assert isinstance(lineWidth, types.IntType)
184 jonathan 462 self.GetDefaultGroup().GetProperties().SetLineWidth(lineWidth)
185 jonathan 491 self.__SendNotification()
186 jonathan 388
187 jonathan 462 def GetDefaultLineWidth(self):
188     """Return the default line width."""
189     return self.GetDefaultGroup().GetProperties().GetLineWidth()
190 jonathan 388
191 jonathan 462
192 jonathan 613 #
193     # The methods that manipulate self.__groups have to be kept in
194     # sync. We store the default group in index 0 to make it
195     # convienent to iterate over the classification's groups, but
196     # from the user's perspective the first (non-default) group is
197     # at index 0 and the DefaultGroup is a special entity.
198     #
199    
200     def SetDefaultGroup(self, group):
201     """Set the group to be used when a value can't be classified.
202    
203     group -- group that the value maps to.
204     """
205     assert isinstance(group, ClassGroupDefault)
206     if len(self.__groups) > 0:
207     self.__groups[0] = group
208     else:
209     self.__groups.append(group)
210 bh 1909 self.__SendNotification()
211 jonathan 613
212     def GetDefaultGroup(self):
213     """Return the default group."""
214     return self.__groups[0]
215    
216     def AppendGroup(self, item):
217     """Append a new ClassGroup item to the classification.
218    
219 jonathan 462 item -- this must be a valid ClassGroup object
220     """
221    
222 jonathan 613 self.InsertGroup(self.GetNumGroups(), item)
223 jonathan 371
224 jonathan 613 def InsertGroup(self, index, group):
225     assert isinstance(group, ClassGroup)
226     self.__groups.insert(index + 1, group)
227 bh 1912 self._clear_compiled_classification()
228 jonathan 491 self.__SendNotification()
229 jonathan 371
230 jonathan 613 def RemoveGroup(self, index):
231 bh 1909 """Remove the classification group with the given index"""
232     self.__groups.pop(index + 1)
233 bh 1912 self._clear_compiled_classification()
234 bh 1909 self.__SendNotification()
235 jonathan 613
236     def ReplaceGroup(self, index, group):
237     assert isinstance(group, ClassGroup)
238     self.__groups[index + 1] = group
239 bh 1912 self._clear_compiled_classification()
240 jonathan 613 self.__SendNotification()
241    
242     def GetGroup(self, index):
243     return self.__groups[index + 1]
244    
245     def GetNumGroups(self):
246     """Return the number of non-default groups in the classification."""
247     return len(self.__groups) - 1
248    
249     def FindGroup(self, value):
250 bh 1912 """Return the group that matches the value.
251 jonathan 371
252 bh 1912 Groups are effectively checked in the order the were added to
253     the Classification.
254 jonathan 371
255 bh 1912 value -- the value to classify. If there is no mapping or value
256     is None, return the default properties
257 jonathan 371 """
258    
259 jonathan 1426 if value is not None:
260 bh 1912 for typ, params in self._compiled_classification:
261     if typ == "singletons":
262     group = params.get(value)
263     if group is not None:
264     return group
265     elif typ == "range":
266     lfunc, min, max, rfunc, g = params
267     if lfunc(min, value) and rfunc(max, value):
268     return g
269 jonathan 371
270 jonathan 462 return self.GetDefaultGroup()
271 jonathan 371
272 jonathan 462 def GetProperties(self, value):
273 jonathan 613 """Return the properties associated with the given value.
274    
275     Use this function rather than Classification.FindGroup().GetProperties()
276     since the returned group may be a ClassGroupMap which doesn't support
277     a call to GetProperties().
278     """
279 jonathan 371
280 jonathan 613 group = self.FindGroup(value)
281 jonathan 462 if isinstance(group, ClassGroupMap):
282     return group.GetPropertiesFromValue(value)
283     else:
284     return group.GetProperties()
285 jonathan 436
286 jonathan 381 def TreeInfo(self):
287     items = []
288 jonathan 378
289 jonathan 410 def build_color_item(text, color):
290 jonathan 1336 if color is Transparent:
291 jonathan 410 return ("%s: %s" % (text, _("None")), None)
292 jonathan 381
293 jonathan 410 return ("%s: (%.3f, %.3f, %.3f)" %
294     (text, color.red, color.green, color.blue),
295     color)
296 jonathan 381
297 jonathan 436 def build_item(group, string):
298     label = group.GetLabel()
299 jonathan 410 if label == "":
300     label = string
301     else:
302     label += " (%s)" % string
303    
304 jonathan 436 props = group.GetProperties()
305 jonathan 381 i = []
306 jonathan 462 v = props.GetLineColor()
307     i.append(build_color_item(_("Line Color"), v))
308     v = props.GetLineWidth()
309     i.append(_("Line Width: %s") % v)
310 jonathan 436 v = props.GetFill()
311 jonathan 410 i.append(build_color_item(_("Fill"), v))
312     return (label, i)
313 jonathan 388
314 jonathan 428 for p in self:
315 jonathan 613 items.append(build_item(p, p.GetDisplayText()))
316 jonathan 388
317 jonathan 436 return (_("Classification"), items)
318 jonathan 381
319 jonathan 428 class ClassIterator:
320 jonathan 462 """Allows the Groups in a Classifcation to be interated over.
321 jonathan 388
322 jonathan 462 The items are returned in the following order:
323     default data, singletons, ranges, maps
324     """
325 jonathan 428
326 jonathan 462 def __init__(self, data): #default, points, ranges, maps):
327     """Constructor.
328    
329     default -- the default group
330    
331     points -- a list of singleton groups
332    
333     ranges -- a list of range groups
334    
335     maps -- a list of map groups
336     """
337    
338 jonathan 1426 self.data = data
339 jonathan 462 self.data_index = 0
340    
341 jonathan 428 def __iter__(self):
342     return self
343    
344     def next(self):
345 jonathan 462 """Return the next item."""
346 jonathan 428
347 jonathan 462 if self.data_index >= len(self.data):
348     raise StopIteration
349     else:
350     d = self.data[self.data_index]
351     self.data_index += 1
352     return d
353    
354 jonathan 436 class ClassGroupProperties:
355 jonathan 462 """Represents the properties of a single Classification Group.
356    
357     These are used when rendering a layer."""
358 jonathan 388
359 jonathan 462 def __init__(self, props = None):
360     """Constructor.
361 jonathan 410
362 jonathan 462 props -- a ClassGroupProperties object. The class is copied if
363     prop is not None. Otherwise, a default set of properties
364 jonathan 1336 is created such that: line color = Black, line width = 1,
365     and fill color = Transparent
366 jonathan 462 """
367    
368     if props is not None:
369     self.SetProperties(props)
370 jonathan 410 else:
371 jonathan 1336 self.SetLineColor(Black)
372 jonathan 462 self.SetLineWidth(1)
373 jonathan 1336 self.SetFill(Transparent)
374 jonathan 410
375 jonathan 462 def SetProperties(self, props):
376     """Set this class's properties to those in class props."""
377    
378 jonathan 602 assert isinstance(props, ClassGroupProperties)
379 jonathan 462 self.SetLineColor(props.GetLineColor())
380     self.SetLineWidth(props.GetLineWidth())
381     self.SetFill(props.GetFill())
382    
383     def GetLineColor(self):
384     """Return the line color as a Color object."""
385 jonathan 678 return self.__stroke
386 jonathan 388
387 jonathan 462 def SetLineColor(self, color):
388     """Set the line color.
389 jonathan 388
390 jonathan 462 color -- the color of the line. This must be a Color object.
391     """
392 jonathan 388
393 jonathan 678 self.__stroke = color
394 jonathan 410
395 jonathan 462 def GetLineWidth(self):
396     """Return the line width."""
397 jonathan 678 return self.__strokeWidth
398 jonathan 388
399 jonathan 462 def SetLineWidth(self, lineWidth):
400     """Set the line width.
401    
402     lineWidth -- the new line width. This must be > 0.
403     """
404 jonathan 873 assert isinstance(lineWidth, types.IntType)
405 jonathan 462 if (lineWidth < 1):
406     raise ValueError(_("lineWidth < 1"))
407    
408 jonathan 678 self.__strokeWidth = lineWidth
409 jonathan 462
410 jonathan 388 def GetFill(self):
411 jonathan 462 """Return the fill color as a Color object."""
412 jonathan 678 return self.__fill
413 jonathan 388
414     def SetFill(self, fill):
415 jonathan 462 """Set the fill color.
416    
417     fill -- the color of the fill. This must be a Color object.
418     """
419    
420 jonathan 678 self.__fill = fill
421 jonathan 388
422 jonathan 479 def __eq__(self, other):
423     """Return true if 'props' has the same attributes as this class"""
424 jonathan 436
425 jonathan 678 #
426     # using 'is' over '==' results in a huge performance gain
427     # in the renderer
428     #
429 jonathan 479 return isinstance(other, ClassGroupProperties) \
430 jonathan 678 and (self.__stroke is other.__stroke or \
431     self.__stroke == other.__stroke) \
432     and (self.__fill is other.__fill or \
433     self.__fill == other.__fill) \
434     and self.__strokeWidth == other.__strokeWidth
435 jonathan 479
436     def __ne__(self, other):
437     return not self.__eq__(other)
438    
439 jonathan 484 def __copy__(self):
440     return ClassGroupProperties(self)
441    
442 jonathan 602 def __deepcopy__(self):
443     return ClassGroupProperties(self)
444    
445 jonathan 681 def __repr__(self):
446     return repr((self.__stroke, self.__strokeWidth, self.__fill))
447    
448 jonathan 436 class ClassGroup:
449 jonathan 462 """A base class for all Groups within a Classification"""
450 jonathan 436
451 jonathan 637 def __init__(self, label = "", props = None, group = None):
452 jonathan 462 """Constructor.
453 jonathan 436
454 jonathan 462 label -- A string representing the Group's label
455     """
456    
457 jonathan 637 if group is not None:
458     self.SetLabel(copy.copy(group.GetLabel()))
459     self.SetProperties(copy.copy(group.GetProperties()))
460     self.SetVisible(group.IsVisible())
461     else:
462     self.SetLabel(label)
463     self.SetProperties(props)
464     self.SetVisible(True)
465 jonathan 462
466 jonathan 388 def GetLabel(self):
467 jonathan 462 """Return the Group's label."""
468 jonathan 388 return self.label
469    
470     def SetLabel(self, label):
471 jonathan 462 """Set the Group's label.
472    
473     label -- a string representing the Group's label. This must
474     not be None.
475     """
476 jonathan 873 assert isinstance(label, types.StringTypes)
477 jonathan 388 self.label = label
478    
479 jonathan 544 def GetDisplayText(self):
480 jonathan 602 assert False, "GetDisplay must be overridden by subclass!"
481 jonathan 544 return ""
482    
483 jonathan 436 def Matches(self, value):
484 jonathan 462 """Determines if this Group is associated with the given value.
485    
486 jonathan 479 Returns False. This needs to be overridden by all subclasses.
487 jonathan 462 """
488 jonathan 602 assert False, "GetMatches must be overridden by subclass!"
489 jonathan 479 return False
490 jonathan 436
491 jonathan 462 def GetProperties(self):
492 jonathan 637 """Return the properties associated with the given value."""
493 jonathan 462
494 jonathan 637 return self.prop
495    
496     def SetProperties(self, prop):
497     """Set the properties associated with this Group.
498    
499     prop -- a ClassGroupProperties object. if prop is None,
500     a default set of properties is created.
501 jonathan 462 """
502 jonathan 637
503     if prop is None: prop = ClassGroupProperties()
504     assert isinstance(prop, ClassGroupProperties)
505     self.prop = prop
506    
507     def IsVisible(self):
508     return self.visible
509    
510     def SetVisible(self, visible):
511     self.visible = visible
512    
513     def __eq__(self, other):
514     return isinstance(other, ClassGroup) \
515 jonathan 681 and self.label == other.label \
516 jonathan 637 and self.GetProperties() == other.GetProperties()
517    
518     def __ne__(self, other):
519     return not self.__eq__(other)
520    
521 jonathan 681 def __repr__(self):
522 jonathan 689 return repr(self.label) + ", " + repr(self.GetProperties())
523 jonathan 410
524 jonathan 436 class ClassGroupSingleton(ClassGroup):
525 jonathan 462 """A Group that is associated with a single value."""
526 jonathan 410
527 jonathan 637 def __init__(self, value = 0, props = None, label = "", group = None):
528 jonathan 462 """Constructor.
529    
530     value -- the associated value.
531    
532     prop -- a ClassGroupProperites object. If prop is None a default
533     set of properties is created.
534    
535     label -- a label for this group.
536     """
537 jonathan 637 ClassGroup.__init__(self, label, props, group)
538 jonathan 410
539 jonathan 436 self.SetValue(value)
540 jonathan 410
541 jonathan 436 def __copy__(self):
542 jonathan 479 return ClassGroupSingleton(self.GetValue(),
543     self.GetProperties(),
544     self.GetLabel())
545 jonathan 436
546 jonathan 484 def __deepcopy__(self, memo):
547 jonathan 637 return ClassGroupSingleton(self.GetValue(), group = self)
548 jonathan 484
549 jonathan 410 def GetValue(self):
550 jonathan 462 """Return the associated value."""
551 jonathan 678 return self.__value
552 jonathan 410
553     def SetValue(self, value):
554 jonathan 462 """Associate this Group with the given value."""
555 jonathan 678 self.__value = value
556 jonathan 410
557 jonathan 436 def Matches(self, value):
558 jonathan 462 """Determine if the given value matches the associated Group value."""
559    
560     """Returns True if the value matches, False otherwise."""
561    
562 jonathan 678 return self.__value == value
563 jonathan 410
564 jonathan 544 def GetDisplayText(self):
565     label = self.GetLabel()
566    
567     if label != "": return label
568    
569     return str(self.GetValue())
570    
571 jonathan 479 def __eq__(self, other):
572 jonathan 637 return ClassGroup.__eq__(self, other) \
573     and isinstance(other, ClassGroupSingleton) \
574 jonathan 678 and self.__value == other.__value
575 jonathan 436
576 jonathan 681 def __repr__(self):
577 jonathan 689 return "(" + repr(self.__value) + ", " + ClassGroup.__repr__(self) + ")"
578 jonathan 681
579 jonathan 479 class ClassGroupDefault(ClassGroup):
580 jonathan 462 """The default Group. When values do not match any other
581     Group within a Classification, the properties from this
582     class are used."""
583    
584 jonathan 637 def __init__(self, props = None, label = "", group = None):
585 jonathan 462 """Constructor.
586    
587     prop -- a ClassGroupProperites object. If prop is None a default
588     set of properties is created.
589    
590     label -- a label for this group.
591     """
592    
593 jonathan 637 ClassGroup.__init__(self, label, props, group)
594 jonathan 436
595     def __copy__(self):
596 jonathan 479 return ClassGroupDefault(self.GetProperties(), self.GetLabel())
597 jonathan 436
598 jonathan 484 def __deepcopy__(self, memo):
599 jonathan 637 return ClassGroupDefault(label = self.GetLabel(), group = self)
600 jonathan 484
601 jonathan 479 def Matches(self, value):
602     return True
603    
604 jonathan 544 def GetDisplayText(self):
605     label = self.GetLabel()
606    
607     if label != "": return label
608    
609 jonathan 613 return _("DEFAULT")
610 jonathan 544
611 jonathan 479 def __eq__(self, other):
612 jonathan 637 return ClassGroup.__eq__(self, other) \
613     and isinstance(other, ClassGroupDefault) \
614 jonathan 479 and self.GetProperties() == other.GetProperties()
615    
616 jonathan 681 def __repr__(self):
617     return "(" + ClassGroup.__repr__(self) + ")"
618    
619 jonathan 436 class ClassGroupRange(ClassGroup):
620 jonathan 462 """A Group that represents a range of values that map to the same
621     set of properties."""
622 jonathan 436
623 jonathan 1353 def __init__(self, _range = (0,1), props = None, label = "", group=None):
624 jonathan 462 """Constructor.
625    
626     The minumum value must be strictly less than the maximum.
627    
628 jonathan 1353 _range -- either a tuple (min, max) where min < max or
629     a Range object
630 jonathan 462
631     prop -- a ClassGroupProperites object. If prop is None a default
632     set of properties is created.
633    
634     label -- a label for this group.
635     """
636    
637 jonathan 643 ClassGroup.__init__(self, label, props, group)
638 jonathan 1353 self.SetRange(_range)
639 jonathan 410
640 jonathan 436 def __copy__(self):
641 jonathan 1353 return ClassGroupRange(self.__range,
642 jonathan 873 props = self.GetProperties(),
643     label = self.GetLabel())
644 jonathan 436
645 jonathan 484 def __deepcopy__(self, memo):
646 jonathan 1353 return ClassGroupRange(copy.copy(self.__range),
647 jonathan 637 group = self)
648 jonathan 484
649 jonathan 410 def GetMin(self):
650 jonathan 462 """Return the range's minimum value."""
651 jonathan 873 return self.__range.GetRange()[1]
652 jonathan 410
653     def SetMin(self, min):
654 jonathan 462 """Set the range's minimum value.
655    
656     min -- the new minimum. Note that this must be less than the current
657     maximum value. Use SetRange() to change both min and max values.
658     """
659    
660 jonathan 1353 self.SetRange((min, self.__range.GetRange()[2]))
661 jonathan 410
662     def GetMax(self):
663 jonathan 462 """Return the range's maximum value."""
664 jonathan 873 return self.__range.GetRange()[2]
665 jonathan 410
666     def SetMax(self, max):
667 jonathan 462 """Set the range's maximum value.
668    
669     max -- the new maximum. Note that this must be greater than the current
670     minimum value. Use SetRange() to change both min and max values.
671     """
672 jonathan 1353 self.SetRange((self.__range.GetRange()[1], max))
673 jonathan 410
674 jonathan 1353 def SetRange(self, _range):
675 jonathan 462 """Set a new range.
676    
677 jonathan 1353 _range -- Either a tuple (min, max) where min < max or
678     a Range object.
679 jonathan 462
680 jonathan 1353 Raises ValueError on error.
681 jonathan 462 """
682    
683 jonathan 1353 if isinstance(_range, Range):
684     self.__range = _range
685     elif isinstance(_range, types.TupleType) and len(_range) == 2:
686     self.__range = Range(("[", _range[0], _range[1], "["))
687 jonathan 873 else:
688 jonathan 1353 raise ValueError()
689 jonathan 410
690     def GetRange(self):
691 jonathan 873 """Return the range as a string"""
692     return self.__range.string(self.__range.GetRange())
693 jonathan 410
694 bh 1912 def GetRangeTuple(self):
695     return self.__range.GetRange()
696    
697 jonathan 436 def Matches(self, value):
698 jonathan 462 """Determine if the given value lies with the current range.
699    
700     The following check is used: min <= value < max.
701     """
702    
703 jonathan 873 return operator.contains(self.__range, value)
704 jonathan 410
705 jonathan 544 def GetDisplayText(self):
706     label = self.GetLabel()
707    
708     if label != "": return label
709    
710 jonathan 873 return self.__range.string(self.__range.GetRange())
711 jonathan 544
712 jonathan 479 def __eq__(self, other):
713 jonathan 637 return ClassGroup.__eq__(self, other) \
714     and isinstance(other, ClassGroupRange) \
715 jonathan 873 and self.__range == other.__range
716 jonathan 479
717 jonathan 681 def __repr__(self):
718 jonathan 873 return "(" + str(self.__range) + ClassGroup.__repr__(self) + ")"
719 jonathan 681
720 jonathan 436 class ClassGroupMap(ClassGroup):
721 jonathan 462 """Currently, this class is not used."""
722 jonathan 436
723 jonathan 410 FUNC_ID = "id"
724    
725 jonathan 436 def __init__(self, map_type = FUNC_ID, func = None, prop = None, label=""):
726 jonathan 462 ClassGroup.__init__(self, label)
727 jonathan 410
728     self.map_type = map_type
729     self.func = func
730    
731     if self.func is None:
732     self.func = func_id
733    
734     def Map(self, value):
735     return self.func(value)
736    
737 jonathan 462 def GetProperties(self):
738     return None
739    
740     def GetPropertiesFromValue(self, value):
741     pass
742    
743 jonathan 544 def GetDisplayText(self):
744     return "Map: " + self.map_type
745    
746 jonathan 410 #
747     # built-in mappings
748     #
749     def func_id(value):
750     return value
751    

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26