/// <summary>
/// Collects instance declarations nodes from with a type.
/// </summary>
public static void CollectInstanceDeclarations(
Session session,
ComNamespaceMapper mapper,
NodeState node,
AeEventAttribute parent,
List<AeEventAttribute> instances,
IDictionary<string, AeEventAttribute> map)
{
List<BaseInstanceState> children = new List<BaseInstanceState>();
node.GetChildren(session.SystemContext, children);
if (children.Count == 0)
{
return;
}
// process the children.
for (int ii = 0; ii < children.Count; ii++)
{
BaseInstanceState instance = children[ii];
// only interested in objects and variables.
if (instance.NodeClass != NodeClass.Object && instance.NodeClass != NodeClass.Variable)
{
return;
}
// ignore instances without a modelling rule.
if (NodeId.IsNull(instance.ModellingRuleId))
{
return;
}
// create a new declaration.
AeEventAttribute declaration = new AeEventAttribute();
declaration.RootTypeId = (parent != null)?parent.RootTypeId:node.NodeId;
declaration.NodeId = (NodeId)instance.NodeId;
declaration.BrowseName = instance.BrowseName;
declaration.NodeClass = instance.NodeClass;
declaration.Description = (instance.Description != null)?instance.Description.ToString():null;
// get data type information.
BaseVariableState variable = instance as BaseVariableState;
if (variable != null)
{
declaration.DataType = variable.DataType;
declaration.ValueRank = variable.ValueRank;
if (!NodeId.IsNull(variable.DataType))
{
declaration.BuiltInType = DataTypes.GetBuiltInType(declaration.DataType, session.TypeTree);
}
}
if (!LocalizedText.IsNullOrEmpty(instance.DisplayName))
{
declaration.DisplayName = instance.DisplayName.Text;
}
else
{
declaration.DisplayName = instance.BrowseName.Name;
}
if (parent != null)
{
declaration.BrowsePath = new QualifiedNameCollection(parent.BrowsePath);
declaration.BrowsePathDisplayText = Utils.Format("{0}/{1}", parent.BrowsePathDisplayText, mapper.GetLocalBrowseName(instance.BrowseName));
declaration.DisplayPath = Utils.Format("{0}/{1}", parent.DisplayPath, instance.DisplayName);
}
else
{
declaration.BrowsePath = new QualifiedNameCollection();
declaration.BrowsePathDisplayText = Utils.Format("{0}", instance.BrowseName);
declaration.DisplayPath = Utils.Format("{0}", instance.DisplayName);
}
declaration.BrowsePath.Add(instance.BrowseName);
// check if reading an overridden declaration.
AeEventAttribute overriden = null;
if (map.TryGetValue(declaration.BrowsePathDisplayText, out overriden))
{
declaration.OverriddenDeclaration = overriden;
}
map[declaration.BrowsePathDisplayText] = declaration;
// only interested in variables.
if (instance.NodeClass == NodeClass.Variable)
{
instances.Add(declaration);
}
// recusively build tree.
CollectInstanceDeclarations(session, mapper, instance, declaration, instances, map);
}
}