验证occ和vtk整合工作的demo
阅读原文时间:2023年07月10日阅读:2

在编译occ通过过后,我需要验证occ是否能够正常结合vtk进行开发工作

使用CMake进行环境变量设置:

CMakeList.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.5.1\ros\inc
)

LINK_LIBRARIES(
vtkCommon
vtkGraphics
vtkRendering
vtkIO
C:\OpenCASCADE6.5.1\ros\win32\vc8\libd\TKIGES.lib
C:\OpenCASCADE6.5.1\ros\win32\vc8\libd\TKernel.lib
C:\OpenCASCADE6.5.1\ros\win32\vc8\libd\TKBRep.lib
C:\OpenCASCADE6.5.1\ros\win32\vc8\libd\TKMath.lib
C:\OpenCASCADE6.5.1\ros\win32\vc8\libd\TKGeomBase.lib
C:\OpenCASCADE6.5.1\ros\win32\vc8\libd\TKGeomAlgo.lib
C:\OpenCASCADE6.5.1\ros\win32\vc8\libd\TKG3d.lib
C:\OpenCASCADE6.5.1\ros\win32\vc8\libd\TKG2d.lib
C:\OpenCASCADE6.5.1\ros\win32\vc8\libd\TKTopAlgo.lib
C:\OpenCASCADE6.5.1\ros\win32\vc8\libd\TKXSBase.lib
C:\OpenCASCADE6.5.1\ros\win32\vc8\libd\TKMesh.lib
)

ADD_EXECUTABLE(IGESReader example.cxx)

添加一个example.cxx

// sampleExample.cpp : Defines the entry point for the console application.
//
// OpenCascade library.
#include
#include
#include

#include
#include

#include
#include

#include
#include
#include
#include

//vtk lib
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

/*
* @breif Descret the shape: face.
* For Face will be discreted to triangles; (BRepMesh_FastDiscret)
* To get the triangles of the face, use BRep_Tool::Triangulation(Face, L);
*/
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* render)
{
gp_Ax2 axis;

// 1. Test sphere face while deflection is default 0.1.  
axis.SetLocation(gp\_Pnt(26.0, 0.0, 0.0));  
TopoDS\_Face sphereFace1 = BRepBuilderAPI\_MakeFace(gp\_Sphere(axis, 8.0));  
BuildMesh(render, sphereFace1);

// 2. Test sphere face while deflection is 2.0.  
axis.SetLocation(gp\_Pnt(26.0, 18.0, 0.0));  
TopoDS\_Face sphereFace2 = BRepBuilderAPI\_MakeFace(gp\_Sphere(axis, 8.0));  
BuildMesh(render,sphereFace2, 2.0);

// 3. Test sphere face while deflection is 0.001.  
axis.SetLocation(gp\_Pnt(26.0, -18.0, 0.0));  
TopoDS\_Face sphereFace3 = BRepBuilderAPI\_MakeFace(gp\_Sphere(axis, 8.0));  
BuildMesh(render, sphereFace3, 0.001);  

}

int main(int argc, char *argv[])
{
// Create a renderer, render window, and interactor
vtkSmartPointer renderer = vtkSmartPointer::New();
vtkSmartPointer renderWindow = vtkSmartPointer::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer renderWindowInteractor = vtkSmartPointer::New();
renderWindowInteractor->SetRenderWindow(renderWindow);

//build mesh  
BuildScene(renderer);

renderer->SetBackground(1,1,1);

// Render and interact  
renderWindow->Render();  
renderWindowInteractor->Start();

return 0;  

}

你可能在编译的过程当中,遇到缺少dll文件,这个说明 你并没有把相应的dll文件放在环境变量当中去。

运行结果:

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章