Example #1
0
/*! \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;
}
Example #2
0
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());
          }
        }
      }
    }
Example #5
0
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);

            }
        }

    }

}
Example #6
0
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");

}