178 lines
5.3 KiB
C++
178 lines
5.3 KiB
C++
|
|
#include "MutiVTKFilesReader.h"
|
|||
|
|
#include <CommonFunction.h>
|
|||
|
|
#include <fstream>
|
|||
|
|
#include <vtkPointSet.h>
|
|||
|
|
#include <vtkPolyData.h>
|
|||
|
|
#include <vtkUnstructuredGrid.h>
|
|||
|
|
#include <vtksys/SystemTools.hxx>
|
|||
|
|
#include <vtkPolyDataReader.h>
|
|||
|
|
#include <vtkUnstructuredGridReader.h>
|
|||
|
|
#include <vtkStructuredGridReader.h>
|
|||
|
|
#include <vtkStructuredGrid.h>
|
|||
|
|
#include <QDebug>
|
|||
|
|
|
|||
|
|
namespace pst
|
|||
|
|
{
|
|||
|
|
MutiVTKFilesReader::MutiVTKFilesReader()
|
|||
|
|
: m_fileName{}
|
|||
|
|
, m_polyDataReader(vtkPolyDataReader::New())
|
|||
|
|
, m_unstructuredGridReader(vtkUnstructuredGridReader::New())
|
|||
|
|
, m_structuredGridReader(vtkStructuredGridReader::New())
|
|||
|
|
, m_fileType{}
|
|||
|
|
, m_outputData(nullptr)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
MutiVTKFilesReader::~MutiVTKFilesReader()
|
|||
|
|
{
|
|||
|
|
m_polyDataReader->Delete();
|
|||
|
|
m_unstructuredGridReader->Delete();
|
|||
|
|
m_structuredGridReader->Delete();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void MutiVTKFilesReader::SetFileName(const QString& fileName)
|
|||
|
|
{
|
|||
|
|
m_fileName = fileName;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool MutiVTKFilesReader::Update()
|
|||
|
|
{
|
|||
|
|
if (!vtksys::SystemTools::FileExists(m_fileName.toStdString(), true))
|
|||
|
|
{
|
|||
|
|
std::cout << "File read fail!" << std::endl;
|
|||
|
|
qDebug() << "File name is " << m_fileName;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
auto type = CheckDataInnerType();
|
|||
|
|
switch (type)
|
|||
|
|
{
|
|||
|
|
case DataType::POLYDATA:
|
|||
|
|
m_polyDataReader->SetFileName(m_fileName.toStdString().c_str());
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
m_polyDataReader->Update();
|
|||
|
|
}
|
|||
|
|
catch (const std::exception& e)
|
|||
|
|
{
|
|||
|
|
std::cout << e.what() << std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
m_fileType = "vtkPolyData";
|
|||
|
|
m_outputData = m_polyDataReader->GetOutput();
|
|||
|
|
return true;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case DataType::UNSTRUCTEDGRID:
|
|||
|
|
m_unstructuredGridReader->SetFileName(m_fileName.toStdString().c_str());
|
|||
|
|
m_unstructuredGridReader->ReadAllVectorsOn();
|
|||
|
|
m_unstructuredGridReader->ReadAllScalarsOn();
|
|||
|
|
m_unstructuredGridReader->ReadAllFieldsOn();
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
m_unstructuredGridReader->Update();
|
|||
|
|
}
|
|||
|
|
catch (const std::exception& e)
|
|||
|
|
{
|
|||
|
|
std::cout << e.what() << std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
m_fileType = "vtkUnstructuredGrid";
|
|||
|
|
m_outputData = m_unstructuredGridReader->GetOutput();
|
|||
|
|
return true;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case DataType::STRUCTEDGRID:
|
|||
|
|
m_structuredGridReader->SetFileName(m_fileName.toStdString().c_str());
|
|||
|
|
m_structuredGridReader->ReadAllVectorsOn();
|
|||
|
|
m_structuredGridReader->ReadAllScalarsOn();
|
|||
|
|
m_structuredGridReader->ReadAllFieldsOn();
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
m_structuredGridReader->Update();
|
|||
|
|
}
|
|||
|
|
catch (const std::exception& e)
|
|||
|
|
{
|
|||
|
|
std::cout << e.what() << std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
m_fileType = "vtkStructuredGrid";
|
|||
|
|
m_outputData = m_structuredGridReader->GetOutput();
|
|||
|
|
return true;
|
|||
|
|
break;
|
|||
|
|
case DataType::UNKNOWN:
|
|||
|
|
m_fileType = "UNKNOWN";
|
|||
|
|
return false;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
vtkPointSet* MutiVTKFilesReader::GetOutput()
|
|||
|
|
{
|
|||
|
|
return m_outputData;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QString MutiVTKFilesReader::GetFileInnerTypeAsStrng()
|
|||
|
|
{
|
|||
|
|
return m_fileType;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
MutiVTKFilesReader::DataType MutiVTKFilesReader::CheckDataInnerType()
|
|||
|
|
{
|
|||
|
|
std::ifstream infile;
|
|||
|
|
infile.open(m_fileName.toStdWString(), ios::in);
|
|||
|
|
//文件不存在
|
|||
|
|
if (!infile.is_open())
|
|||
|
|
{
|
|||
|
|
qDebug() << "Open file failed. File Name is " << m_fileName;
|
|||
|
|
infile.close();
|
|||
|
|
return DataType::UNKNOWN;
|
|||
|
|
}
|
|||
|
|
//读取文件,对第四行进行分割
|
|||
|
|
std::string str;
|
|||
|
|
int countLine = 1;
|
|||
|
|
std::vector<std::string> res;
|
|||
|
|
while (getline(infile, str))
|
|||
|
|
{
|
|||
|
|
if (4 == countLine)
|
|||
|
|
{
|
|||
|
|
CommonFunction::Stringsplit(str, " ", res);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
++countLine;
|
|||
|
|
}
|
|||
|
|
infile.close();
|
|||
|
|
//文件分割结果不符合要求
|
|||
|
|
if (res.size() != 2)
|
|||
|
|
{
|
|||
|
|
qDebug() << m_fileName << "is not supported type!(MutiVTKFilesReader)";
|
|||
|
|
return DataType::UNKNOWN;
|
|||
|
|
}
|
|||
|
|
//UNSTRUCTURED_GRID
|
|||
|
|
if (CommonFunction::trim(res[1]) == "UNSTRUCTURED_GRID")
|
|||
|
|
{
|
|||
|
|
std::cout << "File type is UNSTRUCTURED_GRID" << std::endl;
|
|||
|
|
return DataType::UNSTRUCTEDGRID;
|
|||
|
|
}//POLYDATA
|
|||
|
|
else if (CommonFunction::trim(res[1]) == "POLYDATA")
|
|||
|
|
{
|
|||
|
|
std::cout << "File type is POLYDATA" << std::endl;
|
|||
|
|
return DataType::POLYDATA;
|
|||
|
|
}
|
|||
|
|
//STRUCTURED_GRID
|
|||
|
|
else if (CommonFunction::trim(res[1]) == "STRUCTURED_GRID")
|
|||
|
|
{
|
|||
|
|
std::cout << "File type is STRUCTURED_GRID" << std::endl;
|
|||
|
|
return DataType::STRUCTEDGRID;
|
|||
|
|
}//不支持的.vtk格式
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
std::cout << "File type is not supported type!" << std::endl;
|
|||
|
|
return DataType::UNKNOWN;
|
|||
|
|
}
|
|||
|
|
return DataType::UNKNOWN;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
} //namespace pst
|