Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Иногда нам может потребоваться отобразить поле блочной модели, которое не было закодировано в исходной модели. Для этого в приложении присутствует опция пользовательских переменных, позволяющая написать любую более сложную логику в доступном для чтения и повторного использования формате, также доступную для объединения с другими формулами преобразования блочной модели.

Table of Contents

Для создания пользовательских переменных:

  1. Перейдите вкладка Setup > шаг Block Model > кнопка Edit > окно Reservable Model Generator.

  2. Нажмите Custom Variables (Пользовательские переменные), чтобы открыть окно редактора сценариев.

  3. Удалите весь текст из окна редактора кода.

  4. Замените его на приведенный в примере ниже.

...

Тонн в сухом состоянии

Code Block
languagec#
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Linq; 
using Alastri.Scripting; 
using Alastri.BlockModel.Engine.CustomVariables;

public class DryTonnes : IDoubleCustomVariable
{
    public double GetNumber(CustomVariablesContext context)
    {
        double density = context.N("DENSITY");

        double volume = context.N("XINC")*context.N("YINC")*context.N("ZINC");
        
        return (density > 0 ? density * volume : 0);
        
    }
}

...

Для создания нескольких пользовательских переменных, для каждой переменной требуется создать классы, выполняющие интерфейс IDoubleCustomVariable или ITextCustomVariable. Такие классы должны быть перечислены друг под другом в окне редактора сценариев пользовательских переменных, как показано в примерах ниже.

Несколько пользовательских переменных

Code Block
languagec#
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using Alastri.Scripting;
using Alastri.BlockModel.Engine.CustomVariables;

public class Parcel : ITextCustomVariable
{
    public string GetText(CustomVariablesContext context)
    {
        double fe = context.N("fe");
        
        if(fe > 60)        return "hg";
        else if(fe > 58)   return "mg";
        else if(fe > 57.5) return "lg1";
        else if(fe > 56)   return "lg2"; 
        else if(fe > 50)   return "minw";
        else               return "w";
    }
}

public class DryTonnes : IDoubleCustomVariable
{
    public double GetNumber(CustomVariablesContext context)
    {
        double density = context.N("DENSITY");

        double volume = context.N("XINC")*context.N("YINC")*context.N("ZINC");
        
        return (density > 0 ? density * volume : 0);
        
    }
}

Несколько пользовательских переменных с совместно используемой логикой

Code Block
languagec#
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using Alastri.Scripting;
using Alastri.BlockModel.Engine.CustomVariables;
 
//block model 1 has a "parcel1" variable
public class Parcel1 : ITextCustomVariable
{
    public string GetText(CustomVariablesContext context)
    {
        string parcel = context.T("mtype"); //block model 1 field
        return ParcelResolver.Parcel(parcel);
    }
}

//block model 2 has a "parcel2" variable
public class Parcel2 : ITextCustomVariable
{
    public string GetText(CustomVariablesContext context)
    {
        string parcel = context.T("ioretype"); // block model 2 field
        return ParcelResolver.Parcel(parcel);
    }
}

//parcel logic is wrapped up in the static ParcelResolver class
public static class ParcelResolver 
{
    private static List<string> _oreList = new List<string> 
    { 
        "hg", "hg1", "bl1", "mg", "lg", "lg1", "lg2", "mw"
    };
    
    public static string Parcel(string parcel) 
    {
        if(_oreList.Contains(parcel.ToLower())) return "ore"; 
        else return "waste";
    }
}

Доступ к пользовательской переменной из другой пользовательской переменной

Code Block
languagec#
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using Alastri.Scripting;
using Alastri.BlockModel.Engine.CustomVariables;

public class Parcel : ITextCustomVariable
{
       public string GetText(CustomVariablesContext context)
       {
              double fe = context.N("fe");              
              if(fe > 60) 
                 return "hg";
              else if(fe > 58) 
                 return "mg";
              else if(fe > 57.5) 
                 return "lg1";
              else if(fe > 56) 
                 return "lg2";
              else if(fe > 50) 
                 return "minw";
              else 
                 return "w";
       }
}

public class Recovery : IDoubleCustomVariable
{
     public double GetNumber(CustomVariablesContext context)
     {
           Parcel parcel = new Parcel(); //Create an instance of the Parcel object
           string p = parcel.GetText(context); //Call the GetText() method, store the result in variable 'p'

           double volume = context.N("XINC")*context.N("YINC")*context.N("ZINC");

           if(p == "hglp" ) 
               return volume * 1.20;
           else if(p == "hg")
               return volume * 1.20;
           else if(p == "mg")
               return volume * 1.20;
           else if(p == "lg1")
               return volume * 1.20;
           else if(p == "lg2")
               return volume * 0.85;
           else 
               return 0;
      }
}

...