使用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 osinc ) LINK_LIBRARIES( vtkCommon vtkGraphics vtkRendering vtkIO C:OpenCASCADE6.6.0 oswin32vc8libdTKIGES.lib C:OpenCASCADE6.6.0 oswin32vc8libdTKernel.lib C:OpenCASCADE6.6.0 oswin32vc8libdTKBRep.lib C:OpenCASCADE6.6.0 oswin32vc8libdTKMath.lib C:OpenCASCADE6.6.0 oswin32vc8libdTKGeomBase.lib C:OpenCASCADE6.6.0 oswin32vc8libdTKGeomAlgo.lib C:OpenCASCADE6.6.0 oswin32vc8libdTKG3d.lib C:OpenCASCADE6.6.0 oswin32vc8libdTKG2d.lib C:OpenCASCADE6.6.0 oswin32vc8libdTKTopAlgo.lib C:OpenCASCADE6.6.0 oswin32vc8libdTKXSBase.lib C:OpenCASCADE6.6.0 oswin32vc8libdTKMesh.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; }
实例显示: