验证occ和vtk整合工作的demo

在完成OpenCascade编译并通过后,本博客详细介绍了如何使用CMake配置环境,将OpenCascade与VTK库整合,通过示例代码演示了如何构建几何形状并将其可视化。遇到dll文件缺失的问题被解决,提供了完整的开发流程与注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在编译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 <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>

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

}

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


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


运行结果:





转载于:https://www.cnblogs.com/skyhuangdan/p/5486780.html

### VTKOCC的区别、用途及集成方式 VTK(Visualization Toolkit)OCC(OpenCASCADE Technology)是两个功能强大但用途不同的开源库。以下是它们的主要区别、适用场景以及如何在项目中集成这两种工具的详细说明。 #### 1. 基本概念 - **VTK** 是一个专注于科学可视化、图像处理3D图形渲染的开源库[^1]。它提供了丰富的算法用于数据可视化、网格生成、体积渲染等任务。 - **OCC** 是一个专注于3D CAD建模的开源几何内核[^2]。它提供了强大的几何建模能力,包括布尔操作、曲面建模、拓扑结构管理等功能。 #### 2. 主要区别 | 特性 | VTK | OCC | |-------------------|---------------------------------------|---------------------------------------| | 核心功能 | 科学可视化、图像处理、3D渲染 | 几何建模、CAD设计 | | 数据表示 | 网格、体素、点云 | 几何实体(如曲面、实体、边、面) | | 应用领域 | 医学成像、流体力学、地质分析 | CAD/CAM、建筑信息建模(BIM)、产品设计 | | 开发语言支持 | C++、Python、Java | C++ | | 集成难度 | 较低,适合快速原型开发 | 较高,需要深入理解几何建模原理 | #### 3. 适用场景 - **VTK 的适用场景**: - 当项目需要对科学数据进行可视化时,例如医学影像中的CT扫描结果或气象数据的三维展示。 - 在需要处理大量点云数据或进行体绘制的应用中,VTK是一个理想的选择。 - **OCC 的适用场景**: - 当项目涉及复杂的3D几何建模时,例如汽车、飞机的设计或机械零件的建模[^2]。 - 在需要精确控制几何形状、执行布尔运算或生成高质量曲面的场景中,OCC表现优异。 #### 4. 集成方式 - **VTK 的集成**: - 可以通过CMake构建系统轻松将VTK集成到C++项目中。 - 对于Python用户,可以安装 `vtk` 包并直接使用其API。 ```python import vtk # 创建一个简单的VTK管线 sphere = vtk.vtkSphereSource() mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(sphere.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) renderer = vtk.vtkRenderer() renderer.AddActor(actor) render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) render_window_interactor = vtk.vtkRenderWindowInteractor() render_window_interactor.SetRenderWindow(render_window) render_window.Render() render_window_interactor.Start() ``` - **OCC 的集成**: - OCC主要以C++为核心,通常需要手动配置编译环境[^2]。 - 使用OCC创建几何对象时,可以通过其提供的API定义复杂形状。 ```cpp #include <TopoDS_Shape.hxx> #include <BRepPrimAPI_MakeBox.hxx> int main() { // 创建一个简单的立方体 TopoDS_Shape myBox = BRepPrimAPI_MakeBox(10, 20, 30).Shape(); return 0; } ``` #### 5. 性能与局限性 - **VTK 的性能与局限性**: - VTK擅长处理大规模数据集,但在几何建模方面功能有限。 - 如果项目需要复杂的几何操作,可能需要与其他工具结合使用。 - **OCC 的性能与局限性**: - OCC在几何建模方面表现出色,但其学习曲线较陡峭,且不直接支持可视化功能。 - 对于简单的可视化需求,可能需要额外集成其他库(如Qt或VTK)。 ### 结论 选择VTK还是OCC取决于项目的具体需求。如果重点在于数据可视化,则应选择VTK;如果需要进行复杂的几何建模,则OCC更为合适。两者也可以结合使用,例如利用OCC生成几何模型后,再通过VTK进行可视化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值