解析OCC几何体(TopoDS_Shape)生成自定义off文件

void ParseTopoDSShapeToOff(const TopoDS_Shape& aShape)
{
	//0计算顶点和顶点索引//
	std::vector<osg::Vec3d> vertexArray;
	BRepMesh_IncrementalMesh(aShape, 0.001);//BRepMesh::Mesh(aShape, 3);//6.8.0后删除了

	gp_Pnt vertex1;
	gp_Pnt vertex2;
	gp_Pnt vertex3;

	Standard_Integer nVertexIndex1 = 0;
	Standard_Integer nVertexIndex2 = 0;
	Standard_Integer nVertexIndex3 = 0;

	TopExp_Explorer faceExplorer;
	for (faceExplorer.Init(aShape, TopAbs_FACE); faceExplorer.More(); faceExplorer.Next())
	{
		TopLoc_Location loc;
		TopoDS_Face aFace = TopoDS::Face(faceExplorer.Current());
		Handle_Poly_Triangulation triFace = BRep_Tool::Triangulation(aFace, loc);
		if (triFace.IsNull())
		{
			continue;
		}

		Standard_Boolean hasNormal = triFace->HasNormals();
		Standard_Boolean hasuvNormal = triFace->HasUVNodes();
		Standard_Integer l = triFace->Nodes().Length();
		Standard_Integer nTriangles = triFace->NbTriangles();

		TColgp_Array1OfPnt nodes(1, triFace->NbNodes());
		Poly_Array1OfTriangle triangles(1, triFace->NbTriangles());
		nodes = triFace->Nodes();
		triangles = triFace->Triangles();

		for (Standard_Integer i = 1; i <= nTriangles; i++)
		{
			Poly_Triangle aTriangle = triangles.Value(i);
			aTriangle.Get(nVertexIndex1, nVertexIndex2, nVertexIndex3);

			vertex1 = nodes.Value(nVertexIndex1);
			vertex2 = nodes.Value(nVertexIndex2);
			vertex3 = nodes.Value(nVertexIndex3);

			vertexArray.push_back(osg::Vec3(vertex1.X(), vertex1.Y(), vertex1.Z()));
			vertexArray.push_back(osg::Vec3(vertex2.X(), vertex2.Y(), vertex2.Z()));
			vertexArray.push_back(osg::Vec3(vertex3.X(), vertex3.Y(), vertex3.Z()));
		}
	}

	//顶点去重
	osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array();
	{
		int nums = vertexArray.size();
		for (unsigned int i = 0; i < nums; i++)
		{
			osg::Vec3d vt = vertexArray.at(i);

			bool bFind = false;//是否存在
			osg::Vec3Array::iterator iter = vertices->begin();
			for (; iter != vertices->end(); ++iter)
			{
				osg::Vec3d _vt = *iter;
				if (_vt == vt)
				{
					bFind = true;
					break;
				}
			}

			if (!bFind)
			{
				vertices->push_back(vt);
			}
		}
	}
	int nums = vertices->size();

	//获取索引
	osg::ref_ptr<osg::DrawElementsUInt> arrayIndexs = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES);
	{
		int nums = vertexArray.size();
		for (unsigned int i = 0; i < nums; i += 3)
		{
			bool bFind0 = false;
			bool bFind1 = false;
			bool bFind2 = false;
			int index0 = 0;
			int index1 = 0;
			int index2 = 0;

			osg::Vec3d vt0 = vertexArray.at(i);
			osg::Vec3d vt1 = vertexArray.at(i + 1);
			osg::Vec3d vt2 = vertexArray.at(i + 2);

			//从去重后的顶点中获取索引
			osg::Vec3Array::iterator iter = vertices->begin();
			for (int index = 0; iter != vertices->end(); ++iter, ++index)
			{
				osg::Vec3d _vt = *iter;
				if (_vt == vt0)
				{
					bFind0 = true;
					index0 = index;//第1个顶点索引
				}
				else if (_vt == vt1) {
					bFind1 = true;
					index1 = index;//第2个顶点索引
				}
				else if (_vt == vt2) {
					bFind2 = true;
					index2 = index;//第3个顶点索引
				}

				if (bFind0 && bFind1 && bFind2)
				{
					arrayIndexs->push_back(index0);
					arrayIndexs->push_back(index1);
					arrayIndexs->push_back(index2);
					break;
				}
			}
		}
	}

	{
		//写OFF
		WirteOffFile("D:/工作/案例(点云+倾斜摄影)/data/cuda/off/my.off", vertices, arrayIndexs);
	}
}

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胖七少爷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值