59 std::string ret =
TO_UTF8( txt );
63 if( (
unsigned char) c <=
' ' )
89 std::unique_ptr< LIB_SYMBOL > part;
118 SCH_SYMBOL( aSymbol, aSel.LibId, aSheet, aSel.Unit, aSel.
Convert, aPosition, aParent )
121 for(
const auto& [fieldId, fieldValue] : aSel.
Fields )
123 if( fieldId == FIELD_T::REFERENCE )
124 SetRef( aSheet, fieldValue );
125 else if( SCH_FIELD* field = GetField( fieldId ) )
126 field->SetText( fieldValue );
151 field.SetParent(
this );
156 for(
const std::unique_ptr<SCH_PIN>&
pin : aSymbol.
m_pins )
158 m_pins.emplace_back( std::make_unique<SCH_PIN>( *pin ) );
159 m_pins.back()->SetParent( this );
223 const int min_grid_size =
schIUScale.MilsToIU( 25 );
225 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
227 if( ( (
pin->GetPosition().x -
m_pos.x ) % min_grid_size ) != 0 )
230 if( ( (
pin->GetPosition().y -
m_pos.y ) % min_grid_size ) != 0 )
255 wxCHECK2( !aLibSymbol || aLibSymbol->
IsRoot(), aLibSymbol =
nullptr );
257 m_part.reset( aLibSymbol );
262 pin->SetLibPin(
nullptr );
271 return m_part->GetDescription();
273 return wxEmptyString;
280 return m_part->GetKeyWords();
282 return wxEmptyString;
289 return m_part->GetDatasheetField().GetText();
291 return wxEmptyString;
297 std::map<wxString, wxString> altPinMap;
298 std::map<wxString, SCH_PIN::ALT> altPinDefs;
299 std::map<wxString, std::set<SCH_PIN*>> pinUuidMap;
300 std::set<SCH_PIN*> unassignedSchPins;
301 std::set<SCH_PIN*> unassignedLibPins;
303 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
305 pinUuidMap[
pin->GetNumber() ].insert(
pin.get() );
307 unassignedSchPins.insert(
pin.get() );
309 if( !
pin->GetAlt().IsEmpty() )
311 altPinMap[
pin->GetNumber() ] =
pin->GetAlt();
312 auto altDefIt =
pin->GetAlternates().find(
pin->GetAlt() );
314 if( altDefIt !=
pin->GetAlternates().end() )
315 altPinDefs[
pin->GetNumber() ] = altDefIt->second;
318 pin->SetLibPin(
nullptr );
335 auto ii = pinUuidMap.find( libPin->GetNumber() );
337 if( ii == pinUuidMap.end() || ii->second.empty() )
339 unassignedLibPins.insert( libPin );
343 auto it = ii->second.begin();
345 ii->second.erase( it );
346 pin->GetAlternates() = libPin->GetAlternates();
347 pin->SetLibPin( libPin );
348 pin->SetPosition( libPin->GetPosition() );
349 pin->SetUnit( libPin->GetUnit() );
350 pin->SetBodyStyle( libPin->GetBodyStyle() );
352 unassignedSchPins.erase(
pin );
354 auto iii = altPinMap.find( libPin->GetNumber() );
356 if( iii != altPinMap.end() )
358 wxString altName = iii->second;
360 if(
pin->GetAlternates().find( altName ) ==
pin->GetAlternates().end() )
362 auto defIt = altPinDefs.find( libPin->GetNumber() );
364 if( defIt != altPinDefs.end() )
366 for(
const auto& [
name, alt ] :
pin->GetAlternates() )
368 if( alt.m_Shape == defIt->second.m_Shape && alt.m_Type == defIt->second.m_Type )
377 pin->SetAlt( altName );
384 for(
SCH_PIN* libPin : unassignedLibPins )
389 if( !unassignedSchPins.empty() )
391 auto it = unassignedSchPins.begin();
393 unassignedSchPins.erase( it );
398 pin =
m_pins.emplace_back( std::make_unique<SCH_PIN>(
SCH_PIN(
this, libPin ) ) ).get();
402 pin->GetAlternates() = libPin->GetAlternates();
403 pin->SetLibPin( libPin );
404 pin->SetPosition( libPin->GetPosition() );
405 pin->SetUnit( libPin->GetUnit() );
406 pin->SetBodyStyle( libPin->GetBodyStyle() );
407 pin->SetNumber( libPin->GetNumber() );
409 auto iii = altPinMap.find( libPin->GetNumber() );
411 if( iii != altPinMap.end() )
413 wxString altName = iii->second;
415 if(
pin->GetAlternates().find( altName ) ==
pin->GetAlternates().end() )
417 auto defIt = altPinDefs.find( libPin->GetNumber() );
419 if( defIt != altPinDefs.end() )
421 for(
const auto& [
name, alt ] :
pin->GetAlternates() )
423 if( alt.m_Shape == defIt->second.m_Shape && alt.m_Type == defIt->second.m_Type )
432 pin->SetAlt( altName );
437 for(
auto it1 =
m_pins.begin(); it1 !=
m_pins.end() && !unassignedSchPins.empty(); )
439 auto it2 = unassignedSchPins.find( it1->get() );
441 if( it2 != unassignedSchPins.end() )
443 it1 =
m_pins.erase( it1 );
444 unassignedSchPins.erase( it2 );
455 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
477 return m_part->GetUnitCount();
486 return m_part->GetBodyStyleCount();
495 return m_part->HasDeMorganBodyStyles();
504 return m_part->GetUnitDisplayName( aUnit, aLabel );
506 return wxString::Format(
_(
"Unit %s" ),
SubReference( aUnit ) );
515 return m_part->GetBodyStyleDescription( aBodyStyle, aLabel );
522 bool aTestFromEnd )
const
528 if( instance.m_Path == aSheetPath )
530 aInstance = instance;
534 else if( instance.m_Path.EndsWith( aSheetPath ) )
536 aInstance = instance;
561 " reference %s, unit %d from symbol %s." ),
619 if( instance.m_Path ==
path )
621 ref = instance.m_Reference;
661 if( instance.m_Path ==
path )
664 instance.m_Reference = ref;
672 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
673 pin->ClearDefaultNetName( sheet );
695 if( instance.m_Path ==
path )
696 return !instance.m_Reference.IsEmpty() && instance.m_Reference.Last() !=
'?';
707 refDesignator.Replace(
"~",
" " );
709 wxString prefix = refDesignator;
711 while( prefix.Length() )
713 wxUniCharRef last = prefix.Last();
715 if( ( last >=
'0' && last <=
'9' ) || last ==
'?' || last ==
'*' )
723 prefix.Trim(
false );
725 if( !prefix.IsEmpty() )
733 return schematic->Settings().SubReference( aUnit, aAddSeparator );
745 if( instance.m_Path ==
path )
746 return instance.m_Unit;
762 if( instance.m_Path ==
path )
764 instance.m_Unit = aUnitSelection;
776 if( !aInstance || aVariantName.IsEmpty() )
785 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
788 if( aVariantName.IsEmpty() )
790 instance.
m_DNP = aEnable;
794 if( instance.
m_Variants.contains( aVariantName ) )
796 instance.
m_Variants[aVariantName].m_DNP = aEnable;
803 variant.
m_DNP = aEnable;
812 if( !aInstance || aVariantName.IsEmpty() )
818 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
821 if( aVariantName.IsEmpty() )
823 return instance.
m_DNP;
827 wxCHECK_MSG( instance.
m_Variants.contains( aVariantName ),
false,
828 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s' for variant '%s'." ),
831 return instance.
m_Variants[aVariantName].m_DNP;
838 for(
const wxString& variantName : aVariantNames )
839 SetDNP( aEnable, &aInstance, variantName );
844 const wxString& aVariantName )
846 if( !aInstance || aVariantName.IsEmpty() )
855 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
858 if( aVariantName.IsEmpty() )
864 if( instance.
m_Variants.contains( aVariantName ) )
866 instance.
m_Variants[aVariantName].m_ExcludedFromBOM = aEnable;
882 if( !aInstance || aVariantName.IsEmpty() )
888 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
891 if( aVariantName.IsEmpty() )
897 wxCHECK_MSG( instance.
m_Variants.contains( aVariantName ),
false,
898 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s' variant '%s'." ),
901 return instance.
m_Variants[aVariantName].m_ExcludedFromBOM;
907 const std::vector<wxString>& aVariantNames )
909 for(
const wxString& variantName : aVariantNames )
916 if( !aInstance || aVariantName.IsEmpty() )
925 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
928 if( aVariantName.IsEmpty() )
934 if( instance.
m_Variants.contains( aVariantName ) )
936 instance.
m_Variants[aVariantName].m_ExcludedFromSim = aEnable;
952 if( !aInstance || aVariantName.IsEmpty() )
958 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
961 if( aVariantName.IsEmpty() )
967 wxCHECK_MSG( instance.
m_Variants.contains( aVariantName ),
false,
968 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s' variant '%s'." ),
971 return instance.
m_Variants[aVariantName].m_ExcludedFromSim;
977 const std::vector<wxString>& aVariantNames )
979 for(
const wxString& variantName : aVariantNames )
987 instance.m_Unit = aUnitSelection;
992 bool aAllowExtraText )
const
1008 bool aAllowExtraText )
const
1028 m_fields.emplace_back(
this, aFieldType );
1057 if( !field.IsVisible() || field.GetText().IsEmpty() )
1061 aVector.push_back(
const_cast<SCH_FIELD*
>( &field ) );
1064 std::sort( aVector.begin(), aVector.end(),
1067 return lhs->GetOrdinal() < rhs->GetOrdinal();
1087 for(
unsigned ii = 0; ii <
m_fields.size(); ++ii )
1092 if( aFieldName ==
m_fields[ii].GetName(
false ) )
1105 if( field.GetName().IsSameAs( aFieldName,
false ) )
1114 bool aUpdateOtherFields,
bool aResetRef,
bool aResetOtherFields )
1118 std::vector<SCH_FIELD*> fields;
1119 m_part->GetFields( fields );
1121 for(
const SCH_FIELD* libField : fields )
1126 if( libField->IsMandatory() )
1128 fieldType = libField->GetId();
1133 schField =
GetField( libField->GetCanonicalName() );
1143 schField->
SetPrivate( libField->IsPrivate() );
1155 else if( aUpdateRef )
1156 SetRef( aPath, libField->GetText() );
1164 if( aResetOtherFields )
1166 else if( aUpdateOtherFields )
1167 schField->
SetText( libField->GetText() );
1171 if( aResetOtherFields || aUpdateOtherFields )
1172 schField->
SetText( libField->GetText() );
1182 bool updateValue =
true;
1183 bool updateExclFromBOM =
true;
1184 bool updateExclFromBoard =
true;
1185 bool updateDNP =
true;
1186 bool updateOtherFields =
true;
1187 bool updatePins =
true;
1191 updateValue = aProperty->
Name() ==
_HKI(
"Value" );
1192 updateExclFromBoard = aProperty->
Name() ==
_HKI(
"Exclude From Board" );
1193 updateExclFromBOM = aProperty->
Name() ==
_HKI(
"Exclude From Bill of Materials" );
1194 updateDNP = aProperty->
Name() ==
_HKI(
"Do not Populate" );
1195 updateOtherFields =
false;
1200 && !updateExclFromBOM
1201 && !updateExclFromBoard
1203 && !updateOtherFields
1213 wxString ref =
GetRef( &aSourceSheet );
1218 std::vector<SCH_SYMBOL*> otherUnits;
1224 aCommit.
Modify( otherUnit, screen );
1229 if( updateOtherFields )
1241 if( field.IsMandatory() )
1242 otherField = otherUnit->GetField( field.GetId() );
1244 otherField = otherUnit->GetField( field.GetName() );
1248 otherField->
SetText( field.GetText() );
1256 newField.
Offset( otherUnit->GetPosition() );
1259 otherUnit->AddField( newField );
1263 for(
int ii = (
int) otherUnit->GetFields().size() - 1; ii >= 0; ii-- )
1265 SCH_FIELD& otherField = otherUnit->GetFields()[ii];
1268 otherUnit->GetFields().erase( otherUnit->GetFields().begin() + ii );
1272 if( updateExclFromBOM )
1275 if( updateExclFromBoard )
1279 otherUnit->SetDNP(
GetDNP( &aSourceSheet ), &sheet );
1283 for(
const std::unique_ptr<SCH_PIN>& model_pin :
m_pins )
1285 SCH_PIN* src_pin = otherUnit->GetPin( model_pin->GetNumber() );
1288 src_pin->
SetAlt( model_pin->GetAlt() );
1299 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1300 aFunction(
pin.get() );
1303 aFunction( &field );
1309 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1311 if(
pin->GetNumber() == aNumber )
1321 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1323 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit()
1325 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle()
1328 if( pin_unit > 0 && pin_unit !=
GetUnit() )
1331 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
1334 if(
pin->GetPosition() == aPos )
1347 return std::vector<SCH_PIN*>();
1354 return m_part->GetPins();
1356 return std::vector<SCH_PIN*>();
1368 auto it =
m_pinMap.find( aLibPin );
1373 wxFAIL_MSG_AT(
"Pin not found", __FILE__, __LINE__, __FUNCTION__ );
1380 std::vector<SCH_PIN*> pins;
1389 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1391 if( unit &&
pin->GetUnit() &&
pin->GetUnit() != unit )
1394 pins.push_back(
pin.get() );
1410 wxT(
"Cannot swap data with invalid symbol." ) );
1418 for( std::unique_ptr<SCH_PIN>&
pin : symbol->
m_pins )
1419 pin->SetParent( symbol );
1421 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1422 pin->SetParent(
this );
1427 m_part.reset( libSymbol );
1461 if( field.IsPrivate() )
1464 if( field.IsMandatory() )
1465 aVars->push_back( field.GetCanonicalName().Upper() );
1467 aVars->push_back( field.GetName() );
1470 aVars->push_back( wxT(
"OP" ) );
1471 aVars->push_back( wxT(
"FOOTPRINT_LIBRARY" ) );
1472 aVars->push_back( wxT(
"FOOTPRINT_NAME" ) );
1473 aVars->push_back( wxT(
"UNIT" ) );
1474 aVars->push_back( wxT(
"SHORT_REFERENCE" ) );
1475 aVars->push_back( wxT(
"SYMBOL_LIBRARY" ) );
1476 aVars->push_back( wxT(
"SYMBOL_NAME" ) );
1477 aVars->push_back( wxT(
"SYMBOL_DESCRIPTION" ) );
1478 aVars->push_back( wxT(
"SYMBOL_KEYWORDS" ) );
1479 aVars->push_back( wxT(
"EXCLUDE_FROM_BOM" ) );
1480 aVars->push_back( wxT(
"EXCLUDE_FROM_BOARD" ) );
1481 aVars->push_back( wxT(
"EXCLUDE_FROM_SIM" ) );
1482 aVars->push_back( wxT(
"DNP" ) );
1483 aVars->push_back( wxT(
"SHORT_NET_NAME(<pin_number>)" ) );
1484 aVars->push_back( wxT(
"NET_NAME(<pin_number>)" ) );
1485 aVars->push_back( wxT(
"NET_CLASS(<pin_number>)" ) );
1486 aVars->push_back( wxT(
"PIN_NAME(<pin_number>)" ) );
1492 static wxRegEx operatingPoint( wxT(
"^"
1499 wxCHECK( aPath,
false );
1506 if( operatingPoint.Matches( *token ) )
1508 wxString
pin( operatingPoint.GetMatch( *token, 1 ).Lower() );
1509 wxString precisionStr( operatingPoint.GetMatch( *token, 3 ) );
1510 wxString rangeStr( operatingPoint.GetMatch( *token, 4 ) );
1512 int precision = precisionStr.IsEmpty() ? 3 : precisionStr[0] -
'0';
1513 wxString range = rangeStr.IsEmpty() ? wxString( wxS(
"~A" ) ) : rangeStr;
1517 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
1521 embeddedFilesStack.push_back(
m_part->GetEmbeddedFiles() );
1527 true, aDepth + 1, devnull ).model;
1532 spiceRef = spiceRef.Lower();
1539 else if(
pin == wxS(
":power" ) )
1541 if( rangeStr.IsEmpty() )
1542 range = wxS(
"~W" );
1544 *token = schematic->
GetOperatingPoint( spiceRef + wxS(
":power" ), precision, range );
1549 pin =
pin.SubString( 1, -1 );
1551 for(
const std::reference_wrapper<const SIM_MODEL_PIN>& modelPin : model.
GetPins() )
1553 SCH_PIN* symbolPin =
GetPin( modelPin.get().symbolPinNumber );
1557 if( model.
GetPins().size() == 2 )
1563 wxString signalName = spiceRef + wxS(
":" ) + modelPin.get().modelPinName;
1572 *token = wxS(
"?" );
1576 if( token->Contains(
':' ) )
1584 wxString fieldName = field.IsMandatory() ? field.GetCanonicalName()
1587 wxString textToken = field.GetText();
1588 textToken.Replace(
" ", wxEmptyString );
1589 wxString tokenString =
"${" + fieldName +
"}";
1592 if( textToken.IsSameAs( tokenString,
false ) )
1595 if( token->IsSameAs( fieldName,
false ) )
1598 *token =
GetRef( aPath,
true );
1600 *token = field.GetShownText( aPath,
false, aDepth + 1 );
1607 if( token->IsSameAs( wxT(
"SIM.DEVICE" ) )
1608 || token->IsSameAs( wxT(
"SIM.TYPE" ) )
1609 || token->IsSameAs( wxT(
"SIM.PINS" ) )
1610 || token->IsSameAs( wxT(
"SIM.PARAMS" ) )
1611 || token->IsSameAs( wxT(
"SIM.LIBRARY" ) )
1612 || token->IsSameAs( wxT(
"SIM.NAME" ) ) )
1614 *token = wxEmptyString;
1621 if( token->IsSameAs( templateFieldname.m_Name )
1622 || token->IsSameAs( templateFieldname.m_Name.Upper() ) )
1626 *token = wxEmptyString;
1631 if( token->IsSameAs( wxT(
"FOOTPRINT_LIBRARY" ) ) )
1635 wxArrayString parts = wxSplit( footprint,
':' );
1637 if( parts.Count() > 0 )
1638 *token = parts[ 0 ];
1640 *token = wxEmptyString;
1644 else if( token->IsSameAs( wxT(
"FOOTPRINT_NAME" ) ) )
1648 wxArrayString parts = wxSplit( footprint,
':' );
1650 if( parts.Count() > 1 )
1651 *token = parts[ std::min( 1, (
int) parts.size() - 1 ) ];
1653 *token = wxEmptyString;
1657 else if( token->IsSameAs( wxT(
"UNIT" ) ) )
1662 else if( token->IsSameAs( wxT(
"SHORT_REFERENCE" ) ) )
1664 *token =
GetRef( aPath,
false );
1667 else if( token->IsSameAs( wxT(
"SYMBOL_LIBRARY" ) ) )
1669 *token =
m_lib_id.GetUniStringLibNickname();
1672 else if( token->IsSameAs( wxT(
"SYMBOL_NAME" ) ) )
1674 *token =
m_lib_id.GetUniStringLibItemName();
1677 else if( token->IsSameAs( wxT(
"SYMBOL_DESCRIPTION" ) ) )
1682 else if( token->IsSameAs( wxT(
"SYMBOL_KEYWORDS" ) ) )
1687 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOM" ) ) )
1689 *token = wxEmptyString;
1692 *token =
_(
"Excluded from BOM" );
1696 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOARD" ) ) )
1698 *token = wxEmptyString;
1701 *token =
_(
"Excluded from board" );
1705 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_SIM" ) ) )
1707 *token = wxEmptyString;
1710 *token =
_(
"Excluded from simulation" );
1714 else if( token->IsSameAs( wxT(
"DNP" ) ) )
1716 *token = wxEmptyString;
1718 if( aPath->
GetDNP() || this->ResolveDNP() )
1719 *token =
_(
"DNP" );
1723 else if( token->StartsWith( wxT(
"SHORT_NET_NAME(" ) )
1724 || token->StartsWith( wxT(
"NET_NAME(" ) )
1725 || token->StartsWith( wxT(
"NET_CLASS(" ) )
1726 || token->StartsWith( wxT(
"PIN_NAME(" ) ) )
1728 wxString pinNumber = token->AfterFirst(
'(' );
1729 pinNumber = pinNumber.BeforeLast(
')' );
1733 if(
pin->GetNumber() == pinNumber )
1735 if( token->StartsWith( wxT(
"PIN_NAME" ) ) )
1737 *token =
pin->GetAlt().IsEmpty() ?
pin->GetName() :
pin->GetAlt();
1744 *token = wxEmptyString;
1745 else if( token->StartsWith( wxT(
"SHORT_NET_NAME" ) ) )
1747 else if( token->StartsWith( wxT(
"NET_NAME" ) ) )
1748 *token = conn->
Name();
1749 else if( token->StartsWith( wxT(
"NET_CLASS" ) ) )
1750 *token =
pin->GetEffectiveNetClass( aPath )->GetName();
1773 if( instance.m_Path ==
path )
1775 if( instance.m_Reference.IsEmpty() || aResetPrefix )
1786 if( instance.m_Reference.IsEmpty() || aResetPrefix)
1793 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1794 pin->ClearDefaultNetName( aSheetPath );
1802 if( currentReference.IsEmpty() || aResetPrefix )
1812 wxCHECK( aSheetPath.size() > 0,
false );
1817 if( instance.m_Path == aSheetPath )
1830 bool transform =
false;
1832 switch( aOrientation )
1953 wxFAIL_MSG(
"Invalid schematic symbol orientation type." );
1989 int rotate_values[] =
2010 for(
int type_rotate : rotate_values )
2022 wxFAIL_MSG(
"Schematic symbol orientation matrix internal error." );
2030void SCH_SYMBOL::Show(
int nestLevel, std::ostream& os )
const
2033 NestedSpace( nestLevel, os ) <<
'<' <<
GetClass().Lower().mb_str()
2035 <<
'"' <<
" chipName=\""
2041 for(
int i = 1; i < (int)
GetFields().size(); ++i )
2043 const wxString& value =
GetFields()[i].GetText();
2045 if( !value.IsEmpty() )
2047 NestedSpace( nestLevel + 1, os ) <<
"<field" <<
" name=\""
2049 <<
'"' <<
" value=\""
2050 <<
TO_UTF8( value ) <<
"\"/>\n";
2054 NestedSpace( nestLevel, os ) <<
"</" <<
TO_UTF8(
GetClass().Lower() ) <<
">\n";
2075 if( aIncludeFields )
2079 if( field.IsVisible() )
2080 bBox.
Merge( field.GetBoundingBox() );
2094 catch(
const boost::bad_pointer& e )
2096 wxFAIL_MSG( wxString::Format( wxT(
"Boost pointer exception occurred: %s" ), e.what() ) );
2127 msgs.Add(
_(
"Simulation" ) );
2130 msgs.Add(
_(
"BOM" ) );
2133 msgs.Add(
_(
"Board" ) );
2135 if(
GetDNP( currentSheet ) )
2136 msgs.Add(
_(
"DNP" ) );
2138 msg = wxJoin( msgs,
'|' );
2139 msg.Replace(
'|', wxS(
", " ) );
2142 aList.emplace_back(
_(
"Exclude from" ), msg );
2153 aList.emplace_back(
_(
"Power symbol" ),
2158 aList.emplace_back(
_(
"Reference" ),
2162 aList.emplace_back(
_(
"Value" ),
2165 aList.emplace_back(
_(
"Name" ),
2171 aList.emplace_back(
_(
"flags" ), wxString::Format(
"%X",
GetEditFlags() ) );
2176 msg =
_(
"Missing parent" );
2178 std::shared_ptr< LIB_SYMBOL > parent =
m_part->GetParent().lock();
2185 else if( !
m_lib_id.GetLibNickname().empty() )
2187 aList.emplace_back(
_(
"Library" ),
m_lib_id.GetLibNickname() );
2191 aList.emplace_back(
_(
"Library" ),
_(
"Undefined!!!" ) );
2199 msg =
_(
"<Unknown>" );
2201 aList.emplace_back(
_(
"Footprint" ), msg );
2204 aList.emplace_back(
_(
"Description" ) + wxT(
": " )
2206 _(
"Keywords" ) + wxT(
": " ) +
m_part->GetKeyWords() );
2211 aList.emplace_back(
_(
"Reference" ),
GetRef( currentSheet ) );
2214 aList.emplace_back(
_(
"Value" ),
2217 aList.emplace_back(
_(
"Name" ),
2222 if( libNickname.empty() )
2223 msg =
_(
"No library defined!" );
2225 msg.Printf(
_(
"Symbol not found in %s!" ), libNickname );
2227 aList.emplace_back(
_(
"Library" ), msg );
2262 field.SetTextPos( pos );
2280 field.SetTextPos( pos );
2299 field.SetTextPos( pos );
2320 if( drawItem.Matches( aSearchData, aAuxData ) )
2331 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2339 aItemList.push_back( item );
2345 std::vector<DANGLING_END_ITEM>& aItemListByPos,
2348 bool changed =
false;
2350 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2352 bool previousState =
pin->IsDangling();
2353 pin->SetIsDangling(
true );
2358 bool do_break =
false;
2360 for(
auto it = lower; it < aItemListByPos.end() && it->GetPosition() == pos; it++ )
2379 pin->SetIsDangling(
false );
2391 changed = ( changed || ( previousState !=
pin->IsDangling() ) );
2417 wxCHECK( symbol,
false );
2423 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2425 if(
pin->IsDangling() )
2438 if(
GetRef( aInstance ) != symbol->
GetRef( aInstance ) )
2443 && (
GetValue(
true, aInstance,
false ) != symbol->
GetValue(
true, aInstance,
false ) ) )
2449 for(
size_t i = 0; i <
m_pins.size(); i++ )
2461 std::vector<VECTOR2I> retval;
2463 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2467 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit()
2469 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle()
2472 if( pin_unit > 0 && pin_unit !=
GetUnit() )
2475 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
2501 return wxString::Format(
_(
"Symbol %s [%s]" ),
2508 const std::vector<KICAD_T>& aScanTypes )
2510 for(
KICAD_T scanType : aScanTypes )
2555 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2559 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit()
2561 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle()
2564 if( pin_unit > 0 && pin_unit !=
GetUnit() )
2567 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
2604 std::vector<SCH_FIELD*> fields, otherFields;
2607 aSymbol.
GetFields( otherFields,
false );
2609 if( fields.size() != otherFields.size() )
2612 for(
int ii = 0; ii < (int) fields.size(); ii++ )
2617 if( fields[ii]->GetText().Cmp( otherFields[ii]->GetText() ) != 0 )
2627 return !( *
this == aSymbol );
2633 wxCHECK_MSG(
Type() == aSymbol.
Type(), *
this,
2634 wxT(
"Cannot assign object type " ) + aSymbol.
GetClass() + wxT(
" to type " ) +
2637 if( &aSymbol !=
this )
2654 field.SetParent(
this );
2666 bBox.
Inflate( aAccuracy / 2 );
2682 rect.
Inflate( aAccuracy / 2 );
2704 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2717 if(
pin->GetLocalPosition() == new_pos )
2732 int aUnit,
int aBodyStyle,
const VECTOR2I& aOffset,
bool aDimmed )
2746 for(
unsigned i = 0; i < tempPins.size(); ++ i )
2749 SCH_PIN* tempPin = tempPins[ i ];
2766 text->SetText(
dummy.GetShownText(
false ) );
2775 for(
bool local_background : {
true,
false } )
2782 field.ClearRenderCache();
2796 std::vector<wxString> properties;
2800 wxString text_field = field.GetShownText( sheet,
false);
2802 if( text_field.IsEmpty() )
2805 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ),
2806 field.GetName(), text_field ) );
2809 if( !
m_part->GetKeyWords().IsEmpty() )
2811 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ),
2813 m_part->GetKeyWords() ) );
2834 std::max( bbox.
GetY() - pins.
GetY(),
2838 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
2839 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
2849 strokeWidth,
nullptr );
2869 for(
unsigned i = 0; i < tempPins.size(); ++ i )
2872 SCH_PIN* tempPin = tempPins[ i ];
2887 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2889 if(
pin->IsBrightened() )
2899 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2900 pin->ClearBrightened();
2918 m_part->SetShowPinNames( aShow );
2931 m_part->SetShowPinNumbers( aShow );
2937 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2939 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit()
2941 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle()
2944 if( pin_unit > 0 && pin_unit !=
GetUnit() )
2947 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
2950 if(
pin->IsPointClickableAnchor( aPos ) )
2969 if( pin_list.size() != 1 )
2987 if( pin_list.size() != 1 )
2999 return m_part->IsLocalPower();
3008 return m_part->IsGlobalPower();
3020 wxCHECK(
m_part,
false );
3022 return m_part->IsNormal();
3028 std::unordered_set<wxString> componentClass;
3030 auto getComponentClassFields =
3031 [&](
const std::vector<SCH_FIELD>& fields )
3035 if( field.GetCanonicalName() == wxT(
"Component Class" ) )
3037 if( field.GetShownText( aPath,
false ) != wxEmptyString )
3038 componentClass.insert( field.GetShownText( aPath,
false ) );
3044 getComponentClassFields(
m_fields );
3051 getComponentClassFields( label->GetFields() );
3055 return componentClass;
3060 const wxString& aVariantName )
const
3065 return std::nullopt;
3067 return instance.
m_Variants.find( aVariantName )->second;
3079 instance.
m_Variants.emplace( std::make_pair( aVariant.
m_Name, aVariant ) );
3123 for(
unsigned i = 0; i <
m_pins.size(); ++i )
3182 return symbol->GetLibSymbolRef() !=
nullptr;
3195 const wxString groupFields =
_HKI(
"Fields" );
3217 return symbol->IsMultiUnit();
3222 auto multiBodyStyle =
3226 return symbol->IsMultiBodyStyle();
3236 wxPGChoices choices;
3240 for(
int ii = 1; ii <= symbol->GetUnitCount(); ii++ )
3241 choices.Add( symbol->GetUnitDisplayName( ii,
false ), ii );
3252 wxPGChoices choices;
3256 for(
int ii = 1; ii <= symbol->GetBodyStyleCount(); ii++ )
3257 choices.Add( symbol->GetBodyStyleDescription( ii,
false ) );
3263 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 bool Contains(const Vec &aPoint) const
constexpr const Vec & GetOrigin() const
constexpr void Offset(coord_type dx, coord_type dy)
constexpr bool Intersects(const BOX2< Vec > &aRect) 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
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,...
virtual const wxString & GetText() const
Return the string associated with the text object.
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.
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.
void SetParent(LIB_SYMBOL *aParent=nullptr)
wxString GetName() const override
std::vector< SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
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.
A singleton reporter that reports to nowhere.
Base plotter engine class.
virtual void Bookmark(const BOX2I &aBox, const wxString &aName, const wxString &aGroupName=wxEmptyString)
Create a bookmark to a symbol.
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.
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
void ImportValues(const SCH_FIELD &aSource)
Copy parameters from a SCH_FIELD source.
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
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.
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)
void SetAlt(const wxString &aAlt)
Set the name of the alternate pin.
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
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
wxString PathHumanReadable(bool aUseShortRootName=true, bool aStripTrailingSeparator=false) const
Return the sheet path in a human readable form made from the sheet names.
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
bool GetExcludedFromSim() const
bool GetExcludedFromBoard() const
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
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.
void SetValueProp(const wxString &aRef)
SCH_SYMBOL & operator=(const SCH_SYMBOL &aItem)
size_t GetFullPinCount() const
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
wxString SubReference(int aUnit, bool aAddSeparator=true) const
wxString GetClass() const override
Return the class name.
void RemoveInstance(const SCH_SHEET_PATH &aInstancePath)
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
void SetValueFieldText(const wxString &aValue)
std::vector< SCH_PIN * > GetPins() const override
void RemoveField(const wxString &aFieldName)
Remove a user field from the symbol.
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
void DeleteVariant(const SCH_SHEET_PATH &aInstance, const wxString &aVariantName)
std::optional< SCH_SYMBOL_VARIANT > GetVariant(const SCH_SHEET_PATH &aInstance, const wxString &aVariantName) 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.
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_instanceReferences), if this entry does not alrea...
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.
std::vector< SCH_SYMBOL_INSTANCE > m_instanceReferences
Define the hierarchical path and reference of the symbol.
const wxString GetValue(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText) const override
void SyncOtherUnits(const SCH_SHEET_PATH &aSourceSheet, SCH_COMMIT &aCommit, PROPERTY_BASE *aProperty)
Keep fields other than the reference, include/exclude flags, and alternate pin assignments in sync in...
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.
void ClearAnnotation(const SCH_SHEET_PATH *aSheetPath, bool aResetPrefix)
Clear exiting symbol annotation.
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.
const wxString GetFootprintFieldText(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText) const
bool HasDeMorganBodyStyles() const override
std::vector< SCH_FIELD > m_fields
Variable length list of fields.
std::vector< SCH_PIN * > GetAllLibPins() 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 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 Init(const VECTOR2I &pos=VECTOR2I(0, 0))
const LIB_ID & GetLibId() const override
bool operator<(const SCH_ITEM &aItem) const override
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this symbol.
void SetUnitProp(int aUnit)
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
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 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)
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 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.
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 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
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)
const SPICE_GENERATOR & SpiceGenerator() const
std::vector< std::reference_wrapper< const SIM_MODEL_PIN > > GetPins() const
virtual std::string ItemName(const SPICE_ITEM &aItem) const
A base class for LIB_SYMBOL and SCH_SYMBOL.
bool m_DNP
True if symbol is set to 'Do Not Populate'.
void SetExcludedFromBoard(bool aExcludeFromBoard) override
Set or clear exclude from board netlist flag.
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.
bool GetExcludedFromBoard() const override
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.
#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_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
a few functions useful in geometry calculations.
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 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)
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