42    std::vector<SCH_PIN*> pinList = aSymbol->
GetPins();
 
   50    std::vector<LOGICAL_PIN> logicalPins;
 
   51    logicalPins.reserve( pinList.size() );
 
   56        std::vector<wxString> numbers = 
pin->GetStackedPinNumbers( &valid );
 
   58        if( !valid || numbers.empty() )
 
   60            logicalPins.push_back( { 
pin, 
pin->GetNumber() } );
 
   64        for( 
const wxString& number : numbers )
 
   65            logicalPins.push_back( { 
pin, number } );
 
   68    sort( logicalPins.begin(), logicalPins.end(),
 
   69            []( 
const LOGICAL_PIN& lhs, 
const LOGICAL_PIN& rhs )
 
   71                int result = lhs.number.Cmp( rhs.number );
 
   74                    result = lhs.pin->GetBodyStyle() - rhs.pin->GetBodyStyle();
 
   77                    result = lhs.pin->GetUnit() - rhs.pin->GetUnit();
 
   79                if( result == 0 && lhs.pin != rhs.pin )
 
   80                    return lhs.pin < rhs.pin;
 
   85    for( 
unsigned ii = 1; ii < logicalPins.size(); ii++ )
 
   87        LOGICAL_PIN& prev = logicalPins[ii - 1];
 
   88        LOGICAL_PIN& 
next = logicalPins[ii];
 
   90        if( prev.number != 
next.number )
 
   93        if( prev.pin == 
next.pin )
 
   98        if( prev.pin->GetBodyStyle() != 0 && 
next.pin->GetBodyStyle() != 0 )
 
  100            if( prev.pin->GetBodyStyle() != 
next.pin->GetBodyStyle() )
 
  107        if( !prev.pin->GetName().IsEmpty() )
 
  108            pinName = 
" '" + prev.pin->GetName() + 
"'";
 
  110        if( !
next.pin->GetName().IsEmpty() )
 
  111            nextName = 
" '" + 
next.pin->GetName() + 
"'";
 
  113        auto formatNumberForMessage = []( 
const SCH_PIN* 
pin, 
const wxString& logicalNumber )
 
  115            wxString shown = 
pin->GetNumber();
 
  117            if( shown == logicalNumber )
 
  118                return logicalNumber;
 
  120            return wxString::Format( wxT( 
"%s (%s)" ), logicalNumber, shown );
 
  123        wxString prevNumber = formatNumberForMessage( prev.pin, prev.number );
 
  124        wxString nextNumber = formatNumberForMessage( 
next.pin, 
next.number );
 
  128            if( prev.pin->GetUnit() == 0 || 
next.pin->GetUnit() == 0 )
 
  130                msg.Printf( 
_( 
"<b>Duplicate pin %s</b> %s at location <b>(%s, %s)</b>" 
  131                               " conflicts with pin %s%s at location <b>(%s, %s)</b>" 
  132                               " in %s body style." ),
 
  145                msg.Printf( 
_( 
"<b>Duplicate pin %s</b> %s at location <b>(%s, %s)</b>" 
  146                               " conflicts with pin %s%s at location <b>(%s, %s)</b>" 
  147                               " in units %s and %s of %s body style." ),
 
  163            if( prev.pin->GetUnit() == 0 || 
next.pin->GetUnit() == 0 )
 
  165                msg.Printf( 
_( 
"<b>Duplicate pin %s</b> %s at location <b>(%s, %s)</b>" 
  166                               " conflicts with pin %s%s at location <b>(%s, %s)</b>." ),
 
  178                msg.Printf( 
_( 
"<b>Duplicate pin %s</b> %s at location <b>(%s, %s)</b>" 
  179                               " conflicts with pin %s%s at location <b>(%s, %s)</b>" 
  180                               " in units %s and %s." ),
 
  194        msg += wxT( 
"<br><br>" );
 
  195        aMessages.push_back( msg );
 
 
  228    if( reference_base.IsEmpty() )
 
  230        aMessages.push_back( 
_( 
"<b>Warning: reference is empty</b><br><br>" ) );
 
  234        wxString illegal_end( wxT( 
"0123456789?" ) );
 
  235        wxUniChar last_char = reference_base.Last();
 
  237        if( illegal_end.Find( last_char ) != wxNOT_FOUND )
 
  239            msg.Printf( 
_( 
"<b>Warning: reference prefix</b><br>prefix ending by '%s' can create" 
  240                           " issues if saved in a symbol library" ),
 
  242            msg += wxT( 
"<br><br>" );
 
  243            aMessages.push_back( msg );
 
  249    std::vector<SCH_PIN*> pinList = aSymbol->
GetPins();
 
  257    const int min_grid_size = 
schIUScale.MilsToIU( 25 );
 
  258    const int clamped_grid_size = ( aGridForPins < min_grid_size ) ? min_grid_size : aGridForPins;
 
  268            msg.Printf( 
_( 
"<b>A Power Symbol should have only one unit</b><br><br>" ) );
 
  269            aMessages.push_back( msg );
 
  272        if( pinList.size() != 1 )
 
  274            msg.Printf( 
_( 
"<b>A Power Symbol should have only one pin</b><br><br>" ) );
 
  275            aMessages.push_back( msg );
 
  283            msg.Printf( 
_( 
"<b>Suspicious Power Symbol</b><br>" 
  284                           "Only an input or output power pin has meaning<br><br>" ) );
 
  285            aMessages.push_back( msg );
 
  290            msg.Printf( 
_( 
"<b>Suspicious Power Symbol</b><br>" 
  291                           "Invisible input power pins are no longer required<br><br>" ) );
 
  292            aMessages.push_back( msg );
 
  299        wxString pinName = 
pin->GetName();
 
  301        if( pinName.IsEmpty() || pinName == 
"~" )
 
  304            pinName = 
"'" + pinName + 
"'";
 
  308                && !
pin->IsVisible() )
 
  315                    msg.Printf( 
_( 
"Info: <b>Hidden power pin %s</b> %s at location <b>(%s, %s)</b>" 
  316                                   " in %s body style." ),
 
  325                    msg.Printf( 
_( 
"Info: <b>Hidden power pin %s</b> %s at location <b>(%s, %s)</b>" 
  326                                   " in unit %c of %s body style." ),
 
  331                                'A' + 
pin->GetUnit() - 1,
 
  339                    msg.Printf( 
_( 
"Info: <b>Hidden power pin %s</b> %s at location <b>" 
  348                    msg.Printf( 
_( 
"Info: <b>Hidden power pin %s</b> %s at location <b>(%s, %s)</b>" 
  354                                'A' + 
pin->GetUnit() - 1 );
 
  358            msg += wxT( 
"<br>" );
 
  359            msg += 
_( 
"(Hidden power pins will drive their pin names on to any connected nets.)" );
 
  360            msg += wxT( 
"<br><br>" );
 
  361            aMessages.push_back( msg );
 
  364        if( ( (
pin->GetPosition().x % clamped_grid_size) != 0 )
 
  365                || ( (
pin->GetPosition().y % clamped_grid_size) != 0 ) )
 
  374                    msg.Printf( 
_( 
"<b>Off grid pin %s</b> %s at location <b>(%s, %s)</b>" 
  375                                   " of %s body style." ),
 
  384                    msg.Printf( 
_( 
"<b>Off grid pin %s</b> %s at location <b>(%s, %s)</b>" 
  385                                   " in unit %c of %s body style." ),
 
  390                                'A' + 
pin->GetUnit() - 1,
 
  398                    msg.Printf( 
_( 
"<b>Off grid pin %s</b> %s at location <b>(%s, %s)</b>." ),
 
  406                    msg.Printf( 
_( 
"<b>Off grid pin %s</b> %s at location <b>(%s, %s)</b>" 
  412                                'A' + 
pin->GetUnit() - 1 );
 
  416            msg += wxT( 
"<br><br>" );
 
  417            aMessages.push_back( msg );
 
 
virtual const wxString & GetText() const
Return the string associated with the text object.
 
void CheckLibSymbol(LIB_SYMBOL *aSymbol, std::vector< wxString > &aMessages, int aGridForPins, UNITS_PROVIDER *aUnitsProvider)
Check a library symbol to find incorrect settings.