Fix bug: DRC report to File crashes Pcbnew, if the file cannot be created (for instance if the CWD is not writable, or if the path does not exist)

Fix also an other issue: if the file path is not entered, the file is now created in the current project directory.
This commit is contained in:
jean-pierre charras 2016-06-15 19:00:30 +02:00
parent 7abf006c80
commit 3f2b15711c
6 changed files with 113 additions and 59 deletions

View File

@ -5,7 +5,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2015 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
* Copyright (C) 2016 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2009 Dick Hollenbeck, dick@softplc.com
* Copyright (C) 2004-2016 KiCad Developers, see change_log.txt for contributors.
*
@ -28,6 +28,9 @@
*/
#include <fctsys.h>
#include <confirm.h>
#include <wildcards_and_files_ext.h>
#include <pgm_base.h>
#include <dialog_drc.h>
#include <wxPcbStruct.h>
#include <base_units.h>
@ -47,6 +50,7 @@ DIALOG_DRC_CONTROL::DIALOG_DRC_CONTROL( DRC* aTester, PCB_EDIT_FRAME* parent ) :
m_BrdSettings = m_Parent->GetBoard()->GetDesignSettings();
InitValues();
if( GetSizer() )
{
GetSizer()->SetSizeHints( this );
@ -109,13 +113,13 @@ void DIALOG_DRC_CONTROL::InitValues()
DisplayDRCValues();
Layout(); // adding the units above expanded Clearance text, now resize.
// Set the initial "enabled" status of the browse button and the text
// field for report name
wxCommandEvent junk;
OnReportCheckBoxClicked( junk );
Layout(); // adding the units above expanded Clearance text, now resize.
SetFocus();
}
@ -131,6 +135,20 @@ void DIALOG_DRC_CONTROL::SetDrcParmeters( )
}
void DIALOG_DRC_CONTROL::SetRptSettings( bool aEnable, const wxString& aFileName )
{
m_RptFilenameCtrl->Enable( aEnable );
m_BrowseButton->Enable( aEnable );
m_CreateRptCtrl->SetValue( aEnable );
m_RptFilenameCtrl->SetValue( aFileName );
}
void DIALOG_DRC_CONTROL::GetRptSettings( bool* aEnable, wxString& aFileName )
{
*aEnable = m_CreateRptCtrl->GetValue();
aFileName = m_RptFilenameCtrl->GetValue();
}
void DIALOG_DRC_CONTROL::OnStartdrcClick( wxCommandEvent& event )
{
wxString reportName;
@ -141,13 +159,13 @@ void DIALOG_DRC_CONTROL::OnStartdrcClick( wxCommandEvent& event )
if( reportName.IsEmpty() )
{
wxCommandEvent junk;
OnButtonBrowseRptFileClick( junk );
wxCommandEvent dummy;
OnButtonBrowseRptFileClick( dummy );
}
reportName = m_RptFilenameCtrl->GetValue();
}
reportName = makeValidFileNameReport();
SetDrcParmeters();
m_tester->SetSettings( true, // Pad to pad DRC test enabled
true, // unconnected pdas DRC test enabled
@ -170,17 +188,18 @@ void DIALOG_DRC_CONTROL::OnStartdrcClick( wxCommandEvent& event )
// Generate the report
if( !reportName.IsEmpty() )
{
FILE* fp = wxFopen( reportName, wxT( "w" ) );
writeReport( fp );
fclose( fp );
if( writeReport( reportName ) )
{
wxString msg;
msg.Printf( _( "Report file \"%s\" created" ), GetChars( reportName ) );
wxString msg;
msg.Printf( _( "Report file \"%s\" created" ), GetChars( reportName ) );
wxString caption( _( "Disk File Report Completed" ) );
wxMessageDialog popupWindow( this, msg, caption );
popupWindow.ShowModal();
wxString caption( _( "Disk File Report Completed" ) );
wxMessageDialog popupWindow( this, msg, caption );
popupWindow.ShowModal();
}
else
DisplayError( this, wxString::Format( _( "Unable to create report file '%s' "),
GetChars( reportName ) ) );
}
wxEndBusyCursor();
@ -209,10 +228,10 @@ void DIALOG_DRC_CONTROL::OnListUnconnectedClick( wxCommandEvent& event )
wxCommandEvent junk;
OnButtonBrowseRptFileClick( junk );
}
reportName = m_RptFilenameCtrl->GetValue();
}
reportName = makeValidFileNameReport();
SetDrcParmeters();
m_tester->SetSettings( true, // Pad to pad DRC test enabled
@ -233,15 +252,17 @@ void DIALOG_DRC_CONTROL::OnListUnconnectedClick( wxCommandEvent& event )
// Generate the report
if( !reportName.IsEmpty() )
{
FILE* fp = wxFopen( reportName, wxT( "w" ) );
writeReport( fp );
fclose( fp );
wxString msg;
msg.Printf( _( "Report file \"%s\" created" ), GetChars( reportName ) );
wxString caption( _( "Disk File Report Completed" ) );
wxMessageDialog popupWindow( this, msg, caption );
popupWindow.ShowModal();
if( writeReport( reportName ) )
{
wxString msg;
msg.Printf( _( "Report file \"%s\" created" ), GetChars( reportName ) );
wxString caption( _( "Disk File Report Completed" ) );
wxMessageDialog popupWindow( this, msg, caption );
popupWindow.ShowModal();
}
else
DisplayError( this, wxString::Format( _( "Unable to create report file '%s' "),
GetChars( reportName ) ) );
}
wxEndBusyCursor();
@ -299,16 +320,8 @@ void DIALOG_DRC_CONTROL::OnCancelClick( wxCommandEvent& event )
void DIALOG_DRC_CONTROL::OnReportCheckBoxClicked( wxCommandEvent& event )
{
if( m_CreateRptCtrl->IsChecked() )
{
m_RptFilenameCtrl->Enable( true );
m_BrowseButton->Enable( true );
}
else
{
m_RptFilenameCtrl->Enable( false );
m_BrowseButton->Enable( false );
}
m_RptFilenameCtrl->Enable( m_CreateRptCtrl->IsChecked() );
m_BrowseButton->Enable( m_CreateRptCtrl->IsChecked() );
}
@ -325,14 +338,9 @@ void DIALOG_DRC_CONTROL::OnLeftDClickClearance( wxMouseEvent& event )
// Find the selected MARKER in the PCB, position cursor there.
// Then close the dialog.
const DRC_ITEM* item = m_ClearanceListBox->GetItem( selection );
if( item )
{
/*
* // after the goto, process a button OK command later.
* wxCommandEvent cmd( wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK );
* ::wxPostEvent( GetEventHandler(), cmd );
*/
m_Parent->CursorGoto( item->GetPointA() );
m_Parent->GetGalCanvas()->GetView()->SetCenter( VECTOR2D( item->GetPointA() ) );
@ -549,8 +557,35 @@ void DIALOG_DRC_CONTROL::DelDRCMarkers()
}
void DIALOG_DRC_CONTROL::writeReport( FILE* fp )
const wxString DIALOG_DRC_CONTROL::makeValidFileNameReport()
{
wxFileName fn = m_RptFilenameCtrl->GetValue();
if( !fn.HasExt() )
{
fn.SetExt( ReportFileExtension );
m_RptFilenameCtrl->SetValue( fn.GetFullPath() );
}
// Ensure it is an absolute filename. if it is given relative
// it will be made relative to the project
if( !fn.IsAbsolute() )
{
wxString prj_path = Prj().GetProjectPath();
fn.MakeAbsolute( prj_path );
}
return fn.GetFullPath();
}
bool DIALOG_DRC_CONTROL::writeReport( const wxString& aFullFileName )
{
FILE* fp = wxFopen( aFullFileName, wxT( "w" ) );
if( fp == NULL )
return false;
int count;
fprintf( fp, "** Drc report for %s **\n",
@ -575,6 +610,10 @@ void DIALOG_DRC_CONTROL::writeReport( FILE* fp )
fprintf( fp, "%s", TO_UTF8( m_UnconnectedListBox->GetItem( i )->ShowReport() ) );
fprintf( fp, "\n** End of Report **\n" );
fclose( fp );
return true;
}

View File

@ -60,14 +60,31 @@ public:
DIALOG_DRC_CONTROL( DRC* aTester, PCB_EDIT_FRAME* parent );
~DIALOG_DRC_CONTROL(){};
/**
* Enable/disable the report file creation
* @param aEnbale = true to ask for creation
* @param aFileName = the filename or the report file
*/
void SetRptSettings( bool aEnable, const wxString& aFileName );
void GetRptSettings( bool* aEnable, wxString& aFileName );
private:
/**
* Function writeReport
* outputs the MARKER items and unconnecte DRC_ITEMs with commentary to an
* open text file.
* @param fpOut The text file to write the report to.
* @param aFullFileName The text filename to write the report to.
* @return true if OK, false on error
*/
void writeReport( FILE* fpOut );
bool writeReport( const wxString& aFullFileName );
/**
* filenames can be entered by name.
* @return a good report filename (with .rpt extension) (a full filename)
* from m_CreateRptCtrl
*/
const wxString makeValidFileNameReport();
void InitValues( );

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Mar 28 2016)
// C++ code generated with wxFormBuilder (version May 6 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!

View File

@ -1155,7 +1155,7 @@
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">public</property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
@ -1242,7 +1242,7 @@
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">public</property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
@ -2315,7 +2315,7 @@
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="permission">private</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Mar 28 2016)
// C++ code generated with wxFormBuilder (version May 6 2016)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@ -51,6 +51,7 @@ class DRCLISTBOX;
class DIALOG_DRC_CONTROL_BASE : public DIALOG_SHIM
{
private:
wxPanel* m_panelUnconnectedBox;
protected:
wxStaticText* m_ClearanceTitle;
@ -60,6 +61,8 @@ class DIALOG_DRC_CONTROL_BASE : public DIALOG_SHIM
wxStaticText* m_ViaMinUnit;
wxStaticText* m_MicroViaMinTitle;
wxStaticText* m_MicroViaMinUnit;
wxCheckBox* m_CreateRptCtrl;
wxTextCtrl* m_RptFilenameCtrl;
wxButton* m_BrowseButton;
wxStaticText* m_staticText6;
wxTextCtrl* m_Messages;
@ -70,7 +73,6 @@ class DIALOG_DRC_CONTROL_BASE : public DIALOG_SHIM
wxStaticText* m_staticTextErrMsg;
wxNotebook* m_Notebook;
wxPanel* m_panelClearanceListBox;
wxPanel* m_panelUnconnectedBox;
wxStdDialogButtonSizer* m_sdbSizer1;
wxButton* m_sdbSizer1OK;
wxButton* m_sdbSizer1Cancel;
@ -99,8 +101,6 @@ class DIALOG_DRC_CONTROL_BASE : public DIALOG_SHIM
wxTextCtrl* m_SetTrackMinWidthCtrl;
wxTextCtrl* m_SetViaMinSizeCtrl;
wxTextCtrl* m_SetMicroViakMinSizeCtrl;
wxCheckBox* m_CreateRptCtrl;
wxTextCtrl* m_RptFilenameCtrl;
DRCLISTBOX* m_ClearanceListBox;
DRCLISTBOX* m_UnconnectedListBox;

View File

@ -61,8 +61,7 @@ void DRC::ShowDialog()
m_drcDialog = new DIALOG_DRC_CONTROL( this, m_mainWindow );
updatePointers();
m_drcDialog->m_CreateRptCtrl->SetValue( m_doCreateRptFile );
m_drcDialog->m_RptFilenameCtrl->SetValue( m_rptFilename );
m_drcDialog->SetRptSettings( m_doCreateRptFile, m_rptFilename);
}
else
updatePointers();
@ -78,8 +77,7 @@ void DRC::DestroyDialog( int aReason )
if( aReason == wxID_OK )
{
// if user clicked OK, save his choices in this DRC object.
m_doCreateRptFile = m_drcDialog->m_CreateRptCtrl->GetValue();
m_rptFilename = m_drcDialog->m_RptFilenameCtrl->GetValue();
m_drcDialog->GetRptSettings( &m_doCreateRptFile, m_rptFilename);
}
m_drcDialog->Destroy();