2015-10-26 14:07:36 +00:00
|
|
|
//============================================================================
|
|
|
|
// Copyright (c) Kitware, Inc.
|
|
|
|
// All rights reserved.
|
|
|
|
// See LICENSE.txt for details.
|
2019-04-15 23:24:21 +00:00
|
|
|
//
|
2015-10-26 14:07:36 +00:00
|
|
|
// This software is distributed WITHOUT ANY WARRANTY; without even
|
|
|
|
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
|
|
// PURPOSE. See the above copyright notice for more information.
|
|
|
|
//============================================================================
|
|
|
|
#ifndef vtk_m_io_reader_VTKDataSetReaderBase_h
|
|
|
|
#define vtk_m_io_reader_VTKDataSetReaderBase_h
|
|
|
|
|
2015-11-17 16:32:19 +00:00
|
|
|
#include <vtkm/io/internal/Endian.h>
|
|
|
|
#include <vtkm/io/internal/VTKDataSetCells.h>
|
|
|
|
#include <vtkm/io/internal/VTKDataSetStructures.h>
|
|
|
|
#include <vtkm/io/internal/VTKDataSetTypes.h>
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
#include <vtkm/Types.h>
|
|
|
|
#include <vtkm/VecTraits.h>
|
|
|
|
#include <vtkm/cont/ArrayHandle.h>
|
|
|
|
#include <vtkm/cont/ArrayPortalToIterators.h>
|
|
|
|
#include <vtkm/cont/DataSet.h>
|
2018-12-11 13:56:08 +00:00
|
|
|
#include <vtkm/cont/VariantArrayHandle.h>
|
2017-04-13 18:06:33 +00:00
|
|
|
#include <vtkm/internal/ExportMacros.h>
|
2015-10-26 14:07:36 +00:00
|
|
|
#include <vtkm/io/ErrorIO.h>
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
#include <fstream>
|
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
namespace vtkm
|
|
|
|
{
|
|
|
|
namespace io
|
|
|
|
{
|
|
|
|
namespace reader
|
|
|
|
{
|
2015-10-26 14:07:36 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
namespace internal
|
|
|
|
{
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
struct VTKDataSetFile
|
|
|
|
{
|
|
|
|
std::string FileName;
|
|
|
|
vtkm::Id2 Version;
|
|
|
|
std::string Title;
|
|
|
|
bool IsBinary;
|
2015-11-17 16:32:19 +00:00
|
|
|
vtkm::io::internal::DataSetStructure Structure;
|
2015-10-26 14:07:36 +00:00
|
|
|
std::ifstream Stream;
|
|
|
|
};
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
inline void PrintVTKDataFileSummary(const VTKDataSetFile& df, std::ostream& out)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
out << "\tFile: " << df.FileName << std::endl;
|
|
|
|
out << "\tVersion: " << df.Version[0] << "." << df.Version[0] << std::endl;
|
|
|
|
out << "\tTitle: " << df.Title << std::endl;
|
|
|
|
out << "\tFormat: " << (df.IsBinary ? "BINARY" : "ASCII") << std::endl;
|
2015-11-17 16:32:19 +00:00
|
|
|
out << "\tDataSet type: " << vtkm::io::internal::DataSetStructureString(df.Structure)
|
|
|
|
<< std::endl;
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inline void parseAssert(bool condition)
|
|
|
|
{
|
|
|
|
if (!condition)
|
|
|
|
{
|
|
|
|
throw vtkm::io::ErrorIO("Parse Error");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
template <typename T>
|
|
|
|
struct StreamIOType
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = T;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct StreamIOType<vtkm::Int8>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Int16;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct StreamIOType<vtkm::UInt8>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::UInt16;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
2015-10-26 14:07:36 +00:00
|
|
|
|
2018-12-11 13:56:08 +00:00
|
|
|
// Since Fields and DataSets store data in the default VariantArrayHandle, convert
|
2015-11-10 17:26:13 +00:00
|
|
|
// the data to the closest type supported by default. The following will
|
2018-12-11 13:56:08 +00:00
|
|
|
// need to be updated if VariantArrayHandle or TypeListTagCommon changes.
|
2017-05-18 14:29:41 +00:00
|
|
|
template <typename T>
|
|
|
|
struct ClosestCommonType
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = T;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestCommonType<vtkm::Int8>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Int32;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestCommonType<vtkm::UInt8>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Int32;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestCommonType<vtkm::Int16>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Int32;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestCommonType<vtkm::UInt16>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Int32;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestCommonType<vtkm::UInt32>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Int64;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestCommonType<vtkm::UInt64>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Int64;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
struct ClosestFloat
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = T;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestFloat<vtkm::Int8>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Float32;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestFloat<vtkm::UInt8>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Float32;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestFloat<vtkm::Int16>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Float32;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestFloat<vtkm::UInt16>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Float32;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestFloat<vtkm::Int32>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Float64;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestFloat<vtkm::UInt32>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Float64;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestFloat<vtkm::Int64>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Float64;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
|
|
|
template <>
|
|
|
|
struct ClosestFloat<vtkm::UInt64>
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using Type = vtkm::Float64;
|
2017-05-18 14:29:41 +00:00
|
|
|
};
|
2015-10-26 14:07:36 +00:00
|
|
|
|
2015-11-10 17:26:13 +00:00
|
|
|
template <typename T>
|
2018-12-11 13:56:08 +00:00
|
|
|
vtkm::cont::VariantArrayHandle CreateVariantArrayHandle(const std::vector<T>& vec)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
2015-11-10 17:26:13 +00:00
|
|
|
switch (vtkm::VecTraits<T>::NUM_COMPONENTS)
|
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
case 1:
|
2015-11-10 17:26:13 +00:00
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using CommonType = typename ClosestCommonType<T>::Type;
|
2018-02-22 16:34:08 +00:00
|
|
|
constexpr bool not_same = !std::is_same<T, CommonType>::value;
|
2017-09-21 14:33:17 +00:00
|
|
|
if (not_same)
|
2017-05-18 14:29:41 +00:00
|
|
|
{
|
|
|
|
std::cerr << "Type " << vtkm::io::internal::DataTypeName<T>::Name()
|
|
|
|
<< " is currently unsupported. Converting to "
|
|
|
|
<< vtkm::io::internal::DataTypeName<CommonType>::Name() << "." << std::endl;
|
|
|
|
}
|
2015-11-11 20:35:08 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::cont::ArrayHandle<CommonType> output;
|
|
|
|
output.Allocate(static_cast<vtkm::Id>(vec.size()));
|
2018-11-08 21:29:52 +00:00
|
|
|
auto portal = output.GetPortalControl();
|
2017-05-18 14:29:41 +00:00
|
|
|
for (vtkm::Id i = 0; i < output.GetNumberOfValues(); ++i)
|
|
|
|
{
|
2018-11-08 21:29:52 +00:00
|
|
|
portal.Set(i, static_cast<CommonType>(vec[static_cast<std::size_t>(i)]));
|
2017-05-18 14:29:41 +00:00
|
|
|
}
|
2015-11-10 17:26:13 +00:00
|
|
|
|
2018-12-11 13:56:08 +00:00
|
|
|
return vtkm::cont::VariantArrayHandle(output);
|
2015-11-10 17:26:13 +00:00
|
|
|
}
|
2017-05-18 14:29:41 +00:00
|
|
|
case 2:
|
|
|
|
case 3:
|
2015-11-10 17:26:13 +00:00
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using InComponentType = typename vtkm::VecTraits<T>::ComponentType;
|
|
|
|
using OutComponentType = typename ClosestFloat<InComponentType>::Type;
|
|
|
|
using CommonType = vtkm::Vec<OutComponentType, 3>;
|
2018-02-22 16:34:08 +00:00
|
|
|
constexpr bool not_same = !std::is_same<T, CommonType>::value;
|
2017-09-21 14:33:17 +00:00
|
|
|
if (not_same)
|
2017-05-18 14:29:41 +00:00
|
|
|
{
|
|
|
|
std::cerr << "Type " << vtkm::io::internal::DataTypeName<InComponentType>::Name() << "["
|
|
|
|
<< vtkm::VecTraits<T>::NUM_COMPONENTS << "] "
|
|
|
|
<< "is currently unsupported. Converting to "
|
|
|
|
<< vtkm::io::internal::DataTypeName<OutComponentType>::Name() << "[3]."
|
|
|
|
<< std::endl;
|
|
|
|
}
|
2015-11-10 17:26:13 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::cont::ArrayHandle<CommonType> output;
|
|
|
|
output.Allocate(static_cast<vtkm::Id>(vec.size()));
|
2018-11-08 21:29:52 +00:00
|
|
|
auto portal = output.GetPortalControl();
|
2017-05-18 14:29:41 +00:00
|
|
|
for (vtkm::Id i = 0; i < output.GetNumberOfValues(); ++i)
|
2015-11-11 20:35:08 +00:00
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
CommonType outval = CommonType();
|
|
|
|
for (vtkm::IdComponent j = 0; j < vtkm::VecTraits<T>::NUM_COMPONENTS; ++j)
|
|
|
|
{
|
|
|
|
outval[j] = static_cast<OutComponentType>(
|
2015-11-11 20:35:08 +00:00
|
|
|
vtkm::VecTraits<T>::GetComponent(vec[static_cast<std::size_t>(i)], j));
|
2017-05-18 14:29:41 +00:00
|
|
|
}
|
2018-11-08 21:29:52 +00:00
|
|
|
portal.Set(i, outval);
|
2015-11-11 20:35:08 +00:00
|
|
|
}
|
2015-11-10 17:26:13 +00:00
|
|
|
|
2018-12-11 13:56:08 +00:00
|
|
|
return vtkm::cont::VariantArrayHandle(output);
|
2015-11-10 17:26:13 +00:00
|
|
|
}
|
2017-05-18 14:29:41 +00:00
|
|
|
default:
|
2015-11-10 17:26:13 +00:00
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
std::cerr << "Only 1, 2, or 3 components supported. Skipping." << std::endl;
|
2018-12-11 13:56:08 +00:00
|
|
|
return vtkm::cont::VariantArrayHandle(vtkm::cont::ArrayHandle<vtkm::Float32>());
|
2015-11-10 17:26:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-10-26 14:07:36 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
inline vtkm::cont::DynamicCellSet CreateCellSetStructured(const vtkm::Id3& dim)
|
2017-03-13 17:07:47 +00:00
|
|
|
{
|
|
|
|
if (dim[0] > 1 && dim[1] > 1 && dim[2] > 1)
|
|
|
|
{
|
|
|
|
vtkm::cont::CellSetStructured<3> cs("cells");
|
|
|
|
cs.SetPointDimensions(vtkm::make_Vec(dim[0], dim[1], dim[2]));
|
|
|
|
return cs;
|
|
|
|
}
|
|
|
|
else if (dim[0] > 1 && dim[1] > 1 && dim[2] <= 1)
|
|
|
|
{
|
|
|
|
vtkm::cont::CellSetStructured<2> cs("cells");
|
|
|
|
cs.SetPointDimensions(vtkm::make_Vec(dim[0], dim[1]));
|
|
|
|
return cs;
|
|
|
|
}
|
|
|
|
else if (dim[0] > 1 && dim[1] <= 1 && dim[2] <= 1)
|
|
|
|
{
|
|
|
|
vtkm::cont::CellSetStructured<1> cs("cells");
|
|
|
|
cs.SetPointDimensions(dim[0]);
|
|
|
|
return cs;
|
|
|
|
}
|
|
|
|
|
2018-01-08 21:53:33 +00:00
|
|
|
std::stringstream ss;
|
|
|
|
ss << "Unsupported dimensions: (" << dim[0] << ", " << dim[1] << ", " << dim[2]
|
|
|
|
<< "), 2D structured datasets should be on X-Y plane and "
|
|
|
|
<< "1D structured datasets should be along X axis";
|
|
|
|
throw vtkm::io::ErrorIO(ss.str());
|
2017-03-13 17:07:47 +00:00
|
|
|
}
|
|
|
|
|
2015-10-26 14:07:36 +00:00
|
|
|
} // namespace internal
|
|
|
|
|
2017-04-13 18:06:33 +00:00
|
|
|
VTKM_SILENCE_WEAK_VTABLE_WARNING_START
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
class VTKDataSetReaderBase
|
|
|
|
{
|
|
|
|
public:
|
2017-05-18 14:29:41 +00:00
|
|
|
explicit VTKDataSetReaderBase(const char* fileName)
|
|
|
|
: DataFile(new internal::VTKDataSetFile)
|
|
|
|
, DataSet()
|
|
|
|
, Loaded(false)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
this->DataFile->FileName = fileName;
|
|
|
|
}
|
|
|
|
|
2018-07-13 16:07:46 +00:00
|
|
|
explicit VTKDataSetReaderBase(const std::string& fileName)
|
|
|
|
: DataFile(new internal::VTKDataSetFile)
|
|
|
|
, DataSet()
|
|
|
|
, Loaded(false)
|
|
|
|
{
|
|
|
|
this->DataFile->FileName = fileName;
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
virtual ~VTKDataSetReaderBase() {}
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
const vtkm::cont::DataSet& ReadDataSet()
|
|
|
|
{
|
|
|
|
if (!this->Loaded)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
this->OpenFile();
|
|
|
|
this->ReadHeader();
|
|
|
|
this->Read();
|
|
|
|
this->CloseFile();
|
|
|
|
this->Loaded = true;
|
|
|
|
}
|
2017-05-18 14:29:41 +00:00
|
|
|
catch (std::ifstream::failure& e)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
std::string message("IO Error: ");
|
|
|
|
throw vtkm::io::ErrorIO(message + e.what());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return this->DataSet;
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
const vtkm::cont::DataSet& GetDataSet() const { return this->DataSet; }
|
2015-10-26 14:07:36 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
virtual void PrintSummary(std::ostream& out) const
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
out << "VTKDataSetReader" << std::endl;
|
|
|
|
PrintVTKDataFileSummary(*this->DataFile.get(), out);
|
|
|
|
this->DataSet.PrintSummary(out);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
void ReadPoints()
|
|
|
|
{
|
2016-01-20 20:58:41 +00:00
|
|
|
std::string dataType;
|
2015-10-26 14:07:36 +00:00
|
|
|
std::size_t numPoints;
|
2016-01-20 20:58:41 +00:00
|
|
|
this->DataFile->Stream >> numPoints >> dataType >> std::ws;
|
2015-10-26 14:07:36 +00:00
|
|
|
|
2018-12-11 13:56:08 +00:00
|
|
|
vtkm::cont::VariantArrayHandle points;
|
2018-11-08 21:29:52 +00:00
|
|
|
this->DoReadArrayVariant(dataType, numPoints, 3, points);
|
2015-10-26 14:07:36 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
this->DataSet.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", points));
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
void ReadCells(vtkm::cont::ArrayHandle<vtkm::Id>& connectivity,
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::IdComponent>& numIndices)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
2015-11-17 16:32:19 +00:00
|
|
|
vtkm::Id numCells, numInts;
|
2015-10-26 14:07:36 +00:00
|
|
|
this->DataFile->Stream >> numCells >> numInts >> std::ws;
|
|
|
|
|
2015-11-17 16:32:19 +00:00
|
|
|
connectivity.Allocate(numInts - numCells);
|
|
|
|
numIndices.Allocate(numCells);
|
2015-10-26 14:07:36 +00:00
|
|
|
|
2015-11-17 16:32:19 +00:00
|
|
|
std::vector<vtkm::Int32> buffer(static_cast<std::size_t>(numInts));
|
|
|
|
this->ReadArray(buffer);
|
2015-10-26 14:07:36 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::Int32* buffp = &buffer[0];
|
2018-11-08 21:29:52 +00:00
|
|
|
auto connectivityPortal = connectivity.GetPortalControl();
|
|
|
|
auto numIndicesPortal = numIndices.GetPortalControl();
|
2015-11-17 16:32:19 +00:00
|
|
|
for (vtkm::Id i = 0, connInd = 0; i < numCells; ++i)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
2015-11-17 16:32:19 +00:00
|
|
|
vtkm::IdComponent numInds = static_cast<vtkm::IdComponent>(*buffp++);
|
|
|
|
numIndicesPortal.Set(i, numInds);
|
|
|
|
for (vtkm::IdComponent j = 0; j < numInds; ++j, ++connInd)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
2015-11-17 16:32:19 +00:00
|
|
|
connectivityPortal.Set(connInd, static_cast<vtkm::Id>(*buffp++));
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
void ReadShapes(vtkm::cont::ArrayHandle<vtkm::UInt8>& shapes)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
std::string tag;
|
2015-11-17 16:32:19 +00:00
|
|
|
vtkm::Id numCells;
|
2015-10-26 14:07:36 +00:00
|
|
|
this->DataFile->Stream >> tag >> numCells >> std::ws;
|
|
|
|
internal::parseAssert(tag == "CELL_TYPES");
|
|
|
|
|
2015-11-17 16:32:19 +00:00
|
|
|
shapes.Allocate(numCells);
|
|
|
|
std::vector<vtkm::Int32> buffer(static_cast<std::size_t>(numCells));
|
|
|
|
this->ReadArray(buffer);
|
2015-10-26 14:07:36 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::Int32* buffp = &buffer[0];
|
2018-11-08 21:29:52 +00:00
|
|
|
auto shapesPortal = shapes.GetPortalControl();
|
2015-11-17 16:32:19 +00:00
|
|
|
for (vtkm::Id i = 0; i < numCells; ++i)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
2015-11-17 16:32:19 +00:00
|
|
|
shapesPortal.Set(i, static_cast<vtkm::UInt8>(*buffp++));
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReadAttributes()
|
|
|
|
{
|
|
|
|
if (this->DataFile->Stream.eof())
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-05-18 20:10:15 +00:00
|
|
|
vtkm::cont::Field::Association association = vtkm::cont::Field::Association::ANY;
|
2015-10-26 14:07:36 +00:00
|
|
|
std::size_t size;
|
|
|
|
|
|
|
|
std::string tag;
|
|
|
|
this->DataFile->Stream >> tag;
|
|
|
|
while (!this->DataFile->Stream.eof())
|
|
|
|
{
|
|
|
|
if (tag == "POINT_DATA")
|
|
|
|
{
|
2018-05-18 20:10:15 +00:00
|
|
|
association = vtkm::cont::Field::Association::POINTS;
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
else if (tag == "CELL_DATA")
|
|
|
|
{
|
2018-05-18 20:10:15 +00:00
|
|
|
association = vtkm::cont::Field::Association::CELL_SET;
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
internal::parseAssert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
this->DataFile->Stream >> size;
|
|
|
|
while (!this->DataFile->Stream.eof())
|
|
|
|
{
|
|
|
|
std::string name;
|
|
|
|
vtkm::cont::ArrayHandle<vtkm::Float32> empty;
|
2018-12-11 13:56:08 +00:00
|
|
|
vtkm::cont::VariantArrayHandle data(empty);
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
this->DataFile->Stream >> tag;
|
|
|
|
if (tag == "SCALARS")
|
|
|
|
{
|
|
|
|
this->ReadScalars(size, name, data);
|
|
|
|
}
|
|
|
|
else if (tag == "COLOR_SCALARS")
|
|
|
|
{
|
|
|
|
this->ReadColorScalars(size, name);
|
|
|
|
}
|
|
|
|
else if (tag == "LOOKUP_TABLE")
|
|
|
|
{
|
|
|
|
this->ReadLookupTable(name);
|
|
|
|
}
|
|
|
|
else if (tag == "VECTORS" || tag == "NORMALS")
|
|
|
|
{
|
|
|
|
this->ReadVectors(size, name, data);
|
|
|
|
}
|
|
|
|
else if (tag == "TEXTURE_COORDINATES")
|
|
|
|
{
|
|
|
|
this->ReadTextureCoordinates(size, name, data);
|
|
|
|
}
|
|
|
|
else if (tag == "TENSORS")
|
|
|
|
{
|
|
|
|
this->ReadTensors(size, name, data);
|
|
|
|
}
|
|
|
|
else if (tag == "FIELD")
|
|
|
|
{
|
|
|
|
this->ReadFields(name);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (data.GetNumberOfValues() > 0)
|
|
|
|
{
|
|
|
|
switch (association)
|
|
|
|
{
|
2018-05-18 20:10:15 +00:00
|
|
|
case vtkm::cont::Field::Association::POINTS:
|
2017-05-18 14:29:41 +00:00
|
|
|
this->DataSet.AddField(vtkm::cont::Field(name, association, data));
|
|
|
|
break;
|
2018-05-18 20:10:15 +00:00
|
|
|
case vtkm::cont::Field::Association::CELL_SET:
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::cont::CastAndCall(data, PermuteCellData(this->CellsPermutation, data));
|
|
|
|
this->DataSet.AddField(vtkm::cont::Field(name, association, "cells", data));
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
void SetCellsPermutation(const vtkm::cont::ArrayHandle<vtkm::Id>& permutation)
|
2015-11-17 16:32:19 +00:00
|
|
|
{
|
|
|
|
this->CellsPermutation = permutation;
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
void TransferDataFile(VTKDataSetReaderBase& reader)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
reader.DataFile.swap(this->DataFile);
|
2016-08-30 13:44:04 +00:00
|
|
|
this->DataFile.reset(nullptr);
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
virtual void CloseFile() { this->DataFile->Stream.close(); }
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
void OpenFile()
|
|
|
|
{
|
|
|
|
this->DataFile->Stream.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
|
|
|
this->DataFile->Stream.open(this->DataFile->FileName.c_str(),
|
|
|
|
std::ios_base::in | std::ios_base::binary);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ReadHeader()
|
|
|
|
{
|
|
|
|
char vstring[] = "# vtk DataFile Version";
|
2016-06-09 17:00:06 +00:00
|
|
|
const std::size_t vlen = sizeof(vstring);
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
// Read version line
|
|
|
|
char vbuf[vlen];
|
|
|
|
this->DataFile->Stream.read(vbuf, vlen - 1);
|
|
|
|
vbuf[vlen - 1] = '\0';
|
2016-03-31 13:05:03 +00:00
|
|
|
if (std::string(vbuf) != std::string(vstring))
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
throw vtkm::io::ErrorIO("Incorrect file format.");
|
|
|
|
}
|
|
|
|
|
|
|
|
char dot;
|
2017-05-18 14:29:41 +00:00
|
|
|
this->DataFile->Stream >> this->DataFile->Version[0] >> dot >> this->DataFile->Version[1];
|
2017-03-09 16:35:26 +00:00
|
|
|
// skip rest of the line
|
|
|
|
std::string skip;
|
|
|
|
std::getline(this->DataFile->Stream, skip);
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
// Read title line
|
|
|
|
std::getline(this->DataFile->Stream, this->DataFile->Title);
|
|
|
|
|
|
|
|
// Read format line
|
|
|
|
this->DataFile->IsBinary = false;
|
|
|
|
std::string format;
|
|
|
|
this->DataFile->Stream >> format >> std::ws;
|
|
|
|
if (format == "BINARY")
|
|
|
|
{
|
|
|
|
this->DataFile->IsBinary = true;
|
|
|
|
}
|
|
|
|
else if (format != "ASCII")
|
|
|
|
{
|
|
|
|
throw vtkm::io::ErrorIO("Unsupported Format.");
|
|
|
|
}
|
|
|
|
|
|
|
|
// Read structure line
|
|
|
|
std::string tag, structStr;
|
|
|
|
this->DataFile->Stream >> tag >> structStr >> std::ws;
|
|
|
|
internal::parseAssert(tag == "DATASET");
|
|
|
|
|
2015-11-17 16:32:19 +00:00
|
|
|
this->DataFile->Structure = vtkm::io::internal::DataSetStructureId(structStr);
|
|
|
|
if (this->DataFile->Structure == vtkm::io::internal::DATASET_UNKNOWN)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
throw vtkm::io::ErrorIO("Unsupported DataSet type.");
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void Read() = 0;
|
|
|
|
|
2017-05-26 17:53:28 +00:00
|
|
|
void ReadScalars(std::size_t numElements,
|
|
|
|
std::string& dataName,
|
2018-12-11 13:56:08 +00:00
|
|
|
vtkm::cont::VariantArrayHandle& data)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
std::string dataType, lookupTableName;
|
|
|
|
vtkm::IdComponent numComponents = 1;
|
|
|
|
this->DataFile->Stream >> dataName >> dataType;
|
|
|
|
std::string tag;
|
|
|
|
this->DataFile->Stream >> tag;
|
|
|
|
if (tag != "LOOKUP_TABLE")
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2016-10-20 20:54:08 +00:00
|
|
|
numComponents = std::stoi(tag);
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
2017-05-18 14:29:41 +00:00
|
|
|
catch (std::invalid_argument&)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
internal::parseAssert(false);
|
|
|
|
}
|
|
|
|
this->DataFile->Stream >> tag;
|
|
|
|
}
|
|
|
|
|
|
|
|
internal::parseAssert(tag == "LOOKUP_TABLE");
|
|
|
|
this->DataFile->Stream >> lookupTableName >> std::ws;
|
|
|
|
|
2018-11-08 21:29:52 +00:00
|
|
|
this->DoReadArrayVariant(dataType, numElements, numComponents, data);
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
void ReadColorScalars(std::size_t numElements, std::string& dataName)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
std::cerr << "Support for COLOR_SCALARS is not implemented. Skipping." << std::endl;
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
std::size_t numValues;
|
|
|
|
this->DataFile->Stream >> dataName >> numValues >> std::ws;
|
2015-11-17 16:32:19 +00:00
|
|
|
this->SkipArray(numElements * numValues, vtkm::io::internal::ColorChannel8());
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
void ReadLookupTable(std::string& dataName)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
std::cerr << "Support for LOOKUP_TABLE is not implemented. Skipping." << std::endl;
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
std::size_t numEntries;
|
|
|
|
this->DataFile->Stream >> dataName >> numEntries >> std::ws;
|
2015-11-17 16:32:19 +00:00
|
|
|
this->SkipArray(numEntries, vtkm::Vec<vtkm::io::internal::ColorChannel8, 4>());
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
2017-05-26 17:53:28 +00:00
|
|
|
void ReadTextureCoordinates(std::size_t numElements,
|
|
|
|
std::string& dataName,
|
2018-12-11 13:56:08 +00:00
|
|
|
vtkm::cont::VariantArrayHandle& data)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
vtkm::IdComponent numComponents;
|
|
|
|
std::string dataType;
|
|
|
|
this->DataFile->Stream >> dataName >> numComponents >> dataType >> std::ws;
|
|
|
|
|
2018-11-08 21:29:52 +00:00
|
|
|
this->DoReadArrayVariant(dataType, numElements, numComponents, data);
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
2017-05-26 17:53:28 +00:00
|
|
|
void ReadVectors(std::size_t numElements,
|
|
|
|
std::string& dataName,
|
2018-12-11 13:56:08 +00:00
|
|
|
vtkm::cont::VariantArrayHandle& data)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
std::string dataType;
|
|
|
|
this->DataFile->Stream >> dataName >> dataType >> std::ws;
|
|
|
|
|
2018-11-08 21:29:52 +00:00
|
|
|
this->DoReadArrayVariant(dataType, numElements, 3, data);
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
2017-05-26 17:53:28 +00:00
|
|
|
void ReadTensors(std::size_t numElements,
|
|
|
|
std::string& dataName,
|
2018-12-11 13:56:08 +00:00
|
|
|
vtkm::cont::VariantArrayHandle& data)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
std::string dataType;
|
|
|
|
this->DataFile->Stream >> dataName >> dataType >> std::ws;
|
|
|
|
|
2018-11-08 21:29:52 +00:00
|
|
|
this->DoReadArrayVariant(dataType, numElements, 9, data);
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
2016-01-20 20:58:41 +00:00
|
|
|
protected:
|
|
|
|
//ReadFields needs to be protected so that derived readers can skip
|
|
|
|
//VisIt header fields
|
2017-05-18 14:29:41 +00:00
|
|
|
void ReadFields(std::string& dataName, std::vector<vtkm::Float32>* visitBounds = nullptr)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
std::cerr << "Support for FIELD is not implemented. Skipping." << std::endl;
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
vtkm::Id numArrays;
|
|
|
|
this->DataFile->Stream >> dataName >> numArrays >> std::ws;
|
|
|
|
for (vtkm::Id i = 0; i < numArrays; ++i)
|
|
|
|
{
|
|
|
|
std::size_t numTuples;
|
|
|
|
vtkm::IdComponent numComponents;
|
|
|
|
std::string arrayName, dataType;
|
2017-05-18 14:29:41 +00:00
|
|
|
this->DataFile->Stream >> arrayName >> numComponents >> numTuples >> dataType >> std::ws;
|
2017-03-13 17:07:47 +00:00
|
|
|
if (arrayName == "avtOriginalBounds" && visitBounds)
|
|
|
|
{
|
|
|
|
visitBounds->resize(6);
|
|
|
|
internal::parseAssert(numComponents == 1 && numTuples == 6);
|
|
|
|
// parse the bounds and fill the bounds vector
|
|
|
|
this->ReadArray(*visitBounds);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-11-08 21:29:52 +00:00
|
|
|
this->DoSkipArrayVariant(dataType, numTuples, numComponents);
|
2017-03-13 17:07:47 +00:00
|
|
|
}
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-20 20:58:41 +00:00
|
|
|
private:
|
2018-11-08 21:29:52 +00:00
|
|
|
class SkipArrayVariant
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
public:
|
2018-11-08 21:29:52 +00:00
|
|
|
SkipArrayVariant(VTKDataSetReaderBase* reader, std::size_t numElements)
|
2017-05-18 14:29:41 +00:00
|
|
|
: Reader(reader)
|
|
|
|
, NumElements(numElements)
|
|
|
|
{
|
|
|
|
}
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
void operator()(T) const
|
|
|
|
{
|
|
|
|
this->Reader->SkipArray(this->NumElements, T());
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
void operator()(vtkm::IdComponent numComponents, T) const
|
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
this->Reader->SkipArray(this->NumElements * static_cast<std::size_t>(numComponents), T());
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
2017-05-18 14:29:41 +00:00
|
|
|
VTKDataSetReaderBase* Reader;
|
2015-10-26 14:07:36 +00:00
|
|
|
std::size_t NumElements;
|
|
|
|
};
|
|
|
|
|
2018-11-08 21:29:52 +00:00
|
|
|
class ReadArrayVariant : public SkipArrayVariant
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
public:
|
2018-11-08 21:29:52 +00:00
|
|
|
ReadArrayVariant(VTKDataSetReaderBase* reader,
|
2017-05-26 17:53:28 +00:00
|
|
|
std::size_t numElements,
|
2018-12-11 13:56:08 +00:00
|
|
|
vtkm::cont::VariantArrayHandle& data)
|
2018-11-08 21:29:52 +00:00
|
|
|
: SkipArrayVariant(reader, numElements)
|
2017-05-18 14:29:41 +00:00
|
|
|
, Data(&data)
|
|
|
|
{
|
|
|
|
}
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
void operator()(T) const
|
|
|
|
{
|
|
|
|
std::vector<T> buffer(this->NumElements);
|
|
|
|
this->Reader->ReadArray(buffer);
|
2018-12-11 13:56:08 +00:00
|
|
|
*this->Data = internal::CreateVariantArrayHandle(buffer);
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
void operator()(vtkm::IdComponent numComponents, T) const
|
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
std::cerr << "Support for " << numComponents << " components not implemented. Skipping."
|
|
|
|
<< std::endl;
|
2018-11-08 21:29:52 +00:00
|
|
|
SkipArrayVariant::operator()(numComponents, T());
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2018-12-11 13:56:08 +00:00
|
|
|
vtkm::cont::VariantArrayHandle* Data;
|
2015-10-26 14:07:36 +00:00
|
|
|
};
|
|
|
|
|
2016-01-20 20:58:41 +00:00
|
|
|
//Make the Array parsing methods protected so that derived classes
|
|
|
|
//can call the methods.
|
|
|
|
protected:
|
2018-11-08 21:29:52 +00:00
|
|
|
void DoSkipArrayVariant(std::string dataType,
|
2017-05-26 17:53:28 +00:00
|
|
|
std::size_t numElements,
|
2015-10-26 14:07:36 +00:00
|
|
|
vtkm::IdComponent numComponents)
|
|
|
|
{
|
2018-11-08 21:29:52 +00:00
|
|
|
// string is unsupported for SkipArrayVariant, so it requires some
|
2016-10-20 20:54:08 +00:00
|
|
|
// special handling
|
2017-05-18 14:29:41 +00:00
|
|
|
if (dataType == "string")
|
2016-09-21 15:16:43 +00:00
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
const vtkm::Id stringCount = numComponents * static_cast<vtkm::Id>(numElements);
|
|
|
|
for (vtkm::Id i = 0; i < stringCount; ++i)
|
|
|
|
{
|
|
|
|
std::string trash;
|
|
|
|
this->DataFile->Stream >> trash;
|
|
|
|
}
|
2016-09-21 15:16:43 +00:00
|
|
|
}
|
2016-09-21 15:19:10 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
vtkm::io::internal::DataType typeId = vtkm::io::internal::DataTypeId(dataType);
|
2017-05-26 17:53:28 +00:00
|
|
|
vtkm::io::internal::SelectTypeAndCall(
|
2018-11-08 21:29:52 +00:00
|
|
|
typeId, numComponents, SkipArrayVariant(this, numElements));
|
2016-09-21 15:19:10 +00:00
|
|
|
}
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
2018-11-08 21:29:52 +00:00
|
|
|
void DoReadArrayVariant(std::string dataType,
|
2017-05-26 17:53:28 +00:00
|
|
|
std::size_t numElements,
|
|
|
|
vtkm::IdComponent numComponents,
|
2018-12-11 13:56:08 +00:00
|
|
|
vtkm::cont::VariantArrayHandle& data)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
2015-11-17 16:32:19 +00:00
|
|
|
vtkm::io::internal::DataType typeId = vtkm::io::internal::DataTypeId(dataType);
|
2017-05-26 17:53:28 +00:00
|
|
|
vtkm::io::internal::SelectTypeAndCall(
|
2018-11-08 21:29:52 +00:00
|
|
|
typeId, numComponents, ReadArrayVariant(this, numElements, data));
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
2017-05-18 14:29:41 +00:00
|
|
|
void ReadArray(std::vector<T>& buffer)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
std::size_t numElements = buffer.size();
|
|
|
|
if (this->DataFile->IsBinary)
|
|
|
|
{
|
|
|
|
this->DataFile->Stream.read(reinterpret_cast<char*>(&buffer[0]),
|
2017-05-18 14:29:41 +00:00
|
|
|
static_cast<std::streamsize>(numElements * sizeof(T)));
|
|
|
|
if (vtkm::io::internal::IsLittleEndian())
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
2015-11-17 16:32:19 +00:00
|
|
|
vtkm::io::internal::FlipEndianness(buffer);
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using ComponentType = typename vtkm::VecTraits<T>::ComponentType;
|
2015-10-26 14:07:36 +00:00
|
|
|
const vtkm::IdComponent numComponents = vtkm::VecTraits<T>::NUM_COMPONENTS;
|
|
|
|
|
|
|
|
for (std::size_t i = 0; i < numElements; ++i)
|
|
|
|
{
|
|
|
|
for (vtkm::IdComponent j = 0; j < numComponents; ++j)
|
|
|
|
{
|
2015-11-10 17:26:13 +00:00
|
|
|
typename internal::StreamIOType<ComponentType>::Type val;
|
2015-10-26 14:07:36 +00:00
|
|
|
this->DataFile->Stream >> val;
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::VecTraits<T>::SetComponent(buffer[i], j, static_cast<ComponentType>(val));
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this->DataFile->Stream >> std::ws;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <vtkm::IdComponent NumComponents>
|
2017-05-18 14:29:41 +00:00
|
|
|
void ReadArray(std::vector<vtkm::Vec<vtkm::io::internal::DummyBitType, NumComponents>>& buffer)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
std::cerr << "Support for data type 'bit' is not implemented. Skipping." << std::endl;
|
|
|
|
this->SkipArray(buffer.size(), vtkm::Vec<vtkm::io::internal::DummyBitType, NumComponents>());
|
2015-10-26 14:07:36 +00:00
|
|
|
buffer.clear();
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
void ReadArray(std::vector<vtkm::io::internal::DummyBitType>& buffer)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
std::cerr << "Support for data type 'bit' is not implemented. Skipping." << std::endl;
|
2015-11-17 16:32:19 +00:00
|
|
|
this->SkipArray(buffer.size(), vtkm::io::internal::DummyBitType());
|
2015-10-26 14:07:36 +00:00
|
|
|
buffer.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
void SkipArray(std::size_t numElements, T)
|
|
|
|
{
|
|
|
|
if (this->DataFile->IsBinary)
|
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
this->DataFile->Stream.seekg(static_cast<std::streamoff>(numElements * sizeof(T)),
|
|
|
|
std::ios_base::cur);
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-09-21 17:54:36 +00:00
|
|
|
using ComponentType = typename vtkm::VecTraits<T>::ComponentType;
|
2015-10-26 14:07:36 +00:00
|
|
|
const vtkm::IdComponent numComponents = vtkm::VecTraits<T>::NUM_COMPONENTS;
|
|
|
|
|
|
|
|
for (std::size_t i = 0; i < numElements; ++i)
|
|
|
|
{
|
|
|
|
for (vtkm::IdComponent j = 0; j < numComponents; ++j)
|
|
|
|
{
|
2015-11-10 17:26:13 +00:00
|
|
|
typename internal::StreamIOType<ComponentType>::Type val;
|
2015-10-26 14:07:36 +00:00
|
|
|
this->DataFile->Stream >> val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this->DataFile->Stream >> std::ws;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <vtkm::IdComponent NumComponents>
|
2015-11-17 16:32:19 +00:00
|
|
|
void SkipArray(std::size_t numElements,
|
|
|
|
vtkm::Vec<vtkm::io::internal::DummyBitType, NumComponents>)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
this->SkipArray(numElements * static_cast<std::size_t>(NumComponents),
|
2015-11-17 16:32:19 +00:00
|
|
|
vtkm::io::internal::DummyBitType());
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
|
2015-11-17 16:32:19 +00:00
|
|
|
void SkipArray(std::size_t numElements, vtkm::io::internal::DummyBitType)
|
2015-10-26 14:07:36 +00:00
|
|
|
{
|
|
|
|
if (this->DataFile->IsBinary)
|
|
|
|
{
|
|
|
|
numElements = (numElements + 7) / 8;
|
2017-05-18 14:29:41 +00:00
|
|
|
this->DataFile->Stream.seekg(static_cast<std::streamoff>(numElements), std::ios_base::cur);
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (std::size_t i = 0; i < numElements; ++i)
|
|
|
|
{
|
|
|
|
vtkm::UInt16 val;
|
|
|
|
this->DataFile->Stream >> val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this->DataFile->Stream >> std::ws;
|
|
|
|
}
|
|
|
|
|
2016-01-20 20:58:41 +00:00
|
|
|
private:
|
2015-11-17 16:32:19 +00:00
|
|
|
class PermuteCellData
|
|
|
|
{
|
|
|
|
public:
|
2017-05-18 14:29:41 +00:00
|
|
|
PermuteCellData(const vtkm::cont::ArrayHandle<vtkm::Id>& permutation,
|
2018-12-11 13:56:08 +00:00
|
|
|
vtkm::cont::VariantArrayHandle& data)
|
2017-05-18 14:29:41 +00:00
|
|
|
: Permutation(permutation)
|
|
|
|
, Data(&data)
|
|
|
|
{
|
|
|
|
}
|
2015-11-17 16:32:19 +00:00
|
|
|
|
2019-01-17 04:31:55 +00:00
|
|
|
template <typename ArrayHandleType>
|
|
|
|
void operator()(const ArrayHandleType& handle) const
|
2015-11-17 16:32:19 +00:00
|
|
|
{
|
2019-01-17 04:31:55 +00:00
|
|
|
VTKM_IS_ARRAY_HANDLE(ArrayHandleType);
|
|
|
|
using T = typename ArrayHandleType::ValueType;
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
if (this->Permutation.GetNumberOfValues() < 1)
|
2019-01-17 04:31:55 +00:00
|
|
|
{
|
2017-05-18 14:29:41 +00:00
|
|
|
return;
|
2019-01-17 04:31:55 +00:00
|
|
|
}
|
2015-11-17 16:32:19 +00:00
|
|
|
vtkm::cont::ArrayHandle<T> out;
|
|
|
|
out.Allocate(this->Permutation.GetNumberOfValues());
|
|
|
|
|
2018-11-08 21:29:52 +00:00
|
|
|
auto permutationPortal = this->Permutation.GetPortalConstControl();
|
|
|
|
auto inPortal = handle.GetPortalConstControl();
|
|
|
|
auto outPortal = out.GetPortalControl();
|
2015-11-17 16:32:19 +00:00
|
|
|
for (vtkm::Id i = 0; i < out.GetNumberOfValues(); ++i)
|
|
|
|
{
|
|
|
|
outPortal.Set(i, inPortal.Get(permutationPortal.Get(i)));
|
|
|
|
}
|
2018-12-11 13:56:08 +00:00
|
|
|
*this->Data = vtkm::cont::VariantArrayHandle(out);
|
2015-11-17 16:32:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
const vtkm::cont::ArrayHandle<vtkm::Id> Permutation;
|
2018-12-11 13:56:08 +00:00
|
|
|
vtkm::cont::VariantArrayHandle* Data;
|
2015-11-17 16:32:19 +00:00
|
|
|
};
|
|
|
|
|
2015-10-26 14:07:36 +00:00
|
|
|
protected:
|
2016-08-30 13:25:52 +00:00
|
|
|
std::unique_ptr<internal::VTKDataSetFile> DataFile;
|
2015-10-26 14:07:36 +00:00
|
|
|
vtkm::cont::DataSet DataSet;
|
|
|
|
|
|
|
|
private:
|
|
|
|
bool Loaded;
|
2015-11-17 16:32:19 +00:00
|
|
|
vtkm::cont::ArrayHandle<vtkm::Id> CellsPermutation;
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
friend class VTKDataSetReader;
|
|
|
|
};
|
|
|
|
|
2017-04-13 18:06:33 +00:00
|
|
|
VTKM_SILENCE_WEAK_VTABLE_WARNING_END
|
2015-10-26 14:07:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
} // vtkm::io::reader
|
|
|
|
|
2015-11-17 16:32:19 +00:00
|
|
|
VTKM_BASIC_TYPE_VECTOR(vtkm::io::internal::ColorChannel8)
|
|
|
|
VTKM_BASIC_TYPE_VECTOR(vtkm::io::internal::DummyBitType)
|
2015-10-26 14:07:36 +00:00
|
|
|
|
|
|
|
#endif // vtk_m_io_reader_VTKDataSetReaderBase_h
|