59 std::string ret =
TO_UTF8( txt );
63 if( (
unsigned char) c <=
' ' )
88 std::unique_ptr<LIB_SYMBOL> part;
116 SCH_SYMBOL( aSymbol, aSel.LibId, aSheet, aSel.Unit, aSel.
Convert, aPosition, aParent )
119 for(
const auto& [fieldId, fieldValue] : aSel.
Fields )
121 if( fieldId == FIELD_T::REFERENCE )
122 SetRef( aSheet, fieldValue );
123 else if( SCH_FIELD* field = GetField( fieldId ) )
124 field->SetText( fieldValue );
149 field.SetParent(
this );
154 for(
const std::unique_ptr<SCH_PIN>&
pin : aSymbol.
m_pins )
156 m_pins.emplace_back( std::make_unique<SCH_PIN>( *pin ) );
157 m_pins.back()->SetParent( this );
220 const int min_grid_size =
schIUScale.MilsToIU( 25 );
222 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
224 if( ( (
pin->GetPosition().x -
m_pos.x ) % min_grid_size ) != 0 )
227 if( ( (
pin->GetPosition().y -
m_pos.y ) % min_grid_size ) != 0 )
252 wxCHECK2( !aLibSymbol || aLibSymbol->
IsRoot(), aLibSymbol =
nullptr );
254 m_part.reset( aLibSymbol );
259 pin->SetLibPin(
nullptr );
268 return m_part->GetDescription();
270 return wxEmptyString;
277 return m_part->GetShownDescription( aDepth );
279 return wxEmptyString;
286 return m_part->GetKeyWords();
288 return wxEmptyString;
295 return m_part->GetShownKeyWords( aDepth );
297 return wxEmptyString;
304 return m_part->GetDatasheetField().GetText();
306 return wxEmptyString;
312 std::map<wxString, wxString> altPinMap;
313 std::map<wxString, SCH_PIN::ALT> altPinDefs;
314 std::map<wxString, std::set<SCH_PIN*>> pinUuidMap;
315 std::set<SCH_PIN*> unassignedSchPins;
316 std::set<SCH_PIN*> unassignedLibPins;
318 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
320 pinUuidMap[
pin->GetNumber()].insert(
pin.get() );
322 unassignedSchPins.insert(
pin.get() );
324 if( !
pin->GetAlt().IsEmpty() )
326 altPinMap[
pin->GetNumber()] =
pin->GetAlt();
327 auto altDefIt =
pin->GetAlternates().find(
pin->GetAlt() );
329 if( altDefIt !=
pin->GetAlternates().end() )
330 altPinDefs[
pin->GetNumber()] = altDefIt->second;
333 pin->SetLibPin(
nullptr );
350 auto ii = pinUuidMap.find( libPin->GetNumber() );
352 if( ii == pinUuidMap.end() || ii->second.empty() )
354 unassignedLibPins.insert( libPin );
358 auto it = ii->second.begin();
360 ii->second.erase( it );
361 pin->GetAlternates() = libPin->GetAlternates();
362 pin->SetLibPin( libPin );
363 pin->SetPosition( libPin->GetPosition() );
364 pin->SetUnit( libPin->GetUnit() );
365 pin->SetBodyStyle( libPin->GetBodyStyle() );
367 unassignedSchPins.erase(
pin );
369 auto iii = altPinMap.find( libPin->GetNumber() );
371 if( iii != altPinMap.end() )
373 wxString altName = iii->second;
375 if(
pin->GetAlternates().find( altName ) ==
pin->GetAlternates().end() )
377 auto defIt = altPinDefs.find( libPin->GetNumber() );
379 if( defIt != altPinDefs.end() )
381 for(
const auto& [
name, alt] :
pin->GetAlternates() )
383 if( alt.m_Shape == defIt->second.m_Shape && alt.m_Type == defIt->second.m_Type )
392 pin->SetAlt( altName );
399 for(
SCH_PIN* libPin : unassignedLibPins )
404 if( !unassignedSchPins.empty() )
406 auto it = unassignedSchPins.begin();
408 unassignedSchPins.erase( it );
413 pin =
m_pins.emplace_back( std::make_unique<SCH_PIN>(
SCH_PIN(
this, libPin ) ) ).get();
417 pin->GetAlternates() = libPin->GetAlternates();
418 pin->SetLibPin( libPin );
419 pin->SetPosition( libPin->GetPosition() );
420 pin->SetUnit( libPin->GetUnit() );
421 pin->SetBodyStyle( libPin->GetBodyStyle() );
422 pin->SetNumber( libPin->GetNumber() );
424 auto iii = altPinMap.find( libPin->GetNumber() );
426 if( iii != altPinMap.end() )
428 wxString altName = iii->second;
430 if(
pin->GetAlternates().find( altName ) ==
pin->GetAlternates().end() )
432 auto defIt = altPinDefs.find( libPin->GetNumber() );
434 if( defIt != altPinDefs.end() )
436 for(
const auto& [
name, alt] :
pin->GetAlternates() )
438 if( alt.m_Shape == defIt->second.m_Shape && alt.m_Type == defIt->second.m_Type )
447 pin->SetAlt( altName );
452 for(
auto it1 =
m_pins.begin(); it1 !=
m_pins.end() && !unassignedSchPins.empty(); )
454 auto it2 = unassignedSchPins.find( it1->get() );
456 if( it2 != unassignedSchPins.end() )
458 it1 =
m_pins.erase( it1 );
459 unassignedSchPins.erase( it2 );
470 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
491 return m_part->GetUnitCount();
500 return m_part->GetBodyStyleCount();
509 return m_part->HasDeMorganBodyStyles();
518 return m_part->GetUnitDisplayName( aUnit, aLabel );
520 return wxString::Format(
_(
"Unit %s" ),
SubReference( aUnit ) );
529 return m_part->GetBodyStyleDescription( aBodyStyle, aLabel );
541 if( instance.m_Path == aSheetPath )
543 aInstance = instance;
547 else if( instance.m_Path.EndsWith( aSheetPath ) )
549 aInstance = instance;
568 for(
int ii =
m_instances.size() - 1; ii >= 0; --ii )
573 wxS(
"Removing symbol instance:\n"
575 " reference %s, unit %d from symbol %s." ),
603 wxS(
"Adding symbol '%s' instance:\n"
627 wxLogTrace(
traceSchSymbolRef,
"GetRef for symbol %s on path %s (sheet path has %zu sheets)",
m_Uuid.AsString(),
634 wxLogTrace(
traceSchSymbolRef,
" Instance: path=%s, ref=%s", instance.m_Path.AsString(),
635 instance.m_Reference );
637 if( instance.m_Path ==
path )
639 ref = instance.m_Reference;
653 wxLogTrace(
traceSchSymbolRef,
" Using fallback from REFERENCE field: %s", ref );
695 if( instance.m_Path ==
path )
698 instance.m_Reference = ref;
706 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
707 pin->ClearDefaultNetName( sheet );
724 const wxString& aVariantName )
726 wxCHECK( !aFieldName.IsEmpty(), );
732 switch( field->
GetId() )
736 SetRef( aPath, aFieldText );
743 if( aFieldText != defaultText )
745 if( aVariantName.IsEmpty() )
755 wxCHECK( instance, );
757 if( instance->
m_Variants.contains( aVariantName ) )
759 instance->
m_Variants[aVariantName].m_Fields[aFieldName] = aFieldText;
766 newVariant.
m_Fields[aFieldName] = aFieldText;
767 instance->
m_Variants.insert( std::make_pair( aVariantName, newVariant ) );
777 wxString defaultText = field->
GetText( aPath );
779 if( aFieldText != defaultText )
781 if( aVariantName.IsEmpty() )
789 wxCHECK( instance, );
791 if( instance->
m_Variants.contains( aVariantName ) )
793 instance->
m_Variants[aVariantName].m_Fields[aFieldName] = aFieldText;
800 newVariant.
m_Fields[aFieldName] = aFieldText;
801 instance->
m_Variants.insert( std::make_pair( aVariantName, newVariant ) );
813 const wxString& aVariantName )
const
815 wxCHECK( !aFieldName.IsEmpty(), wxEmptyString );
819 wxCHECK( field, wxEmptyString );
821 switch( field->
GetId() )
824 wxCHECK( aPath, field->
GetText() );
825 return GetRef( aPath,
false );
829 if( !aVariantName.IsEmpty() && aPath )
833 if( instance && instance->
m_Variants.contains( aVariantName )
834 && instance->
m_Variants.at( aVariantName ).m_Fields.contains( aFieldName ) )
836 return instance->
m_Variants.at( aVariantName ).m_Fields.at( aFieldName );
843 if( aVariantName.IsEmpty() )
851 if( instance->
m_Variants.contains( aVariantName )
852 && instance->
m_Variants.at( aVariantName ).m_Fields.contains( aFieldName ) )
853 return instance->
m_Variants.at( aVariantName ).m_Fields.at( aFieldName );
869 if( instance.m_Path ==
path )
870 return !instance.m_Reference.IsEmpty() && instance.m_Reference.Last() !=
'?';
881 refDesignator.Replace(
"~",
" " );
883 wxString prefix = refDesignator;
885 while( prefix.Length() )
887 wxUniCharRef last = prefix.Last();
889 if( ( last >=
'0' && last <=
'9' ) || last ==
'?' || last ==
'*' )
897 prefix.Trim(
false );
899 if( !prefix.IsEmpty() )
907 return schematic->Settings().SubReference( aUnit, aAddSeparator );
919 if( instance.m_Path ==
path )
920 return instance.m_Unit;
936 if( instance.m_Path ==
path )
938 instance.m_Unit = aUnitSelection;
950 if( !aInstance || aVariantName.IsEmpty() )
958 wxCHECK_MSG( instance, ,
959 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
962 if( aVariantName.IsEmpty() )
968 if( instance->
m_Variants.contains( aVariantName ) && ( aEnable != instance->
m_Variants[aVariantName].m_DNP ) )
970 instance->
m_Variants[aVariantName].m_DNP = aEnable;
977 variant.
m_DNP = aEnable;
986 if( !aInstance || aVariantName.IsEmpty() )
994 if( aVariantName.IsEmpty() )
996 else if( instance.
m_Variants.contains( aVariantName ) )
997 return instance.
m_Variants[aVariantName].m_DNP;
1005 if( !aInstance || aVariantName.IsEmpty() )
1013 wxCHECK_MSG( instance, ,
1014 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
1017 if( aVariantName.IsEmpty() )
1023 if( instance->
m_Variants.contains( aVariantName )
1024 && ( aEnable != instance->
m_Variants[aVariantName].m_ExcludedFromBOM ) )
1026 instance->
m_Variants[aVariantName].m_ExcludedFromBOM = aEnable;
1042 if( !aInstance || aVariantName.IsEmpty() )
1050 if( aVariantName.IsEmpty() )
1052 else if( instance.
m_Variants.contains( aVariantName ) )
1053 return instance.
m_Variants[aVariantName].m_ExcludedFromBOM;
1062 if( !aInstance || aVariantName.IsEmpty() )
1070 wxCHECK_MSG( instance, ,
1071 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
1074 if( aVariantName.IsEmpty() )
1080 if( instance->
m_Variants.contains( aVariantName )
1081 && ( aEnable != instance->
m_Variants[aVariantName].m_ExcludedFromSim ) )
1083 instance->
m_Variants[aVariantName].m_ExcludedFromSim = aEnable;
1099 if( !aInstance || aVariantName.IsEmpty() )
1107 if( aVariantName.IsEmpty() )
1109 else if ( instance.
m_Variants.contains( aVariantName ) )
1110 return instance.
m_Variants[aVariantName].m_ExcludedFromSim;
1118 const wxString& aVariantName )
1120 if( !aInstance || aVariantName.IsEmpty() )
1128 wxCHECK_MSG( instance, ,
1129 wxString::Format( wxS(
"Cannot set exclude from board for invalid sheet path '%s'." ),
1132 if( aVariantName.IsEmpty() )
1138 if( instance->
m_Variants.contains( aVariantName )
1139 && ( aEnable != instance->
m_Variants[aVariantName].m_ExcludedFromBoard ) )
1141 instance->
m_Variants[aVariantName].m_ExcludedFromBoard = aEnable;
1156 const wxString& aVariantName )
const
1158 if( !aInstance || aVariantName.IsEmpty() )
1166 if( aVariantName.IsEmpty() )
1168 else if( instance.
m_Variants.contains( aVariantName ) )
1169 return instance.
m_Variants[aVariantName].m_ExcludedFromBoard;
1177 const wxString& aVariantName )
1179 if( !aInstance || aVariantName.IsEmpty() )
1187 wxCHECK_MSG( instance, ,
1188 wxString::Format( wxS(
"Cannot set exclude from pos files for invalid sheet path '%s'." ),
1191 if( aVariantName.IsEmpty() )
1197 if( instance->
m_Variants.contains( aVariantName )
1198 && ( aEnable != instance->
m_Variants[aVariantName].m_ExcludedFromPosFiles ) )
1200 instance->
m_Variants[aVariantName].m_ExcludedFromPosFiles = aEnable;
1215 const wxString& aVariantName )
const
1217 if( !aInstance || aVariantName.IsEmpty() )
1225 if( aVariantName.IsEmpty() )
1227 else if( instance.
m_Variants.contains( aVariantName ) )
1228 return instance.
m_Variants[aVariantName].m_ExcludedFromPosFiles;
1238 instance.m_Unit = aUnitSelection;
1243 bool aAllowExtraText,
const wxString& aVariantName )
const
1245 if( aVariantName.IsEmpty() )
1253 std::optional variant =
GetVariant( *aInstance, aVariantName );
1267 const wxString& aVariantName )
1269 if( !aInstance || aVariantName.IsEmpty() )
1277 wxCHECK( instance, );
1281 if( instance->
m_Variants.contains( aVariantName ) )
1283 instance->
m_Variants[aVariantName].m_Fields[fieldName] = aValue;
1290 newVariant.
m_Fields[fieldName] = aValue;
1291 instance->
m_Variants.insert( std::make_pair( aVariantName, newVariant ) );
1297 bool aAllowExtraText,
const wxString& aVariantName )
const
1317 m_fields.emplace_back(
this, aFieldType );
1346 if( !field.IsVisible() || field.GetText().IsEmpty() )
1350 aVector.push_back(
const_cast<SCH_FIELD*
>( &field ) );
1353 std::sort( aVector.begin(), aVector.end(),
1356 return lhs->GetOrdinal() < rhs->GetOrdinal();
1376 for(
unsigned ii = 0; ii <
m_fields.size(); ++ii )
1381 if( aFieldName ==
m_fields[ii].GetName(
false ) )
1394 if( field.GetName().IsSameAs( aFieldName,
false ) )
1403 bool aResetRef,
bool aResetOtherFields )
1407 std::vector<SCH_FIELD*> fields;
1408 m_part->GetFields( fields );
1410 for(
const SCH_FIELD* libField : fields )
1415 if( libField->IsMandatory() )
1417 fieldType = libField->GetId();
1422 schField =
GetField( libField->GetCanonicalName() );
1432 schField->
SetPrivate( libField->IsPrivate() );
1444 else if( aUpdateRef )
1445 SetRef( aPath, libField->GetText() );
1453 if( aResetOtherFields )
1455 else if( aUpdateOtherFields )
1456 schField->
SetText( libField->GetText() );
1460 if( aResetOtherFields || aUpdateOtherFields )
1461 schField->
SetText( libField->GetText() );
1471 bool updateValue =
true;
1472 bool updateExclFromBOM =
true;
1473 bool updateExclFromBoard =
true;
1474 bool updateDNP =
true;
1475 bool updateOtherFields =
true;
1476 bool updatePins =
true;
1480 updateValue = aProperty->
Name() ==
_HKI(
"Value" );
1481 updateExclFromBoard = aProperty->
Name() ==
_HKI(
"Exclude From Board" );
1482 updateExclFromBOM = aProperty->
Name() ==
_HKI(
"Exclude From Bill of Materials" );
1483 updateDNP = aProperty->
Name() ==
_HKI(
"Do not Populate" );
1484 updateOtherFields =
false;
1488 if( !updateValue && !updateExclFromBOM && !updateExclFromBoard && !updateDNP && !updateOtherFields && !updatePins )
1497 wxString ref =
GetRef( &aSourceSheet );
1502 std::vector<SCH_SYMBOL*> otherUnits;
1508 aCommit.
Modify( otherUnit, screen );
1513 if( updateOtherFields )
1525 if( field.IsMandatory() )
1526 otherField = otherUnit->GetField( field.GetId() );
1528 otherField = otherUnit->GetField( field.GetName() );
1532 otherField->
SetText( field.GetText() );
1540 newField.
Offset( otherUnit->GetPosition() );
1543 otherUnit->AddField( newField );
1547 for(
int ii = (
int) otherUnit->GetFields().size() - 1; ii >= 0; ii-- )
1549 SCH_FIELD& otherField = otherUnit->GetFields()[ii];
1552 otherUnit->GetFields().erase( otherUnit->GetFields().begin() + ii );
1556 if( updateExclFromBOM )
1559 if( updateExclFromBoard )
1563 otherUnit->SetDNP(
GetDNP( &aSourceSheet, aVariantName ), &sheet, aVariantName );
1567 for(
const std::unique_ptr<SCH_PIN>& model_pin :
m_pins )
1569 for(
SCH_PIN* src_pin : otherUnit->GetPinsByNumber( model_pin->GetNumber() ) )
1570 src_pin->SetAlt( model_pin->GetAlt() );
1581 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1582 aFunction(
pin.get() );
1585 aFunction( &field );
1591 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1593 if(
pin->GetNumber() == aNumber )
1603 std::vector<SCH_PIN*> pins;
1605 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1607 if(
pin->GetNumber() == aNumber )
1608 pins.push_back(
pin.get() );
1617 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1619 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit() :
GetUnit();
1620 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle() :
GetBodyStyle();
1622 if( pin_unit > 0 && pin_unit !=
GetUnit() )
1625 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
1628 if(
pin->GetPosition() == aPos )
1641 return std::vector<SCH_PIN*>();
1648 return m_part->GetPins();
1650 return std::vector<SCH_PIN*>();
1662 auto it =
m_pinMap.find( aLibPin );
1667 wxFAIL_MSG_AT(
"Pin not found", __FILE__, __LINE__, __FUNCTION__ );
1674 std::vector<const SCH_PIN*> pins;
1683 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1685 if( unit &&
pin->GetUnit() &&
pin->GetUnit() != unit )
1688 pins.push_back(
pin.get() );
1697 std::vector<SCH_PIN*> pins;
1706 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1708 if( unit &&
pin->GetUnit() &&
pin->GetUnit() != unit )
1711 pins.push_back(
pin.get() );
1727 wxCHECK_RET( aItem !=
nullptr && aItem->
Type() ==
SCH_SYMBOL_T, wxT(
"Cannot swap data with invalid symbol." ) );
1735 for( std::unique_ptr<SCH_PIN>&
pin : symbol->
m_pins )
1736 pin->SetParent( symbol );
1738 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1739 pin->SetParent(
this );
1744 m_part.reset( libSymbol );
1778 if( field.IsPrivate() )
1781 if( field.IsMandatory() )
1782 aVars->push_back( field.GetCanonicalName().Upper() );
1784 aVars->push_back( field.GetName() );
1787 aVars->push_back( wxT(
"OP" ) );
1788 aVars->push_back( wxT(
"FOOTPRINT_LIBRARY" ) );
1789 aVars->push_back( wxT(
"FOOTPRINT_NAME" ) );
1790 aVars->push_back( wxT(
"UNIT" ) );
1791 aVars->push_back( wxT(
"SHORT_REFERENCE" ) );
1792 aVars->push_back( wxT(
"SYMBOL_LIBRARY" ) );
1793 aVars->push_back( wxT(
"SYMBOL_NAME" ) );
1794 aVars->push_back( wxT(
"SYMBOL_DESCRIPTION" ) );
1795 aVars->push_back( wxT(
"SYMBOL_KEYWORDS" ) );
1796 aVars->push_back( wxT(
"EXCLUDE_FROM_BOM" ) );
1797 aVars->push_back( wxT(
"EXCLUDE_FROM_BOARD" ) );
1798 aVars->push_back( wxT(
"EXCLUDE_FROM_SIM" ) );
1799 aVars->push_back( wxT(
"DNP" ) );
1800 aVars->push_back( wxT(
"SHORT_NET_NAME(<pin_number>)" ) );
1801 aVars->push_back( wxT(
"NET_NAME(<pin_number>)" ) );
1802 aVars->push_back( wxT(
"NET_CLASS(<pin_number>)" ) );
1803 aVars->push_back( wxT(
"PIN_NAME(<pin_number>)" ) );
1804 aVars->push_back( wxT(
"REFERENCE(<pin_number>)" ) );
1805 aVars->push_back( wxT(
"SHORT_REFERENCE(<pin_number>)" ) );
1806 aVars->push_back( wxT(
"UNIT(<pin_number>)" ) );
1817 const wxString& aVariantName,
int aDepth )
const
1819 static wxRegEx operatingPoint( wxT(
"^"
1826 wxCHECK( aPath,
false );
1833 if( operatingPoint.Matches( *token ) )
1835 wxString
pin( operatingPoint.GetMatch( *token, 1 ).Lower() );
1836 wxString precisionStr( operatingPoint.GetMatch( *token, 3 ) );
1837 wxString rangeStr( operatingPoint.GetMatch( *token, 4 ) );
1839 int precision = precisionStr.IsEmpty() ? 3 : precisionStr[0] -
'0';
1840 wxString range = rangeStr.IsEmpty() ? wxString( wxS(
"~A" ) ) : rangeStr;
1844 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
1848 embeddedFilesStack.push_back(
m_part->GetEmbeddedFiles() );
1854 aVariantName, devnull ).model;
1858 wxString spiceRef =
model.SpiceGenerator().ItemName( spiceItem );
1859 spiceRef = spiceRef.Lower();
1866 else if(
pin == wxS(
":power" ) )
1868 if( rangeStr.IsEmpty() )
1869 range = wxS(
"~W" );
1871 *token = schematic->
GetOperatingPoint( spiceRef + wxS(
":power" ), precision, range );
1876 pin =
pin.SubString( 1, -1 );
1878 for(
const std::reference_wrapper<const SIM_MODEL_PIN>& modelPin :
model.GetPins() )
1880 SCH_PIN* symbolPin =
GetPin( modelPin.get().symbolPinNumber );
1884 if(
model.GetPins().size() == 2 )
1890 wxString signalName = spiceRef + wxS(
":" ) + modelPin.get().modelPinName;
1899 *token = wxS(
"?" );
1903 if( token->Contains(
':' ) )
1911 wxString fieldName = field.IsMandatory() ? field.GetCanonicalName() : field.GetName();
1913 wxString textToken = field.GetText();
1914 textToken.Replace(
" ", wxEmptyString );
1915 wxString tokenString =
"${" + fieldName +
"}";
1918 if( textToken.IsSameAs( tokenString,
false ) )
1921 if( token->IsSameAs( fieldName,
false ) )
1925 *token =
GetRef( aPath,
true );
1927 else if( !aVariantName.IsEmpty() )
1930 std::optional<SCH_SYMBOL_VARIANT> variant =
GetVariant( *aPath, aVariantName );
1932 if( variant && variant->m_Fields.contains( fieldName ) )
1933 *token = variant->m_Fields.at( fieldName );
1935 *token = field.GetShownText( aPath,
false, aDepth + 1 );
1939 *token = field.GetShownText( aPath,
false, aDepth + 1 );
1947 if( token->IsSameAs( wxT(
"SIM.DEVICE" ) ) || token->IsSameAs( wxT(
"SIM.TYPE" ) )
1948 || token->IsSameAs( wxT(
"SIM.PINS" ) ) || token->IsSameAs( wxT(
"SIM.PARAMS" ) )
1949 || token->IsSameAs( wxT(
"SIM.LIBRARY" ) ) || token->IsSameAs( wxT(
"SIM.NAME" ) ) )
1951 *token = wxEmptyString;
1958 if( token->IsSameAs( templateFieldname.m_Name ) || token->IsSameAs( templateFieldname.m_Name.Upper() ) )
1962 *token = wxEmptyString;
1967 if( token->IsSameAs( wxT(
"FOOTPRINT_LIBRARY" ) ) )
1971 wxArrayString parts = wxSplit( footprint,
':' );
1973 if( parts.Count() > 0 )
1976 *token = wxEmptyString;
1980 else if( token->IsSameAs( wxT(
"FOOTPRINT_NAME" ) ) )
1984 wxArrayString parts = wxSplit( footprint,
':' );
1986 if( parts.Count() > 1 )
1987 *token = parts[std::min( 1, (
int) parts.size() - 1 )];
1989 *token = wxEmptyString;
1993 else if( token->IsSameAs( wxT(
"UNIT" ) ) )
1998 else if( token->IsSameAs( wxT(
"SHORT_REFERENCE" ) ) )
2000 *token =
GetRef( aPath,
false );
2003 else if( token->IsSameAs( wxT(
"SYMBOL_LIBRARY" ) ) )
2005 *token =
m_lib_id.GetUniStringLibNickname();
2008 else if( token->IsSameAs( wxT(
"SYMBOL_NAME" ) ) )
2010 *token =
m_lib_id.GetUniStringLibItemName();
2013 else if( token->IsSameAs( wxT(
"SYMBOL_DESCRIPTION" ) ) )
2018 else if( token->IsSameAs( wxT(
"SYMBOL_KEYWORDS" ) ) )
2023 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOM" ) ) )
2025 *token = wxEmptyString;
2028 *token =
_(
"Excluded from BOM" );
2032 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOARD" ) ) )
2034 *token = wxEmptyString;
2037 *token =
_(
"Excluded from board" );
2041 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_SIM" ) ) )
2043 *token = wxEmptyString;
2046 *token =
_(
"Excluded from simulation" );
2050 else if( token->IsSameAs( wxT(
"DNP" ) ) )
2052 *token = wxEmptyString;
2054 if( aPath->
GetDNP() || this->ResolveDNP() )
2055 *token =
_(
"DNP" );
2059 else if( token->StartsWith( wxT(
"SHORT_NET_NAME(" ) ) || token->StartsWith( wxT(
"NET_NAME(" ) )
2060 || token->StartsWith( wxT(
"NET_CLASS(" ) ) || token->StartsWith( wxT(
"PIN_NAME(" ) )
2061 || token->StartsWith( wxT(
"PIN_BASE_NAME(" ) ) || token->StartsWith( wxT(
"PIN_ALT_LIST(" ) )
2062 || token->StartsWith( wxT(
"REFERENCE(" ) ) || token->StartsWith( wxT(
"SHORT_REFERENCE(" ) )
2063 || token->StartsWith( wxT(
"UNIT(" ) ) )
2065 wxString pinNumber = token->AfterFirst(
'(' );
2066 pinNumber = pinNumber.BeforeLast(
')' );
2068 bool isReferenceFunction = token->StartsWith( wxT(
"REFERENCE(" ) );
2069 bool isShortReferenceFunction = token->StartsWith( wxT(
"SHORT_REFERENCE(" ) );
2070 bool isUnitFunction = token->StartsWith( wxT(
"UNIT(" ) );
2074 std::vector<const SCH_PIN*> pinsToSearch;
2075 std::vector<const SCH_PIN*> altPinsToSearch;
2077 if( isReferenceFunction || isShortReferenceFunction || isUnitFunction )
2080 pinsToSearch.push_back(
pin );
2085 pinsToSearch.push_back(
pin );
2088 altPinsToSearch.push_back(
pin );
2093 if(
pin->GetNumber() == pinNumber )
2095 if( isReferenceFunction || isShortReferenceFunction || isUnitFunction )
2097 int pinUnit =
pin->GetUnit();
2100 if( isReferenceFunction )
2108 else if( isShortReferenceFunction )
2113 else if( isUnitFunction )
2125 else if( token->StartsWith( wxT(
"PIN_NAME" ) ) )
2127 *token =
pin->GetAlt().IsEmpty() ?
pin->GetName() :
pin->GetAlt();
2130 else if( token->StartsWith( wxT(
"PIN_BASE_NAME" ) ) )
2132 *token =
pin->GetBaseName();
2135 else if( token->StartsWith( wxT(
"PIN_ALT_LIST" ) ) )
2140 const std::map<wxString, SCH_PIN::ALT>& alts =
pin->GetAlternates();
2142 for(
const auto& [altName, altDef] : alts )
2144 if( !altList.IsEmpty() )
2145 altList += wxT(
", " );
2157 *token = wxEmptyString;
2159 else if( token->StartsWith( wxT(
"SHORT_NET_NAME" ) ) )
2162 if( netName.Lower().StartsWith( wxT(
"unconnected" ) ) )
2163 *token = wxT(
"NC" );
2167 else if( token->StartsWith( wxT(
"NET_NAME" ) ) )
2169 *token = conn->
Name();
2171 else if( token->StartsWith( wxT(
"NET_CLASS" ) ) )
2173 *token =
pin->GetEffectiveNetClass( aPath )->GetName();
2183 if(
pin->GetNumber() == pinNumber )
2186 if( token->StartsWith( wxT(
"PIN_BASE_NAME" ) ) )
2188 *token =
pin->GetBaseName();
2191 else if( token->StartsWith( wxT(
"PIN_ALT_LIST" ) ) )
2196 const std::map<wxString, SCH_PIN::ALT>& alts =
pin->GetAlternates();
2198 for(
const auto& [altName, altDef] : alts )
2200 if( !altList.IsEmpty() )
2201 altList += wxT(
", " );
2210 int pinUnit =
pin->GetUnit();
2226 if( symbol->
GetRef( &sheetPath,
false ) ==
GetRef( aPath,
false )
2229 targetPath = sheetPath;
2230 targetSymbol = symbol;
2243 *token = wxString::Format( wxT(
"<Unit %s not placed>" ),
SubReference( pinUnit,
false ) );
2249 SCH_PIN* instancePin =
nullptr;
2253 if( candidate->GetNumber() == pinNumber )
2255 instancePin = candidate;
2262 *token = wxEmptyString;
2267 if( token->StartsWith( wxT(
"PIN_NAME" ) ) )
2269 *token = instancePin->
GetAlt().IsEmpty() ? instancePin->
GetName() : instancePin->
GetAlt();
2278 *token = wxEmptyString;
2280 else if( token->StartsWith( wxT(
"SHORT_NET_NAME" ) ) )
2283 if( netName.Lower().StartsWith( wxT(
"unconnected" ) ) )
2284 *token = wxT(
"NC" );
2288 else if( token->StartsWith( wxT(
"NET_NAME" ) ) )
2290 *token = conn->
Name();
2292 else if( token->StartsWith( wxT(
"NET_CLASS" ) ) )
2302 *token = wxString::Format( wxT(
"<Unresolved: pin %s>" ), pinNumber );
2322 if( instance.m_Path ==
path )
2324 if( instance.m_Reference.IsEmpty() || aResetPrefix )
2335 if( instance.m_Reference.IsEmpty() || aResetPrefix )
2342 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2343 pin->ClearDefaultNetName( aSheetPath );
2353 if( currentReference.IsEmpty() || aResetPrefix )
2364 wxCHECK( aSheetPath.size() > 0,
false );
2369 if( instance.m_Path == aSheetPath )
2382 bool transform =
false;
2384 switch( aOrientation )
2505 wxFAIL_MSG(
"Invalid schematic symbol orientation type." );
2559 for(
int type_rotate : rotate_values )
2571 wxFAIL_MSG(
"Schematic symbol orientation matrix internal error." );
2579void SCH_SYMBOL::Show(
int nestLevel, std::ostream& os )
const
2582 NestedSpace( nestLevel, os ) <<
'<' <<
GetClass().Lower().mb_str() <<
" ref=\""
2588 for(
int i = 1; i < (int)
GetFields().size(); ++i )
2590 const wxString& value =
GetFields()[i].GetText();
2592 if( !value.IsEmpty() )
2594 NestedSpace( nestLevel + 1, os ) <<
"<field" <<
" name=\"" <<
TO_UTF8(
GetFields()[i].GetName() ) <<
'"'
2595 <<
" value=\"" <<
TO_UTF8( value ) <<
"\"/>\n";
2599 NestedSpace( nestLevel, os ) <<
"</" <<
TO_UTF8(
GetClass().Lower() ) <<
">\n";
2619 if( aIncludeFields )
2623 if( field.IsVisible() )
2624 bBox.
Merge( field.GetBoundingBox() );
2638 catch(
const boost::bad_pointer& e )
2640 wxFAIL_MSG( wxString::Format( wxT(
"Boost pointer exception occurred: %s" ), e.what() ) );
2665 auto addExcludes = [&]()
2670 msgs.Add(
_(
"Simulation" ) );
2673 msgs.Add(
_(
"BOM" ) );
2676 msgs.Add(
_(
"Board" ) );
2678 if(
GetDNP( currentSheet ) )
2679 msgs.Add(
_(
"DNP" ) );
2681 msg = wxJoin( msgs,
'|' );
2682 msg.Replace(
'|', wxS(
", " ) );
2685 aList.emplace_back(
_(
"Exclude from" ), msg );
2696 aList.emplace_back(
_(
"Power symbol" ),
2704 aList.emplace_back(
_(
"Value" ),
2711 aList.emplace_back(
_(
"flags" ), wxString::Format(
"%X",
GetEditFlags() ) );
2716 msg =
_(
"Missing parent" );
2718 std::shared_ptr<LIB_SYMBOL> parent =
m_part->GetParent().lock();
2721 msg = parent->GetName();
2725 else if( !
m_lib_id.GetLibNickname().empty() )
2727 aList.emplace_back(
_(
"Library" ),
m_lib_id.GetLibNickname() );
2731 aList.emplace_back(
_(
"Library" ),
_(
"Undefined!!!" ) );
2739 msg =
_(
"<Unknown>" );
2741 aList.emplace_back(
_(
"Footprint" ), msg );
2745 _(
"Keywords" ) + wxT(
": " ) +
m_part->GetKeyWords() );
2750 aList.emplace_back(
_(
"Reference" ),
GetRef( currentSheet ) );
2759 if( libNickname.empty() )
2760 msg =
_(
"No library defined!" );
2762 msg.Printf(
_(
"Symbol not found in %s!" ), libNickname );
2764 aList.emplace_back(
_(
"Library" ), msg );
2799 field.SetTextPos( pos );
2817 field.SetTextPos( pos );
2836 field.SetTextPos( pos );
2857 if( drawItem.Matches( aSearchData, aAuxData ) )
2868 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2876 aItemList.push_back( item );
2882 std::vector<DANGLING_END_ITEM>& aItemListByPos,
const SCH_SHEET_PATH* aPath )
2884 bool changed =
false;
2886 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2888 bool previousState =
pin->IsDangling();
2889 pin->SetIsDangling(
true );
2894 bool do_break =
false;
2896 for(
auto it = lower; it < aItemListByPos.end() && it->GetPosition() == pos; it++ )
2915 pin->SetIsDangling(
false );
2926 changed = ( changed || ( previousState !=
pin->IsDangling() ) );
2951 wxCHECK( symbol,
false );
2957 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2959 if(
pin->IsDangling() )
2972 if(
GetRef( aInstance ) != symbol->
GetRef( aInstance ) )
2982 for(
size_t i = 0; i <
m_pins.size(); i++ )
2994 std::vector<VECTOR2I> retval;
2996 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3000 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit() :
GetUnit();
3001 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle() :
GetBodyStyle();
3003 if( pin_unit > 0 && pin_unit !=
GetUnit() )
3006 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
3032 return wxString::Format(
_(
"Symbol %s [%s]" ),
3040 for(
KICAD_T scanType : aScanTypes )
3085 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3089 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit() :
GetUnit();
3090 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle() :
GetBodyStyle();
3092 if( pin_unit > 0 && pin_unit !=
GetUnit() )
3095 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
3132 std::vector<SCH_FIELD*> fields, otherFields;
3135 aSymbol.
GetFields( otherFields,
false );
3137 if( fields.size() != otherFields.size() )
3140 for(
int ii = 0; ii < (int) fields.size(); ii++ )
3145 if( fields[ii]->GetText().Cmp( otherFields[ii]->GetText() ) != 0 )
3155 return !( *
this == aSymbol );
3161 wxCHECK_MSG(
Type() == aSymbol.
Type(), *
this,
3162 wxT(
"Cannot assign object type " ) + aSymbol.
GetClass() + wxT(
" to type " ) +
GetClass() );
3164 if( &aSymbol !=
this )
3181 field.SetParent(
this );
3193 bBox.
Inflate( aAccuracy / 2 );
3209 rect.
Inflate( aAccuracy / 2 );
3231 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3244 if(
pin->GetLocalPosition() == new_pos )
3259 const VECTOR2I& aOffset,
bool aDimmed )
3273 for(
unsigned i = 0; i < tempPins.size(); ++i )
3276 SCH_PIN* tempPin = tempPins[i];
3296 text->SetText(
dummy.GetShownText(
false ) );
3305 for(
bool local_background : {
true,
false } )
3311 field.ClearRenderCache();
3315 && ( field.IsVisible() || field.IsForceVisible() ) )
3325 if(
GetDNP( sheet, variant ) )
3331 std::vector<wxString> properties;
3335 wxString text_field = field.GetShownText( sheet,
false, 0, variant );
3337 if( text_field.IsEmpty() )
3340 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ), field.GetName(), text_field ) );
3343 if( !
m_part->GetKeyWords().IsEmpty() )
3345 properties.emplace_back(
3346 wxString::Format( wxT(
"!%s = %s" ),
_(
"Keywords" ),
m_part->GetKeyWords() ) );
3369 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
3370 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
3388 double lineWidth = aSize / 10.0;
3390 std::vector<SCH_SHAPE> shapeList;
3392 int tolerance = 100;
3394 for(
const SCH_SHAPE& shape : shapeList )
3400 aPlotter->
BezierCurve( shape.GetStart(), shape.GetBezierC1(), shape.GetBezierC2(), shape.GetEnd(),
3401 tolerance, lineWidth );
3403 aPlotter->
Circle( shape.getCenter(), shape.GetRadius() * 2, filled, lineWidth );
3463 for(
unsigned i = 0; i < tempPins.size(); ++i )
3466 SCH_PIN* tempPin = tempPins[i];
3484 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3486 if(
pin->IsBrightened() )
3496 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3497 pin->ClearBrightened();
3515 m_part->SetShowPinNames( aShow );
3528 m_part->SetShowPinNumbers( aShow );
3534 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3536 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit() :
GetUnit();
3537 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle() :
GetBodyStyle();
3539 if( pin_unit > 0 && pin_unit !=
GetUnit() )
3542 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
3545 if(
pin->IsPointClickableAnchor( aPos ) )
3564 if( pin_list.size() != 1 )
3582 if( pin_list.size() != 1 )
3594 return m_part->IsLocalPower();
3603 return m_part->IsGlobalPower();
3615 wxCHECK(
m_part,
false );
3617 return m_part->IsNormal();
3623 std::unordered_set<wxString> componentClass;
3625 auto getComponentClassFields = [&](
const std::vector<SCH_FIELD>& fields )
3629 if( field.GetCanonicalName() == wxT(
"Component Class" ) )
3631 if( field.GetShownText( aPath,
false ) != wxEmptyString )
3632 componentClass.insert( field.GetShownText( aPath,
false ) );
3638 getComponentClassFields(
m_fields );
3645 getComponentClassFields( label->GetFields() );
3649 return componentClass;
3654 const wxString& aVariantName )
const
3659 return std::nullopt;
3661 return instance.
m_Variants.find( aVariantName )->second;
3673 instance->
m_Variants.insert( std::make_pair( aVariant.
m_Name, aVariant ) );
3682 if( !instance || !instance->
m_Variants.contains( aVariantName ) )
3690 const wxString& aNewName )
3695 if( !instance || !instance->
m_Variants.contains( aOldName ) )
3700 variant.
m_Name = aNewName;
3702 instance->
m_Variants.insert( std::make_pair( aNewName, variant ) );
3707 const wxString& aNewVariant )
3712 if( !instance || !instance->
m_Variants.contains( aSourceVariant ) )
3717 variant.
m_Name = aNewVariant;
3718 instance->
m_Variants.insert( std::make_pair( aNewVariant, variant ) );
3750 for(
unsigned i = 0; i <
m_pins.size(); ++i )
3778 double aLineWidth,
bool aHorizontal )
3782 double x_right = aSize / 1.6180339887;
3783 double x_middle = x_right / 2.0;
3796 aShapeList.back().SetStart( bottomPt );
3797 aShapeList.back().SetBezierC1( bottomAnchorPt );
3798 aShapeList.back().SetBezierC2( leftSideAnchorPt1 );
3799 aShapeList.back().SetEnd( leftPt );
3803 aShapeList.back().SetStart( leftPt );
3804 aShapeList.back().SetBezierC1( leftSideAnchorPt2 );
3805 aShapeList.back().SetBezierC2( rightSideAnchorPt2 );
3806 aShapeList.back().SetEnd( rightPt );
3809 aShapeList.back().SetStart( rightPt );
3810 aShapeList.back().SetBezierC1( rightSideAnchorPt1 );
3811 aShapeList.back().SetBezierC2( bottomAnchorPt );
3812 aShapeList.back().SetEnd( bottomPt );
3815 aShapeList.back().SetCenter( ( leftPt + rightPt ) / 2.0 );
3816 aShapeList.back().SetRadius( aSize / 15.0 );
3821 shape.Rotate(
VECTOR2I( 0, 0 ),
true );
3832 if( instance.m_Path == aSheetPath )
3844 if( instance.m_Path == aSheetPath )
3880 auto hasLibPart = [](
INSPECTABLE* aItem ) ->
bool
3883 return symbol->GetLibSymbolRef() !=
nullptr;
3896 const wxString groupFields =
_HKI(
"Fields" );
3916 auto multiUnit = [=](
INSPECTABLE* aItem ) ->
bool
3919 return symbol->IsMultiUnit();
3924 auto multiBodyStyle = [=](
INSPECTABLE* aItem ) ->
bool
3927 return symbol->IsMultiBodyStyle();
3938 wxPGChoices choices;
3942 for(
int ii = 1; ii <= symbol->GetUnitCount(); ii++ )
3943 choices.Add( symbol->GetUnitDisplayName( ii,
false ), ii );
3955 wxPGChoices choices;
3959 for(
int ii = 1; ii <= symbol->GetBodyStyleCount(); ii++ )
3960 choices.Add( symbol->GetBodyStyleDescription( ii,
false ) );
3966 const wxString groupAttributes =
_HKI(
"Attributes" );
constexpr EDA_IU_SCALE schIUScale
BITMAPS
A list of all bitmap identifiers.
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr const Vec GetEnd() const
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
constexpr coord_type GetY() const
constexpr size_type GetWidth() const
constexpr coord_type GetX() const
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
constexpr ecoord_type GetArea() const
Return the area of the rectangle.
constexpr size_type GetHeight() const
constexpr coord_type GetLeft() const
constexpr bool Contains(const Vec &aPoint) const
constexpr const Vec & GetOrigin() const
constexpr coord_type GetRight() const
constexpr void Offset(coord_type dx, coord_type dy)
constexpr bool Intersects(const BOX2< Vec > &aRect) const
constexpr coord_type GetBottom() const
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
static std::vector< DANGLING_END_ITEM >::iterator get_lower_pos(std::vector< DANGLING_END_ITEM > &aItemListByPos, const VECTOR2I &aPos)
Helper class used to store the state of schematic items that can be connected to other schematic item...
DANGLING_END_T GetType() const
const EDA_ITEM * GetParent() const
bool IsHorizontal() const
The base class for create windows for drawing purpose.
EDA_ITEM_FLAGS GetEditFlags() const
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
virtual bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const
Compare the item against the search criteria in aSearchData.
virtual void SetParentGroup(EDA_GROUP *aGroup)
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM * m_parent
Owner.
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
const EDA_ANGLE & GetTextAngle() const
void SetTextPos(const VECTOR2I &aPoint)
void Offset(const VECTOR2I &aOffset)
static ENUM_MAP< T > & Instance()
A text control validator used for validating the text allowed in fields.
bool DoValidate(const wxString &aValue, wxWindow *aParent)
Class that other classes need to inherit from, in order to be inspectable.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
wxString AsString() const
A logical library item identifier and consists of various portions much like a URI.
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
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.
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
static wxString LetterSubReference(int aUnit, wxChar aInitialLetter)
static LIB_SYMBOL * GetDummy()
Returns a dummy LIB_SYMBOL, used when one is missing in the schematic.
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
const BOX2I GetBodyBoundingBox(int aUnit, int aBodyStyle, bool aIncludePins, bool aIncludePrivateItems) const
Get the symbol bounding box excluding fields.
EMBEDDED_FILES * GetEmbeddedFiles() override
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
const wxString GetName() const
Gets the name of this (maybe aggregate) netclass in a format for internal usage or for export to exte...
A singleton reporter that reports to nowhere.
Base plotter engine class.
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width)=0
virtual void Bookmark(const BOX2I &aBox, const wxString &aName, const wxString &aGroupName=wxEmptyString)
Create a bookmark to a symbol.
virtual void BezierCurve(const VECTOR2I &aStart, const VECTOR2I &aControl1, const VECTOR2I &aControl2, const VECTOR2I &aEnd, int aTolerance, int aLineThickness)
Generic fallback: Cubic Bezier curve rendered as a polyline.
virtual void StartBlock(void *aData)
calling this function allows one to define the beginning of a group of drawing items,...
virtual void ThickSegment(const VECTOR2I &start, const VECTOR2I &end, int width, void *aData)
virtual void HyperlinkMenu(const BOX2I &aBox, const std::vector< wxString > &aDestURLs)
Create a clickable hyperlink menu with a rectangular click area.
virtual void SetColor(const COLOR4D &color)=0
virtual void EndBlock(void *aData)
calling this function allows one to define the end of a group of drawing items for instance in SVG or...
PROPERTY_BASE & SetChoicesFunc(std::function< wxPGChoices(INSPECTABLE *)> aFunc)
PROPERTY_BASE & SetAvailableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Set a callback function to determine whether an object provides this property.
const wxString & Name() const
Provide class metadata.Helper macro to map type hashes to names.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
TEMPLATES m_TemplateFieldNames
Holds all the data relating to one schematic.
wxString GetOperatingPoint(const wxString &aNetName, int aPrecision, const wxString &aRange)
SCHEMATIC_SETTINGS & Settings() const
PROJECT & Project() const
Return a reference to the project this schematic is part of.
wxString GetCurrentVariant() const
Return the current variant being edited.
EMBEDDED_FILES * GetEmbeddedFiles() override
SCH_SHEET_PATH & CurrentSheet() const
bool ResolveCrossReference(wxString *token, int aDepth) const
Resolves text vars that refer to other items.
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
wxString LocalName() const
wxString Name(bool aIgnoreSheet=false) const
Schematic editor (Eeschema) main window.
SCH_SHEET_PATH & GetCurrentSheet() const
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
virtual const wxString & GetText() const override
Return the string associated with the text object.
void ImportValues(const SCH_FIELD &aSource)
Copy parameters from a SCH_FIELD source.
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0, const wxString &aVariantName=wxEmptyString) const
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetText(const wxString &aText) override
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
void SetPrivate(bool aPrivate)
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
AUTOPLACE_ALGO m_fieldsAutoplaced
std::unordered_set< SCH_RULE_AREA * > m_rule_areas_cache
Store pointers to rule areas which this item is contained within.
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
ALT GetAlt(const wxString &aAlt)
void SetName(const wxString &aName)
const wxString & GetName() const
bool IsDangling() const override
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
void SetShape(GRAPHIC_PINSHAPE aShape)
VECTOR2I GetPosition() const override
const wxString & GetShownName() const
void SetType(ELECTRICAL_PINTYPE aType)
const wxString & GetNumber() const
GRAPHIC_PINSHAPE GetShape() const
ELECTRICAL_PINTYPE GetType() const
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
bool GetExcludedFromBOM() const
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
wxString PathHumanReadable(bool aUseShortRootName=true, bool aStripTrailingSeparator=false, bool aEscapeSheetNames=false) const
Return the sheet path in a human readable form made from the sheet names.
bool GetExcludedFromSim() const
bool GetExcludedFromBoard() const
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
size_t size() const
Forwarded method from std::vector.
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the sheet.
Variant information for a schematic symbol.
void InitializeAttributes(const SCH_SYMBOL &aSymbol)
wxString GetUnitDisplayName(int aUnit, bool aLabel) const override
Return the display name for a given unit aUnit.
SCH_SYMBOL & operator=(const SCH_SYMBOL &aItem)
size_t GetFullPinCount() const
std::vector< SCH_SYMBOL_INSTANCE > m_instances
Define the hierarchical path and reference of the symbol.
void UpdatePrefix()
Set the prefix based on the current reference designator.
wxString m_prefix
C, R, U, Q etc - the first character(s) which typically indicate what the symbol is.
wxString GetDescription() const override
std::unordered_map< SCH_PIN *, SCH_PIN * > m_pinMap
Library pin pointer : SCH_PIN indices.
void SetMirrorX(bool aMirror)
bool IsSymbolLikePowerGlobalLabel() const
EMBEDDED_FILES * GetEmbeddedFiles() override
SCH_SYMBOLs don't currently support embedded files, but their LIB_SYMBOL counterparts do.
wxString GetSymbolIDAsString() const
LIB_ID m_lib_id
Name and library the symbol was loaded from, i.e. 74xx:74LS00.
bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
bool GetShowPinNumbers() const override
wxString GetDatasheet() const
Return the documentation text for the given part alias.
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
void SetLibId(const LIB_ID &aName)
std::vector< SCH_FIELD > & GetFields()
Return a reference to the vector holding the symbol's fields.
BOX2I GetBodyAndPinsBoundingBox() const override
Return a bounding box for the symbol body and pins but not the fields.
wxString GetBodyStyleProp() const override
void SetRefProp(const wxString &aRef)
INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &aScanTypes) override
May be re-implemented for each derived class in order to handle all the types given by its member dat...
virtual void SetDNP(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
SCH_ITEM * GetDrawItem(const VECTOR2I &aPosition, KICAD_T aType=TYPE_NOT_INIT)
Return the symbol library item at aPosition that is part of this symbol.
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
void PlotDNP(PLOTTER *aPlotter) const
Plot the red 'X' over the symbol.
bool operator!=(const SCH_SYMBOL &aSymbol) const
void SetShowPinNumbers(bool aShow) override
Set or clear the pin number visibility flag.
SYMBOL_ORIENTATION_PROP GetOrientationProp() const
SCH_SYMBOL_INSTANCE * getInstance(const KIID_PATH &aPath)
wxString SubReference(int aUnit, bool aAddSeparator=true) const
wxString GetClass() const override
Return the class name.
void RemoveInstance(const SCH_SHEET_PATH &aInstancePath)
void SetFieldText(const wxString &aFieldName, const wxString &aFieldText, const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString)
bool IsAnnotated(const SCH_SHEET_PATH *aSheet) const
Check if the symbol has a valid annotation (reference) for the given sheet path.
void SetMirrorY(bool aMirror)
void PlotPins(PLOTTER *aPlotter) const
Plot just the symbol pins.
void SetBodyStyleProp(const wxString &aBodyStyle) override
std::vector< SCH_PIN * > GetPins() const override
bool GetExcludedFromPosFilesProp() const
void RemoveField(const wxString &aFieldName)
Remove a user field from the symbol.
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.
void SetExcludedFromSimProp(bool aEnable)
void SetBodyStyle(int aBodyStyle) override
void SetShowPinNames(bool aShow) override
Set or clear the pin name visibility flag.
wxString GetKeyWords() const override
wxString GetSchSymbolLibraryName() const
wxString GetShownKeyWords(int aDepth=0) const override
std::optional< SCH_SYMBOL_VARIANT > GetVariant(const SCH_SHEET_PATH &aInstance, const wxString &aVariantName) const
bool GetExcludedFromBoardProp() const
void ClearBrightenedPins()
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
bool HasConnectivityChanges(const SCH_ITEM *aItem, const SCH_SHEET_PATH *aInstance=nullptr) const override
Check if aItem has connectivity changes against this object.
std::vector< const SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
bool GetExcludedFromSimProp() const
bool GetExcludedFromBOM(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
bool IsGlobalPower() const override
wxString GetRefProp() const
wxString GetBodyStyleDescription(int aBodyStyle, bool aLabel) const override
bool AddSheetPathReferenceEntryIfMissing(const KIID_PATH &aSheetPath)
Add an instance to the alternate references list (m_instances), if this entry does not already exist.
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
void SetExcludedFromBOMProp(bool aEnable)
static std::unordered_map< TRANSFORM, int > s_transformToOrientationCache
void UpdatePins()
Updates the cache of SCH_PIN objects for each pin.
SCH_FIELD * FindFieldCaseInsensitive(const wxString &aFieldName)
Search for a SCH_FIELD with aFieldName.
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
bool IsPointClickableAnchor(const VECTOR2I &aPos) const override
void UpdateFields(const SCH_SHEET_PATH *aPath, bool aUpdateStyle, bool aUpdateRef, bool aUpdateOtherFields, bool aResetRef, bool aResetOtherFields)
Restore fields to the original library values.
wxString m_schLibSymbolName
The name used to look up a symbol in the symbol library embedded in a schematic.
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
const wxString GetValue(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText, const wxString &aVariantName=wxEmptyString) const override
void ClearAnnotation(const SCH_SHEET_PATH *aSheetPath, bool aResetPrefix)
Clear exiting symbol annotation.
void RenameVariant(const KIID_PATH &aPath, const wxString &aOldName, const wxString &aNewName)
void SetOrientationProp(SYMBOL_ORIENTATION_PROP aAngle)
Orientation/mirroring access for property manager.
bool GetShowPinNames() const override
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
bool HasDeMorganBodyStyles() const override
std::vector< SCH_FIELD > m_fields
Variable length list of fields.
std::vector< SCH_PIN * > GetAllLibPins() const
const wxString GetFootprintFieldText(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText, const wxString &aVariantName=wxEmptyString) const
int GetBodyStyleCount() const override
Return the number of body styles of the symbol.
void SetOrientation(int aOrientation)
Compute the new transform matrix based on aOrientation for the symbol which is applied to the current...
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void SetFootprintFieldText(const wxString &aFootprint)
bool doIsConnected(const VECTOR2I &aPosition) const override
Provide the object specific test to see if it is connected to aPosition.
void AddHierarchicalReference(const KIID_PATH &aPath, const wxString &aRef, int aUnit)
Add a full hierarchical reference to this symbol.
bool IsMissingLibSymbol() const
Check to see if the library symbol is set to the dummy library symbol.
VECTOR2I GetPosition() const override
std::unique_ptr< LIB_SYMBOL > m_part
A flattened copy of the LIB_SYMBOL from the PROJECT object's libraries.
int GetNextFieldOrdinal() const
Return the next ordinal for a user field for this symbol.
void SetExcludedFromPosFiles(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
void SyncOtherUnits(const SCH_SHEET_PATH &aSourceSheet, SCH_COMMIT &aCommit, PROPERTY_BASE *aProperty, const wxString &aVariantName=wxEmptyString)
Keep fields other than the reference, include/exclude flags, and alternate pin assignments in sync in...
void Init(const VECTOR2I &pos=VECTOR2I(0, 0))
void SetExcludedFromPosFilesProp(bool aEnable)
wxString GetShownDescription(int aDepth=0) const override
const LIB_ID & GetLibId() const override
bool operator<(const SCH_ITEM &aItem) const override
static void BuildLocalPowerIconShape(std::vector< SCH_SHAPE > &aShapeList, const VECTOR2D &aPos, double aSize, double aLineWidth, bool aHorizontal)
Build the local power pin indicator icon shape, at coordinate aPos.
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this symbol.
void SetValueProp(const wxString &aValue)
void SetUnitProp(int aUnit)
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
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 UpdateDanglingState(std::vector< DANGLING_END_ITEM > &aItemListByType, std::vector< DANGLING_END_ITEM > &aItemListByPos, const SCH_SHEET_PATH *aPath=nullptr) override
Test if the symbol's dangling state has changed for all pins.
bool GetExcludedFromPosFiles(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
bool GetInstance(SCH_SYMBOL_INSTANCE &aInstance, const KIID_PATH &aSheetPath, bool aTestFromEnd=false) const
void AddVariant(const SCH_SHEET_PATH &aInstance, const SCH_SYMBOL_VARIANT &aVariant)
BOX2I doGetBoundingBox(bool aIncludePins, bool aIncludeFields) const
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
void SetDNPProp(bool aEnable)
bool GetExcludedFromBoard(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
std::vector< SCH_PIN * > GetPinsByNumber(const wxString &aNumber) const
Find all symbol pins with the given number.
void GetEndPoints(std::vector< DANGLING_END_ITEM > &aItemList) override
Add the schematic item end points to aItemList if the item has end points.
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
bool m_isInNetlist
True if the symbol should appear in netlist.
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.
wxString GetValueProp() const
bool IsLocalPower() const override
void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode) override
int GetUnitCount() const override
Return the number of units per package of the symbol.
void SetPrefix(const wxString &aPrefix)
int GetOrientation() const override
Get the display symbol orientation.
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
bool IsSymbolLikePowerLocalLabel() const
bool GetExcludedFromBOMProp() const
void SetUnitSelection(const SCH_SHEET_PATH *aSheet, int aUnitSelection)
Set the selected unit of this symbol on one sheet.
void SetExcludedFromBoardProp(bool aEnable)
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.
void PlotLocalPowerIconShape(PLOTTER *aPlotter) const
Plot the local power pin indicator icon shape.
bool IsNormal() const override
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
std::unordered_set< wxString > GetComponentClassNames(const SCH_SHEET_PATH *aPath) const
Return the component classes this symbol belongs in.
std::vector< std::unique_ptr< SCH_PIN > > m_pins
A SCH_PIN for every #LIB_PIN.
void DeleteVariant(const KIID_PATH &aPath, const wxString &aVariantName)
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
VECTOR2I GetPinPhysicalPosition(const SCH_PIN *Pin) const
BOX2I GetBodyBoundingBox() const override
Return a bounding box for the symbol body but not the pins or fields.
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 Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
bool IsMovableFromAnchorPoint() const override
Return true for items which are moved with the anchor point at mouse cursor and false for items moved...
bool IsPower() const override
void SetExcludedFromBoard(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
void CopyVariant(const KIID_PATH &aPath, const wxString &aSourceVariant, const wxString &aNewVariant)
bool operator==(const SCH_SYMBOL &aSymbol) const
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
SIM_MODEL & CreateModel(SIM_MODEL::TYPE aType, const std::vector< SCH_PIN * > &aPins, REPORTER &aReporter)
void SetFilesStack(std::vector< EMBEDDED_FILES * > aFilesStack)
A base class for LIB_SYMBOL and SCH_SYMBOL.
bool m_DNP
True if symbol is set to 'Do Not Populate'.
bool m_excludedFromPosFiles
virtual void SetShowPinNumbers(bool aShow)
Set or clear the pin number visibility flag.
const TRANSFORM & GetTransform() const
virtual void SetShowPinNames(bool aShow)
Set or clear the pin name visibility flag.
virtual bool GetShowPinNames() const
SYMBOL & operator=(const SYMBOL &aItem)
virtual bool GetShowPinNumbers() const
TRANSFORM m_transform
The rotation/mirror transformation.
const std::vector< TEMPLATE_FIELDNAME > & GetTemplateFieldNames()
Return a template field name list for read only access.
std::map< wxString, wxString > m_Fields
bool m_ExcludedFromPosFiles
#define DEFAULT_LINE_WIDTH_MILS
The default wire width in mils. (can be changed in preference menu)
T Convert(const wxString &aValue)
Convert a wxString to a generic type T.
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_VERTICAL
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
static constexpr EDA_ANGLE ANGLE_270
const INSPECTOR_FUNC & INSPECTOR
std::function passed to nested users by ref, avoids copying std::function.
#define STRUCT_DELETED
flag indication structures to be erased
#define SKIP_STRUCT
flag indicating that the structure should be ignored
#define IS_DANGLING
indicates a pin is dangling
@ FILLED_SHAPE
Fill with object color.
a few functions useful in geometry calculations.
const wxChar *const traceSchSymbolRef
Flag to enable debug output of schematic symbol reference resolution.
const wxChar *const traceSchSheetPaths
Flag to enable debug output of schematic symbol sheet path manipulation code.
SCH_LAYER_ID
Eeschema drawing layers.
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
Message panel definition file.
bool BoxHitTest(const VECTOR2I &aHitPoint, const BOX2I &aHittee, int aAccuracy)
Perform a point-to-box hit test.
KICOMMON_API wxString EllipsizeMenuText(const wxString &aString)
Ellipsize text (at the end) to be no more than 36 characters.
KICOMMON_API wxString EllipsizeStatusText(wxWindow *aWindow, const wxString &aString)
Ellipsize text (at the end) to be no more than 1/3 of the window width.
wxString GetRefDesPrefix(const wxString &aRefDes)
Get the (non-numeric) prefix from a refdes - e.g.
wxString GetRefDesUnannotated(const wxString &aSource)
Return an unannotated refdes from either a prefix or an existing refdes.
@ PT_NC
not connected (must be left open)
@ PT_POWER_IN
power input (GND, VCC for ICs). Must be connected to a power output.
#define NO_SETTER(owner, type)
#define ENUM_TO_WXANY(type)
Macro to define read-only fields (no setter method available)
@ PT_COORD
Coordinate expressed in distance units (mm/inch)
Collection of utility functions for component reference designators (refdes)
void CollectOtherUnits(const wxString &aRef, int aUnit, const LIB_ID &aLibId, SCH_SHEET_PATH &aSheet, std::vector< SCH_SYMBOL * > *otherUnits)
const SCH_FIELD * FindField(const std::vector< SCH_FIELD > &aFields, FIELD_T aFieldId)
int NextFieldOrdinal(const std::vector< SCH_FIELD > &aFields)
std::string toUTFTildaText(const wxString &txt)
Convert a wxString to UTF8 and replace any control characters with a ~, where a control character is ...
static void plotLocalPowerIcon(PLOTTER *aPlotter, const VECTOR2D &aPos, double aSize, bool aRotate)
plot a local power pin indicator icon.
static struct SCH_SYMBOL_DESC _SCH_SYMBOL_DESC
std::vector< FAB_LAYER_COLOR > dummy
wxString UnescapeString(const wxString &aSource)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
std::vector< std::pair< FIELD_T, wxString > > Fields
A simple container for schematic symbol instance information.
std::map< wxString, SCH_SYMBOL_VARIANT > m_Variants
A list of symbol variants.
Hold a name of a symbol's field, field value, and default visibility.
@ SYM_ROTATE_COUNTERCLOCKWISE
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
@ USER
The field ID hasn't been set yet; field is invalid.
@ DESCRIPTION
Field Description of part, i.e. "1/4W 1% Metal Film Resistor".
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ DATASHEET
name of datasheet
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
wxString GetCanonicalFieldName(FIELD_T aFieldType)
wxString result
Test unit parsing edge cases and error handling.
wxLogTrace helper definitions.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
@ SCH_FIELD_LOCATE_REFERENCE_T
@ SCH_FIELD_LOCATE_FOOTPRINT_T
@ SCH_FIELD_LOCATE_VALUE_T
@ SCH_FIELD_LOCATE_DATASHEET_T
@ SCH_SYMBOL_LOCATE_POWER_T
Custom text control validator definitions.
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D