2.5.1  Wyliczanie wartości pochodnych zmiennych

 

Poniższy skrypt pokazuje, w jaki sposób na podstawie wartości dwóch zwykłych zmiennych wyliczana jest wartość trzeciej zmiennej. Skrypt pokazuje także zastosowanie funkcji zwrotnej odświeżania do monitorowania wartości zmiennych wejściowych.

C#

using System;
using
 System.Windows.Forms;
using
 Askom.AsixEvo.Scripting;
 

public
 class VarCalc : IScript
{
   IApplication application;
   IVariable vIn1, vIn2, vOut;
 
   
public bool Initialize(string[] aParameters, IApplication aApplication)
   {
      application = aApplication;
      vIn1 = aApplication.GetVariable(aParameters[0], 
true);
      vIn2 = aApplication.GetVariable(aParameters[1], 
true);
      vOut = aApplication.GetVariable(aParameters[2], 
false);
      vIn1.RegisterStateEvent(RefreshedEvent);
      vIn2.RegisterStateEvent(RefreshedEvent);
      
return false;
   }
 
   
public void FinalizeScript()
   {
 
   }
 
   
void RefreshedEvent(string aVariableName, VariableState aVariableState)
   {
      
try
      {
         
if (vIn1.VariableState.IsGood && vIn2.VariableState.IsGood)
         {
            vOut.SetVariableValue(Recalculate(
Convert.ToDouble(vIn1.VariableState.Value),
               
Convert.ToDouble(vIn2.VariableState.Value)));
         }
      }
      
catch (Exception e)
      {
         application.ReportMessage(EvoMessageType.Error, e.Message);
 
      }
   }
 
   
double Recalculate(double v1, double v2)
   {
      
return v1 + v2;
   }
 
}

 

 

VB

Imports System
Imports
 System.Windows.Forms
Imports
 Askom.AsixEvo.Scripting
 

Public
 Class VarCalcVB
    
Implements IScript
 
    
Dim application As IApplication
    
Dim vIn1, vIn2, vOut As IVariable
 
    
Public Function Initialize(ByVal aParameters() As StringByVal aApplication As _

                               IApplication) As Boolean Implements IScript.Initialize
 
        application = aApplication
        vIn1 = aApplication.GetVariable(aParameters(0), True)
        vIn2 = aApplication.GetVariable(aParameters(1), True)
        vOut = aApplication.GetVariable(aParameters(2), False)
        vIn1.RegisterStateEvent(AddressOf RefreshedEvent)
        vIn2.RegisterStateEvent(AddressOf RefreshedEvent)
        Return False
 
    End Function
 
    Public Sub FinalizeScript() Implements IScript.FinalizeScript
    End Sub
 
    Sub RefreshedEvent(ByVal aVariableName As StringByVal aVariableState As VariableState)
 
        Try
            If (vIn1.VariableState.IsGood And vIn2.VariableState.IsGood) Then
 
                vOut.SetVariableValue(

                       Recalculate(Convert.ToDouble(vIn1.VariableState.Value), _
                                   Convert.ToDouble(vIn2.VariableState.Value)))

            End If
        Catch e As Exception
            application.ReportMessage(EvoMessageType.Error, e.Message)
        End Try
 
    End Sub
 
 
    Function Recalculate(ByVal v1 As DoubleByVal v2 As DoubleAs Double
 
        Recalculate = v1 + v2
 
    End Function
 
End
 Class

 

 

W funkcji Initialize tworzone są dwa obiekty IVariable, które będą służyły do odczytu wartości zmiennych oraz jeden obiekt IVariable zmiennej wynikowej. Istotne jest ustawienie drugiego  parametru funkcji GetVariable na  True dla obu zmiennych wejściowych. Następnie dla zmiennych wejściowych, przy pomocy metody registerStateEvent,  deklarowana jest funkcja zwrotna RefresehedEvent. Będzie ona wywoływana przy każdej zmianie wartości którejkolwiek ze zmiennych wejściowych.

Funkcja Initialize zwraca wartość false, co powoduje kontynuację pracy skryptu.

Wewnątrz funkcji RefreshedEvent następuje wyliczenie nowej wartości wynikowej, a następnie zmienna wynikowa jest ustawiana przy pomocy funkcji SetVariableValue. Parametry funkcji zwrotnej  aVariableName i aVariableState mogą być użyte do określenia, która zmienna uległa zmianie i na jaką wartość, ale w przykładowym skrypcie nie było to potrzebne.

Należy zwrócić uwagę na sposób zabezpieczenia kodu przy pomocy konstrukcji try. Kod jest odporny na brak lub nieprawidłowe wartości zmiennych wejściowych.