moab
ReaderWriterSet.cpp
Go to the documentation of this file.
00001 
00016 #include "moab/Core.hpp"
00017 #include "moab/Error.hpp"
00018 
00019 #include "moab/ReaderWriterSet.hpp"
00020 #include "moab/ReaderIface.hpp"
00021 #include "moab/WriterIface.hpp"
00022 
00023 #include "ReadVtk.hpp"
00024 #include "ReadSTL.hpp"
00025 #include "ReadGmsh.hpp"
00026 #include "ReadIDEAS.hpp"
00027 #include "ReadMCNP5.hpp"
00028 #include "ReadNASTRAN.hpp"
00029 #include "ReadABAQUS.hpp"
00030 #include "ReadSms.hpp"
00031 #include "Tqdcfr.hpp"
00032 #include "ReadTetGen.hpp"
00033 #include "ReadSmf.hpp"
00034 #include "ReadTemplate.hpp"
00035 #include "ReadTxt.hpp"
00036 #ifdef CGM
00037 #  include "ReadCGM.hpp"
00038 #endif
00039 
00040 #include "WriteAns.hpp"
00041 #include "WriteVtk.hpp"
00042 #include "WriteGMV.hpp"
00043 #include "WriteSTL.hpp"
00044 #include "WriteGmsh.hpp"
00045 #include "WriteSmf.hpp"
00046 #include "WriteTemplate.hpp"
00047 
00048 #ifdef NETCDF_FILE
00049 #  include "ReadNCDF.hpp"
00050 #  include "WriteNCDF.hpp"
00051 #  include "WriteSLAC.hpp"
00052 #  include "ReadNC.hpp"
00053 #  include "ReadGCRM.hpp"
00054 #endif
00055 
00056 // 2nd include of ReadNC in case we have pnetcdf and not netcdf
00057 #ifdef PNETCDF_FILE
00058 #  include "ReadNC.hpp"
00059 #  include "ReadGCRM.hpp"
00060 #endif
00061 
00062 #ifdef CGNS_FILE
00063 #  include "ReadCGNS.hpp"
00064 #  include "WriteCGNS.hpp"
00065 #endif
00066 
00067 #ifdef CCMIO_FILE
00068 #  include "ReadCCMIO.hpp"
00069 #  include "WriteCCMIO.hpp"
00070 #endif
00071 
00072 #ifdef DAMSEL_FILE
00073 #  include "WriteDamsel.hpp"
00074 #  include "ReadDamsel.hpp"
00075 #endif
00076 
00077 #ifdef HDF5_FILE
00078 #  include "ReadHDF5.hpp"
00079 #  ifdef HDF5_PARALLEL
00080 #    include "WriteHDF5Parallel.hpp"
00081 #  else
00082 #    include "WriteHDF5.hpp"
00083 #  endif
00084 #endif
00085 
00086 #include <algorithm>
00087 
00088 namespace moab {
00089 
00090 ReaderWriterSet::ReaderWriterSet( Core* mdb, Error* handler )
00091   : mbCore( mdb ), mbError( handler )
00092 {
00093 #ifdef HDF5_FILE
00094   const char* hdf5_sufxs[] = { "h5m", "mhdf", NULL };
00095 #ifdef HDF5_PARALLEL
00096   register_factory(  ReadHDF5::factory, WriteHDF5Parallel::factory,
00097                      "MOAB native (HDF5)", hdf5_sufxs, "MOAB" );
00098 #else
00099   register_factory(  ReadHDF5::factory, WriteHDF5::factory,
00100                      "MOAB native (HDF5)", hdf5_sufxs, "MOAB" );
00101 #endif
00102 #endif
00103 
00104 #ifdef NETCDF_FILE
00105   const char* exo_sufxs[] = { "exo", "exoII", "exo2", "g", "gen", NULL };
00106   register_factory( ReadNCDF::factory, WriteNCDF::factory, "Exodus II", exo_sufxs, "EXODUS" );
00107   register_factory( ReadGCRM::factory, NULL, "GCRM NC", "nc", "GCRM" );
00108   register_factory( ReadNC::factory, NULL, "Climate NC", "nc", "NC" );
00109 #endif
00110 
00111 #ifdef CGNS_FILE
00112   const char* cgns_sufxs[] = { "cgns", NULL };
00113   register_factory( ReadCGNS::factory, WriteCGNS::factory, "CGNS", cgns_sufxs, "CGNS" );
00114 #endif
00115 
00116   register_factory( ReadIDEAS::factory, NULL, "IDEAS format", "unv", "UNV" );
00117 
00118   register_factory( ReadMCNP5::factory, NULL, "MCNP5 format", "meshtal", "MESHTAL" );
00119 
00120   const char* nastran_sufxs[] = { "nas", "bdf", NULL };
00121   register_factory( ReadNASTRAN::factory, NULL, "NASTRAN format", nastran_sufxs, "NAS" );
00122 
00123   register_factory( ReadABAQUS::factory, NULL, "ABAQUS INP mesh format", "abq", "Abaqus mesh" );
00124 
00125   register_factory( ReadVtk::factory, WriteVtk::factory, "Kitware VTK", "vtk", "VTK" );
00126 
00127   register_factory( ReadSms::factory, NULL, "RPI SMS", "sms", "SMS" );
00128 
00129   register_factory( Tqdcfr::factory, NULL, "Cubit", "cub", "CUBIT" );
00130 
00131   register_factory( ReadSmf::factory, WriteSmf::factory , "QSlim format", "smf", "SMF");
00132 
00133 #ifdef CGM
00134   const char* acis_sufxs[] = { "sat", "sab", NULL };
00135   const char* occ_sufxs[] = { "brep", "occ", NULL };
00136   const char* step_sufxs[] = { "step", "stp", NULL };
00137   const char* iges_sufxs[] = { "iges", "igs", NULL };
00138   register_factory( ReadCGM::factory, NULL, "ACIS solid model", acis_sufxs, "ACIS");
00139   register_factory( ReadCGM::factory, NULL, "OpenCascade solid model", occ_sufxs, "OCC");
00140   register_factory( ReadCGM::factory, NULL, "STEP B-Rep exchange", step_sufxs, "STEP");
00141   register_factory( ReadCGM::factory, NULL, "IGES B-Rep exchange", iges_sufxs, "IGES");
00142 #endif
00143 
00144 #ifdef NETCDF_FILE
00145   register_factory( NULL, WriteSLAC::factory, "SLAC", "slac", "SLAC" );
00146 #endif
00147 
00148 #ifdef CCMIO_FILE
00149   const char* ccmio_sufxs[] = { "ccm", "ccmg", NULL };
00150   register_factory( ReadCCMIO::factory, WriteCCMIO::factory, "CCMIO files", ccmio_sufxs, "CCMIO");
00151 #endif
00152 
00153 #ifdef DAMSEL_FILE
00154   const char* damsel_sufxs[] = { "h5", NULL };
00155   register_factory( ReadDamsel::factory, WriteDamsel::factory, "Damsel files", damsel_sufxs, "DAMSEL");
00156 #endif
00157 
00158   register_factory( NULL, WriteGMV::factory, "GMV", "gmv", "GMV" );
00159 
00160   register_factory( NULL, WriteAns::factory, "Ansys", "ans", "ANSYS" );
00161 
00162   const char* gmsh_sufxs[] = { "msh", "gmsh", NULL };
00163   register_factory( ReadGmsh::factory, WriteGmsh::factory, "Gmsh mesh file", gmsh_sufxs, "GMSH" );
00164 
00165   register_factory( ReadSTL::factory, WriteSTL::factory, "Stereo Lithography File (STL)", "stl", "STL" );
00166 
00167   const char* tetgen_sufxs[] = { "node", "ele", "face", "edge", NULL };
00168   register_factory( ReadTetGen::factory, 0, "TetGen output files", tetgen_sufxs, "TETGEN" );
00169 
00170   const char* txt_sufxs[] = { "txt", NULL };
00171   register_factory( ReadTxt::factory, 0, "Txt input files", txt_sufxs, "TXT" );
00172 
00173   const char* template_sufxs[] = { NULL };
00174   register_factory( ReadTemplate::factory, WriteTemplate::factory, "Template input files", template_sufxs, "TEMPLATE" );
00175 
00176 }
00177 
00178 
00179 ReaderWriterSet::~ReaderWriterSet()
00180 {
00181 }
00182 
00183 ErrorCode ReaderWriterSet::register_factory( reader_factory_t reader,
00184                                                  writer_factory_t writer,
00185                                                  const char* description,
00186                                                  const char* const* extensions,
00187                                                  const char* name )
00188 {
00189   if (!reader && !writer)
00190     return MB_FAILURE;
00191 
00192     // check for duplicate names
00193   iterator h = handler_by_name( name );
00194   if (h != end()) {
00195     mbError->set_last_error( "Conflicting string name for file formats: \"%s\"",
00196                              name );
00197     return MB_FAILURE;
00198   }
00199 
00200     // count extensions and check for duplicates
00201   const char* const* iter;
00202   for (iter = extensions; *iter; ++iter)
00203   {
00204     h = handler_from_extension( *iter );
00205     if (h != end())
00206     {
00207       if (NULL != reader && h->have_reader())
00208         mbError->set_last_error( "Conflicting readers for file extension \"%s\":"
00209                                  " \"%s\" and \"%s\".",
00210                                  *iter, h->description().c_str(), description );
00211       else if(NULL != writer && h->have_writer())
00212         mbError->set_last_error( "Conflicting writers for file extension \"%s\":"
00213                                  " \"%s\" and \"%s\".",
00214                                  *iter, h->description().c_str(), description );
00215     }
00216   }
00217   handlerList.push_back( Handler(reader, writer, name, description, extensions, iter - extensions) );
00218   return MB_SUCCESS;
00219 }
00220 
00221 ErrorCode ReaderWriterSet::register_factory( reader_factory_t reader,
00222                                                  writer_factory_t writer,
00223                                                  const char* description,
00224                                                  const char* extension,
00225                                                  const char* name )
00226 {
00227   const char* extensions[2] = {extension, NULL};
00228   return register_factory( reader, writer, description, extensions, name );
00229 }
00230 
00231 
00232 ReaderIface* ReaderWriterSet::get_file_extension_reader(
00233                                   const std::string& filename ) const
00234 {
00235   std::string ext = extension_from_filename( filename );
00236   iterator handler = handler_from_extension( ext, true, false );
00237   return handler == end() ? NULL : handler->make_reader(mbCore);
00238 }
00239 
00240 WriterIface* ReaderWriterSet::get_file_extension_writer(
00241                                   const std::string& filename ) const
00242 {
00243   std::string ext = extension_from_filename( filename );
00244   iterator handler = handler_from_extension( ext, false, true );
00245   return handler == end() ? NULL : handler->make_writer(mbCore);
00246 }
00247 
00248 std::string ReaderWriterSet::extension_from_filename(
00249                                  const std::string& filename )
00250 {
00251   std::string::size_type idx = filename.find_last_of( "." );
00252   if (idx == std::string::npos)
00253     return std::string("");
00254   else
00255     return filename.substr( idx + 1 );
00256 }
00257 
00258 ReaderWriterSet::Handler::Handler( reader_factory_t read_f,
00259                                      writer_factory_t write_f,
00260                                      const char* nm,
00261                                      const char* desc,
00262                                      const char* const* ext,
00263                                      int num_ext )
00264  : mReader(read_f), mWriter(write_f), mName(nm), mDescription(desc), mExtensions(num_ext)
00265 {
00266   for (int i = 0; i < num_ext; ++i)
00267     mExtensions[i] = ext[i];
00268 }
00269 
00270 #ifdef WIN32
00271 #define strcasecmp(A,B) _stricmp( A, B )
00272 #endif
00273 
00274 ReaderWriterSet::iterator
00275 ReaderWriterSet::handler_from_extension( const std::string& ext,
00276                                            bool with_reader,
00277                                            bool with_writer ) const
00278 {
00279   iterator iter;
00280   std::vector<std::string>::const_iterator siter;
00281 
00282     // try case-sensitive compare
00283   for (iter = begin(); iter != end(); ++iter)
00284   {
00285     if ((with_reader && !iter->have_reader()) ||
00286         (with_writer && !iter->have_writer()))
00287       continue;
00288 
00289     for (siter = iter->mExtensions.begin(); siter != iter->mExtensions.end(); ++siter)
00290       if (*siter == ext)
00291         return iter;
00292   }
00293 
00294     // try case-insensitive compare
00295   for (iter = begin(); iter != end(); ++iter)
00296   {
00297     if ((with_reader && !iter->have_reader()) ||
00298         (with_writer && !iter->have_writer()))
00299       continue;
00300 
00301     for (siter = iter->mExtensions.begin(); siter != iter->mExtensions.end(); ++siter)
00302       if (0 == strcasecmp( siter->c_str(), ext.c_str() ))
00303         return iter;
00304   }
00305 
00306   return end();
00307 }
00308 
00309 bool ReaderWriterSet::Handler::reads_extension(const char *ext) const
00310 {
00311   if (!have_reader()) return false;
00312 
00313   std::vector<std::string>::const_iterator siter;
00314   for (siter = mExtensions.begin(); siter != mExtensions.end(); ++siter)
00315     if (!(*siter).compare(ext)) return true;
00316     else if (0 == strcasecmp( siter->c_str(), ext)) return true;
00317 
00318   return false;
00319 }
00320 
00321 bool ReaderWriterSet::Handler::writes_extension(const char *ext) const
00322 {
00323   if (!have_writer()) return false;
00324 
00325   std::vector<std::string>::const_iterator siter;
00326   for (siter = mExtensions.begin(); siter != mExtensions.end(); ++siter)
00327     if (!(*siter).compare(ext)) return true;
00328     else if (0 == strcasecmp( siter->c_str(), ext)) return true;
00329 
00330   return false;
00331 }
00332 
00333 ReaderWriterSet::iterator
00334 ReaderWriterSet::handler_by_name( const char* nm ) const
00335 {
00336   return std::find( begin(), end(), nm );
00337 }
00338 
00339 bool ReaderWriterSet::Handler::operator==( const char* nm ) const
00340 {
00341     // do case-insensitive comparison
00342   std::string::const_iterator siter = mName.begin();
00343   for (; *nm; ++nm, ++siter)
00344     if (siter == mName.end() || tolower(*nm) != tolower(*siter))
00345       return false;
00346   return *nm == '\0';
00347 }
00348 
00349 } // namespace moab
00350 
00351 
00352 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines