Пользовательские переменные
Иногда нам может потребоваться отобразить поле блочной модели, которое не было закодировано в исходной модели. Для этого в приложении присутствует опция пользовательских переменных, позволяющая написать любую более сложную логику в доступном для чтения и повторного использования виде, также доступную для объединения с другими формулами сопоставления блочной модели.
Создание пользовательских переменных
Перейдите вкладка Setup > шаг Block Model > кнопка Edit > окно Reservable Model Generator.
Нажмите Custom Variables (Пользовательские переменные), чтобы открыть окно редактора сценариев.
Удалите весь текст из окна редактора кода.
Замените его на приведенный в примере ниже.
Примерные коды переменных
Сухой тоннаж
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); } } |
Содержания одного полезного компонента
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"; } } |
Несколько компонентов
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» для вскрыши. Усредненное значение единиц и нулей во взрывном блоке и будет являться коэффициентом содержания руды.
Коэффициент содержания руды
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. Такие классы должны быть перечислены друг под другом в окне редактора сценариев пользовательских переменных, как показано в примерах ниже.
Несколько пользовательских переменных
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); } } |
Несколько пользовательских переменных с совместно используемой логикой
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"; } } |
Доступ к пользовательской переменной из другой пользовательской переменной
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.
Формулы блочной модели
Для использования в Reserve Model Generator (Генератор модели запаса) доступен ряд формул.
| Сложить A и B |
| Вычесть B из A |
| Умножить A на B |
| Разделить A на B |
| Преобразовать все заглавные буквы (HG, Hg, hg) в строчные (hg) |
| Вернуть минимум A и B |
| Вернуть максимум A и B |
| Если плотность меньше или равна нулю, вернуть нулевой объем, иначе вернуть поле объема |
| Вернуть первые три буквы A |
| При материале «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, вернуть значение «истина», иначе вернуть «ложь» |
Add Comment