void Convert ( OffSurface_mesh& off, char const* gts_name ) { std::ofstream gts(gts_name); if ( gts ) { std::cout << "Writting " << gts_name << std::endl ; gts << off.size_of_vertices() << " " << (off.size_of_halfedges()/2) << " " << off.size_of_facets() << std::endl ; int vid = 1 ; for ( Vertex_iterator vit = off.vertices_begin() ; vit != off.vertices_end() ; ++ vit ) { Vertex_handle v = vit ; gts << v->point().x() << " " << v->point().y() << " " << v->point().z() << std::endl ; v->id() = vid ++ ; } int eid = 1 ; for ( Edge_iterator eit = off.edges_begin(); eit != off.edges_end() ; ++ eit ) { Halfedge_handle e = eit ; Vertex_handle s = e->opposite()->vertex(); Vertex_handle t = e->vertex(); gts << s->id() << " " << t->id() << std::endl ; e ->id() = eid ; e->opposite()->id() = eid ; ++ eid ; } for ( Facet_iterator fit = off.facets_begin(); fit != off.facets_end() ; ++ fit ) { Facet_handle f = fit ; Halfedge_handle e0 = f->halfedge(); Halfedge_handle e1 = e0->next(); Halfedge_handle e2 = e1->next(); gts << e0->id() << " " << e1->id() << " " << e2->id() << std::endl ; } } else std::cerr << "Unable to open output file: " << gts_name << std::endl ; }
bool Loader::loadGlyphset() { QString glyphsetname = m_fileName.path(); QFile glyphsetfile( glyphsetname ); if ( !glyphsetfile.open( QIODevice::ReadOnly ) ) { qCritical( "glyphset file unreadable" ); } QTextStream gts( &glyphsetfile ); //TODO: Will windows have a problem with this? QString trunk = QFileInfo( glyphsetname ).path(); //glyphsetfile has three lines: 1: nifti (skip), 2: surfaceset(s), 3: connectivity matrix //1: TODO: skip nifti for now QString gnl = gts.readLine(); qDebug() << "skipping: " << gnl; //2: load surfaceset gnl = gts.readLine(); QStringList datasetNames = gnl.split( " " ); bool two = ( datasetNames.length() > 1 ); QString datasetName = datasetNames.at( 0 ); gnl = gts.readLine(); QStringList sl2 = gnl.split( " " ); QString connectivityName; if ( sl2.at( 0 ).startsWith( "http" ) ) { connectivityName = sl2.at( 0 ); } else { connectivityName = trunk + QDir::separator() + sl2.at( 0 ); } float mt = 0.8; if ( sl2.length() > 1 ) { mt = sl2.at( 1 ).toFloat(); qDebug() << "minimum threshold: " << mt; } else { qDebug() << "no minimum threshold in glyphset file, default of " << mt << " used."; } float maxt = 1.0; if ( sl2.length() > 2 ) { maxt = sl2.at( 2 ).toFloat(); } DatasetGlyphset* dataset = new DatasetGlyphset( glyphsetname, mt, maxt ); qDebug() << "loading glyph set: " << datasetName; if ( two ) { qDebug() << "...and loading glyph set: " << datasetNames.at( 1 ); if ( datasetNames.length() > 2 ) { qCritical() << "only two hemispheres supported"; } } QFile setfile( trunk + QDir::separator() + datasetName ); if ( !setfile.open( QIODevice::ReadOnly ) ) { qCritical( "set file unreadable" ); } QTextStream ts( &setfile ); QString nl; QString onl; QTextStream* ots; std::vector<QString> others; if ( two ) { QFile othersetfile( trunk + QDir::separator() + datasetNames.at( 1 ) ); if ( !othersetfile.open( QIODevice::ReadOnly ) ) { qCritical( "second set file unreadable" ); } ots = new QTextStream( &othersetfile ); qDebug() << "ots initialized"; while ( !ots->atEnd() ) { onl = ots->readLine(); others.push_back( onl ); } } int k = 0; while ( !ts.atEnd() ) { nl = ts.readLine(); qDebug() << "!" << nl; if ( two ) { onl = others.at( k ); qDebug() << onl; k++; } //For commenting out stuff in the setfiles if ( !nl.startsWith( "#" ) ) { QStringList sl = nl.split( " " ); QString fullname = trunk + QDir::separator() + sl.at( 0 ); LoaderFreesurfer lf; if ( !lf.loadASC( fullname ) ) { qCritical() << "unable to load: " << fullname; return false; } float x = 0; float y = 0; float z = 0; if ( sl.length() > 1 ) x = sl.at( 1 ).toFloat(); if ( sl.length() > 2 ) y = sl.at( 2 ).toFloat(); if ( sl.length() > 3 ) z = sl.at( 3 ).toFloat(); QVector3D s( x, y, z ); std::vector<float>* points = lf.getPoints(); std::vector<int> triangles = lf.getTriangles(); int numPoints = points->size() / 3; int numTriangles = triangles.size() / 3; int onumPoints = 0; int onumTriangles = 0; std::vector<float>* opoints = new std::vector<float>(); std::vector<int> otriangles; QVector3D* os = new QVector3D( 0, 0, 0 ); LoaderFreesurfer olf; if ( two ) { QStringList osl; osl = onl.split( " " ); QString ofullname = trunk + QDir::separator() + osl.at( 0 ); if ( !olf.loadASC( ofullname ) ) { qCritical() << "unable to load: " << ofullname; return false; } float ox = 0; float oy = 0; float oz = 0; if ( osl.length() > 1 ) ox = osl.at( 1 ).toFloat(); if ( osl.length() > 2 ) oy = osl.at( 2 ).toFloat(); if ( osl.length() > 3 ) oz = osl.at( 3 ).toFloat(); os = new QVector3D( ox, oy, oz ); opoints = olf.getPoints(); otriangles = olf.getTriangles(); onumPoints = opoints->size() / 3; onumTriangles = otriangles.size() / 3; } TriangleMesh2* mesh = new TriangleMesh2( numPoints + onumPoints, numTriangles + onumTriangles ); for ( int i = 0; i < numPoints; ++i ) { mesh->addVertex( points->at( i * 3 ) + s.x(), points->at( i * 3 + 1 ) + s.y(), points->at( i * 3 + 2 ) + s.z() ); } for ( int i = 0; i < numTriangles; ++i ) { //TODO: Check orientation change (0,2,1)... mesh->addTriangle( triangles[i * 3], triangles[i * 3 + 2], triangles[i * 3 + 1] ); } if ( two ) { dataset->m_tris_middle = numTriangles; dataset->m_points_middle = numPoints; dataset->m_is_split = true; for ( int i = 0; i < onumPoints; ++i ) { mesh->addVertex( opoints->at( i * 3 ) + os->x(), opoints->at( i * 3 + 1 ) + os->y(), opoints->at( i * 3 + 2 ) + os->z() ); } for ( int i = 0; i < onumTriangles; ++i ) { //TODO: Check orientation change (0,2,1)... mesh->addTriangle( otriangles[i * 3] + onumPoints, otriangles[i * 3 + 2] + onumPoints, otriangles[i * 3 + 1] + onumPoints ); } } mesh->finalize(); dataset->addMesh( mesh, sl.at( 0 ) ); } } //fourth thing on the line: name of roi... //no roi: initialize all nodes true dataset->initROI(); if ( sl2.length() > 3 ) { QString roiname = trunk + QDir::separator() + sl2.at( 3 ); qDebug() << "loading ROI: " << roiname; dataset->loadROI( roiname, dataset->roi ); if ( sl2.length() > 4 ) { QString roiname2 = trunk + QDir::separator() + sl2.at( 4 ); qDebug() << "loading ROI2: " << roiname2; dataset->loadROI( roiname2, dataset->roi2 ); } } //3: load connectivity qDebug() << "loading connectivity"; dataset->readConnectivity( connectivityName ); //TODO: init conn.-crap... //dataset->setMinthresh( mt ); dataset->setProperties(); dataset->addSecondSurfaceSelector(); m_dataset.push_back( dataset ); return true; }