Versions Compared

Key

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

EN 🇦🇺


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

Код пользовательских переменных пишется на языке C#.


Table of Contents

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

  1. Перейдите

вкладка Setup > шаг Block Model
  1. во вкладку Настрока> шаг Блочная модель > кнопка

Edit
  1. Изменить > окно

Reservable Model Generator
  1. Генератор модели запасов.

  2. Нажмите

Custom Variables (Пользовательские переменные)
  1. кнопку Пользовательские переменные, чтобы открыть окно

редактора сценариев
  1. Редактор кода.

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

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

примере ниже.Image RemovedImage RemovedImage Removed
  1. примерах ниже.

  2. В списке доступных переменных справа отобразится новая переменная CustomT("Parcel"), сопоставьте ее в поле Parcel.

Image Added

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

Сухой тоннаж

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);
        
    }
}
Содержания одного полезного компонента

Компоненты по одному типу материала

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";

    }
}

Несколько компонентов

Компоненты по нескольким типам материалов

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");
        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.Ceiling(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;
    }
}

Коэффициент содержания руды

Поля блочной модели Rapid Reserver не могут сообщать коэффициент вскрыши (Stripping Ratio), поскольку он не является полем типа суммы или веса. Вместо этого, приложение может сообщать коэффициент содержания руды, который является отношением среднего веса тонн руды к общим тоннам. 

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

Коэффициент содержания руды
Code Blockusing 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
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 OreType : ITextCustomVariable
{
    public string GetText(CustomVariablesContext context)
    {
        double fe = context.N("Fe");
        double al = context.N("Al");
        double si = context.N("Si");

        if(fe > 58)        
        {
            if     (fe >= 60 && si <= 6 && al <= 3) return "hg";
            else if(fe >= 60 && si >  6 && al <= 3) return "hgs";
            else if(fe >= 60 && si <= 6 && al >  3) return "hga";
            else if(si >  9 && al <= 5) return "vgs";
            else if(si <= 9 && al >  5) return "vga";
            else if(si > 9 || al >  5) return "vgx";
            else                        return "vg";
        }
        else if(fe > 55)   
        {
            if(si >  9 && al <= 5) return "bgs";
            else if(si <= 9 && al >  5) return "bga";
            else if(si > 9 || al >  5) return "bgx";
            else                        return "bg";
        }
        else if(fe > 52) 
        {
            return "lg";
        }
        else if(fe > 50)   return "minw";
        else               return "w";

    }
}

Коэффициент содержания руды

Поля блочной модели Rapid Reserver не могут сообщать коэффициент вскрыши (Stripping Ratio), поскольку он не является полем суммарного типа или атрибута взвешивания. Вместо этого, приложение может сообщать коэффициент содержания руды, который является отношением среднего веса тонн руды к общим тоннам. 

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

Коэффициент содержания руды

Code Block
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;
    }
}

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

Для создания нескольких пользовательских переменных, для каждой переменной требуется создать классы, выполняющие запросы интерфейса 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");
        
 
public
 
double
 
GetNumber(CustomVariablesContext
 
context)
    return 
{
(density > 0 ? density * volume 
string matType = context.T("mattype").ToLower(); //material type field from original block model
: 0);
        
    }
}

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

Code Block
languagec#
using System;
bool isOre = ores.Any(ore => matType.StartsWith(ore)); if(isOre) return 1;
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 
else
context)
return
 
0;
   {
 
}
 
}

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

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

Несколько пользовательских переменных
Code Blockusing System; using System.Collections.Generic; using System.Text; using System.Linq; using Alastri.Scripting; using Alastri.BlockModel.Engine.CustomVariables; public class Parcel
      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)
    {
        
double
string 
fe
parcel = context.
N
T("
fe
ioretype"); // block model 2 field
        return ParcelResolver.Parcel(parcel);
    }
}

//parcel logic is wrapped up in 
if(fe
the 
>
static 
60)
ParcelResolver class
public static class ParcelResolver 
{
return
 
"hg";
   private static List<string> _oreList = new 
else
List<string> 
if(fe

>
 
58)
   
return
{ 
"mg";

        
else if(fe > 57.5) return
"hg", "hg1", "bl1", "mg", "lg", "lg1"
;
, "lg2", "mw"
    };
 
else
 
if(fe
 
>
 
56)

  
return
 
"lg2";
 public static string Parcel(string parcel) 
   
else
 
if(fe
{
>
 
50)
   
return
 
"minw";
   
else
if(_oreList.Contains(parcel.ToLower())) return "ore"; 
        else 
return "
w
waste";
    }
}
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");

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

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");              
            
return
  if(
density
fe >
0 ? density * volume : 0);
 60) 
                 return "hg";
              else if(fe 
}
> 
} Несколько пользовательских переменных с совместно используемой логикой Code Blockusing 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)
58) 
                 return "mg";
              else if(fe > 57.5) 
      
