Qt+VTK+OCCT读取IGES/STEP模型

7 篇文章 2 订阅

参考链接

主要代码

#include "VTKOCCT.h"
#include <BRepPrimAPI_MakeBox.hxx>
#include <BRepPrimAPI_MakeCone.hxx>
#include <IVtkTools_ShapeDataSource.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <vtkAutoInit.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyDataMapper.h>
#include <IGESControl_Reader.hxx> 
#include <STEPCAFControl_Reader.hxx>
//Lesson 17
#include <Bnd_Box.hxx>
#include <BRepBndLib.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
#include <vtkCubeSource.h>
#include <vtkEllipseArcSource.h>
#include <vtkSphereSource.h>
#include <vtkConeSource.h>
#include <vtkAppendPolyData.h >
#include <vtkCleanPolyData.h >
#include <vtkNew.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkBoundingBox.h>
#include <vtkAxesActor.h>


decltype(auto) ReadIges(const char* file) {
	IGESControl_Reader reader;
	reader.ReadFile(file);
	reader.TransferRoots();
	TopoDS_Shape shape = reader.OneShape();
	vtkNew<vtkPolyData> polydata;
	vtkNew<vtkPolyDataMapper> mapper;
	vtkNew<vtkActor> actor;
	vtkNew<IVtkTools_ShapeDataSource> shapeSource;
	shapeSource->SetShape(new IVtkOCC_Shape(shape));
	shapeSource->Update();
	mapper->SetInputConnection(shapeSource->GetOutputPort());
	actor->SetMapper(mapper);
	return actor;
}

decltype(auto) ReadStep(const char* file) {
	STEPControl_Reader readerSTEP;
	IFSelect_ReturnStatus statSTEP = readerSTEP.ReadFile(file);
	IFSelect_PrintCount modeSTEP = IFSelect_ListByItem;
	readerSTEP.PrintCheckLoad(Standard_False, modeSTEP);
	readerSTEP.TransferRoots();
	TopoDS_Shape shape = readerSTEP.OneShape();
	
	vtkNew<vtkPolyDataMapper> mapper;
	vtkNew<vtkActor> actor;
	vtkNew<IVtkTools_ShapeDataSource> shapeSource;
	
	shapeSource->SetShape(new IVtkOCC_Shape(shape));
	shapeSource->Update();
	mapper->SetInputConnection(shapeSource->GetOutputPort());
	actor->SetMapper(mapper);
	return actor;
}

decltype(auto) TopoDSShapeSphere() {
	//TopoDS_ShapeSphere
	gp_Ax2 sphere_origin(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1));
	BRepPrimAPI_MakeCone mkCone(sphere_origin, 1.0, 0.01, 1);
	const TopoDS_Shape& TopoDS_ShapemkConeTMP = mkCone.Shape();
	TopoDS_Shape TopoDS_ShapeCONE = static_cast<TopoDS_Shape>(TopoDS_ShapemkConeTMP);
	gp_Trsf TSPHERE;
	TSPHERE.SetScaleFactor(0.9);
	TSPHERE.SetTranslationPart(gp_Vec(0, 0, 0));
	BRepBuilderAPI_Transform stepBRepTransformationTOPBOX(TopoDS_ShapeCONE, TSPHERE, Standard_True);
	TopoDS_ShapeCONE = stepBRepTransformationTOPBOX.Shape();

	vtkNew<IVtkTools_ShapeDataSource> TOPOCONESource;
	TOPOCONESource->SetShape(new IVtkOCC_Shape(TopoDS_ShapeCONE));

	vtkNew<vtkActor> actorTOPOCONE;
	vtkNew<vtkPolyDataMapper> mapperTOPOCONE;
	actorTOPOCONE->SetMapper(mapperTOPOCONE);
	mapperTOPOCONE->SetInputConnection(TOPOCONESource->GetOutputPort());
	return actorTOPOCONE;
}

