@@ -541,23 +541,38 @@ def _deserialize(self, data, all_connections):
541541 def _save_specifications (self ):
542542 specs = {}
543543 for key , container in self .property_data .items ():
544- if not container .is_set :
545- continue
546- if isinstance (container , dc_ref ):
547- specs [key ] = container ._serialize ()
548- elif isinstance (container , dc_flu ):
549- specs [key ] = {
550- "val" : {f : container .val [f ] for f in container .is_set },
551- "is_set" : list (container .is_set )
552- }
553- elif isinstance (container , dc_prop ):
554- specs [key ] = {
555- "val" : container .val ,
556- "unit" : container .unit ,
557- "is_set" : True
544+ data = {}
545+ if container .is_set :
546+ if isinstance (container , dc_ref ):
547+ data = container ._serialize ()
548+ elif isinstance (container , dc_flu ):
549+ data = {
550+ "val" : {f : container .val [f ] for f in container .is_set },
551+ "is_set" : list (container .is_set )
552+ }
553+ elif isinstance (container , dc_prop ):
554+ data = {
555+ "val" : container .val ,
556+ "unit" : container .unit ,
557+ "is_set" : True
558+ }
559+ else :
560+ data = {"val" : container .val , "is_set" : True }
561+ if (
562+ isinstance (container , dc_prop )
563+ and container ._val0_is_quantity
564+ and not np .isnan (container .val0 .magnitude )
565+ ):
566+ data ["val0" ] = float (container .val0 .magnitude )
567+ data ["val0_unit" ] = str (container .val0 .units )
568+ elif isinstance (container , dc_flu ) and container .val0 :
569+ data ["val0" ] = {
570+ f : float (x ) for f , x in container .val0 .items ()
558571 }
559- else :
560- specs [key ] = {"val" : container .val , "is_set" : True }
572+ if data :
573+ specs [key ] = data
574+ if specs and self .good_starting_values :
575+ specs ["good_starting_values" ] = True
561576 return specs
562577
563578 def _clear_specifications (self ):
@@ -567,7 +582,8 @@ def _clear_specifications(self):
567582 else :
568583 container .is_set = False
569584
570- def _restore_specifications (self , data , all_connections ):
585+ def _restore_specifications (self , data , all_connections , units ):
586+ self .good_starting_values = data .pop ("good_starting_values" , False )
571587 for key , param_data in data .items ():
572588 container = self .get_attr (key )
573589 if isinstance (container , dc_ref ):
@@ -580,10 +596,18 @@ def _restore_specifications(self, data, all_connections):
580596 ref = ref , is_set = True , unit = param_data ["unit" ]
581597 )
582598 elif isinstance (container , dc_flu ):
583- container .val .update (param_data ["val" ])
584- container .is_set = set (param_data ["is_set" ])
599+ if "val" in param_data :
600+ container .val .update (param_data ["val" ])
601+ container .is_set = set (param_data ["is_set" ])
602+ if "val0" in param_data :
603+ container .val0 .update (param_data ["val0" ])
585604 else :
586- container .set_attr (** param_data )
605+ val0 = param_data .pop ("val0" , None )
606+ val0_unit = param_data .pop ("val0_unit" , None )
607+ if param_data :
608+ container .set_attr (** param_data )
609+ if val0 is not None :
610+ container .val0 = units .ureg .Quantity (val0 , val0_unit )
587611
588612
589613@connection_registry
0 commit comments