corrected bug in the management of of multiple solid ascii stl files

This commit is contained in:
Paolo Cignoni 2008-02-15 09:51:36 +00:00
parent 0fdd22023e
commit 843c6d172c
1 changed files with 27 additions and 8 deletions
wrap/io_trimesh

View File

@ -25,6 +25,9 @@
History History
$Log: not supported by cvs2svn $ $Log: not supported by cvs2svn $
Revision 1.15 2007/05/24 06:56:54 cignoni
Corrected gcc warning
Revision 1.14 2006/06/10 12:49:05 mariolatronico Revision 1.14 2006/06/10 12:49:05 mariolatronico
file length is now computed using fseek and ftell file length is now computed using fseek and ftell
@ -223,19 +226,35 @@ static int OpenBinary( OpenMeshType &m, const char * filename, CallBackPos *cb=0
STLFacet f; STLFacet f;
int cnt=0; int cnt=0;
int ret;
/* Read a single facet from an ASCII .STL file */ /* Read a single facet from an ASCII .STL file */
while(!feof(fp)) while(!feof(fp))
{ {
if((++cnt)%1000) cb( (ftell(fp)*100)/fileLen, "STL Mesh Loading"); if((++cnt)%1000) cb( (ftell(fp)*100)/fileLen, "STL Mesh Loading");
fscanf(fp, "%*s %*s %f %f %f\n", &f.n.X(), &f.n.Y(), &f.n.Z()); ret=fscanf(fp, "%*s %*s %f %f %f\n", &f.n.X(), &f.n.Y(), &f.n.Z());
fscanf(fp, "%*s %*s"); if(ret!=3)
fscanf(fp, "%*s %f %f %f\n", &f.v[0].X(), &f.v[0].Y(), &f.v[0].Z()); {
fscanf(fp, "%*s %f %f %f\n", &f.v[1].X(), &f.v[1].Y(), &f.v[1].Z()); // we could be in the case of a multiple solid object, where after a endfaced instead of another facet we have to skip two lines:
fscanf(fp, "%*s %f %f %f\n", &f.v[2].X(), &f.v[2].Y(), &f.v[2].Z()); // endloop
fscanf(fp, "%*s"); // end loop // endfacet
fscanf(fp, "%*s"); // end facet //endsolid <- continue on ret==0 will skip this line
//solid ascii <- and this one.
// facet normal 0.000000e+000 7.700727e-001 -6.379562e-001
continue;
}
ret=fscanf(fp, "%*s %*s");
ret=fscanf(fp, "%*s %f %f %f\n", &f.v[0].X(), &f.v[0].Y(), &f.v[0].Z());
if(ret!=3)
return E_UNESPECTEDEOF;
ret=fscanf(fp, "%*s %f %f %f\n", &f.v[1].X(), &f.v[1].Y(), &f.v[1].Z());
if(ret!=3)
return E_UNESPECTEDEOF;
ret=fscanf(fp, "%*s %f %f %f\n", &f.v[2].X(), &f.v[2].Y(), &f.v[2].Z());
if(ret!=3)
return E_UNESPECTEDEOF;
ret=fscanf(fp, "%*s"); // end loop
ret=fscanf(fp, "%*s"); // end facet
if(feof(fp)) break; if(feof(fp)) break;
FaceIterator fi=Allocator<OpenMeshType>::AddFaces(m,1); FaceIterator fi=Allocator<OpenMeshType>::AddFaces(m,1);
VertexIterator vi=Allocator<OpenMeshType>::AddVertices(m,3); VertexIterator vi=Allocator<OpenMeshType>::AddVertices(m,3);