decltype(auto) VTKpointOnMeshes(const char* file) {
	STEPControl_Reader readerSTEP;
	IFSelect_ReturnStatus statSTEP = readerSTEP.ReadFile(file);
	IFSelect_PrintCount modeSTEP = IFSelect_ListByItem;
	readerSTEP.PrintCheckLoad(Standard_False, modeSTEP);
	readerSTEP.TransferRoots();
	TopoDS_Shape TopoDS_ShapeSTEP = readerSTEP.OneShape();


	//VTKpointOnMeshes
	vtkNew<vtkPoints> VTKpointsOnMeshes;
	vtkNew<vtkCellArray> verticesForVTKpointsOnMeshes;
	vtkIdType pid[1];

	//vtkPolyData creation
	vtkNew<vtkPolyData> PolyDataVTKPointsOnMeshes;

	//vtkPolyData initialization
	PolyDataVTKPointsOnMeshes->SetPoints(VTKpointsOnMeshes);
	PolyDataVTKPointsOnMeshes->SetVerts(verticesForVTKpointsOnMeshes);

	//VTKpoint IGES, STEP TopoDS_ShapeBOX CALC   
	Bnd_Box aabb;
	//AABB ALGO Per TopoDS_Shape mesh  , Please choose the source you like to run and put it in next line
	BRepBndLib::Add(TopoDS_ShapeSTEP, aabb, true); //TopoDS_ShapeIGES  //TopoDS_ShapeSTEP //TopoDS_ShapeCONE
	//VTKpointIGES CALC per TopoDS_Shape mesh
	int density = 20;
	gp_XYZ Pmin = aabb.CornerMin().XYZ();
	gp_XYZ Pmax = aabb.CornerMax().XYZ();
	gp_XYZ D = Pmax - Pmin;
	double dim[3] = { D.X(),D.Y(),D.Z() };
	double mind = Min(dim[0], Min(dim[1], dim[2]));
	const double d = mind / density;
	int nslice[3] = {
		int(Round(dim[0] / d)) + 1 ,
		int(Round(dim[1] / d)) + 1 ,
		int(Round(dim[2] / d)) + 1 };
	for (int i = 0; i < nslice[0]; ++i)
		for (int j = 0; j < nslice[1]; ++j)
			for (int k = 0; k < nslice[2]; ++k)
			{
				gp_XYZ p = Pmin
					+ gp_XYZ(d * i, 0, 0)
					+ gp_XYZ(0, d * j, 0)
					+ gp_XYZ(0, 0, d * k);
				pid[0] = VTKpointsOnMeshes->InsertNextPoint(p.X(), p.Y(), p.Z());
				verticesForVTKpointsOnMeshes->InsertNextCell(1, pid);
			};

	//Append the meshes
	vtkNew<vtkAppendPolyData> appendFilter;
	appendFilter->AddInputData(PolyDataVTKPointsOnMeshes);

	//Remove any duplicate points.
	vtkNew<vtkCleanPolyData> cleanFilterForMapperVTKShapes;
	cleanFilterForMapperVTKShapes->SetInputConnection(appendFilter->GetOutputPort());
	cleanFilterForMapperVTKShapes->Update();

	vtkNew<vtkPolyDataMapper> mapperVTKShapes;
	mapperVTKShapes->SetInputConnection(cleanFilterForMapperVTKShapes->GetOutputPort());

	vtkNew<vtkActor> actorVTKShapes;
	actorVTKShapes->SetMapper(mapperVTKShapes);
	return actorVTKShapes;
}

VTKOCCT::VTKOCCT(QWidget* parent)
	: QMainWindow(parent)
{
	vtkWidget = new QVTKOpenGLNativeWidget(this);
	this->resize(600, 400);
	this->setCentralWidget(vtkWidget);

	// ViewPort分割
	double xmins[4] = { 0, 0.5, 0 ,0.5 };
	double xmaxs[4] = { 0.5, 1, 0.5,1 };
	double ymins[4] = { 0, 0, 0.5,0.5 };
	double ymaxs[4] = { 0.5, 0.5, 1,1 };

	auto igesActor = ReadIges("D:/TEST/3D/igs/激光剑 .igs");
	auto rendererIges = vtkSmartPointer< vtkRenderer >::New();
	rendererIges->SetViewport(xmins[0], ymins[0], xmaxs[0], ymaxs[0]);
	rendererIges->AddActor(igesActor);

	auto stepActor = ReadStep("D:/TEST/3D/step/Assem1.STEP");
	auto rendererStep = vtkSmartPointer< vtkRenderer >::New();
	rendererStep->SetViewport(xmins[1], ymins[1], xmaxs[1], ymaxs[1]);
	rendererStep->AddActor(stepActor);

	auto topoActor = TopoDSShapeSphere();
	auto rendererTopo = vtkSmartPointer< vtkRenderer >::New();
	rendererTopo->SetViewport(xmins[2], ymins[2], xmaxs[2], ymaxs[2]);
	rendererTopo->AddActor(topoActor);

	auto vTKpointOnMeshes = VTKpointOnMeshes("D:/TEST/3D/step/叶片.STEP");
	auto rendererVTKpointOnMeshes = vtkSmartPointer< vtkRenderer >::New();
	rendererVTKpointOnMeshes->SetViewport(xmins[3], ymins[3], xmaxs[3], ymaxs[3]);
	rendererVTKpointOnMeshes->AddActor(vTKpointOnMeshes);
	vtkNew<vtkAxesActor> axes;
	// 总长
	// 初始化数组
	double axesLength[3]{ 100,100,100 };
	axes->SetTotalLength(axesLength);
	rendererIges->AddActor(axes);
	vtkWidget->renderWindow()->AddRenderer(rendererIges);
	vtkWidget->renderWindow()->AddRenderer(rendererStep);
	vtkWidget->renderWindow()->AddRenderer(rendererTopo);
	vtkWidget->renderWindow()->AddRenderer(rendererVTKpointOnMeshes);
}

