Commit 20f512e5 authored by Dick Hollenbeck's avatar Dick Hollenbeck

Fix off by one error in libpart editor when displaying duplicate pins, unit numbers.

Fix segfault when deleting last user path from eeschema libpaths and then pressing cancel.
parent e140f79a
...@@ -69,6 +69,5 @@ Dick's Final TODO List: ...@@ -69,6 +69,5 @@ Dick's Final TODO List:
https://blueprints.launchpad.net/kicad/+spec/modular-kicad https://blueprints.launchpad.net/kicad/+spec/modular-kicad
Issues as a result of minimal testing: Issues as a result of minimal testing:
If eeschema launched from C++ project manager does not find all libraries, If eeschema launched from C++ project manager and does not find all libraries,
then the dialog showing the names of missing libraries is not visible, then the dialog showing the names of missing libraries is shown twice.
probably because the wxFrame parent is not yet visible.
...@@ -205,7 +205,7 @@ void DIALOG_EESCHEMA_CONFIG::OnCancelClick( wxCommandEvent& event ) ...@@ -205,7 +205,7 @@ void DIALOG_EESCHEMA_CONFIG::OnCancelClick( wxCommandEvent& event )
// Recreate the user lib path // Recreate the user lib path
if( m_LibPathChanged ) if( m_LibPathChanged )
{ {
for( unsigned ii = 0; ii < m_ListLibr->GetCount(); ii++ ) for( unsigned ii = 0; ii < m_listUserPaths->GetCount(); ii++ )
lib_search.RemovePaths( m_listUserPaths->GetString(ii) ); lib_search.RemovePaths( m_listUserPaths->GetString(ii) );
lib_search.AddPaths( m_Parent->GetUserLibraryPath(), 1 ); lib_search.AddPaths( m_Parent->GetUserLibraryPath(), 1 );
......
...@@ -100,7 +100,9 @@ void SCH_EDIT_FRAME::LoadLibraries() ...@@ -100,7 +100,9 @@ void SCH_EDIT_FRAME::LoadLibraries()
// Print the libraries not found // Print the libraries not found
if( !libraries_not_found.IsEmpty() ) if( !libraries_not_found.IsEmpty() )
{ {
// parent of this dialog cannot be NULL since that breaks the Kiway() chain.
HTML_MESSAGE_BOX dialog( this, _("Files not found") ); HTML_MESSAGE_BOX dialog( this, _("Files not found") );
dialog.MessageSet( _( "The following libraries could not be found:" ) ); dialog.MessageSet( _( "The following libraries could not be found:" ) );
dialog.ListSet( libraries_not_found ); dialog.ListSet( libraries_not_found );
libraries_not_found.empty(); libraries_not_found.empty();
......
...@@ -626,20 +626,16 @@ bool sort_by_pin_number( const LIB_PIN* ref, const LIB_PIN* tst ) ...@@ -626,20 +626,16 @@ bool sort_by_pin_number( const LIB_PIN* ref, const LIB_PIN* tst )
*/ */
void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event ) void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event )
{ {
#define MIN_GRID_SIZE 25
int dup_error;
int offgrid_error;
LIB_PIN* Pin;
LIB_PINS PinList;
wxString msg;
wxString aux_msg;
if( m_component == NULL ) if( m_component == NULL )
return; return;
m_component->GetPins( PinList ); const int MIN_GRID_SIZE = 25;
LIB_PINS pinList;
m_component->GetPins( pinList );
if( PinList.size() == 0 ) if( pinList.size() == 0 )
{ {
DisplayInfoMessage( this, _( "No pins!" ) ); DisplayInfoMessage( this, _( "No pins!" ) );
return; return;
...@@ -647,48 +643,49 @@ void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event ) ...@@ -647,48 +643,49 @@ void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event )
// Sort pins by pin num, so 2 duplicate pins // Sort pins by pin num, so 2 duplicate pins
// (pins with the same number) will be consecutive in list // (pins with the same number) will be consecutive in list
sort( PinList.begin(), PinList.end(), sort_by_pin_number ); sort( pinList.begin(), pinList.end(), sort_by_pin_number );
// Test for duplicates: // Test for duplicates:
dup_error = 0;
DIALOG_DISPLAY_HTML_TEXT_BASE error_display( this, wxID_ANY, DIALOG_DISPLAY_HTML_TEXT_BASE error_display( this, wxID_ANY,
_( "Marker Information" ), _( "Marker Information" ),
wxDefaultPosition, wxDefaultPosition,
wxSize( 750, 600 ) ); wxSize( 750, 600 ) );
for( unsigned ii = 1; ii < PinList.size(); ii++ ) int dup_error = 0;
for( unsigned ii = 1; ii < pinList.size(); ii++ )
{ {
wxString stringPinNum, stringCurrPinNum; wxString stringPinNum, stringCurrPinNum;
LIB_PIN* curr_pin = PinList[ii]; LIB_PIN* curr_pin = pinList[ii];
Pin = PinList[ii - 1]; LIB_PIN* pin = pinList[ii - 1];
if( Pin->GetNumber() != curr_pin->GetNumber() if( pin->GetNumber() != curr_pin->GetNumber()
|| Pin->GetConvert() != curr_pin->GetConvert() || pin->GetConvert() != curr_pin->GetConvert()
|| Pin->GetUnit() != curr_pin->GetUnit() ) || pin->GetUnit() != curr_pin->GetUnit() )
continue; continue;
dup_error++; dup_error++;
Pin->PinStringNum( stringPinNum ); pin->PinStringNum( stringPinNum );
/* TODO I dare someone to find a way to make happy translators on /* TODO I dare someone to find a way to make happy translators on
this thing! Lorenzo */ this thing! Lorenzo */
curr_pin->PinStringNum( stringCurrPinNum ); curr_pin->PinStringNum( stringCurrPinNum );
msg.Printf( _( "<b>Duplicate pin %s</b> \"%s\" at location <b>(%.3f, \
wxString msg = wxString::Format( _( "<b>Duplicate pin %s</b> \"%s\" at location <b>(%.3f, \
%.3f)</b> conflicts with pin %s \"%s\" at location <b>(%.3f, %.3f)</b>" ), %.3f)</b> conflicts with pin %s \"%s\" at location <b>(%.3f, %.3f)</b>" ),
GetChars( stringCurrPinNum ), GetChars( stringCurrPinNum ),
GetChars( curr_pin->GetName() ), GetChars( curr_pin->GetName() ),
curr_pin->GetPosition().x / 1000.0, curr_pin->GetPosition().x / 1000.0,
-curr_pin->GetPosition().y / 1000.0, -curr_pin->GetPosition().y / 1000.0,
GetChars( stringPinNum ), GetChars( stringPinNum ),
GetChars( Pin->GetName() ), GetChars( pin->GetName() ),
Pin->GetPosition().x / 1000.0, pin->GetPosition().x / 1000.0,
-Pin->GetPosition().y / 1000.0 ); -pin->GetPosition().y / 1000.0 );
if( m_component->GetPartCount() > 1 ) if( m_component->GetPartCount() > 1 )
{ {
aux_msg.Printf( _( " in part %c" ), 'A' + curr_pin->GetUnit() ); msg += wxString::Format( _( " in part %c" ), 'A' + curr_pin->GetUnit() - 1 );
msg += aux_msg;
} }
if( m_showDeMorgan ) if( m_showDeMorgan )
...@@ -700,46 +697,47 @@ void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event ) ...@@ -700,46 +697,47 @@ void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event )
} }
msg += wxT( ".<br>" ); msg += wxT( ".<br>" );
error_display.m_htmlWindow->AppendToPage( msg ); error_display.m_htmlWindow->AppendToPage( msg );
} }
// Test for off grid pins: // Test for off grid pins:
offgrid_error = 0; int offgrid_error = 0;
for( unsigned ii = 0; ii < PinList.size(); ii++ ) for( unsigned ii = 0; ii < pinList.size(); ii++ )
{ {
Pin = PinList[ii]; LIB_PIN* pin = pinList[ii];
if( ( (Pin->GetPosition().x % MIN_GRID_SIZE) == 0 ) && if( ( (pin->GetPosition().x % MIN_GRID_SIZE) == 0 ) &&
( (Pin->GetPosition().y % MIN_GRID_SIZE) == 0 ) ) ( (pin->GetPosition().y % MIN_GRID_SIZE) == 0 ) )
continue; continue;
// A pin is found here off grid // "pin" is off grid here.
offgrid_error++; offgrid_error++;
wxString stringPinNum; wxString stringPinNum;
Pin->PinStringNum( stringPinNum ); pin->PinStringNum( stringPinNum );
msg.Printf( _( "<b>Off grid pin %s</b> \"%s\" at location <b>(%.3f, %.3f)</b>" ), wxString msg = wxString::Format( _( "<b>Off grid pin %s</b> \"%s\" at location <b>(%.3f, %.3f)</b>" ),
GetChars( stringPinNum ), GetChars( stringPinNum ),
GetChars( Pin->GetName() ), GetChars( pin->GetName() ),
Pin->GetPosition().x / 1000.0, pin->GetPosition().x / 1000.0,
-Pin->GetPosition().y / 1000.0 ); -pin->GetPosition().y / 1000.0 );
if( m_component->GetPartCount() > 1 ) if( m_component->GetPartCount() > 1 )
{ {
aux_msg.Printf( _( " in part %c" ), 'A' + Pin->GetUnit() ); msg += wxString::Format( _( " in part %c" ), 'A' + pin->GetUnit() - 1 );
msg += aux_msg;
} }
if( m_showDeMorgan ) if( m_showDeMorgan )
{ {
if( Pin->GetConvert() ) if( pin->GetConvert() )
msg += _( " of converted" ); msg += _( " of converted" );
else else
msg += _( " of normal" ); msg += _( " of normal" );
} }
msg += wxT( ".<br>" ); msg += wxT( ".<br>" );
error_display.m_htmlWindow->AppendToPage( msg ); error_display.m_htmlWindow->AppendToPage( msg );
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment