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
async def new_struct( server: Union["Server", "Client"], idx: Union[int, ua.NodeId], name: Union[int, ua.QualifiedName], fields: List[ua.StructureField], ) -> Tuple[Node, List[Node]]: """ simple way to create a new structure return the created data type node and the list of encoding nodes """ dtype = await create_data_type(server.nodes.base_structure_type, idx, name) if isinstance(idx, ua.NodeId): # user has provided a node id, we cannot reuse it idx = idx.NamespaceIndex enc = await create_encoding(dtype, idx, "Default Binary") # TODO: add other encoding the day we support them sdef = ua.StructureDefinition() sdef.StructureType = ua.StructureType.Structure for sfield in fields: if sfield.IsOptional: sdef.StructureType = ua.StructureType.StructureWithOptionalFields break sdef.Fields = fields sdef.BaseDataType = server.nodes.base_data_type.nodeid sdef.DefaultEncodingId = enc.nodeid await dtype.write_data_type_definition(sdef) return dtype, [enc]
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
async def new_struct(server, idx, name, fields): """ simple way to create a new structure """ dtype = await create_data_type(server.nodes.base_structure_type, idx, name) enc = await create_encoding(dtype, idx, "Default Binary") # TODO: add other encoding the day we support them sdef = ua.StructureDefinition() sdef.StructureType = ua.StructureType.Structure for field in fields: if field.IsOptional: sdef.StructureType = ua.StructureType.StructureWithOptionalFields break sdef.Fields = fields sdef.BaseDatatype = server.nodes.base_data_type.nodeid sdef.DefaultEncodingId = enc.nodeid await dtype.write_data_type_definition(sdef) return dtype