Adding Pseudo Attribute Code
- Last UpdatedOct 27, 2023
- 2 minute read
Code can be plugged in to calculate the value of pseudo attributes. The code to do this must be registered in PDMS/Marine by passing in a C# delegate.
Code can be registered in two ways:
-
Against a specific UDA. The code will then be invoked for all elements having this UDA.
-
Against a specific UDA and a specific element type. The code will only be invoked for all elements of that type.
The same UDA may have multiple delegates registered for different element types.
There is a different delegate for each attribute type. for example, for integer attributes the delegate is:
public delegate double GetDoubleDelegate(DbElement ele, DbAttribute att, int qualifier);
These are defined in the DbPseudoAttribute class.
The user must write a method that matches the method signature of the delegate. for example, to write pseudo attribute code for a 'double' attribute, the user must write a method that has the signature defined by 'GetDoubleDelegate'. that means, a method that takes a DbElement, a DbAttribute, int and returns a double.
For example, the following method would be valid:
// Double delegate for UDA
static private double VolumeCalculation(DbElement ele,DbAttribute
att,int qualifier)
{
// calculate the volume by multiplying the lengths along each side
double x=ele.GetDouble(ATT.XLEN);
double y=ele.GetDouble(ATT.YLEN);
double z=ele.GetDouble(ATT.ZLEN);
// Result of UDA must be returned
return (x * y * z);
}
An instance of the delegate containing the method must then be created and registered with PDMS/Marine.
There are separate methods to register the different types of delegates. There are also separate methods to add a plugger for a particular element type. for example, the two methods to add a GetDoubleDelegate are:
public static void AddGetDoubleAttribute(DbAttribute att,GetIntDelegate plug)
public static void AddGetDoubleAttribute(DbAttribute att, DbElementType type, GetIntDelegate plug)
An example of registering a delegate is:
using System;
using NOUN=Aveva.Pdms.Database.DbElementTypeInstance;
using Ps=Aveva.Pdms.Database.DbPseudoAttribute;
namespace Aveva.PDMS.Shared.Tests
{
static public void RegisterDelegate()
{
// get uda attribute
DbAttribute uda=DbAttribute.GetDbAttribute(":VOLUME");
// Create instance of delegate containing "VolumeCalculation" method
Ps.GetDoubleDelegate dele=new Ps.GetDoubleDelegate(VolumeCal\-culation);
// Pass delegate instance to core PDMS. This will be invoked later
// when :VOLUME is queried.
// In this case registry for all valid element types.
Ps.AddGetDoubleAttribute(uda,dele);
}
}
Code may be plugged by UDET as well as the base type. The following criteria are used to locate the right plugged code:
-
If a UDET, look for a delegate plugged by UDET and attribute.
-
Look for a delegate plugged by base type and attribute
-
Look for a delegate plugged by matching attribute only.
For example, you could add three delegates to calculate :WEIGHT. You could add one that calculates the :WEIGHT on a :MYELE, one that calculates the :WEIGHT of SCTN and one that calculates WEIGHT for any other element for which :WEIGHT is valid.
A delegate only needs adding once at start up.
The events do not allow for errors. Thus if the value can not be calculated then the pseudo attribute code should return a sensible default.