occ+vtk显示igs模型

使用Opencascade读取igs文件内模型,使用vtk进行显示。

本案例环境:Opencascade6.6.0 +  vtk-5.10 + VS2005(win32)


使用CMake管理工程。

CMakeLists.txt :

[cpp]  view plain  copy
  1. PROJECT (IgesReader)  
  2.   
  3. #VTK Part:  
  4. FIND_PACKAGE(VTK)  
  5. IF (VTK_FOUND)  
  6.   INCLUDE(${VTK_USE_FILE})  
  7. ELSE(VTK_FOUND)  
  8.   MESSAGE(FATAL_ERROR  
  9.      "Cannot build without VTK.  Please set VTK_DIR.")  
  10. ENDIF (VTK_FOUND)  
  11.   
  12. #OpenCascade Part:  
  13. INCLUDE_DIRECTORIES(  
  14.   C:\OpenCASCADE6.6.0\ros\inc  
  15. )  
  16.   
  17. LINK_LIBRARIES(  
  18.   vtkCommon  
  19.   vtkGraphics  
  20.   vtkRendering  
  21.   vtkIO  
  22.   C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKIGES.lib  
  23.   C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKernel.lib  
  24.   C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKBRep.lib  
  25.   C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKMath.lib  
  26.   C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKGeomBase.lib  
  27.   C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKGeomAlgo.lib  
  28.   C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKG3d.lib  
  29.   C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKG2d.lib  
  30.   C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKTopAlgo.lib  
  31.   C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKXSBase.lib  
  32.   C:\OpenCASCADE6.6.0\ros\win32\vc8\libd\TKMesh.lib  
  33. )  
  34.   
  35. ADD_EXECUTABLE(IgesReader Readiges.cpp)  

main.cpp:

