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->GetShownDescription( aDepth );
282 return wxEmptyString;
289 return m_part->GetKeyWords();
291 return wxEmptyString;
298 return m_part->GetShownKeyWords( aDepth );
300 return wxEmptyString;
307 return m_part->GetDatasheetField().GetText();
309 return wxEmptyString;
315 std::map<wxString, wxString> altPinMap;
316 std::map<wxString, SCH_PIN::ALT> altPinDefs;
317 std::map<wxString, std::set<SCH_PIN*>> pinUuidMap;
318 std::set<SCH_PIN*> unassignedSchPins;
319 std::set<SCH_PIN*> unassignedLibPins;
321 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
323 pinUuidMap[
pin->GetNumber() ].insert(
pin.get() );
325 unassignedSchPins.insert(
pin.get() );
327 if( !
pin->GetAlt().IsEmpty() )
329 altPinMap[
pin->GetNumber() ] =
pin->GetAlt();
330 auto altDefIt =
pin->GetAlternates().find(
pin->GetAlt() );
332 if( altDefIt !=
pin->GetAlternates().end() )
333 altPinDefs[
pin->GetNumber() ] = altDefIt->second;
336 pin->SetLibPin(
nullptr );
353 auto ii = pinUuidMap.find( libPin->GetNumber() );
355 if( ii == pinUuidMap.end() || ii->second.empty() )
357 unassignedLibPins.insert( libPin );
361 auto it = ii->second.begin();
363 ii->second.erase( it );
364 pin->GetAlternates() = libPin->GetAlternates();
365 pin->SetLibPin( libPin );
366 pin->SetPosition( libPin->GetPosition() );
367 pin->SetUnit( libPin->GetUnit() );
368 pin->SetBodyStyle( libPin->GetBodyStyle() );
370 unassignedSchPins.erase(
pin );
372 auto iii = altPinMap.find( libPin->GetNumber() );
374 if( iii != altPinMap.end() )
376 wxString altName = iii->second;
378 if(
pin->GetAlternates().find( altName ) ==
pin->GetAlternates().end() )
380 auto defIt = altPinDefs.find( libPin->GetNumber() );
382 if( defIt != altPinDefs.end() )
384 for(
const auto& [
name, alt ] :
pin->GetAlternates() )
386 if( alt.m_Shape == defIt->second.m_Shape && alt.m_Type == defIt->second.m_Type )
395 pin->SetAlt( altName );
402 for(
SCH_PIN* libPin : unassignedLibPins )
407 if( !unassignedSchPins.empty() )
409 auto it = unassignedSchPins.begin();
411 unassignedSchPins.erase( it );
416 pin =
m_pins.emplace_back( std::make_unique<SCH_PIN>(
SCH_PIN(
this, libPin ) ) ).get();
420 pin->GetAlternates() = libPin->GetAlternates();
421 pin->SetLibPin( libPin );
422 pin->SetPosition( libPin->GetPosition() );
423 pin->SetUnit( libPin->GetUnit() );
424 pin->SetBodyStyle( libPin->GetBodyStyle() );
425 pin->SetNumber( libPin->GetNumber() );
427 auto iii = altPinMap.find( libPin->GetNumber() );
429 if( iii != altPinMap.end() )
431 wxString altName = iii->second;
433 if(
pin->GetAlternates().find( altName ) ==
pin->GetAlternates().end() )
435 auto defIt = altPinDefs.find( libPin->GetNumber() );
437 if( defIt != altPinDefs.end() )
439 for(
const auto& [
name, alt ] :
pin->GetAlternates() )
441 if( alt.m_Shape == defIt->second.m_Shape && alt.m_Type == defIt->second.m_Type )
450 pin->SetAlt( altName );
455 for(
auto it1 =
m_pins.begin(); it1 !=
m_pins.end() && !unassignedSchPins.empty(); )
457 auto it2 = unassignedSchPins.find( it1->get() );
459 if( it2 != unassignedSchPins.end() )
461 it1 =
m_pins.erase( it1 );
462 unassignedSchPins.erase( it2 );
473 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
495 return m_part->GetUnitCount();
504 return m_part->GetBodyStyleCount();
513 return m_part->HasDeMorganBodyStyles();
522 return m_part->GetUnitDisplayName( aUnit, aLabel );
524 return wxString::Format(
_(
"Unit %s" ),
SubReference( aUnit ) );
533 return m_part->GetBodyStyleDescription( aBodyStyle, aLabel );
540 bool aTestFromEnd )
const
546 if( instance.m_Path == aSheetPath )
548 aInstance = instance;
552 else if( instance.m_Path.EndsWith( aSheetPath ) )
554 aInstance = instance;
579 " reference %s, unit %d from symbol %s." ),
636 "GetRef for symbol %s on path %s (sheet path has %zu sheets)",
645 instance.m_Path.AsString(), instance.m_Reference );
647 if( instance.m_Path ==
path )
649 ref = instance.m_Reference;
663 wxLogTrace(
traceSchSymbolRef,
" Using fallback from REFERENCE field: %s", ref );
698 if( instance.m_Path ==
path )
701 instance.m_Reference = ref;
709 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
710 pin->ClearDefaultNetName( sheet );
732 if( instance.m_Path ==
path )
733 return !instance.m_Reference.IsEmpty() && instance.m_Reference.Last() !=
'?';
744 refDesignator.Replace(
"~",
" " );
746 wxString prefix = refDesignator;
748 while( prefix.Length() )
750 wxUniCharRef last = prefix.Last();
752 if( ( last >=
'0' && last <=
'9' ) || last ==
'?' || last ==
'*' )
760 prefix.Trim(
false );
762 if( !prefix.IsEmpty() )
770 return schematic->Settings().SubReference( aUnit, aAddSeparator );
782 if( instance.m_Path ==
path )
783 return instance.m_Unit;
799 if( instance.m_Path ==
path )
801 instance.m_Unit = aUnitSelection;
822 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
825 if( aVariantName.IsEmpty() )
827 instance.
m_DNP = aEnable;
834 if( instance.
m_Variants.contains( aVariantName ) )
836 instance.
m_Variants[aVariantName].m_DNP = aEnable;
843 variant.
m_DNP = aEnable;
858 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
861 if( aVariantName.IsEmpty() )
870 wxCHECK_MSG( instance.
m_Variants.contains( aVariantName ),
false,
871 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s' for variant '%s'." ),
874 return instance.
m_Variants[aVariantName].m_DNP;
881 for(
const wxString& variantName : aVariantNames )
882 SetDNP( aEnable, &aInstance, variantName );
887 const wxString& aVariantName )
898 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
901 if( aVariantName.IsEmpty() )
910 if( instance.
m_Variants.contains( aVariantName ) )
912 instance.
m_Variants[aVariantName].m_ExcludedFromBOM = aEnable;
934 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
937 if( aVariantName.IsEmpty() )
945 wxCHECK_MSG( instance.
m_Variants.contains( aVariantName ),
false,
946 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s' variant '%s'." ),
949 return instance.
m_Variants[aVariantName].m_ExcludedFromBOM;
955 const std::vector<wxString>& aVariantNames )
957 for(
const wxString& variantName : aVariantNames )
973 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
976 if( aVariantName.IsEmpty() )
985 if( instance.
m_Variants.contains( aVariantName ) )
987 instance.
m_Variants[aVariantName].m_ExcludedFromSim = aEnable;
1009 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
1012 if( aVariantName.IsEmpty() )
1020 wxCHECK_MSG( instance.
m_Variants.contains( aVariantName ),
false,
1021 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s' variant '%s'." ),
1024 return instance.
m_Variants[aVariantName].m_ExcludedFromSim;
1030 const std::vector<wxString>& aVariantNames )
1032 for(
const wxString& variantName : aVariantNames )
1040 instance.m_Unit = aUnitSelection;
1045 bool aAllowExtraText )
const
1061 bool aAllowExtraText )
const
1081 m_fields.emplace_back(
this, aFieldType );
1110 if( !field.IsVisible() || field.GetText().IsEmpty() )
1114 aVector.push_back(
const_cast<SCH_FIELD*
>( &field ) );
1117 std::sort( aVector.begin(), aVector.end(),
1120 return lhs->GetOrdinal() < rhs->GetOrdinal();
1140 for(
unsigned ii = 0; ii <
m_fields.size(); ++ii )
1145 if( aFieldName ==
m_fields[ii].GetName(
false ) )
1158 if( field.GetName().IsSameAs( aFieldName,
false ) )
1167 bool aUpdateOtherFields,
bool aResetRef,
bool aResetOtherFields )
1171 std::vector<SCH_FIELD*> fields;
1172 m_part->GetFields( fields );
1174 for(
const SCH_FIELD* libField : fields )
1179 if( libField->IsMandatory() )
1181 fieldType = libField->GetId();
1186 schField =
GetField( libField->GetCanonicalName() );
1196 schField->
SetPrivate( libField->IsPrivate() );
1208 else if( aUpdateRef )
1209 SetRef( aPath, libField->GetText() );
1217 if( aResetOtherFields )
1219 else if( aUpdateOtherFields )
1220 schField->
SetText( libField->GetText() );
1224 if( aResetOtherFields || aUpdateOtherFields )
1225 schField->
SetText( libField->GetText() );
1235 bool updateValue =
true;
1236 bool updateExclFromBOM =
true;
1237 bool updateExclFromBoard =
true;
1238 bool updateDNP =
true;
1239 bool updateOtherFields =
true;
1240 bool updatePins =
true;
1244 updateValue = aProperty->
Name() ==
_HKI(
"Value" );
1245 updateExclFromBoard = aProperty->
Name() ==
_HKI(
"Exclude From Board" );
1246 updateExclFromBOM = aProperty->
Name() ==
_HKI(
"Exclude From Bill of Materials" );
1247 updateDNP = aProperty->
Name() ==
_HKI(
"Do not Populate" );
1248 updateOtherFields =
false;
1253 && !updateExclFromBOM
1254 && !updateExclFromBoard
1256 && !updateOtherFields
1266 wxString ref =
GetRef( &aSourceSheet );
1271 std::vector<SCH_SYMBOL*> otherUnits;
1277 aCommit.
Modify( otherUnit, screen );
1282 if( updateOtherFields )
1294 if( field.IsMandatory() )
1295 otherField = otherUnit->GetField( field.GetId() );
1297 otherField = otherUnit->GetField( field.GetName() );
1301 otherField->
SetText( field.GetText() );
1309 newField.
Offset( otherUnit->GetPosition() );
1312 otherUnit->AddField( newField );
1316 for(
int ii = (
int) otherUnit->GetFields().size() - 1; ii >= 0; ii-- )
1318 SCH_FIELD& otherField = otherUnit->GetFields()[ii];
1321 otherUnit->GetFields().erase( otherUnit->GetFields().begin() + ii );
1325 if( updateExclFromBOM )
1328 if( updateExclFromBoard )
1332 otherUnit->SetDNP(
GetDNP( &aSourceSheet ), &sheet );
1336 for(
const std::unique_ptr<SCH_PIN>& model_pin :
m_pins )
1338 SCH_PIN* src_pin = otherUnit->GetPin( model_pin->GetNumber() );
1341 src_pin->
SetAlt( model_pin->GetAlt() );
1352 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1353 aFunction(
pin.get() );
1356 aFunction( &field );
1362 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1364 if(
pin->GetNumber() == aNumber )
1374 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1376 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit()
1378 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle()
1381 if( pin_unit > 0 && pin_unit !=
GetUnit() )
1384 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
1387 if(
pin->GetPosition() == aPos )
1400 return std::vector<SCH_PIN*>();
1407 return m_part->GetPins();
1409 return std::vector<SCH_PIN*>();
1421 auto it =
m_pinMap.find( aLibPin );
1426 wxFAIL_MSG_AT(
"Pin not found", __FILE__, __LINE__, __FUNCTION__ );
1433 std::vector<SCH_PIN*> pins;
1442 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1444 if( unit &&
pin->GetUnit() &&
pin->GetUnit() != unit )
1447 pins.push_back(
pin.get() );
1463 wxT(
"Cannot swap data with invalid symbol." ) );
1471 for( std::unique_ptr<SCH_PIN>&
pin : symbol->
m_pins )
1472 pin->SetParent( symbol );
1474 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1475 pin->SetParent(
this );
1480 m_part.reset( libSymbol );
1514 if( field.IsPrivate() )
1517 if( field.IsMandatory() )
1518 aVars->push_back( field.GetCanonicalName().Upper() );
1520 aVars->push_back( field.GetName() );
1523 aVars->push_back( wxT(
"OP" ) );
1524 aVars->push_back( wxT(
"FOOTPRINT_LIBRARY" ) );
1525 aVars->push_back( wxT(
"FOOTPRINT_NAME" ) );
1526 aVars->push_back( wxT(
"UNIT" ) );
1527 aVars->push_back( wxT(
"SHORT_REFERENCE" ) );
1528 aVars->push_back( wxT(
"SYMBOL_LIBRARY" ) );
1529 aVars->push_back( wxT(
"SYMBOL_NAME" ) );
1530 aVars->push_back( wxT(
"SYMBOL_DESCRIPTION" ) );
1531 aVars->push_back( wxT(
"SYMBOL_KEYWORDS" ) );
1532 aVars->push_back( wxT(
"EXCLUDE_FROM_BOM" ) );
1533 aVars->push_back( wxT(
"EXCLUDE_FROM_BOARD" ) );
1534 aVars->push_back( wxT(
"EXCLUDE_FROM_SIM" ) );
1535 aVars->push_back( wxT(
"DNP" ) );
1536 aVars->push_back( wxT(
"SHORT_NET_NAME(<pin_number>)" ) );
1537 aVars->push_back( wxT(
"NET_NAME(<pin_number>)" ) );
1538 aVars->push_back( wxT(
"NET_CLASS(<pin_number>)" ) );
1539 aVars->push_back( wxT(
"PIN_NAME(<pin_number>)" ) );
1545 static wxRegEx operatingPoint( wxT(
"^"
1552 wxCHECK( aPath,
false );
1559 if( operatingPoint.Matches( *token ) )
1561 wxString
pin( operatingPoint.GetMatch( *token, 1 ).Lower() );
1562 wxString precisionStr( operatingPoint.GetMatch( *token, 3 ) );
1563 wxString rangeStr( operatingPoint.GetMatch( *token, 4 ) );
1565 int precision = precisionStr.IsEmpty() ? 3 : precisionStr[0] -
'0';
1566 wxString range = rangeStr.IsEmpty() ? wxString( wxS(
"~A" ) ) : rangeStr;
1570 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
1574 embeddedFilesStack.push_back(
m_part->GetEmbeddedFiles() );
1580 true, aDepth + 1, devnull ).model;
1585 spiceRef = spiceRef.Lower();
1592 else if(
pin == wxS(
":power" ) )
1594 if( rangeStr.IsEmpty() )
1595 range = wxS(
"~W" );
1597 *token = schematic->
GetOperatingPoint( spiceRef + wxS(
":power" ), precision, range );
1602 pin =
pin.SubString( 1, -1 );
1604 for(
const std::reference_wrapper<const SIM_MODEL_PIN>& modelPin : model.
GetPins() )
1606 SCH_PIN* symbolPin =
GetPin( modelPin.get().symbolPinNumber );
1610 if( model.
GetPins().size() == 2 )
1616 wxString signalName = spiceRef + wxS(
":" ) + modelPin.get().modelPinName;
1625 *token = wxS(
"?" );
1629 if( token->Contains(
':' ) )
1637 wxString fieldName = field.IsMandatory() ? field.GetCanonicalName()
1640 wxString textToken = field.GetText();
1641 textToken.Replace(
" ", wxEmptyString );
1642 wxString tokenString =
"${" + fieldName +
"}";
1645 if( textToken.IsSameAs( tokenString,
false ) )
1648 if( token->IsSameAs( fieldName,
false ) )
1651 *token =
GetRef( aPath,
true );
1653 *token = field.GetShownText( aPath,
false, aDepth + 1 );
1660 if( token->IsSameAs( wxT(
"SIM.DEVICE" ) )
1661 || token->IsSameAs( wxT(
"SIM.TYPE" ) )
1662 || token->IsSameAs( wxT(
"SIM.PINS" ) )
1663 || token->IsSameAs( wxT(
"SIM.PARAMS" ) )
1664 || token->IsSameAs( wxT(
"SIM.LIBRARY" ) )
1665 || token->IsSameAs( wxT(
"SIM.NAME" ) ) )
1667 *token = wxEmptyString;
1674 if( token->IsSameAs( templateFieldname.m_Name )
1675 || token->IsSameAs( templateFieldname.m_Name.Upper() ) )
1679 *token = wxEmptyString;
1684 if( token->IsSameAs( wxT(
"FOOTPRINT_LIBRARY" ) ) )
1688 wxArrayString parts = wxSplit( footprint,
':' );
1690 if( parts.Count() > 0 )
1691 *token = parts[ 0 ];
1693 *token = wxEmptyString;
1697 else if( token->IsSameAs( wxT(
"FOOTPRINT_NAME" ) ) )
1701 wxArrayString parts = wxSplit( footprint,
':' );
1703 if( parts.Count() > 1 )
1704 *token = parts[ std::min( 1, (
int) parts.size() - 1 ) ];
1706 *token = wxEmptyString;
1710 else if( token->IsSameAs( wxT(
"UNIT" ) ) )
1715 else if( token->IsSameAs( wxT(
"SHORT_REFERENCE" ) ) )
1717 *token =
GetRef( aPath,
false );
1720 else if( token->IsSameAs( wxT(
"SYMBOL_LIBRARY" ) ) )
1722 *token =
m_lib_id.GetUniStringLibNickname();
1725 else if( token->IsSameAs( wxT(
"SYMBOL_NAME" ) ) )
1727 *token =
m_lib_id.GetUniStringLibItemName();
1730 else if( token->IsSameAs( wxT(
"SYMBOL_DESCRIPTION" ) ) )
1735 else if( token->IsSameAs( wxT(
"SYMBOL_KEYWORDS" ) ) )
1740 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOM" ) ) )
1742 *token = wxEmptyString;
1745 *token =
_(
"Excluded from BOM" );
1749 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOARD" ) ) )
1751 *token = wxEmptyString;
1754 *token =
_(
"Excluded from board" );
1758 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_SIM" ) ) )
1760 *token = wxEmptyString;
1763 *token =
_(
"Excluded from simulation" );
1767 else if( token->IsSameAs( wxT(
"DNP" ) ) )
1769 *token = wxEmptyString;
1771 if( aPath->
GetDNP() || this->ResolveDNP() )
1772 *token =
_(
"DNP" );
1776 else if( token->StartsWith( wxT(
"SHORT_NET_NAME(" ) )
1777 || token->StartsWith( wxT(
"NET_NAME(" ) )
1778 || token->StartsWith( wxT(
"NET_CLASS(" ) )
1779 || token->StartsWith( wxT(
"PIN_NAME(" ) ) )
1781 wxString pinNumber = token->AfterFirst(
'(' );
1782 pinNumber = pinNumber.BeforeLast(
')' );
1786 if(
pin->GetNumber() == pinNumber )
1788 if( token->StartsWith( wxT(
"PIN_NAME" ) ) )
1790 *token =
pin->GetAlt().IsEmpty() ?
pin->GetName() :
pin->GetAlt();
1797 *token = wxEmptyString;
1798 else if( token->StartsWith( wxT(
"SHORT_NET_NAME" ) ) )
1800 else if( token->StartsWith( wxT(
"NET_NAME" ) ) )
1801 *token = conn->
Name();
1802 else if( token->StartsWith( wxT(
"NET_CLASS" ) ) )
1803 *token =
pin->GetEffectiveNetClass( aPath )->GetName();
1826 if( instance.m_Path ==
path )
1828 if( instance.m_Reference.IsEmpty() || aResetPrefix )
1839 if( instance.m_Reference.IsEmpty() || aResetPrefix)
1846 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1847 pin->ClearDefaultNetName( aSheetPath );
1855 if( currentReference.IsEmpty() || aResetPrefix )
1865 wxCHECK( aSheetPath.size() > 0,
false );
1870 if( instance.m_Path == aSheetPath )
1883 bool transform =
false;
1885 switch( aOrientation )
2006 wxFAIL_MSG(
"Invalid schematic symbol orientation type." );
2042 int rotate_values[] =
2063 for(
int type_rotate : rotate_values )
2075 wxFAIL_MSG(
"Schematic symbol orientation matrix internal error." );
2083void SCH_SYMBOL::Show(
int nestLevel, std::ostream& os )
const
2086 NestedSpace( nestLevel, os ) <<
'<' <<
GetClass().Lower().mb_str()
2088 <<
'"' <<
" chipName=\""
2094 for(
int i = 1; i < (int)
GetFields().size(); ++i )
2096 const wxString& value =
GetFields()[i].GetText();
2098 if( !value.IsEmpty() )
2100 NestedSpace( nestLevel + 1, os ) <<
"<field" <<
" name=\""
2102 <<
'"' <<
" value=\""
2103 <<
TO_UTF8( value ) <<
"\"/>\n";
2107 NestedSpace( nestLevel, os ) <<
"</" <<
TO_UTF8(
GetClass().Lower() ) <<
">\n";
2128 if( aIncludeFields )
2132 if( field.IsVisible() )
2133 bBox.
Merge( field.GetBoundingBox() );
2147 catch(
const boost::bad_pointer& e )
2149 wxFAIL_MSG( wxString::Format( wxT(
"Boost pointer exception occurred: %s" ), e.what() ) );
2180 msgs.Add(
_(
"Simulation" ) );
2183 msgs.Add(
_(
"BOM" ) );
2186 msgs.Add(
_(
"Board" ) );
2188 if(
GetDNP( currentSheet ) )
2189 msgs.Add(
_(
"DNP" ) );
2191 msg = wxJoin( msgs,
'|' );
2192 msg.Replace(
'|', wxS(
", " ) );
2195 aList.emplace_back(
_(
"Exclude from" ), msg );
2206 aList.emplace_back(
_(
"Power symbol" ),
2211 aList.emplace_back(
_(
"Reference" ),
2215 aList.emplace_back(
_(
"Value" ),
2218 aList.emplace_back(
_(
"Name" ),
2224 aList.emplace_back(
_(
"flags" ), wxString::Format(
"%X",
GetEditFlags() ) );
2229 msg =
_(
"Missing parent" );
2231 std::shared_ptr< LIB_SYMBOL > parent =
m_part->GetParent().lock();
2238 else if( !
m_lib_id.GetLibNickname().empty() )
2240 aList.emplace_back(
_(
"Library" ),
m_lib_id.GetLibNickname() );
2244 aList.emplace_back(
_(
"Library" ),
_(
"Undefined!!!" ) );
2252 msg =
_(
"<Unknown>" );
2254 aList.emplace_back(
_(
"Footprint" ), msg );
2257 aList.emplace_back(
_(
"Description" ) + wxT(
": " )
2259 _(
"Keywords" ) + wxT(
": " ) +
m_part->GetKeyWords() );
2264 aList.emplace_back(
_(
"Reference" ),
GetRef( currentSheet ) );
2267 aList.emplace_back(
_(
"Value" ),
2270 aList.emplace_back(
_(
"Name" ),
2275 if( libNickname.empty() )
2276 msg =
_(
"No library defined!" );
2278 msg.Printf(
_(
"Symbol not found in %s!" ), libNickname );
2280 aList.emplace_back(
_(
"Library" ), msg );
2315 field.SetTextPos( pos );
2333 field.SetTextPos( pos );
2352 field.SetTextPos( pos );
2373 if( drawItem.Matches( aSearchData, aAuxData ) )
2384 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2392 aItemList.push_back( item );
2398 std::vector<DANGLING_END_ITEM>& aItemListByPos,
2401 bool changed =
false;
2403 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2405 bool previousState =
pin->IsDangling();
2406 pin->SetIsDangling(
true );
2411 bool do_break =
false;
2413 for(
auto it = lower; it < aItemListByPos.end() && it->GetPosition() == pos; it++ )
2432 pin->SetIsDangling(
false );
2444 changed = ( changed || ( previousState !=
pin->IsDangling() ) );
2470 wxCHECK( symbol,
false );
2476 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2478 if(
pin->IsDangling() )
2491 if(
GetRef( aInstance ) != symbol->
GetRef( aInstance ) )
2496 && (
GetValue(
true, aInstance,
false ) != symbol->
GetValue(
true, aInstance,
false ) ) )
2502 for(
size_t i = 0; i <
m_pins.size(); i++ )
2514 std::vector<VECTOR2I> retval;
2516 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2520 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit()
2522 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle()
2525 if( pin_unit > 0 && pin_unit !=
GetUnit() )
2528 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
2554 return wxString::Format(
_(
"Symbol %s [%s]" ),
2561 const std::vector<KICAD_T>& aScanTypes )
2563 for(
KICAD_T scanType : aScanTypes )
2608 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2612 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit()
2614 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle()
2617 if( pin_unit > 0 && pin_unit !=
GetUnit() )
2620 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
2657 std::vector<SCH_FIELD*> fields, otherFields;
2660 aSymbol.
GetFields( otherFields,
false );
2662 if( fields.size() != otherFields.size() )
2665 for(
int ii = 0; ii < (int) fields.size(); ii++ )
2670 if( fields[ii]->GetText().Cmp( otherFields[ii]->GetText() ) != 0 )
2680 return !( *
this == aSymbol );
2686 wxCHECK_MSG(
Type() == aSymbol.
Type(), *
this,
2687 wxT(
"Cannot assign object type " ) + aSymbol.
GetClass() + wxT(
" to type " ) +
2690 if( &aSymbol !=
this )
2707 field.SetParent(
this );
2719 bBox.
Inflate( aAccuracy / 2 );
2735 rect.
Inflate( aAccuracy / 2 );
2757 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2770 if(
pin->GetLocalPosition() == new_pos )
2785 int aUnit,
int aBodyStyle,
const VECTOR2I& aOffset,
bool aDimmed )
2799 for(
unsigned i = 0; i < tempPins.size(); ++ i )
2802 SCH_PIN* tempPin = tempPins[ i ];
2819 text->SetText(
dummy.GetShownText(
false ) );
2828 for(
bool local_background : {
true,
false } )
2835 field.ClearRenderCache();
2840 && ( field.IsVisible() || field.IsForceVisible() ) )
2855 std::vector<wxString> properties;
2859 wxString text_field = field.GetShownText( sheet,
false);
2861 if( text_field.IsEmpty() )
2864 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ),
2865 field.GetName(), text_field ) );
2868 if( !
m_part->GetKeyWords().IsEmpty() )
2870 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ),
2872 m_part->GetKeyWords() ) );
2893 std::max( bbox.
GetY() - pins.
GetY(),
2897 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
2898 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
2908 strokeWidth,
nullptr );
2917 const VECTOR2D& aPos,
double aSize,
bool aRotate )
2919 double lineWidth = aSize / 10.0;
2921 std::vector<SCH_SHAPE> shapeList;
2923 int tolerance = 100;
2925 for(
const SCH_SHAPE& shape : shapeList )
2931 aPlotter->
BezierCurve( shape.GetStart(), shape.GetBezierC1(), shape.GetBezierC2(), shape.GetEnd(),
2932 tolerance, lineWidth );
2934 aPlotter->
Circle( shape.getCenter(), shape.GetRadius() * 2, filled, lineWidth );
2996 for(
unsigned i = 0; i < tempPins.size(); ++ i )
2999 SCH_PIN* tempPin = tempPins[ i ];
3014 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3016 if(
pin->IsBrightened() )
3026 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3027 pin->ClearBrightened();
3045 m_part->SetShowPinNames( aShow );
3058 m_part->SetShowPinNumbers( aShow );
3064 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3066 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit()
3068 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle()
3071 if( pin_unit > 0 && pin_unit !=
GetUnit() )
3074 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
3077 if(
pin->IsPointClickableAnchor( aPos ) )
3096 if( pin_list.size() != 1 )
3114 if( pin_list.size() != 1 )
3126 return m_part->IsLocalPower();
3135 return m_part->IsGlobalPower();
3147 wxCHECK(
m_part,
false );
3149 return m_part->IsNormal();
3155 std::unordered_set<wxString> componentClass;
3157 auto getComponentClassFields =
3158 [&](
const std::vector<SCH_FIELD>& fields )
3162 if( field.GetCanonicalName() == wxT(
"Component Class" ) )
3164 if( field.GetShownText( aPath,
false ) != wxEmptyString )
3165 componentClass.insert( field.GetShownText( aPath,
false ) );
3171 getComponentClassFields(
m_fields );
3178 getComponentClassFields( label->GetFields() );
3182 return componentClass;
3187 const wxString& aVariantName )
const
3192 return std::nullopt;
3194 return instance.
m_Variants.find( aVariantName )->second;
3206 instance.
m_Variants.emplace( std::make_pair( aVariant.
m_Name, aVariant ) );
3250 for(
unsigned i = 0; i <
m_pins.size(); ++i )
3278 double aSize,
double aLineWidth,
bool aHorizontal )
3282 double x_right = aSize / 1.6180339887;
3283 double x_middle = x_right / 2.0;
3296 aShapeList.back().SetStart( bottomPt );
3297 aShapeList.back().SetBezierC1( bottomAnchorPt );
3298 aShapeList.back().SetBezierC2( leftSideAnchorPt1 );
3299 aShapeList.back().SetEnd( leftPt );
3303 aShapeList.back().SetStart( leftPt );
3304 aShapeList.back().SetBezierC1( leftSideAnchorPt2 );
3305 aShapeList.back().SetBezierC2( rightSideAnchorPt2 );
3306 aShapeList.back().SetEnd( rightPt );
3309 aShapeList.back().SetStart( rightPt );
3310 aShapeList.back().SetBezierC1( rightSideAnchorPt1 );
3311 aShapeList.back().SetBezierC2( bottomAnchorPt );
3312 aShapeList.back().SetEnd( bottomPt );
3315 aShapeList.back().SetCenter( ( leftPt + rightPt ) / 2.0 );
3316 aShapeList.back().SetRadius( aSize / 15.0 );
3321 shape.Rotate(
VECTOR2I( 0, 0),
true );
3360 return symbol->GetLibSymbolRef() !=
nullptr;
3373 const wxString groupFields =
_HKI(
"Fields" );
3395 return symbol->IsMultiUnit();
3400 auto multiBodyStyle =
3404 return symbol->IsMultiBodyStyle();
3414 wxPGChoices choices;
3418 for(
int ii = 1; ii <= symbol->GetUnitCount(); ii++ )
3419 choices.Add( symbol->GetUnitDisplayName( ii,
false ), ii );
3430 wxPGChoices choices;
3434 for(
int ii = 1; ii <= symbol->GetBodyStyleCount(); ii++ )
3435 choices.Add( symbol->GetBodyStyleDescription( ii,
false ) );
3441 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
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 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.
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.
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.
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.
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
wxString GetShownKeyWords(int aDepth=0) const override
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))
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 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.
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 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_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)
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