Something went wrong on our end
surface_io_msms_handler.cc 3.92 KiB
//------------------------------------------------------------------------------
// This file is part of the OpenStructure project <www.openstructure.org>
//
// Copyright (C) 2008-2020 by the OpenStructure authors
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License as published by the Free
// Software Foundation; either version 3.0 of the License, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
// details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this library; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//------------------------------------------------------------------------------
#include <utility>
#include <map>
#include <fstream>
#include <sstream>
#include <ost/log.hh>
#include <boost/filesystem/convenience.hpp>
#include "surface_io_msms_handler.hh"
namespace bf = boost::filesystem;
namespace ost { namespace io {
namespace {
std::pair<bf::path,bf::path> detect_files(const bf::path& loc)
{
return std::make_pair(bf::change_extension(loc, ".vert"),
bf::change_extension(loc, ".face"));
}
}
void SurfaceIOMSMSHandler::Import(mol::SurfaceHandle& sh, const bf::path& loc)
{
std::pair<bf::path,bf::path> pp = detect_files(loc);
LOG_DEBUG("loading files " << pp.first.string() << " and " << pp.second.string());
std::ifstream fvert(pp.first.string().c_str());
if(!fvert) {
LOG_ERROR("could not open " << pp.first.string());
return;
}
std::ifstream fface(pp.second.string().c_str());
if(!fface) {
LOG_ERROR("could not open " << pp.second.string());
return;
}
String line;
unsigned int file_vertice_count=0;
while(std::getline(fvert,line)) {
if(line[0]!='#') {
std::istringstream linestream(line);
int dummy1;
float dummy2,dummy3;
linestream >> file_vertice_count >> dummy1 >> dummy2 >> dummy3;
break;
}
}
unsigned int file_face_count=0;
while(std::getline(fface,line)) {
if(line[0]!='#') {
std::istringstream linestream(line);
int dummy1;
float dummy2,dummy3;
linestream >> file_face_count >> dummy1 >> dummy2 >> dummy3;
break;
}
}
unsigned int vertice_count=0;
std::map<unsigned int,mol::SurfaceTriID> vertice_map;
while(std::getline(fvert,line)) {
std::istringstream linestream(line);
geom::Vec3 v,n;
int x[3];
linestream >> v[0] >> v[1] >> v[2] >> n[0] >> n[1] >> n[2] >> x[0] >> x[1] >> x[2];
mol::SurfaceTriID tid = sh.AddVertex(mol::SurfaceVertex(v,n,0));
++vertice_count; // msms counts vertices starting at 1
vertice_map[vertice_count]=tid;
}
unsigned int face_count=0;
while(std::getline(fface,line)) {
std::istringstream linestream(line);
int id1,id2,id3;
int t[2];
linestream >> id1 >> id2 >> id3 >> t[0] >> t[1];
++face_count;
sh.AddTri(vertice_map[id1],vertice_map[id2],vertice_map[id3]);
}
LOG_INFO("loaded " << vertice_count << " vertices and " << face_count << " faces");
}
void SurfaceIOMSMSHandler::Export(const mol::SurfaceHandle& sh,
const bf::path& loc) const
{
// empty
}
bool SurfaceIOMSMSHandler::ProvidesImport(const bf::path& loc,
const String& format)
{
if(format=="auto") {
std::pair<bf::path,bf::path> pp = detect_files(loc);
return bf::exists(pp.first) && bf::exists(pp.second);
} else if(format=="msms") {
return true;
}
return false;
}
bool SurfaceIOMSMSHandler::ProvidesExport(const bf::path& loc,
const String& format)
{
return false;
}
}} // ns