45 std::vector<VARIANT_COMPAT_RESULT> results;
48 int candUnits = std::max( aCandidate.
GetUnitCount(), 1 );
50 if( candUnits < baseUnits )
54 result.detail = wxString::Format(
_(
"Candidate has %d unit(s), base requires %d" ),
55 candUnits, baseUnits );
56 results.push_back(
result );
65 result.detail = wxString::Format(
_(
"Candidate has %d body style(s), base requires %d" ),
67 results.push_back(
result );
72 std::vector<bool> matched( candidatePins.size(),
false );
74 for(
const SCH_PIN* basePin : basePins )
76 auto sameSlot = [&](
const SCH_PIN* aCandidatePin )
78 return basePin->GetNumber() == aCandidatePin->GetNumber()
79 && basePin->GetUnit() == aCandidatePin->GetUnit()
80 && basePin->GetBodyStyle() == aCandidatePin->GetBodyStyle();
83 auto findCandidate = [&](
bool aRequirePosition,
bool aRequireType )
85 for(
size_t i = 0; i < candidatePins.size(); ++i )
87 if( matched[i] || !sameSlot( candidatePins[i] ) )
90 if( aRequirePosition && candidatePins[i]->GetPosition() != basePin->GetPosition() )
93 if( aRequireType && candidatePins[i]->GetType() != basePin->GetType() )
99 return candidatePins.size();
102 size_t candidateIndex = findCandidate(
true,
true );
104 if( candidateIndex == candidatePins.size() )
105 candidateIndex = findCandidate(
true,
false );
107 if( candidateIndex == candidatePins.size() )
108 candidateIndex = findCandidate(
false,
false );
110 if( candidateIndex == candidatePins.size() )
114 result.pinNumber = basePin->GetNumber();
115 result.unit = basePin->GetUnit();
116 result.bodyStyle = basePin->GetBodyStyle();
117 result.detail = wxString::Format(
118 _(
"Unit %d, body style %d: pin '%s' not found in candidate" ),
120 results.push_back(
result );
124 matched[candidateIndex] =
true;
125 const SCH_PIN* candidatePin = candidatePins[candidateIndex];
127 if( candidatePin->
GetPosition() != basePin->GetPosition() )
131 result.pinNumber = basePin->GetNumber();
132 result.unit = basePin->GetUnit();
133 result.bodyStyle = basePin->GetBodyStyle();
134 result.detail = wxString::Format(
135 _(
"Unit %d, body style %d: pin '%s' position mismatch "
136 "(%d,%d) vs (%d,%d)" ),
138 basePin->GetPosition().x, basePin->GetPosition().y,
140 results.push_back(
result );
143 if( candidatePin->
GetType() != basePin->GetType() )
147 result.pinNumber = basePin->GetNumber();
148 result.unit = basePin->GetUnit();
149 result.bodyStyle = basePin->GetBodyStyle();
150 result.detail = wxString::Format(
151 _(
"Unit %d, body style %d: pin '%s' type mismatch ('%s' vs '%s')" ),
155 results.push_back(
result );
159 for(
size_t i = 0; i < candidatePins.size(); ++i )
163 const SCH_PIN* candidatePin = candidatePins[i];
169 result.detail = wxString::Format(
170 _(
"Unit %d, body style %d: candidate has extra pin '%s'" ),
172 results.push_back(
result );
std::vector< const SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
wxString result
Test unit parsing edge cases and error handling.