簡體   English   中英

是否可以將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();

來自vtkPolyData示例

然后可以在VTK層次結構之外的類中重用編寫器嗎?

可寫對象應該是vtkObject,但是最后寫出的vtkPolyData類則進一步依賴於VTK特定類型。

無需做任何幻想。 只要有一個使用VTK類的WriteVTKPolyData()方法。

#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");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM