void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event ) { LIB_PART* part = GetCurPart(); if( !part ) return; const int MIN_GRID_SIZE = 25; LIB_PINS pinList; part->GetPins( pinList ); if( pinList.size() == 0 ) { DisplayInfoMessage( this, _( "No pins!" ) ); return; } // Sort pins by pin num, so 2 duplicate pins // (pins with the same number) will be consecutive in list sort( pinList.begin(), pinList.end(), sort_by_pin_number ); // Test for duplicates: DIALOG_DISPLAY_HTML_TEXT_BASE error_display( this, wxID_ANY, _( "Marker Information" ), wxDefaultPosition, wxSize( 750, 600 ) ); int dup_error = 0; for( unsigned ii = 1; ii < pinList.size(); ii++ ) { wxString stringPinNum, stringCurrPinNum; LIB_PIN* curr_pin = pinList[ii]; LIB_PIN* pin = pinList[ii - 1]; if( pin->GetNumber() != curr_pin->GetNumber() || pin->GetConvert() != curr_pin->GetConvert() || pin->GetUnit() != curr_pin->GetUnit() ) continue; dup_error++; pin->PinStringNum( stringPinNum ); /* TODO I dare someone to find a way to make happy translators on this thing! Lorenzo */ curr_pin->PinStringNum( stringCurrPinNum ); 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>" ), GetChars( stringCurrPinNum ), GetChars( curr_pin->GetName() ), curr_pin->GetPosition().x / 1000.0, -curr_pin->GetPosition().y / 1000.0, GetChars( stringPinNum ), GetChars( pin->GetName() ), pin->GetPosition().x / 1000.0, -pin->GetPosition().y / 1000.0 ); if( part->GetUnitCount() > 1 ) { msg += wxString::Format( _( " in part %c" ), 'A' + curr_pin->GetUnit() - 1 ); } if( m_showDeMorgan ) { if( curr_pin->GetConvert() ) msg += _( " of converted" ); else msg += _( " of normal" ); } msg += wxT( ".<br>" ); error_display.m_htmlWindow->AppendToPage( msg ); } // Test for off grid pins: int offgrid_error = 0; for( unsigned ii = 0; ii < pinList.size(); ii++ ) { LIB_PIN* pin = pinList[ii]; if( ( (pin->GetPosition().x % MIN_GRID_SIZE) == 0 ) && ( (pin->GetPosition().y % MIN_GRID_SIZE) == 0 ) ) continue; // "pin" is off grid here. offgrid_error++; wxString stringPinNum; pin->PinStringNum( stringPinNum ); wxString msg = wxString::Format( _( "<b>Off grid pin %s</b> \"%s\" at location <b>(%.3f, %.3f)</b>" ), GetChars( stringPinNum ), GetChars( pin->GetName() ), pin->GetPosition().x / 1000.0, -pin->GetPosition().y / 1000.0 ); if( part->GetUnitCount() > 1 ) { msg += wxString::Format( _( " in part %c" ), 'A' + pin->GetUnit() - 1 ); } if( m_showDeMorgan ) { if( pin->GetConvert() ) msg += _( " of converted" ); else msg += _( " of normal" ); } msg += wxT( ".<br>" ); error_display.m_htmlWindow->AppendToPage( msg ); } if( !dup_error && !offgrid_error ) DisplayInfoMessage( this, _( "No off grid or duplicate pins were found." ) ); else error_display.ShowModal(); }
// Create a new pin based on the previous pin with an incremented pin number. void LIB_EDIT_FRAME::RepeatPinItem( wxDC* DC, LIB_PIN* SourcePin ) { wxString msg; LIB_PART* part = GetCurPart(); if( !part || !SourcePin || SourcePin->Type() != LIB_PIN_T ) return; LIB_PIN* pin = (LIB_PIN*) SourcePin->Clone(); pin->ClearFlags(); pin->SetFlags( IS_NEW ); wxPoint step; switch( pin->GetOrientation() ) { case PIN_UP: step.x = GetRepeatPinStep(); break; case PIN_DOWN: step.x = GetRepeatPinStep(); break; case PIN_LEFT: step.y = - GetRepeatPinStep(); break; case PIN_RIGHT: step.y = - GetRepeatPinStep(); break; } pin->Move( pin->GetPosition() + step ); wxString nextName = pin->GetName(); IncrementLabelMember( nextName, GetRepeatDeltaLabel() ); pin->SetName( nextName ); pin->PinStringNum( msg ); IncrementLabelMember( msg, GetRepeatDeltaLabel() ); pin->SetPinNumFromString( msg ); m_drawItem = pin; if( SynchronizePins() ) pin->SetFlags( IS_LINKED ); wxPoint savepos = GetCrossHairPosition(); m_canvas->CrossHairOff( DC ); SetCrossHairPosition( wxPoint( pin->GetPosition().x, -pin->GetPosition().y ) ); // Add this new pin in list, and creates pins for others parts if needed m_drawItem = pin; ClearTempCopyComponent(); PlacePin(); m_lastDrawItem = pin; SetCrossHairPosition( savepos ); m_canvas->CrossHairOn( DC ); MSG_PANEL_ITEMS items; pin->GetMsgPanelInfo( items ); SetMsgPanel( items ); OnModify( ); }