#include <iostream>
#include <string>
#include <vtkSmartPointer.h>
#include <vtkPolyData.h>
#include <vtkPolyDataWriter.h>
#include <vtkSTLReader.h>
#include <vtkCleanPolyData.h>
#include <vtkDecimatePro.h>
#include <vtkTriangleFilter.h>
#include<vtkZLibDataCompressor.h>
#include <vtkSTLWriter.h>
#include <vtkPolyData.h>
#include <vtkCubeSource.h>
#include <vtkAppendPolyData.h>
#include<vtkWriter.h>
#include <vtkPolyData.h>
#include <vtkCubeSource.h>
#include <vtkAppendPolyData.h>
#include <vtkTransform.h>
#include<vtkTransformPolyDataFilter.h>
#include <vtkBoundingBox.h>
using namespace std;
int main(int argc, char* argv[])
{
string input_filename = "C:/Users/Administrator/Downloads/short_1.stl";
string output_filename = "C:/Users/Administrator/Downloads/short_2.stl";
// Read STL file
vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
reader->SetFileName(input_filename.c_str());
reader->Update();
// 计算外接矩形框
vtkBoundingBox bbox;
bbox.SetBounds(reader->GetOutput()->GetBounds());
// 获取外接矩形框的最小点和最大点
double bounds[6];
bbox.GetBounds(bounds);
double xmin = bounds[0];
double xmax = bounds[1];
double ymin = bounds[2];
double ymax = bounds[3];
double zmin = bounds[4];
double zmax = bounds[5];
double* dCenter = reader->GetOutput()->GetCenter();
dCenter[2] = zmin * 1000 -500;
// Create cube sources
vtkSmartPointer<vtkCubeSource> cube1 = vtkSmartPointer<vtkCubeSource>::New();
cube1->SetXLength((xmax- xmin)*1000);
cube1->SetYLength((ymax- ymin) * 1000);
cube1->SetZLength(1000);
cube1->Update();
cube1->SetCenter(dCenter);
cube1->Update();
// 将VTK对象转换为毫米
vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
transform->Scale(0.001, 0.001, 0.001);
vtkSmartPointer<vtkTransformPolyDataFilter> filter = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
filter->SetInputData(cube1->GetOutput());
filter->SetTransform(transform);
filter->Update();
dCenter[2] = zmax * 1000 + 500;
vtkSmartPointer<vtkCubeSource> cube2 = vtkSmartPointer<vtkCubeSource>::New();
cube2->SetXLength((xmax - xmin) * 1000);
cube2->SetYLength((ymax - ymin) * 1000);
cube2->SetZLength(1000.0);
cube2->Update();
cube2->SetCenter(dCenter);
cube2->Update();
// 将VTK对象转换为毫米
vtkSmartPointer<vtkTransform> transform1 = vtkSmartPointer<vtkTransform>::New();
transform1->Scale(0.001, 0.001, 0.001);
vtkSmartPointer<vtkTransformPolyDataFilter> filter2 = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
filter2->SetInputData(cube2->GetOutput());
filter2->SetTransform(transform1);
filter2->Update();
// Combine polydata
vtkSmartPointer<vtkAppendPolyData> appendFilter = vtkSmartPointer<vtkAppendPolyData>::New();
appendFilter->AddInputData(reader->GetOutput());
appendFilter->AddInputData(filter->GetOutput());
appendFilter->AddInputData(filter2->GetOutput());
appendFilter->Update();
// Write output STL file
vtkSmartPointer<vtkSTLWriter> writer = vtkSmartPointer<vtkSTLWriter>::New();
writer->SetFileName(output_filename.c_str());
writer->SetInputData(appendFilter->GetOutput());
writer->Write();
return 0;
}
05-14
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交