----------------------------------------------------------------------------
| 107 | |
| 108 | //---------------------------------------------------------------------------- |
| 109 | vtkAbstractArray* vtkHDF5Helper::CreateDataArray(const hid_t& fileId, const std::string& pathName) |
| 110 | { |
| 111 | vtkSmartPointer<vtkAbstractArray> dataArray; |
| 112 | |
| 113 | if (!vtkHDF5Helper::ArrayExists(fileId, pathName.c_str())) |
| 114 | { |
| 115 | vtkWarningWithObjectMacro(nullptr, "Array name '" << pathName << "' isn't available."); |
| 116 | return nullptr; |
| 117 | } |
| 118 | |
| 119 | vtkHDF::ScopedH5DHandle arrayId = H5Dopen(fileId, pathName.c_str()); |
| 120 | if (arrayId < 0) |
| 121 | { |
| 122 | vtkWarningWithObjectMacro(nullptr, "No array named " << pathName << " available"); |
| 123 | return nullptr; |
| 124 | } |
| 125 | |
| 126 | hsize_t length = vtkHDF5Helper::GetDataLength(arrayId); |
| 127 | if (length <= 0) |
| 128 | { |
| 129 | return nullptr; |
| 130 | } |
| 131 | |
| 132 | std::vector<hsize_t> dims = vtkHDF5Helper::GetDataDimensions(arrayId); |
| 133 | if (dims.size() > 2) |
| 134 | { |
| 135 | vtkWarningWithObjectMacro(nullptr, "Only 1D or 2D array are supported."); |
| 136 | return nullptr; |
| 137 | } |
| 138 | |
| 139 | // Now the type |
| 140 | hid_t rawType = H5Dget_type(arrayId); |
| 141 | hid_t dataType = H5Tget_native_type(rawType, H5T_DIR_ASCEND); |
| 142 | |
| 143 | if (H5Tequal(dataType, H5T_NATIVE_INT)) |
| 144 | { |
| 145 | dataArray = vtkIntArray::New(); |
| 146 | dataArray->SetNumberOfTuples(dims[0]); |
| 147 | if (dims.size() == 2) |
| 148 | { |
| 149 | dataArray->SetNumberOfComponents(dims[1]); |
| 150 | dataArray->SetNumberOfTuples(dims[0]); |
| 151 | } |
| 152 | |
| 153 | int* arrayPtr = static_cast<int*>(vtkArrayDownCast<vtkIntArray>(dataArray)->GetPointer(0)); |
| 154 | H5Dread(arrayId, dataType, H5S_ALL, H5S_ALL, H5P_DEFAULT, arrayPtr); |
| 155 | } |
| 156 | else if (H5Tequal(dataType, H5T_NATIVE_FLOAT)) |
| 157 | { |
| 158 | dataArray = vtkFloatArray::New(); |
| 159 | dataArray->SetNumberOfTuples(dims[0]); |
| 160 | if (dims.size() == 2) |
| 161 | { |
| 162 | dataArray->SetNumberOfComponents(dims[1]); |
| 163 | dataArray->SetNumberOfTuples(dims[0]); |
| 164 | } |
| 165 | else |
| 166 | { |
no test coverage detected