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
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
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