Add support for PKZIP-based stpZ files
FreeCAD uses gzip-based stpZ files but many programs will compress using the archive format of PKZIP (e.g. WinZIP). This handles the archive format, taking the first file from the archive, which by the standard should be the STEP file Fixes https://gitlab.com/kicad/code/kicad/issues/5376
This commit is contained in:
parent
061218e567
commit
1d3159c1cb
|
@ -33,6 +33,7 @@
|
|||
#include <wx/stdpaths.h>
|
||||
#include <wx/string.h>
|
||||
#include <wx/wfstream.h>
|
||||
#include <wx/zipstrm.h>
|
||||
|
||||
#include <decompress.hpp>
|
||||
|
||||
|
@ -473,6 +474,7 @@ bool readSTEPZ( Handle(TDocStd_Document)& m_doc, const char* aFileName )
|
|||
return false;
|
||||
|
||||
{
|
||||
bool success = false;
|
||||
wxFFileOutputStream ofile( outFile.GetFullPath() );
|
||||
|
||||
if( !ofile.IsOk() )
|
||||
|
@ -486,17 +488,33 @@ bool readSTEPZ( Handle(TDocStd_Document)& m_doc, const char* aFileName )
|
|||
try
|
||||
{
|
||||
expanded = gzip::decompress( buffer, size );
|
||||
success = true;
|
||||
}
|
||||
catch(...)
|
||||
{}
|
||||
|
||||
if( expanded.empty() )
|
||||
{
|
||||
delete[] buffer;
|
||||
return false;
|
||||
ifile.Reset();
|
||||
ifile.SeekI( 0 );
|
||||
wxZipInputStream izipfile( ifile );
|
||||
std::unique_ptr<wxZipEntry> zip_file( izipfile.GetNextEntry() );
|
||||
|
||||
if( zip_file && !zip_file->IsDir() && izipfile.CanRead() )
|
||||
{
|
||||
izipfile.Read( ofile );
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ofile.Write( expanded.data(), expanded.size() );
|
||||
}
|
||||
|
||||
delete[] buffer;
|
||||
|
||||
ofile.Write( expanded.data(), expanded.size() );
|
||||
ofile.Close();
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
bool retval = readSTEP( m_doc, outFile.GetFullPath().mb_str() );
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <wx/filefn.h>
|
||||
#include <wx/stdpaths.h>
|
||||
#include <wx/wfstream.h>
|
||||
#include <wx/zipstrm.h>
|
||||
|
||||
#include <decompress.hpp>
|
||||
|
||||
|
@ -1020,14 +1021,11 @@ bool PCBMODEL::getModelLabel( const std::string& aFileName, TRIPLET aScale, TDF_
|
|||
}
|
||||
|
||||
{
|
||||
bool success = false;
|
||||
wxFFileOutputStream ofile( outFile.GetFullPath() );
|
||||
|
||||
if( !ofile.IsOk() )
|
||||
{
|
||||
ReportMessage( wxString::Format( "readSTEP() failed on filename %s\n",
|
||||
outFile.GetFullPath() ) );
|
||||
return false;
|
||||
}
|
||||
|
||||
char *buffer = new char[size];
|
||||
|
||||
|
@ -1037,17 +1035,33 @@ bool PCBMODEL::getModelLabel( const std::string& aFileName, TRIPLET aScale, TDF_
|
|||
try
|
||||
{
|
||||
expanded = gzip::decompress( buffer, size );
|
||||
success = true;
|
||||
}
|
||||
catch(...)
|
||||
{}
|
||||
|
||||
if( expanded.empty() )
|
||||
{
|
||||
delete[] buffer;
|
||||
return false;
|
||||
ifile.Reset();
|
||||
ifile.SeekI( 0 );
|
||||
wxZipInputStream izipfile( ifile );
|
||||
std::unique_ptr<wxZipEntry> zip_file( izipfile.GetNextEntry() );
|
||||
|
||||
if( zip_file && !zip_file->IsDir() && izipfile.CanRead() )
|
||||
{
|
||||
izipfile.Read( ofile );
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ofile.Write( expanded.data(), expanded.size() );
|
||||
}
|
||||
|
||||
delete[] buffer;
|
||||
|
||||
ofile.Write( expanded.data(), expanded.size() );
|
||||
ofile.Close();
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
return getModelLabel( outFile.GetFullPath().ToStdString(), aScale, aLabel );
|
||||
|
|
Loading…
Reference in New Issue