VS2015+Qt5.10.1编译VTK8.2.0和OpenCASCADE7.2.0实现IGS载入

VS2015+Qt5.10.1编译VTK8.2.0和OpenCASCADE7.2.0实现IGS载入
最近做项目需要读取IGS格式的模型并进行显示,借用网上的帖子https://blog.****.net/skyhuangdan/article/details/38553249,利用OCC中的IGS接口读取文件,离散处理后,vtk显示出三维模型。想按帖子提供的代码实现读取igs的功能,但是发现有两个函数已经弃用,经本人修改和测试,最终实现了igs文件的读取和显示。

一、编译VTK8.2.0
1、使用vs2015+Qt5.10.1的基本编译环境,cmake3.11.0;
2、下载VTK8.2.0源码包额依赖数据包:https://vtk.org/download/;
3、编译过程参考:https://blog.****.net/xuyi1218037/article/details/84313095
二、编译OpenCASCADE7.2.0
1、使用vs2015+Qt5.10.1的基本编译环境,cmake3.11.0;
2、下载OpenCASCADE7.2.0源码包额依赖数据包:https://www.opencascade.com/content/latest-release;
3、编译过程:
a、cmake-gui configure generate 注意需要添加第三完整方库,其实在安装包(非源码包)安装后,安装目录下会有全部的第三方库。
b、vs2015打开cmake生成的OCCT.sln,all-build,依赖库完整的话应该会顺利build成功。

三、vtk工程编译
1、打开vtk编译目录:…/VTK\VTK-8.2.0\Examples\Tutorial\Step6\Cxx下的step6.sln;
2、给step6工程配置occ的inc、libd路径;
3、用以下代码替换main.cxx全部内容;注意与参考帖子不同的地方已经注释。最终运行时将occ的bind里的dll考到当前工程的生成路径下。

#define WNT
#include <gp_Circ.hxx>
#include <gp_Elips.hxx>
#include <gp_Sphere.hxx>

#include <Poly_Polygon3D.hxx>
#include <Poly_Triangulation.hxx>

#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_HSequenceOfShape.hxx>

#include <BRepBuilderAPI_MakeVertex.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>

#include <IGESControl_Controller.hxx>
#include <IGESControl_Writer.hxx>
#include <IGESControl_Reader.hxx>

#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS.hxx>

#include <BRep_Tool.hxx>
#include <BRepMesh.hxx>
#include <BRepMesh_IncrementalMesh.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>

#include <BRepAdaptor_Curve.hxx>
#include <GCPnts_TangentialDeflection.hxx>
#include <TopExp_Explorer.hxx>
#include <Standard_TypeDef.hxx>

#include

#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

//vtk lib
#include <vtkSmartPointer.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkCellArray.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkTriangle.h>

Standard_Integer ReadIGES(const Standard_CString& aFileName,
Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape)
{

IGESControl_Reader Reader;

Standard_Integer status = Reader.ReadFile(aFileName);

if (status != IFSelect_RetDone)
{
	return status;
}

Reader.TransferRoots();

TopoDS_Shape aShape = Reader.OneShape();
aHSequenceOfShape->Append(aShape);
return status;

}

void BuildMesh(vtkRenderer* render, const TopoDS_Face& face, double deflection = 0.1)
{
TopLoc_Location location;
//BRepMesh::Mesh(face, deflection);//注意已经弃用的函数
BRepMesh_IncrementalMesh(face, deflection);//替换为这个函数
Handle_Poly_Triangulation triFace = BRep_Tool::Triangulation(face, location);

Standard_Integer nTriangles = triFace->NbTriangles();

gp_Pnt vertex1;
gp_Pnt vertex2;
gp_Pnt vertex3;

Standard_Integer nVertexIndex1 = 0;
Standard_Integer nVertexIndex2 = 0;
Standard_Integer nVertexIndex3 = 0;

TColgp_Array1OfPnt nodes(1, triFace->NbNodes());
Poly_Array1OfTriangle triangles(1, triFace->NbTriangles());

nodes = triFace->Nodes();
triangles = triFace->Triangles();

vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkCellArray> cells = vtkSmartPointer<vtkCellArray>::New();
vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
points->Allocate(nTriangles * 3);
cells->Allocate(nTriangles);

int id = 0;

for (Standard_Integer i = 1; i <= nTriangles; i++)
{
	Poly_Triangle aTriangle = triangles.Value(i);

	aTriangle.Get(nVertexIndex1, nVertexIndex2, nVertexIndex3);

	vertex1 = nodes.Value(nVertexIndex1).Transformed(location.Transformation());
	vertex2 = nodes.Value(nVertexIndex2).Transformed(location.Transformation());
	vertex3 = nodes.Value(nVertexIndex3).Transformed(location.Transformation());

	points->InsertNextPoint(vertex1.X(), vertex1.Y(), vertex1.Z());
	points->InsertNextPoint(vertex2.X(), vertex2.Y(), vertex2.Z());
	points->InsertNextPoint(vertex3.X(), vertex3.Y(), vertex3.Z());

	vtkSmartPointer<vtkTriangle> triangle = vtkSmartPointer<vtkTriangle>::New();
	triangle->GetPointIds()->SetId(0, id * 3);
	triangle->GetPointIds()->SetId(1, id * 3 + 1);
	triangle->GetPointIds()->SetId(2, id * 3 + 2);

	// Add the triangle to a cell array  
	cells->InsertNextCell(triangle);
	id++;
}

polyData->SetPoints(points);
polyData->SetPolys(cells);

vtkSmartPointer<vtkPolyDataMapper> sourceMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
sourceMapper->SetInputData(polyData);//SetInput函数已经弃用

vtkSmartPointer<vtkActor> sourceActor = vtkSmartPointer<vtkActor>::New();
sourceActor->SetMapper(sourceMapper);
sourceActor->GetProperty()->SetColor(1, 0, 0);

render->AddActor(sourceActor);

}

void BuildScene(vtkRenderer *renderer, Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape)
{
Standard_Integer index = aHSequenceOfShape->Length();
TopoDS_Shape theCompSolid = aHSequenceOfShape->ChangeValue(index);

for (TopExp_Explorer faceExp(theCompSolid, TopAbs_FACE); faceExp.More(); faceExp.Next())
{
	// The 3d-mesh of the FACE is assembled to form the  
	// boundary of the SOLID.  

	const TopoDS_Face& theFace = TopoDS::Face(faceExp.Current());
	BuildMesh(renderer, theFace);
}

}

int main(void)
{
vtkSmartPointer renderer = vtkSmartPointer::New();
vtkSmartPointer renderWindow = vtkSmartPointer::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer renderWindowInteractor = vtkSmartPointer::New();

renderWindowInteractor->SetRenderWindow(renderWindow);
Handle(TopTools_HSequenceOfShape) aHSequenceOfShape = new TopTools_HSequenceOfShape();
Standard_Integer status = ReadIGES("e:\\p3.iges", aHSequenceOfShape);
cout << "return status:" << status << endl;
BuildScene(renderer, aHSequenceOfShape);
renderer->SetBackground(1, 1, 1);
// Render and interact  
renderWindow->Render();
renderWindowInteractor->Start();
return 0;

}
VS2015+Qt5.10.1编译VTK8.2.0和OpenCASCADE7.2.0实现IGS载入