Versions Compared

Key

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

Sometimes we want to map a block model field that isn't coded in the original block model. Custom variables allow us to write complex logic in a readable and reusable way, which can then be mixed with other inline formulas in the block model mappings.To create a custom variable

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

  1. Go Перейдите to Setup > Block Model > Edit > Reserve Reservable Model Generator(Настройка > Блоковая модель > Редактировать > Генератор модели запаса).
  2. Click "Custom Variables" to open the script editor.
  3. Clear all text from the code editor.
  4. Replace it with the sample code below.

Image Removed

Block model with inline formula.

Image Removed

Custom variable editor.

Image Removed

...

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

Image Added

Блоковая модель с невыключной формулой

Image Added

Окно редактора пользовательских настроек

Image Added

Блоковая модель с пользовательской переменной

Code Block
languagec#
titleDry TonnesТонн в сухом состоянии
linenumberstrue
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);
        
    }
}

...

Code Block
languagec#
titleGrade BinsТанкеры одной породы
linenumberstrue
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";

    }
}

...

Code Block
languagec#
titleMultiple Grade BinsТанкеры нескольких пород
linenumberstrue
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");
        double al = context.N("al");
        string geology = context.T("geology");
        
        string fe_bin;
        
        if(fe > 60) 
        {
             fe_bin = "60";
        }
        else if(fe > 55) 
        {
            fe = Math.Floor(fe); 
            fe_bin = fe.ToString("#,##0");
        }
        else
        {
           fe_bin = "50";
        }

        string al_bin;

        if(al < 3)
        {
           al_bin = "3";
        }
        else if(al < 6)
        {
           al = Math.Ceil(al);
           al_bin = al.ToString("#,##0");
        }
        else
        {
          al_bin = "9";
        }

        string geoClass = "1";
        if(geology.Equals("detrital", StringComparison.OrdinalIgnoreCase))
        {
           geoClass = "2";
        }

        return fe_bin + "_" + al_bin + "_" + geoClass;
    }
}

Ore Ratio

Поля блоковой модели Rapid Reserver block model fields cannot report не могут сообщать коэффициент вскрыши (Stripping Ratio, because Stripping Ratio is not a sum or weight average type field. Instead, we can report ore ratio, which is the weight average of ore tonnes over total tonnes.To do this we can set up a weight-averaged field called 'OreRatio' as a child of dryTonnes or wetTonnes (whichever you want to report). This field will report a 1 for ore and a 0 for waste. The weight average of the 1s and 0s across a blast becomes the ore ratio. ), поскольку он не является полем типа суммы или веса. Вместо этого приложение может сообщать коэффициент руды, который является отношение среднего веса тонн руды к общим тоннам. 

Для этого нам потребуется настроить поле средневзвешенных единиц с именем OreRatio (Коэффициент руды) как дочернюю запись параметра «dryTonnes» или «wetTonnes» (в зависимости от того, какие тонны (в сухом или во влажном состоянии) Вы хотите включить в отчет. В этом поле будет указано «1» для руды и «0» для вскрыши. Средневзвешенное значение единиц и нулей во взрывном блоке и будет являться соотношением руды.

Code Block
languagec#
titleOre RatioКоэффициент руды
linenumberstrue
using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Linq; 
using Alastri.Scripting; 
using Alastri.BlockModel.Engine.CustomVariables;

public class OreRatio : IDoubleCustomVariable
{
    List<string> ores = new List<string>(){ "hg", "mg", "lg" }; //all lower case
     
    public double GetNumber(CustomVariablesContext context)
    {
        string matType = context.T("mattype").ToLower(); //material type field from original block model

        bool isOre = ores.Any(ore => matType.StartsWith(ore)); 
        
        if(isOre) return 1;
        else return 0;
    }
}

Multiple Custom Variables

...

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

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

Code Block
languagec#
titleMultiple Custom VariablesНесколько пользовательских переменных
linenumberstrue
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#
titleMultiple variables with shared logicНесколько пользовательских переменных с совместно используемой логикой
linenumberstrue
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#
titleAccess Custom Variable from another Custom VariableДоступ к пользовательской переменной из другой пользовательской переменной
linenumberstrue
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;
      }
}

If there are no errors during compilation, the custom variables should be listed in the Variables panel.

Image Removed

...


Если в процессе не было допущено никаких ошибок, то пользовательские переменные должны быть перечислены в панели Variables.

Image Added

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