vtk 读写 数据

vtkSTLWriter存储了cell相关的点,而vtkXMLPolyDataWriter保存了原始polydata中所有的点,不管它有没有被cell使用到。所以保存数据之后要看一下效果,最好用 vtkXMLPolyDataWriter,保存不丢失数据;

常用,这里记录一下

#include <vtkActor.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSTLReader.h>
#include <vtkSTLWriter.h>
#include <vtkSphereSource.h>

int main(int argc, char* argv[])
{
  vtkNew<vtkNamedColors> colors;
  if (argc != 2)
  {
    std::cout << "Required parameters: filename.stl" << std::endl;
    return EXIT_FAILURE;
  }

  std::string filename = argv[1];

  vtkNew<vtkSphereSource> sphereSource;
  sphereSource->Update();

  vtkNew<vtkSTLWriter> stlWriter;
  stlWriter->SetFileName(filename.c_str());
  stlWriter->SetInputConnection(sphereSource->GetOutputPort());
  stlWriter->Write();

  // Read and display for verification
  vtkNew<vtkSTLReader> reader;
  reader->SetFileName(filename.c_str());
  reader->Update();

  vtkNew<vtkPolyDataMapper> mapper;
  mapper->SetInputConnection(sphereSource->GetOutputPort());

  vtkNew<vtkActor> actor;
  actor->SetMapper(mapper);
  actor->GetProperty()->SetColor(colors->GetColor3d("MistyRose").GetData());

  vtkNew<vtkRenderer> renderer;
  vtkNew<vtkRenderWindow> renderWindow;
  renderWindow->AddRenderer(renderer);
  renderWindow->SetWindowName("WriteSTL");

  vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
  renderWindowInteractor->SetRenderWindow(renderWindow);

  renderer->AddActor(actor);
  renderer->SetBackground(colors->GetColor3d("cobalt_green").GetData());

  renderWindow->Render();
  renderWindowInteractor->Start();

  return EXIT_SUCCESS;
}

// VTK 保存
--cpp
vtkSmartPointer<vtkPolyDataWriter> vtkWriter = vtkSmartPointer<vtkPolyDataWriter>::New();
vtkWriter->SetInput(skinExtractor->GetOutput());
vtkWriter->SetFileName("test.vtk");
vtkWriter->Write();
 -------
  // Write the unstructured grid
```cpp
  vtkNew<vtkXMLUnstructuredGridWriter> writer;
  writer->SetFileName("test.vtu");
  writer->SetInputData(unstructuredGrid);
  writer->Write();

vtkSmartPointer<vtkUnstructuredGridReader> reader =
		vtkSmartPointer<vtkUnstructuredGridReader>::New();
	reader->SetFileName("test.vtk");
	//    delete[] fileName;
	reader->Update();
 --------------

数据旋转后保存 STL

void SaveSTL(char* name, vtkPolyData* data)
{
	vtkNew<vtkTransform> transform;

	double * bounds = data->GetBounds();
	// Compute the center of the image
	double center[3];
	center[0] = (bounds[1] + bounds[0]) / 2.0;
	center[1] = (bounds[3] + bounds[2]) / 2.0;
	center[2] = (bounds[5] + bounds[4]) / 2.0;

	// Rotate about the center
	transform->Translate(center[0], center[1], center[2]);
	transform->RotateWXYZ(180, 1, 0, 0);
	transform->Translate(-center[0], -center[1], -center[2]);

	vtkSmartPointer<vtkTransform> pTransform = vtkSmartPointer<vtkTransform>::New();
	// pTransform->SetInput(actor->GetUserTransform());
	pTransform->SetMatrix(transform->GetMatrix());
	pTransform->Update();

	vtkSmartPointer<vtkTransformPolyDataFilter> pTransformPolyDataFilterSTL = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
	pTransformPolyDataFilterSTL->SetInputData(data);
	pTransformPolyDataFilterSTL->SetTransform(pTransform);
	pTransformPolyDataFilterSTL->Update();

	vtkNew<vtkSTLWriter> stlWriter;
	stlWriter->SetFileName(name);
	stlWriter->SetInputData(pTransformPolyDataFilterSTL->GetOutput());
	stlWriter->Update();
	stlWriter->Write();
}

使用 vtkSTLWriter 保存数据,发现和实际显示的数据有差异,查资料发现,
vtkSTLWriter存储了cell相关的点,而vtkXMLPolyDataWriter保存了原始polydata中所有的点,不管它有没有被cell使用到。

	char filename[128] = "./a.vtp";
	vtkNew<vtkXMLPolyDataWriter> stlWriter;
	stlWriter->SetFileName(filename);
	stlWriter->SetInputData(pigPoly);
	stlWriter->Update();
	stlWriter->Write();

或者保存成 obj

	vtkSmartPointer<vtkOBJExporter> porter = vtkSmartPointer<vtkOBJExporter>::New();
	porter->SetFilePrefix("./qiu.obj");
	porter->SetInput(renderWindow);
	porter->Write();

读;

	std::string filename = "aa.obj";
	vtkSmartPointer<vtkOBJReader> reader1 =
		vtkSmartPointer<vtkOBJReader>::New();
	reader1->SetFileName(filename.c_str());
	reader1->Update();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值