解析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/off/test.off", vertices, arrayIndexs);
    }
}

转自:https://blog.csdn.net/weixin_43712770/article/details/100972804

posted @ 2022-08-29 10:30  格美格美  阅读(205)  评论(0编辑  收藏  举报