OpenCascade笔记:TopoDS_Shape数据结构的访问

这篇具有很好参考价值的文章主要介绍了OpenCascade笔记:TopoDS_Shape数据结构的访问。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以box为例

BRepPrimAPI_MakeBox mkBox(10, 10, 10);
TopoDS_Shape aShape = mkBox.Shape();

TopoDS_Shape数据结构

参看:OpenCascade笔记:【OpenCascade拓扑对象之:TopoDS_Shape的三要素】

TopoDS_Shape的HashCode

以下俩成员,作为生成hashCode的主要元素

  • Handle(TopoDS_TShape) myTShape;
  • TopLoc_Location myLocation;

方向成员TopAbs_Orientation myOrient;不参与HashCode的生成。

访问顶点

第一种遍历方式拿到的是体构建的TopoDS_Face、TopoDS_Edge、TopoDS_Vertex的数量;
第二种遍历方式拿到的是体构建的BRep_TFace、BRep_TEdge、BRep_TVertex的数量(最终展现形式还是TopoDS_Face、TopoDS_Edge、TopoDS_Vertex)。 举个例子:以BOX为例 TopExp_Explorer 遍历出48个顶点、24条边、6片面; TopExp遍历出8个顶点、12条边、6片面

	//第一种遍历方式拿到的是体构建的TopoDS_Face、TopoDS_Edge、TopoDS_Vertex的数量;
	//第二种遍历方式拿到的是体构建的BRep_TFace、BRep_TEdge、BRep_TVertex的数量(最终展现形式还是TopoDS_Face、TopoDS_Edge、TopoDS_Vertex)。
	//举个例子:以BOX为例
	//TopExp_Explorer 遍历出48个顶点、24条边、6片面;
	//TopExp遍历出8个顶点、12条边、6片面;


	//第一种遍历方式
	TopExp_Explorer aExp;
	int i = 1;
	for (aExp.Init(aShape, TopAbs_VERTEX); aExp.More(); aExp.Next(), ++i )
	{
		const TopoDS_Vertex& aVertex = TopoDS::Vertex(aExp.Current());
		gp_Pnt aPnt = BRep_Tool::Pnt(aVertex);

		std::cout << "vertex " << i << ": (" << aPnt.X() << ", " << aPnt.Y()
			<< ", " << aPnt.Z() << "), vertex's hash code is " 
			<< aVertex.HashCode(INT_MAX) << std::endl;
	}

	//第二种遍历方式
	TopTools_IndexedMapOfShape aVertexMap;
	TopExp::MapShapes(aShape, TopAbs_VERTEX, aVertexMap);
	cout << "vertex count is " << aVertexMap.Extent() << std::endl;
	for (int i = 1; i <= aVertexMap.Extent(); ++i)
	{
		const TopoDS_Vertex& aVertex = TopoDS::Vertex(aVertexMap(i));
		gp_Pnt aPnt = BRep_Tool::Pnt(aVertex);

		std::cout << "vertex " << i << ": (" << aPnt.X() << ", " << aPnt.Y()
			<< ", " << aPnt.Z() << "), vertex's hash code is "
			<< aVertex.HashCode(INT_MAX) << std::endl;
	}

访问边

	//第一种遍历方式拿到的是体构建的TopoDS_Face、TopoDS_Edge、TopoDS_Vertex的数量;
	//第二种遍历方式拿到的是体构建的BRep_TFace、BRep_TEdge、BRep_TVertex的数量(最终展现形式还是TopoDS_Face、TopoDS_Edge、TopoDS_Vertex)。
	//举个例子:以BOX为例
	//TopExp_Explorer 遍历出48个顶点、24条边、6片面;
	//TopExp遍历出8个顶点、12条边、6片面;


	//第一种遍历方式
	TopExp_Explorer aExp;
	int i = 1;
	for (aExp.Init(aShape, TopAbs_EDGE); aExp.More(); aExp.Next(), ++i )
	{
		const TopoDS_Edge& aEdge = TopoDS::Edge(aExp.Current());
		const TopoDS_Vertex& aFirstVertex = TopExp::FirstVertex(aEdge);
		const TopoDS_Vertex& aLastVertex = TopExp::LastVertex(aEdge);
	}

	//第二种遍历方式
	TopTools_IndexedMapOfShape aEdgeMap;
	TopExp::MapShapes(aShape, TopAbs_EDGE, aEdgeMap);
	cout << "edge count is " << aEdgeMap.Extent() << std::endl;
	for (int i = 1; i <= aEdgeMap.Extent(); ++i)
	{
		const TopoDS_Edge& aEdge = TopoDS::Edge(aEdgeMap(i));
		const TopoDS_Vertex& aFirstVertex = TopExp::FirstVertex(aEdge);
		const TopoDS_Vertex& aLastVertex = TopExp::LastVertex(aEdge);

		Standard_Real fBegin = 0, fEnd = 0;
		Handle(Geom_Curve) hCurve = BRep_Tool::Curve(aEdge, fBegin, fEnd);
		if (!hCurve.IsNull()) 
		{
			//边是条几何线,如直线、椭圆线、贝塞尔曲线等等

			//散列化,进行取点
			float fLen = float(fEnd - fBegin);
			int ulNbOfPoints = 30;
			for (int i = 0; i < ulNbOfPoints; i++)
			{
				const gp_Pnt& ptPoint = hCurve->Value(fBegin + (fLen * float(i)) / float(ulNbOfPoints - 1));
				
			}

			continue;
		}



		TopLoc_Location locPolygon;
		Handle(Poly_Polygon3D) hPolygon3D = BRep_Tool::Polygon3D(aEdge, locPolygon);
		if (!hPolygon3D.IsNull())
		{
			//边是条多段线(曲线的近似表示)
			Standard_Integer nNodeCount = hPolygon3D->NbNodes();
			const TColgp_Array1OfPnt& mNodes = hPolygon3D->Nodes();
			for (int i = 1; i <= nNodeCount; ++i)
			{
				const gp_Pnt& ptPoint = mNodes(i);
			}
		}

	}