{
         
string
 
parcel
 
=
return 
context.T(
"
mtype
lg1"
)
;
//block
  
model
  
1
  
field
        else if(fe 
return ParcelResolver.Parcel(parcel); } } //block model 2 has a "parcel2" variable public class Parcel2 : ITextCustomVariable {
> 56) 
                 
public string GetText(CustomVariablesContext context) {
return "lg2";
              else if(fe > 50) 
   
string
 
parcel
 
=
 
context.T("ioretype");
 
//
 
block
 
model
 
2
 
field
      return "minw";
  
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 Blockusing System; using System.Collections.Generic; using System.Text; using System.Linq; using Alastri.Scripting; using Alastri.BlockModel.Engine.CustomVariables; public class Parcel : ITextCustomVariable {
            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;
        
 public
  
string
 else 
GetText(CustomVariablesContext context
if(p == "hg")
       
{
        return volume * 1.20;
          
 
 else 
double fe
if(p == 
context.N(
"
fe
mg")
;

               return volume * 1.20;
          
 else 
if(
fe
p 
> 60
== "lg1")
               return volume * 1.20;
           else if(p 
return
== "
hg
lg2"
;
)
               return 
else if(fe > 58) return "mg";               else if(fe > 57.5)
volume * 0.85;
           else 
               return 0;
      }
}

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

Code Block
languagec#
// Reading Factors from one variable into a second variable
// Update the ROM Recon Factors below 

public class reconFactorVariable_1
{
      
return
 
"lg1";               else if(fe > 56)
double fe_F  = 1.0; 
       double al_F  = 1.0;
      
    
return
 
"lg2";
 
 
 
 

 
 
 
 
 
 
 
 
 
public 
else
double 
if(fe > 50
GetReconValue(CustomVariablesContext context, string code)
    {              
return "minw";               else
 
       if (code.Equals("fe_F",StringComparison.OrdinalIgnoreCase))
       return fe_F;
       if (code.Equals("al_F",StringComparison.OrdinalIgnoreCase))
  
return
 
"w";
 
 
 
 
 
 
 
 } }
return al_F;
 
public
 
class
 
Recovery
 
:
 
IDoubleCustomVariable
 
{
 
 

 
 
 public
 
double
 
GetNumber(CustomVariablesContext
 
context)
 
 
 
 
 
 {
return 
 
1; 
 
 
 
 
 
 
 
 
 Parcel
 
parcel

=
 
new
 
Parcel();
 
//Create
 
an
} 
instance

of
}
the

Parcel

object
public 
           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;       } }

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

Image Removed

Формулы блочной модели

Для использования в Reserve Model Generator (Генератор модели запаса) доступен ряд формул
class fe_R_Variable_2 : IDoubleCustomVariable
{
    public double GetNumber(CustomVariablesContext context)
    {
        var rf = new reconFactorVariable_1();
        double grade = context.N("i_fe");
        grade = grade * rf.GetReconValue(context,"fe_F");
        return grade;
    }
}

public class al_R_Variable_2 : IDoubleCustomVariable
{
    public double GetNumber(CustomVariablesContext context)
    {
        var rf = new reconFactorVariable_1();
        double grade = context.N("i_al");
        grade = grade * rf.GetReconValue(context,"al_F");
        return grade;
    }
}

Формулы блочной модели

В Генераторе модели запасов доступен ряд формул, которые можно использовать для настройки полей и пользовательских переменных.

A+B

Сложить A и B

A-B

Вычесть B из A

A*B

Умножить A на B

A/B

Разделить A на B

A.ToLower()

Преобразовать все заглавные буквы (HG, Hg, hg) в строчные (hg)

Math.Min(A,B)

Вернуть минимум A и B

Math.Max(A,B)

Вернуть максимум A и B

N("density") <= 0 ? 0 : N("volume")

Если плотность меньше или равна нулю, вернуть нулевой объем, иначе вернуть поле объема

A.Substring(0,Math.Min(3,A.Length))

Вернуть первые три буквы A

( RowT("material")=="waste1" || RowT("material")=="waste2" ) ? "waste" : RowT("material")

При материале «waste1» или «waste2», вернуть «waste», иначе вернуть «материал»

Логические

операции

операторы

And (И)

&&

Если A — «истина» и B — «истина» и C — «истина», то возвращается значение «истина», в противном случае возвращается «ложь»

Or (Или)

||

Если A — «истина» или B — «истина» или C — «истина», то возвращается значение «истина», в противном случае возвращается «ложь»

Equal to (Равно)

==

Если A равно B, вернуть значение «истина», иначе вернуть «ложь»

Not equal to (Не равно)

!=

Если A не равно B, вернуть значение «истина», иначе вернуть «ложь»

Greater than (Больше)

>

Если A больше B, вернуть значение «истина», иначе вернуть «ложь»

Greater than or equal to (Больше или равно)

>=

Если A больше или равно B, вернуть значение «истина», иначе вернуть «ложь»

Less than (Меньше)

<

Если A меньше B, вернуть значение «истина», иначе вернуть «ложь»

Less than or equal to (Меньше или равно)

<=

Если A меньше или равно B, вернуть значение «истина», иначе вернуть «ложь»