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.