You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

215 lines
6.6 KiB
C++

#include "FITKAlgDatReader.h"
#include <vtkMultiBlockDataSet.h>
#include <vtkAlgorithmOutput.h>
#include <vtkAppendFilter.h>
#include <vtkInformation.h>
#include <vtkIndent.h>
#include <vtkDataSet.h>
#include <vtkUnstructuredGrid.h>
#include <vtkDataObject.h>
#include <vtkPointData.h>
#include <vtkCellData.h>
#include <vtkInformationVector.h>
#include <vtkStreamingDemandDrivenPipeline.h>
#include <vtkDemandDrivenPipeline.h>
#include <vtkIdTypeArray.h>
#include <vtkDoubleArray.h>
#include <vtkCellDataToPointData.h>
#include <vtkTecplotReader.h>
#include <QDebug>
#define MAXBLOCKNUM 2000
namespace Interface
{
FITKAlgDatReader::FITKAlgDatReader()
{
this->SetNumberOfInputPorts(0);
this->SetNumberOfOutputPorts(MAXBLOCKNUM + 1);
for (int i = 0; i < MAXBLOCKNUM; ++i)
_visibleStates.append(true);
}
FITKAlgDatReader::~FITKAlgDatReader()
{
}
FITKAlgDatReader *FITKAlgDatReader::New()
{
return new FITKAlgDatReader;
}
void FITKAlgDatReader::PrintSelf(ostream &os, vtkIndent indent)
{
QByteArray bFileName = _fileName.toLocal8Bit();
char* FileName = bFileName.data();
this->Superclass::PrintSelf(os, indent);
os << indent << "FileName: " << (FileName ? FileName : "(none)") << "\n";
}
void FITKAlgDatReader::setFileName(QString fileName)
{
_fileName = fileName;
}
QString FITKAlgDatReader::getFileName()
{
return _fileName;
}
int FITKAlgDatReader::RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *outputVector)
{
// Make sure we have a file to read.
if (_fileName == ""){
vtkErrorMacro("A FileName must be specified.");
return 0;
}
QByteArray bFileName = _fileName.toLocal8Bit();
char* FileName = bFileName.data();
_blockList.clear();
//_blockNames.clear();
vtkSmartPointer<vtkTecplotReader> reader = vtkSmartPointer<vtkTecplotReader>::New();
reader->SetFileName(FileName);
reader->Update();
//拿到文件中所有的数据块
auto multidataset = reader->GetOutput();
const int nblock = reader->GetNumberOfBlocks();
for (int i = 0; i < nblock; i++)
{
_blockNames.append(reader->GetBlockName(i));
}
getBlocks(multidataset);
vtkSmartPointer<vtkAppendFilter> appendFilter = vtkSmartPointer<vtkAppendFilter>::New();
for (int i = 0; i < _blockList.size(); i++)
{
if (!_visibleStates[i])
continue;
auto dataset = _blockList.at(i);
appendFilter->AddInputData(dataset);
}
//appendFilter->Update();
vtkSmartPointer<vtkCellDataToPointData> cellToPoint = vtkSmartPointer<vtkCellDataToPointData>::New();
cellToPoint->SetInputConnection(appendFilter->GetOutputPort());
cellToPoint->Update();
//拷贝数据
vtkUnstructuredGrid *output = vtkUnstructuredGrid::GetData(outputVector);
output->CopyStructure(cellToPoint->GetOutput());
output->GetPointData()->PassData(cellToPoint->GetOutput()->GetPointData());
output->GetCellData()->PassData(cellToPoint->GetOutput()->GetCellData());
for (int i = 1; i <= _blockList.size(); i++)
{
if (i > MAXBLOCKNUM)
break;
auto data = _blockList.at(i - 1);
vtkUnstructuredGrid *outData = vtkUnstructuredGrid::GetData(outputVector, i);
vtkSmartPointer<vtkAppendFilter> appFilter = vtkSmartPointer<vtkAppendFilter>::New();
appFilter->AddInputData(data);
vtkSmartPointer<vtkCellDataToPointData> ctp = vtkSmartPointer<vtkCellDataToPointData>::New();
ctp->SetInputConnection(appFilter->GetOutputPort());
ctp->Update();
//appFilter->Update();
outData->CopyStructure(ctp->GetOutput());
outData->GetPointData()->PassData(ctp->GetOutput()->GetPointData());
outData->GetCellData()->PassData(ctp->GetOutput()->GetCellData());
}
return 1;
}
int FITKAlgDatReader::ProcessRequest(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector)
{
if (request->Has(vtkDemandDrivenPipeline::REQUEST_INFORMATION()))
{
return this->RequestInformation(request, inputVector,
outputVector);
}
if (request->Has(
vtkStreamingDemandDrivenPipeline::REQUEST_UPDATE_EXTENT()))
{
return this->RequestUpdateExtent(request, inputVector,
outputVector);
}
if (request->Has(vtkDemandDrivenPipeline::REQUEST_DATA()))
{
return this->RequestData(request, inputVector, outputVector);
}
return this->Superclass::ProcessRequest(request, inputVector,
outputVector);
}
void FITKAlgDatReader::getBlocks(vtkDataObject *blockData)
{
auto block = vtkMultiBlockDataSet::SafeDownCast(blockData);
if (block == nullptr)
{
auto dataset = vtkDataSet::SafeDownCast(blockData);
if (dataset == nullptr)
return;
dataset->Modified();
_blockList.append(dataset);
return;
}
block->Modified();
const int nBlock = block->GetNumberOfBlocks();
for (int i = 0; i < nBlock; i++)
{
vtkDataObject *obj = block->GetBlock(i);
getBlocks(obj);
}
}
int FITKAlgDatReader::getNumberOfBlocks()
{
return _blockList.size();
}
void FITKAlgDatReader::setVisible(int blockIndex, bool vis)
{
if (blockIndex >= MAXBLOCKNUM)
return;
_visibleStates[blockIndex] = vis;
}
QStringList FITKAlgDatReader::getBlockNames()
{
// QStringList names{};
// const int n = getNumberOfBlocks();
// for (int i = 0; i < n; ++i)
// {
// names.append(QString("Zone_%1").arg(i + 1));
// }
// return names;
return _blockNames;
}
QStringList FITKAlgDatReader::getBlockBCTypes()
{
QStringList names{};
const int n = getNumberOfBlocks();
for (int i = 0; i < n; ++i)
{
names.append("None");
}
return names;
}
int FITKAlgDatReader::FillOutputPortInformation(int nPort, vtkInformation *info)
{
Q_UNUSED(nPort)
info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkUnstructuredGrid");
return 1;
}
}