- add IFCZIP support to IFC loader.
git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@1286 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
This commit is contained in:
@@ -48,6 +48,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <iterator>
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
|
||||
#include "../contrib/unzip/unzip.h"
|
||||
|
||||
#include "IFCLoader.h"
|
||||
#include "STEPFileReader.h"
|
||||
@@ -103,7 +104,7 @@ static const aiImporterDesc desc = {
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
"ifc"
|
||||
"ifc ifczip"
|
||||
};
|
||||
|
||||
|
||||
@@ -123,7 +124,7 @@ IFCImporter::~IFCImporter()
|
||||
bool IFCImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const
|
||||
{
|
||||
const std::string& extension = GetExtension(pFile);
|
||||
if (extension == "ifc") {
|
||||
if (extension == "ifc" || extension == "ifczip") {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -168,6 +169,53 @@ void IFCImporter::InternReadFile( const std::string& pFile,
|
||||
ThrowException("Could not open file for reading");
|
||||
}
|
||||
|
||||
// if this is a ifczip file, decompress its contents first
|
||||
if(GetExtension(pFile) == "ifczip") {
|
||||
unzFile zip = unzOpen( pFile.c_str() );
|
||||
if(zip == NULL) {
|
||||
ThrowException("Could not open ifczip file for reading, unzip failed");
|
||||
}
|
||||
|
||||
// chop 'zip' postfix
|
||||
std::string fileName = pFile.substr(0,pFile.length() - 3);
|
||||
|
||||
std::string::size_type s = pFile.find_last_of('\\');
|
||||
if(s == std::string::npos) {
|
||||
s = pFile.find_last_of('/');
|
||||
}
|
||||
if(s != std::string::npos) {
|
||||
fileName = fileName.substr(s+1);
|
||||
}
|
||||
|
||||
// search file (same name as the IFCZIP except for the file extension) and place file pointer there
|
||||
if ( unzLocateFile( zip, fileName.c_str(), 0 ) == UNZ_OK )
|
||||
{
|
||||
// get file size, etc.
|
||||
unz_file_info fileInfo;
|
||||
unzGetCurrentFileInfo( zip , &fileInfo, 0, 0, 0, 0, 0, 0 );
|
||||
|
||||
uint8_t* buff = new uint8_t[fileInfo.uncompressed_size];
|
||||
|
||||
LogInfo("Decompressing IFCZIP file");
|
||||
|
||||
unzOpenCurrentFile( zip );
|
||||
const int ret = unzReadCurrentFile( zip, buff, fileInfo.uncompressed_size);
|
||||
size_t filesize = fileInfo.uncompressed_size;
|
||||
if ( ret < 0 || size_t(ret) != filesize )
|
||||
{
|
||||
delete[] buff;
|
||||
ThrowException("Failed to decompress IFC ZIP file");
|
||||
}
|
||||
unzCloseCurrentFile( zip );
|
||||
stream.reset(new MemoryIOStream(buff,fileInfo.uncompressed_size,true));
|
||||
}
|
||||
else {
|
||||
ThrowException("Found no IFC file member in IFCZIP file");
|
||||
}
|
||||
|
||||
unzClose(zip);
|
||||
}
|
||||
|
||||
boost::scoped_ptr<STEP::DB> db(STEP::ReadFileHeader(stream));
|
||||
const STEP::HeaderInfo& head = static_cast<const STEP::DB&>(*db).GetHeader();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user