<< Click to Display Table of Contents >> Navigation: Проект > Элементы дерева объектов > Палитра ФБ > Служебные > Скрипт > Руководство и примеры > Работа с журналами > Изменение настройки фильтра источников |
Снова рассмотрим изменение настройки фильтра журнала, но в этот раз изменим не категорию, а раздел Источники. В источники можно добавлять как объекты целиком, так и отдельные переменные - рассмотрим оба этих случая, а также сброс настроек журнала.
Сделаем заготовку. Создадим объект с тремя команда - Установить объект, установить значения и сбросить, свяжем с одноименными входами скрипта. В объект добавим еще один объект, а в него значения - данный объект и его значения мы будем добавлять в фильтр.
Для того чтобы добавить в фильтр объект целиком и все вложенные в него переменные нужно выполнить 4 команды
journal.Settings.LocalFilters[0].FieldMask = EEventFilterField.effSource;
journal.Settings.LocalFilters[0].AddFullObjectSources(ОбъектДобавления); //добавить объект и всех его детей как источники
journal.Settings.LocalFilters[0].AlwaysIncludeCurrentObject = false; //не включать текущий объект
journal.FilterProperty.UpdateSourceListViewSelection(); //обновить дерево фильтра
Главный здесь метод journal.Settings.LocalFilters[0].AddFullObjectSources(ОбъектДобавления), куда нужно передать объект, который мы ходим добавить. Его можно получить например так:
var Obj1=HostFB.TreeItemHlp.ParentObject.GetChild("Объект 1");
Или так:
var объект1 = (ITreeItemHlp)проект.Item("Объект.Объект 2.Объект 1");
Для того чтобы добавить в фильтр определенные переменные нужно использовать свойство journal.Settings.LocalFilters[0].SourceList. Данное свойство представляет собой коллекцию строк, следующего формата: "#IdПеременной". ID переменной - это уникальный идентификатор переменной в проекте, имя переменной можно изменить, но ее ID не изменяется. Получить ID можно например так:
var Item1 = HostFB.TreeItemHlp.Project.Item("Объект.Объект 1.Объект 1.Значение 1");
uint ID = Item1.ID;
В нашем случае мы используем полные имена, но, разумеется можно использовать перебор переменных, как мы делали на уроках ранее. Таким образом нужно сформировать коллекцию таких строк, и записать их в свойство SourceList.
Для того чтобы сбросить настройку фильтра по источника нужно выполнить метод:
journal.FilterProperty.ResetSourceFilter();
Теперь можно скомпоновать данный код в скрипт. У нас будет три операции - установка фильтра по объекту, по значениям и сброс. Можно поступить также, как мы делали ранее с трендом - использовать делегат.
Итоговый код будет выглядеть следующим образом:
public partial class ФБ : ScriptBase
{
const string ИмяЖурнала = "Журнал";
const string ИмяОкна = "Мнемосхема";
bool? M = false;
bool? L = false;
bool? R = false;
delegate void ChangeOperation(Trend journal);
public override void Execute()
{
if (УстановитьОбъект == true && M == false)
{
ChangeJournal(SetObject);
}
M = УстановитьОбъект;
if (УстановитьЗначения == true && L == false)
{
ChangeJournal(SetValues);
}
L = УстановитьЗначения;
if (Сбросить == true && R == false)
{
ChangeJournal(Reset);
}
R = Сбросить;
}
private void ChangeJournal(ChangeOperation Operation)
{
//Ссылка на текущий проект
var проект = HostFB.TreeItemHlp.Project;
//получаем корневой объект
var объект = (ITreeItemHlp)HostFB.TreeItemHlp.Parent;
//получаем журнал
RTManager.Instance.ThreadHolder.BeginInvoke(new ThreadStart(delegate
{
foreach (Trend journal in проект.GetService<TrendService>().Opened)
{
var host = journal.Host as System.Windows.Forms.Control;
Object name;
if (host == null) continue;
name = WinFormsControlBase.GetAmbientProperty(host, WindowlessControlBase.DISPID.DISPID_AMBIENT_NAME);
if (name.ToString() != ИмяЖурнала || journal.Attribute.TreeItem.ID != объект.ID || journal.Attribute.DisplayName != ИмяОкна) continue;
Operation(journal);
}
}));
}
private void SetObject(Trend journal)
{
var Project = HostFB.TreeItemHlp.Project;
var Obj1 = HostFB.TreeItemHlp.ParentObject.GetChild("Объект 1");
journal.Settings.LocalFilters[0].FieldMask = EEventFilterField.effSource;
journal.Settings.LocalFilters[0].AddFullObjectSources(Obj1); //добавить объект и всех его детей как источники
journal.Settings.LocalFilters[0].AlwaysIncludeCurrentObject = false; //не включать текущий объект
journal.FilterProperty.UpdateSourceListViewSelection();
}
private void SetValues(Trend journal)
{
var Lis = new List<string>();
var Item1 = HostFB.TreeItemHlp.Project.Item("Объект.Объект 1.Объект 1.Значение 1");
var Item2 = HostFB.TreeItemHlp.Project.Item("Объект.Объект 1.Объект 1.Значение 2");
var Item3 = HostFB.TreeItemHlp.Project.Item("Объект.Объект 1.Объект 1.Значение 3");
Lis.Add("#" + Item1.ID);
Lis.Add("#" + Item2.ID);
Lis.Add("#" + Item3.ID);
journal.Settings.LocalFilters[0].SourceList = Lis;
journal.Settings.LocalFilters[0].AlwaysIncludeCurrentObject = false; //не включать текущий объект
journal.FilterProperty.UpdateSourceListViewSelection();
}
private void Reset(Trend journal)
{
journal.FilterProperty.ResetSourceFilter();
}
}
Проверим работу скрипта в режиме исполнения. Нажмем на кнопку Установить - установятся флаги у Объекта 1 и всех вложенных в него.
Нажмем на Сбросить - настройки сбросились.
Нажмем Установить значения:
Флаги установились. Нажатие на Сбросить сбросит и их тоже.
Готовый пример со скриптом доступен по ссылке.