- add IFCZIP support to IFC loader.
git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@1286 67173fc5-114c-0410-ac8e-9d2fd5bffc1fpull/8/head
parent
f849f6d9bd
commit
c70646912c
|
@ -48,6 +48,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <boost/tuple/tuple.hpp>
|
#include <boost/tuple/tuple.hpp>
|
||||||
|
|
||||||
|
#include "../contrib/unzip/unzip.h"
|
||||||
|
|
||||||
#include "IFCLoader.h"
|
#include "IFCLoader.h"
|
||||||
#include "STEPFileReader.h"
|
#include "STEPFileReader.h"
|
||||||
|
@ -103,7 +104,7 @@ static const aiImporterDesc desc = {
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
"ifc"
|
"ifc ifczip"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -123,7 +124,7 @@ IFCImporter::~IFCImporter()
|
||||||
bool IFCImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const
|
bool IFCImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const
|
||||||
{
|
{
|
||||||
const std::string& extension = GetExtension(pFile);
|
const std::string& extension = GetExtension(pFile);
|
||||||
if (extension == "ifc") {
|
if (extension == "ifc" || extension == "ifczip") {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,6 +169,53 @@ void IFCImporter::InternReadFile( const std::string& pFile,
|
||||||
ThrowException("Could not open file for reading");
|
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));
|
boost::scoped_ptr<STEP::DB> db(STEP::ReadFileHeader(stream));
|
||||||
const STEP::HeaderInfo& head = static_cast<const STEP::DB&>(*db).GetHeader();
|
const STEP::HeaderInfo& head = static_cast<const STEP::DB&>(*db).GetHeader();
|
||||||
|
|
||||||
|
|
|
@ -53,12 +53,20 @@ class MemoryIOStream : public IOStream
|
||||||
{
|
{
|
||||||
//friend class MemoryIOSystem;
|
//friend class MemoryIOSystem;
|
||||||
public:
|
public:
|
||||||
MemoryIOStream (const uint8_t* buff, size_t len)
|
MemoryIOStream (const uint8_t* buff, size_t len, bool own = false)
|
||||||
: buffer (buff), length(len), pos((size_t)0) {
|
: buffer (buff)
|
||||||
|
, length(len)
|
||||||
|
, pos((size_t)0)
|
||||||
|
, own(own)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
~MemoryIOStream () {
|
~MemoryIOStream () {
|
||||||
|
if(own) {
|
||||||
|
delete[] buffer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
|
@ -124,6 +132,7 @@ public:
|
||||||
private:
|
private:
|
||||||
const uint8_t* buffer;
|
const uint8_t* buffer;
|
||||||
size_t length,pos;
|
size_t length,pos;
|
||||||
|
bool own;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue