vtk qt切割stl模型

12 篇文章 1 订阅

一直想实现对stl模型的某个方向进行平面切割
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过滑动slider然后对模型进行某一个方向的面切割。同时可以用鼠标对模型进行移动缩放,旋转等操作。然后可以加一些颜色点云显示等操作。
stl加载:

	QString selectFilePath = QFileDialog::getOpenFileName(this, QString("choose STL file"), QString(""), QString("file(*.stl)"));
	if (selectFilePath.isEmpty())
	{
		ui.textBrowser->append("The address of the STL file you choose is null!");
		return;
	}

	// 原始图像
	reader = vtkSmartPointer<vtkSTLReader>::New();
	reader->SetFileName(selectFilePath.toStdString().c_str());
	reader->Update();

	//将source转换成mapper
	mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(reader->GetOutputPort());

	//送入渲染引擎进行显示
	actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);

	//渲染
	renderer = vtkSmartPointer<vtkRenderer>::New();
	renderer->AddActor(actor);
	renderer->SetBackground(.0, .0, .0);

	//设置渲染窗口
	vtkSmartPointer<vtkRenderWindow> window = vtkSmartPointer<vtkRenderWindow>::New();
	ui.qvtkWidget->SetRenderWindow(window);
	ui.qvtkWidget->GetRenderWindow()->AddRenderer(renderer);

	//ok
	ui.textBrowser->append(QString("upload the file:") + selectFilePath + QString(" succeed !"));

发现加载一些简单的模型,然后移动slider切割很丝滑,但是加载复杂一点就很卡,我这里用多线程解决了,切割模型放在一个线程里,然后显示在另一个线程里
先看效果,我动态的从上往下切割:

在这里插入图片描述

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,演示了如何使用vtkImplicitPlaneWidget和vtkClipPolyData来切割STL模型: ```python import vtk # 加载STL模型 reader = vtk.vtkSTLReader() reader.SetFileName("model.stl") reader.Update() # 创建切割平面 plane_widget = vtk.vtkImplicitPlaneWidget() plane_widget.SetInputConnection(reader.GetOutputPort()) plane_widget.SetPlaceFactor(1.25) plane_widget.PlaceWidget() plane_widget.On() # 创建切割器 clipper = vtk.vtkClipPolyData() clipper.SetInputConnection(reader.GetOutputPort()) clipper.SetClipFunction(plane_widget.GetImplicitFunction()) clipper.InsideOutOn() clipper.Update() # 可视化切割结果 mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(clipper.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) renderer = vtk.vtkRenderer() renderer.AddActor(actor) render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) render_window.Render() interactor.Start() ``` 在这个示例代码中,我们首先使用vtkSTLReader加载了一个STL模型。然后,我们创建了一个vtkImplicitPlaneWidget用于指定切割平面,并将其设置为模型的输入。接下来,我们创建了一个vtkClipPolyData对象,并将其设置为模型的输入和vtkImplicitPlaneWidget的隐式函数。最后,我们将切割结果可视化为一个vtkActor,并将其添加到vtkRenderer中。 注意,这只是一个简单的示例代码,可能需要进行一些调整以适应您的特定应用程序。例如,您可能需要更改切割平面的位置和方向,并调整切割器的一些参数以获得更好的切割结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值