Versions Compared

Key

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

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

Image Removed

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

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

  • Нажмите Custom Variables (Пользовательские переменные)

    Язык написания скриптов - C#.


    Table of Contents
    minLevel1
    maxLevel6
    outlinefalse
    typelist
    printablefalse
    Image Added


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

    1. Перейдите вкладка Настройка > шаг Блочная модель > кнопка Изменить > окно Генератор модели запасов.

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

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

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

    3. Замените его на

    приведенный в примере ниже.Image RemovedImage RemovedImage Removed
    Тонн в сухом состоянии
    code
    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.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;
        }
    }


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

    Поля блочной модели 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");
            
            return (density > 0 ? density * volume : 0);
            
        }
    }

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

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

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

    Image Removed

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

    Code Block
    languagec#
    // Reading Factors from one variable into a second variable
    // Update the ROM Recon Factors below 
    
    public class reconFactorVariable_1
    {
           double fe_F  = 1.0; 
           double al_F  = 1.0;
          
           
        public double GetReconValue(CustomVariablesContext context, string code)
        {               
           if (code.Equals("fe_F",StringComparison.OrdinalIgnoreCase))
           return fe_F;
           if (code.Equals("al_F",StringComparison.OrdinalIgnoreCase))
           return al_F;
           
           return 1;      
        } 
    }
    
    
    public 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;
        }
    }