附上occ中几何曲线的类层次
opencascade数据结构,OpenCascade,TopoDS_Shape,TopoDS_Shap遍历

面的访问

	//拆分三角形
	Bnd_Box bounds;
	BRepBndLib::Add(aShape, bounds);
	bounds.SetGap(0.0);
	Standard_Real xMin, yMin, zMin, xMax, yMax, zMax;
	bounds.Get(xMin, yMin, zMin, xMax, yMax, zMax);
	Standard_Real deflection = ((xMax - xMin) + (yMax - yMin) + (zMax - zMin)) / 300.0 *0.5;
	BRepMesh_IncrementalMesh(aShape, deflection, false);


	//第一种遍历方式拿到的是体构建的TopoDS_Face、TopoDS_Edge、TopoDS_Vertex的数量;
	//第二种遍历方式拿到的是体构建的BRep_TFace、BRep_TEdge、BRep_TVertex的数量(最终展现形式还是TopoDS_Face、TopoDS_Edge、TopoDS_Vertex)。
	//举个例子:以BOX为例
	//TopExp_Explorer 遍历出48个顶点、24条边、6片面;
	//TopExp遍历出8个顶点、12条边、6片面;


	//第一种遍历方式
	TopExp_Explorer aExp;
	int i = 1;
	for (aExp.Init(aShape, TopAbs_FACE); aExp.More(); aExp.Next(), ++i )
	{
		const TopoDS_Edge& aEdge = TopoDS::Edge(aExp.Current());
		const TopoDS_Vertex& aFirstVertex = TopExp::FirstVertex(aEdge);
		const TopoDS_Vertex& aLastVertex = TopExp::LastVertex(aEdge);
	}

	//第二种遍历方式
	TopTools_IndexedMapOfShape aFaceMap;
	TopExp::MapShapes(aShape, TopAbs_FACE, aFaceMap);
	cout << "face count is " << aFaceMap.Extent() << std::endl;
	for (int i = 1; i <= aFaceMap.Extent(); ++i)
	{
		const TopoDS_Face& curFace = TopoDS::Face(aFaceMap(i));
		BRepAdaptor_Surface adaptorSurface(curFace);
		GeomAbs_SurfaceType surfaceType = adaptorSurface.GetType();
		//GeomAbs_Plane,
		//GeomAbs_Cylinder,
		//GeomAbs_Cone,
		//GeomAbs_Sphere,
		//GeomAbs_Torus,
		//GeomAbs_BezierSurface,
		//GeomAbs_BSplineSurface,
		//GeomAbs_SurfaceOfRevolution,
		//GeomAbs_SurfaceOfExtrusion,
		//GeomAbs_OffsetSurface,
		//GeomAbs_OtherSurface

		//前面对面进行了三角化(BRepMesh_IncrementalMesh)
		//此处可以取出三角面信息
		TopLoc_Location aLoc;
		Handle(Poly_Triangulation) mesh = BRep_Tool::Triangulation(
			curFace, aLoc);
		if (mesh.IsNull())
		{
			continue;
		}

		const Poly_Array1OfTriangle& mTriangles = mesh->Triangles();
		const TColgp_Array1OfPnt& mNodes = mesh->Nodes();
		for (int g = 1; g <= mesh->NbTriangles(); g++)
		{
			// Get the triangle
			Standard_Integer N1, N2, N3;
			mTriangles(g).Get(N1, N2, N3);

			// change orientation of the triangles
			if (curFace.Orientation() != TopAbs_FORWARD) {
				Standard_Integer tmp = N1;
				N1 = N2;
				N2 = tmp;
			}

			gp_Pnt V1 = mNodes(N1);
			gp_Pnt V2 = mNodes(N2);
			gp_Pnt V3 = mNodes(N3);

			if (!aLoc.IsIdentity())
			{
				V1.Transform(aLoc.Transformation());
				V2.Transform(aLoc.Transformation());
				V3.Transform(aLoc.Transformation());
			}
		}

		//.....

	}

