OpenWalnut  1.5.0dev
WMeshReaderFiberNavigator.cpp
1 //---------------------------------------------------------------------------
2 //
3 // Project: OpenWalnut ( http://www.openwalnut.org )
4 //
5 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
6 // For more information see http://www.openwalnut.org/copying
7 //
8 // This file is part of OpenWalnut.
9 //
10 // OpenWalnut is free software: you can redistribute it and/or modify
11 // it under the terms of the GNU Lesser General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // OpenWalnut is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU Lesser General Public License for more details.
19 //
20 // You should have received a copy of the GNU Lesser General Public License
21 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
22 //
23 //---------------------------------------------------------------------------
24 
25 #include <memory>
26 #include <string>
27 #include <vector>
28 
29 #include "WMeshReaderFiberNavigator.h"
30 
32  WObjectNDIP< WMeshReaderInterface >( "FiberNavigator", "Load FiberNavigator Meshes." )
33 {
34  // add properties
35 }
36 
38 {
39  // cleanup
40 }
41 
43  boost::filesystem::path file )
44 {
45  namespace su = string_utils;
46 
47  std::string fileName = file.string();
48  WAssert( !fileName.empty(), "No filename specified." );
49 
50  std::shared_ptr< WProgress > progress( new WProgress( "Read Mesh", 3 ) );
51  parentProgress->addSubProgress( progress );
52 
53  std::ifstream ifs;
54  ifs.open( fileName.c_str(), std::ifstream::in );
55  if( !ifs || ifs.bad() )
56  {
57  WLogger::getLogger()->addLogMessage( "Try load broken file '" + fileName + "'", "Read Mesh", LL_ERROR );
58  throw std::runtime_error( "Problem during reading file. Probably file not found." );
59  }
60  std::string line;
61 
62  std::vector< std::string > tokens;
63  size_t numPoints = 0;
64  while( !ifs.eof() )
65  {
66  std::getline( ifs, line );
67  tokens = su::tokenize( line );
68  if( tokens.size() > 1 && su::toLower( tokens.at( 0 ) ) == "point_data" )
69  {
70  try
71  {
72  numPoints = string_utils::fromString< size_t >( tokens.at( 1 ) );
73  break;
74  }
75  catch( const std::exception &e )
76  {
77  WLogger::getLogger()->addLogMessage( "Invalid number of points: " + tokens.at( 1 ), "Read Mesh", LL_ERROR );
78  progress->finish();
79  return std::shared_ptr< WTriangleMesh >();
80  }
81  }
82  }
83  // ------ POINTS -------
84  std::vector< osg::Vec3 > points;
85  points.reserve( numPoints );
86 
87  WLogger::getLogger()->addLogMessage( "Start reading vertex info", "Read Mesh", LL_DEBUG );
88  for( unsigned int i = 0; i < numPoints; ++i )
89  {
90  std::getline( ifs, line );
91  tokens = su::tokenize( line );
92 
93  try
94  {
95  points.push_back( osg::Vec3( string_utils::fromString< float >( tokens.at( 0 ) ),
96  string_utils::fromString< float >( tokens.at( 1 ) ),
97  string_utils::fromString< float >( tokens.at( 2 ) ) ) );
98  }
99  catch( const std::exception &e )
100  {
101  WLogger::getLogger()->addLogMessage( "Invalid vertex position", "Read Mesh", LL_ERROR );
102  progress->finish();
103  return std::shared_ptr< WTriangleMesh >();
104  }
105  }
106  WLogger::getLogger()->addLogMessage( "Finished reading vertex info", "Read Mesh", LL_DEBUG );
107  // ----- Vertex Ids For Cells---------
108 
109  size_t numCells = 0;
110 
111  std::getline( ifs, line );
112  tokens = su::tokenize( line );
113  if( tokens.size() > 1 && su::toLower( tokens.at( 0 ) ) == "cells" )
114  {
115  try
116  {
117  numCells = string_utils::fromString< size_t >( tokens.at( 1 ) );
118  }
119  catch( const std::exception &e )
120  {
121  WLogger::getLogger()->addLogMessage( "Invalid number of cells: " + tokens.at( 1 ), "Read Mesh", LL_ERROR );
122  progress->finish();
123  return std::shared_ptr< WTriangleMesh >();
124  }
125  }
126 
127 
128  std::shared_ptr< WTriangleMesh > triMesh( new WTriangleMesh( numPoints, numCells ) );
129  for( unsigned int i = 0; i < numPoints; ++i )
130  {
131  triMesh->addVertex( points[i] );
132  }
133 
134  ++*progress;
135  WLogger::getLogger()->addLogMessage( "Finished reading polygon info", "Read Mesh", LL_DEBUG );
136  for( unsigned int i = 0; i < numCells; ++i )
137  {
138  std::getline( ifs, line );
139  tokens = su::tokenize( line );
140 
141  try
142  {
143  triMesh->addTriangle( string_utils::fromString< size_t >( tokens.at( 1 ) ),
144  string_utils::fromString< size_t >( tokens.at( 2 ) ),
145  string_utils::fromString< size_t >( tokens.at( 3 ) ) );
146  }
147  catch( const std::exception &e )
148  {
149  WLogger::getLogger()->addLogMessage( "Invalid triangle ID", "Read Mesh", LL_ERROR );
150  progress->finish();
151  return std::shared_ptr< WTriangleMesh >();
152  }
153  }
154  WLogger::getLogger()->addLogMessage( "Finished reading polygon info", "Read Mesh", LL_DEBUG );
155  ++*progress;
156 
157  ifs.close();
158 
159  progress->finish();
160 
161  return triMesh;
162 }
void addLogMessage(std::string message, std::string source="", LogLevel level=LL_DEBUG)
Appends a log message to the logging queue.
Definition: WLogger.cpp:84
static WLogger * getLogger()
Returns pointer to the currently running logger instance.
Definition: WLogger.cpp:64
virtual ~WMeshReaderFiberNavigator()
Destructor.
virtual WTriangleMesh::SPtr operator()(WProgressCombiner::SPtr parentProgress, boost::filesystem::path file)
Load the dataset.
Define the interface which is injected into an WObjectNDIP.
This is a base class for everything which has a Name,Description,Icon and Properties (=NDIP).
Definition: WObjectNDIP.h:42
std::shared_ptr< WProgressCombiner > SPtr
Abbreviate shared_ptr for this class.
Class managing progress inside of modules.
Definition: WProgress.h:42
Triangle mesh data structure allowing for convenient access of the elements.
Definition: WTriangleMesh.h:46
std::shared_ptr< WTriangleMesh > SPtr
Shared pointer.
Definition: WTriangleMesh.h:55
Some utilities for string manipulation and output operations.
Definition: WStringUtils.h:59