Source code for SEAScope.types.variable

# vim: ts=4:sts=4:sw=4
#
# @author: <sylvain.herledan@oceandatalab.com>
# @date: 2016-09-07
#
# This file is part of SEAScope, a 3D visualisation and analysis application
# for satellite, in-situ and numerical model data.
#
# Copyright (C) 2014-2023 OceanDataLab
#
# SEAScope is free software: you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# SEAScope is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
# details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with SEAScope. If not, see <https://www.gnu.org/licenses/>.

"""
This module handles the serialization and deserialization of variable objects
"""

import logging
import flatbuffers
import SEAScope.API.Variable
import SEAScope.API.RenderingMethod
import SEAScope.types.tag
import SEAScope.types.rendering_cfg

logger = logging.getLogger(__name__)
rendering_methods = SEAScope.types.rendering_cfg.rendering_methods


[docs] def serialize(builder, var_obj): """ Serialize a variable using FlatBuffers. Parameters ---------- builder : flatbuffers.builder.Builder The FlatBuffers builder instance which serializes data. If this parameter is None, then a new builder will be created var_obj : dict Dictionary which contains information about the variable to serialize It must have five keys: - ``label`` : a :obj:`str` that SEAScope uses to designate the variable - ``units`` : a :obj:`str` for the units of the variable - ``fields`` : a :obj:`list` of :obj:`str` which contains the name of the data fields that must be read in order to recompose the variable. For example the U and V components for a vectorfield, or three channels for RGB images - ``tags`` : a :obj:`dict` which contains tags that describe the variable. SEAScope considers a (key, value) pair as a tag. - ``defaultRenderingMethod`` : a :obj:`str` that designates the rendering method that must be used by default for this variable. This parameter must be one of the keys of the :const:`SEAScope.types.rendering_cfg.rendering_methods` dictionary Returns ------- tuple(flatbuffers.builder.Builder, int) A tuple which contains two elements: - the :obj:`flatbuffers.builder.Builder` instance which has been used to serialize data - an :obj:`int` which is the address/offset of the serialized object in the builder buffer """ if builder is None: builder = flatbuffers.Builder(0) _id = int(var_obj['id']) _label = builder.CreateString(var_obj['label']) _units = builder.CreateString(var_obj['units']) fields_buffer = [] for field in var_obj['fields']: _field = builder.CreateString(field) fields_buffer.append(_field) fields_len = len(fields_buffer) SEAScope.API.Variable.VariableStartFieldsVector(builder, fields_len) for t in fields_buffer: builder.PrependUOffsetTRelative(t) _fields = builder.EndVector(fields_len) tags_buffer = [] for k, v in var_obj['tags'].items(): _, _tag = SEAScope.types.tag.serialize(builder, k, v) tags_buffer.append(_tag) tags_len = len(tags_buffer) SEAScope.API.Variable.VariableStartTagsVector(builder, tags_len) for t in tags_buffer: builder.PrependUOffsetTRelative(t) _tags = builder.EndVector(tags_len) rendering = var_obj['defaultRenderingMethod'] _default_rendering = rendering_methods.get(rendering, None) SEAScope.API.Variable.VariableStart(builder) SEAScope.API.Variable.VariableAddId(builder, _id) SEAScope.API.Variable.VariableAddLabel(builder, _label) SEAScope.API.Variable.VariableAddUnits(builder, _units) SEAScope.API.Variable.VariableAddFields(builder, _fields) SEAScope.API.Variable.VariableAddTags(builder, _tags) SEAScope.API.Variable.VariableAddDefaultRenderingMethod(builder, _default_rendering) variable = SEAScope.API.Variable.VariableEnd(builder) return builder, variable
[docs] def deserialize(v): """ Rebuild a variable from a FlatBuffers buffer. Parameters ---------- buf : bytearray The buffer which contains the variable object serialized with FlatBuffers Returns ------- dict The deserialized variable object as a dictionary. """ v_obj = {} v_obj['id'] = v.Id() v_obj['label'] = v.Label() v_obj['units'] = v.Units() fields_count = v.FieldsLength() v_obj['fields'] = [v.Fields(x) for x in range(0, fields_count)] tags_count = v.TagsLength() v_obj['tags'] = {} for i in range(0, tags_count): name, value = SEAScope.types.tag.deserialize(v.Tags(i)) v_obj['tags'][name] = value v_obj['defaultRenderingMethod'] = 'NONE' rendering = v.DefaultRenderingMethod() for k, v in rendering_methods.items(): if v == rendering: v_obj['defaultRenderingMethod'] = k break return v_obj