12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #include "is_stl.h"
- #include <string>
- IGL_INLINE bool igl::is_stl(FILE * stl_file, bool & is_ascii)
- {
- // solid?
- // YES NO
- // / if .stl, definitely binary
- // /
- // perfect size?
- // YES NO
- //
- const auto perfect_size = [](FILE * stl_file)->bool
- {
- //stl_file = freopen(NULL,"rb",stl_file);
- // Read 80 header
- char header[80];
- if(fread(header,sizeof(char),80,stl_file)!=80)
- {
- return false;
- }
- // Read number of triangles
- unsigned int num_tri;
- if(fread(&num_tri,sizeof(unsigned int),1,stl_file)!=1)
- {
- return false;
- }
- fseek(stl_file,0,SEEK_END);
- int file_size = ftell(stl_file);
- fseek(stl_file,0,SEEK_SET);
- //stl_file = freopen(NULL,"r",stl_file);
- return (file_size == 80 + 4 + (4*12 + 2) * num_tri);
- };
- // Specifically 80 character header
- char header[80];
- char solid[80];
- is_ascii = true;
- bool f = true;
- if(fread(header,1,80,stl_file) != 80)
- {
- f = false;
- goto finish;
- }
- sscanf(header,"%s",solid);
- if(std::string("solid") == solid)
- {
- f = true;
- is_ascii = !perfect_size(stl_file);
- }else
- {
- is_ascii = false;
- f = perfect_size(stl_file);
- }
- finish:
- rewind(stl_file);
- return f;
- }
- IGL_INLINE bool igl::is_stl(FILE * stl_file)
- {
- bool is_ascii;
- return is_stl(stl_file,is_ascii);
- }
|