Corrected bug that prevented the loading of x y z raw ascii files (only x, y, z, files were supported)

This commit is contained in:
Paolo Cignoni 2009-06-25 14:06:50 +00:00
parent c7320a32a3
commit b9959ee7a6
1 changed files with 8 additions and 2 deletions

View File

@ -63,6 +63,7 @@ enum RAWError {
// Error open // Error open
E_CANTOPEN, // 1 E_CANTOPEN, // 1
E_UNESPECTEDEOF, // 2 E_UNESPECTEDEOF, // 2
E_NO_POINTS, //3
}; };
static const char *ErrorMsg(int error) static const char *ErrorMsg(int error)
@ -72,9 +73,10 @@ static const char *ErrorMsg(int error)
"No errors", "No errors",
"Can't open file", "Can't open file",
"Premature End of file", "Premature End of file",
"Failed to import any point. Use simple ascii files with just x y z coords."
}; };
if(error>2 || error<0) return "Unknown error"; if(error>3 || error<0) return "Unknown error";
else return raw_error_msg[error]; else return raw_error_msg[error];
}; };
@ -112,13 +114,16 @@ static int Open( MESH_TYPE &m, const char * filename, CallBackPos *cb=0, bool tr
for(int i=0;i<lineskip;++i) for(int i=0;i<lineskip;++i)
fgets(buf,1024,fp); fgets(buf,1024,fp);
/* Read a single facet from an ASCII .STL file */ /* Read a single triplet of coords from an ASCII file of coords*/
while(!feof(fp)) while(!feof(fp))
{ {
if(cb && (++cnt)%1000) cb( (ftell(fp)*100)/fileLen, "ASC Mesh Loading"); if(cb && (++cnt)%1000) cb( (ftell(fp)*100)/fileLen, "ASC Mesh Loading");
if(feof(fp)) break; if(feof(fp)) break;
fgets(buf,1024,fp); fgets(buf,1024,fp);
ret=sscanf(buf, "%f, %f, %f, %f\n", &pp.X(), &pp.Y(), &pp.Z(),&q); ret=sscanf(buf, "%f, %f, %f, %f\n", &pp.X(), &pp.Y(), &pp.Z(),&q);
if(ret==1) // lets try also non comma separated values
ret=sscanf(buf, "%f %f %f %f\n", &pp.X(), &pp.Y(), &pp.Z(),&q);
if(ret>=3) if(ret>=3)
{ {
VertexIterator vi=Allocator<MESH_TYPE>::AddVertices(m,1); VertexIterator vi=Allocator<MESH_TYPE>::AddVertices(m,1);
@ -128,6 +133,7 @@ static int Open( MESH_TYPE &m, const char * filename, CallBackPos *cb=0, bool tr
} }
fclose(fp); fclose(fp);
if(m.vn==0) return E_NO_POINTS;
if(!triangulate) return E_NOERROR; if(!triangulate) return E_NOERROR;
// now try to triangulate. // now try to triangulate.
// search for the first jump // search for the first jump