VTKOCCT::~VTKOCCT()
{}

##效果
在这里插入图片描述

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: QT是一个跨平台的C++图形界面应用程序框架,VTK是一个用于可视化和图形处理的开源库,而PRO脚本则是为了编写QTVTK程序而设计的脚本语言。 在使用QTVTK开发可视化应用程序时,PRO脚本可以帮助我们简化代码编写和操作。 在编写QT VTK程序时,PRO脚本可以用来管理程序的构建过程。我们可以编写一个.pro文件,其中包含编译、链接和运行程序所需的信息和指令。PRO脚本可以指定程序所依赖的库、头文件的路径和源文件的位置等等。通过简单地修改.pro文件,我们就可以非常方便地修改程序的编译和链接选项。 此外,PRO脚本还可以用来配置QTVTK程序的构建环境。我们可以通过指定不同的编译器、库和路径来定制程序的运行环境。PRO脚本可以帮助我们在不同的平台上使用相同的代码进行构建。 在QTVTK程序中,使用PRO脚本可以提高代码的可维护性和可重用性。我们可以将一些公共的编译和链接选项抽象为变量,在不同的项目中进行复用。此外,PRO脚本还可以定义自定义的构建目标,以及一些自定义的构建规则。 总之,QT VTK PRO脚本是用于编写QTVTK程序时的一种工具。它可以帮助我们管理程序的构建过程和配置环境,提高代码的可维护性和可重用性,使我们能够更方便地开发和调试可视化应用程序。 ### 回答2: Qt VTK Pro脚本是用于在Qt框架中集成VTK(Visualization Toolkit)库的一种脚本。VTK是一个用于三维可视化、图像处理和计算几何方面的开源工具包,提供了丰富的功能和算法用于处理和呈现三维数据。 Qt VTK Pro脚本主要用于简化在Qt应用程序中使用VTK库的过程。它提供了一种方便的方法来创建和管理VTK对象、渲染场景、添加交互功能等。使用该脚本,开发人员可以更轻松地将VTK功能集成到他们的Qt应用程序中。 通过Qt VTK Pro脚本,开发人员可以使用VTK库创建各种类型的3D图形,包括几何体、图像数据、曲线、体积数据等。它还提供了各种渲染技术,如体积渲染、剖面渲染、表面渲染等。 此外,Qt VTK Pro脚本还支持用户交互,允许用户与创建的3D图形进行交互。这可以通过添加鼠标事件、键盘事件等来实现。用户可以旋转、平移、缩放图形,选择对象、改变物体的属性等。 总之,Qt VTK Pro脚本为开发人员提供了一种快速、简便的方式来在他们的Qt应用程序中集成VTK库,从而使他们能够利用VTK的强大功能来处理和呈现三维数据。它使得开发3D可视化应用程序变得更加高效和灵活。 ### 回答3: Qt VTK Pro 脚本是一个用于与QtVTK和Pro软件集成的脚本。 Qt是一个跨平台的C++图形用户界面开发框架,它提供了丰富的GUI组件和工具,使开发人员能够方便地创建功能强大的应用程序。 VTK(Visualization Toolkit)是一个用于可视化和图形处理的开源软件库。它提供了许多可用于创建复杂可视化效果的算法和工具。 Pro是一种为软件项目管理而设计的构建工具。它提供了一种简单且强大的方式来构建、部署和管理软件项目。 Qt VTK Pro脚本的目的是将QtVTK和Pro集成在一起,以便更方便地开发、构建和管理应用程序。 通过使用Qt VTK Pro脚本,开发人员可以使用Qt的GUI组件来构建应用程序的用户界面。他们还可以使用VTK的算法和工具来创建复杂的可视化效果。同时,Pro工具使开发人员能够更轻松地构建、部署和管理他们的应用程序。 Qt VTK Pro脚本的使用可以在许多领域发挥作用。例如,在科学可视化中,它可以用于创建漂亮的3D可视化效果。在工程领域,它可以用于可视化和分析复杂的CAD数据。在医学图像处理中,它可以用于创建精确的医学图像可视化。 总之,Qt VTK Pro 脚本提供了一个强大的工具集,使开发人员能够更方便地将QtVTK和Pro集成在一起,从而创建出功能丰富、具有复杂可视化效果的应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值