读入STL文件,求取矩形框,沿Z方向以box占位各延伸1米

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

COSummer

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值