<< Click to Display Table of Contents >> Navigation: Проект > Элементы дерева объектов > Палитра ФБ > Служебные > Скрипт > Руководство и примеры > Работа с трендами > Управление масштабом перьев |
По умолчанию масштаб пера на тренде наследуется от шкалы, а если ее нет, то берется от 0 до 100. Например, может быть ситуация, в зависимости от текущего режима процесса необходимо автоматически менять на тренде масштаб шкалы (на первом шаге диапазон от 0 до 20, на втором от 15 до 50 и т.д.). Для этой задачи также можно использовать скрипт.
Сделаем заготовку. В объекте размещены Команда 1 и Команда 2, которые добавлены на тренд и формируют имитационные сигналы, командами Минимум и Максимум мы будем устанавливать масштаб нашего тренда, по сигналу на кнопку Применить.
Сделаем заготовку скрипта:
public override void Execute()
{
if (Применить == true && M == false && Минимум.HasValue && Максимум.HasValue)
{
//Ссылка на текущий проект
var Project = HostFB.TreeItemHlp.Project;
//получаем корневой объект
var ParentObject = (ITreeItemHlp)HostFB.TreeItemHlp.Parent;
//получаем тренд
RTManager.Instance.ThreadHolder.BeginInvoke(new ThreadStart(delegate
{
foreach (Trend trend in Project.GetService<TrendService>().Opened)
{
var host = trend.Host as System.Windows.Forms.Control;
Object name;
if (host != null)
{
name = WinFormsControlBase.GetAmbientProperty(host, WindowlessControlBase.DISPID.DISPID_AMBIENT_NAME);
if (name.ToString() != ИМЯ_ТРЕНДА || trend.Attribute.TreeItem.ID != ParentObject.ID || trend.Attribute.DisplayName != ИМЯ_ОКНА) continue;
}
}
}));
}
M = Применить;
}
Обратите внимание, что скрипт проверяет что значения на входа Минимум и Максимум заданы.
Для того чтобы изменить масштаб оси, сперва нужно ее получить, для этого используется поиск среди осей в объектах тренда:
var axis = trend.Settings.Objects.OfType<Axis>().FirstOrDefault(c => c.AxisType == LineDirectionEnum.Вертикальная);
Получив ось, можно менять ее параметры.
if (axis != null)
{
axis.MinValueY = Минимум.Value;
axis.MaxValueY = Максимум.Value;
}
Итоговый скрипт будет выглядеть так:
public partial class ФБ : ScriptBase
{
string ИМЯ_ТРЕНДА = "Тренд";
string ИМЯ_ОКНА = "Мнемосхема";
bool? M = false;
public override void Execute()
{
if (Применить == true && M == false && Минимум.HasValue && Максимум.HasValue)
{
//Ссылка на текущий проект
var Project = HostFB.TreeItemHlp.Project;
//получаем корневой объект
var ParentObject = (ITreeItemHlp)HostFB.TreeItemHlp.Parent;
//получаем тренд
RTManager.Instance.ThreadHolder.BeginInvoke(new ThreadStart(delegate
{
foreach (Trend trend in Project.GetService<TrendService>().Opened)
{
var host = trend.Host as System.Windows.Forms.Control;
Object name;
if (host != null)
{
name = WinFormsControlBase.GetAmbientProperty(host, WindowlessControlBase.DISPID.DISPID_AMBIENT_NAME);
if (name.ToString() != ИМЯ_ТРЕНДА || trend.Attribute.TreeItem.ID != ParentObject.ID || trend.Attribute.DisplayName != ИМЯ_ОКНА) continue;
//получение вертикальной оси
var axis = trend.Settings.Objects.OfType<Axis>().FirstOrDefault(c => c.AxisType == LineDirectionEnum.Вертикальная);
if (axis != null)
{
axis.MinValueY = Минимум.Value;
axis.MaxValueY = Максимум.Value;
}
}
}
}));
}
M = Применить;
}
}
Проверим работу нашего скрипта в режиме исполнения.
Готовый проект можно скачать по ссылке.