/*! \brief Returns the oriented normal of a triangle * * \warning The returned vector is not normalized * * \param nodes Vertices of the triangulation that \p triangle belongs to * \param triangle Triangle whose normal has to be computed * \param ori Orientation of the triangle (generally inherited from the * triangulated face) */ gp_Vec MathUtils::triangleNormal( const TColgp_Array1OfPnt &nodes, const Poly_Triangle &triangle, TopAbs_Orientation ori) { Standard_Integer n1, n2, n3; if (ori == TopAbs_REVERSED) triangle.Get(n1, n3, n2); else triangle.Get(n1, n2, n3); assert(nodes.Lower() <= n1 && n1 <= nodes.Upper()); assert(nodes.Lower() <= n2 && n2 <= nodes.Upper()); assert(nodes.Lower() <= n3 && n3 <= nodes.Upper()); const gp_Vec v1(nodes(n1), nodes(n2)); // V1=(P1,P2) const gp_Vec v2(nodes(n2), nodes(n3)); // V2=(P2,P3) const gp_Vec v3(nodes(n3), nodes(n1)); // V3=(P3,P1) if ((v1.SquareMagnitude() > 1.e-10) && (v2.SquareMagnitude() > 1.e-10) && (v3.SquareMagnitude() > 1.e-10)) { return v1.Crossed(v2); } return v1; }
void Surface::tessellate() { TopLoc_Location loc; Handle_Poly_Triangulation triangulation = BRep_Tool::Triangulation( m_face, loc ); if ( triangulation.IsNull() ) { return; } int num_triangles = triangulation->NbTriangles(); const TColgp_Array1OfPnt& nodes = triangulation->Nodes(); const Poly_Array1OfTriangle& triangles = triangulation->Triangles(); const TColgp_Array1OfPnt2d& uvNodes = triangulation->UVNodes(); m_surfaceUVRep.resize( 2 * 3 * num_triangles ); m_surfacePointIndecies.resize( 3 * num_triangles ); Standard_Integer n1, n2, n3 = 0; Standard_Integer num_invalid_triangles = 0; Standard_Integer current_triangle = 0; for ( Standard_Integer i = 0; i < num_triangles; i++ ) { Poly_Triangle triangle = triangles( i + 1 ); bool face_reversed = (m_face.Orientation() == TopAbs_REVERSED); if ( face_reversed ) triangle.Get( n1, n3, n2 ); else triangle.Get( n1, n2, n3 ); if (triangleIsValid(nodes(n1), nodes(n2), nodes(n3))) { gp_Pnt2d uv1 = uvNodes.Value(n1); gp_Pnt2d uv2 = uvNodes.Value(n2); gp_Pnt2d uv3 = uvNodes.Value(n3); m_surfacePointIndecies.push_back( 3 * current_triangle + 0 ); m_surfaceUVRep[ 6 * current_triangle + 0 ] = uv1.X(); m_surfaceUVRep[ 6 * current_triangle + 1 ] = uv1.Y(); m_surfacePointIndecies.push_back( 3 * current_triangle + 1 ); m_surfaceUVRep[ 6 * current_triangle + 2 ] = uv2.X(); m_surfaceUVRep[ 6 * current_triangle + 3 ] = uv2.Y(); m_surfacePointIndecies.push_back( 3 * current_triangle + 2 ); m_surfaceUVRep[ 6 * current_triangle + 4 ] = uv3.X(); m_surfaceUVRep[ 6 * current_triangle + 5 ] = uv3.Y(); current_triangle++; } else { num_invalid_triangles++; } } if (num_invalid_triangles > 0) { m_surfaceUVRep.resize(2 * 3 * (num_triangles - num_invalid_triangles)); } }
/** * Writes out a vtk 2.0 file, currently hardcoded to c:\\outputcascade.vtk */ void OCGeometryRenderer::WriteVTK(TopoDS_Shape* out) { FILE *fp=fopen("C:\\outputcascade.vtk","w+"); fprintf(fp,"# vtk DataFile Version 2.0 \nOpenCascade data\nASCII\n"); fprintf(fp,"DATASET POLYDATA\n"); // BRepMesh::Mesh(out,0.1); TopExp_Explorer Ex; int countVert=0; int countFace=0; for(Ex.Init(*out,TopAbs_FACE);Ex.More();Ex.Next()) { TopoDS_Face F=TopoDS::Face(Ex.Current()); TopLoc_Location L; Handle (Poly_Triangulation) facing=BRep_Tool::Triangulation(F,L); countVert+=facing->NbNodes(); countFace+=facing->NbTriangles(); } fprintf(fp,"POINTS %d float\n",countVert); for(Ex.Init(*out,TopAbs_FACE);Ex.More();Ex.Next()) { TopoDS_Face F=TopoDS::Face(Ex.Current()); TopLoc_Location L; Handle (Poly_Triangulation) facing=BRep_Tool::Triangulation(F,L); TColgp_Array1OfPnt tab(1,(facing->NbNodes())); tab = facing->Nodes(); for (Standard_Integer i=1;i<=(facing->NbNodes());i++) { gp_Pnt pnt=tab.Value(i); fprintf(fp,"%f %f %f\n",pnt.X(),pnt.Y(),pnt.Z()); } } fprintf(fp,"POLYGONS %d %d\n",countFace,countFace*4); int maxindex=0; for(Ex.Init(*out,TopAbs_FACE);Ex.More();Ex.Next()) { TopoDS_Face F=TopoDS::Face(Ex.Current()); TopLoc_Location L; Handle (Poly_Triangulation) facing=BRep_Tool::Triangulation(F,L); TColgp_Array1OfPnt tab(1,(facing->NbNodes())); tab = facing->Nodes(); Poly_Array1OfTriangle tri(1,facing->NbTriangles()); tri = facing->Triangles(); for (Standard_Integer i=1;i<=(facing->NbTriangles());i++) { Poly_Triangle trian = tri.Value(i); Standard_Integer index1,index2,index3; trian.Get(index1,index2,index3); fprintf(fp,"3 %d %d %d\n",maxindex+index1-1,maxindex+index2-1,maxindex+index3-1); } maxindex+=facing->NbNodes(); } fclose(fp); }
/** * Renders TopoDS Shape by traversing through the TopoDS_Shape */ void OCGeometryRenderer::RenderTopoDS(TopoDS_Shape* ObjSurf) { if((ObjSurf!=NULL) && !ObjSurf->IsNull()) { TopExp_Explorer Ex; for(Ex.Init(*ObjSurf,TopAbs_FACE);Ex.More();Ex.Next()) { TopoDS_Face F=TopoDS::Face(Ex.Current()); TopLoc_Location L; Handle (Poly_Triangulation) facing=BRep_Tool::Triangulation(F,L); TColgp_Array1OfPnt tab(1,(facing->NbNodes())); tab = facing->Nodes(); Poly_Array1OfTriangle tri(1,facing->NbTriangles()); tri = facing->Triangles(); for (Standard_Integer i=1;i<=(facing->NbTriangles());i++) { Poly_Triangle trian = tri.Value(i); Standard_Integer index1,index2,index3; trian.Get(index1,index2,index3); gp_Pnt point1=tab.Value(index1); gp_Pnt point2=tab.Value(index2); gp_Pnt point3=tab.Value(index3); gp_XYZ pt1 = tab.Value(index1).XYZ(); gp_XYZ pt2 = tab.Value(index2).XYZ(); gp_XYZ pt3 = tab.Value(index3).XYZ(); gp_XYZ v1 = pt2-pt1; gp_XYZ v2 = pt3-pt2; gp_XYZ normal = v1^v2; normal.Normalize(); glNormal3d(normal.X(),normal.Y(),normal.Z()); glVertex3d(point1.X(),point1.Y(),point1.Z()); glVertex3d(point2.X(),point2.Y(),point2.Z()); glVertex3d(point3.X(),point3.Y(),point3.Z()); } } } }
void loadIGES(char* filename) { if(!filename) return; std::cout << "test" << std::endl; boost::interprocess::managed_shared_memory segment(boost::interprocess::open_only, "OCCSharedMem"); TestFaces *m_trisp = segment.find<TestFaces>("m_tris").first; //TestFaces *m_facesp = segment.find<TestFaces>("m_faces").first; Vector3DfAllocator vector3df_alloc_inst(segment.get_segment_manager()); TestFace *m_facep = segment.construct<TestFace>("m_facep")(vector3df_alloc_inst); std::cout << "connected to shared mem" << std::endl; std::cout << filename << std::endl; //STEPControl_Reader *readerp = new STEPControl_Reader; IGESControl_Controller::Init(); Message_MsgFile::LoadFromEnv("CSF_XSMessage","IGES"); Message_MsgFile::LoadFromEnv("CSF_SHMessageStd","SHAPEStd"); IGESControl_Reader reader; std::cout << filename << std::endl; reader.ReadFile(filename); reader.PrintCheckLoad(Standard_True,IFSelect_GeneralInfo); Standard_Integer NbRoots = reader.NbRootsForTransfer(); std::cout << "Number of Roots in the IGES File: " << NbRoots << std::endl; Standard_Integer NbTrans = reader.TransferRoots(); std::cout << "IGES roots transferred: " << NbTrans << std::endl; std::cout << "Number of resulting shapes is: " << reader.NbShapes() << std::endl; TopoDS_Shape resulting_shape = reader.OneShape(); // gp_Trsf theTrans; // gp_Axl Axis = gp_Axl(gp_Pnt(200,60,60),gp_Dir(0.,1.,0.)); // theTrans.SetRotation(Axis,30*PI/180); // Rotation of 30 degrees // BRepBuilderAPI_Transform myBRepTransformation(resulting_shape,theTrans,true); // TopoDS_Shape TransformedShape = myBRepTransformation.Shape(); TopoDS_Iterator topo_iter; //m_topodsshapes.push_back(resulting_shape); //BRepMesh::Mesh(resulting_shape, 1.0); TopExp_Explorer faceExp(resulting_shape, TopAbs_FACE); for(; faceExp.More(); faceExp.Next()) { // TopExp_Explorer vertexExp(faceExp.Current(), TopAbs_VERTEX); //int f_n = 0; TopLoc_Location L = faceExp.Current().Location(); BRepMesh::Mesh(faceExp.Current(), .1); Handle (Poly_Triangulation) facing = BRep_Tool::Triangulation(TopoDS::Face(faceExp.Current()),L); // const Poly_Array1OfTriangle & triangles = facing->Triangles(); // const TColgp_Array1OfPnt & nodes = facing->Nodes(); // std::cout << "opencascaded: facing->NbTriangles() = " << facing->NbTriangles() << std::endl; if (!facing.IsNull()) { TopExp_Explorer vertexExp(faceExp.Current(), TopAbs_VERTEX); //int f_n = 0; //TopLoc_Location L = faceExp.Current().Location(); // BRepMesh::Mesh(faceExp.Current(), .1); // Handle (Poly_Triangulation) facing = BRep_Tool::Triangulation(TopoDS::Face(faceExp.Current()),L); const Poly_Array1OfTriangle & triangles = facing->Triangles(); const TColgp_Array1OfPnt & nodes = facing->Nodes(); std::cout << "opencascaded: facing->NbTriangles() = " << facing->NbTriangles() << std::endl; for ( int i=facing->NbTriangles(); i >= 1; --i ) { m_facep->clear(); Poly_Triangle triangle = triangles(i); Standard_Integer node1,node2,node3; triangle.Get(node1, node2, node3); gp_Pnt v1 = nodes(node1).Transformed(L); gp_Pnt v2 = nodes(node2).Transformed(L); gp_Pnt v3 = nodes(node3).Transformed(L); m_facep->push_back(Vector3Df(v1.X(), v1.Y(), v1.Z())); m_facep->push_back(Vector3Df(v2.X(), v2.Y(), v2.Z())); m_facep->push_back(Vector3Df(v3.X(), v3.Y(), v3.Z())); m_trisp->push_back(*m_facep); } } } }
void loadSTEP(char* filename) { if(!filename) return; std::cout << "test" << std::endl; boost::interprocess::managed_shared_memory segment(boost::interprocess::open_only, "OCCSharedMem"); TestFaces *m_trisp = segment.find<TestFaces>("m_tris").first; //TestFaces *m_facesp = segment.find<TestFaces>("m_faces").first; Vector3DfAllocator vector3df_alloc_inst(segment.get_segment_manager()); TestFace *m_facep = segment.construct<TestFace>("m_facep")(vector3df_alloc_inst); std::cout << "connected to shared mem" << std::endl; std::cout << filename << std::endl; //STEPControl_Reader *readerp = new STEPControl_Reader; STEPControl_Reader reader; std::cout << filename << std::endl; reader.ReadFile(filename); Standard_Integer NbRoots = reader.NbRootsForTransfer(); std::cout << "Number of Roots in the STEP File: " << NbRoots << std::endl; Standard_Integer NbTrans = reader.TransferRoots(); std::cout << "STEP roots transferred: " << NbTrans << std::endl; std::cout << "Number of resulting shapes is: " << reader.NbShapes() << std::endl; TopoDS_Shape resulting_shape = reader.OneShape(); // gp_Trsf theTrans; // gp_Axl Axis = gp_Axl(gp_Pnt(200,60,60),gp_Dir(0.,1.,0.)); // theTrans.SetRotation(Axis,30*PI/180); // Rotation of 30 degrees // BRepBuilderAPI_Transform myBRepTransformation(resulting_shape,theTrans,true); // TopoDS_Shape TransformedShape = myBRepTransformation.Shape(); TopoDS_Iterator topo_iter; //m_topodsshapes.push_back(resulting_shape); // BRepMesh::Mesh(resulting_shape, 0.05); TopExp_Explorer faceExp(resulting_shape, TopAbs_FACE); for(; faceExp.More(); faceExp.Next()) { // TopExp_Explorer vertexExp(faceExp.Current(), TopAbs_VERTEX); //int f_n = 0; TopLoc_Location L = faceExp.Current().Location(); BRepMesh::Mesh(faceExp.Current(), .1); Handle (Poly_Triangulation) facing = BRep_Tool::Triangulation(TopoDS::Face(faceExp.Current()),L); // const Poly_Array1OfTriangle & triangles = facing->Triangles(); // const TColgp_Array1OfPnt & nodes = facing->Nodes(); // std::cout << "opencascaded: facing->NbTriangles() = " << facing->NbTriangles() << std::endl; if (!facing.IsNull()) { TopExp_Explorer vertexExp(faceExp.Current(), TopAbs_VERTEX); //int f_n = 0; //TopLoc_Location L = faceExp.Current().Location(); // BRepMesh::Mesh(faceExp.Current(), .1); // Handle (Poly_Triangulation) facing = BRep_Tool::Triangulation(TopoDS::Face(faceExp.Current()),L); const Poly_Array1OfTriangle & triangles = facing->Triangles(); const TColgp_Array1OfPnt & nodes = facing->Nodes(); std::cout << "opencascaded: facing->NbTriangles() = " << facing->NbTriangles() << std::endl; for ( int i=facing->NbTriangles(); i >= 1; --i ) { m_facep->clear(); Poly_Triangle triangle = triangles(i); Standard_Integer node1,node2,node3; triangle.Get(node1, node2, node3); gp_Pnt v1 = nodes(node1).Transformed(L); gp_Pnt v2 = nodes(node2).Transformed(L); gp_Pnt v3 = nodes(node3).Transformed(L); m_facep->push_back(Vector3Df(v1.X(), v1.Y(), v1.Z())); m_facep->push_back(Vector3Df(v2.X(), v2.Y(), v2.Z())); m_facep->push_back(Vector3Df(v3.X(), v3.Y(), v3.Z())); m_trisp->push_back(*m_facep); } } /* for(; vertexExp.More(); vertexExp.Next()) { m_facep->clear(); const TopoDS_Vertex& aVertex = TopoDS::Vertex(vertexExp.Current()); //TopoDS_Edge edge = TopoDS::Edge(shape); TopLoc_Location location; Standard_Real pFirst, pLast; //Handle(Geom_Curve) curve = BRep_Tool::Curve(anEdge, location, pFirst, pLast); //std::cout << "pFirst = " << pFirst << std::endl; gp_Pnt p = BRep_Tool::Pnt(aVertex); std::cout << "Vector3Df(" << p.X() << ", " << p.Y() << ", " << p.Z() << std::endl; //points.push_back(Vector3Df(p.X()/1000.0, p.Y()/1000.0, p.Z()/1000.0)); m_facep->push_back(Vector3Df(p.X()/1000.0, p.Y()/1000.0, p.Z()/1000.0)); // TopLoc_Location L; // Handle (Poly_Triangulation) facing = BRep_Tool::Triangulation(aFace,L); // if(!(facing.IsNull()))std::cout << "Number of Triangles in Face #" << f_n << ": " << facing->NbTriangles() << std::endl; // f_n++; } m_facesp->push_back(*m_facep); */ } //std::cout << " opencascaded: m_trisp->size()" << m_trisp->size() << std::endl; // segment.destroy<TestFaces>("m_tris"); }