95 t = m_symbol.GetTransform();
98 t = m_symbol.GetTransform();
101 t = m_symbol.GetTransform();
107 LoadSchematic( SchematicQAPath( wxS(
"component_classes" ) ) );
112 auto* candidate =
static_cast<SCH_SYMBOL*
>( item );
113 std::set<wxString> numbers;
115 for(
const auto&
pin : candidate->GetRawPins() )
116 numbers.insert(
pin->GetNumber() );
118 if( numbers.size() >= 3 && numbers.size() == candidate->GetRawPins().size() )
126 std::unique_ptr<SCH_SYMBOL> symbol(
static_cast<SCH_SYMBOL*
>( source->
Clone() ) );
127 auto& pins = symbol->GetRawPins();
128 const wxString number = pins.front()->GetNumber();
129 const size_t originalCount = pins.size();
130 pins.emplace_back(
static_cast<SCH_PIN*
>( pins.front()->Duplicate(
false ) ) );
133 const auto opposeAllocationOrder = [&]
135 std::sort( pins.begin(), pins.end(), [](
const auto& a,
const auto& b )
136 { return std::less<SCH_PIN*>{}( b.get(), a.get() ); } );
138 const auto numbered = [&](
const auto&
pin ) {
return pin->GetNumber() == number; };
139 opposeAllocationOrder();
140 const KIID expected = ( *std::find_if( pins.begin(), pins.end(), numbered ) )->m_Uuid;
141 symbol->UpdatePins();
144 for(
int pass = 0; pass < 2; ++pass )
146 const auto retained = std::find_if( pins.begin(), pins.end(), numbered );
148 BOOST_CHECK( ( *retained )->m_Uuid ==
expected );
149 symbol->UpdatePins();
152 opposeAllocationOrder();
153 const auto libraryPins = symbol->GetLibSymbolRef()->GetPins();
154 BOOST_REQUIRE_EQUAL( libraryPins.size(), pins.size() );
155 const wxString commonNumber = libraryPins.front()->GetNumber();
156 std::map<const SCH_PIN*, KIID> expectedMapping;
158 for(
size_t i = 0; i < pins.size(); ++i )
160 expectedMapping.emplace( libraryPins[i], pins[i]->m_Uuid );
161 pins[i]->SetNumber( commonNumber );
165 symbol->UpdatePins();
166 BOOST_REQUIRE_EQUAL( pins.size(), originalCount );
168 for(
const auto&
pin : pins )
171 BOOST_CHECK(
pin->m_Uuid == expectedMapping.at(
pin->GetLibPin() ) );
183 fn.AppendDir( wxS(
"variant_test" ) );
184 fn.SetName( wxS(
"variant_test" ) );
190 BOOST_CHECK( symbol );
193 wxString variantName = wxS(
"Variant1" );
194 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
195 BOOST_CHECK( !variant );
198 BOOST_CHECK( !symbol->
GetDNP() );
199 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
200 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], variantName ) );
205 BOOST_CHECK( symbol->
GetExcludedFromBOM( &m_schematic->Hierarchy()[0], variantName ) );
210 BOOST_CHECK( symbol->
GetExcludedFromSim( &m_schematic->Hierarchy()[0], variantName ) );
241 fn.AppendDir( wxS(
"variant_test" ) );
242 fn.SetName( wxS(
"variant_test" ) );
250 wxString newFieldName = wxS(
"Sim.Library" );
254 BOOST_CHECK( existing ==
nullptr );
258 newField.
SetText( wxS(
"test_model.lib" ) );
266 BOOST_CHECK( addedField->
GetParent() == symbol );
271 BOOST_CHECK( found->
GetText() == wxS(
"test_model.lib" ) );
285 LoadSchematic( SchematicQAPath( wxS(
"component_classes" ) ) );
298 if( candidate->
GetRef( &sheet,
false ) == wxS(
"U1" )
309 [](
const std::vector<SCH_PIN*>& aPins )
311 std::set<wxString> numbers;
314 numbers.insert(
pin->GetNumber() );
319 const std::set<wxString> unitAPins = { wxS(
"1" ), wxS(
"2" ), wxS(
"3" ) };
320 const std::set<wxString> unitBPins = { wxS(
"5" ), wxS(
"6" ), wxS(
"7" ) };
324 BOOST_CHECK( pinNumbers( symbol->
GetLibPins() ) == unitAPins );
326 std::unique_ptr<SCH_SYMBOL> undoImage(
static_cast<SCH_SYMBOL*
>( symbol->
Clone() ) );
333 BOOST_CHECK( pinNumbers( symbol->
GetLibPins() ) == unitBPins );
340 BOOST_CHECK( pinNumbers( symbol->
GetLibPins() ) == unitAPins );
344 BOOST_CHECK( pinNumbers( undoImage->GetLibPins() ) == unitBPins );
364 fn.AppendDir( wxS(
"variant_test" ) );
365 fn.SetName( wxS(
"variant_test" ) );
375 wxString variantName = wxS(
"DialogTest" );
378 BOOST_CHECK( !symbol->
GetDNP() );
390 symbol->
SetDNP(
true, &sheet, variantName );
393 BOOST_CHECK( symbol->
GetDNP( &sheet, variantName ) );
400 BOOST_CHECK( !symbol->
GetDNP() );
414 fn.AppendDir( wxS(
"variant_test" ) );
415 fn.SetName( wxS(
"variant_test" ) );
421 wxString variantName = wxS(
"TestVariant" );
422 wxString description = wxS(
"This is a test variant description" );
425 m_schematic->AddVariant( variantName );
426 BOOST_CHECK( m_schematic->GetVariantNames().contains( variantName ) );
429 m_schematic->SetVariantDescription( variantName, description );
430 BOOST_CHECK_EQUAL( m_schematic->GetVariantDescription( variantName ), description );
433 BOOST_CHECK( m_schematic->GetVariantDescription( wxS(
"NonExistent" ) ).IsEmpty() );
436 m_schematic->SetVariantDescription( variantName, wxEmptyString );
437 BOOST_CHECK( m_schematic->GetVariantDescription( variantName ).IsEmpty() );
448 fn.AppendDir( wxS(
"variant_test" ) );
449 fn.SetName( wxS(
"variant_test" ) );
455 wxString variantName = wxS(
"MilitaryGrade" );
458 m_schematic->AddVariant( variantName );
459 m_schematic->SetCurrentVariant( variantName );
462 wxString token = wxS(
"VARIANT" );
463 bool resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
464 BOOST_CHECK( resolved );
468 token = wxS(
"VARIANTNAME" );
469 resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
470 BOOST_CHECK( resolved );
474 m_schematic->SetCurrentVariant( wxEmptyString );
475 token = wxS(
"VARIANT" );
476 resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
477 BOOST_CHECK( resolved );
478 BOOST_CHECK( token.IsEmpty() );
489 fn.AppendDir( wxS(
"variant_test" ) );
490 fn.SetName( wxS(
"variant_test" ) );
496 wxString variantName = wxS(
"IndustrialVariant" );
497 wxString description = wxS(
"Industrial temperature range components" );
500 m_schematic->AddVariant( variantName );
501 m_schematic->SetVariantDescription( variantName, description );
502 m_schematic->SetCurrentVariant( variantName );
505 wxString token = wxS(
"VARIANT_DESC" );
506 bool resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
507 BOOST_CHECK( resolved );
511 m_schematic->SetVariantDescription( variantName, wxEmptyString );
512 token = wxS(
"VARIANT_DESC" );
513 resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
514 BOOST_CHECK( resolved );
515 BOOST_CHECK( token.IsEmpty() );
526 fn.AppendDir( wxS(
"variant_test" ) );
527 fn.SetName( wxS(
"variant_test" ) );
536 wxString oldName = wxS(
"OriginalVariant" );
537 wxString newName = wxS(
"RenamedVariant" );
538 wxString description = wxS(
"Original description" );
541 m_schematic->AddVariant( oldName );
542 m_schematic->SetVariantDescription( oldName, description );
543 m_schematic->SetCurrentVariant( oldName );
546 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], oldName );
550 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], oldName ) );
552 INTERNAL, oldName ), wxS(
"100K" ) );
555 m_schematic->RenameVariant( oldName, newName );
558 BOOST_CHECK( !m_schematic->GetVariantNames().contains( oldName ) );
561 BOOST_CHECK( m_schematic->GetVariantNames().contains( newName ) );
570 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], newName ) );
572 INTERNAL, newName ), wxS(
"100K" ) );
583 fn.AppendDir( wxS(
"variant_test" ) );
584 fn.SetName( wxS(
"variant_test" ) );
593 wxString sourceVariant = wxS(
"SourceVariant" );
594 wxString copyVariant = wxS(
"CopiedVariant" );
595 wxString description = wxS(
"Source description" );
598 m_schematic->AddVariant( sourceVariant );
599 m_schematic->SetVariantDescription( sourceVariant, description );
602 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], sourceVariant );
609 m_schematic->CopyVariant( sourceVariant, copyVariant );
612 BOOST_CHECK( m_schematic->GetVariantNames().contains( sourceVariant ) );
613 BOOST_CHECK( m_schematic->GetVariantNames().contains( copyVariant ) );
616 BOOST_CHECK_EQUAL( m_schematic->GetVariantDescription( copyVariant ), description );
619 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], copyVariant ) );
620 BOOST_CHECK( symbol->
GetExcludedFromBOM( &m_schematic->Hierarchy()[0], copyVariant ) );
624 INTERNAL, copyVariant ), wxS(
"47K" ) );
627 symbol->
SetDNP(
false, &m_schematic->Hierarchy()[0], copyVariant );
631 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], sourceVariant ) );
633 INTERNAL, sourceVariant ), wxS(
"47K" ) );
636 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], copyVariant ) );
638 INTERNAL, copyVariant ), wxS(
"100K" ) );
649 fn.AppendDir( wxS(
"variant_test" ) );
650 fn.SetName( wxS(
"variant_test" ) );
659 wxString variantName1 = wxS(
"DiffTestVariant1" );
660 wxString variantName2 = wxS(
"DiffTestVariant2" );
668 m_schematic->AddVariant( variantName1 );
677 BOOST_CHECK( defaultValue != variantValue );
680 m_schematic->AddVariant( variantName2 );
697 fn.AppendDir( wxS(
"variant_test" ) );
698 fn.SetName( wxS(
"variant_test" ) );
707 wxString variantName = wxS(
"DNPVariant" );
710 BOOST_CHECK( !symbol->
GetDNP() );
711 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], wxEmptyString ) );
714 m_schematic->AddVariant( variantName );
715 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
718 BOOST_CHECK( !symbol->
GetDNP() );
719 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], wxEmptyString ) );
722 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], variantName ) );
727 BOOST_CHECK( symbol->
GetExcludedFromBOM( &m_schematic->Hierarchy()[0], variantName ) );
728 BOOST_CHECK( !symbol->
GetExcludedFromBOM( &m_schematic->Hierarchy()[0], wxEmptyString ) );
751 fn.AppendDir( wxS(
"variant_test" ) );
752 fn.SetName( wxS(
"variant_test" ) );
759 m_schematic->AddVariant( wxS(
"Zebra" ) );
760 m_schematic->AddVariant( wxS(
"Alpha" ) );
761 m_schematic->AddVariant( wxS(
"Beta" ) );
763 wxArrayString variantNames = m_schematic->GetVariantNamesForUI();
766 BOOST_CHECK( variantNames.GetCount() >= 4 );
770 BOOST_CHECK( !variantNames[0].IsEmpty() );
774 bool foundAlpha =
false;
775 bool foundBeta =
false;
776 bool foundZebra =
false;
778 for(
size_t i = 1; i < variantNames.GetCount(); i++ )
780 if( variantNames[i] == wxS(
"Alpha" ) )
782 else if( variantNames[i] == wxS(
"Beta" ) )
784 else if( variantNames[i] == wxS(
"Zebra" ) )
788 BOOST_CHECK( foundAlpha );
789 BOOST_CHECK( foundBeta );
790 BOOST_CHECK( foundZebra );
803 fn.AppendDir( wxS(
"variant_test" ) );
804 fn.SetName( wxS(
"variant_test" ) );
813 wxString variantName = wxS(
"PersistenceTest" );
814 wxString newValue = wxS(
"4.7K" );
818 m_schematic->AddVariant( variantName );
821 symbol->
SetValueFieldText( newValue, &m_schematic->Hierarchy()[0], variantName );
824 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
828 BOOST_CHECK( variant->m_Fields.contains( fieldName ) );
832 wxString retrievedValue = symbol->
GetValue( &m_schematic->Hierarchy()[0],
RAW_VALUE, variantName );
836 wxString retrievedDefault = symbol->
GetValue( &m_schematic->Hierarchy()[0],
RAW_VALUE, wxEmptyString );
848 fn.AppendDir( wxS(
"variant_test" ) );
849 fn.SetName( wxS(
"variant_test" ) );
858 wxString variantName1 = wxS(
"MethodTest1" );
859 wxString variantName2 = wxS(
"MethodTest2" );
860 wxString value1 = wxS(
"10K" );
861 wxString value2 = wxS(
"22K" );
864 m_schematic->AddVariant( variantName1 );
865 m_schematic->AddVariant( variantName2 );
871 symbol->
SetFieldText( fieldName, value2, &m_schematic->Hierarchy()[0], variantName2 );
874 std::optional<SCH_SYMBOL_VARIANT> variant1 = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName1 );
875 std::optional<SCH_SYMBOL_VARIANT> variant2 = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName2 );
880 BOOST_CHECK( variant1->m_Fields.contains( fieldName ) );
881 BOOST_CHECK( variant2->m_Fields.contains( fieldName ) );
904 fn.AppendDir( wxS(
"variant_test" ) );
905 fn.SetName( wxS(
"variant_test" ) );
914 wxString variantName = wxS(
"ProductionVariant" );
917 m_schematic->AddVariant( variantName );
920 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
923 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], wxS(
"ProductionVariant" ) ) );
926 BOOST_CHECK( m_schematic->GetVariantNames().contains( wxS(
"ProductionVariant" ) ) );
929 m_schematic->SetCurrentVariant( variantName );
933 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], wxS(
"NonExistentVariant" ) ) );
944 fn.AppendDir( wxS(
"variant_test" ) );
945 fn.SetName( wxS(
"variant_test" ) );
954 wxString variantName = wxS(
"DeleteMe" );
957 m_schematic->AddVariant( variantName );
958 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
962 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], variantName ) );
963 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
964 BOOST_CHECK( variant.has_value() );
967 m_schematic->DeleteVariant( variantName );
970 BOOST_CHECK( !m_schematic->GetVariantNames().contains( variantName ) );
973 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], variantName ) );
984 fn.AppendDir( wxS(
"variant_test" ) );
985 fn.SetName( wxS(
"variant_test" ) );
994 wxString variantName = wxS(
"UnicodeTest" );
995 m_schematic->AddVariant( variantName );
998 wxString unicodeValue = wxS(
"1kΩ ±5% 日本語" );
1006 wxString specialChars = wxS(
"R<1K>\"test\"'value'" );
1015 BOOST_CHECK( retrieved.IsEmpty() );
1018 wxString unicodeDesc = wxS(
"Variante für Produktion — 测试" );
1019 m_schematic->SetVariantDescription( variantName, unicodeDesc );
1020 BOOST_CHECK_EQUAL( m_schematic->GetVariantDescription( variantName ), unicodeDesc );
1031 fn.AppendDir( wxS(
"variant_test" ) );
1032 fn.SetName( wxS(
"variant_test" ) );
1041 wxString variantName = wxS(
"MilitaryGrade" );
1042 wxString variantValue = wxS(
"1K-MIL" );
1043 wxString defaultValue = wxS(
"1K" );
1046 m_schematic->AddVariant( variantName );
1048 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
1055 wxString symbolRef = symbol->
GetRef( &m_schematic->Hierarchy()[0],
false );
1058 wxString token = symbolRef + wxS(
":VALUE:" ) + variantName;
1059 bool resolved = m_schematic->ResolveCrossReference( &token, 0 );
1060 BOOST_CHECK( resolved );
1064 token = symbolRef + wxS(
":VALUE" );
1065 resolved = m_schematic->ResolveCrossReference( &token, 0 );
1066 BOOST_CHECK( resolved );
1070 token = symbolRef + wxS(
":VALUE:NonExistentVariant" );
1071 resolved = m_schematic->ResolveCrossReference( &token, 0 );
1072 BOOST_CHECK( resolved );
1076 token = wxS(
"VALUE" );
1077 resolved = symbol->
ResolveTextVar( &m_schematic->Hierarchy()[0], &token, variantName, 0 );
1078 BOOST_CHECK( resolved );
1082 m_schematic->SetCurrentVariant( variantName );
1083 token = wxS(
"VALUE" );
1084 resolved = symbol->
ResolveTextVar( &m_schematic->Hierarchy()[0], &token, wxEmptyString, 0 );
1085 BOOST_CHECK( resolved );
1089 token = wxS(
"DNP" );
1090 resolved = symbol->
ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
1091 BOOST_CHECK( resolved );
1095 token = wxS(
"DNP" );
1096 resolved = symbol->
ResolveTextVar( &m_schematic->Hierarchy()[0], &token, wxEmptyString, 0 );
1097 BOOST_CHECK( resolved );
1111 fn.AppendDir( wxS(
"variant_test" ) );
1112 fn.SetName( wxS(
"variant_test" ) );
1121 wxString variantName = wxS(
"FootprintVariant" );
1122 wxString baseFootprint = wxS(
"Resistor_SMD:R_0805_2012Metric" );
1123 wxString variantFootprint = wxS(
"Resistor_SMD:R_0402_1005Metric" );
1131 m_schematic->AddVariant( variantName );
1134 symbol->
SetFieldText( fieldName, variantFootprint, &m_schematic->Hierarchy()[0], variantName );
1141 wxString retrievedDefault = symbol->
GetFieldText( fieldName, &m_schematic->Hierarchy()[0], wxEmptyString );
1145 wxString retrievedVariant = symbol->
GetFieldText( fieldName, &m_schematic->Hierarchy()[0], variantName );
1149 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
1151 BOOST_CHECK( variant->m_Fields.contains( fieldName ) );
1164 fn.AppendDir( wxS(
"variant_test" ) );
1165 fn.SetName( wxS(
"variant_test" ) );
1174 wxString variantName = wxS(
"NoOpTest" );
1175 wxString baseFootprint = wxS(
"Resistor_SMD:R_0805_2012Metric" );
1182 m_schematic->AddVariant( variantName );
1185 symbol->
SetFieldText( fieldName, baseFootprint, &m_schematic->Hierarchy()[0], variantName );
1188 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
1191 if( variant.has_value() )
1193 BOOST_CHECK( !variant->m_Fields.contains( fieldName ) );
1206 fn.AppendDir( wxS(
"variant_test" ) );
1207 fn.SetName( wxS(
"variant_test" ) );
1214 m_schematic->SetCurrentSheet( m_schematic->Hierarchy()[0] );
1222 wxString variantName = wxS(
"BboxVariant" );
1223 wxString shortFp = wxS(
"R_0402" );
1224 wxString longFp = wxS(
"Resistor_SMD:R_2512_6332Metric_Pad1.52x3.35mm_HandSolder" );
1230 m_schematic->AddVariant( variantName );
1231 symbol->
SetFieldText( fpField->
GetName(), longFp, &m_schematic->Hierarchy()[0], variantName );
1234 wxString resolvedDefault = fpField->
GetShownText( &m_schematic->Hierarchy()[0],
INTERNAL, wxEmptyString );
1235 wxString resolvedVariant = fpField->
GetShownText( &m_schematic->Hierarchy()[0],
INTERNAL, variantName );
1240 m_schematic->SetCurrentVariant( wxEmptyString );
1243 m_schematic->SetCurrentVariant( variantName );
1250 m_schematic->SetCurrentVariant( wxEmptyString );
1256 m_schematic->SetCurrentVariant( variantName );
1264 m_schematic->SetCurrentVariant( wxEmptyString );
1284 fn.AppendDir( wxS(
"variant_test" ) );
1285 fn.SetName( wxS(
"variant_test" ) );
1303 BOOST_CHECK( !defaultVariant.
m_DNP );
1313 BOOST_CHECK_MESSAGE( initializedVariant.
m_DNP,
1314 "InitializeAttributes should copy DNP from symbol" );
1316 "InitializeAttributes should copy ExcludedFromBOM from symbol" );
1318 "InitializeAttributes should copy ExcludedFromSim from symbol" );
1320 "InitializeAttributes should copy ExcludedFromBoard from symbol" );
1322 "InitializeAttributes should copy ExcludedFromPosFiles from symbol" );
1346 customField.
SetText( wxS(
"aayyxx" ) );
1357 BOOST_CHECK( custom->
Matches( data, &sheetPath ) );
1358 BOOST_CHECK( !symbol.
Matches( data, &sheetPath ) );
1364 BOOST_CHECK( !symbol.
Matches( data, &sheetPath ) );
1375 BOOST_CHECK( symbol.
Matches( data, &sheetPath ) );
1379 BOOST_CHECK( !symbol.
Matches( data, &sheetPath ) );
1389 fn.AppendDir( wxS(
"variant_test" ) );
1390 fn.
SetName( wxS(
"variant_test" ) );
1410 BOOST_REQUIRE_EQUAL( owned.model.GetPinCount(), 2 );
1411 BOOST_REQUIRE_EQUAL( live.model.GetPinCount(), 2 );
1412 BOOST_CHECK_EQUAL( owned.model.GetPin( 0 ).symbolPinNumber, wxString(
"999" ) );
1416 wxString token = wxS(
"OP:2" );
1420 token = wxS(
"OP:999" );
1429 auto symbols = m_schematic->Hierarchy().front().LastScreen()->Items().OfType(
SCH_SYMBOL_T );
1442 mutable unsigned boundsReads = 0;
1445 COUNTED_SYMBOL item( *
static_cast<SCH_SYMBOL*
>( *symbols.begin() ) );
1446 COUNTED_SYMBOL
copy( item );
1449 item.boundsReads = 0;
1450 copy.boundsReads = 0;
1451 BOOST_CHECK( tree.
contains( &item,
true ) );
1455 item.Move(
VECTOR2I( 100000000, 100000000 ) );
1456 BOOST_CHECK( tree.
contains( &item,
true ) );
1461 BOOST_CHECK( tree.
contains( &item,
true ) );
1463 BOOST_CHECK( !tree.
contains( &item,
true ) );
1464 BOOST_CHECK( !tree.
remove( &item ) );
1467 BOOST_CHECK(
moved.contains( &
copy,
true ) );
1470 tree = std::move(
moved );
1472 BOOST_CHECK( !tree.
contains( &item,
true ) );
1473 BOOST_CHECK( !
moved.contains( &
copy,
true ) );
1477 BOOST_CHECK( tree.
contains( &item,
true ) );
1484 std::unique_ptr<SCHEMATIC> schematic;
1486 BOOST_REQUIRE_GT( schematic->Hierarchy().size(), 1 );
1487 size_t differentReferences = 0;
1493 auto* symbol =
static_cast<SCH_SYMBOL*
>( item );
1498 if( current.LastScreen() !=
path.LastScreen() )
1501 schematic->SetCurrentSheet( current );
1502 differentReferences += symbol->GetRef( ¤t ) !=
expected;
1503 wxString token(
"PROPERTY.Reference" );
1510 BOOST_CHECK_GT( differentReferences, 0 );
constexpr size_type GetWidth() const
EDA_ITEM * GetParent() const
virtual void SetParent(EDA_ITEM *aParent)
BOX2I GetTextBox(const RENDER_SETTINGS *aSettings, int aLine=-1) const
Useful in multiline texts to calculate the full text or a line area (for zones filling,...
virtual void SetVisible(bool aVisible)
virtual void ClearBoundingBoxCache()
Implement an R-tree for fast spatial and type indexing of schematic items.
bool remove(SCH_ITEM *aItem)
Remove an item from the tree.
void insert(SCH_ITEM *aItem)
Insert an item into the tree.
bool contains(const SCH_ITEM *aItem, bool aRobust=false) const
Determine if a given item exists in the tree.
EE_TYPE OfType(KICAD_T aType) const
void clear()
Remove all items from the RTree.
A generic fixture for loading schematics and associated settings for qa tests.
std::unique_ptr< SCHEMATIC > m_schematic
Define a library symbol object.
const LIB_ID & GetLibId() const override
void SetDescription(const wxString &aDescription)
Gets the Description field text value */.
SCH_FIELD & GetValueField()
Return reference to the value field.
virtual void SetName(const wxString &aName)
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
virtual const wxString & GetText() const override
Return the string associated with the text object.
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
wxString GetShownText(const SCH_SHEET_PATH *aPath, RESOLUTION_CONTEXT aContext, const wxString &aVariantName=wxEmptyString, int aDepth=0) const
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetText(const wxString &aText) override
Base class for any item which can be embedded within the SCHEMATIC container class,...
virtual void SetUnit(int aUnit)
void SwapItemData(SCH_ITEM *aImage)
Swap data between aItem and aImage.
EE_RTREE & Items()
Get the full RTree, usually for iterating.
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Variant information for a schematic symbol.
void InitializeAttributes(const SCH_SYMBOL &aSymbol)
bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
virtual void SetDNP(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
void SetFieldText(const wxString &aFieldName, const wxString &aFieldText, const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString)
wxString GetFieldText(const wxString &aFieldName, const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString) const
void SetExcludedFromSim(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear the exclude from simulation flag.
const wxString GetFootprintFieldText(const SCH_SHEET_PATH *aPath, RESOLUTION_CONTEXT aContext, const wxString &aVariantName=wxEmptyString) const
std::optional< SCH_SYMBOL_VARIANT > GetVariant(const SCH_SHEET_PATH &aInstance, const wxString &aVariantName) const
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
bool GetExcludedFromBOM(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
void UpdatePins()
Updates the cache of SCH_PIN objects for each pin.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void SetFootprintFieldText(const wxString &aFootprint)
void SetExcludedFromPosFiles(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
void SetValueFieldText(const wxString &aValue, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString)
std::vector< SCH_PIN * > GetLibPins() const
Populate a vector with all the pins from the library object that match the current unit and bodyStyle...
bool GetExcludedFromPosFiles(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
bool GetExcludedFromBoard(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
const wxString GetValue(const SCH_SHEET_PATH *aPath, RESOLUTION_CONTEXT aContext, const wxString &aVariantName=wxEmptyString) const override
int GetUnitSelection(const SCH_SHEET_PATH *aSheet) const
Return the instance-specific unit selection for the given sheet path.
SCH_PIN * GetPin(const wxString &number) const
Find a symbol pin by number.
void SetUnitSelection(const SCH_SHEET_PATH *aSheet, int aUnitSelection)
Set the selected unit of this symbol on one sheet.
void SetExcludedFromBOM(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear the exclude from schematic bill of materials flag.
virtual bool GetDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
Set or clear the 'Do Not Populate' flag.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
void SetExcludedFromBoard(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
SIM_MODEL & CreateModel(SIM_MODEL::TYPE aType, std::span< const wxString > aPins, REPORTER &aReporter)
static SIM_MODEL_INPUT CaptureModelInput(const SCH_SHEET_PATH *aSheetPath, const SCH_SYMBOL &aSymbol, int aDepth, const wxString &aVariantName, const wxString &aMergedSimPins=wxEmptyString)
Resolve instance fields once; editors use the field-based overloads for unresolved input.
SCH_SYMBOL * GetFirstSymbol()
SCH_SYMBOL object with no extra data set.
bool m_ExcludedFromPosFiles
A wrapper for reporting to a wxString object.
static const std::string KiCadSchematicFileExtension
void LoadSchematic(SETTINGS_MANAGER &aSettingsManager, const wxString &aRelPath, std::unique_ptr< SCHEMATIC > &aSchematic)
std::string GetEeschemaTestDataDir()
Get the configured location of Eeschema test data.
void SetFieldValue(std::vector< SCH_FIELD > &aFields, const wxString &aFieldName, const std::string &aValue, bool aIsVisible=true, const SCH_SHEET_PATH *aSheetPath=nullptr, const wxString &aVariantName=wxEmptyString)
static void LoadSchematic(SCHEMATIC *aSchematic, SCH_SHEET *aRootSheet, const wxString &aFileName)
EDA_SEARCH_MATCH_MODE matchMode
@ USER
The field ID hasn't been set yet; field is invalid.
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_REQUIRE(intersection.has_value()==c.ExpectedIntersection.has_value())
BOOST_AUTO_TEST_SUITE_END()
IbisParser parser & reporter
VECTOR3I expected(15, 30, 45)
BOOST_AUTO_TEST_CASE(DefaultProperties)
Declare the test suite.
BOOST_CHECK_EQUAL(result, "25.4")
VECTOR2< int32_t > VECTOR2I
Definition of file extensions used in Kicad.