PS. Фильтры кода
Фильтр кода — это дополнительная части логики, оцениваемая в процессе выбора правил назначений. Этот фильтр предназначен для оценки простого логического оператора, возвращающего значения «True» (Истина) или «False» (Ложь).
В Production Scheduler фильтры кода можно добавлять через сценарии, а также через шаг Destination Rules (Правила назначений).
В большинстве случаев, фильтров, созданных в шаге Destinations Rules (Правила назначений) будет достаточно, однако, при работе со сложной логикой, которая требует множественные фильтры кода, может потребоваться создать необходимые фильтры через сценарии.
- 1 Запуск редактора кода
- 2 Панель редактора кода
- 3 Пример использования
Запуск редактора кода
Создание фильтров кода
В шаге Destinations Rules (Логика назначений) нажмите кнопку Codes Filters (Фильтры кода).
Откроется диалоговое окно редактора кода Block Filter Code Editor, в котором можно добавить новый фильтр кода и работать с ним, как описано ниже.
Элементы панели инструментов окна редактора кода
Кнопка | Описание |
---|---|
Добавление нового фильтра кода | |
Удаление выбранного фильтра кода | |
Перемещение выбранного фильтра кода вверх или вниз по списку | |
Загрузка фильтра кода из файла | |
Сохранение выбранного фильтра кода | |
Сохранение всех фильтров кодов в проекте |
Панель редактора кода
Панель редактора кода — это область написания фильтров кода. Она включает панель инструментов, текстовый редактор и две вспомогательные вкладки (для формул и ошибок) внизу.
Панель инструментов
Кнопка | Описание |
---|---|
Компилирует код. При наличии ошибок, они будут отображены во вкладке Errors внизу редактора. | |
Отмена <CTRL + Z> или повтор <CTRL + Y> предыдущих действий |
Текстовый редактор
Текстовый редактор — это область написания кода для фильтров.
Вкладка формул
Вкладка формул (Formulas) содержит список вспомогательных функций, которые можно использовать для построения фильтров кодов. Формулы используются для обобщения и упрощения процесса создания фильтров, путем уменьшения объема создаваемого кода.
Формула | Описание |
---|---|
Generate CalendarInput (Генерирование ввода календаря) | Используется для генерирования кода, необходимого для создания нового пользовательского ввода календаря |
Create <Activity> Double Field Reference (Создание двойной ссылки на поле для <Операции>) | Используется для генерирования кода, необходимого для создания двойной ссылки на поле для выбранной операции (взрывной блок, выемочный блок, добыча, промышленное бурение и пр.) |
Create <Activity> String Field Reference (Создание строчной ссылки на поле для <Операции>) | Используется для генерирования кода, необходимого для создания строчной ссылки на поле для выбранной операции (взрывной блок, выемочный блок) |
В этой вкладке отображаются только те операции, которые были активированы для данного проекта. Этот список отличается для каждого проекта.
Вкладка ошибок
Во вкладке ошибок (Errors) отображаются все ошибки, возникающие при компилировании фильтров кода. Вы увидите название ошибки и номер строки, в которой она возникла.
Пример использования
Для лучшего понимания функции фильтров кода, см. пример ниже.
“Склад SP1 может принимать материал высокого сорта (HG), но только с содержанием Fe выше 61% и SiO2 ниже 3.”
Без фильтров кода такой логикой управлять сложно. Возможным решением было бы вернуться в Rapid Reserver и создать новый полезный компонент HG с содержанием Fe выше 61 и SiO2 ниже 3. Но это не очень практичное решение, поскольку при изменении пороговых величин потребуется вернуться в Rapid Reserver и создать новые компоненты. А функция фильтров кода дает пользователю возможность легко смоделировать подобную ситуацию и продолжать работать с проектом без повторного создания запасов.
Шаг 1. Создание фильтра кода
Через панель инструментов создайте новый фильтр и переименуйте его.
Шаг 2. Определение необходимых переменных
Единственная цель этого фильтра кода — определить, попадают ли значения содержания Fe и SiO2 разработанных блоков HG в установленные пределы. Для этого, необходимо создать переменные для хранения адресов для полей Fe и SiO2, чтобы можно было извлечь эти значения. Также потребуется создать две переменные для хранения вводов календаря, чтобы можно было ввести пороговые значения.
Типы переменных | Описание |
---|---|
IProductionDoubleReference | Хранит ссылку на конкретное поле базы данных |
CustomCalendarInput | Хранит пользовательский ввод календаря, отображаемый во вкладке календарного плана |
Шаг 3. Создание вводов календаря
В предыдущем шаге мы определили две переменные CustomCalendarInput. Сейчас нам требуется присвоить значения этим переменным. Для этого используется метод CreateCalendarInputs. Ниже приводится наиболее простая процедура для достижения этой цели.
В методе CreateCalendarInputs возьмите переменную «_feCutOff» и поместите оператор присваивания (=) справа.
Выберите из списка доступных формул (Available Formulas) формулу Generate CalendarInput и дважды щелкните по ней.
3. Заполните необходимые вводы и нажмите ОК для завершения.
Элементы диалогового окна Configure Generate CalendarInput
Название | Описание |
---|---|
Names (Имена) | Структура имен для дополнительного поля календаря. Имена будут «вложены» одно в другое |
Default Value (Значение по умолчанию) | Значение по умолчанию, отображаемое в поле календаря при создании периодов |
Minimum Value (Минимальное значение) | Минимальное значение, которое пользователь может ввести в поле |
Maximum Value (Максимальное значение) | Максимальное значение, которое пользователь может ввести в поле |
Display Format (Формат отображения) | Формат отображения данных в календаре |
4. Просмотрите вставленный код и, при необходимости, отредактируйте его.
5. Во вкладке Calendar появятся дополнительные поля календаря. При изменении значений по периодам, их можно обновлять.
Шаг 4. Создание ссылок на поля
В шаге 2 мы определили две переменные, которые должны хранить адреса полей Fe и SiO2 в базе данных. Также как и для пользовательских переменных календаря, нам необходимо присвоить значения для этих переменных. Ниже приводится наиболее простая процедура для достижения этой цели.
В методе CreateFieldRefernce возьмите ссылочную переменную «_feGrade» и поместите оператор присваивания (=) справа.
Выберите из списка доступных формул (Available Formulas) формулу Create Mining Double Field Reference (Создание двойной ссылки на поле для добычи) и дважды щелкните по ней.
3. Выберите необходимые поля из раскрывающегося списка на нажмите ОК для завершения.
4. Просмотрите вставленный код и, при необходимости, отредактируйте его.
Шаг 5. Определение логического выражения
Результатом фильтра кода может быть «True» (Истина) или «False» (Ложь).Логика, определяющая этот результат задается в методе включения Include. В этом методе пользователь автоматически получает блок добычи из расписания, обозначенный переменной «b».
В данном примере, мы хотим определить, находятся ли значения Fe и SiO2 в установленных пределах (не превышается ли значение Fe, и не меньше ли значение SiO2). Ниже приводится наиболее простая процедура для достижения этой цели.
Возьмите значение Fe блока при помощи переменной «_feGrade» и переменной «b» (блок планирования).
Возьмите из календаря определенное пользователем пороговое значение при помощи переменной при помощи переменной «_feCutOff».
Используйте булевое выражение, чтобы проверить, не превышает ли значение Fe пороговое значение.
Сохраните результат булевого выражения в местной переменной.
Повторите шаги 1-4 для SiO2.
Используйте булевое выражение для получившихся в результате переменных, созданных в шаге 4.
Шаг 6. Применение фильтра кода
После того, как фильтр кода успешно скомпилирован, его можно выбрать из раскрывающегося списка Code Filter соответствующего правила назначения. В показанном ниже примере любая добытая в карьере руда (Ore), которая удовлетворяет логическое условие кода, Fe >= X и SiO2 <= Y, будет отправлена в склад Stockpiles/SP1. Если логическоевыражение не выполняется, будет оцениваться следующее правило назначения, то есть руда будет отправляться в склады Stockpiles/SP2.
Полностью отработанный пример
using System;
using Alastri.Patri.V2;
using Alastri.TotalScheduler.ScriptExtensions;
using Alastri.TotalScheduler.ScriptExtensions.Modifiers;
using System.Collections.Generic;
using Alastri.Scripting;
using Alastri.SchedulingCore;
public class SimpleProductionBlockFilterSample : SimpleProductionBlockFilter
{
//Variables to store the database adress of the grade fields
private IProductionDoubleReference _feGrade;
private IProductionDoubleReference _siO2Grade;
//Variables to store the additional calendar input
private CustomCalendarInput _feCutOff;
private CustomCalendarInput _siO2CutOff;
public override void CreateCalendarInputs(CalendarInputContext context)
{
_feCutOff = context.CreateCalendarInput(new InputTemplate
{
Names = new string[]{"Code Filters", "Fe SiO2", "Fe"},
DefaultValue = -1,
MinValue = -1,
MaxValue = 100,
Format = "#,##0.00",
});
_siO2CutOff = context.CreateCalendarInput(new InputTemplate
{
Names = new string[]{"Code Filters", "Fe SiO2", "SiO2"},
DefaultValue = -1,
MinValue = -1,
MaxValue = 100,
Format = "#,##0.00",
});
}
public override void CreateFieldReferences(FieldReferenceContext context)
{
_feGrade = context.GetMiningDoubleReference("grades_Fe");
_siO2Grade = context.GetMiningDoubleReference("grades_Sio2");
}
public override bool Include(IProductionSchedulingBlock b)
{
double feValue = _feGrade.GetValue(b); //Get the Fe value from the block
double feCutOffValue = _feCutOff.Value; //Get the cut-off value from the calendar
bool fePass = feValue >= feCutOffValue; //Compare the two values
double siO2Value = _siO2Grade.GetValue(b); //Get the SiO2 value from the block
double siO2CutOffValue = _siO2CutOff.Value; //Get the cut-off value from the calendar
bool siO2Pass = siO2Value <= siO2CutOffValue; //Compare the two values
//Returns True if both fePass and siO2Pass are True, else it returns False
return fePass & siO2Pass;
}
}