moab
|
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