diff --git a/Doc/changelog.docu b/Doc/changelog.docu
index 39bead27..d940fae4 100644
--- a/Doc/changelog.docu
+++ b/Doc/changelog.docu
@@ -13,13 +13,18 @@
- Fixed type pun warning with gcc-6
- Fixed incorrect type of hash function for boost causing a warning with clang
-
+
+
+IO
+
+- STL Reader: Identify stl files containing solid keyword as ASCII type
+
General
- Fixed undefined MSVC macro warning (Thanks to Xan for the patch)
-
+
Build System
diff --git a/src/OpenMesh/Core/IO/reader/STLReader.cc b/src/OpenMesh/Core/IO/reader/STLReader.cc
index 8e4b9b63..6dd8569b 100644
--- a/src/OpenMesh/Core/IO/reader/STLReader.cc
+++ b/src/OpenMesh/Core/IO/reader/STLReader.cc
@@ -55,12 +55,20 @@
#include
#include
+#include
// OpenMesh
#include
#include
#include
+//comppare strings crossplatform ignorign case
+#ifdef _WIN32
+ #define strnicmp _strnicmp
+#else
+ #define strnicmp strncasecmp
+#endif
+
//=== NAMESPACES ==============================================================
@@ -447,41 +455,62 @@ _STLReader_::STL_Type
_STLReader_::
check_stl_type(const std::string& _filename) const
{
- // assume it's binary stl, then file size is known from #triangles
- // if size matches, it's really binary
+
+ // open file
+ std::ifstream ifs (_filename.c_str(), std::ifstream::binary);
+ if(!ifs.good())
+ {
+ omerr() << "could not open file" << _filename << std::endl;
+ return NONE;
+ }
+
+ //find first non whitespace character
+ std::string line = "";
+ std::size_t firstChar;
+ while(line.empty() && ifs.good())
+ {
+ std::getline(ifs,line);
+ firstChar = line.find_first_not_of("\t ");
+ }
+
+ //check for ascii keyword solid
+ if(strnicmp("solid",&line[firstChar],5) == 0)
+ {
+ return STLA;
+ }
+ ifs.close();
+
+ //if the file does not start with solid it is probably STLB
+ //check the file size to verify it.
+
+ //open the file
+ FILE* in = fopen(_filename.c_str(), "rb");
+ if (!in) return NONE;
+
+ // determine endian mode
+ union { unsigned int i; unsigned char c[4]; } endian_test;
+ endian_test.i = 1;
+ bool swapFlag = (endian_test.c[3] == 1);
- // open file
- FILE* in = fopen(_filename.c_str(), "rb");
- if (!in) return NONE;
+ // read number of triangles
+ char dummy[100];
+ fread(dummy, 1, 80, in);
+ size_t nT = read_int(in, swapFlag);
- // determine endian mode
- union { unsigned int i; unsigned char c[4]; } endian_test;
- endian_test.i = 1;
- bool swapFlag = (endian_test.c[3] == 1);
+ // compute file size from nT
+ size_t binary_size = 84 + nT*50;
+ // get actual file size
+ size_t file_size(0);
+ rewind(in);
+ while (!feof(in))
+ file_size += fread(dummy, 1, 100, in);
+ fclose(in);
- // read number of triangles
- char dummy[100];
- fread(dummy, 1, 80, in);
- size_t nT = read_int(in, swapFlag);
-
-
- // compute file size from nT
- size_t binary_size = 84 + nT*50;
-
-
- // get actual file size
- size_t file_size(0);
- rewind(in);
- while (!feof(in))
- file_size += fread(dummy, 1, 100, in);
- fclose(in);
-
-
- // if sizes match -> it's STLB
- return (binary_size == file_size ? STLB : STLA);
+ // if sizes match -> it's STLB
+ return (binary_size == file_size ? STLB : NONE);
}