// Fill out your copyright notice in the Description page of Project Settings. #include "HDF5Library.h" #include "Runtime/Core/Public/Misc/Paths.h" #include "Runtime/Core/Public/GenericPlatform/GenericPlatformFile.h" using namespace H5; DataSet UHDF5Library::getDatasetByName(Group & group, char * name) { DataSet dataset; try { dataset = group.openDataSet(name); } catch (...) { FString adjustedName = FString(name); if (islower(*name)) { adjustedName = adjustedName.ToUpper(); } else { adjustedName = adjustedName.ToLower(); } char* adjustedNameAsCharArray = TCHAR_TO_ANSI(*adjustedName); dataset = group.openDataSet(adjustedNameAsCharArray); } return dataset; } Group UHDF5Library::getGroupByName(H5File & file, FString name) { char* NameAsCharArray = NULL; NameAsCharArray = TCHAR_TO_ANSI(*name); Group group = file.openGroup(NameAsCharArray); return group; } /* Group UHDF5Library::getGroupByName(H5File & file, FString name) { for (int i = 0; i < 1000; ++i) { Group group; FString Number; FString Cat; char* CatAsCharArray = NULL; try { Number = FString::FromInt(i); Cat = name + Number; CatAsCharArray = TCHAR_TO_ANSI(*Cat); group = file.openGroup(CatAsCharArray); return group; } catch (...) { FString adjustedName = FString(CatAsCharArray).ToLower(); char* adjustedNameAsCharArray = TCHAR_TO_ANSI(*adjustedName); try { group = file.openGroup(adjustedNameAsCharArray); return group; } catch (...) { } } } return Group(); }*/ bool UHDF5Library::ImportData(FString FileName, TArray& X, TArray& Y, TArray& Z, TArray& U, TArray& V, TArray& W) { return false; } H5File UHDF5Library::LoadFile(FString FileName, TArray& GroupNames) { /* * Turn off the auto-printing when failure occurs so that we can * handle the errors appropriately */ Exception::dontPrint(); /* * Open the file and group */ FString relpath = FPaths::ProjectDir(); //TCHAR *dirname = TEXT("Resources"); //relpath.PathAppend(dirname, _tcslen(dirname)); relpath += FString("/Resources/"); //TCHAR *filename = TEXT("abc64x64x64.h5part"); //relpath.PathAppend(filename, _tcslen(filename)); relpath += FileName; FString abspath = IFileManager::Get().ConvertToAbsolutePathForExternalAppForRead(*relpath); char* pathAsCharArray = TCHAR_TO_ANSI(*abspath); H5File File = H5File(pathAsCharArray, H5F_ACC_RDONLY); Group Root = File.openGroup("/"); GroupNames = TArray(); for (int i = 0; i < Root.getNumObjs(); i++) { std::string GroupName; switch (Root.getObjTypeByIdx((size_t)i)) { case H5G_GROUP: GroupName = Root.getObjnameByIdx((size_t)i); GroupNames.Emplace(FString(GroupName.c_str())); break; default: break; } } return File; } bool UHDF5Library::LoadGroup(H5File File, FString GroupName, TArray& X, TArray& Y, TArray& Z, TArray& U, TArray& V, TArray& W) { Group group = getGroupByName(File, GroupName); // Get dataspace of one dataset to get the dimension. (Dimensions must be equal for all sets.) DataSet dataset = getDatasetByName(group, "X"); DataSpace dataspace = dataset.getSpace(); int rank = dataspace.getSimpleExtentNdims(); hsize_t dims_out[1]; int ndims = dataspace.getSimpleExtentDims(dims_out, NULL); int32 dimension = dims_out[0]; dataspace.selectAll(); // needed? // Output buffer initialization float* data_out = new float[dimension]; // Read datasets dataset.read(data_out, PredType::NATIVE_FLOAT); X = TArray(data_out, dims_out[0]); dataset = getDatasetByName(group, "Y"); dataset.read(data_out, PredType::NATIVE_FLOAT); Y = TArray(data_out, dims_out[0]); dataset = getDatasetByName(group, "Z"); dataset.read(data_out, PredType::NATIVE_FLOAT); Z = TArray(data_out, dims_out[0]); dataset = getDatasetByName(group, "U"); dataset.read(data_out, PredType::NATIVE_FLOAT); U = TArray(data_out, dims_out[0]); dataset = getDatasetByName(group, "V"); dataset.read(data_out, PredType::NATIVE_FLOAT); V = TArray(data_out, dims_out[0]); dataset = getDatasetByName(group, "W"); dataset.read(data_out, PredType::NATIVE_FLOAT); W = TArray(data_out, dims_out[0]); delete[] data_out; return true; }