151 std::vector<SCH_PIN*> pins;
153 for(
SCH_ITEM& item : symbol->GetDrawItems() )
156 pins.push_back(
static_cast<SCH_PIN*
>( &item ) );
159 BOOST_REQUIRE_EQUAL( pins.size(), 2 );
162 std::vector<TRANSFORM> rotations = {
169 std::vector<wxString> rotationNames = { wxT(
"0°"), wxT(
"90°"), wxT(
"180°"), wxT(
"270°") };
171 for(
size_t r = 0; r < rotations.size(); r++ )
173 const TRANSFORM& transform = rotations[r];
174 const wxString& rotName = rotationNames[r];
180 for(
size_t p = 0; p < pins.size(); p++ )
188 std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> numberInfoOpt = cache.
GetPinNumberInfo( 0 );
190 if( !numberInfoOpt.has_value() )
195 if( numberInfo.
m_Text.IsEmpty() )
208 if( numberInfo.
m_Text.Contains(
'\n' ) )
216 int lineSpacing = textHeight * 1.3;
217 textWidth = lines.size() * lineSpacing;
221 for(
const wxString& line : lines )
222 maxLen = std::max( maxLen, line.Length() );
224 textHeight = maxLen * textHeight * 0.6;
229 int lineSpacing = textHeight * 1.3;
230 textHeight = lines.size() * lineSpacing;
234 for(
const wxString& line : lines )
235 maxLen = std::max( maxLen, line.Length() );
237 textWidth = maxLen * textHeight * 0.6;
245 textBbox.
SetSize( textWidth, textHeight );
251 wxLogTrace(
"KICAD_PINS", wxT(
"Rotation %s, Pin %s: pos=(%d,%d) textPos=(%d,%d) pinLine=(%d,%d)-(%d,%d) textBox=(%d,%d,%dx%d) overlap=%s"),
252 rotName,
pin->GetNumber(),
253 pinStart.
x, pinStart.
y,
255 pinStart.
x, pinStart.
y, pinEnd.
x, pinEnd.
y,
257 overlaps ? wxT(
"YES") : wxT(
"NO") );
261 "Pin number '" <<
pin->GetNumber() <<
"' overlaps with pin geometry at rotation " << rotName );
280 std::vector<SCH_PIN*> pins;
282 for(
SCH_ITEM& item : symbol->GetDrawItems() )
285 pins.push_back(
static_cast<SCH_PIN*
>( &item ) );
288 BOOST_REQUIRE_EQUAL( pins.size(), 2 );
291 std::vector<TRANSFORM> rotations = {
298 std::vector<wxString> rotationNames = { wxT(
"0°"), wxT(
"90°"), wxT(
"180°"), wxT(
"270°") };
300 for(
size_t r = 0; r < rotations.size(); r++ )
302 const TRANSFORM& transform = rotations[r];
303 const wxString& rotName = rotationNames[r];
318 std::vector<PinTextInfo> pinInfos;
323 info.pinPos =
pin->GetPosition();
324 info.pinNumber =
pin->GetNumber();
330 std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> numberInfoOpt = cache.
GetPinNumberInfo( 0 );
332 if( numberInfoOpt.has_value() )
336 info.isMultiline = numberInfo.
m_Text.Contains(
'\n' );
340 std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> nameInfoOpt = cache.
GetPinNameInfo( 0 );
342 if( nameInfoOpt.has_value() )
348 pinInfos.push_back(
info );
350 wxLogTrace(
"KICAD_PINS",
"Rotation %s, Pin %s: pos=(%d,%d) numberPos=(%d,%d) namePos=(%d,%d) multiline=%s",
351 rotName,
info.pinNumber,
355 info.isMultiline ? wxT(
"YES") : wxT(
"NO") );
358 BOOST_REQUIRE_EQUAL( pinInfos.size(), 2 );
367 for(
const PinTextInfo& inf : pinInfos )
370 "At rotation " << rotName <<
", number for pin " << inf.pinNumber <<
" not right of vertical pin." );
372 "At rotation " << rotName <<
", name for pin " << inf.pinNumber <<
" not left of vertical pin." );
377 for(
const PinTextInfo& inf : pinInfos )
380 "At rotation " << rotName <<
", number for pin " << inf.pinNumber <<
" not below horizontal pin." );
382 "At rotation " << rotName <<
", name for pin " << inf.pinNumber <<
" not above horizontal pin." );
402 std::vector<SCH_PIN*> pins;
404 for(
SCH_ITEM& item : symbol->GetDrawItems() )
407 pins.push_back(
static_cast<SCH_PIN*
>( &item ) );
410 BOOST_REQUIRE_EQUAL( pins.size(), 2 );
413 std::vector<TRANSFORM> rotations = {
420 std::vector<wxString> rotationNames = { wxT(
"0°"), wxT(
"90°"), wxT(
"180°"), wxT(
"270°") };
422 for(
size_t r = 0; r < rotations.size(); r++ )
424 const TRANSFORM& transform = rotations[r];
425 const wxString& rotName = rotationNames[r];
438 int numberBottomDistance;
439 int nameBottomDistance;
442 std::vector<PinTextData> pinData;
447 data.pinPos =
pin->GetPosition();
448 data.pinNumber =
pin->GetNumber();
454 std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> numberInfoOpt = cache.
GetPinNumberInfo( 0 );
457 if( numberInfoOpt.has_value() )
459 numberInfo = numberInfoOpt.value();
461 data.isMultiline = numberInfo.
m_Text.Contains(
'\n' );
465 BOOST_FAIL(
"Expected pin number text info" );
469 std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> nameInfoOpt = cache.
GetPinNameInfo( 0 );
472 if( nameInfoOpt.has_value() )
474 nameInfo = nameInfoOpt.value();
479 BOOST_FAIL(
"Expected pin name text info" );
489 int textWidth = data.isMultiline ? 0 : (int)( data.pinNumber.Length() * numberInfo.
m_TextSize * 0.6 );
492 if( data.isMultiline )
495 int lineSpacing = numberInfo.
m_TextSize * 1.3;
496 textWidth = lines.size() * lineSpacing;
500 int leftEdge = data.numberPos.x - textWidth / 2;
501 data.numberBottomDistance = leftEdge - data.pinPos.x;
504 int nameWidth = (int)( nameInfo.
m_Text.Length() * nameInfo.
m_TextSize * 0.6 );
505 int nameRightEdge = data.namePos.x + nameWidth / 2;
506 data.nameBottomDistance = data.pinPos.x - nameRightEdge;
512 int textHeight = data.isMultiline ? 0 : numberInfo.
m_TextSize;
514 if( data.isMultiline )
518 int lineSpacing = numberInfo.
m_TextSize * 1.3;
519 textHeight = lines.size() * lineSpacing;
523 int topEdge = data.numberPos.y - textHeight / 2;
524 data.numberBottomDistance = topEdge - data.pinPos.y;
528 int nameBottomEdge = data.namePos.y + nameHeight / 2;
529 data.nameBottomDistance = data.pinPos.y - nameBottomEdge;
532 pinData.push_back( data );
534 wxLogTrace(
"KICAD_PINS",
"Rotation %s, Pin %s: pos=(%d,%d) numberPos=(%d,%d) namePos=(%d,%d) multiline=%s numberBottomDist=%d nameBottomDist=%d",
535 rotName, data.pinNumber,
536 data.pinPos.x, data.pinPos.y,
537 data.numberPos.x, data.numberPos.y,
538 data.namePos.x, data.namePos.y,
539 data.isMultiline ? wxT(
"YES") : wxT(
"NO"),
540 data.numberBottomDistance, data.nameBottomDistance );
543 BOOST_REQUIRE_EQUAL( pinData.size(), 2 );
547 const int tolerance = 100;
549 int bottomDist1 = pinData[0].numberBottomDistance;
550 int bottomDist2 = pinData[1].numberBottomDistance;
551 int distanceDiff = abs( bottomDist1 - bottomDist2 );
554 "At rotation " << rotName <<
", pin numbers have different bottom distances from pin. "
555 <<
"Pin " << pinData[0].pinNumber <<
" distance=" << bottomDist1
556 <<
", Pin " << pinData[1].pinNumber <<
" distance=" << bottomDist2
557 <<
", difference=" << distanceDiff <<
" (tolerance=" << tolerance <<
")" );
560 int nameBottomDist1 = pinData[0].nameBottomDistance;
561 int nameBottomDist2 = pinData[1].nameBottomDistance;
562 int nameDistanceDiff = abs( nameBottomDist1 - nameBottomDist2 );
565 "At rotation " << rotName <<
", pin names have different bottom distances from pin. "
566 <<
"Pin " << pinData[0].pinNumber <<
" name distance=" << nameBottomDist1
567 <<
", Pin " << pinData[1].pinNumber <<
" name distance=" << nameBottomDist2
568 <<
", difference=" << nameDistanceDiff <<
" (tolerance=" << tolerance <<
")" );