是否可以在VTK中使用(polyData)编写器来处理来自其他库的数据类型?
Is it possible to use the (polyData) writers in VTK for data types from other libraries?
我使用ParaView进行数据可视化,因此我需要以支持的格式(如ASCII .vtk)编写自己的数据。为此,我编写了一个遗留的ASCII .vtk编写器,它工作得很好。但是,由于我编写了一个并行运行的写密集型应用程序,所以我想尝试一下vtk XML编写器。
是否可以与来自另一个库的类一起重用编写器?
从查看vtkPolyDataWriter文档,我注意到VTK是面向对象的,并且作者严重依赖于使用端口的"可视化管道"流,例如:
353 vtkNew<vtkPolyDataWriter> writer0;
354 writer0->SetFileName( "./hyperTreeGridContour.vtk" );
355 writer0->SetInputConnection( contour->GetOutputPort() );
356 writer0->Write();
from vtkPolyData示例。
是否有可能在VTK层次结构之外的类中重用编写器?
可写对象应该是vtkObject,但是vtkPolyData类,在最后被写出来,甚至进一步依赖于VTK特定的类型。
不需要做任何花哨的事情。只要有一个WriteVTKPolyData()方法,利用VTK类。
#include <vtkXMLPolyDataWriter.h>
#include <vtkSmartPointer.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkVersion.h>
#include <vtkPoints.h>
class MyClass {
/* ... */
public:
void WriteVTKPolyData(const char * file_name) const;
};
void MyClass::WriteVTKPolyData(const char * file_name) const {
vtkSmartPointer<vtkPolyData> polyData =
vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkPoints> points =
vtkSmartPointer<vtkPoints>::New();
// EXAMPLE CODE POPULATING VTKPOLYDATA
points->InsertNextPoint(+1, +1, +1);
points->InsertNextPoint(-1, -1, +1);
points->InsertNextPoint(-1, +1, -1);
points->InsertNextPoint(+1, -1, -1);
polyData->SetPoints(points);
vtkSmartPointer<vtkCellArray> polys =
vtkSmartPointer<vtkCellArray>::New();
vtkIdType cell[3];
cell[0] = 0; cell[1] = 2; cell[2] = 1;
polys->InsertNextCell(3,cell);
cell[0] = 1; cell[1] = 2; cell[2] = 3;
polys->InsertNextCell(3,cell);
cell[0] = 2; cell[1] = 0; cell[2] = 3;
polys->InsertNextCell(3,cell);
cell[0] = 3; cell[1] = 0; cell[2] = 1;
polys->InsertNextCell(3,cell);
polyData->SetPolys(polys);
// END EXAMPLE CODE POPULATING
vtkSmartPointer<vtkXMLPolyDataWriter> writer =
vtkSmartPointer<vtkXMLPolyDataWriter>::New();
writer->SetFileName(file_name);
#if VTK_MAJOR_VERSION <= 5
writer->SetInput(polyData);
#else
writer->SetInputData(polyData);
#endif
writer->Write();
}
int main(int argc, char ** argv) {
MyClass myObject;
myObject.WriteVTKPolyData("out.vtp");
}
如果您希望在编辑时将点和多边形保留在内存中:
#include <vtkXMLPolyDataWriter.h>
#include <vtkSmartPointer.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkVersion.h>
#include <vtkPoints.h>
class MyClass {
vtkSmartPointer<vtkPolyData> m_PolyData;
vtkSmartPointer<vtkPoints> m_Points;
vtkSmartPointer<vtkCellArray> m_Polygons;
/* ... */
public:
/* ... */
MyClass();
void WriteVTKPolyData(const char * file_name) const;
void f();
};
MyClass::MyClass() :
m_PolyData(vtkSmartPointer<vtkPolyData>::New()),
m_Points(vtkSmartPointer<vtkPoints>::New()),
m_Polygons(vtkSmartPointer<vtkCellArray>::New())
{
m_PolyData->SetPoints(m_Points);
m_PolyData->SetPolys(m_Polygons);
}
void MyClass::f() {
// EXAMPLE CODE POPULATING VTKPOLYDATA
m_Points->InsertNextPoint(+1, +1, +1);
m_Points->InsertNextPoint(-1, -1, +1);
m_Points->InsertNextPoint(-1, +1, -1);
m_Points->InsertNextPoint(+1, -1, -1);
vtkIdType cell[3];
cell[0] = 0; cell[1] = 2; cell[2] = 1;
m_Polygons->InsertNextCell(3,cell);
cell[0] = 1; cell[1] = 2; cell[2] = 3;
m_Polygons->InsertNextCell(3,cell);
cell[0] = 2; cell[1] = 0; cell[2] = 3;
m_Polygons->InsertNextCell(3,cell);
cell[0] = 3; cell[1] = 0; cell[2] = 1;
m_Polygons->InsertNextCell(3,cell);
// END EXAMPLE CODE POPULATING
}
void MyClass::WriteVTKPolyData(const char * file_name) const {
vtkSmartPointer<vtkXMLPolyDataWriter> writer =
vtkSmartPointer<vtkXMLPolyDataWriter>::New();
writer->SetFileName(file_name);
#if VTK_MAJOR_VERSION <= 5
writer->SetInput(m_PolyData);
#else
writer->SetInputData(m_PolyData);
#endif
writer->Write();
}
int main(int argc, char ** argv) {
MyClass myObject;
myObject.f();
myObject.WriteVTKPolyData("out.vtp");
}
相关文章:
- (C )正在创建专门用于处理所有其他自定义对象的类/对象一种处理项目的正确方法
- 在函数指针中传递给其他线程的对象 - 如何处理它
- 我如何改善IF/其他局部变量的处理
- C++键盘挂钩-退出程序,但也防止密钥在其他地方被处理
- 如何防止基于 MFC 对话框的应用在 ESC 键后关闭,但允许其他控件处理它
- 如何处理dervied类的多个重载,而不需要对其他文件进行多次更改
- 为什么AFXMessageBox首先处理其他消息
- 与其他字符相比,c++/Arduino 处理“?”的方式是否不同
- 信号() 覆盖其他信号处理程序
- 如何使用OpenCV或其他图像处理库从RGB数据写入YUV420视频帧
- 来自其他线程的select()不处理传入数据
- GCC编译器是否可以处理比long / long / int更大的其他数据类型?
- iPhone和其他移动设备上c++事件处理的最佳方式
- Lua vs嵌入式Lisp和潜在的其他候选.用于基于集合的数据处理
- VkKeyScanEx无法处理"F"键和其他
- 是否可以在VTK中使用(polyData)编写器来处理来自其他库的数据类型?
- 处理与TriggerSphere和其他Actor的重叠
- 有没有其他简单的方法来处理c++属性?
- 处理由于意外库行为导致的段错误和其他问题
- boost.prrocess批处理脚本无法运行其他程序