cmake管理opencascade的實例

編譯opencascade的時候經常會遇到occt能夠編譯通過,但是sample編譯運行的時候總是出現各種各樣的問題,如果僅僅是用occt的幾何數據進行模型管理和處理的話,可以不用太關注sample的例子,這樣就可以用cmake裏方便的對opencascade下面開發的工程進行管理,免除很多繁瑣的設置。


這裏介紹,利用vtk作爲模型顯示平臺,opencascade作爲數據建模平臺,整個工程運用cmake管理的例子,具體如下:


1.運用cmake打開工程文件:


2.選擇編譯環境,先後configure, generate,忽略可能出現的warnings



3.打開生成的工程:



4.編譯運行,可得結果:



使用非常方便。


源代碼:

CMakeList

PROJECT (SurfVis)

#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\vc9\libd\TKIGES.lib
  C:\OpenCASCADE6.6.0\ros\win32\vc9\libd\TKernel.lib
  C:\OpenCASCADE6.6.0\ros\win32\vc9\libd\TKBRep.lib
  C:\OpenCASCADE6.6.0\ros\win32\vc9\libd\TKMath.lib
  C:\OpenCASCADE6.6.0\ros\win32\vc9\libd\TKGeomBase.lib
  C:\OpenCASCADE6.6.0\ros\win32\vc9\libd\TKGeomAlgo.lib
  C:\OpenCASCADE6.6.0\ros\win32\vc9\libd\TKG3d.lib
  C:\OpenCASCADE6.6.0\ros\win32\vc9\libd\TKG2d.lib
  C:\OpenCASCADE6.6.0\ros\win32\vc9\libd\TKTopAlgo.lib
  C:\OpenCASCADE6.6.0\ros\win32\vc9\libd\TKXSBase.lib
  C:\OpenCASCADE6.6.0\ros\win32\vc9\libd\TKMesh.lib
)

ADD_EXECUTABLE(SurfVis example.cxx)


SourceCode

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

#include <gp_Circ.hxx>
#include <gp_Elips.hxx>
#include <gp_Sphere.hxx>

#include <Poly_Polygon3D.hxx>
#include <Poly_Triangulation.hxx>

#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>

#include <BRep_Tool.hxx>
#include <BRepMesh.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>

#include <GeomTools.hxx>

//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>

/*
* @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);

}

// display the surface parameter
void DumpSurface(const TopoDS_Face& face)
{
	Handle(Geom_Surface) aSurf = BRep_Tool::Surface (face);
	GeomTools::Dump(aSurf, std::cout);
}

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);
	
	DumpSurface(sphereFace2);
}

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

	//build mesh
	BuildScene(renderer);

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

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

	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章