C ++ VTK从多个文件中读取和保存数据

时间:2017-03-27 14:57:10

标签: c++ qt vtk

我是VTK的新手,我的目标是能够将来自多个文件的信息存储到矢量中,这样我就可以在某些文件上单独使用过滤器或在QVTKWidget上显示它。

我的问题是我应该创建什么类型的矢量?

到目前为止我有这个: 读者的类,它正在创建我的读者并将其推回:

template<class TReader> vtkDataSet *readVTKfile(std::string fileName)
{
   vtkSmartPointer<TReader> reader =
       vtkSmartPointer<TReader>::New();
   reader->SetFileName(fileName.c_str());
   reader->Update();
   reader->GetOutput()->Register(reader);
   return vtkDataSet::SafeDownCast(reader->GetOutput());
}

以下是我如何将它用于我的矢量的问题:

QStringList filenames = QFileDialog::getOpenFileNames(this, tr("Choose"), "", tr("Vtk files (*.vtk)"));
std::vector<std::string> inputFilenames(filenames.count());
if (!filenames.isEmpty())
{
    for (int i = 0; i < filenames.count(); i++)
        inputFilenames.push_back(filenames.at(i).toLocal8Bit().constData());
}

std::vector<vtkDataSet*> data(inputFilenames.size()); // what type it should be?

for (int i = 0; i < inputFilenames.size(); i++)
{
    data[i] = readVTKfile<vtkGenericDataObjectReader>(inputFilenames[i]);
}

vtkSmartPointer<vtkPolyDataMapper> objectMapper =
    vtkSmartPointer<vtkPolyDataMapper>::New();

//objectMapper->SetInputConnection(reader->GetOutputPort());
objectMapper->SetInputConnection(data[0]); // so then I can use it for example for showing?

vtkSmartPointer<vtkActor> objectActor =
    vtkSmartPointer<vtkActor>::New();
objectActor->SetMapper(objectMapper);

// VTK Renderer
vtkSmartPointer<vtkRenderer> renderer =
    vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(objectActor);

// VTK/Qt wedded
this->qvtkWidgetLeft->GetRenderWindow()->AddRenderer(renderer);

1 个答案:

答案 0 :(得分:0)

QStringList filenames = QFileDialog::getOpenFileNames(this, tr("Choose"), "", tr("Vtk files (*.vtk)"));

//使用基于for和.toStdString的范围,如果你想从QString中获取std :: string

std::vector<std::string> inputFilenames(filenames.count());
for(const auto& filename : filenames) {
        inputFilenames.push_back(filename.toStdString());
}

//我不确定这是否是正确的类型,但它是文档使用的

std::vector<vtkAlgorithmOutput*> data(inputFilenames.size());

for (int i = 0; i < inputFilenames.size(); i++)
{
    data[i] = readVTKfile<vtkGenericDataObjectReader>(inputFilenames[i]);
}

vtkSmartPointer<vtkPolyDataMapper> objectMapper =
    vtkSmartPointer<vtkPolyDataMapper>::New();

objectMapper->SetInputConnection(data[0]); 

vtkSmartPointer<vtkActor> objectActor =
    vtkSmartPointer<vtkActor>::New();
objectActor->SetMapper(objectMapper);

// VTK Renderer
vtkSmartPointer<vtkRenderer> renderer =
    vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(objectActor);

// VTK/Qt wedded
this->qvtkWidgetLeft->GetRenderWindow()->AddRenderer(renderer);