Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method Subscribe (LibOpt_Snapshot snapshot, String prefix) 
 | 
{ 
 | 
  TextBody: 
 | 
  [* 
 | 
    nvt := NamedValueTreeIO::Export( snapshot ); 
 | 
     
 | 
    snapshot_type := snapshot.DefinitionName(); 
 | 
     
 | 
    analysis_attributes := snapshot.AnalysisAttributes(); 
 | 
     
 | 
    tv := typeofexpression( snapshot ).TypeView(); 
 | 
    attributes := selectset( tv, Attributes, att, 
 | 
                             not att.IsSystem() ); 
 | 
     
 | 
    root := nvt.Root().Child( nvt.GetHandle( snapshot_type ) ); 
 | 
     
 | 
    path := prefix + snapshot.Type(); 
 | 
     
 | 
    // Iteration 
 | 
    traverse( snapshot, IterationPart.IterationPartNM.Iteration, iteration ) 
 | 
    { 
 | 
      this.Subscribe( 'Iteration', path, [Real] iteration.IterationNr(), typeof( Number ), false ); 
 | 
    } 
 | 
     
 | 
    traverse( attributes, Elements, att ) 
 | 
    { 
 | 
      child := root.Child( nvt.GetHandle( att.Name() ) ); 
 | 
      val := child.GetValue(); 
 | 
       
 | 
      if( val.istype( Number ) or val.istype( Real ) or val.istype( Duration ) or val.istype( Boolean ) or val.istype( BinaryValue ) ) 
 | 
      { 
 | 
        name := child.Name(); 
 | 
     
 | 
        to_analyze := exists( analysis_attributes, Elements, a, a.Name() = att.Name() ); 
 | 
        if( val.istype( Real ) ) 
 | 
        { 
 | 
          this.Subscribe( name, path, val.astype( Real ), typeof( Real ), to_analyze ); 
 | 
        } 
 | 
        else if( val.istype( Number ) ) 
 | 
        { 
 | 
          this.Subscribe( name, path, [Real] val.astype( Number ), typeof( Number ), to_analyze ); 
 | 
        } 
 | 
        else if( val.istype( Duration ) ) 
 | 
        { 
 | 
          this.Subscribe( name, path, val.astype( Duration ).MinutesAsReal() * 60, typeof( Duration ), to_analyze ); 
 | 
        } 
 | 
        else if( val.istype( Boolean ) ) 
 | 
        { 
 | 
          this.Subscribe( name, path, ifexpr( val.astype( Boolean ), 1.0, 0.0 ), typeof( Boolean ), to_analyze ); 
 | 
        } 
 | 
        else if( val.istype( BinaryValue ) ) 
 | 
        { 
 | 
          bin_value := val.astype( BinaryValue ); 
 | 
           
 | 
          real_vector := guard( RealVector::Construct( bin_value ), null( RealVector, owning ) ); 
 | 
          if( not isnull( real_vector ) ) 
 | 
          { 
 | 
            for( i := 0; i < real_vector.Size(); i++ ) 
 | 
            { 
 | 
              this.Subscribe( name + '[' + [String] i + ']', path, real_vector.Get( i ), typeof( RealVector ), to_analyze ); 
 | 
            } 
 | 
          } 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
     
 | 
    traverse( snapshot, Children, child, not child.istype( LibOpt_SnapshotComponent ) ) 
 | 
    { 
 | 
      this.Subscribe( child, path + '.' ); 
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |