zoukankan      html  css  js  c++  java
  • occ+vtk显示igs模型

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


    实例显示:


  • 相关阅读:
    无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)
    ASP.NET Web API 数据验证
    css控制文字显示长度,超过用省略号替代
    Android 屏幕适配
    Android ListView item项 显示动画
    Android 定位地理坐标体系
    Android 解压缩功能
    Android 魅族等SmartBar适配
    Android 推送实现
    Android Mvc 实现
  • 原文地址:https://www.cnblogs.com/skyhuangdan/p/5486779.html
Copyright © 2011-2022 走看看