Gerbview: fix crash when reading a .gbrjob, and when a file given by the .gbrjob is not found. A incorrect gerber image was created, creating crash on exit or when enable the layer view.
This commit is contained in:
parent
4e8f191f43
commit
a00caac789
|
@ -247,36 +247,33 @@ bool GERBVIEW_FRAME::Read_EXCELLON_File( const wxString& aFullFileName )
|
|||
int layerId = GetActiveLayer(); // current layer used in GerbView
|
||||
GERBER_FILE_IMAGE_LIST* images = GetGerberLayout()->GetImagesList();
|
||||
auto gerber_layer = images->GetGbrImage( layerId );
|
||||
auto drill_layer = dynamic_cast<EXCELLON_IMAGE*>( gerber_layer );
|
||||
|
||||
if( gerber_layer && !drill_layer )
|
||||
{
|
||||
// The active layer contains old gerber data we have to clear
|
||||
// OIf the active layer contains old gerber or nc drill data, remove it
|
||||
if( gerber_layer )
|
||||
Erase_Current_DrawLayer( false );
|
||||
}
|
||||
|
||||
if( drill_layer == nullptr )
|
||||
{
|
||||
drill_layer = new EXCELLON_IMAGE( layerId );
|
||||
layerId = images->AddGbrImage( drill_layer, layerId );
|
||||
}
|
||||
|
||||
if( layerId < 0 )
|
||||
{
|
||||
DisplayError( this, _( "No room to load file" ) );
|
||||
return false;
|
||||
}
|
||||
EXCELLON_IMAGE* drill_layer = new EXCELLON_IMAGE( layerId );
|
||||
|
||||
// Read the Excellon drill file:
|
||||
bool success = drill_layer->LoadFile( aFullFileName );
|
||||
|
||||
if( !success )
|
||||
{
|
||||
msg.Printf( _( "File %s not found" ), GetChars( aFullFileName ) );
|
||||
delete drill_layer;
|
||||
msg.Printf( _( "File %s not found" ), aFullFileName );
|
||||
DisplayError( this, msg );
|
||||
return false;
|
||||
}
|
||||
|
||||
layerId = images->AddGbrImage( drill_layer, layerId );
|
||||
|
||||
if( layerId < 0 )
|
||||
{
|
||||
delete drill_layer;
|
||||
DisplayError( this, _( "No room to load file" ) );
|
||||
return false;
|
||||
}
|
||||
|
||||
// Display errors list
|
||||
if( drill_layer->GetMessages().size() > 0 )
|
||||
{
|
||||
|
|
|
@ -284,6 +284,24 @@ bool GERBVIEW_FRAME::loadListOfGerberAndDrillFiles( const wxString& aPath,
|
|||
|
||||
for( unsigned ii = 0; ii < aFilenameList.GetCount(); ii++ )
|
||||
{
|
||||
|
||||
filename = aFilenameList[ii];
|
||||
|
||||
if( !filename.IsAbsolute() )
|
||||
filename.SetPath( aPath );
|
||||
|
||||
// Check for non existing files, to avoid creating broken or useless data
|
||||
// and report all in one error list:
|
||||
if( !filename.FileExists() )
|
||||
{
|
||||
wxString warning;
|
||||
warning << "<b>" << _( "File not found:" ) << "</b><br>"
|
||||
<< filename.GetFullPath() << "<br>";
|
||||
reporter.Report( warning, REPORTER::RPT_WARNING );
|
||||
success = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
if( !progress && wxGetUTCTimeMillis() - startTime > progressShowDelay )
|
||||
{
|
||||
progress = std::make_unique<WX_PROGRESS_REPORTER>( this,
|
||||
|
@ -296,11 +314,6 @@ bool GERBVIEW_FRAME::loadListOfGerberAndDrillFiles( const wxString& aPath,
|
|||
progress->KeepRefreshing();
|
||||
}
|
||||
|
||||
filename = aFilenameList[ii];
|
||||
|
||||
if( !filename.IsAbsolute() )
|
||||
filename.SetPath( aPath );
|
||||
|
||||
m_lastFileName = filename.GetFullPath();
|
||||
|
||||
SetActiveLayer( layer, false );
|
||||
|
|
|
@ -117,7 +117,7 @@ void GERBER_FILE_IMAGE_LIST::DeleteImage( int aIdx )
|
|||
GERBER_FILE_IMAGE* gbr_image = GetGbrImage( aIdx );
|
||||
|
||||
delete gbr_image;
|
||||
m_GERBER_List[ aIdx ] = NULL;
|
||||
m_GERBER_List[ aIdx ] = nullptr;
|
||||
}
|
||||
|
||||
// Build a name for image aIdx which can be used in layers manager
|
||||
|
|
|
@ -249,8 +249,8 @@ GERBVIEW_FRAME::~GERBVIEW_FRAME()
|
|||
|
||||
void GERBVIEW_FRAME::OnCloseWindow( wxCloseEvent& Event )
|
||||
{
|
||||
GetGalCanvas()->GetView()->Clear();
|
||||
GetGalCanvas()->StopDrawing();
|
||||
GetGalCanvas()->GetView()->Clear();
|
||||
|
||||
if( m_toolManager )
|
||||
m_toolManager->DeactivateTool();
|
||||
|
|
|
@ -51,18 +51,21 @@ bool GERBVIEW_FRAME::Read_GERBER_File( const wxString& GERBER_FullFileName )
|
|||
}
|
||||
|
||||
gerber = new GERBER_FILE_IMAGE( layer );
|
||||
images->AddGbrImage( gerber, layer );
|
||||
|
||||
/* Read the gerber file */
|
||||
// Read the gerber file. The image will be added only if it can be read
|
||||
// to avoid broken data.
|
||||
bool success = gerber->LoadGerberFile( GERBER_FullFileName );
|
||||
|
||||
if( !success )
|
||||
{
|
||||
msg.Printf( _( "File \"%s\" not found" ), GetChars( GERBER_FullFileName ) );
|
||||
delete gerber;
|
||||
msg.Printf( _( "File \"%s\" not found" ), GERBER_FullFileName );
|
||||
DisplayError( this, msg, 10 );
|
||||
return false;
|
||||
}
|
||||
|
||||
images->AddGbrImage( gerber, layer );
|
||||
|
||||
// Display errors list
|
||||
if( gerber->GetMessages().size() > 0 )
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue