/*========================================================================= Copyright (c) GeometryFactory All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 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. =========================================================================*/ /** * @class vtkSEPReader * @brief Stanford Exploration Project files reader. * * This reader takes a .H file that points to a .H@ file and contains * all the information to interpret the raw data in the .H@ file. */ #ifndef vtkSEPReader_h #define vtkSEPReader_h #include "vtkIOImageModule.h" // For export macro #include "vtkExtentTranslator.h" // for vtkExtentTranslator #include "vtkImageAlgorithm.h" #include "vtkNew.h" // for ivars #include // for std::array #include // for std::string namespace details { enum class EndiannessType : std::uint8_t { SEP_LITTLE_ENDIAN = 0, SEP_BIG_ENDIAN = 1 }; static constexpr int SEP_READER_MAX_DIMENSION = 32u; } class vtkStringArray; class VTKIOIMAGE_EXPORT vtkSEPReader : public vtkImageAlgorithm { public: static vtkSEPReader* New(); vtkTypeMacro(vtkSEPReader, vtkImageAlgorithm); void PrintSelf(ostream& os, vtkIndent indent) override; /** * @brief Specify file name for the SEP Header file. */ vtkSetStdStringFromCharMacro(FileName); vtkGetCharFromStdStringMacro(FileName); /** * @brief When 2D mode is true, the third dimension is * ignored and the output is in 2D. **/ vtkGetMacro(OutputGridDimension, int); vtkSetMacro(OutputGridDimension, int); /** * @brief Specify extent translator split mode. * Default: vtkExtentTranslator::BLOCK_MODE **/ vtkSetMacro(ExtentSplitMode, int); vtkGetMacro(ExtentSplitMode, int); vtkGetMacro(DataOrigin, VTK_FUTURE_CONST double*); vtkGetMacro(DataSpacing, VTK_FUTURE_CONST double*); /** * Array containing the name of all dimensions. * Contains ESize elements. **/ vtkGetObjectMacro(AllDimensions, vtkStringArray); /** * Array containing the name and the size of all dimensions. * The two first entries are the header. Contains 2*ESize elements. **/ vtkGetObjectMacro(AllRanges, vtkStringArray); /** * Specify the name for each spatial / fixed dimension. * ZDimension is only used for 3D output. * FixedDimension2 is only used for 2D output. **/ vtkSetStdStringFromCharMacro(XDimension); vtkSetStdStringFromCharMacro(YDimension); vtkSetStdStringFromCharMacro(ZDimension); vtkSetStdStringFromCharMacro(FixedDimension1); vtkSetStdStringFromCharMacro(FixedDimension2); vtkSetMacro(FixedDimensionValue1, int); vtkSetMacro(FixedDimensionValue2, int); vtkGetVector2Macro(FixedDimRange, int); bool CanReadFile(VTK_FILEPATH const char*); std::array ComputeExtent() const; protected: vtkSEPReader(); int RequestInformation(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override; int RequestData(vtkInformation* request, vtkInformationVector**, vtkInformationVector*) override; bool ReadHeader(); bool ReadData(vtkImageData*, int*); /** * Exposed Properties */ std::string FileName = ""; int OutputGridDimension = 3; int ExtentSplitMode = vtkExtentTranslator::BLOCK_MODE; double DataOrigin[details::SEP_READER_MAX_DIMENSION]; double DataSpacing[details::SEP_READER_MAX_DIMENSION]; std::string XDimension = "CDP"; std::string YDimension = "LINE"; std::string ZDimension = "DEPTH"; // used only in 3D std::string FixedDimension1 = "OFFSET"; std::string FixedDimension2 = "DEPTH"; // used only in 2D int FixedDimensionValue1 = details::SEP_READER_MAX_DIMENSION; int FixedDimensionValue2 = details::SEP_READER_MAX_DIMENSION; int FixedDimRange[2] = { 0, 0 }; vtkNew AllDimensions; vtkNew AllRanges; private: enum class DataFormatType : std::uint8_t { XDR_FLOAT = 0, XDR_INT = 1, XDR_DOUBLE = 2 }; /** * Internal Variables */ DataFormatType DataFormat = DataFormatType::XDR_FLOAT; details::EndiannessType Endianness; int Dimensions[details::SEP_READER_MAX_DIMENSION]; double OutputSpacing[3]; double OutputOrigin[3]; std::string Label[details::SEP_READER_MAX_DIMENSION]; std::string DataFileType; std::string BinaryFilename; int ESize = 4; int XArrayId = details::SEP_READER_MAX_DIMENSION; int YArrayId = details::SEP_READER_MAX_DIMENSION; int ZArrayId = details::SEP_READER_MAX_DIMENSION; int FixedDimension1ArrayId = details::SEP_READER_MAX_DIMENSION; int FixedDimension2ArrayId = details::SEP_READER_MAX_DIMENSION; void ReadDataPiece(FILE* file, char*& dataOutput, vtkIdType offset, vtkIdType range); vtkSEPReader(const vtkSEPReader&) = delete; void operator=(const vtkSEPReader&) = delete; }; #endif // vtkSEPReader_h