OSDN Git Service

STLファイル読み込み処理の改良
authorqw_fuku <fkhideaki@gmail.com>
Sun, 21 Feb 2016 15:20:35 +0000 (00:20 +0900)
committerqw_fuku <fkhideaki@gmail.com>
Sun, 21 Feb 2016 15:20:35 +0000 (00:20 +0900)
バイナリモードとテキストモードの自動認識精度を改善

Lib/LibGeo/Mesh/STL/STLMesh.cpp
Lib/LibGeo/Mesh/STL/STLMesh.h

index a55584f..97417ed 100644 (file)
@@ -3,6 +3,8 @@
 
 #include "../BaseMesh.h"
 
+#include <C2/util/stream_util.h>
+
 #include <set>
 #include <fstream>
 
@@ -37,20 +39,28 @@ bool StlMesh::LoadBinary(std::istream& in)
 {
        Clear();
 
-       in.read( m_Message , MSG_LENGTH );
+       size_t fileSize = util::GetStreamSize(in);
+
+       in.read(m_Message, MSG_LENGTH);
 
        unsigned int NumFaces;
-       in.read( (char*)&NumFaces , sizeof(unsigned int) );
+       in.read((char*)&NumFaces , sizeof(unsigned int));
+
+       const size_t expectedBinaryFileSize = NumFaces * 50 + 84;
+
+       if (expectedBinaryFileSize != fileSize)
+               return false;
 
        m_Faces.resize( NumFaces );
-       for( size_t i = 0 ; i < NumFaces ; ++i )
+       for (size_t i = 0; i < NumFaces; ++i)
        {
                char padding[2] = { 0 , 0 };
 
-               in.read( (char*)m_Faces[i].m_Normal.v()   , sizeof(float)*3 );
-               in.read( (char*)m_Faces[i].m_Verts[0].v() , sizeof(float)*3 );
-               in.read( (char*)m_Faces[i].m_Verts[1].v() , sizeof(float)*3 );
-               in.read( (char*)m_Faces[i].m_Verts[2].v() , sizeof(float)*3 );
+               StlFace& f = m_Faces[i];
+               in.read( (char*)f.m_Normal.v()   , sizeof(float)*3 );
+               in.read( (char*)f.m_Verts[0].v() , sizeof(float)*3 );
+               in.read( (char*)f.m_Verts[1].v() , sizeof(float)*3 );
+               in.read( (char*)f.m_Verts[2].v() , sizeof(float)*3 );
                in.read( padding , 2 );
        }
 
@@ -62,6 +72,8 @@ bool StlMesh::LoadText(std::istream& in)
        if (!IsExistValidAsciiHeader(in))
                return false;
 
+       Clear();
+
        in.seekg( 0 , std::ios::beg );
 
        StlFace f;
@@ -129,14 +141,14 @@ bool StlMesh::IsExistValidAsciiHeader(std::istream& in)
        return top == "solid";
 }
 
-bool StlMesh::Load( std::istream& ist )
+bool StlMesh::Load(std::istream& ist)
 {
-       if (LoadText(ist))
+       if (LoadBinary(ist))
                return true;
 
-       ist.seekg( 0 , std::ios::beg );
+       ist.seekg(0, std::ios::beg);
 
-       if (LoadBinary(ist))
+       if (LoadText(ist))
                return true;
 
        return false;
index 0b14a13..85fc672 100644 (file)
@@ -48,6 +48,8 @@ private:
 
        bool IsExistValidAsciiHeader(std::istream& in);
 
+       bool IsBinarySTL(size_t fileSize);
+
 public:
        char m_Message[MSG_LENGTH];
        std::vector<StlFace> m_Faces;