Open CASCADE, the 3D modelling kernel
3D modeling & numerical simulation

Search the Forums
See All Topics
Open CASCADEShowroomGet it!Developer CornerSupport and ProductsAbout us
Technical overview
Areas of use
Advantages
FAQ
Screenshots
Shape factory
Shape gallery
Demonstrations
What's new
System requirements
Download Center
Public license
Documentation
Getting started
Forums
Open Source community
Training and e-learning
A-la Carte Support
Value-added software
Complementary Components
Customer Corner
Company Profile
Marketing Materials
Contact Us
News
Home / Developer Corner / Forums / Usage issues / Triangulation of objects from STEP files

Triangulation of objects from STEP files

Triangulation of objects from STEP files
Mr. Sal 2013/03/27 18:46
Hi!

I like to display STEP models with OGRE3d instead of OpenGL. I have a working function for reading STEP files and putting the shapes in a list (TopTools_SequenceOfShape m_lShapes). To create an ogre mesh I have to copy all tries from OCC to OGRE. Btw, I'm using OCC 6.5.4. I try to get access to the tris but it's not working:

TopoDS_Shape tShape = m_lShapes.Value(i);

// Iterate over all faces
for(TopExp_Explorer exp(tShape, TopAbs_FACE); exp.More(); exp.Next())
{
     TopoDS_Face face = TopoDS::Face(exp.Current());

     // get the triangulation
     TopLoc_Location loc;
     Handle(Poly_Triangulation) tri = BRep_Tool::Triangulation(face, loc);
     if (tri.IsNull()) continue;

     // create a transformation from the location
     gp_Trsf xloc = loc;

     // get the nodes
     const TColgp_Array1OfPnt &nodes = tri->Nodes();
     for (Standard_Integer iCount = nodes.Lower(); iCount <= nodes.Upper(); iCount++)
     {
          Standard_Real x,y,z;
          nodes(iCount).Coord(x,y,z);
          xloc.Transforms(x,y,z);
          // do something with the point
     }

     // copy the polygons
     Standard_Integer i1, i2, i3;
     const Poly_Array1OfTriangle &tris = tri->Triangles();
     for (Standard_Integer iCount = tris.Lower(); iCount <= tris.Upper(); iCount++)
     {
          // get the node indexes for this triangle
          Poly_Triangle tri = tris(iCount);

          // reverse the triangle orientation if the face is reversed
          if (face.Orientation() != TopAbs_FORWARD)
               tri.Get(i3, i2, i1);
          else
               tri.Get(i1, i2, i3);
     }
}

What's wrong with that code? tri is always NULL! There are a few threads with additional code like

BRepMesh::Mesh(tShape, 0.001f);

or

BRepMesh_FastDiscret* myMesh = new BRepMesh_FastDiscret(deflection, tShape, bb, angulardeflection, Standard_True, Standard_True, Standard_False, Standard_False);

But this codes are not working:

First-chance exception at 0x003af0d7 (TKMesh.dll) in test.exe: 0xC0000005: Access violation reading location 0xfefd0000.

I hope you can help me.

Regards,
S.
Göran Barz 2013/03/28 14:09
Hi,

the step import usually doesn't create a triangulation, so you have to create it yourself with BRepMesh. I don't know why the meshing failed for your faces, maybe you could try to lower the resolution:

Handle(Poly_Triangulation) tri = BRep_Tool::Triangulation(face, loc);
if (tri.IsNull())
{
BRepMesh::Mesh(face, 0.7f);
tri = BRep_Tool::Triangulation(face, loc);
}
Mr. Sal 2013/03/28 17:06
Hi,

thanks a lot! It's working at the moment.

Regards,
S.
Mr. Sal 2013/04/05 10:39
Hi,

I still have a triangulation problem. Now, most of the faces are working but a lot of faces are still not working. The model is correct because it's working in the MFC example. What's wrong now? I can see I've attached screenshots of the MFC example and the output of the following code.

I still receive

First-chance exception at 0x767bc41f in test.exe: Microsoft C++ exception: Standard_NullObject at memory location 0x003dccc0..

in VS debug output on non working faces, if I try to mesh the face with BRepMesh::Mesh.

