Изменение настройки фильтра источников

<< Click to Display Table of Contents >>

Navigation:  Проект > Элементы дерева объектов > Палитра ФБ > Служебные > Скрипт > Руководство и примеры > Работа с журналами >

Изменение настройки фильтра источников

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

Сделаем заготовку. Создадим объект с тремя команда - Установить объект, установить значения и сбросить, свяжем с одноименными входами скрипта. В объект добавим еще один объект, а в него значения - данный объект и его значения мы будем добавлять в фильтр.

sluzhebnie_skript_rukovodstvo_i_primery_rabota_s_zhurnalami_izmenenie_nastrojki_filtra_istochnikov

Для того чтобы добавить в фильтр объект целиком и все вложенные в него переменные нужно выполнить 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 и всех вложенных в него.

sluzhebnie_skript_rukovodstvo_i_primery_rabota_s_zhurnalami_izmenenie_nastrojki_filtra_istochnikov1

​Нажмем на Сбросить - настройки сбросились.

sluzhebnie_skript_rukovodstvo_i_primery_rabota_s_zhurnalami_izmenenie_nastrojki_filtra_istochnikov2

​ Нажмем Установить значения:

sluzhebnie_skript_rukovodstvo_i_primery_rabota_s_zhurnalami_izmenenie_nastrojki_filtra_istochnikov3

Флаги установились. Нажатие на Сбросить сбросит и их тоже.

Готовый пример со скриптом доступен по ссылке.