45#include <api/schematic/schematic_types.pb.h>
62 std::string ret =
TO_UTF8( txt );
66 if( (
unsigned char) c <=
' ' )
93 std::unique_ptr<LIB_SYMBOL> part;
124 SCH_SYMBOL( aSymbol, aSel.LibId, aSheet, aSel.Unit, aSel.
Convert, aPosition, aParent )
127 for(
const auto& [fieldId, fieldValue] : aSel.
Fields )
129 if( fieldId == FIELD_T::REFERENCE )
130 SetRef( aSheet, fieldValue );
131 else if( SCH_FIELD* field = GetField( fieldId ) )
132 field->SetText( fieldValue );
159 field.SetParent(
this );
164 for(
const std::unique_ptr<SCH_PIN>&
pin : aSymbol.
m_pins )
166 m_pins.emplace_back( std::make_unique<SCH_PIN>( *pin ) );
167 m_pins.back()->SetParent( this );
223 using namespace kiapi::schematic::types;
225 SchematicSymbolInstance symbol;
227 symbol.mutable_id()->set_value(
m_Uuid.AsStdString() );
229 symbol.set_locked(
IsLocked() ? types::LockedState::LS_LOCKED : types::LockedState::LS_UNLOCKED );
231 SchematicSymbolTransform* transform = symbol.mutable_transform();
232 transform->set_orientation(
238 symbol.mutable_body_style()->set_style(
GetBodyStyle() );
240 SchematicSymbol* def = symbol.mutable_definition();
243 google::protobuf::Any
any;
246 any.UnpackTo( symbol.mutable_reference_field() );
249 any.UnpackTo( symbol.mutable_value_field() );
252 any.UnpackTo( symbol.mutable_footprint_field() );
255 any.UnpackTo( symbol.mutable_datasheet_field() );
258 any.UnpackTo( symbol.mutable_description_field() );
262 if( field.IsMandatory() )
265 field.Serialize(
any );
266 any.UnpackTo( symbol.add_user_fields() );
272 any.UnpackTo( def->mutable_reference_field() );
275 any.UnpackTo( def->mutable_value_field() );
278 any.UnpackTo( def->mutable_footprint_field() );
281 any.UnpackTo( def->mutable_datasheet_field() );
284 any.UnpackTo( def->mutable_description_field() );
296 SchematicSymbolChild* item = def->add_items();
297 item->mutable_unit()->set_unit( drawItem.GetUnit() );
298 item->mutable_body_style()->set_style( drawItem.GetBodyStyle() );
299 item->set_is_private( drawItem.IsPrivate() );
300 drawItem.Serialize( *item->mutable_item() );
303 def->set_unit_count(
m_part->GetUnitCount() );
304 def->set_body_style_count(
m_part->GetBodyStyleCount() );
305 def->set_keywords(
m_part->GetKeyWords().ToUTF8() );
308 def->add_footprint_filters(
filter.ToUTF8() );
316 aContainer.PackFrom( symbol );
323 using namespace kiapi::common::types;
324 using namespace kiapi::schematic::types;
326 SchematicSymbolInstance symbol;
328 if( !aContainer.UnpackTo( &symbol ) )
333 SetLocked( symbol.locked() == LockedState::LS_LOCKED );
339 const SchematicSymbol& def = symbol.definition();
347 google::protobuf::Any
any;
349 any.PackFrom( def.reference_field() );
352 any.PackFrom( def.value_field() );
355 any.PackFrom( def.footprint_field() );
358 any.PackFrom( def.datasheet_field() );
361 any.PackFrom( def.description_field() );
364 std::unordered_map<::KIID, wxString> pinAltMap;
366 for(
const SchematicSymbolChild& child : def.items() )
375 if( !item || !item->Deserialize( child.item() ) )
382 SchematicPin pinProto;
384 if( child.item().UnpackTo( &pinProto ) )
386 if( pinProto.has_active_alternate() )
387 pinAltMap[schItem->
m_Uuid] = wxString::FromUTF8( pinProto.active_alternate() );
391 if( child.has_unit() )
392 schItem->
SetUnit( child.unit().unit() );
394 if( child.has_body_style() )
402 if( def.unit_count() > 0 )
405 if( def.body_style_count() > 0 )
408 if( !def.keywords().empty() )
409 libSymbol->
SetKeyWords( wxString::FromUTF8( def.keywords() ) );
411 if( def.footprint_filters_size() > 0 )
413 wxArrayString filters;
415 for(
const std::string&
filter : def.footprint_filters() )
416 filters.Add( wxString::FromUTF8(
filter ) );
423 if( symbol.has_body_style() )
426 any.PackFrom( symbol.reference_field() );
429 any.PackFrom( symbol.value_field() );
432 any.PackFrom( symbol.footprint_field() );
435 any.PackFrom( symbol.datasheet_field() );
438 any.PackFrom( symbol.description_field() );
441 std::set<wxString> incoming;
443 for(
const SchematicField& fieldProto : symbol.user_fields() )
445 wxString
name = wxString::FromUTF8( fieldProto.name() );
452 incoming.insert(
name );
453 any.PackFrom( fieldProto );
461 std::vector<wxString> toRemove;
465 if( !field.IsMandatory() && !incoming.count( field.GetName(
false ) ) )
466 toRemove.push_back( field.GetName(
false ) );
469 for(
const wxString&
name : toRemove )
487 m_pins.emplace_back( std::make_unique<SCH_PIN>( *
pin ) );
488 m_pins.back()->SetParent(
this );
499 if( pinAltMap.contains(
pin->m_Uuid ) )
500 pin->SetAlt( pinAltMap.at(
pin->m_Uuid ) );
519 const int min_grid_size =
schIUScale.MilsToIU( 25 );
521 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
523 if( ( (
pin->GetPosition().x -
m_pos.x ) % min_grid_size ) != 0 )
526 if( ( (
pin->GetPosition().y -
m_pos.y ) % min_grid_size ) != 0 )
551 wxCHECK2( !aLibSymbol || aLibSymbol->
IsRoot(), aLibSymbol =
nullptr );
553 m_part.reset( aLibSymbol );
558 pin->SetLibPin(
nullptr );
567 return m_part->GetDescription();
569 return wxEmptyString;
576 return m_part->GetShownDescription( aDepth );
578 return wxEmptyString;
585 return m_part->GetKeyWords();
587 return wxEmptyString;
594 return m_part->GetShownKeyWords( aDepth );
596 return wxEmptyString;
603 return m_part->GetDatasheetField().GetText();
605 return wxEmptyString;
611 std::map<wxString, wxString> altPinMap;
612 std::map<wxString, SCH_PIN::ALT> altPinDefs;
613 std::map<wxString, std::set<SCH_PIN*>> pinUuidMap;
614 std::set<SCH_PIN*> unassignedSchPins;
615 std::set<SCH_PIN*> unassignedLibPins;
617 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
619 pinUuidMap[
pin->GetNumber()].insert(
pin.get() );
621 unassignedSchPins.insert(
pin.get() );
623 if( !
pin->GetAlt().IsEmpty() )
625 altPinMap[
pin->GetNumber()] =
pin->GetAlt();
626 auto altDefIt =
pin->GetAlternates().find(
pin->GetAlt() );
628 if( altDefIt !=
pin->GetAlternates().end() )
629 altPinDefs[
pin->GetNumber()] = altDefIt->second;
632 pin->SetLibPin(
nullptr );
649 auto ii = pinUuidMap.find( libPin->GetNumber() );
651 if( ii == pinUuidMap.end() || ii->second.empty() )
653 unassignedLibPins.insert( libPin );
657 auto it = ii->second.begin();
659 ii->second.erase( it );
660 pin->GetAlternates() = libPin->GetAlternates();
661 pin->SetLibPin( libPin );
662 pin->SetPosition( libPin->GetPosition() );
663 pin->SetUnit( libPin->GetUnit() );
664 pin->SetBodyStyle( libPin->GetBodyStyle() );
666 unassignedSchPins.erase(
pin );
668 auto iii = altPinMap.find( libPin->GetNumber() );
670 if( iii != altPinMap.end() )
672 wxString altName = iii->second;
674 if(
pin->GetAlternates().find( altName ) ==
pin->GetAlternates().end() )
676 auto defIt = altPinDefs.find( libPin->GetNumber() );
678 if( defIt != altPinDefs.end() )
680 for(
const auto& [
name, alt] :
pin->GetAlternates() )
682 if( alt.m_Shape == defIt->second.m_Shape && alt.m_Type == defIt->second.m_Type )
691 pin->SetAlt( altName );
698 for(
SCH_PIN* libPin : unassignedLibPins )
703 if( !unassignedSchPins.empty() )
705 auto it = unassignedSchPins.begin();
707 unassignedSchPins.erase( it );
712 pin =
m_pins.emplace_back( std::make_unique<SCH_PIN>(
SCH_PIN(
this, libPin ) ) ).get();
716 pin->GetAlternates() = libPin->GetAlternates();
717 pin->SetLibPin( libPin );
718 pin->SetPosition( libPin->GetPosition() );
719 pin->SetUnit( libPin->GetUnit() );
720 pin->SetBodyStyle( libPin->GetBodyStyle() );
721 pin->SetNumber( libPin->GetNumber() );
723 auto iii = altPinMap.find( libPin->GetNumber() );
725 if( iii != altPinMap.end() )
727 wxString altName = iii->second;
729 if(
pin->GetAlternates().find( altName ) ==
pin->GetAlternates().end() )
731 auto defIt = altPinDefs.find( libPin->GetNumber() );
733 if( defIt != altPinDefs.end() )
735 for(
const auto& [
name, alt] :
pin->GetAlternates() )
737 if( alt.m_Shape == defIt->second.m_Shape && alt.m_Type == defIt->second.m_Type )
746 pin->SetAlt( altName );
751 for(
auto it1 =
m_pins.begin(); it1 !=
m_pins.end() && !unassignedSchPins.empty(); )
753 auto it2 = unassignedSchPins.find( it1->get() );
755 if( it2 != unassignedSchPins.end() )
757 it1 =
m_pins.erase( it1 );
758 unassignedSchPins.erase( it2 );
769 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
790 return m_part->GetUnitCount();
799 return m_part->GetBodyStyleCount();
808 return m_part->HasDeMorganBodyStyles();
817 return m_part->GetUnitDisplayName( aUnit, aLabel );
819 return wxString::Format(
_(
"Unit %s" ),
SubReference( aUnit ) );
828 return m_part->GetBodyStyleDescription( aBodyStyle, aLabel );
840 if( instance.m_Path == aSheetPath )
842 aInstance = instance;
846 else if( instance.m_Path.EndsWith( aSheetPath ) )
848 aInstance = instance;
867 for(
int ii =
m_instances.size() - 1; ii >= 0; --ii )
872 wxS(
"Removing symbol instance:\n"
874 " reference %s, unit %d from symbol %s." ),
902 wxS(
"Adding symbol '%s' instance:\n"
926 wxLogTrace(
traceSchSymbolRef,
"GetRef for symbol %s on path %s (sheet path has %zu sheets)",
m_Uuid.AsString(),
933 wxLogTrace(
traceSchSymbolRef,
" Instance: path=%s, ref=%s", instance.m_Path.AsString(),
934 instance.m_Reference );
936 if( instance.m_Path ==
path )
938 ref = instance.m_Reference;
952 wxLogTrace(
traceSchSymbolRef,
" Using fallback from REFERENCE field: %s", ref );
994 if( instance.m_Path ==
path )
997 instance.m_Reference = ref;
1005 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1006 pin->ClearDefaultNetName( sheet );
1023 const wxString& aVariantName )
1025 wxCHECK( !aFieldName.IsEmpty(), );
1031 switch( field->
GetId() )
1035 SetRef( aPath, aFieldText );
1040 wxString defaultText = field->
GetText( aPath );
1042 if( aVariantName.IsEmpty() )
1044 if( aFieldText != defaultText )
1051 wxCHECK( instance, );
1053 if( instance->
m_Variants.contains( aVariantName ) )
1055 if( aFieldText != defaultText )
1056 instance->
m_Variants[aVariantName].m_Fields[aFieldName] = aFieldText;
1058 instance->
m_Variants[aVariantName].m_Fields.erase( aFieldName );
1060 else if( aFieldText != defaultText )
1065 newVariant.
m_Fields[aFieldName] = aFieldText;
1066 instance->
m_Variants.insert( std::make_pair( aVariantName, newVariant ) );
1077 const wxString& aVariantName )
const
1079 wxCHECK( !aFieldName.IsEmpty(), wxEmptyString );
1083 wxCHECK( field, wxEmptyString );
1085 switch( field->
GetId() )
1088 wxCHECK( aPath, field->
GetText() );
1089 return GetRef( aPath,
false );
1093 if( !aVariantName.IsEmpty() && aPath )
1097 if( instance && instance->
m_Variants.contains( aVariantName )
1098 && instance->
m_Variants.at( aVariantName ).m_Fields.contains( aFieldName ) )
1100 return instance->
m_Variants.at( aVariantName ).m_Fields.at( aFieldName );
1107 if( aVariantName.IsEmpty() )
1115 if( instance->
m_Variants.contains( aVariantName )
1116 && instance->
m_Variants.at( aVariantName ).m_Fields.contains( aFieldName ) )
1117 return instance->
m_Variants.at( aVariantName ).m_Fields.at( aFieldName );
1133 if( instance.m_Path ==
path )
1134 return !instance.m_Reference.IsEmpty() && instance.m_Reference.Last() !=
'?';
1145 refDesignator.Replace(
"~",
" " );
1147 wxString prefix = refDesignator;
1149 while( prefix.Length() )
1151 wxUniCharRef last = prefix.Last();
1153 if( ( last >=
'0' && last <=
'9' ) || last ==
'?' || last ==
'*' )
1154 prefix.RemoveLast();
1160 prefix.Trim(
true );
1161 prefix.Trim(
false );
1163 if( !prefix.IsEmpty() )
1173 const std::map<int, wxString>& names =
m_part->GetUnitDisplayNames();
1174 auto it = names.find( aUnit );
1176 if( it != names.end() && !it->second.IsEmpty() )
1182 int sep = schematic->Settings().m_SubpartIdSeparator;
1184 if( sep != 0 && aAddSeparator )
1185 subRef << wxChar( sep );
1188 subRef << it->second;
1194 return schematic->Settings().SubReference( aUnit, aAddSeparator );
1206 if( instance.m_Path ==
path )
1207 return instance.m_Unit;
1223 if( instance.m_Path ==
path )
1225 instance.m_Unit = aUnitSelection;
1237 if( !aInstance || aVariantName.IsEmpty() )
1245 wxCHECK_MSG( instance, ,
1246 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
1249 if( aVariantName.IsEmpty() )
1255 if( instance->
m_Variants.contains( aVariantName ) && ( aEnable != instance->
m_Variants[aVariantName].m_DNP ) )
1257 instance->
m_Variants[aVariantName].m_DNP = aEnable;
1264 variant.
m_DNP = aEnable;
1273 if( !aInstance || aVariantName.IsEmpty() )
1281 if( instance.
m_Variants.contains( aVariantName ) )
1282 return instance.
m_Variants[aVariantName].m_DNP;
1290 if( !aInstance || aVariantName.IsEmpty() )
1298 wxCHECK_MSG( instance, ,
1299 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
1302 if( aVariantName.IsEmpty() )
1308 if( instance->
m_Variants.contains( aVariantName )
1309 && ( aEnable != instance->
m_Variants[aVariantName].m_ExcludedFromBOM ) )
1311 instance->
m_Variants[aVariantName].m_ExcludedFromBOM = aEnable;
1327 if( !aInstance || aVariantName.IsEmpty() )
1335 if( instance.
m_Variants.contains( aVariantName ) )
1336 return instance.
m_Variants[aVariantName].m_ExcludedFromBOM;
1345 if( !aInstance || aVariantName.IsEmpty() )
1353 wxCHECK_MSG( instance, ,
1354 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
1357 if( aVariantName.IsEmpty() )
1363 if( instance->
m_Variants.contains( aVariantName )
1364 && ( aEnable != instance->
m_Variants[aVariantName].m_ExcludedFromSim ) )
1366 instance->
m_Variants[aVariantName].m_ExcludedFromSim = aEnable;
1382 if( !aInstance || aVariantName.IsEmpty() )
1390 if( instance.
m_Variants.contains( aVariantName ) )
1391 return instance.
m_Variants[aVariantName].m_ExcludedFromSim;
1399 const wxString& aVariantName )
1401 if( !aInstance || aVariantName.IsEmpty() )
1409 wxCHECK_MSG( instance, ,
1410 wxString::Format( wxS(
"Cannot set exclude from board for invalid sheet path '%s'." ),
1413 if( aVariantName.IsEmpty() )
1419 if( instance->
m_Variants.contains( aVariantName )
1420 && ( aEnable != instance->
m_Variants[aVariantName].m_ExcludedFromBoard ) )
1422 instance->
m_Variants[aVariantName].m_ExcludedFromBoard = aEnable;
1437 const wxString& aVariantName )
const
1439 if( !aInstance || aVariantName.IsEmpty() )
1447 if( instance.
m_Variants.contains( aVariantName ) )
1448 return instance.
m_Variants[aVariantName].m_ExcludedFromBoard;
1456 const wxString& aVariantName )
1458 if( !aInstance || aVariantName.IsEmpty() )
1466 wxCHECK_MSG( instance, ,
1467 wxString::Format( wxS(
"Cannot set exclude from pos files for invalid sheet path '%s'." ),
1470 if( aVariantName.IsEmpty() )
1476 if( instance->
m_Variants.contains( aVariantName )
1477 && ( aEnable != instance->
m_Variants[aVariantName].m_ExcludedFromPosFiles ) )
1479 instance->
m_Variants[aVariantName].m_ExcludedFromPosFiles = aEnable;
1494 const wxString& aVariantName )
const
1496 if( !aInstance || aVariantName.IsEmpty() )
1504 if( instance.
m_Variants.contains( aVariantName ) )
1505 return instance.
m_Variants[aVariantName].m_ExcludedFromPosFiles;
1515 instance.m_Unit = aUnitSelection;
1520 bool aAllowExtraText,
const wxString& aVariantName )
const
1522 if( aVariantName.IsEmpty() )
1530 std::optional variant =
GetVariant( *aInstance, aVariantName );
1544 const wxString& aVariantName )
1546 if( !aInstance || aVariantName.IsEmpty() )
1554 wxCHECK( instance, );
1558 if( instance->
m_Variants.contains( aVariantName ) )
1560 instance->
m_Variants[aVariantName].m_Fields[fieldName] = aValue;
1567 newVariant.
m_Fields[fieldName] = aValue;
1568 instance->
m_Variants.insert( std::make_pair( aVariantName, newVariant ) );
1574 bool aAllowExtraText,
const wxString& aVariantName )
const
1594 m_fields.emplace_back(
this, aFieldType );
1623 if( !field.IsVisible() || field.GetText().IsEmpty() )
1627 aVector.push_back(
const_cast<SCH_FIELD*
>( &field ) );
1630 std::sort( aVector.begin(), aVector.end(),
1633 return lhs->GetOrdinal() < rhs->GetOrdinal();
1653 for(
unsigned ii = 0; ii <
m_fields.size(); ++ii )
1658 if( aFieldName ==
m_fields[ii].GetName(
false ) )
1671 if( field.GetName().IsSameAs( aFieldName,
false ) )
1683 if( field.GetName().IsSameAs( aFieldName,
false ) )
1692 bool aResetRef,
bool aResetOtherFields )
1696 std::vector<SCH_FIELD*> fields;
1697 m_part->GetFields( fields );
1699 for(
const SCH_FIELD* libField : fields )
1704 if( libField->IsMandatory() )
1706 fieldType = libField->GetId();
1711 schField =
GetField( libField->GetCanonicalName() );
1721 schField->
SetPrivate( libField->IsPrivate() );
1733 else if( aUpdateRef )
1734 SetRef( aPath, libField->GetText() );
1742 if( aResetOtherFields )
1744 else if( aUpdateOtherFields )
1745 schField->
SetText( libField->GetText() );
1749 if( aResetOtherFields || aUpdateOtherFields )
1750 schField->
SetText( libField->GetText() );
1760 bool updateValue =
true;
1761 bool updateExclFromBOM =
true;
1762 bool updateExclFromBoard =
true;
1763 bool updateExclFromPosFiles =
true;
1764 bool updateDNP =
true;
1765 bool updateOtherFields =
true;
1766 bool updatePins =
true;
1770 updateValue = aProperty->
Name() ==
_HKI(
"Value" );
1771 updateExclFromBoard = aProperty->
Name() ==
_HKI(
"Exclude From Board" );
1772 updateExclFromBOM = aProperty->
Name() ==
_HKI(
"Exclude From Bill of Materials" );
1773 updateExclFromPosFiles = aProperty->
Name() ==
_HKI(
"Exclude From Position Files" );
1774 updateDNP = aProperty->
Name() ==
_HKI(
"Do not Populate" );
1775 updateOtherFields =
false;
1779 if( !updateValue && !updateExclFromBOM && !updateExclFromBoard && !updateExclFromPosFiles && !updateDNP && !updateOtherFields && !updatePins )
1788 wxString ref =
GetRef( &aSourceSheet );
1793 std::vector<SCH_SYMBOL*> otherUnits;
1799 aCommit.
Modify( otherUnit, screen );
1804 if( updateOtherFields )
1816 if( field.IsMandatory() )
1817 otherField = otherUnit->GetField( field.GetId() );
1819 otherField = otherUnit->GetField( field.GetName() );
1823 otherField->
SetText( field.GetText() );
1831 newField.
Offset( otherUnit->GetPosition() );
1834 otherUnit->AddField( newField );
1838 for(
int ii = (
int) otherUnit->GetFields().size() - 1; ii >= 0; ii-- )
1840 SCH_FIELD& otherField = otherUnit->GetFields()[ii];
1843 otherUnit->GetFields().erase( otherUnit->GetFields().begin() + ii );
1847 if( updateExclFromBOM )
1850 if( updateExclFromBoard )
1853 if( updateExclFromPosFiles )
1857 otherUnit->SetDNP(
GetDNP( &aSourceSheet, aVariantName ), &sheet, aVariantName );
1861 for(
const std::unique_ptr<SCH_PIN>& model_pin :
m_pins )
1863 for(
SCH_PIN* src_pin : otherUnit->GetPinsByNumber( model_pin->GetNumber() ) )
1864 src_pin->SetAlt( model_pin->GetAlt() );
1875 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1876 aFunction(
pin.get() );
1879 aFunction( &field );
1885 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1887 if(
pin->GetNumber() == aNumber )
1897 std::vector<SCH_PIN*> pins;
1899 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1901 if(
pin->GetNumber() == aNumber )
1902 pins.push_back(
pin.get() );
1911 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1913 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit() :
GetUnit();
1914 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle() :
GetBodyStyle();
1916 if( pin_unit > 0 && pin_unit !=
GetUnit() )
1919 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
1922 if(
pin->GetPosition() == aPos )
1935 return std::vector<SCH_PIN*>();
1942 return m_part->GetPins();
1944 return std::vector<SCH_PIN*>();
1956 auto it =
m_pinMap.find( aLibPin );
1961 wxFAIL_MSG_AT(
"Pin not found", __FILE__, __LINE__, __FUNCTION__ );
1968 std::vector<const SCH_PIN*> pins;
1977 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1979 if( unit &&
pin->GetUnit() &&
pin->GetUnit() != unit )
1982 pins.push_back(
pin.get() );
1991 std::vector<SCH_PIN*> pins;
2000 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2002 if( unit &&
pin->GetUnit() &&
pin->GetUnit() != unit )
2005 pins.push_back(
pin.get() );
2021 wxCHECK_RET( aItem !=
nullptr && aItem->
Type() ==
SCH_SYMBOL_T, wxT(
"Cannot swap data with invalid symbol." ) );
2029 for( std::unique_ptr<SCH_PIN>&
pin : symbol->
m_pins )
2030 pin->SetParent( symbol );
2032 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2033 pin->SetParent(
this );
2038 m_part.reset( libSymbol );
2071 if( field.IsPrivate() )
2074 if( field.IsMandatory() )
2075 aVars->push_back( field.GetCanonicalName().Upper() );
2077 aVars->push_back( field.GetName() );
2080 aVars->push_back( wxT(
"OP" ) );
2081 aVars->push_back( wxT(
"FOOTPRINT_LIBRARY" ) );
2082 aVars->push_back( wxT(
"FOOTPRINT_NAME" ) );
2083 aVars->push_back( wxT(
"UNIT" ) );
2084 aVars->push_back( wxT(
"SHORT_REFERENCE" ) );
2085 aVars->push_back( wxT(
"SYMBOL_LIBRARY" ) );
2086 aVars->push_back( wxT(
"SYMBOL_NAME" ) );
2087 aVars->push_back( wxT(
"SYMBOL_DESCRIPTION" ) );
2088 aVars->push_back( wxT(
"SYMBOL_KEYWORDS" ) );
2089 aVars->push_back( wxT(
"EXCLUDE_FROM_BOM" ) );
2090 aVars->push_back( wxT(
"EXCLUDE_FROM_BOARD" ) );
2091 aVars->push_back( wxT(
"EXCLUDE_FROM_SIM" ) );
2092 aVars->push_back( wxT(
"DNP" ) );
2093 aVars->push_back( wxT(
"SHORT_NET_NAME(<pin_number>)" ) );
2094 aVars->push_back( wxT(
"NET_NAME(<pin_number>)" ) );
2095 aVars->push_back( wxT(
"NET_CLASS(<pin_number>)" ) );
2096 aVars->push_back( wxT(
"PIN_NAME(<pin_number>)" ) );
2097 aVars->push_back( wxT(
"REFERENCE(<pin_number>)" ) );
2098 aVars->push_back( wxT(
"SHORT_REFERENCE(<pin_number>)" ) );
2099 aVars->push_back( wxT(
"UNIT(<pin_number>)" ) );
2110 const wxString& aVariantName,
int aDepth )
const
2114 thread_local wxRegEx operatingPoint( wxT(
"^"
2129 wxString variant = aVariantName.IsEmpty() ? schematic->GetCurrentVariant() : aVariantName;
2131 if( operatingPoint.Matches( *token ) )
2133 wxString
pin( operatingPoint.GetMatch( *token, 1 ).Lower() );
2134 wxString precisionStr( operatingPoint.GetMatch( *token, 3 ) );
2135 wxString rangeStr( operatingPoint.GetMatch( *token, 4 ) );
2137 int precision = precisionStr.IsEmpty() ? 3 : precisionStr[0] -
'0';
2138 wxString range = rangeStr.IsEmpty() ? wxString( wxS(
"~A" ) ) : rangeStr;
2142 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
2143 embeddedFilesStack.push_back( schematic->GetEmbeddedFiles() );
2146 embeddedFilesStack.push_back(
m_part->GetEmbeddedFiles() );
2152 aVariantName, devnull ).model;
2156 wxString spiceRef =
model.SpiceGenerator().ItemName( spiceItem );
2157 spiceRef = spiceRef.Lower();
2161 *token = schematic->GetOperatingPoint( spiceRef, precision, range );
2164 else if(
pin == wxS(
":power" ) )
2166 if( rangeStr.IsEmpty() )
2167 range = wxS(
"~W" );
2169 *token = schematic->GetOperatingPoint( spiceRef + wxS(
":power" ), precision, range );
2174 pin =
pin.SubString( 1, -1 );
2176 for(
const std::reference_wrapper<const SIM_MODEL_PIN>& modelPin :
model.GetPins() )
2178 SCH_PIN* symbolPin =
GetPin( modelPin.get().symbolPinNumber );
2182 if(
model.GetPins().size() == 2 )
2184 *token = schematic->GetOperatingPoint( spiceRef, precision, range );
2188 wxString netChainName = spiceRef + wxS(
":" ) + modelPin.get().modelPinName;
2189 *token = schematic->GetOperatingPoint( netChainName, precision, range );
2197 *token = wxS(
"?" );
2201 if( token->Contains(
':' ) )
2203 if( schematic->ResolveCrossReference( token, aDepth + 1 ) )
2209 wxString fieldName = field.IsMandatory() ? field.GetCanonicalName() : field.GetName();
2211 wxString textToken = field.GetText();
2212 textToken.Replace(
" ", wxEmptyString );
2213 wxString tokenString =
"${" + fieldName +
"}";
2216 if( textToken.IsSameAs( tokenString,
false ) )
2219 if( token->IsSameAs( fieldName,
false ) )
2223 *token =
GetRef( aPath,
true );
2225 else if( !aVariantName.IsEmpty() )
2228 std::optional<SCH_SYMBOL_VARIANT> symVariant =
GetVariant( *aPath, aVariantName );
2230 if( symVariant && symVariant->m_Fields.contains( fieldName ) )
2231 *token = symVariant->m_Fields.at( fieldName );
2233 *token = field.GetShownText( aPath,
false, aDepth + 1 );
2237 *token = field.GetShownText( aPath,
false, aDepth + 1 );
2245 if( token->IsSameAs( wxT(
"SIM.DEVICE" ) ) || token->IsSameAs( wxT(
"SIM.TYPE" ) )
2246 || token->IsSameAs( wxT(
"SIM.PINS" ) ) || token->IsSameAs( wxT(
"SIM.PARAMS" ) )
2247 || token->IsSameAs( wxT(
"SIM.LIBRARY" ) ) || token->IsSameAs( wxT(
"SIM.NAME" ) ) )
2249 *token = wxEmptyString;
2254 schematic->Settings().m_TemplateFieldNames.GetTemplateFieldNames() )
2256 if( token->IsSameAs( templateFieldname.m_Name ) || token->IsSameAs( templateFieldname.m_Name.Upper() ) )
2260 *token = wxEmptyString;
2265 if( token->IsSameAs( wxT(
"FOOTPRINT_LIBRARY" ) ) )
2269 wxArrayString parts = wxSplit( footprint,
':' );
2271 if( parts.Count() > 0 )
2274 *token = wxEmptyString;
2278 else if( token->IsSameAs( wxT(
"FOOTPRINT_NAME" ) ) )
2282 wxArrayString parts = wxSplit( footprint,
':' );
2284 if( parts.Count() > 1 )
2285 *token = parts[std::min( 1, (
int) parts.size() - 1 )];
2287 *token = wxEmptyString;
2291 else if( token->IsSameAs( wxT(
"UNIT" ) ) )
2296 else if( token->IsSameAs( wxT(
"SHORT_REFERENCE" ) ) )
2298 *token =
GetRef( aPath,
false );
2301 else if( token->IsSameAs( wxT(
"SYMBOL_LIBRARY" ) ) )
2303 *token =
m_lib_id.GetUniStringLibNickname();
2306 else if( token->IsSameAs( wxT(
"SYMBOL_NAME" ) ) )
2308 *token =
m_lib_id.GetUniStringLibItemName();
2311 else if( token->IsSameAs( wxT(
"SYMBOL_DESCRIPTION" ) ) )
2316 else if( token->IsSameAs( wxT(
"SYMBOL_KEYWORDS" ) ) )
2321 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOM" ) ) )
2323 *token = wxEmptyString;
2325 if( aPath->
GetExcludedFromBOM( variant ) || this->ResolveExcludedFromBOM( aPath, variant ) )
2326 *token =
_(
"Excluded from BOM" );
2330 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOARD" ) ) )
2332 *token = wxEmptyString;
2334 if( aPath->
GetExcludedFromBoard( variant ) || this->ResolveExcludedFromBoard( aPath, variant ) )
2335 *token =
_(
"Excluded from board" );
2339 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_SIM" ) ) )
2341 *token = wxEmptyString;
2343 if( aPath->
GetExcludedFromSim( variant ) || this->ResolveExcludedFromSim( aPath, variant ) )
2344 *token =
_(
"Excluded from simulation" );
2348 else if( token->IsSameAs( wxT(
"DNP" ) ) )
2350 *token = wxEmptyString;
2352 if( aPath->
GetDNP( variant ) || this->ResolveDNP( aPath, variant ) )
2353 *token =
_(
"DNP" );
2357 else if( token->StartsWith( wxT(
"SHORT_NET_NAME(" ) ) || token->StartsWith( wxT(
"NET_NAME(" ) )
2358 || token->StartsWith( wxT(
"NET_CLASS(" ) ) || token->StartsWith( wxT(
"PIN_NAME(" ) )
2359 || token->StartsWith( wxT(
"PIN_BASE_NAME(" ) ) || token->StartsWith( wxT(
"PIN_ALT_LIST(" ) )
2360 || token->StartsWith( wxT(
"REFERENCE(" ) ) || token->StartsWith( wxT(
"SHORT_REFERENCE(" ) )
2361 || token->StartsWith( wxT(
"UNIT(" ) ) )
2363 wxString pinNumber = token->AfterFirst(
'(' );
2364 pinNumber = pinNumber.BeforeLast(
')' );
2366 bool isReferenceFunction = token->StartsWith( wxT(
"REFERENCE(" ) );
2367 bool isShortReferenceFunction = token->StartsWith( wxT(
"SHORT_REFERENCE(" ) );
2368 bool isUnitFunction = token->StartsWith( wxT(
"UNIT(" ) );
2372 std::vector<const SCH_PIN*> pinsToSearch;
2373 std::vector<const SCH_PIN*> altPinsToSearch;
2375 if( isReferenceFunction || isShortReferenceFunction || isUnitFunction )
2378 pinsToSearch.push_back(
pin );
2383 pinsToSearch.push_back(
pin );
2386 altPinsToSearch.push_back(
pin );
2391 if(
pin->GetNumber() == pinNumber )
2393 if( isReferenceFunction || isShortReferenceFunction || isUnitFunction )
2395 int pinUnit =
pin->GetUnit();
2398 if( isReferenceFunction )
2406 else if( isShortReferenceFunction )
2411 else if( isUnitFunction )
2420 *token = std::move(
result );
2423 else if( token->StartsWith( wxT(
"PIN_NAME" ) ) )
2425 *token =
pin->GetAlt().IsEmpty() ?
pin->GetName() :
pin->GetAlt();
2428 else if( token->StartsWith( wxT(
"PIN_BASE_NAME" ) ) )
2430 *token =
pin->GetBaseName();
2433 else if( token->StartsWith( wxT(
"PIN_ALT_LIST" ) ) )
2438 const std::map<wxString, SCH_PIN::ALT>& alts =
pin->GetAlternates();
2440 for(
const auto& [altName, altDef] : alts )
2442 if( !altList.IsEmpty() )
2443 altList += wxT(
", " );
2448 *token = std::move( altList );
2456 *token = wxEmptyString;
2458 else if( token->StartsWith( wxT(
"SHORT_NET_NAME" ) ) )
2462 if( netName.Lower().StartsWith( wxT(
"unconnected" ) ) )
2463 *token = wxT(
"NC" );
2465 *token = std::move( netName );
2467 else if( token->StartsWith( wxT(
"NET_NAME" ) ) )
2469 *token = conn->
Name();
2471 else if( token->StartsWith( wxT(
"NET_CLASS" ) ) )
2473 *token =
pin->GetEffectiveNetClass( aPath )->GetName();
2483 if(
pin->GetNumber() == pinNumber )
2486 if( token->StartsWith( wxT(
"PIN_BASE_NAME" ) ) )
2488 *token =
pin->GetBaseName();
2491 else if( token->StartsWith( wxT(
"PIN_ALT_LIST" ) ) )
2496 const std::map<wxString, SCH_PIN::ALT>& alts =
pin->GetAlternates();
2498 for(
const auto& [altName, altDef] : alts )
2500 if( !altList.IsEmpty() )
2501 altList += wxT(
", " );
2510 int pinUnit =
pin->GetUnit();
2526 if( symbol->
GetRef( &sheetPath,
false ) ==
GetRef( aPath,
false )
2529 targetPath = sheetPath;
2530 targetSymbol = symbol;
2543 *token = wxString::Format( wxT(
"<Unit %s not placed>" ),
SubReference( pinUnit,
false ) );
2549 SCH_PIN* instancePin =
nullptr;
2553 if( candidate->GetNumber() == pinNumber )
2555 instancePin = candidate;
2562 *token = wxEmptyString;
2567 if( token->StartsWith( wxT(
"PIN_NAME" ) ) )
2569 *token = instancePin->
GetAlt().IsEmpty() ? instancePin->
GetName() : instancePin->
GetAlt();
2578 *token = wxEmptyString;
2580 else if( token->StartsWith( wxT(
"SHORT_NET_NAME" ) ) )
2583 if( netName.Lower().StartsWith( wxT(
"unconnected" ) ) )
2584 *token = wxT(
"NC" );
2588 else if( token->StartsWith( wxT(
"NET_NAME" ) ) )
2590 *token = conn->
Name();
2592 else if( token->StartsWith( wxT(
"NET_CLASS" ) ) )
2602 *token = wxString::Format( wxT(
"<Unresolved: pin %s>" ), pinNumber );
2622 if( instance.m_Path ==
path )
2624 if( instance.m_Reference.IsEmpty() || aResetPrefix )
2635 if( instance.m_Reference.IsEmpty() || aResetPrefix )
2642 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2643 pin->ClearDefaultNetName( aSheetPath );
2653 if( currentReference.IsEmpty() || aResetPrefix )
2664 wxCHECK( aSheetPath.size() > 0,
false );
2669 if( instance.m_Path == aSheetPath )
2682 bool transform =
false;
2684 switch( aOrientation )
2805 wxFAIL_MSG(
"Invalid schematic symbol orientation type." );
2859 for(
int type_rotate : rotate_values )
2871 wxFAIL_MSG(
"Schematic symbol orientation matrix internal error." );
2879void SCH_SYMBOL::Show(
int nestLevel, std::ostream& os )
const
2882 NestedSpace( nestLevel, os ) <<
'<' <<
GetClass().Lower().mb_str() <<
" ref=\""
2888 for(
int i = 1; i < (int)
GetFields().size(); ++i )
2890 const wxString& value =
GetFields()[i].GetText();
2892 if( !value.IsEmpty() )
2894 NestedSpace( nestLevel + 1, os ) <<
"<field" <<
" name=\"" <<
TO_UTF8(
GetFields()[i].GetName() ) <<
'"'
2895 <<
" value=\"" <<
TO_UTF8( value ) <<
"\"/>\n";
2899 NestedSpace( nestLevel, os ) <<
"</" <<
TO_UTF8(
GetClass().Lower() ) <<
">\n";
2919 if( aIncludeFields )
2923 if( field.IsVisible() )
2924 bBox.
Merge( field.GetBoundingBox() );
2938 catch(
const boost::bad_pointer& e )
2940 wxFAIL_MSG( wxString::Format( wxT(
"Boost pointer exception occurred: %s" ), e.what() ) );
2966 auto addExcludes = [&]()
2971 msgs.Add(
_(
"Simulation" ) );
2974 msgs.Add(
_(
"BOM" ) );
2977 msgs.Add(
_(
"Board" ) );
2979 if(
GetDNP( currentSheet, currentVariant ) )
2980 msgs.Add(
_(
"DNP" ) );
2982 msg = wxJoin( msgs,
'|' );
2983 msg.Replace(
'|', wxS(
", " ) );
2986 aList.emplace_back(
_(
"Exclude from" ), msg );
2997 aList.emplace_back(
_(
"Power symbol" ),
3005 aList.emplace_back(
_(
"Value" ),
3012 aList.emplace_back(
_(
"flags" ), wxString::Format(
"%X",
GetEditFlags() ) );
3017 msg =
_(
"Missing parent" );
3019 std::shared_ptr<LIB_SYMBOL> parent =
m_part->GetParent().lock();
3022 msg = parent->GetName();
3026 else if( !
m_lib_id.GetLibNickname().empty() )
3028 aList.emplace_back(
_(
"Library" ),
m_lib_id.GetLibNickname() );
3032 aList.emplace_back(
_(
"Library" ),
_(
"Undefined!!!" ) );
3040 msg =
_(
"<Unknown>" );
3042 aList.emplace_back(
_(
"Footprint" ), msg );
3046 _(
"Keywords" ) + wxT(
": " ) +
m_part->GetKeyWords() );
3051 aList.emplace_back(
_(
"Reference" ),
GetRef( currentSheet ) );
3060 if( libNickname.empty() )
3061 msg =
_(
"No library defined!" );
3063 msg.Printf(
_(
"Symbol not found in %s!" ), libNickname );
3065 aList.emplace_back(
_(
"Library" ), msg );
3100 field.SetTextPos( pos );
3118 field.SetTextPos( pos );
3137 field.SetTextPos( pos );
3165 if( field.Matches( aSearchData, aAuxData ) )
3175 if( drawItem.Matches( aSearchData, aAuxData ) )
3186 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3194 aItemList.push_back( item );
3200 std::vector<DANGLING_END_ITEM>& aItemListByPos,
const SCH_SHEET_PATH* aPath )
3202 bool changed =
false;
3204 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3206 bool previousState =
pin->IsDangling();
3207 pin->SetIsDangling(
true );
3212 bool do_break =
false;
3214 for(
auto it = lower; it < aItemListByPos.end() && it->GetPosition() == pos; it++ )
3233 pin->SetIsDangling(
false );
3244 changed = ( changed || ( previousState !=
pin->IsDangling() ) );
3269 wxCHECK( symbol,
false );
3275 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3277 if(
pin->IsDangling() )
3290 if(
GetRef( aInstance ) != symbol->
GetRef( aInstance ) )
3300 for(
size_t i = 0; i <
m_pins.size(); i++ )
3312 std::vector<VECTOR2I> retval;
3314 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3318 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit() :
GetUnit();
3319 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle() :
GetBodyStyle();
3321 if( pin_unit > 0 && pin_unit !=
GetUnit() )
3324 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
3350 return wxString::Format(
_(
"Symbol %s [%s]" ),
3358 for(
KICAD_T scanType : aScanTypes )
3403 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3407 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit() :
GetUnit();
3408 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle() :
GetBodyStyle();
3410 if( pin_unit > 0 && pin_unit !=
GetUnit() )
3413 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
3450 std::vector<SCH_FIELD*> fields, otherFields;
3453 aSymbol.
GetFields( otherFields,
false );
3455 if( fields.size() != otherFields.size() )
3458 for(
int ii = 0; ii < (int) fields.size(); ii++ )
3463 if( fields[ii]->GetText().Cmp( otherFields[ii]->GetText() ) != 0 )
3473 return !( *
this == aSymbol );
3479 wxCHECK_MSG(
Type() == aSymbol.
Type(), *
this,
3480 wxT(
"Cannot assign object type " ) + aSymbol.
GetClass() + wxT(
" to type " ) +
GetClass() );
3482 if( &aSymbol !=
this )
3499 field.SetParent(
this );
3511 bBox.
Inflate( aAccuracy / 2 );
3527 rect.
Inflate( aAccuracy / 2 );
3549 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3562 if(
pin->GetLocalPosition() == new_pos )
3577 const VECTOR2I& aOffset,
bool aDimmed )
3591 for(
unsigned i = 0; i < tempPins.size(); ++i )
3594 SCH_PIN* tempPin = tempPins[i];
3614 text->SetText(
dummy.GetShownText(
false ) );
3625 bool dnp =
GetDNP( sheet, variant );
3627 for(
bool local_background : {
true,
false } )
3633 field.ClearRenderCache();
3637 && ( field.IsVisible() || field.IsForceVisible() ) )
3650 std::vector<wxString> properties;
3654 wxString text_field = field.GetShownText( sheet,
false, 0, variant );
3656 if( text_field.IsEmpty() )
3659 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ), field.GetName(), text_field ) );
3662 if( !
m_part->GetKeyWords().IsEmpty() )
3664 properties.emplace_back(
3665 wxString::Format( wxT(
"!%s = %s" ),
_(
"Keywords" ),
m_part->GetKeyWords() ) );
3688 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
3689 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
3707 double lineWidth = aSize / 10.0;
3709 std::vector<SCH_SHAPE> shapeList;
3711 int tolerance = 100;
3713 for(
const SCH_SHAPE& shape : shapeList )
3719 aPlotter->
BezierCurve( shape.GetStart(), shape.GetBezierC1(), shape.GetBezierC2(), shape.GetEnd(),
3720 tolerance, lineWidth );
3722 aPlotter->
Circle( shape.getCenter(), shape.GetRadius() * 2, filled, lineWidth );
3782 for(
unsigned i = 0; i < tempPins.size(); ++i )
3785 SCH_PIN* tempPin = tempPins[i];
3803 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3805 if(
pin->IsBrightened() )
3815 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3816 pin->ClearBrightened();
3834 m_part->SetShowPinNames( aShow );
3847 m_part->SetShowPinNumbers( aShow );
3853 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3855 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit() :
GetUnit();
3856 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle() :
GetBodyStyle();
3858 if( pin_unit > 0 && pin_unit !=
GetUnit() )
3861 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
3864 if(
pin->IsPointClickableAnchor( aPos ) )
3883 if( pin_list.size() != 1 )
3901 if( pin_list.size() != 1 )
3913 return m_part->IsLocalPower();
3922 return m_part->IsGlobalPower();
3934 wxCHECK(
m_part,
false );
3936 return m_part->IsNormal();
3942 std::unordered_set<wxString> componentClass;
3944 auto getComponentClassFields = [&](
const std::vector<SCH_FIELD>& fields )
3948 if( field.GetCanonicalName() == wxT(
"Component Class" ) )
3950 if( field.GetShownText( aPath,
false ) != wxEmptyString )
3951 componentClass.insert( field.GetShownText( aPath,
false ) );
3957 getComponentClassFields(
m_fields );
3964 getComponentClassFields( label->GetFields() );
3968 return componentClass;
3973 const wxString& aVariantName )
const
3978 return std::nullopt;
3980 return instance.
m_Variants.find( aVariantName )->second;
3992 instance->
m_Variants.insert( std::make_pair( aVariant.
m_Name, aVariant ) );
4001 if( !instance || !instance->
m_Variants.contains( aVariantName ) )
4009 const wxString& aNewName )
4014 if( !instance || !instance->
m_Variants.contains( aOldName ) )
4019 variant.
m_Name = aNewName;
4021 instance->
m_Variants.insert( std::make_pair( aNewName, variant ) );
4026 const wxString& aNewVariant )
4031 if( !instance || !instance->
m_Variants.contains( aSourceVariant ) )
4036 variant.
m_Name = aNewVariant;
4037 instance->
m_Variants.insert( std::make_pair( aNewVariant, variant ) );
4087 for(
unsigned i = 0; i <
m_pins.size(); ++i )
4096 if( m_instanceReferences != symbol.m_instanceReferences )
4122 double aLineWidth,
bool aHorizontal )
4126 double x_right = aSize / 1.6180339887;
4127 double x_middle = x_right / 2.0;
4140 aShapeList.back().SetStart( bottomPt );
4141 aShapeList.back().SetBezierC1( bottomAnchorPt );
4142 aShapeList.back().SetBezierC2( leftSideAnchorPt1 );
4143 aShapeList.back().SetEnd( leftPt );
4147 aShapeList.back().SetStart( leftPt );
4148 aShapeList.back().SetBezierC1( leftSideAnchorPt2 );
4149 aShapeList.back().SetBezierC2( rightSideAnchorPt2 );
4150 aShapeList.back().SetEnd( rightPt );
4153 aShapeList.back().SetStart( rightPt );
4154 aShapeList.back().SetBezierC1( rightSideAnchorPt1 );
4155 aShapeList.back().SetBezierC2( bottomAnchorPt );
4156 aShapeList.back().SetEnd( bottomPt );
4159 aShapeList.back().SetCenter( ( leftPt + rightPt ) / 2.0 );
4160 aShapeList.back().SetRadius( aSize / 15.0 );
4165 shape.Rotate(
VECTOR2I( 0, 0 ),
true );
4176 if( instance.m_Path == aSheetPath )
4188 if( instance.m_Path == aSheetPath )
4226 auto hasLibPart = [](
INSPECTABLE* aItem ) ->
bool
4229 return symbol->GetLibSymbolRef() !=
nullptr;
4242 const wxString groupFields =
_HKI(
"Fields" );
4262 auto multiUnit = [=](
INSPECTABLE* aItem ) ->
bool
4265 return symbol->IsMultiUnit();
4270 auto multiBodyStyle = [=](
INSPECTABLE* aItem ) ->
bool
4273 return symbol->IsMultiBodyStyle();
4284 wxPGChoices choices;
4288 for(
int ii = 1; ii <= symbol->GetUnitCount(); ii++ )
4289 choices.Add( symbol->GetUnitDisplayName( ii,
false ), ii );
4301 wxPGChoices choices;
4305 for(
int ii = 1; ii <= symbol->GetBodyStyleCount(); ii++ )
4306 choices.Add( symbol->GetBodyStyleDescription( ii,
false ) );
4312 const wxString groupAttributes =
_HKI(
"Attributes" );
types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
KICAD_T FromProtoEnum(types::KiCadObjectType aValue)
std::unique_ptr< EDA_ITEM > CreateItemForType(KICAD_T aType, EDA_ITEM *aContainer)
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,...
virtual void SetTextPos(const VECTOR2I &aPoint)
virtual void Offset(const VECTOR2I &aOffset)
virtual EDA_ANGLE GetTextAngle() const
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 & GetLibItemName() const
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
std::vector< const SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
SCH_FIELD * GetField(const wxString &aFieldName)
Find a field within this symbol matching aFieldName; return nullptr if not found.
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 SetUnitCount(int aCount, bool aDuplicateDrawItems)
Set the units per symbol count.
void SetKeyWords(const wxString &aKeyWords)
void SetBodyStyleCount(int aCount, bool aDuplicateDrawItems, bool aDuplicatePins)
Set or clear the alternate body style (DeMorgan) for the symbol.
void SetFPFilters(const wxArrayString &aFilters)
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.
void SetLibId(const LIB_ID &aLibId)
void AddDrawItem(SCH_ITEM *aItem, bool aSort=true)
Add a new draw aItem to the draw object list and sort according to aSort.
const wxString GetName() const
Gets the name of this (maybe aggregate) netclass in a format for internal usage or for export to exte...
A singleton reporter that reports to nowhere.
Base plotter engine class.
virtual void Circle(const VECTOR2I &pos, int diametre, FILL_T fill, int width)=0
virtual void Bookmark(const BOX2I &aBox, const wxString &aName, const wxString &aGroupName=wxEmptyString)
Create a bookmark to a symbol.
virtual void BezierCurve(const VECTOR2I &aStart, const VECTOR2I &aControl1, const VECTOR2I &aControl2, const VECTOR2I &aEnd, int aTolerance, int aLineThickness)
Generic fallback: Cubic Bezier curve rendered as a polyline.
virtual void StartBlock(void *aData)
calling this function allows one to define the beginning of a group of drawing items,...
virtual void ThickSegment(const VECTOR2I &start, const VECTOR2I &end, int width, void *aData)
virtual void HyperlinkMenu(const BOX2I &aBox, const std::vector< wxString > &aDestURLs)
Create a clickable hyperlink menu with a rectangular click area.
virtual void SetColor(const COLOR4D &color)=0
virtual void EndBlock(void *aData)
calling this function allows one to define the end of a group of drawing items for instance in SVG or...
PROPERTY_BASE & SetChoicesFunc(std::function< wxPGChoices(INSPECTABLE *)> aFunc)
PROPERTY_BASE & SetAvailableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Set a callback function to determine whether an object provides this property.
const wxString & Name() const
Provide class metadata.Helper macro to map type hashes to names.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
Holds all the data relating to one schematic.
wxString GetCurrentVariant() const
Return the current variant being edited.
SCH_SHEET_PATH & CurrentSheet() const
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
wxString LocalName() const
wxString Name(bool aIgnoreSheet=false) const
Schematic editor (Eeschema) main window.
SCH_SHEET_PATH & GetCurrentSheet() const
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
virtual const wxString & GetText() const override
Return the string associated with the text object.
void ImportValues(const SCH_FIELD &aSource)
Copy parameters from a SCH_FIELD source.
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0, const wxString &aVariantName=wxEmptyString) const
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetText(const wxString &aText) override
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
Base class for any item which can be embedded within the SCHEMATIC container class,...
virtual void SetBodyStyle(int aBodyStyle)
void SetLocked(bool aLocked) override
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
void SetPrivate(bool aPrivate)
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
bool IsLocked() const override
std::shared_ptr< NETCLASS > GetEffectiveNetClass(const SCH_SHEET_PATH *aSheet=nullptr) const
void SetLayer(SCH_LAYER_ID aLayer)
virtual void SetUnit(int aUnit)
AUTOPLACE_ALGO m_fieldsAutoplaced
std::unordered_set< SCH_RULE_AREA * > m_rule_areas_cache
Store pointers to rule areas which this item is contained within.
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
ALT GetAlt(const wxString &aAlt)
void SetName(const wxString &aName)
const wxString & GetName() const
bool IsDangling() const override
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
void SetShape(GRAPHIC_PINSHAPE aShape)
VECTOR2I GetPosition() const override
const wxString & GetShownName() const
void SetType(ELECTRICAL_PINTYPE aType)
const wxString & GetNumber() const
GRAPHIC_PINSHAPE GetShape() const
ELECTRICAL_PINTYPE GetType() const
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
bool GetExcludedFromBOM() const
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
wxString PathHumanReadable(bool aUseShortRootName=true, bool aStripTrailingSeparator=false, bool aEscapeSheetNames=false) const
Return the sheet path in a human readable form made from the sheet names.
bool GetExcludedFromSim() const
bool GetExcludedFromBoard() const
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
size_t size() const
Forwarded method from std::vector.
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the sheet.
Variant information for a schematic symbol.
void InitializeAttributes(const SCH_SYMBOL &aSymbol)
wxString GetUnitDisplayName(int aUnit, bool aLabel) const override
Return the display name for a given unit aUnit.
SCH_SYMBOL & operator=(const SCH_SYMBOL &aItem)
size_t GetFullPinCount() const
std::vector< SCH_SYMBOL_INSTANCE > m_instances
Define the hierarchical path and reference of the symbol.
void UpdatePrefix()
Set the prefix based on the current reference designator.
wxString m_prefix
C, R, U, Q etc - the first character(s) which typically indicate what the symbol is.
wxString GetDescription() const override
std::unordered_map< SCH_PIN *, SCH_PIN * > m_pinMap
Library pin pointer : SCH_PIN indices.
void SetMirrorX(bool aMirror)
bool IsSymbolLikePowerGlobalLabel() const
EMBEDDED_FILES * GetEmbeddedFiles() override
SCH_SYMBOLs don't currently support embedded files, but their LIB_SYMBOL counterparts do.
wxString GetSymbolIDAsString() const
LIB_ID m_lib_id
Name and library the symbol was loaded from, i.e. 74xx:74LS00.
bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
bool GetShowPinNumbers() const override
wxString GetDatasheet() const
Return the documentation text for the given part alias.
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
void SetLibId(const LIB_ID &aName)
std::vector< SCH_FIELD > & GetFields()
Return a reference to the vector holding the symbol's fields.
BOX2I GetBodyAndPinsBoundingBox() const override
Return a bounding box for the symbol body and pins but not the fields.
wxString GetBodyStyleProp() const override
void SetRefProp(const wxString &aRef)
INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &aScanTypes) override
May be re-implemented for each derived class in order to handle all the types given by its member dat...
virtual void SetDNP(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
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 SetPosition(const VECTOR2I &aPosition) override
void PlotDNP(PLOTTER *aPlotter) const
Plot the red 'X' over the symbol.
bool operator!=(const SCH_SYMBOL &aSymbol) const
void SetShowPinNumbers(bool aShow) override
Set or clear the pin number visibility flag.
SYMBOL_ORIENTATION_PROP GetOrientationProp() const
SCH_SYMBOL_INSTANCE * getInstance(const KIID_PATH &aPath)
wxString SubReference(int aUnit, bool aAddSeparator=true) const
wxString GetClass() const override
Return the class name.
void RemoveInstance(const SCH_SHEET_PATH &aInstancePath)
void SetFieldText(const wxString &aFieldName, const wxString &aFieldText, const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString)
bool IsAnnotated(const SCH_SHEET_PATH *aSheet) const
Check if the symbol has a valid annotation (reference) for the given sheet path.
void SetMirrorY(bool aMirror)
void SetBodyStyleProp(const wxString &aBodyStyle) override
std::vector< SCH_PIN * > GetPins() const override
bool GetExcludedFromPosFilesProp() const
void RemoveField(const wxString &aFieldName)
Remove a user field from the symbol.
wxString GetFieldText(const wxString &aFieldName, const SCH_SHEET_PATH *aPath=nullptr, const wxString &aVariantName=wxEmptyString) const
void SetExcludedFromSim(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear the exclude from simulation flag.
void SetExcludedFromSimProp(bool aEnable)
void SetBodyStyle(int aBodyStyle) override
void SetShowPinNames(bool aShow) override
Set or clear the pin name visibility flag.
wxString GetKeyWords() const override
wxString GetSchSymbolLibraryName() const
wxString GetShownKeyWords(int aDepth=0) const override
PASSTHROUGH_MODE m_passthroughMode
std::optional< SCH_SYMBOL_VARIANT > GetVariant(const SCH_SHEET_PATH &aInstance, const wxString &aVariantName) const
bool GetExcludedFromBoardProp() const
void ClearBrightenedPins()
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
bool HasConnectivityChanges(const SCH_ITEM *aItem, const SCH_SHEET_PATH *aInstance=nullptr) const override
Check if aItem has connectivity changes against this object.
std::vector< const SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
bool GetExcludedFromSimProp() const
bool GetExcludedFromBOM(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
bool IsGlobalPower() const override
wxString GetRefProp() const
wxString GetBodyStyleDescription(int aBodyStyle, bool aLabel) const override
bool AddSheetPathReferenceEntryIfMissing(const KIID_PATH &aSheetPath)
Add an instance to the alternate references list (m_instances), if this entry does not already exist.
bool Matches(const EDA_SEARCH_DATA &aSearchData, void *aAuxData) const override
Compare the item against the search criteria in aSearchData.
void SetExcludedFromBOMProp(bool aEnable)
static std::unordered_map< TRANSFORM, int > s_transformToOrientationCache
void UpdatePins()
Updates the cache of SCH_PIN objects for each pin.
SCH_FIELD * FindFieldCaseInsensitive(const wxString &aFieldName)
Search for a SCH_FIELD with aFieldName.
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
bool IsPointClickableAnchor(const VECTOR2I &aPos) const override
void UpdateFields(const SCH_SHEET_PATH *aPath, bool aUpdateStyle, bool aUpdateRef, bool aUpdateOtherFields, bool aResetRef, bool aResetOtherFields)
Restore fields to the original library values.
wxString m_schLibSymbolName
The name used to look up a symbol in the symbol library embedded in a schematic.
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
const wxString GetValue(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText, const wxString &aVariantName=wxEmptyString) const override
void ClearAnnotation(const SCH_SHEET_PATH *aSheetPath, bool aResetPrefix)
Clear exiting symbol annotation.
void RenameVariant(const KIID_PATH &aPath, const wxString &aOldName, const wxString &aNewName)
void SetOrientationProp(SYMBOL_ORIENTATION_PROP aAngle)
Orientation/mirroring access for property manager.
bool GetShowPinNames() const override
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
bool HasDeMorganBodyStyles() const override
std::vector< SCH_FIELD > m_fields
Variable length list of fields.
std::vector< SCH_PIN * > GetAllLibPins() const
const wxString GetFootprintFieldText(bool aResolve, const SCH_SHEET_PATH *aPath, bool aAllowExtraText, const wxString &aVariantName=wxEmptyString) const
int GetBodyStyleCount() const override
Return the number of body styles of the symbol.
void SetOrientation(int aOrientation)
Compute the new transform matrix based on aOrientation for the symbol which is applied to the current...
void PlotPins(PLOTTER *aPlotter, bool aDnp) const
Plot just the symbol pins.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void SetFootprintFieldText(const wxString &aFootprint)
bool doIsConnected(const VECTOR2I &aPosition) const override
Provide the object specific test to see if it is connected to aPosition.
void AddHierarchicalReference(const KIID_PATH &aPath, const wxString &aRef, int aUnit)
Add a full hierarchical reference to this symbol.
bool IsMissingLibSymbol() const
Check to see if the library symbol is set to the dummy library symbol.
VECTOR2I GetPosition() const override
std::unique_ptr< LIB_SYMBOL > m_part
A flattened copy of the LIB_SYMBOL from the PROJECT object's libraries.
int GetNextFieldOrdinal() const
Return the next ordinal for a user field for this symbol.
void SetExcludedFromPosFiles(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
void SyncOtherUnits(const SCH_SHEET_PATH &aSourceSheet, SCH_COMMIT &aCommit, PROPERTY_BASE *aProperty, const wxString &aVariantName=wxEmptyString)
Keep fields other than the reference, include/exclude flags, and alternate pin assignments in sync in...
void Init(const VECTOR2I &pos=VECTOR2I(0, 0))
void SetExcludedFromPosFilesProp(bool aEnable)
wxString GetShownDescription(int aDepth=0) const override
const LIB_ID & GetLibId() const override
bool operator<(const SCH_ITEM &aItem) const override
static void BuildLocalPowerIconShape(std::vector< SCH_SHAPE > &aShapeList, const VECTOR2D &aPos, double aSize, double aLineWidth, bool aHorizontal)
Build the local power pin indicator icon shape, at coordinate aPos.
void GetContextualTextVars(wxArrayString *aVars) const
Return the list of system text vars & fields for this symbol.
void SetValueProp(const wxString &aValue)
void SetUnitProp(int aUnit)
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
void SetValueFieldText(const wxString &aValue, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString)
std::vector< SCH_PIN * > GetLibPins() const
Populate a vector with all the pins from the library object that match the current unit and bodyStyle...
bool UpdateDanglingState(std::vector< DANGLING_END_ITEM > &aItemListByType, std::vector< DANGLING_END_ITEM > &aItemListByPos, const SCH_SHEET_PATH *aPath=nullptr) override
Test if the symbol's dangling state has changed for all pins.
bool GetExcludedFromPosFiles(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
bool GetInstance(SCH_SYMBOL_INSTANCE &aInstance, const KIID_PATH &aSheetPath, bool aTestFromEnd=false) const
void AddVariant(const SCH_SHEET_PATH &aInstance, const SCH_SYMBOL_VARIANT &aVariant)
BOX2I doGetBoundingBox(bool aIncludePins, bool aIncludeFields) const
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
void SetDNPProp(bool aEnable)
bool GetExcludedFromBoard(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
std::vector< SCH_PIN * > GetPinsByNumber(const wxString &aNumber) const
Find all symbol pins with the given number.
void GetEndPoints(std::vector< DANGLING_END_ITEM > &aItemList) override
Add the schematic item end points to aItemList if the item has end points.
std::vector< VECTOR2I > GetConnectionPoints() const override
Add all the connection points for this item to aPoints.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
bool m_isInNetlist
True if the symbol should appear in netlist.
int GetUnitSelection(const SCH_SHEET_PATH *aSheet) const
Return the instance-specific unit selection for the given sheet path.
SCH_PIN * GetPin(const wxString &number) const
Find a symbol pin by number.
wxString GetValueProp() const
bool IsLocalPower() const override
void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode) override
int GetUnitCount() const override
Return the number of units per package of the symbol.
void SetPrefix(const wxString &aPrefix)
int GetOrientation() const override
Get the display symbol orientation.
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
bool IsSymbolLikePowerLocalLabel() const
bool GetExcludedFromBOMProp() const
void SetUnitSelection(const SCH_SHEET_PATH *aSheet, int aUnitSelection)
Set the selected unit of this symbol on one sheet.
void SetExcludedFromBoardProp(bool aEnable)
void SetExcludedFromBOM(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
Set or clear the exclude from schematic bill of materials flag.
void PlotLocalPowerIconShape(PLOTTER *aPlotter) const
Plot the local power pin indicator icon shape.
bool IsNormal() const override
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
std::unordered_set< wxString > GetComponentClassNames(const SCH_SHEET_PATH *aPath) const
Return the component classes this symbol belongs in.
std::vector< std::unique_ptr< SCH_PIN > > m_pins
A SCH_PIN for every #LIB_PIN.
void DeleteVariant(const KIID_PATH &aPath, const wxString &aVariantName)
void SetLibSymbol(LIB_SYMBOL *aLibSymbol)
Set this schematic symbol library symbol reference to aLibSymbol.
VECTOR2I GetPinPhysicalPosition(const SCH_PIN *Pin) const
BOX2I GetBodyBoundingBox() const override
Return a bounding box for the symbol body but not the pins or fields.
virtual bool GetDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
Set or clear the 'Do Not Populate' flag.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const override
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
bool IsMovableFromAnchorPoint() const override
Return true for items which are moved with the anchor point at mouse cursor and false for items moved...
bool IsPower() const override
void SetExcludedFromBoard(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
void CopyVariant(const KIID_PATH &aPath, const wxString &aSourceVariant, const wxString &aNewVariant)
bool operator==(const SCH_SYMBOL &aSymbol) const
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
SIM_MODEL & CreateModel(SIM_MODEL::TYPE aType, const std::vector< SCH_PIN * > &aPins, REPORTER &aReporter)
void SetFilesStack(std::vector< EMBEDDED_FILES * > aFilesStack)
A base class for LIB_SYMBOL and SCH_SYMBOL.
bool m_DNP
True if symbol is set to 'Do Not Populate'.
bool m_excludedFromPosFiles
virtual void SetShowPinNumbers(bool aShow)
Set or clear the pin number visibility flag.
const TRANSFORM & GetTransform() const
int GetPinNameOffset() const
virtual void SetShowPinNames(bool aShow)
Set or clear the pin name visibility flag.
virtual bool GetShowPinNames() const
void SetPinNameOffset(int aOffset)
Set the offset in mils of the pin name text from the pin symbol.
SYMBOL & operator=(const SYMBOL &aItem)
virtual bool GetShowPinNumbers() const
TRANSFORM m_transform
The rotation/mirror transformation.
std::map< wxString, wxString > m_Fields
bool m_ExcludedFromPosFiles
A type-safe container of any type.
#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.
KICOMMON_API int UnpackDistance(const types::Distance &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API std::optional< KICAD_T > TypeNameFromAny(const google::protobuf::Any &aMessage)
KICOMMON_API VECTOR2I UnpackVector2(const types::Vector2 &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackDistance(types::Distance &aOutput, int aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackVector2(types::Vector2 &aOutput, const VECTOR2I &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackLibId(types::LibraryIdentifier *aOutput, const LIB_ID &aId)
KICOMMON_API LIB_ID UnpackLibId(const types::LibraryIdentifier &aId)
@ PT_NC
not connected (must be left open)
@ PT_POWER_IN
power input (GND, VCC for ICs). Must be connected to a power output.
#define NO_SETTER(owner, type)
#define ENUM_TO_WXANY(type)
Macro to define read-only fields (no setter method available)
@ PT_COORD
Coordinate expressed in distance units (mm/inch)
Collection of utility functions for component reference designators (refdes)
void CollectOtherUnits(const wxString &aRef, int aUnit, const LIB_ID &aLibId, SCH_SHEET_PATH &aSheet, std::vector< SCH_SYMBOL * > *otherUnits)
const SCH_FIELD * FindField(const std::vector< SCH_FIELD > &aFields, FIELD_T aFieldId)
int NextFieldOrdinal(const std::vector< SCH_FIELD > &aFields)
std::string toUTFTildaText(const wxString &txt)
Convert a wxString to UTF8 and replace any control characters with a ~, where a control character is ...
static void plotLocalPowerIcon(PLOTTER *aPlotter, const VECTOR2D &aPos, double aSize, bool aRotate)
plot a local power pin indicator icon.
static struct SCH_SYMBOL_DESC _SCH_SYMBOL_DESC
std::vector< FAB_LAYER_COLOR > dummy
wxString UnescapeString(const wxString &aSource)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
std::vector< std::pair< FIELD_T, wxString > > Fields
A simple container for schematic symbol instance information.
std::map< wxString, SCH_SYMBOL_VARIANT > m_Variants
A list of symbol variants.
Hold a name of a symbol's field, field value, and default visibility.
@ SYM_ROTATE_COUNTERCLOCKWISE
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
@ USER
The field ID hasn't been set yet; field is invalid.
@ DESCRIPTION
Field Description of part, i.e. "1/4W 1% Metal Film Resistor".
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ DATASHEET
name of datasheet
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
wxString GetCanonicalFieldName(FIELD_T aFieldType)
wxString result
Test unit parsing edge cases and error handling.
wxLogTrace helper definitions.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
@ SCH_FIELD_LOCATE_REFERENCE_T
@ SCH_FIELD_LOCATE_FOOTPRINT_T
@ SCH_FIELD_LOCATE_VALUE_T
@ SCH_FIELD_LOCATE_DATASHEET_T
@ SCH_SYMBOL_LOCATE_POWER_T
Custom text control validator definitions.
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D