使用Opencascade读取igs文件内模型,使用vtk进行显示。
本案例环境:Opencascade6.6.0 + vtk-5.10 + VS2005(win32)
使用CMake管理工程。
CMakeLists.txt :
- PROJECT (IgesReader)
- #VTK Part:
- FIND_PACKAGE(VTK)
- IF (VTK_FOUND)
- INCLUDE(${VTK_USE_FILE})
- ELSE(VTK_FOUND)
- MESSAGE(FATAL_ERROR
- "Cannot build without VTK. Please set VTK_DIR.")
- ENDIF (VTK_FOUND)
- #OpenCascade Part:
- INCLUDE_DIRECTORIES(
- C:\OpenCASCADE6.6.0\ros\inc
- )
- LINK_LIBRARIES(
- vtkCommon
- vtkGraphics
- vtkRendering
- vtkIO
- C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKIGES.lib
- C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKernel.lib
- C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKBRep.lib
- C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKMath.lib
- C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKGeomBase.lib
- C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKGeomAlgo.lib
- C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKG3d.lib
- C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKG2d.lib
- C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKTopAlgo.lib
- C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKXSBase.lib
- C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKMesh.lib
- )
- ADD_EXECUTABLE(IgesReader Readiges.cpp)
main.cpp:
- #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 <BRepBuilderAPI_MakeEdge.hxx>
- #include <BRepBuilderAPI_MakeFace.hxx>
- #include <BRepAdaptor_Curve.hxx>
- #include <GCPnts_TangentialDeflection.hxx>
- #include <TopExp_Explorer.hxx>
- #include <Standard_TypeDef.hxx>
- #include <iostream>
- #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);
- 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->SetInput(polyData);
- 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<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
- vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
- renderWindow->AddRenderer(renderer);
- vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
- renderWindowInteractor->SetRenderWindow(renderWindow);
- Handle(TopTools_HSequenceOfShape) aHSequenceOfShape = new TopTools_HSequenceOfShape();
- Standard_Integer status = ReadIGES("e:\\p3.igs",aHSequenceOfShape);
- cout<<"return status:"<<status<<endl;
- BuildScene(renderer, aHSequenceOfShape);
- renderer->SetBackground(1,1,1);
- // Render and interact
- renderWindow->Render();
- renderWindowInteractor->Start();
- return 0;
- }
实例显示:
zhuan:https://blog.csdn.net/skyhuangdan/article/details/38677951