在本程序中,定义了一个imread()函数,用于读取“.vts”文件,第一个参数为文件路径,第二个参数为输出对象,可以输出为tkStructuredGrid型对象,也可以输出为vtkActor型对象。
同时还定义了Window类,该类可以直接添加并显示actor对象。
下面是imread()函数的定义:
/**********************【定义数据读入函数imread,begin】*********************/
/**1.1、读取.vts型文件,输出vtkStructuredGrid型对象sgrid**/
void imread(const char* path_buffer,vtkSmartPointer
{
/*将文件路径分解为:‘盘符(drive)’,‘路径(dir)’,‘文件名(fname)’,‘扩展名(ext)’*/
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
_splitpath( path_buffer, drive, dir, fname, ext );
string extName=ext;
string className=sgrid->GetClassName();
vtkSmartPointer<vtkXMLStructuredGridReader> reader=vtkSmartPointer<vtkXMLStructuredGridReader>::New();
if(className=="vtkStructuredGrid"&&extName==".vts")
{
reader->SetFileName(path\_buffer);
reader->Update();
sgrid->ShallowCopy(reader->GetOutput()) ;
}
else
{
cout<<"The file format is different from the output type!";
}
}
/**1.2、读取.vts型文件,输出vtkActor型对象actor**/
void imread(const char* path_buffer,vtkSmartPointer
{
/*将文件路径分解为:‘盘符(drive)’,‘路径(dir)’,‘文件名(fname)’,‘扩展名(ext)’*/
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
_splitpath( path_buffer, drive, dir, fname, ext );
string extName=ext;
string className=actor->GetClassName();
vtkSmartPointer<vtkXMLStructuredGridReader> reader=vtkSmartPointer<vtkXMLStructuredGridReader>::New();
if((className=="vtkOpenGLActor"||className=="vtkActor")&&extName==".vts")
{
reader->SetFileName(path_buffer);
/*由于我们是用VTK的pipeline处理数据,所以每次加载都要更新;
在此读入文件,reader的输出将是一个有效的 structured grid data.*/
reader->Update();
vtkSmartPointer
vtkSmartPointer
geometryFilter->SetInputConnection(reader->GetOutputPort());
geometryFilter->Update();
// Visualize
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(geometryFilter->GetOutputPort());
actor->SetMapper(mapper);
}
else
{
cout<<"The file format is different from the output type!";
}
}
/**********************【定义数据读入函数imread,end】*********************/
下面是Window函数的定义:
/************************【Window begin】********************************/
Window::Window()
{
ren1=vtkSmartPointer
ren1->SetBackground( ., ., . );
renWin=vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer( ren1);
renWin->SetSize( , );
renWin->SetMultiSamples( );
iren=vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow( renWin );
camera=vtkSmartPointer<vtkCamera>::New();
// camera->SetClippingRange( 0.576398, 28.8199 );
// camera->SetFocalPoint( 0.0463079, -0.0356571, 1.01993 );
// camera->SetPosition( -2.47044, 2.39516, -3.56066 );
// camera->SetViewUp( 0.607296, -0.513537, -0.606195 );
// ren1->SetActiveCamera( camera );
}
void Window::addActor(vtkSmartPointer
{
ren1->AddActor(actor);
}
void Window::setBackgroundColor(float color[])
{
this->ren1->SetBackground(color[],color[],color[]);
}
/************************【Window end】********************************/
下面是测试程序:
#ifndef INITIAL_OPENGL
#define INITIAL_OPENGL
#include
VTK_MODULE_INIT(vtkRenderingOpenGL)
VTK_MODULE_INIT(vtkInteractionStyle)
#endif
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char* argv[])
{
// Verify input arguments
std::string inputFilename = "D:/Qt/QtVtk/Testing/Data/multicomb_2.vts";
vtkSmartPointer
imread(inputFilename.c_str(),actor);
Window win;
win.addActor(actor);
float color[]={0.3,.,.};
win.setBackgroundColor(color);
win.show();
return ;
}
下面是程序运行结果:
从测试程序来看,主程序得到了极大的简化。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章