Expression: IExpression;
Expression: Prognoz.Platform.Interop.ForeSystem.IExpression;
Свойство Expression возвращает условие расчета цикла.
Для настройки параметров расчета условия используйте свойство IMsCalculationChainIterator.Transform.
Для ограничения количества итераций цикла используйте свойство IMsCalculationChainIterator.MaxIterations.
Для разрешения однократного выполнения цикла без проверки условия используйте свойство IMsCalculationChainIterator.PostCondition.
Для выполнения примера в репозитории предполагается наличие контейнера моделирования с идентификатором «MS», содержащего метамодель с идентификатором «METAMODEL_ITERATOR».
Добавьте ссылки на системные сборки: Metabase, Ms.
Sub UserProc;
Var
mb: IMetabase;
MsKey: Integer;
MetaModel: IMsMetaModel;
Param: IMsModelParam;
CalcChain: IMsCalculationChainEntries;
Iterator: IMsCalculationChainIterator;
Model: IMsModel;
Trans, IterTrans: IMsFormulaTransform;
Slice: IMsFormulaTransformSlice;
Selector: IMsFormulaTransformSelector;
Formula: IMsFormula;
TransformVar: IMsFormulaTransformVariable;
Determ: IMsDeterministicTransform;
Expr: IExpression;
Begin
mb := MetabaseClass.Active;
// Получим ключ контейнера моделирования
MsKey := mb.GetObjectKeyById("MS");
// Получим метамодель
MetaModel := mb.ItemByIdNamespace("METAMODEL_ITERATOR", MsKey).Edit As IMsMetaModel;
// Очистим все параметры метамодели
MetaModel.Params.Clear;
// Добавим новый параметр
Param := MetaModel.Params.Add;
Param.DefaultValue := 0;
Param.Id := "THRESHOLD";
Param.Name := "THRESHOLD";
// Очистим цепочку расчета метамодели
CalcChain := MetaModel.CalculationChain;
CalcChain.Clear;
// Создадим цикл в цепочке расчета метамодели
Iterator := CalcChain.AddIterator("While/Repeat");
// Задаем условие выполнения цикла
Iterator.PostCondition := True;
Iterator.MaxIterations := 600;
Expr := Iterator.Expression;
Expr.AsString := "{THRESHOLD}<5";
If Expr.ErrorInfo <> Null Then
Debug.WriteLine(Expr.ErrorInfo.ErrorMessage);
End If;
// Задаем режим расчета условия
IterTrans := Iterator.Transform;
IterTrans.CalculationType := MsCalculationType.Pointwise;
IterTrans.CalculationDirection := MsCalculationDirection.Forward;
// Создаем внутреннюю модель в цепочке расчета метамодели
Model := Iterator.Contents.AddExclusiveModel.EditModel;
Model.AutoName := True;
// Задаем параметры расчета модели
Trans := Model.Transform;
Trans.CalculationType := MsCalculationType.Pointwise;
Trans.CalculationDirection := MsCalculationDirection.Forward;
// Указываем параметр «THRESHOLD» в качестве моделируемой переменной
TransformVar := Trans.Outputs.AddParamVariable("THRESHOLD");
Slice := TransformVar.Slices.Add(Null);
Selector := Trans.CreateSelector;
Selector.Slice := Slice;
Formula := Trans.Transform(Selector);
Formula.Kind := MsFormulaKind.Deterministic;
Determ := Formula.Method As IMsDeterministicTransform;
// Задаем формулу расчета модели
Expr := Determ.Expression;
Expr.AsString := "{THRESHOLD}+RandBetween(-2,3)";
If Expr.ErrorInfo <> Null Then
Debug.WriteLine(Expr.ErrorInfo.ErrorMessage);
End If;
// Сохраняем метамодель
(MetaModel As IMetabaseObject).Save;
End Sub UserProc;
В результате выполнения примера в метамодели будет создан цикл, который будет выполняться до тех пор, пока значение параметра «THRESHOLD» меньше пяти. Если за шестьсот итераций условие не будет выполнено, то цикл завершится.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.Ms;
…
Public Shared Sub Main(Params: StartParams);
Var
mb: IMetabase;
MsKey: uinteger;
MetaModel: IMsMetaModel;
Param: IMsModelParam;
CalcChain: IMsCalculationChainEntries;
Iterator: IMsCalculationChainIterator;
Model: IMsModel;
Trans, IterTrans: IMsFormulaTransform;
Slice: IMsFormulaTransformSlice;
Selector: IMsFormulaTransformSelector;
Formula: IMsFormula;
TransformVar: IMsFormulaTransformVariable;
Determ: IMsDeterministicTransform;
Expr: IExpression;
Begin
mb := Params.Metabase;
// Получим ключ контейнера моделирования
MsKey := mb.GetObjectKeyById("MS");
// Получим метамодель
MetaModel := mb.ItemByIdNamespace["METAMODEL_ITERATOR", MsKey].Edit() As IMsMetaModel;
// Очистим все параметры метамодели
MetaModel.Params.Clear();
// Добавим новый параметр
Param := MetaModel.Params.Add();
Param.DefaultValue := 0;
Param.Id := "THRESHOLD";
Param.Name := "THRESHOLD";
// Очистим цепочку расчета метамодели
CalcChain := MetaModel.CalculationChain;
CalcChain.Clear();
// Создадим цикл в цепочке расчета метамодели
Iterator := CalcChain.AddIterator("While/Repeat");
// Задаем условие выполнения цикла
Iterator.PostCondition := True;
Iterator.MaxIterations := 600;
Expr := Iterator.Expression;
Expr.AsString := "{THRESHOLD}<5";
If Expr.ErrorInfo <> Null Then
System.Diagnostics.Debug.WriteLine(Expr.ErrorInfo.ErrorMessage);
End If;
// Задаем режим расчета условия
IterTrans := Iterator.Transform;
IterTrans.CalculationType := MsCalculationType.mctPointwise;
IterTrans.CalculationDirection := MsCalculationDirection.mcdForward;
// Создаем внутреннюю модель в цепочке расчета метамодели
Model := Iterator.Contents.AddExclusiveModel().EditModel;
Model.AutoName := True;
// Задаем параметры расчета модели
Trans := Model.Transform;
Trans.CalculationType := MsCalculationType.mctPointwise;
Trans.CalculationDirection := MsCalculationDirection.mcdForward;
// Указываем параметр «THRESHOLD» в качестве моделируемой переменной
TransformVar := Trans.Outputs.AddParamVariable("THRESHOLD");
Slice := TransformVar.Slices.Add(Null);
Selector := Trans.CreateSelector();
Selector.Slice := Slice;
Formula := Trans.Transform[Selector];
Formula.Kind := MsFormulaKind.mfkDeterministic;
Determ := Formula.Method As IMsDeterministicTransform;
// Задаем формулу расчета модели
Expr := Determ.Expression;
Expr.AsString := "{THRESHOLD}+RandBetween(-2,3)";
If Expr.ErrorInfo <> Null Then
System.Diagnostics.Debug.WriteLine(Expr.ErrorInfo.ErrorMessage);
End If;
// Сохраняем метамодель
(MetaModel As IMetabaseObject).Save();
End Sub;
См. также: