29 #include <boost/filesystem.hpp>
31 #include "../../common/WAssert.h"
32 #include "../../common/WIOTools.h"
33 #include "../WDataSetFiberVector.h"
34 #include "../exceptions/WDHIOFailure.h"
35 #include "WWriterFiberVTK.h"
38 :
WWriter( path.string(), overwrite )
49 fstream out(
m_fname.c_str(), fstream::out | fstream::in | fstream::trunc );
50 if( !out || out.bad() )
55 char lineDelimiter =
'\n';
57 out <<
"# vtk DataFile Version 3.0" << lineDelimiter;
58 out <<
"Fibers from OpenWalnut" << lineDelimiter;
59 out <<
"BINARY" << lineDelimiter;
60 out <<
"DATASET POLYDATA" << lineDelimiter;
61 unsigned int numPoints = 0;
62 unsigned int numLines = fiberDS->size();
63 for(
size_t i = 0; i < fiberDS->size(); ++i )
65 numPoints += (*fiberDS)[i].size();
67 out <<
"POINTS " << numPoints <<
" float" << lineDelimiter;
68 unsigned int *rawLineData =
new unsigned int[numPoints + numLines];
69 float *rawPointData =
new float[numPoints * 3];
71 unsigned int pntPosOffset = 0;
72 unsigned int lnsPosOffset = 0;
73 for(
size_t i = 0; i < fiberDS->size(); ++i )
75 const WFiber &fib = (*fiberDS)[i];
76 rawLineData[lnsPosOffset++] =
static_cast< unsigned int >( fib.
size() );
77 for(
size_t j = 0; j < fib.
size(); ++j )
80 WAssert( pntPosOffset % 3 == 0,
"(pOff % 3) was not equal to 0" );
81 WAssert( pntPosOffset / 3 < numPoints,
"pntPosOffset is to large." );
82 rawLineData[lnsPosOffset++] =
static_cast< unsigned int >( pntPosOffset / 3 );
83 rawPointData[pntPosOffset++] =
static_cast< float >( point[0] );
84 rawPointData[pntPosOffset++] =
static_cast< float >( point[1] );
85 rawPointData[pntPosOffset++] =
static_cast< float >( point[2] );
86 WAssert( pntPosOffset < ( ( numPoints * 3 ) + 1 ),
"pOff < #pts" );
89 switchByteOrderOfArray< float >( rawPointData, numPoints * 3 );
90 switchByteOrderOfArray< unsigned int >( rawLineData, numLines + numPoints );
91 out.write(
reinterpret_cast< char*
>( rawPointData ),
sizeof(
float ) * numPoints * 3 );
93 out <<
"LINES " << numLines <<
" " << numPoints + numLines << lineDelimiter;
94 out.write(
reinterpret_cast< char*
>( rawLineData ),
sizeof(
unsigned int ) * ( numPoints + numLines ) );
100 delete[] rawPointData;
Use this for IO error handling.
Represents a simple set of WFibers.
Represents a neural pathway.
size_type size() const
Wrapper around std::vector member function.
This only is a 3d double vector.
WWriterFiberVTK(const boost::filesystem::path &path, bool overwrite=false)
Creates a writer object for FiberVTK file writing.
void writeFibs(std::shared_ptr< const WDataSetFiberVector > fiberDS) const
Writes a WDataSetFiberVector down to the previousely given file.
Write some data to the given file.
std::string m_fname
Absolute path of the file to write to.