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.
208 lines
6.9 KiB
C++
208 lines
6.9 KiB
C++
#include "FITKAlgCGNSReader.h"
|
|
|
|
#include <vtkInformation.h>
|
|
#include <vtkDemandDrivenPipeline.h>
|
|
#include <vtkStreamingDemandDrivenPipeline.h>
|
|
#include <vtkMultiBlockDataSet.h>
|
|
#include <vtkSmartPointer.h>
|
|
#include <vtkCGNSReader.h>
|
|
#include <vtkAppendFilter.h>
|
|
#include <vtkDataSet.h>
|
|
#include <vtkPointData.h>
|
|
#include <vtkDataArray.h>
|
|
#include <vtkCellData.h>
|
|
#include <vtkUnstructuredGrid.h>
|
|
|
|
#define MAXBLOCKNUM 2000
|
|
|
|
namespace Interface
|
|
{
|
|
FITKAlgCGNSReader* FITKAlgCGNSReader::New()
|
|
{
|
|
FITKAlgCGNSReader* alg = new FITKAlgCGNSReader();
|
|
alg->InitializeObjectBase();
|
|
return alg;
|
|
}
|
|
|
|
void FITKAlgCGNSReader::PrintSelf(ostream & os, vtkIndent indent)
|
|
{
|
|
|
|
}
|
|
|
|
void FITKAlgCGNSReader::setFileName(const QString fileName)
|
|
{
|
|
_fileName = fileName;
|
|
}
|
|
|
|
FITKAlgCGNSReader::FITKAlgCGNSReader()
|
|
{
|
|
this->SetNumberOfInputPorts(0);
|
|
this->SetNumberOfOutputPorts(MAXBLOCKNUM + 1);
|
|
|
|
for (int i = 0; i < MAXBLOCKNUM; ++i)
|
|
_visibleStates.append(true);
|
|
}
|
|
|
|
FITKAlgCGNSReader::~FITKAlgCGNSReader()
|
|
{
|
|
|
|
}
|
|
|
|
int FITKAlgCGNSReader::FillOutputPortInformation(int port, vtkInformation * info)
|
|
{
|
|
info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkUnstructuredGrid");
|
|
return 1;
|
|
}
|
|
|
|
int FITKAlgCGNSReader::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);
|
|
}
|
|
|
|
int FITKAlgCGNSReader::RequestData(vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector)
|
|
{
|
|
if (_fileName.isEmpty()){
|
|
vtkErrorMacro("A FileName must be specified.");
|
|
return 0;
|
|
}
|
|
QByteArray f = _fileName.toLocal8Bit();
|
|
char* FileName = f.data();
|
|
vtkMultiBlockDataSet* mBlock = nullptr;
|
|
vtkSmartPointer<vtkCGNSReader> cgnsReader = vtkSmartPointer<vtkCGNSReader>::New();
|
|
cgnsReader->SetFileName(FileName);
|
|
cgnsReader->Update();
|
|
mBlock = cgnsReader->GetOutput();
|
|
|
|
if (mBlock == nullptr) return 0;
|
|
getBlocks(mBlock);
|
|
|
|
vtkSmartPointer<vtkAppendFilter> appFilter = vtkSmartPointer<vtkAppendFilter>::New();
|
|
for (int i = 0; i < _blockList.size(); ++i)
|
|
{
|
|
if (!_visibleStates[i]) continue;
|
|
auto dataset = _blockList.at(i);
|
|
|
|
//fillPointArray(dataset);
|
|
//fillCellArray(dataset);
|
|
appFilter->AddInputData(dataset);
|
|
}
|
|
|
|
appFilter->Update();
|
|
|
|
vtkUnstructuredGrid* output = vtkUnstructuredGrid::GetData(outputVector);
|
|
output->CopyStructure(appFilter->GetOutput());
|
|
output->GetPointData()->PassData(appFilter->GetOutput()->GetPointData());
|
|
output->GetCellData()->PassData(appFilter->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);
|
|
appFilter->Update();
|
|
outData->CopyStructure(appFilter->GetOutput());
|
|
outData->GetPointData()->PassData(appFilter->GetOutput()->GetPointData());
|
|
outData->GetCellData()->PassData(appFilter->GetOutput()->GetCellData());;
|
|
}
|
|
}
|
|
|
|
void FITKAlgCGNSReader::getBlocks(vtkDataObject * blockData, const char * cuttentName)
|
|
{
|
|
auto block = vtkMultiBlockDataSet::SafeDownCast(blockData);
|
|
|
|
if (block == nullptr)
|
|
{
|
|
auto dataset = vtkDataSet::SafeDownCast(blockData);
|
|
if (dataset == nullptr) return;
|
|
dataset->Modified();
|
|
QString totalName = QString::fromLocal8Bit(cuttentName);
|
|
QStringList NameBC = totalName.split("!|||!");
|
|
|
|
if (NameBC.size() == 3)
|
|
{
|
|
_blockNames.append(NameBC.at(0));
|
|
_bcTypes.append(NameBC.at(1));
|
|
int index = _bcTypes.size() - 1;
|
|
int id = NameBC.at(2).toInt();
|
|
_reslationShip.insert(id, index);
|
|
}
|
|
else
|
|
{
|
|
_blockNames.append(totalName);
|
|
_bcTypes.append("None");
|
|
}
|
|
|
|
_blockList.append(dataset);
|
|
getPointArray(dataset);
|
|
getCellArray(dataset);
|
|
return;
|
|
}
|
|
|
|
block->Modified();
|
|
const int nBlock = block->GetNumberOfBlocks();
|
|
|
|
for (int i = 0; i < nBlock; i++)
|
|
{
|
|
vtkDataObject* obj = block->GetBlock(i);
|
|
const char* currentName = block->GetMetaData(i)->Get(vtkCompositeDataSet::NAME());
|
|
getBlocks(obj, currentName);
|
|
}
|
|
}
|
|
|
|
void FITKAlgCGNSReader::getPointArray(vtkDataSet * dataset)
|
|
{
|
|
if (dataset == nullptr) return;
|
|
|
|
vtkPointData* pointData = dataset->GetPointData();
|
|
if (pointData == nullptr) return;
|
|
|
|
const int nPointArray = pointData->GetNumberOfArrays();
|
|
for (int i = 0; i < nPointArray; i++)
|
|
{
|
|
const char* aName = pointData->GetArrayName(i);
|
|
vtkDataArray* dataArray = pointData->GetArray(aName);
|
|
if (dataArray == nullptr) return; //continue;
|
|
int aNum[2]{ 0 };
|
|
aNum[0] = dataArray->GetNumberOfComponents();
|
|
aNum[1] = dataArray->GetNumberOfTuples();
|
|
|
|
if (_pointDataArray.contains(aName)) continue;
|
|
_pointDataArray.insert(aName, aNum);
|
|
}
|
|
}
|
|
|
|
void FITKAlgCGNSReader::getCellArray(vtkDataSet * dataset)
|
|
{
|
|
if (dataset == nullptr) return;
|
|
|
|
vtkCellData* cellData = dataset->GetCellData();
|
|
if (cellData == nullptr) return;
|
|
|
|
const int nCellArray = cellData->GetNumberOfArrays();
|
|
for (int i = 0; i < nCellArray; i++)
|
|
{
|
|
const char* aName = cellData->GetArrayName(i);
|
|
vtkDataArray* dataArray = cellData->GetArray(aName);
|
|
if (dataArray == nullptr) return; //continue;
|
|
int aNum[2]{ 0 };
|
|
aNum[0] = dataArray->GetNumberOfComponents();
|
|
aNum[1] = dataArray->GetNumberOfTuples();
|
|
|
|
if (_cellDataArray.contains(aName)) continue;
|
|
_cellDataArray.insert(aName, aNum);
|
|
}
|
|
}
|
|
}
|
|
|