[cpp]  view plain  copy
  1. #define WNT  
  2. #include <gp_Circ.hxx>  
  3. #include <gp_Elips.hxx>  
  4. #include <gp_Sphere.hxx>  
  5.   
  6. #include <Poly_Polygon3D.hxx>  
  7. #include <Poly_Triangulation.hxx>  
  8.   
  9. #include <TopTools_ListIteratorOfListOfShape.hxx>  
  10. #include <TopTools_HSequenceOfShape.hxx>  
  11.   
  12. #include <BRepBuilderAPI_MakeVertex.hxx>  
  13. #include <BRepBuilderAPI_MakeEdge.hxx>  
  14.   
  15. #include <IGESControl_Controller.hxx>  
  16. #include <IGESControl_Writer.hxx>  
  17. #include <IGESControl_Reader.hxx>  
  18.   
  19. #include <TopoDS_Edge.hxx>  
  20. #include <TopoDS_Face.hxx>  
  21. #include <TopoDS.hxx>  
  22.   
  23.   
  24.   
  25. #include <BRep_Tool.hxx>  
  26. #include <BRepMesh.hxx>  
  27. #include <BRepBuilderAPI_MakeEdge.hxx>  
  28. #include <BRepBuilderAPI_MakeFace.hxx>  
  29.   
  30.   
  31.   
  32. #include <BRepAdaptor_Curve.hxx>  
  33. #include <GCPnts_TangentialDeflection.hxx>  
  34. #include <TopExp_Explorer.hxx>  
  35. #include <Standard_TypeDef.hxx>  
  36.   
  37. #include <iostream>  
  38.   
  39. #include <vtkRenderer.h>  
  40. #include <vtkSmartPointer.h>  
  41. #include <vtkRenderWindow.h>  
  42. #include <vtkRenderWindowInteractor.h>  
  43.   
  44. //vtk lib  
  45. #include <vtkSmartPointer.h>  
  46. #include <vtkPoints.h>  
  47. #include <vtkPolyData.h>  
  48. #include <vtkCellArray.h>  
  49. #include <vtkPolyDataMapper.h>  
  50. #include <vtkActor.h>  
  51. #include <vtkRenderWindow.h>  
  52. #include <vtkRenderer.h>  
  53. #include <vtkRenderWindowInteractor.h>  
  54. #include <vtkProperty.h>  
  55. #include <vtkTriangle.h>  
  56.   
  57. Standard_Integer ReadIGES(const Standard_CString& aFileName,  
  58.                            Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape)  
  59. {  
  60.   
  61.     IGESControl_Reader Reader;  
  62.   
  63.     Standard_Integer status = Reader.ReadFile(aFileName);  
  64.   
  65.     if (status != IFSelect_RetDone)   
  66.     {  
  67.         return status;  
  68.     }  
  69.           
  70.     Reader.TransferRoots();  
  71.       
  72.     TopoDS_Shape aShape = Reader.OneShape();       
  73.     aHSequenceOfShape->Append(aShape);  
  74.   
  75.   
  76.     return status;  
  77. }  
  78.   
  79.   
  80. void BuildMesh(vtkRenderer* render, const TopoDS_Face& face, double deflection = 0.1)  
  81. {  
  82.     TopLoc_Location location;  
  83.     BRepMesh::Mesh(face, deflection);  
  84.   
  85.     Handle_Poly_Triangulation triFace = BRep_Tool::Triangulation(face, location);  
  86.   
  87.     Standard_Integer nTriangles = triFace->NbTriangles();  
  88.   
  89.     gp_Pnt vertex1;  
  90.     gp_Pnt vertex2;  
  91.     gp_Pnt vertex3;  
  92.   
  93.     Standard_Integer nVertexIndex1 = 0;  
  94.     Standard_Integer nVertexIndex2 = 0;  
  95.     Standard_Integer nVertexIndex3 = 0;  
  96.   
  97.     TColgp_Array1OfPnt nodes(1, triFace->NbNodes());  
  98.     Poly_Array1OfTriangle triangles(1, triFace->NbTriangles());  
  99.   
  100.     nodes = triFace->Nodes();  
  101.     triangles = triFace->Triangles();         
  102.   
  103.     vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();  
  104.     vtkSmartPointer<vtkCellArray> cells = vtkSmartPointer<vtkCellArray>::New();  
  105.     vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();  
  106.     points->Allocate(nTriangles * 3);  
  107.     cells->Allocate(nTriangles);  
  108.   
  109.     int id = 0;  
  110.   
  111.     for (Standard_Integer i = 1; i <= nTriangles; i++)  
  112.     {  
  113.         Poly_Triangle aTriangle = triangles.Value(i);  
  114.   
  115.         aTriangle.Get(nVertexIndex1, nVertexIndex2, nVertexIndex3);  
  116.   
  117.         vertex1 = nodes.Value(nVertexIndex1).Transformed(location.Transformation());  
  118.         vertex2 = nodes.Value(nVertexIndex2).Transformed(location.Transformation());  
  119.         vertex3 = nodes.Value(nVertexIndex3).Transformed(location.Transformation());  
  120.   
  121.         points->InsertNextPoint(vertex1.X(), vertex1.Y(), vertex1.Z());  
  122.         points->InsertNextPoint(vertex2.X(), vertex2.Y(), vertex2.Z());  
  123.         points->InsertNextPoint(vertex3.X(), vertex3.Y(), vertex3.Z());  
  124.   
  125.         vtkSmartPointer<vtkTriangle> triangle = vtkSmartPointer<vtkTriangle>::New();  
  126.         triangle->GetPointIds()->SetId(0,id * 3);  
  127.         triangle->GetPointIds()->SetId(1,id * 3 + 1);  
  128.         triangle->GetPointIds()->SetId(2,id *3 + 2);  
  129.   
  130.         // Add the triangle to a cell array  
  131.         cells->InsertNextCell(triangle);  
  132.         id++;  
  133.     }  
  134.   
  135.     polyData->SetPoints(points);  
  136.     polyData->SetPolys(cells);  
  137.   
  138.     vtkSmartPointer<vtkPolyDataMapper> sourceMapper = vtkSmartPointer<vtkPolyDataMapper>::New();  
  139.     sourceMapper->SetInput(polyData);  
  140.   
  141.     vtkSmartPointer<vtkActor> sourceActor = vtkSmartPointer<vtkActor>::New();  
  142.     sourceActor->SetMapper(sourceMapper);  
  143.     sourceActor->GetProperty()->SetColor(1,0,0);  
  144.   
  145.     render->AddActor(sourceActor);  
  146.   
  147. }  
  148.   
  149. void BuildScene(  vtkRenderer *renderer, Handle(TopTools_HSequenceOfShape)& aHSequenceOfShape)  
  150. {  
  151.     Standard_Integer index = aHSequenceOfShape->Length();  
  152.     TopoDS_Shape theCompSolid = aHSequenceOfShape->ChangeValue(index);  
  153.   
  154.     for (TopExp_Explorer faceExp(theCompSolid, TopAbs_FACE); faceExp.More(); faceExp.Next())  
  155.     {  
  156.         // The 3d-mesh of the FACE is assembled to form the  
  157.         // boundary of the SOLID.  
  158.           
  159.         const TopoDS_Face& theFace = TopoDS::Face(faceExp.Current());  
  160.         BuildMesh(renderer, theFace );  
  161.   
  162.   
  163.   
  164.     }         
  165.       
  166.   
  167.   
  168.   
  169. }  
  170.   
  171.   
  172.   
  173. int main(void)  
  174. {  
  175.     vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();  
  176.     vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();  
  177.     renderWindow->AddRenderer(renderer);  
  178.       
  179.     vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();  
  180.     renderWindowInteractor->SetRenderWindow(renderWindow);  
  181.   
  182.   
  183.   
  184.   
  185.   
  186.     Handle(TopTools_HSequenceOfShape) aHSequenceOfShape =  new TopTools_HSequenceOfShape();  
  187.     Standard_Integer status = ReadIGES("e:\\p3.igs",aHSequenceOfShape);  
  188.     cout<<"return status:"<<status<<endl;  
  189.   
  190.   
  191.     BuildScene(renderer, aHSequenceOfShape);  
  192.   
  193.   
  194.     renderer->SetBackground(1,1,1);  
  195.   
  196.     // Render and interact  
  197.     renderWindow->Render();  
  198.     renderWindowInteractor->Start();  
  199.   
  200.     return 0;  
  201.   
  202. }  


实例显示:

zhuan:https://blog.csdn.net/skyhuangdan/article/details/38677951

猜你喜欢

转载自blog.csdn.net/eric_e/article/details/80738368