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