91 t = m_symbol.GetTransform();
94 t = m_symbol.GetTransform();
97 t = m_symbol.GetTransform();
103 LoadSchematic( SchematicQAPath( wxS(
"component_classes" ) ) );
108 auto* candidate =
static_cast<SCH_SYMBOL*
>( item );
109 std::set<wxString> numbers;
111 for(
const auto&
pin : candidate->GetRawPins() )
112 numbers.insert(
pin->GetNumber() );
114 if( numbers.size() >= 3 && numbers.size() == candidate->GetRawPins().size() )
122 std::unique_ptr<SCH_SYMBOL> symbol(
static_cast<SCH_SYMBOL*
>(
source->Clone() ) );
123 std::vector<std::unique_ptr<SCH_PIN>>& pins = symbol->GetRawPins();
124 const wxString number = pins.front()->GetNumber();
125 const size_t originalCount = pins.size();
126 pins.emplace_back(
static_cast<SCH_PIN*
>( pins.front()->Duplicate(
false ) ) );
129 const auto opposeAllocationOrder =
132 std::sort( pins.begin(), pins.end(), [](
const auto& a,
const auto& b )
133 { return std::less<SCH_PIN*>{}( b.get(), a.get() ); } );
136 const auto numbered =
137 [&](
const auto&
pin )
139 return pin->GetNumber() == number;
142 opposeAllocationOrder();
143 const KIID expected = ( *std::find_if( pins.begin(), pins.end(), numbered ) )->m_Uuid;
144 symbol->UpdatePins();
147 for(
int pass = 0; pass < 2; ++pass )
149 const auto retained = std::find_if( pins.begin(), pins.end(), numbered );
151 BOOST_CHECK( ( *retained )->m_Uuid ==
expected );
152 symbol->UpdatePins();
155 opposeAllocationOrder();
156 const std::vector<SCH_PIN*> libraryPins = symbol->GetLibSymbolRef()->GetGraphicalPins(
ALL_UNITS,
ALL_BODY_STYLES );
157 BOOST_REQUIRE_EQUAL( libraryPins.size(), pins.size() );
158 const wxString commonNumber = libraryPins.front()->GetNumber();
159 std::map<const SCH_PIN*, KIID> expectedMapping;
161 for(
size_t i = 0; i < pins.size(); ++i )
163 expectedMapping.emplace( libraryPins[i], pins[i]->m_Uuid );
164 pins[i]->SetNumber( commonNumber );
168 symbol->UpdatePins();
169 BOOST_REQUIRE_EQUAL( pins.size(), originalCount );
171 for(
const std::unique_ptr<SCH_PIN>&
pin : pins )
174 BOOST_CHECK(
pin->m_Uuid == expectedMapping.at(
pin->GetLibPin() ) );
186 fn.AppendDir( wxS(
"variant_test" ) );
187 fn.SetName( wxS(
"variant_test" ) );
193 BOOST_CHECK( symbol );
196 wxString variantName = wxS(
"Variant1" );
197 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
198 BOOST_CHECK( !variant );
201 BOOST_CHECK( !symbol->
GetDNP() );
202 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
203 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], variantName ) );
208 BOOST_CHECK( symbol->
GetExcludedFromBOM( &m_schematic->Hierarchy()[0], variantName ) );
213 BOOST_CHECK( symbol->
GetExcludedFromSim( &m_schematic->Hierarchy()[0], variantName ) );
244 fn.AppendDir( wxS(
"variant_test" ) );
245 fn.SetName( wxS(
"variant_test" ) );
253 wxString newFieldName = wxS(
"Sim.Library" );
257 BOOST_CHECK( existing ==
nullptr );
261 newField.
SetText( wxS(
"test_model.lib" ) );
269 BOOST_CHECK( addedField->
GetParent() == symbol );
274 BOOST_CHECK( found->
GetText() == wxS(
"test_model.lib" ) );
288 LoadSchematic( SchematicQAPath( wxS(
"component_classes" ) ) );
301 if( candidate->
GetRef( &sheet,
false ) == wxS(
"U1" )
312 [](
const std::vector<SCH_PIN*>& aPins )
314 std::set<wxString> numbers;
317 numbers.insert(
pin->GetNumber() );
322 const std::set<wxString> unitAPins = { wxS(
"1" ), wxS(
"2" ), wxS(
"3" ) };
323 const std::set<wxString> unitBPins = { wxS(
"5" ), wxS(
"6" ), wxS(
"7" ) };
327 BOOST_CHECK( pinNumbers( symbol->
GetLibPins() ) == unitAPins );
329 std::unique_ptr<SCH_SYMBOL> undoImage(
static_cast<SCH_SYMBOL*
>( symbol->
Clone() ) );
336 BOOST_CHECK( pinNumbers( symbol->
GetLibPins() ) == unitBPins );
343 BOOST_CHECK( pinNumbers( symbol->
GetLibPins() ) == unitAPins );
347 BOOST_CHECK( pinNumbers( undoImage->GetLibPins() ) == unitBPins );
367 fn.AppendDir( wxS(
"variant_test" ) );
368 fn.SetName( wxS(
"variant_test" ) );
378 wxString variantName = wxS(
"DialogTest" );
381 BOOST_CHECK( !symbol->
GetDNP() );
393 symbol->
SetDNP(
true, &sheet, variantName );
396 BOOST_CHECK( symbol->
GetDNP( &sheet, variantName ) );
403 BOOST_CHECK( !symbol->
GetDNP() );
417 fn.AppendDir( wxS(
"variant_test" ) );
418 fn.SetName( wxS(
"variant_test" ) );
424 wxString variantName = wxS(
"TestVariant" );
425 wxString description = wxS(
"This is a test variant description" );
428 m_schematic->AddVariant( variantName );
429 BOOST_CHECK( m_schematic->GetVariantNames().contains( variantName ) );
432 m_schematic->SetVariantDescription( variantName, description );
433 BOOST_CHECK_EQUAL( m_schematic->GetVariantDescription( variantName ), description );
436 BOOST_CHECK( m_schematic->GetVariantDescription( wxS(
"NonExistent" ) ).IsEmpty() );
439 m_schematic->SetVariantDescription( variantName, wxEmptyString );
440 BOOST_CHECK( m_schematic->GetVariantDescription( variantName ).IsEmpty() );
451 fn.AppendDir( wxS(
"variant_test" ) );
452 fn.SetName( wxS(
"variant_test" ) );
458 wxString variantName = wxS(
"MilitaryGrade" );
461 m_schematic->AddVariant( variantName );
462 m_schematic->SetCurrentVariant( variantName );
465 wxString token = wxS(
"VARIANT" );
466 bool resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
467 BOOST_CHECK( resolved );
471 token = wxS(
"VARIANTNAME" );
472 resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
473 BOOST_CHECK( resolved );
477 m_schematic->SetCurrentVariant( wxEmptyString );
478 token = wxS(
"VARIANT" );
479 resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
480 BOOST_CHECK( resolved );
481 BOOST_CHECK( token.IsEmpty() );
492 fn.AppendDir( wxS(
"variant_test" ) );
493 fn.SetName( wxS(
"variant_test" ) );
499 wxString variantName = wxS(
"IndustrialVariant" );
500 wxString description = wxS(
"Industrial temperature range components" );
503 m_schematic->AddVariant( variantName );
504 m_schematic->SetVariantDescription( variantName, description );
505 m_schematic->SetCurrentVariant( variantName );
508 wxString token = wxS(
"VARIANT_DESC" );
509 bool resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
510 BOOST_CHECK( resolved );
514 m_schematic->SetVariantDescription( variantName, wxEmptyString );
515 token = wxS(
"VARIANT_DESC" );
516 resolved = m_schematic->ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
517 BOOST_CHECK( resolved );
518 BOOST_CHECK( token.IsEmpty() );
529 fn.AppendDir( wxS(
"variant_test" ) );
530 fn.SetName( wxS(
"variant_test" ) );
539 wxString oldName = wxS(
"OriginalVariant" );
540 wxString newName = wxS(
"RenamedVariant" );
541 wxString description = wxS(
"Original description" );
544 m_schematic->AddVariant( oldName );
545 m_schematic->SetVariantDescription( oldName, description );
546 m_schematic->SetCurrentVariant( oldName );
549 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], oldName );
553 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], oldName ) );
555 INTERNAL, oldName ), wxS(
"100K" ) );
558 m_schematic->RenameVariant( oldName, newName );
561 BOOST_CHECK( !m_schematic->GetVariantNames().contains( oldName ) );
564 BOOST_CHECK( m_schematic->GetVariantNames().contains( newName ) );
573 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], newName ) );
575 INTERNAL, newName ), wxS(
"100K" ) );
586 fn.AppendDir( wxS(
"variant_test" ) );
587 fn.SetName( wxS(
"variant_test" ) );
596 wxString sourceVariant = wxS(
"SourceVariant" );
597 wxString copyVariant = wxS(
"CopiedVariant" );
598 wxString description = wxS(
"Source description" );
601 m_schematic->AddVariant( sourceVariant );
602 m_schematic->SetVariantDescription( sourceVariant, description );
605 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], sourceVariant );
612 m_schematic->CopyVariant( sourceVariant, copyVariant );
615 BOOST_CHECK( m_schematic->GetVariantNames().contains( sourceVariant ) );
616 BOOST_CHECK( m_schematic->GetVariantNames().contains( copyVariant ) );
619 BOOST_CHECK_EQUAL( m_schematic->GetVariantDescription( copyVariant ), description );
622 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], copyVariant ) );
623 BOOST_CHECK( symbol->
GetExcludedFromBOM( &m_schematic->Hierarchy()[0], copyVariant ) );
627 INTERNAL, copyVariant ), wxS(
"47K" ) );
630 symbol->
SetDNP(
false, &m_schematic->Hierarchy()[0], copyVariant );
634 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], sourceVariant ) );
636 INTERNAL, sourceVariant ), wxS(
"47K" ) );
639 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], copyVariant ) );
641 INTERNAL, copyVariant ), wxS(
"100K" ) );
652 fn.AppendDir( wxS(
"variant_test" ) );
653 fn.SetName( wxS(
"variant_test" ) );
662 wxString variantName1 = wxS(
"DiffTestVariant1" );
663 wxString variantName2 = wxS(
"DiffTestVariant2" );
671 m_schematic->AddVariant( variantName1 );
680 BOOST_CHECK( defaultValue != variantValue );
683 m_schematic->AddVariant( variantName2 );
700 fn.AppendDir( wxS(
"variant_test" ) );
701 fn.SetName( wxS(
"variant_test" ) );
710 wxString variantName = wxS(
"DNPVariant" );
713 BOOST_CHECK( !symbol->
GetDNP() );
714 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], wxEmptyString ) );
717 m_schematic->AddVariant( variantName );
718 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
721 BOOST_CHECK( !symbol->
GetDNP() );
722 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], wxEmptyString ) );
725 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], variantName ) );
730 BOOST_CHECK( symbol->
GetExcludedFromBOM( &m_schematic->Hierarchy()[0], variantName ) );
731 BOOST_CHECK( !symbol->
GetExcludedFromBOM( &m_schematic->Hierarchy()[0], wxEmptyString ) );
754 fn.AppendDir( wxS(
"variant_test" ) );
755 fn.SetName( wxS(
"variant_test" ) );
762 m_schematic->AddVariant( wxS(
"Zebra" ) );
763 m_schematic->AddVariant( wxS(
"Alpha" ) );
764 m_schematic->AddVariant( wxS(
"Beta" ) );
766 wxArrayString variantNames = m_schematic->GetVariantNamesForUI();
769 BOOST_CHECK( variantNames.GetCount() >= 4 );
773 BOOST_CHECK( !variantNames[0].IsEmpty() );
777 bool foundAlpha =
false;
778 bool foundBeta =
false;
779 bool foundZebra =
false;
781 for(
size_t i = 1; i < variantNames.GetCount(); i++ )
783 if( variantNames[i] == wxS(
"Alpha" ) )
785 else if( variantNames[i] == wxS(
"Beta" ) )
787 else if( variantNames[i] == wxS(
"Zebra" ) )
791 BOOST_CHECK( foundAlpha );
792 BOOST_CHECK( foundBeta );
793 BOOST_CHECK( foundZebra );
806 fn.AppendDir( wxS(
"variant_test" ) );
807 fn.SetName( wxS(
"variant_test" ) );
816 wxString variantName = wxS(
"PersistenceTest" );
817 wxString newValue = wxS(
"4.7K" );
821 m_schematic->AddVariant( variantName );
824 symbol->
SetValueFieldText( newValue, &m_schematic->Hierarchy()[0], variantName );
827 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
831 BOOST_CHECK( variant->m_Fields.contains( fieldName ) );
835 wxString retrievedValue = symbol->
GetValue( &m_schematic->Hierarchy()[0],
RAW_VALUE, variantName );
839 wxString retrievedDefault = symbol->
GetValue( &m_schematic->Hierarchy()[0],
RAW_VALUE, wxEmptyString );
851 fn.AppendDir( wxS(
"variant_test" ) );
852 fn.SetName( wxS(
"variant_test" ) );
861 wxString variantName1 = wxS(
"MethodTest1" );
862 wxString variantName2 = wxS(
"MethodTest2" );
863 wxString value1 = wxS(
"10K" );
864 wxString value2 = wxS(
"22K" );
867 m_schematic->AddVariant( variantName1 );
868 m_schematic->AddVariant( variantName2 );
874 symbol->
SetFieldText( fieldName, value2, &m_schematic->Hierarchy()[0], variantName2 );
877 std::optional<SCH_SYMBOL_VARIANT> variant1 = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName1 );
878 std::optional<SCH_SYMBOL_VARIANT> variant2 = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName2 );
883 BOOST_CHECK( variant1->m_Fields.contains( fieldName ) );
884 BOOST_CHECK( variant2->m_Fields.contains( fieldName ) );
907 fn.AppendDir( wxS(
"variant_test" ) );
908 fn.SetName( wxS(
"variant_test" ) );
917 wxString variantName = wxS(
"ProductionVariant" );
920 m_schematic->AddVariant( variantName );
923 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
926 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], wxS(
"ProductionVariant" ) ) );
929 BOOST_CHECK( m_schematic->GetVariantNames().contains( wxS(
"ProductionVariant" ) ) );
932 m_schematic->SetCurrentVariant( variantName );
936 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], wxS(
"NonExistentVariant" ) ) );
947 fn.AppendDir( wxS(
"variant_test" ) );
948 fn.SetName( wxS(
"variant_test" ) );
957 wxString variantName = wxS(
"DeleteMe" );
960 m_schematic->AddVariant( variantName );
961 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
965 BOOST_CHECK( symbol->
GetDNP( &m_schematic->Hierarchy()[0], variantName ) );
966 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
967 BOOST_CHECK( variant.has_value() );
971 manager.
SetEnvironment( m_schematic.get(),
nullptr,
nullptr,
nullptr,
nullptr );
973 m_schematic->DeleteVariant( variantName, &commit );
976 BOOST_CHECK( !m_schematic->GetVariantNames().contains( variantName ) );
979 BOOST_CHECK( !symbol->
GetDNP( &m_schematic->Hierarchy()[0], variantName ) );
990 fn.AppendDir( wxS(
"variant_test" ) );
991 fn.SetName( wxS(
"variant_test" ) );
1000 wxString variantName = wxS(
"UnicodeTest" );
1001 m_schematic->AddVariant( variantName );
1004 wxString unicodeValue = wxS(
"1kΩ ±5% 日本語" );
1012 wxString specialChars = wxS(
"R<1K>\"test\"'value'" );
1021 BOOST_CHECK( retrieved.IsEmpty() );
1024 wxString unicodeDesc = wxS(
"Variante für Produktion — 测试" );
1025 m_schematic->SetVariantDescription( variantName, unicodeDesc );
1026 BOOST_CHECK_EQUAL( m_schematic->GetVariantDescription( variantName ), unicodeDesc );
1037 fn.AppendDir( wxS(
"variant_test" ) );
1038 fn.SetName( wxS(
"variant_test" ) );
1047 wxString variantName = wxS(
"MilitaryGrade" );
1048 wxString variantValue = wxS(
"1K-MIL" );
1049 wxString defaultValue = wxS(
"1K" );
1052 m_schematic->AddVariant( variantName );
1054 symbol->
SetDNP(
true, &m_schematic->Hierarchy()[0], variantName );
1061 wxString symbolRef = symbol->
GetRef( &m_schematic->Hierarchy()[0],
false );
1064 wxString token = symbolRef + wxS(
":VALUE:" ) + variantName;
1065 bool resolved = m_schematic->ResolveCrossReference( &token, 0 );
1066 BOOST_CHECK( resolved );
1070 token = symbolRef + wxS(
":VALUE" );
1071 resolved = m_schematic->ResolveCrossReference( &token, 0 );
1072 BOOST_CHECK( resolved );
1076 token = symbolRef + wxS(
":VALUE:NonExistentVariant" );
1077 resolved = m_schematic->ResolveCrossReference( &token, 0 );
1078 BOOST_CHECK( resolved );
1082 token = wxS(
"VALUE" );
1083 resolved = symbol->
ResolveTextVar( &m_schematic->Hierarchy()[0], &token, variantName, 0 );
1084 BOOST_CHECK( resolved );
1088 m_schematic->SetCurrentVariant( variantName );
1089 token = wxS(
"VALUE" );
1090 resolved = symbol->
ResolveTextVar( &m_schematic->Hierarchy()[0], &token, wxEmptyString, 0 );
1091 BOOST_CHECK( resolved );
1095 token = wxS(
"DNP" );
1096 resolved = symbol->
ResolveTextVar( &m_schematic->Hierarchy()[0], &token, 0 );
1097 BOOST_CHECK( resolved );
1101 token = wxS(
"DNP" );
1102 resolved = symbol->
ResolveTextVar( &m_schematic->Hierarchy()[0], &token, wxEmptyString, 0 );
1103 BOOST_CHECK( resolved );
1117 fn.AppendDir( wxS(
"variant_test" ) );
1118 fn.SetName( wxS(
"variant_test" ) );
1127 wxString variantName = wxS(
"FootprintVariant" );
1128 wxString baseFootprint = wxS(
"Resistor_SMD:R_0805_2012Metric" );
1129 wxString variantFootprint = wxS(
"Resistor_SMD:R_0402_1005Metric" );
1137 m_schematic->AddVariant( variantName );
1140 symbol->
SetFieldText( fieldName, variantFootprint, &m_schematic->Hierarchy()[0], variantName );
1147 wxString retrievedDefault = symbol->
GetFieldText( fieldName, &m_schematic->Hierarchy()[0], wxEmptyString );
1151 wxString retrievedVariant = symbol->
GetFieldText( fieldName, &m_schematic->Hierarchy()[0], variantName );
1155 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
1157 BOOST_CHECK( variant->m_Fields.contains( fieldName ) );
1170 fn.AppendDir( wxS(
"variant_test" ) );
1171 fn.SetName( wxS(
"variant_test" ) );
1180 wxString variantName = wxS(
"NoOpTest" );
1181 wxString baseFootprint = wxS(
"Resistor_SMD:R_0805_2012Metric" );
1188 m_schematic->AddVariant( variantName );
1191 symbol->
SetFieldText( fieldName, baseFootprint, &m_schematic->Hierarchy()[0], variantName );
1194 std::optional<SCH_SYMBOL_VARIANT> variant = symbol->
GetVariant( m_schematic->Hierarchy()[0], variantName );
1197 if( variant.has_value() )
1199 BOOST_CHECK( !variant->m_Fields.contains( fieldName ) );
1212 fn.AppendDir( wxS(
"variant_test" ) );
1213 fn.SetName( wxS(
"variant_test" ) );
1220 m_schematic->SetCurrentSheet( m_schematic->Hierarchy()[0] );
1228 wxString variantName = wxS(
"BboxVariant" );
1229 wxString shortFp = wxS(
"R_0402" );
1230 wxString longFp = wxS(
"Resistor_SMD:R_2512_6332Metric_Pad1.52x3.35mm_HandSolder" );
1236 m_schematic->AddVariant( variantName );
1237 symbol->
SetFieldText( fpField->
GetName(), longFp, &m_schematic->Hierarchy()[0], variantName );
1240 wxString resolvedDefault = fpField->
GetShownText( &m_schematic->Hierarchy()[0],
INTERNAL, wxEmptyString );
1241 wxString resolvedVariant = fpField->
GetShownText( &m_schematic->Hierarchy()[0],
INTERNAL, variantName );
1246 m_schematic->SetCurrentVariant( wxEmptyString );
1249 m_schematic->SetCurrentVariant( variantName );
1256 m_schematic->SetCurrentVariant( wxEmptyString );
1262 m_schematic->SetCurrentVariant( variantName );
1270 m_schematic->SetCurrentVariant( wxEmptyString );
1290 fn.AppendDir( wxS(
"variant_test" ) );
1291 fn.SetName( wxS(
"variant_test" ) );
1309 BOOST_CHECK( !defaultVariant.
m_DNP );
1319 BOOST_CHECK_MESSAGE( initializedVariant.
m_DNP,
1320 "InitializeAttributes should copy DNP from symbol" );
1322 "InitializeAttributes should copy ExcludedFromBOM from symbol" );
1324 "InitializeAttributes should copy ExcludedFromSim from symbol" );
1326 "InitializeAttributes should copy ExcludedFromBoard from symbol" );
1328 "InitializeAttributes should copy ExcludedFromPosFiles from symbol" );
1352 customField.
SetText( wxS(
"aayyxx" ) );
1363 BOOST_CHECK( custom->
Matches( data, &sheetPath ) );
1364 BOOST_CHECK( !symbol.
Matches( data, &sheetPath ) );
1370 BOOST_CHECK( !symbol.
Matches( data, &sheetPath ) );
1381 BOOST_CHECK( symbol.
Matches( data, &sheetPath ) );
1385 BOOST_CHECK( !symbol.
Matches( data, &sheetPath ) );
1395 fn.AppendDir( wxS(
"variant_test" ) );
1396 fn.
SetName( wxS(
"variant_test" ) );
1416 BOOST_REQUIRE_EQUAL( owned.model.GetPinCount(), 2 );
1417 BOOST_REQUIRE_EQUAL( live.model.GetPinCount(), 2 );
1418 BOOST_CHECK_EQUAL( owned.model.GetPin( 0 ).symbolPinNumber, wxString(
"999" ) );
1422 wxString token = wxS(
"OP:2" );
1426 token = wxS(
"OP:999" );
1435 auto symbols = m_schematic->Hierarchy().front().LastScreen()->Items().OfType(
SCH_SYMBOL_T );
1448 mutable unsigned boundsReads = 0;
1451 COUNTED_SYMBOL item( *
static_cast<SCH_SYMBOL*
>( *symbols.begin() ) );
1452 COUNTED_SYMBOL
copy( item );
1455 item.boundsReads = 0;
1456 copy.boundsReads = 0;
1457 BOOST_CHECK( tree.
contains( &item,
true ) );
1461 item.Move(
VECTOR2I( 100000000, 100000000 ) );
1462 BOOST_CHECK( tree.
contains( &item,
true ) );
1467 BOOST_CHECK( tree.
contains( &item,
true ) );
1469 BOOST_CHECK( !tree.
contains( &item,
true ) );
1470 BOOST_CHECK( !tree.
remove( &item ) );
1473 BOOST_CHECK(
moved.contains( &
copy,
true ) );
1476 tree = std::move(
moved );
1478 BOOST_CHECK( !tree.
contains( &item,
true ) );
1479 BOOST_CHECK( !
moved.contains( &
copy,
true ) );
1483 BOOST_CHECK( tree.
contains( &item,
true ) );
1490 std::unique_ptr<SCHEMATIC> schematic;
1492 BOOST_REQUIRE_GT( schematic->Hierarchy().size(), 1 );
1493 size_t differentReferences = 0;
1499 auto* symbol =
static_cast<SCH_SYMBOL*
>( item );
1504 if( current.LastScreen() !=
path.LastScreen() )
1507 schematic->SetCurrentSheet( current );
1508 differentReferences += symbol->GetRef( ¤t ) !=
expected;
1509 wxString token(
"PROPERTY.Reference" );
1516 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)
Set the Description field text value.
SCH_FIELD & GetValueField()
virtual void SetName(const wxString &aName)
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Commit for the schematic and symbol editors.
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 m_symbol
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.