Esempio n. 1
0
 def _get_sdef(self, node, obj):
     if not obj.definitions:
         return None
     sdef = ua.StructureDefinition()
     if obj.parent:
         sdef.BaseDataType = obj.parent
     for data in obj.refs:
         if data.reftype == self.server.nodes.HasEncoding.nodeid:
             # looks likebinary encodingisthe firt one...can someone confirm?
             sdef.DefaultEncodingId = data.target
             break
     optional = False
     for field in obj.definitions:
         f = ua.StructureField()
         f.Name = field.name
         f.DataType = field.datatype
         f.ValueRank = field.valuerank
         f.IsOptional = field.optional
         if f.IsOptional:
             optional = True
         f.ArrayDimensions = field.arraydim
         f.Description = ua.LocalizedText(text=field.desc)
         sdef.Fields.append(f)
     if optional:
         sdef.StructureType = ua.StructureType.StructureWithOptionalFields
     else:
         sdef.StructureType = ua.StructureType.Structure
     return sdef
Esempio n. 2
0
 def _get_sdef(self, obj):
     if not obj.definitions:
         return None
     sdef = ua.StructureDefinition()
     if obj.parent:
         sdef.BaseDataType = obj.parent
     for refdata in obj.refs:
         if refdata.reftype == self.server.nodes.HasEncoding.nodeid:
             # supposing that default encoding is the first one...
             sdef.DefaultEncodingId = refdata.target
             break
     optional = False
     for field in obj.definitions:
         f = ua.StructureField()
         f.Name = field.name
         f.DataType = field.datatype
         f.ValueRank = field.valuerank
         f.IsOptional = field.optional
         if f.IsOptional:
             optional = True
         if field.arraydim is None:
             f.ArrayDimensions = field.arraydim
         else:
             f.ArrayDimensions = [int(i) for i in field.arraydim.split(",")]
         f.Description = ua.LocalizedText(Text=field.desc)
         sdef.Fields.append(f)
     if obj.struct_type == "IsUnion":
         sdef.StructureType = ua.StructureType.Union
     elif optional or obj.struct_type == "IsOptional":
         sdef.StructureType = ua.StructureType.StructureWithOptionalFields
     else:
         sdef.StructureType = ua.StructureType.Structure
     return sdef
Esempio n. 3
0
def new_struct_field(
    name: str,
    dtype: Union[ua.NodeId, Node, ua.VariantType],
    array: bool = False,
    optional: bool = False,
    description: str = "",
) -> ua.StructureField:
    """
    simple way to create a StructureField
    """
    field = ua.StructureField()
    field.Name = name
    field.IsOptional = optional
    if description:
        field.Description = ua.LocalizedText(Text=description)
    else:
        field.Description = ua.LocalizedText(Text=name)
    if isinstance(dtype, ua.VariantType):
        field.DataType = ua.NodeId(dtype.value, 0)
    elif isinstance(dtype, ua.NodeId):
        field.DataType = dtype
    elif isinstance(dtype, Node):
        field.DataType = dtype.nodeid
    else:
        raise ValueError(f"DataType of a field must be a NodeId, not {dtype} of type {type(dtype)}")
    if array:
        field.ValueRank = ua.ValueRank.OneOrMoreDimensions
        field.ArrayDimensions = [1]
    else:
        field.ValueRank = ua.ValueRank.Scalar
        field.ArrayDimensions = None
    return field