Расчет задачи моделирования

Для выполнения примеров в репозитории предполагается наличие контейнера моделирования с идентификатором «CONT_MODEL». Данный контейнер должен содержать задачу с идентификатором «PROBLEM_1».

Пример Fore

Добавьте ссылки на системные сборки «Metabase», «Ms».

Public Class MCallback: Object, IMsProblemCalculationCallback
    Public Calculation: IMsProblemCalculation;
    
    Public Sub OnError(Message: String);
    Begin
        Debug.WriteLine(Message);
    End Sub OnError;
    
    Public Sub OnFinish;
    Begin
        Debug.WriteLine("Расчет задачи завершен");
        Calculation := Null;
    End Sub OnFinish;
    
    Public Sub OnMessage(Message: String);
    Begin
        Debug.Write(DateTime.Now);
        Debug.WriteLine(": " + Message);
    End Sub OnMessage;
    
    Public Sub OnModelCalculation(Model: IMsModel);
    Begin
        Debug.WriteLine("Расчет модели: " + (Model As IMetabaseObject).Id);
    End Sub OnModelCalculation;
    
    Public Sub OnStep;
    Begin
        Debug.WriteLine("Выполнено шагов: " + Calculation.PointPassed.ToString +
            " из " + Calculation.PointCount.ToString);
    End Sub OnStep;
    
    Public Sub OnBreak(Breakpoint: IMsBreakpoint);
    Begin
        Debug.WriteLine(Breakpoint.Name);
    End Sub OnBreak;
    
    Public Sub OnWarning(Message: string);
    Begin
        Debug.WriteLine("Предупреждение: " + Message);
    End Sub OnWarning;
End Class MCallback;

Sub UserProc;
Var
    MB: IMetabase;
    Ms: IMetabaseObjectDescriptor;
    Problem: IMsProblem;
    CallBack: MCallback;
    CalcSett: IMsProblemCalculationSettings;
    Scens: IMsProblemScenarios;
    Calculation: IMsProblemCalculation;
    i: Integer;
Begin
    MB := MetabaseClass.Active;
    Ms := MB.ItemById("CONT_MODEL");
    Problem := MB.ItemByIdNamespace("PROBLEM_1", Ms.Key).Bind As IMsProblem;
    CallBack := New MCallback.Create;
    CalcSett := Problem.CreateCalculationSettings;
    CalcSett.Callback := CallBack;
    Scens := Problem.Scenarios;
    For i := 0 To Scens.Count - 1 Do
        CalcSett.ScenarioIncluded(Scens.Item(i)) := True;
    End For;
    Calculation := Problem.Calculate(CalcSett);
    Calculation.SaveHistory := True;
    CallBack.Calculation := Calculation;
    Calculation.Run;
End Sub UserProc;

Пример Fore.NET

Imports Prognoz.Platform.Interop.Ms;

Public Class MCallback: Object, IMsProblemCalculationCallback
    Public Calculation: IMsProblemCalculation;
    
    Public Sub OnError(Message: String);
    Begin
        System.Diagnostics.Debug.WriteLine(Message);
    End Sub OnError;
    
    Public Sub OnFinish();
    Begin
        System.Diagnostics.Debug.WriteLine("Расчет задачи завершен");
        Calculation := Null;
    End Sub OnFinish;
    
    Public Sub OnMessage(Message: String);
    Begin
        System.Diagnostics.Debug.Write(DateTime.Now);
        System.Diagnostics.Debug.WriteLine(": " + Message);
    End Sub OnMessage;
    
    Public Sub OnModelCalculation(Model: IMsModel);
    Begin
        System.Diagnostics.Debug.WriteLine("Расчет модели: " + (Model As IMetabaseObject).Id);
    End Sub OnModelCalculation;
    
    Public Sub OnStep();
    Begin
        System.Diagnostics.Debug.WriteLine("Выполнено шагов: " + Calculation.PointPassed.ToString() +
            " из " + Calculation.PointCount.ToString());
    End Sub OnStep;
    
    Public Sub OnBreak(Breakpoint: IMsBreakpoint);
    Begin
        System.Diagnostics.Debug.WriteLine(Breakpoint.Name);
    End Sub OnBreak;
    
    Public Sub OnWarning(Message: string);
    Begin
        System.Diagnostics.Debug.WriteLine("Предупреждение: " + Message);
    End Sub OnWarning;
End Class MCallback;

Public Class Program
    [STAThread]
    Public Shared Sub Main(Params: StartParams);
    Var
        MB: IMetabase;
        Ms: IMetabaseObjectDescriptor;
        Problem: IMsProblem;
        CallBack: MCallback;
        CalcSett: IMsProblemCalculationSettings;
        Scens: IMsProblemScenarios;
        Calculation: IMsProblemCalculation;
        i: Integer;
    Begin
        MB := Params.Metabase;
        Ms := MB.ItemById["CONT_MODEL"];
        Problem := MB.ItemByIdNamespace["PROBLEM_1", Ms.Key].Bind() As IMsProblem;
        CallBack := New MCallback.Create();
        CalcSett := Problem.CreateCalculationSettings();
        CalcSett.Callback := CallBack;
        Scens := Problem.Scenarios;
        For i := 0 To Scens.Count - 1 Do
            CalcSett.ScenarioIncluded[Scens.Item[i]] := True;
        End For;
        Calculation := Problem.Calculate(CalcSett);
        Calculation.SaveHistory := True;
        CallBack.Calculation := Calculation;
        Calculation.Run();
    End Sub;
End Class;

Результат выполнения примеров Fore и Fore.NET

После выполнения примера будет осуществлен расчет задачи с идентификатором «PROBLEM_1». Расчет будет производиться по всем сценариям, содержащимся в задаче. Для обработки событий, происходящих во время расчета, используется объект пользовательского класса «MCallback». История расчёта будет сохранена.

См. также:

Примеры