Пример #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="_objectId"></param>
        /// <param name="_attribute"></param>
        public static void UpdateAttribute(Hdf5Identifier _objectId, Hdf5Attribute _attribute)
        {
            Hdf5Identifier attributeId = H5A.open(_objectId.Value, _attribute.Name).ToId();

            if (attributeId.Value > 0)
            {
                Hdf5DataType  type     = TypeHelper.GetDataTypeFromAttribute(attributeId);
                Hdf5DataTypes enumType = TypeHelper.GetDataTypesEnum(_attribute.Value.GetType());

                if (type.Type == enumType)
                {
                    if (enumType == Hdf5DataTypes.String)
                    {
                        H5A.close(attributeId.Value);
                        DeleteAttribute(_objectId, _attribute.Name);
                        Hdf5Attribute attribute = CreateAttribute(_objectId, _attribute.Name, _attribute.Value);

                        if (attribute != null)
                        {
                            _attribute.Id    = attribute.Id;
                            _attribute.Name  = attribute.Name;
                            _attribute.Value = attribute.Value;
                        }
                    }
                    else
                    {
                        WriteObjectValue(type, attributeId, _attribute.Value);
                    }
                }
                else
                {
                    throw new Hdf5TypeMismatchException();
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Routes to generic read method based on correct data type
        /// </summary>
        /// <param name="_dataType"></param>
        /// <param name="_attributeId"></param>
        /// <returns></returns>
        public static Object ReadValue(
            Hdf5DataType _dataType,
            Hdf5Identifier _attributeId)
        {
            if (_dataType.Type == Hdf5DataTypes.Int8)
            {
                return(ReadValue <sbyte>(_dataType, _attributeId));
            }

            if (_dataType.Type == Hdf5DataTypes.Int16)
            {
                return(ReadValue <Int16>(_dataType, _attributeId));
            }

            if (_dataType.Type == Hdf5DataTypes.Int32)
            {
                return(ReadValue <Int32>(_dataType, _attributeId));
            }

            if (_dataType.Type == Hdf5DataTypes.Int64)
            {
                return(ReadValue <Int64>(_dataType, _attributeId));
            }

            if (_dataType.Type == Hdf5DataTypes.UInt8)
            {
                return(ReadValue <byte>(_dataType, _attributeId));
            }

            if (_dataType.Type == Hdf5DataTypes.UInt16)
            {
                return(ReadValue <UInt16>(_dataType, _attributeId));
            }

            if (_dataType.Type == Hdf5DataTypes.UInt32)
            {
                return(ReadValue <UInt32>(_dataType, _attributeId));
            }

            if (_dataType.Type == Hdf5DataTypes.UInt64)
            {
                return(ReadValue <UInt64>(_dataType, _attributeId));
            }

            if (_dataType.Type == Hdf5DataTypes.Single)
            {
                return(ReadValue <Single>(_dataType, _attributeId));
            }

            if (_dataType.Type == Hdf5DataTypes.Double)
            {
                return(ReadValue <Double>(_dataType, _attributeId));
            }

            throw new Hdf5UnknownDataType();
        }
Пример #3
0
        /// <summary>
        /// Assumes that dataset already open
        /// </summary>
        /// <param name="_fileId"></param>
        /// <param name="_datasetId"></param>
        /// <param name="_fullPath"></param>
        /// <returns></returns>
        public static Hdf5Dataset LoadDataset(Hdf5Identifier _fileId, Hdf5Identifier _datasetId, string _fullPath)
        {
            Hdf5DataType  datatype  = TypeHelper.GetDataTypeFromDataset(_datasetId);
            Hdf5Dataspace dataspace = DataspaceHelper.GetDataspace(_datasetId);

            Hdf5Dataset dataset = new Hdf5Dataset(_fileId, _datasetId, _fullPath)
            {
                Dataspace = dataspace,
                DataType  = datatype
            };

            return(dataset);
        }
Пример #4
0
        /// <summary>
        /// Reads from the hdf file
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="_dataType"></param>
        /// <param name="_attributeId"></param>
        /// <returns></returns>
        private static T ReadValue <T>(
            Hdf5DataType _dataType,
            Hdf5Identifier _attributeId)
        {
            T[] value = new T[1];

            GCHandle arrayHandle = GCHandle.Alloc(value, GCHandleType.Pinned);

            var dataType = H5T.copy(_dataType.NativeType.Value).ToId();

            int result = H5A.read(_attributeId.Value, dataType.Value, arrayHandle.AddrOfPinnedObject());

            arrayHandle.Free();

            H5T.close(dataType.Value);

            return(value[0]);
        }
Пример #5
0
        /// <summary>
        /// Writes the specified value to the file
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="_dataType"></param>
        /// <param name="_attributeId"></param>
        /// <param name="_value"></param>
        private static void WriteValue <T>(
            Hdf5DataType _dataType,
            Hdf5Identifier _attributeId,
            T _value)
        {
            T[] value = new T[1];
            value[0] = _value;

            GCHandle arrayHandle = GCHandle.Alloc(value, GCHandleType.Pinned);

            var dataType = H5T.copy(_dataType.NativeType.Value).ToId();

            int result = H5A.write(_attributeId.Value, dataType.Value, arrayHandle.AddrOfPinnedObject());

            arrayHandle.Free();

            H5T.close(dataType.Value);
        }
Пример #6
0
        /// <summary>
        /// Reads a non-string attribute
        /// Assumes the parent object is already open
        /// </summary>
        /// <param name="_attributeId"></param>
        /// <param name="_title"></param>
        /// <param name="_type"></param>
        /// <returns></returns>
        public static Hdf5Attribute GetAttribute(Hdf5Identifier _attributeId, string _title, Hdf5DataType _type)
        {
            Object value = ReadValue(_type, _attributeId);

            var attribute = new Hdf5Attribute
            {
                Id    = _attributeId,
                Name  = _title,
                Value = value
            };

            return(attribute);
        }
Пример #7
0
        public static void WriteObjectValue(
            Hdf5DataType _dataType,
            Hdf5Identifier _attributeId,
            object _value)
        {
            if (_dataType.Type == Hdf5DataTypes.Int8)
            {
                WriteValue(_dataType, _attributeId, (sbyte)_value);
                return;
            }

            if (_dataType.Type == Hdf5DataTypes.Int16)
            {
                WriteValue(_dataType, _attributeId, (Int16)_value);
                return;
            }

            if (_dataType.Type == Hdf5DataTypes.Int32)
            {
                WriteValue(_dataType, _attributeId, (Int32)_value);
                return;
            }

            if (_dataType.Type == Hdf5DataTypes.Int64)
            {
                WriteValue(_dataType, _attributeId, (Int64)_value);
                return;
            }

            if (_dataType.Type == Hdf5DataTypes.UInt8)
            {
                WriteValue(_dataType, _attributeId, (byte)_value);
                return;
            }

            if (_dataType.Type == Hdf5DataTypes.UInt16)
            {
                WriteValue(_dataType, _attributeId, (UInt16)_value);
                return;
            }

            if (_dataType.Type == Hdf5DataTypes.UInt32)
            {
                WriteValue(_dataType, _attributeId, (UInt32)_value);
                return;
            }

            if (_dataType.Type == Hdf5DataTypes.UInt64)
            {
                WriteValue(_dataType, _attributeId, (UInt64)_value);
                return;
            }

            if (_dataType.Type == Hdf5DataTypes.Single)
            {
                WriteValue(_dataType, _attributeId, (Single)_value);
                return;
            }

            if (_dataType.Type == Hdf5DataTypes.Double)
            {
                WriteValue(_dataType, _attributeId, (Double)_value);
                return;
            }

            throw new Hdf5UnknownDataType();
        }
Пример #8
0
        public static Hdf5DataType GetDataTypeByType(Hdf5Identifier _typeId)
        {
            var typeClass = H5T.get_class(_typeId.Value);
            var typeSize  = (int)H5T.get_size(_typeId.Value);
            var typeSign  = H5T.get_sign(_typeId.Value);
            var typeOrder = H5T.get_order(_typeId.Value);

            Hdf5DataType dt = new Hdf5DataType
            {
                Id   = _typeId,
                Size = typeSize,
            };

            if (typeOrder == H5T.order_t.BE)
            {
                dt.ByteOrder = Hdf5ByteOrder.BigEndian;
            }
            else if (typeOrder == H5T.order_t.LE)
            {
                dt.ByteOrder = Hdf5ByteOrder.LittleEndian;
            }
            else if (typeOrder == H5T.order_t.ONE)
            {
                dt.ByteOrder = Hdf5ByteOrder.None;
            }

            if (typeClass == H5T.class_t.INTEGER)
            {
                if (typeSign == H5T.sign_t.NONE)
                {
                    if (typeSize == 1)
                    {
                        dt.Type       = Hdf5DataTypes.UInt8;
                        dt.NativeType = H5T.NATIVE_UINT8.ToId();
                    }
                    else if (typeSize == 2)
                    {
                        dt.Type       = Hdf5DataTypes.UInt16;
                        dt.NativeType = H5T.NATIVE_UINT16.ToId();
                    }
                    else if (typeSize == 4)
                    {
                        dt.Type       = Hdf5DataTypes.UInt32;
                        dt.NativeType = H5T.NATIVE_UINT32.ToId();
                    }
                    else if (typeSize == 8)
                    {
                        dt.Type       = Hdf5DataTypes.UInt64;
                        dt.NativeType = H5T.NATIVE_UINT64.ToId();
                    }
                }
                else
                {
                    if (typeSize == 1)
                    {
                        dt.Type       = Hdf5DataTypes.Int8;
                        dt.NativeType = H5T.NATIVE_INT8.ToId();
                    }
                    else if (typeSize == 2)
                    {
                        dt.Type       = Hdf5DataTypes.Int16;
                        dt.NativeType = H5T.NATIVE_INT16.ToId();
                    }
                    else if (typeSize == 4)
                    {
                        dt.Type       = Hdf5DataTypes.Int32;
                        dt.NativeType = H5T.NATIVE_INT32.ToId();
                    }
                    else if (typeSize == 8)
                    {
                        dt.Type       = Hdf5DataTypes.Int64;
                        dt.NativeType = H5T.NATIVE_INT64.ToId();
                    }
                }
            }
            else if (typeClass == H5T.class_t.FLOAT)
            {
                if (typeSize == 4)
                {
                    dt.Type       = Hdf5DataTypes.Single;
                    dt.NativeType = H5T.NATIVE_FLOAT.ToId();
                }
                else if (typeSize == 8)
                {
                    dt.Type       = Hdf5DataTypes.Double;
                    dt.NativeType = H5T.NATIVE_DOUBLE.ToId();
                }
            }
            else if (typeClass == H5T.class_t.STRING)
            {
                dt.Type       = Hdf5DataTypes.String;
                dt.NativeType = H5T.C_S1.ToId();
            }

            return(dt);
        }