@@ -222,6 +222,11 @@ def get_parameter_name( serialized_value ):
222222 namelist = deserialize_address ( serialized_value )
223223 return namelist [0 ]
224224
225+ def get_parameter_cell ( serialized_value ):
226+ namelist = deserialize_address ( serialized_value )
227+ if ( len ( namelist ) < 2 ) or ( len (namelist [1 ]) < 3 ): return None
228+ return eval ( namelist [1 ] )
229+
225230class ConfigManager :
226231
227232
@@ -243,10 +248,17 @@ def __init__( self, **args ):
243248 self .parameters [basename ] = self .getParameter ( basename )
244249 self .initialized = False
245250
251+ def clear ( self , cell ):
252+ for parm_address in self .parameters .keys ():
253+ pcell = get_parameter_cell ( parm_address )
254+ if (pcell == cell ) or (pcell == None ):
255+ del self .parameters [ parm_address ]
256+
246257 def getParameter ( self , param_name , ** args ):
247258 cell = args .get ( 'cell' , '' )
248259# print ' <<---------------------------------------------------->> Get Parameter: ', param_name, ' cell = ', cell
249- if cell : param_name = serialize_address ( cell , param_name )
260+ if cell :
261+ param_name = serialize_address ( cell , param_name )
250262 cparm = self .parameters .get ( param_name , None )
251263 if cparm == None :
252264 if self .parent is None :
@@ -281,18 +293,32 @@ def setParameter( self, param_name, data, **args ):
281293 except ValueError : pass
282294 # pdata = data if hasattr( data, '__iter__' ) else [ data ]
283295 param .setInitValue ( data )
284- # print ' <<---------------------------------------------------->> Set Parameter: ', param_name, " = ", str( data )
296+ # print ' <<---------------------------------------------------->> Set Parameter: ', param_name, " = ", str( data )
285297
286298 def getParameterValue (self , param_name , ** args ):
287299 param = self .getParameter ( param_name , ** args )
288300 if ( param == None ): return None
289301 if param_name == 'Camera' :
290302 value = str ( param .values )
291303 else :
292- value = str ( param .getValues () )
293- if param .getState (): value = value + ", vcs.on"
304+ pval = param .getValues ()
305+ if hasattr ( pval , '__iter__' ) and ( len ( pval ) == 0 ):
306+ value = 'vcs.on' if param .getState () else None
307+ else :
308+ value = str ( pval )
309+ if param .getState (): value = "( %s, vcs.on )" % value
294310 return value
295311
312+ def getParameterDescription (self , param_name , ** args ):
313+ param = self .getParameter ( param_name , ** args )
314+ if ( param == None ): return None
315+ rv = {}
316+ ignorable = args .get ( 'ignorable' , [] )
317+ for key in param .values :
318+ if not key in ignorable :
319+ rv [key ] = param .values [key ]
320+ return str ( rv ) if ( len (rv ) > 0 ) else None
321+
296322 def getConfigurableFunction (self , name , ** args ):
297323 rv = self .configurableFunctions .get ( name , None )
298324 if rv == None :
@@ -510,14 +536,16 @@ def addCategory(self, cat_name ):
510536class ConfigParameter :
511537
512538 def __init__ (self , name , ** args ):
513- self .name = name
539+ self .name = name
540+ # print "Create ConfigParameter, name = ", name
514541 self .values = {}
515542 self .children = set ()
516543 self .ValueChanged = SIGNAL ( 'ValueChanged' )
517544 self .varname = args .get ( 'varname' , name )
518545 self .ptype = args .get ( 'ptype' , name )
519- self .parent = args .get ( 'parent' , None )
546+ self .parent = args .get ( 'parent' , None )
520547 self .stateKeyList = []
548+ self .debug = False
521549 if self .parent <> None :
522550 self .parent .addChild ( self )
523551 self .values .update ( self .parent .values )
@@ -575,23 +603,27 @@ def unpack( self, value_strs ):
575603 print >> sys .stderr , " Error: parameter structure mismatch in %s ( %d vs %d )" % ( self .name , len ( value_strs ), len ( self .values .keys () ) ); sys .stderr .flush ()
576604 for ( key , str_val ) in zip ( self .valueKeyList , value_strs ):
577605 self .values [key ] = deserialize_value ( str_val )
578- # print " && Unpack parameter %s: %s " % ( self.name, str( self.values ) ); sys.stdout.flush( )
606+ if self . debug : print " && Unpack parameter %s: %s " % ( self .name , str ( self .values ) )
579607
580608 def __len__ (self ):
581609 return len (self .values )
582610
583611 def __getitem__ (self , key ):
612+ if hasattr ( key , 'id' ): key = key .id
584613 return self .values .get ( key , None )
585614
586615 def __setitem__ (self , key , value ):
587- self .values [key ] = value
616+ if hasattr ( key , 'id' ): key = key .id
617+ self .values [key ] = value
618+ if self .debug : print "Parameter[%s]: set value item[%s]: %s " % ( self .name , key , str (value ))
588619 self .addValueKey ( key )
589620
590621 def childUpdate ( self , source , key , val ):
591622 self .setValue ( key , val )
592623
593624 def __call__ (self , ** args ):
594625 self .values .update ( args )
626+ if self .debug : print " && Update parameter %s: %s " % ( self .name , str ( self .values ) )
595627 args1 = [ self .ptype ]
596628 for item in args .items ():
597629 args1 .extend ( list (item ) )
@@ -615,23 +647,31 @@ def getParameterType(self):
615647
616648 def initialize ( self , config_str ):
617649 self .values = eval ( config_str )
650+ if self .debug : print " && initialize parameter %s: %s " % ( self .name , str ( self .values ) )
618651 self .sort ()
619652
620653 def serialize ( self ):
621654 return str ( self .values )
622655
623656 def getValue ( self , key = 0 , default_value = None ):
624- if key == None : return default_value
657+ if key is None : return default_value
658+ if hasattr ( key , 'id' ): key = key .id
625659 return self .values .get ( key , default_value )
626660
627661 def getState ( self ):
628662 return self .values .get ( 'state' , None )
629663
630664 def getInitValue ( self , default_value = None ):
631- ival = self .getValue ( 'init' )
632- if ( ival == None ) and ( self .parent <> None ):
633- ival = self .parent .getInitValue ()
634- return default_value if ( ival == None ) else ival
665+ ival = self .getValue ( 'relative' )
666+ if ival == None :
667+ ival = self .getValue ( 'init' )
668+ if ival == None :
669+ ival = self .getValues ()
670+ if len ( ival ) == 0 :
671+ ival = self .parent .getInitValue () if ( self .parent <> None ) else None
672+ if ( ival == None ):
673+ return default_value
674+ return ival
635675
636676 def setInitValue ( self , value , update = False ):
637677 if type ( value ) == dict :
@@ -647,26 +687,49 @@ def setInitValue( self, value, update = False ):
647687 self .setValue ( 'init' , value , update )
648688 self .setValues ( [ value ] )
649689
650-
651690 def setValue ( self , key , val , update = False ):
652- self .values [ key ] = val
653- self .addValueKey ( key )
654- if update :
655- args1 = [ self .ptype , key , val , self .name ]
656- self .ValueChanged ( args1 )
657- if self .parent <> None :
658- self .parent .childUpdate ( self , key , val , )
659-
691+ if hasattr ( key , 'id' ): key = key .id
692+ tval = val [0 ] if isinstance ( val , list ) else val
693+ if isinstance ( tval , str ) and ( tval [0 ] == '{' ): tval = eval (tval )
694+ if isinstance ( tval , dict ):
695+ self .updateValues ( tval , update )
696+ else :
697+ if self .debug :
698+ print "Parameter[%s]: set value[%s]: %s " % ( self .name , key , str (val ))
699+ self .values [ key ] = val
700+ self .addValueKey ( key )
701+ if update :
702+ args1 = [ self .ptype , key , val , self .name ]
703+ self .ValueChanged ( args1 )
704+ if self .parent <> None :
705+ self .parent .childUpdate ( self , key , val , )
706+
707+ def updateValues ( self , value_map , update ):
708+ for (key , val1 ) in value_map .items ():
709+ val0 = self .values .get ( key , None )
710+ if val0 <> val1 :
711+ self .setValue ( key , val1 , update )
712+
660713 def signalUpdate ( self ):
661714 args = [ self .ptype , self .getValues (), self .name ]
662715 self .ValueChanged ( args )
663716
664717 def setValues ( self , values , update = False ):
665718 for key ,value in enumerate ( values ):
719+ if hasattr ( key , 'id' ): key = key .id
666720 self .setValue ( key , value )
667721 if not self .parent is None :
668722 self .parent .setValue ( key , value )
669723
724+ def initValues ( self , values , update = False ):
725+ for key ,value in enumerate ( values ):
726+ if hasattr ( key , 'id' ): key = key .id
727+ val0 = self .values .get ( key , None )
728+ if val0 == None :
729+ self .setValue ( key , value )
730+ if not self .parent is None :
731+ self .parent .setValue ( key , value )
732+
670733 def getValues ( self ):
671734 vals = []
672735 for index in range ( 0 , 100 ):
@@ -712,21 +775,44 @@ def setRange(self, range ):
712775
713776 def getRange ( self ):
714777 return ( self .rmin , self .rmax )
715-
778+
779+ class WrappedList :
780+
781+ def __init__ (self ,name ):
782+ self .name = name
783+ self .list = []
784+
785+ def __get__ (self ):
786+ return self .list
787+
788+ def __set__ (self , value ):
789+ print "Set list %s: %s " % ( self .name , str ( value ) )
790+ self .list = value
791+
792+ def __len__ (self ):
793+ return len ( self .list )
794+
795+ def __getitem__ ( self , key ):
796+ return self .list [key ]
797+
798+ def __setitem__ (self , key , value ):
799+ print "Set list value %s[%s]: %s " % ( self .name , str (key ), str ( value ) )
800+ self .list [key ] = value
801+
802+
716803class ConfigurableFunction :
717804
718805 Default = 0
719- Slider = 1
720- ConfigurableFunctions = {}
721-
806+ Slider = 1
807+ ConfigurableFunctions = {}
808+
722809 def __init__ ( self , manager , name , ** args ):
723810 self .name = name
811+ self .initial_value = []
724812 self .persist = args .get ( 'persist' , True )
725813 self .manager = manager
726- # if name == 'XSlider':
727- # print "."
728814 self .value = self .manager .addParameter ( name , ** args )
729- self .initial_value = []
815+ # print " Create ConfigurableFunction %s, parm value = %s " % ( self.name, str(self.value) )
730816 self .type = 'generic'
731817 self .kwargs = args
732818 self .cfg_state = None
@@ -744,14 +830,16 @@ def __init__( self, manager, name, **args ):
744830 self .group = args .get ( 'group' , None )
745831 self ._persisted = True
746832 self .interactionHandler = args .get ( 'interactionHandler' , None )
747-
748- def updateInitialization ( self , default_init_val = None ):
749- ival = self .value .getInitValue ()
750- if ival <> None :
751- self .initial_value = ival
752- elif (self .initial_value == None ):
753- self .initial_value = default_init_val
754- return self .initial_value
833+
834+ # def updateInitialization( self, default_init_val=None ):
835+ # ival = self.value.getInitValue()
836+ # if ival <> None:
837+ # self.initial_value = ival
838+ # elif (self.initial_value == None):
839+ # self.initial_value = default_init_val
840+ # if self.name == 'ZSlider':
841+ # print 'updateInitialization: ', str( self.initial_value )
842+ # return self.initial_value
755843
756844 def getState (self ):
757845 return self .value .getValue ('state' )
@@ -850,21 +938,17 @@ def __init__( self, manager, name, **args ):
850938 self .UpdateSlidingSignal = SIGNAL ('updateSliding' )
851939 self .type = 'slider'
852940 self ._range_bounds = args .get ( 'range_bounds' , None )
941+ self ._slider_bounds = None
942+ self ._slider_bounds_relative = True
853943 self ._initial_range = None
854944 self .position = args .get ( 'position' , None )
855945 if self .initial_value <> None :
856946 for index , value in enumerate ( self .initial_value ):
857947 self .value .setValue ( index , value )
858-
948+
859949 def getPosition (self ):
860950 return self .position [0 ] if self .position else None
861951
862- def scaleRange ( self , scale_factor ):
863- if self ._initial_range == None :
864- self ._initial_range = self ._range_bounds
865- if self ._initial_range <> None :
866- self ._range_bounds = [ irv * scale_factor for irv in self ._initial_range ]
867-
868952 def getValueLength (self ):
869953 return len ( self .sliderLabels )
870954
@@ -873,7 +957,21 @@ def getRangeBounds(self):
873957
874958 def setRangeBounds (self , value ):
875959 self ._range_bounds = copy .copy ( value )
876-
960+
961+ def getSliderBounds (self ):
962+ if self ._slider_bounds == None :
963+ self .setSliderBoundsToRange ()
964+ return copy .copy ( self ._slider_bounds )
965+
966+ def setSliderBoundsToRange ( self ):
967+ self ._slider_bounds = copy .copy ( self ._range_bounds )
968+ self ._slider_bounds_relative = False
969+
970+ def setSliderBoundsToRelative ( self ):
971+ self ._slider_bounds = [ 0.01 , 1.0 ]
972+ self ._slider_bounds_relative = True
973+
974+
877975def getTitle ( dsid , name , attributes , showUnits = False ):
878976 long_name = attributes .get ( 'long_name' , attributes .get ( 'standard_name' , name ) )
879977 if not showUnits : return "%s:%s" % ( dsid , long_name )
@@ -1256,7 +1354,8 @@ def addMetadata( self, metadata ):
12561354 dataVector = self .fieldData .GetAbstractArray ( 'metadata' )
12571355 if dataVector == None :
12581356 cname = getClassName ( self )
1259- if cname <> "InputSpecs" : print " Can't get Metadata for class %s " % cname
1357+ if cname <> "InputSpecs" :
1358+ print " Can't get Metadata for class %s " % cname
12601359 else :
12611360 enc_mdata = encodeToString ( metadata )
12621361 dataVector .InsertNextValue ( enc_mdata )
0 commit comments