附上occ中几何面的类层次
opencascade数据结构,OpenCascade,TopoDS_Shape,TopoDS_Shap遍历

Wire、Shell、Solid的访问

与上文类似

参看

https://blog.csdn.net/Mengxy_2021/article/details/117732021文章来源地址https://www.toymoban.com/news/detail-666815.html

到了这里,关于OpenCascade笔记:TopoDS_Shape数据结构的访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构之堆——算法与数据结构入门笔记(六)

    本文是算法与数据结构的学习笔记第六篇,将持续更新,欢迎小伙伴们阅读学习。有不懂的或错误的地方,欢迎交流 当涉及到高效的数据存储和检索时,堆(Heap)是一种常用的数据结构。上一篇文章中介绍了树和完全二叉树,堆就是一个完全二叉树,可以分为最大堆和最小

    2024年02月11日
    浏览(33)
  • 数据结构学习笔记(王道)

    PS:本文章部分内容参考自王道考研数据结构笔记 1.1. 数据结构 数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素:数据的基本单位,一个数据元素可由若干数据项组成。 数据项:数据的不可分割的最

    2024年02月03日
    浏览(195)
  • 数据结构-学习笔记

     注意:该文章摘抄之百度,仅当做学习笔记供小白使用,若侵权请联系删除! 什么是数据结构? 数据结构是计算机存储、组织数据的方式。 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 结构包括逻辑结构和物理结构。 数据的逻辑结构包括4种  (1)集

    2024年01月23日
    浏览(45)
  • 数据结构【考研笔记】

    1、基本概念 1)数据 数据是 信息的载体 ,是描述客观事物属性的数、字符及所有 能输入到计算机中并被计算机程序识别和处理的符号 的集合。数据是计算机程序加工的原料。 2)数据元素、数据项 数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据

    2024年02月12日
    浏览(35)
  • 数据结构和算法笔记

    #include iostream #include vector #include stack #include deque using namespace std; // 单调栈 vectorint nextGreaterElement(vectorint nums) {     vectorint ans;     stackint s;     for (int i = nums.size() - 1; i = 0; i--) {         while (!s.empty()  s.top()  nums[i]) {             s.pop();    

    2024年01月16日
    浏览(52)
  • 数据结构期末复习笔记

    #搬运自己的原创笔记到这,从flowus# #因为后面时间不够了,所以没有把笔记做完,期末考试的最后的代码题一般都是书上的代码,考的简单,这个学期就是递归树。#       1.循环链表 2.双向链表 1.顺序栈 2.链栈 1.循环队列(顺序队列) 2.链式队列

    2024年01月21日
    浏览(34)
  • 《数据结构》学习笔记

    1.算法分析的两个主要任务:正确性(不变性 + 单调性) + 复杂度。 2.复杂度分析的主要方法: 迭代:级数求和; 递归:递归跟踪 + 递推方程 猜测 + 验证 3.级数: (1)算术级数:与末项平方同阶 T ( n ) = 1 + 2 + ⋯ + n = n ( n + 1 ) 2 = O ( n 2 ) T(n) = 1 + 2 + cdots + n = frac{n(n+1)}{2} =

    2024年01月25日
    浏览(36)
  • 数据结构之栈、队列——算法与数据结构入门笔记(四)

    本文是算法与数据结构的学习笔记第四篇,将持续更新,欢迎小伙伴们阅读学习 。有不懂的或错误的地方,欢迎交流 栈是一种线性数据结构,其 只允许在固定的一端进行插入和删除 元素操作。进行数据插入和删除操作的一端称为栈顶 (Top), 另一端称为栈底 (Bottom)。栈中的

    2024年02月08日
    浏览(29)
  • 数据结构详细笔记——并查集

    集合:将各个元素划分为若干个互不相交的子集的集合 森林是m(m=0)棵互不相交的树的集合 优化思路:在每次Union操作构建树的时候,尽可能让树不长高 ①用根结点的绝对值表示树的结点的总数 ②Union操作,让小树合并到大树 优化思路:先找到根结点,再将查找路径上所有结

    2024年02月06日
    浏览(32)
  • Redis数据结构学习笔记

    图文主要参考小林Coding的图解redis数据结构 除了它是内存数据库,使得所有的操作都在内存上进⾏之外,还有⼀个重要因素,它实现的数据结构,使 得我们对数据进⾏增删查改操作时,Redis 能⾼效的处理。 :::tips redisDb 结构 ,表示 Redis 数据库的结构,结构体⾥存放了指向了

    2024年02月02日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包