Thank you for your help,
S.

     TopoDS_Shape tShape = m_lShapes.Value(i);
     Standard_Real aDeflection = 0.5;
     Bnd_Box bb;
     BRepBndLib::Add(tShape, bb, Standard_False);
     Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
     bb.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
     aDeflection = std::max(aXmax-aXmin, std::max(aYmax-aYmin, aZmax-aZmin)) * 0.0004;

     SharedVertextBuffer polyList;

     // Iterate over all faces
     for(TopExp_Explorer exp(tShape, TopAbs_FACE); exp.More(); exp.Next())
     {
          TopoDS_Face face = TopoDS::Face(exp.Current());

          // get the triangulation
          TopLoc_Location loc;
          BRepMesh::Mesh(face, aDeflection);
          Handle(Poly_Triangulation) tri = BRep_Tool::Triangulation(face, loc);
          if(tri.IsNull())
          {
               BRepMesh::Mesh(face, 0.7f);
               tri = BRep_Tool::Triangulation(face, loc);
          }
          if (tri.IsNull())
               continue; // This means: First-chance exception at 0x767bc41f in test.exe: Microsoft C++ exception: Standard_NullObject at memory location 0x003dccc0..


          // create a transformation from the location
          gp_Trsf xloc = loc;

          // get the nodes
          std::vector<SharedVertextBuffer::DT_USHORT> vPoints;
          const TColgp_Array1OfPnt &nodes = tri->Nodes();
          for (Standard_Integer iCount = nodes.Lower(); iCount <= nodes.Upper(); iCount++)
          {
               Standard_Real x,y,z;
               nodes(iCount).Coord(x,y,z);
               xloc.Transforms(x,y,z);
               vPoints.push_back(polyList.addVertex(x, y, z));
          }

          // copy the polygons
          Standard_Integer i1, i2, i3;
          const Poly_Array1OfTriangle &tris = tri->Triangles();
          for(Standard_Integer iCount = tris.Lower(); iCount <= tris.Upper(); iCount++)
          {
               // get the node indexes for this triangle
               Poly_Triangle tri = tris(iCount);

               // reverse the triangle orientation if the face is reversed
               if (face.Orientation() != TopAbs_FORWARD)
                    tri.Get(i3, i2, i1);
               else
                    tri.Get(i1, i2, i3);

               polyList.addPolygon(vPoints[i1 - 1], vPoints[i2 - 1], vPoints[i3 - 1]);
          }
     }
You have to be logged in to download the attached file
JinXu 2013/04/05 10:55
Hello,

This is normal with OCC. It can be problem of import of STEP files. OCC often cannot create correct faces or surfaces after import. if you get wrong face normals or surface properties, then you cannot get trianguation too.
Mr. Sal 2013/04/05 13:31
Hello,

no, it's not a problem of the model. Have a look at the attachment of my previous posting. The model is working well in MFC example.

Regards,
S.
Márton Kun 2013/11/04 15:54
Hello Mr. Sal,

I'm working on a similar problem than yours (loading STEP file to Ogre3D).
I've just found the OCC, I'm buliding it now. So I'm a newcomer here.

I'd like to ask you that have you got the solution now?
If so, what is that? And how does it work?

Thanks,
Márton
Mr. Sal 2013/11/04 23:11
Hello Márton,

Ogre3d and OCC doesn't like each other. My intension was loading the CAD models in a running Ogre scene. This is not working. Now, I have built a small converter programm which converts the CAD models to Ogre meshs and save them to a file. I could run this programm from my main programm and load the mesh in my running Ogre scene. You can use my code from 2013/04/05 10:39 to triangulate CAD models. But you have to work in a special order:
1. Init OCC
2. Load and triangulate your CAD file
3. Init Ogre
4. Create new mesh with the vertexes from the triangulated model (use vertexbuffer and indexbuffer)
5. Save mesh to file
6. Shutdown everything

If you init an Ogre render system before OCC the triangulation is not working! I'll have to check if this problem still exists with Ogre 2.0.0. You can look at the source code of ogrexmlconverter to create a converter.

Regards,
S.
 
 
Latest news
  • Open CASCADE Technology 6.7.0 is available for download!
  • Open CASCADE Technology 6.6.0 is available for download!
  • Open CASCADE Technology 6.5.5 is available for download!

  • © OPEN CASCADE 2000 - 2014  |  Search  |  Contacts   |  Site map