Для хранения и вывода дополнительной информации в Aveva предусмотрена возможность создавать свои собственные атрибуты, называемые User defined attributes или UDA. UDA могут быть двух типов: атрибуты и псевдо-атрибуты (или вычисляемые атрибуты). Если с просто атрибутами всё понятно: что мы в них ввели, то они нам и показывают, то для вычисления значения псевдо-атрибута требуется написать код на .Net, что позволяет выводить в нём довольно обширный вид информации. В этой статье предлагаю рассмотреть простой пример создания и кодирования псевдо-атрибута, который будет для элементов типа PIPE выводить значение
cstandard of category of catreference of hstube of members
Процесс создания псевдо-атрибута состоит из двух этапов: добавления UDA в модуле Lexicon и создание кода, вычисляющего значение атрибута.
Создадим мир UWRL для хранения UDA и сам UDA. Атрибут назовём C-CStandard
Код для вычисления значения атрибута довольно прост и в комментариях не нуждается
using System;
using Aveva.Pdms.Database;
///<summary>
/// cstandard of category of catreference of hstube of members
///</summary>
class CCStandard
{
private static DbAttribute attr;
public static void Run()
{
CCStandard.attr = DbAttribute.GetDbAttribute(":C-CStandard");
if (CCStandard.attr == null)
return;
DbPseudoAttribute.GetStringDelegate attDelegate = new DbPseudoAttribute.GetStringDelegate(CCStandard.AttributeValueCalculation);
// Для каких типов элементов считать атрибут
DbPseudoAttribute.AddGetStringAttribute(CCStandard.attr, DbElementTypeInstance.PIPE, attDelegate);
}
///<summary>
/// Вычисление значения атрибута
///</summary>
///<param name="ele">Элемент</param>
///<param name="att">Атрибут</param>
///<param name="qual">Спецификатор</param>
///<returns>Значение атрибута</returns>
static private string AttributeValueCalculation(DbElement ele, DbAttribute att, DbQualifier qual)
{
if (CCStandard.attr == null || ele.Members().Length == 0)
return string.Empty;
// ... members
DbElement bran = ele.FirstMember();
// ... hstube of members
DbElement hstu = bran.GetElement(DbAttributeInstance.HSTU);
if (hstu.IsNull)
return "no hsTube of member";
// ... catreference of hstube of members
DbElement catRef = hstu.GetElement(DbAttributeInstance.CATR);
if (catRef.IsNull)
return "no catReference of hsTube of member";
// ... category of catreference of hstube of members
DbElement cate = catRef.Owner;
// cstandard of category of catreference of hstube of members
return cate.GetString(DbAttributeInstance.CSTA);
}
}
Модуль, загружающийся при старте Aveva и запускающий вычисление значения нашего атрибута
using System;
using Aveva.ApplicationFramework;
class PseudoAttributes : IAddin
{
///<summary>
/// Автоматически запускается при загрузке библиотеки
///</summary>
public void Start(ServiceManager servMan)
{
CCStandard.Run();
}
///<summary>
/// Автоматически запускается при закрытии библиотеки
///</summary>
public void Stop() { }
///<summary>
/// Описание библиотеки
///</summary>
public string Description { get { return "PseudoAttributes: модуль вычисления псевдоатрибутов"; } }
///<summary>
/// Заголовок библиотеки
///</summary>
public string Name { get { return "PseudoAttributes"; } }
}
Компилируем библиотеку, копируем её в папку с Aveva, добавляем в OutfittingAddins.xml ссылку на DLL и запускаем Outfitting. При выборе элемента типа PIPE видим наш атрибут и полученное значение.
Во вложении находятся библиотека и исходники.