void IfcPPReaderSTEP::loadModelFromFile( const std::wstring& file_path, shared_ptr<IfcPPModel>& target_model ) { // if file content needs to be loaded into a plain model, call resetModel() before loadModelFromFile std::wstring ext = file_path.substr( file_path.find_last_of( L"." ) + 1 ); if( boost::iequals( ext, "ifc" ) ) { // ok, nothing to do here } else if( boost::iequals( ext, "ifcXML" ) ) { // TODO: implement xml reader messageCallback( "ifcXML not yet implemented", StatusCallback::MESSAGE_TYPE_ERROR, __FUNC__ ); return; } else if( boost::iequals( ext, "ifcZIP" ) ) { // TODO: implement zip uncompress messageCallback( "ifcZIP not yet implemented", StatusCallback::MESSAGE_TYPE_ERROR, __FUNC__ ); return; } else { std::wstringstream strs; strs << "Unsupported file type: " << ext; messageCallback( strs.str().c_str(), StatusCallback::MESSAGE_TYPE_ERROR, __FUNC__ ); return; } // open file #ifdef _MSC_VER std::ifstream infile(file_path.c_str(), std::ifstream::in ); #else std::string file_path_str( file_path.begin(), file_path.end() ); std::ifstream infile(file_path_str.c_str(), std::ifstream::in ); #endif if( !infile.is_open() ) { std::wstringstream strs; strs << "Could not open file: " << file_path.c_str(); messageCallback( strs.str().c_str(), StatusCallback::MESSAGE_TYPE_ERROR, __FUNC__ ); return; } // get length of file content std::streampos file_size = infile.tellg(); infile.seekg( 0, std::ios::end ); file_size = infile.tellg() - file_size; infile.seekg( 0, std::ios::beg ); // read file content into string std::string buffer( (int)file_size, '\0' ); infile.read( &buffer[0], file_size ); infile.close(); loadModelFromString( buffer, target_model ); }
void ReaderSTEP::loadModelFromFile( const std::wstring& filePath, shared_ptr<BuildingModel>& targetModel ) { // if file content needs to be loaded into a plain model, call resetModel() before loadModelFromFile size_t posDot = filePath.find_last_of(L"."); if( filePath.size() < posDot + 3 || posDot > filePath.size() ) { messageCallback("not an .ifc file", StatusCallback::MESSAGE_TYPE_ERROR, __FUNC__); return; } std::wstring ext = filePath.substr(posDot + 1); if( boost::iequals( ext, "ifc" ) ) { // ok, nothing to do here } else if( boost::iequals( ext, "ifcXML" ) ) { // TODO: implement xml reader messageCallback( "ifcXML not yet implemented", StatusCallback::MESSAGE_TYPE_ERROR, __FUNC__ ); return; } else if( boost::iequals( ext, "ifcZIP" ) || boost::iequals(ext, "zip") ) { messageCallback( "ifcZIP not implemented, see www.ifcquery.com for details", StatusCallback::MESSAGE_TYPE_ERROR, __FUNC__ ); return; } else { std::wstringstream strs; strs << "Unsupported file type: " << ext; messageCallback( strs.str(), StatusCallback::MESSAGE_TYPE_ERROR, __FUNC__ ); return; } // open file if( !(setlocale(LC_ALL, "en-US") || setlocale(LC_ALL, "en_us.UTF-8") || setlocale(LC_ALL, "en_US.utf8"))) { std::wstringstream strs; strs << L"setlocale failed" << std::endl; messageCallback(strs.str().c_str(), StatusCallback::MESSAGE_TYPE_ERROR, __FUNC__); return; } char* buf = nullptr; size_t len = std::wcstombs(buf, filePath.c_str(), 0); buf = new char[len + 1]; std::wcstombs(buf, filePath.c_str(), (len + 1) * 6); std::string filePathStr(buf); delete[] buf; std::ifstream infile(filePathStr.c_str(), std::ifstream::in); if( !infile.is_open() ) { std::wstringstream strs; strs << "Could not open file: " << filePath.c_str(); messageCallback( strs.str().c_str(), StatusCallback::MESSAGE_TYPE_ERROR, __FUNC__ ); return; } // get length of file content std::streampos file_size = infile.tellg(); infile.seekg( 0, std::ios::end ); file_size = infile.tellg() - file_size; infile.seekg( 0, std::ios::beg ); // read file content into string std::string buffer( (int)file_size, '\0' ); infile.read( &buffer[0], file_size ); infile.close(); size_t file_header_start = buffer.find("HEADER;"); size_t file_header_end = buffer.find("ENDSEC;"); if( file_header_start == std::string::npos || file_header_end == std::string::npos ) { messageCallback("Not a valid IFC file, might be zip archive, see www.ifcquery.com for details", StatusCallback::MESSAGE_TYPE_ERROR, __FUNC__); return; } loadModelFromString( buffer, targetModel); }