49#include <api/schematic/schematic_types.pb.h>
66 std::string ret =
TO_UTF8( txt );
70 if( (
unsigned char) c <=
' ' )
97 std::unique_ptr<LIB_SYMBOL> part;
128 SCH_SYMBOL( aSymbol, aSel.LibId, aSheet, aSel.Unit, aSel.
Convert, aPosition, aParent )
131 for(
const auto& [fieldId, fieldValue] : aSel.
Fields )
133 if( fieldId == FIELD_T::REFERENCE )
134 SetRef( aSheet, fieldValue );
135 else if( SCH_FIELD* field = GetField( fieldId ) )
136 field->SetText( fieldValue );
163 field.SetParent(
this );
168 for(
const std::unique_ptr<SCH_PIN>&
pin : aSymbol.
m_pins )
170 m_pins.emplace_back( std::make_unique<SCH_PIN>( *pin ) );
171 m_pins.back()->SetParent( this );
227 using namespace kiapi::schematic::types;
229 SchematicSymbolInstance symbol;
231 symbol.mutable_id()->set_value(
m_Uuid.AsStdString() );
233 symbol.set_locked(
IsLocked() ? types::LockedState::LS_LOCKED : types::LockedState::LS_UNLOCKED );
235 SchematicSymbolTransform* transform = symbol.mutable_transform();
236 transform->set_orientation(
242 symbol.mutable_body_style()->set_style(
GetBodyStyle() );
244 SchematicSymbol* def = symbol.mutable_definition();
247 google::protobuf::Any
any;
250 any.UnpackTo( symbol.mutable_reference_field() );
253 any.UnpackTo( symbol.mutable_value_field() );
256 any.UnpackTo( symbol.mutable_footprint_field() );
259 any.UnpackTo( symbol.mutable_datasheet_field() );
262 any.UnpackTo( symbol.mutable_description_field() );
267 any.UnpackTo( def->mutable_reference_field() );
270 any.UnpackTo( def->mutable_value_field() );
273 any.UnpackTo( def->mutable_footprint_field() );
276 any.UnpackTo( def->mutable_datasheet_field() );
279 any.UnpackTo( def->mutable_description_field() );
291 SchematicSymbolChild* item = def->add_items();
292 item->mutable_unit()->set_unit( drawItem.GetUnit() );
293 item->mutable_body_style()->set_style( drawItem.GetBodyStyle() );
294 item->set_is_private( drawItem.IsPrivate() );
295 drawItem.Serialize( *item->mutable_item() );
298 def->set_unit_count(
m_part->GetUnitCount() );
299 def->set_body_style_count(
m_part->GetBodyStyleCount() );
300 def->set_keywords(
m_part->GetKeyWords().ToUTF8() );
303 def->add_footprint_filters(
filter.ToUTF8() );
311 aContainer.PackFrom( symbol );
318 using namespace kiapi::common::types;
319 using namespace kiapi::schematic::types;
321 SchematicSymbolInstance symbol;
323 if( !aContainer.UnpackTo( &symbol ) )
328 SetLocked( symbol.locked() == LockedState::LS_LOCKED );
334 const SchematicSymbol& def = symbol.definition();
342 google::protobuf::Any
any;
344 any.PackFrom( def.reference_field() );
347 any.PackFrom( def.value_field() );
350 any.PackFrom( def.footprint_field() );
353 any.PackFrom( def.datasheet_field() );
356 any.PackFrom( def.description_field() );
359 std::unordered_map<::KIID, wxString> pinAltMap;
361 for(
const SchematicSymbolChild& child : def.items() )
370 if( !item || !item->Deserialize( child.item() ) )
377 SchematicPin pinProto;
379 if( child.item().UnpackTo( &pinProto ) )
381 if( pinProto.has_active_alternate() )
382 pinAltMap[schItem->
m_Uuid] = wxString::FromUTF8( pinProto.active_alternate() );
386 if( child.has_unit() )
387 schItem->
SetUnit( child.unit().unit() );
389 if( child.has_body_style() )
397 if( def.unit_count() > 0 )
400 if( def.body_style_count() > 0 )
403 if( !def.keywords().empty() )
404 libSymbol->
SetKeyWords( wxString::FromUTF8( def.keywords() ) );
406 if( def.footprint_filters_size() > 0 )
408 wxArrayString filters;
410 for(
const std::string&
filter : def.footprint_filters() )
411 filters.Add( wxString::FromUTF8(
filter ) );
418 if( symbol.has_body_style() )
421 any.PackFrom( symbol.reference_field() );
424 any.PackFrom( symbol.value_field() );
427 any.PackFrom( symbol.footprint_field() );
430 any.PackFrom( symbol.datasheet_field() );
433 any.PackFrom( symbol.description_field() );
451 m_pins.emplace_back( std::make_unique<SCH_PIN>( *
pin ) );
452 m_pins.back()->SetParent(
this );
463 if( pinAltMap.contains(
pin->m_Uuid ) )
464 pin->SetAlt( pinAltMap.at(
pin->m_Uuid ) );
483 const int min_grid_size =
schIUScale.MilsToIU( 25 );
485 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
487 if( ( (
pin->GetPosition().x -
m_pos.x ) % min_grid_size ) != 0 )
490 if( ( (
pin->GetPosition().y -
m_pos.y ) % min_grid_size ) != 0 )
515 wxCHECK2( !aLibSymbol || aLibSymbol->
IsRoot(), aLibSymbol =
nullptr );
517 m_part.reset( aLibSymbol );
522 pin->SetLibPin(
nullptr );
531 return m_part->GetDescription();
533 return wxEmptyString;
540 return m_part->GetShownDescription( aDepth );
542 return wxEmptyString;
549 return m_part->GetKeyWords();
551 return wxEmptyString;
558 return m_part->GetShownKeyWords( aDepth );
560 return wxEmptyString;
567 return m_part->GetDatasheetField().GetText();
569 return wxEmptyString;
575 std::map<wxString, wxString> altPinMap;
576 std::map<wxString, SCH_PIN::ALT> altPinDefs;
577 std::map<wxString, std::set<SCH_PIN*>> pinUuidMap;
578 std::set<SCH_PIN*> unassignedSchPins;
579 std::set<SCH_PIN*> unassignedLibPins;
581 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
583 pinUuidMap[
pin->GetNumber()].insert(
pin.get() );
585 unassignedSchPins.insert(
pin.get() );
587 if( !
pin->GetAlt().IsEmpty() )
589 altPinMap[
pin->GetNumber()] =
pin->GetAlt();
590 auto altDefIt =
pin->GetAlternates().find(
pin->GetAlt() );
592 if( altDefIt !=
pin->GetAlternates().end() )
593 altPinDefs[
pin->GetNumber()] = altDefIt->second;
596 pin->SetLibPin(
nullptr );
613 auto ii = pinUuidMap.find( libPin->GetNumber() );
615 if( ii == pinUuidMap.end() || ii->second.empty() )
617 unassignedLibPins.insert( libPin );
621 auto it = ii->second.begin();
623 ii->second.erase( it );
624 pin->GetAlternates() = libPin->GetAlternates();
625 pin->SetLibPin( libPin );
626 pin->SetPosition( libPin->GetPosition() );
627 pin->SetUnit( libPin->GetUnit() );
628 pin->SetBodyStyle( libPin->GetBodyStyle() );
630 unassignedSchPins.erase(
pin );
632 auto iii = altPinMap.find( libPin->GetNumber() );
634 if( iii != altPinMap.end() )
636 wxString altName = iii->second;
638 if(
pin->GetAlternates().find( altName ) ==
pin->GetAlternates().end() )
640 auto defIt = altPinDefs.find( libPin->GetNumber() );
642 if( defIt != altPinDefs.end() )
644 for(
const auto& [
name, alt] :
pin->GetAlternates() )
646 if( alt.m_Shape == defIt->second.m_Shape && alt.m_Type == defIt->second.m_Type )
655 pin->SetAlt( altName );
662 for(
SCH_PIN* libPin : unassignedLibPins )
667 if( !unassignedSchPins.empty() )
669 auto it = unassignedSchPins.begin();
671 unassignedSchPins.erase( it );
676 pin =
m_pins.emplace_back( std::make_unique<SCH_PIN>(
SCH_PIN(
this, libPin ) ) ).get();
680 pin->GetAlternates() = libPin->GetAlternates();
681 pin->SetLibPin( libPin );
682 pin->SetPosition( libPin->GetPosition() );
683 pin->SetUnit( libPin->GetUnit() );
684 pin->SetBodyStyle( libPin->GetBodyStyle() );
685 pin->SetNumber( libPin->GetNumber() );
687 auto iii = altPinMap.find( libPin->GetNumber() );
689 if( iii != altPinMap.end() )
691 wxString altName = iii->second;
693 if(
pin->GetAlternates().find( altName ) ==
pin->GetAlternates().end() )
695 auto defIt = altPinDefs.find( libPin->GetNumber() );
697 if( defIt != altPinDefs.end() )
699 for(
const auto& [
name, alt] :
pin->GetAlternates() )
701 if( alt.m_Shape == defIt->second.m_Shape && alt.m_Type == defIt->second.m_Type )
710 pin->SetAlt( altName );
715 for(
auto it1 =
m_pins.begin(); it1 !=
m_pins.end() && !unassignedSchPins.empty(); )
717 auto it2 = unassignedSchPins.find( it1->get() );
719 if( it2 != unassignedSchPins.end() )
721 it1 =
m_pins.erase( it1 );
722 unassignedSchPins.erase( it2 );
733 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
754 return m_part->GetUnitCount();
763 return m_part->GetBodyStyleCount();
772 return m_part->HasDeMorganBodyStyles();
781 return m_part->GetUnitDisplayName( aUnit, aLabel );
783 return wxString::Format(
_(
"Unit %s" ),
SubReference( aUnit ) );
792 return m_part->GetBodyStyleDescription( aBodyStyle, aLabel );
804 if( instance.m_Path == aSheetPath )
806 aInstance = instance;
810 else if( instance.m_Path.EndsWith( aSheetPath ) )
812 aInstance = instance;
831 for(
int ii =
m_instances.size() - 1; ii >= 0; --ii )
836 wxS(
"Removing symbol instance:\n"
838 " reference %s, unit %d from symbol %s." ),
866 wxS(
"Adding symbol '%s' instance:\n"
890 wxLogTrace(
traceSchSymbolRef,
"GetRef for symbol %s on path %s (sheet path has %zu sheets)",
m_Uuid.AsString(),
897 wxLogTrace(
traceSchSymbolRef,
" Instance: path=%s, ref=%s", instance.m_Path.AsString(),
898 instance.m_Reference );
900 if( instance.m_Path ==
path )
902 ref = instance.m_Reference;
916 wxLogTrace(
traceSchSymbolRef,
" Using fallback from REFERENCE field: %s", ref );
958 if( instance.m_Path ==
path )
961 instance.m_Reference = ref;
969 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
970 pin->ClearDefaultNetName( sheet );
987 const wxString& aVariantName )
989 wxCHECK( !aFieldName.IsEmpty(), );
995 switch( field->
GetId() )
999 SetRef( aPath, aFieldText );
1004 wxString defaultText = field->
GetText( aPath );
1006 if( aVariantName.IsEmpty() )
1008 if( aFieldText != defaultText )
1015 wxCHECK( instance, );
1017 if( instance->
m_Variants.contains( aVariantName ) )
1019 if( aFieldText != defaultText )
1020 instance->
m_Variants[aVariantName].m_Fields[aFieldName] = aFieldText;
1022 instance->
m_Variants[aVariantName].m_Fields.erase( aFieldName );
1024 else if( aFieldText != defaultText )
1029 newVariant.
m_Fields[aFieldName] = aFieldText;
1030 instance->
m_Variants.insert( std::make_pair( aVariantName, newVariant ) );
1041 const wxString& aVariantName )
const
1043 wxCHECK( !aFieldName.IsEmpty(), wxEmptyString );
1047 wxCHECK( field, wxEmptyString );
1049 switch( field->
GetId() )
1052 wxCHECK( aPath, field->
GetText() );
1053 return GetRef( aPath,
false );
1057 if( !aVariantName.IsEmpty() && aPath )
1061 if( instance && instance->
m_Variants.contains( aVariantName )
1062 && instance->
m_Variants.at( aVariantName ).m_Fields.contains( aFieldName ) )
1064 return instance->
m_Variants.at( aVariantName ).m_Fields.at( aFieldName );
1071 if( aVariantName.IsEmpty() )
1079 if( instance->
m_Variants.contains( aVariantName )
1080 && instance->
m_Variants.at( aVariantName ).m_Fields.contains( aFieldName ) )
1081 return instance->
m_Variants.at( aVariantName ).m_Fields.at( aFieldName );
1097 if( instance.m_Path ==
path )
1098 return !instance.m_Reference.IsEmpty() && instance.m_Reference.Last() !=
'?';
1109 refDesignator.Replace(
"~",
" " );
1111 wxString prefix = refDesignator;
1113 while( prefix.Length() )
1115 wxUniCharRef last = prefix.Last();
1117 if( ( last >=
'0' && last <=
'9' ) || last ==
'?' || last ==
'*' )
1118 prefix.RemoveLast();
1124 prefix.Trim(
true );
1125 prefix.Trim(
false );
1127 if( !prefix.IsEmpty() )
1137 const std::map<int, wxString>& names =
m_part->GetUnitDisplayNames();
1138 auto it = names.find( aUnit );
1140 if( it != names.end() && !it->second.IsEmpty() )
1146 int sep = schematic->Settings().m_SubpartIdSeparator;
1148 if( sep != 0 && aAddSeparator )
1149 subRef << wxChar( sep );
1152 subRef << it->second;
1158 return schematic->Settings().SubReference( aUnit, aAddSeparator );
1170 if( instance.m_Path ==
path )
1171 return instance.m_Unit;
1187 if( instance.m_Path ==
path )
1189 instance.m_Unit = aUnitSelection;
1201 if( !aInstance || aVariantName.IsEmpty() )
1209 wxCHECK_MSG( instance, ,
1210 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
1213 if( aVariantName.IsEmpty() )
1219 if( instance->
m_Variants.contains( aVariantName ) && ( aEnable != instance->
m_Variants[aVariantName].m_DNP ) )
1221 instance->
m_Variants[aVariantName].m_DNP = aEnable;
1228 variant.
m_DNP = aEnable;
1237 if( !aInstance || aVariantName.IsEmpty() )
1245 if( instance.
m_Variants.contains( aVariantName ) )
1246 return instance.
m_Variants[aVariantName].m_DNP;
1254 if( !aInstance || aVariantName.IsEmpty() )
1262 wxCHECK_MSG( instance, ,
1263 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
1266 if( aVariantName.IsEmpty() )
1272 if( instance->
m_Variants.contains( aVariantName )
1273 && ( aEnable != instance->
m_Variants[aVariantName].m_ExcludedFromBOM ) )
1275 instance->
m_Variants[aVariantName].m_ExcludedFromBOM = aEnable;
1291 if( !aInstance || aVariantName.IsEmpty() )
1299 if( instance.
m_Variants.contains( aVariantName ) )
1300 return instance.
m_Variants[aVariantName].m_ExcludedFromBOM;
1309 if( !aInstance || aVariantName.IsEmpty() )
1317 wxCHECK_MSG( instance, ,
1318 wxString::Format( wxS(
"Cannot get DNP attribute for invalid sheet path '%s'." ),
1321 if( aVariantName.IsEmpty() )
1327 if( instance->
m_Variants.contains( aVariantName )
1328 && ( aEnable != instance->
m_Variants[aVariantName].m_ExcludedFromSim ) )
1330 instance->
m_Variants[aVariantName].m_ExcludedFromSim = aEnable;
1346 if( !aInstance || aVariantName.IsEmpty() )
1354 if( instance.
m_Variants.contains( aVariantName ) )
1355 return instance.
m_Variants[aVariantName].m_ExcludedFromSim;
1363 const wxString& aVariantName )
1365 if( !aInstance || aVariantName.IsEmpty() )
1373 wxCHECK_MSG( instance, ,
1374 wxString::Format( wxS(
"Cannot set exclude from board for invalid sheet path '%s'." ),
1377 if( aVariantName.IsEmpty() )
1383 if( instance->
m_Variants.contains( aVariantName )
1384 && ( aEnable != instance->
m_Variants[aVariantName].m_ExcludedFromBoard ) )
1386 instance->
m_Variants[aVariantName].m_ExcludedFromBoard = aEnable;
1401 const wxString& aVariantName )
const
1403 if( !aInstance || aVariantName.IsEmpty() )
1411 if( instance.
m_Variants.contains( aVariantName ) )
1412 return instance.
m_Variants[aVariantName].m_ExcludedFromBoard;
1420 const wxString& aVariantName )
1422 if( !aInstance || aVariantName.IsEmpty() )
1430 wxCHECK_MSG( instance, ,
1431 wxString::Format( wxS(
"Cannot set exclude from pos files for invalid sheet path '%s'." ),
1434 if( aVariantName.IsEmpty() )
1440 if( instance->
m_Variants.contains( aVariantName )
1441 && ( aEnable != instance->
m_Variants[aVariantName].m_ExcludedFromPosFiles ) )
1443 instance->
m_Variants[aVariantName].m_ExcludedFromPosFiles = aEnable;
1458 const wxString& aVariantName )
const
1460 if( !aInstance || aVariantName.IsEmpty() )
1468 if( instance.
m_Variants.contains( aVariantName ) )
1469 return instance.
m_Variants[aVariantName].m_ExcludedFromPosFiles;
1479 instance.m_Unit = aUnitSelection;
1484 bool aAllowExtraText,
const wxString& aVariantName )
const
1486 if( aVariantName.IsEmpty() )
1494 std::optional variant =
GetVariant( *aInstance, aVariantName );
1508 const wxString& aVariantName )
1510 if( !aInstance || aVariantName.IsEmpty() )
1518 wxCHECK( instance, );
1522 if( instance->
m_Variants.contains( aVariantName ) )
1524 instance->
m_Variants[aVariantName].m_Fields[fieldName] = aValue;
1531 newVariant.
m_Fields[fieldName] = aValue;
1532 instance->
m_Variants.insert( std::make_pair( aVariantName, newVariant ) );
1538 bool aAllowExtraText,
const wxString& aVariantName )
const
1558 m_fields.emplace_back(
this, aFieldType );
1587 if( !field.IsVisible() || field.GetText().IsEmpty() )
1591 aVector.push_back(
const_cast<SCH_FIELD*
>( &field ) );
1594 std::sort( aVector.begin(), aVector.end(),
1597 return lhs->GetOrdinal() < rhs->GetOrdinal();
1617 for(
unsigned ii = 0; ii <
m_fields.size(); ++ii )
1622 if( aFieldName ==
m_fields[ii].GetName(
false ) )
1635 if( field.GetName().IsSameAs( aFieldName,
false ) )
1647 if( field.GetName().IsSameAs( aFieldName,
false ) )
1656 bool aResetRef,
bool aResetOtherFields )
1660 std::vector<SCH_FIELD*> fields;
1661 m_part->GetFields( fields );
1663 for(
const SCH_FIELD* libField : fields )
1668 if( libField->IsMandatory() )
1670 fieldType = libField->GetId();
1675 schField =
GetField( libField->GetCanonicalName() );
1685 schField->
SetPrivate( libField->IsPrivate() );
1697 else if( aUpdateRef )
1698 SetRef( aPath, libField->GetText() );
1706 if( aResetOtherFields )
1708 else if( aUpdateOtherFields )
1709 schField->
SetText( libField->GetText() );
1713 if( aResetOtherFields || aUpdateOtherFields )
1714 schField->
SetText( libField->GetText() );
1724 bool updateValue =
true;
1725 bool updateExclFromBOM =
true;
1726 bool updateExclFromBoard =
true;
1727 bool updateExclFromPosFiles =
true;
1728 bool updateDNP =
true;
1729 bool updateOtherFields =
true;
1730 bool updatePins =
true;
1734 updateValue = aProperty->
Name() ==
_HKI(
"Value" );
1735 updateExclFromBoard = aProperty->
Name() ==
_HKI(
"Exclude From Board" );
1736 updateExclFromBOM = aProperty->
Name() ==
_HKI(
"Exclude From Bill of Materials" );
1737 updateExclFromPosFiles = aProperty->
Name() ==
_HKI(
"Exclude From Position Files" );
1738 updateDNP = aProperty->
Name() ==
_HKI(
"Do not Populate" );
1739 updateOtherFields =
false;
1743 if( !updateValue && !updateExclFromBOM && !updateExclFromBoard && !updateExclFromPosFiles && !updateDNP && !updateOtherFields && !updatePins )
1752 wxString ref =
GetRef( &aSourceSheet );
1757 std::vector<SCH_SYMBOL*> otherUnits;
1763 aCommit.
Modify( otherUnit, screen );
1768 if( updateOtherFields )
1780 if( field.IsMandatory() )
1781 otherField = otherUnit->GetField( field.GetId() );
1783 otherField = otherUnit->GetField( field.GetName() );
1787 otherField->
SetText( field.GetText() );
1795 newField.
Offset( otherUnit->GetPosition() );
1798 otherUnit->AddField( newField );
1802 for(
int ii = (
int) otherUnit->GetFields().size() - 1; ii >= 0; ii-- )
1804 SCH_FIELD& otherField = otherUnit->GetFields()[ii];
1807 otherUnit->GetFields().erase( otherUnit->GetFields().begin() + ii );
1811 if( updateExclFromBOM )
1814 if( updateExclFromBoard )
1817 if( updateExclFromPosFiles )
1821 otherUnit->SetDNP(
GetDNP( &aSourceSheet, aVariantName ), &sheet, aVariantName );
1825 for(
const std::unique_ptr<SCH_PIN>& model_pin :
m_pins )
1827 for(
SCH_PIN* src_pin : otherUnit->GetPinsByNumber( model_pin->GetNumber() ) )
1828 src_pin->SetAlt( model_pin->GetAlt() );
1839 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1840 aFunction(
pin.get() );
1843 aFunction( &field );
1849 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1851 if(
pin->GetNumber() == aNumber )
1861 std::vector<SCH_PIN*> pins;
1863 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1865 if(
pin->GetNumber() == aNumber )
1866 pins.push_back(
pin.get() );
1875 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1877 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit() :
GetUnit();
1878 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle() :
GetBodyStyle();
1880 if( pin_unit > 0 && pin_unit !=
GetUnit() )
1883 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
1886 if(
pin->GetPosition() == aPos )
1899 return std::vector<SCH_PIN*>();
1906 return m_part->GetPins();
1908 return std::vector<SCH_PIN*>();
1920 auto it =
m_pinMap.find( aLibPin );
1925 wxFAIL_MSG_AT(
"Pin not found", __FILE__, __LINE__, __FUNCTION__ );
1932 std::vector<const SCH_PIN*> pins;
1941 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1943 if( unit &&
pin->GetUnit() &&
pin->GetUnit() != unit )
1946 pins.push_back(
pin.get() );
1955 std::vector<SCH_PIN*> pins;
1964 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1966 if( unit &&
pin->GetUnit() &&
pin->GetUnit() != unit )
1969 pins.push_back(
pin.get() );
1985 wxCHECK_RET( aItem !=
nullptr && aItem->
Type() ==
SCH_SYMBOL_T, wxT(
"Cannot swap data with invalid symbol." ) );
1993 for( std::unique_ptr<SCH_PIN>&
pin : symbol->
m_pins )
1994 pin->SetParent( symbol );
1996 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
1997 pin->SetParent(
this );
2002 m_part.reset( libSymbol );
2035 if( field.IsPrivate() )
2038 if( field.IsMandatory() )
2039 aVars->push_back( field.GetCanonicalName().Upper() );
2041 aVars->push_back( field.GetName() );
2044 aVars->push_back( wxT(
"OP" ) );
2045 aVars->push_back( wxT(
"FOOTPRINT_LIBRARY" ) );
2046 aVars->push_back( wxT(
"FOOTPRINT_NAME" ) );
2047 aVars->push_back( wxT(
"UNIT" ) );
2048 aVars->push_back( wxT(
"SHORT_REFERENCE" ) );
2049 aVars->push_back( wxT(
"SYMBOL_LIBRARY" ) );
2050 aVars->push_back( wxT(
"SYMBOL_NAME" ) );
2051 aVars->push_back( wxT(
"SYMBOL_DESCRIPTION" ) );
2052 aVars->push_back( wxT(
"SYMBOL_KEYWORDS" ) );
2053 aVars->push_back( wxT(
"EXCLUDE_FROM_BOM" ) );
2054 aVars->push_back( wxT(
"EXCLUDE_FROM_BOARD" ) );
2055 aVars->push_back( wxT(
"EXCLUDE_FROM_SIM" ) );
2056 aVars->push_back( wxT(
"DNP" ) );
2057 aVars->push_back( wxT(
"SHORT_NET_NAME(<pin_number>)" ) );
2058 aVars->push_back( wxT(
"NET_NAME(<pin_number>)" ) );
2059 aVars->push_back( wxT(
"NET_CLASS(<pin_number>)" ) );
2060 aVars->push_back( wxT(
"PIN_NAME(<pin_number>)" ) );
2061 aVars->push_back( wxT(
"REFERENCE(<pin_number>)" ) );
2062 aVars->push_back( wxT(
"SHORT_REFERENCE(<pin_number>)" ) );
2063 aVars->push_back( wxT(
"UNIT(<pin_number>)" ) );
2074 const wxString& aVariantName,
int aDepth )
const
2078 thread_local wxRegEx operatingPoint( wxT(
"^"
2093 wxString variant = aVariantName.IsEmpty() ? schematic->GetCurrentVariant() : aVariantName;
2095 if( operatingPoint.Matches( *token ) )
2097 wxString
pin( operatingPoint.GetMatch( *token, 1 ).Lower() );
2098 wxString precisionStr( operatingPoint.GetMatch( *token, 3 ) );
2099 wxString rangeStr( operatingPoint.GetMatch( *token, 4 ) );
2101 int precision = precisionStr.IsEmpty() ? 3 : precisionStr[0] -
'0';
2102 wxString range = rangeStr.IsEmpty() ? wxString( wxS(
"~A" ) ) : rangeStr;
2106 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
2107 embeddedFilesStack.push_back( schematic->GetEmbeddedFiles() );
2110 embeddedFilesStack.push_back(
m_part->GetEmbeddedFiles() );
2116 aVariantName, devnull ).model;
2120 wxString spiceRef =
model.SpiceGenerator().ItemName( spiceItem );
2121 spiceRef = spiceRef.Lower();
2125 *token = schematic->GetOperatingPoint( spiceRef, precision, range );
2128 else if(
pin == wxS(
":power" ) )
2130 if( rangeStr.IsEmpty() )
2131 range = wxS(
"~W" );
2133 *token = schematic->GetOperatingPoint( spiceRef + wxS(
":power" ), precision, range );
2138 pin =
pin.SubString( 1, -1 );
2140 for(
const std::reference_wrapper<const SIM_MODEL_PIN>& modelPin :
model.GetPins() )
2142 SCH_PIN* symbolPin =
GetPin( modelPin.get().symbolPinNumber );
2146 if(
model.GetPins().size() == 2 )
2148 *token = schematic->GetOperatingPoint( spiceRef, precision, range );
2152 wxString netChainName = spiceRef + wxS(
":" ) + modelPin.get().modelPinName;
2153 *token = schematic->GetOperatingPoint( netChainName, precision, range );
2161 *token = wxS(
"?" );
2165 if( token->Contains(
':' ) )
2167 if( schematic->ResolveCrossReference( token, aDepth + 1 ) )
2173 wxString fieldName = field.IsMandatory() ? field.GetCanonicalName() : field.GetName();
2175 wxString textToken = field.GetText();
2176 textToken.Replace(
" ", wxEmptyString );
2177 wxString tokenString =
"${" + fieldName +
"}";
2180 if( textToken.IsSameAs( tokenString,
false ) )
2183 if( token->IsSameAs( fieldName,
false ) )
2187 *token =
GetRef( aPath,
true );
2189 else if( !aVariantName.IsEmpty() )
2192 std::optional<SCH_SYMBOL_VARIANT> symVariant =
GetVariant( *aPath, aVariantName );
2194 if( symVariant && symVariant->m_Fields.contains( fieldName ) )
2195 *token = symVariant->m_Fields.at( fieldName );
2197 *token = field.GetShownText( aPath,
false, aDepth + 1 );
2201 *token = field.GetShownText( aPath,
false, aDepth + 1 );
2209 if( token->IsSameAs( wxT(
"SIM.DEVICE" ) ) || token->IsSameAs( wxT(
"SIM.TYPE" ) )
2210 || token->IsSameAs( wxT(
"SIM.PINS" ) ) || token->IsSameAs( wxT(
"SIM.PARAMS" ) )
2211 || token->IsSameAs( wxT(
"SIM.LIBRARY" ) ) || token->IsSameAs( wxT(
"SIM.NAME" ) ) )
2213 *token = wxEmptyString;
2218 schematic->Settings().m_TemplateFieldNames.GetTemplateFieldNames() )
2220 if( token->IsSameAs( templateFieldname.m_Name ) || token->IsSameAs( templateFieldname.m_Name.Upper() ) )
2224 *token = wxEmptyString;
2229 if( token->IsSameAs( wxT(
"FOOTPRINT_LIBRARY" ) ) )
2233 wxArrayString parts = wxSplit( footprint,
':' );
2235 if( parts.Count() > 0 )
2238 *token = wxEmptyString;
2242 else if( token->IsSameAs( wxT(
"FOOTPRINT_NAME" ) ) )
2246 wxArrayString parts = wxSplit( footprint,
':' );
2248 if( parts.Count() > 1 )
2249 *token = parts[std::min( 1, (
int) parts.size() - 1 )];
2251 *token = wxEmptyString;
2255 else if( token->IsSameAs( wxT(
"UNIT" ) ) )
2260 else if( token->IsSameAs( wxT(
"SHORT_REFERENCE" ) ) )
2262 *token =
GetRef( aPath,
false );
2265 else if( token->IsSameAs( wxT(
"SYMBOL_LIBRARY" ) ) )
2267 *token =
m_lib_id.GetUniStringLibNickname();
2270 else if( token->IsSameAs( wxT(
"SYMBOL_NAME" ) ) )
2272 *token =
m_lib_id.GetUniStringLibItemName();
2275 else if( token->IsSameAs( wxT(
"SYMBOL_DESCRIPTION" ) ) )
2280 else if( token->IsSameAs( wxT(
"SYMBOL_KEYWORDS" ) ) )
2285 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOM" ) ) )
2287 *token = wxEmptyString;
2289 if( aPath->
GetExcludedFromBOM( variant ) || this->ResolveExcludedFromBOM( aPath, variant ) )
2290 *token =
_(
"Excluded from BOM" );
2294 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOARD" ) ) )
2296 *token = wxEmptyString;
2298 if( aPath->
GetExcludedFromBoard( variant ) || this->ResolveExcludedFromBoard( aPath, variant ) )
2299 *token =
_(
"Excluded from board" );
2303 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_SIM" ) ) )
2305 *token = wxEmptyString;
2307 if( aPath->
GetExcludedFromSim( variant ) || this->ResolveExcludedFromSim( aPath, variant ) )
2308 *token =
_(
"Excluded from simulation" );
2312 else if( token->IsSameAs( wxT(
"DNP" ) ) )
2314 *token = wxEmptyString;
2316 if( aPath->
GetDNP( variant ) || this->ResolveDNP( aPath, variant ) )
2317 *token =
_(
"DNP" );
2321 else if( token->StartsWith( wxT(
"SHORT_NET_NAME(" ) ) || token->StartsWith( wxT(
"NET_NAME(" ) )
2322 || token->StartsWith( wxT(
"NET_CLASS(" ) ) || token->StartsWith( wxT(
"PIN_NAME(" ) )
2323 || token->StartsWith( wxT(
"PIN_BASE_NAME(" ) ) || token->StartsWith( wxT(
"PIN_ALT_LIST(" ) )
2324 || token->StartsWith( wxT(
"REFERENCE(" ) ) || token->StartsWith( wxT(
"SHORT_REFERENCE(" ) )
2325 || token->StartsWith( wxT(
"UNIT(" ) ) )
2327 wxString pinNumber = token->AfterFirst(
'(' );
2328 pinNumber = pinNumber.BeforeLast(
')' );
2330 bool isReferenceFunction = token->StartsWith( wxT(
"REFERENCE(" ) );
2331 bool isShortReferenceFunction = token->StartsWith( wxT(
"SHORT_REFERENCE(" ) );
2332 bool isUnitFunction = token->StartsWith( wxT(
"UNIT(" ) );
2336 std::vector<const SCH_PIN*> pinsToSearch;
2337 std::vector<const SCH_PIN*> altPinsToSearch;
2339 if( isReferenceFunction || isShortReferenceFunction || isUnitFunction )
2342 pinsToSearch.push_back(
pin );
2347 pinsToSearch.push_back(
pin );
2350 altPinsToSearch.push_back(
pin );
2355 if(
pin->GetNumber() == pinNumber )
2357 if( isReferenceFunction || isShortReferenceFunction || isUnitFunction )
2359 int pinUnit =
pin->GetUnit();
2362 if( isReferenceFunction )
2370 else if( isShortReferenceFunction )
2375 else if( isUnitFunction )
2387 else if( token->StartsWith( wxT(
"PIN_NAME" ) ) )
2389 *token =
pin->GetAlt().IsEmpty() ?
pin->GetName() :
pin->GetAlt();
2392 else if( token->StartsWith( wxT(
"PIN_BASE_NAME" ) ) )
2394 *token =
pin->GetBaseName();
2397 else if( token->StartsWith( wxT(
"PIN_ALT_LIST" ) ) )
2402 const std::map<wxString, SCH_PIN::ALT>& alts =
pin->GetAlternates();
2404 for(
const auto& [altName, altDef] : alts )
2406 if( !altList.IsEmpty() )
2407 altList += wxT(
", " );
2419 *token = wxEmptyString;
2421 else if( token->StartsWith( wxT(
"SHORT_NET_NAME" ) ) )
2424 if( netName.Lower().StartsWith( wxT(
"unconnected" ) ) )
2425 *token = wxT(
"NC" );
2429 else if( token->StartsWith( wxT(
"NET_NAME" ) ) )
2431 *token = conn->
Name();
2433 else if( token->StartsWith( wxT(
"NET_CLASS" ) ) )
2435 *token =
pin->GetEffectiveNetClass( aPath )->GetName();
2445 if(
pin->GetNumber() == pinNumber )
2448 if( token->StartsWith( wxT(
"PIN_BASE_NAME" ) ) )
2450 *token =
pin->GetBaseName();
2453 else if( token->StartsWith( wxT(
"PIN_ALT_LIST" ) ) )
2458 const std::map<wxString, SCH_PIN::ALT>& alts =
pin->GetAlternates();
2460 for(
const auto& [altName, altDef] : alts )
2462 if( !altList.IsEmpty() )
2463 altList += wxT(
", " );
2472 int pinUnit =
pin->GetUnit();
2488 if( symbol->
GetRef( &sheetPath,
false ) ==
GetRef( aPath,
false )
2491 targetPath = sheetPath;
2492 targetSymbol = symbol;
2505 *token = wxString::Format( wxT(
"<Unit %s not placed>" ),
SubReference( pinUnit,
false ) );
2511 SCH_PIN* instancePin =
nullptr;
2515 if( candidate->GetNumber() == pinNumber )
2517 instancePin = candidate;
2524 *token = wxEmptyString;
2529 if( token->StartsWith( wxT(
"PIN_NAME" ) ) )
2531 *token = instancePin->
GetAlt().IsEmpty() ? instancePin->
GetName() : instancePin->
GetAlt();
2540 *token = wxEmptyString;
2542 else if( token->StartsWith( wxT(
"SHORT_NET_NAME" ) ) )
2545 if( netName.Lower().StartsWith( wxT(
"unconnected" ) ) )
2546 *token = wxT(
"NC" );
2550 else if( token->StartsWith( wxT(
"NET_NAME" ) ) )
2552 *token = conn->
Name();
2554 else if( token->StartsWith( wxT(
"NET_CLASS" ) ) )
2564 *token = wxString::Format( wxT(
"<Unresolved: pin %s>" ), pinNumber );
2584 if( instance.m_Path ==
path )
2586 if( instance.m_Reference.IsEmpty() || aResetPrefix )
2597 if( instance.m_Reference.IsEmpty() || aResetPrefix )
2604 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
2605 pin->ClearDefaultNetName( aSheetPath );
2615 if( currentReference.IsEmpty() || aResetPrefix )
2626 wxCHECK( aSheetPath.size() > 0,
false );
2631 if( instance.m_Path == aSheetPath )
2644 bool transform =
false;
2646 switch( aOrientation )
2767 wxFAIL_MSG(
"Invalid schematic symbol orientation type." );
2821 for(
int type_rotate : rotate_values )
2833 wxFAIL_MSG(
"Schematic symbol orientation matrix internal error." );
2841void SCH_SYMBOL::Show(
int nestLevel, std::ostream& os )
const
2844 NestedSpace( nestLevel, os ) <<
'<' <<
GetClass().Lower().mb_str() <<
" ref=\""
2850 for(
int i = 1; i < (int)
GetFields().size(); ++i )
2852 const wxString& value =
GetFields()[i].GetText();
2854 if( !value.IsEmpty() )
2856 NestedSpace( nestLevel + 1, os ) <<
"<field" <<
" name=\"" <<
TO_UTF8(
GetFields()[i].GetName() ) <<
'"'
2857 <<
" value=\"" <<
TO_UTF8( value ) <<
"\"/>\n";
2861 NestedSpace( nestLevel, os ) <<
"</" <<
TO_UTF8(
GetClass().Lower() ) <<
">\n";
2881 if( aIncludeFields )
2885 if( field.IsVisible() )
2886 bBox.
Merge( field.GetBoundingBox() );
2900 catch(
const boost::bad_pointer& e )
2902 wxFAIL_MSG( wxString::Format( wxT(
"Boost pointer exception occurred: %s" ), e.what() ) );
2928 auto addExcludes = [&]()
2933 msgs.Add(
_(
"Simulation" ) );
2936 msgs.Add(
_(
"BOM" ) );
2939 msgs.Add(
_(
"Board" ) );
2941 if(
GetDNP( currentSheet, currentVariant ) )
2942 msgs.Add(
_(
"DNP" ) );
2944 msg = wxJoin( msgs,
'|' );
2945 msg.Replace(
'|', wxS(
", " ) );
2948 aList.emplace_back(
_(
"Exclude from" ), msg );
2959 aList.emplace_back(
_(
"Power symbol" ),
2967 aList.emplace_back(
_(
"Value" ),
2974 aList.emplace_back(
_(
"flags" ), wxString::Format(
"%X",
GetEditFlags() ) );
2979 msg =
_(
"Missing parent" );
2981 std::shared_ptr<LIB_SYMBOL> parent =
m_part->GetParent().lock();
2984 msg = parent->GetName();
2988 else if( !
m_lib_id.GetLibNickname().empty() )
2990 aList.emplace_back(
_(
"Library" ),
m_lib_id.GetLibNickname() );
2994 aList.emplace_back(
_(
"Library" ),
_(
"Undefined!!!" ) );
3002 msg =
_(
"<Unknown>" );
3004 aList.emplace_back(
_(
"Footprint" ), msg );
3008 _(
"Keywords" ) + wxT(
": " ) +
m_part->GetKeyWords() );
3013 aList.emplace_back(
_(
"Reference" ),
GetRef( currentSheet ) );
3022 if( libNickname.empty() )
3023 msg =
_(
"No library defined!" );
3025 msg.Printf(
_(
"Symbol not found in %s!" ), libNickname );
3027 aList.emplace_back(
_(
"Library" ), msg );
3062 field.SetTextPos( pos );
3080 field.SetTextPos( pos );
3099 field.SetTextPos( pos );
3127 if( field.Matches( aSearchData, aAuxData ) )
3137 if( drawItem.Matches( aSearchData, aAuxData ) )
3148 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3156 aItemList.push_back( item );
3162 std::vector<DANGLING_END_ITEM>& aItemListByPos,
const SCH_SHEET_PATH* aPath )
3164 bool changed =
false;
3166 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3168 bool previousState =
pin->IsDangling();
3169 pin->SetIsDangling(
true );
3174 bool do_break =
false;
3176 for(
auto it = lower; it < aItemListByPos.end() && it->GetPosition() == pos; it++ )
3195 pin->SetIsDangling(
false );
3206 changed = ( changed || ( previousState !=
pin->IsDangling() ) );
3231 wxCHECK( symbol,
false );
3237 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3239 if(
pin->IsDangling() )
3252 if(
GetRef( aInstance ) != symbol->
GetRef( aInstance ) )
3262 for(
size_t i = 0; i <
m_pins.size(); i++ )
3274 std::vector<VECTOR2I> retval;
3276 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3280 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit() :
GetUnit();
3281 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle() :
GetBodyStyle();
3283 if( pin_unit > 0 && pin_unit !=
GetUnit() )
3286 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
3312 return wxString::Format(
_(
"Symbol %s [%s]" ),
3320 for(
KICAD_T scanType : aScanTypes )
3365 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3369 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit() :
GetUnit();
3370 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle() :
GetBodyStyle();
3372 if( pin_unit > 0 && pin_unit !=
GetUnit() )
3375 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
3412 std::vector<SCH_FIELD*> fields, otherFields;
3415 aSymbol.
GetFields( otherFields,
false );
3417 if( fields.size() != otherFields.size() )
3420 for(
int ii = 0; ii < (int) fields.size(); ii++ )
3425 if( fields[ii]->GetText().Cmp( otherFields[ii]->GetText() ) != 0 )
3435 return !( *
this == aSymbol );
3441 wxCHECK_MSG(
Type() == aSymbol.
Type(), *
this,
3442 wxT(
"Cannot assign object type " ) + aSymbol.
GetClass() + wxT(
" to type " ) +
GetClass() );
3444 if( &aSymbol !=
this )
3461 field.SetParent(
this );
3473 bBox.
Inflate( aAccuracy / 2 );
3489 rect.
Inflate( aAccuracy / 2 );
3511 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3524 if(
pin->GetLocalPosition() == new_pos )
3539 const VECTOR2I& aOffset,
bool aDimmed )
3553 for(
unsigned i = 0; i < tempPins.size(); ++i )
3556 SCH_PIN* tempPin = tempPins[i];
3576 text->SetText(
dummy.GetShownText(
false ) );
3587 bool dnp =
GetDNP( sheet, variant );
3589 for(
bool local_background : {
true,
false } )
3595 field.ClearRenderCache();
3599 && ( field.IsVisible() || field.IsForceVisible() ) )
3612 std::vector<wxString> properties;
3616 wxString text_field = field.GetShownText( sheet,
false, 0, variant );
3618 if( text_field.IsEmpty() )
3621 properties.emplace_back( wxString::Format( wxT(
"!%s = %s" ), field.GetName(), text_field ) );
3624 if( !
m_part->GetKeyWords().IsEmpty() )
3626 properties.emplace_back(
3627 wxString::Format( wxT(
"!%s = %s" ),
_(
"Keywords" ),
m_part->GetKeyWords() ) );
3650 margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
3651 margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
3669 double lineWidth = aSize / 10.0;
3671 std::vector<SCH_SHAPE> shapeList;
3673 int tolerance = 100;
3675 for(
const SCH_SHAPE& shape : shapeList )
3681 aPlotter->
BezierCurve( shape.GetStart(), shape.GetBezierC1(), shape.GetBezierC2(), shape.GetEnd(),
3682 tolerance, lineWidth );
3684 aPlotter->
Circle( shape.getCenter(), shape.GetRadius() * 2, filled, lineWidth );
3744 for(
unsigned i = 0; i < tempPins.size(); ++i )
3747 SCH_PIN* tempPin = tempPins[i];
3765 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3767 if(
pin->IsBrightened() )
3777 for( std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3778 pin->ClearBrightened();
3796 m_part->SetShowPinNames( aShow );
3809 m_part->SetShowPinNumbers( aShow );
3815 for(
const std::unique_ptr<SCH_PIN>&
pin :
m_pins )
3817 int pin_unit =
pin->GetLibPin() ?
pin->GetLibPin()->GetUnit() :
GetUnit();
3818 int pin_bodyStyle =
pin->GetLibPin() ?
pin->GetLibPin()->GetBodyStyle() :
GetBodyStyle();
3820 if( pin_unit > 0 && pin_unit !=
GetUnit() )
3823 if( pin_bodyStyle > 0 && pin_bodyStyle !=
GetBodyStyle() )
3826 if(
pin->IsPointClickableAnchor( aPos ) )
3845 if( pin_list.size() != 1 )
3863 if( pin_list.size() != 1 )
3875 return m_part->IsLocalPower();
3884 return m_part->IsGlobalPower();
3896 wxCHECK(
m_part,
false );
3898 return m_part->IsNormal();
3904 std::unordered_set<wxString> componentClass;
3906 auto getComponentClassFields = [&](
const std::vector<SCH_FIELD>& fields )
3910 if( field.GetCanonicalName() == wxT(
"Component Class" ) )
3912 if( field.GetShownText( aPath,
false ) != wxEmptyString )
3913 componentClass.insert( field.GetShownText( aPath,
false ) );
3919 getComponentClassFields(
m_fields );
3926 getComponentClassFields( label->GetFields() );
3930 return componentClass;
3935 const wxString& aVariantName )
const
3940 return std::nullopt;
3942 return instance.
m_Variants.find( aVariantName )->second;
3954 instance->
m_Variants.insert( std::make_pair( aVariant.
m_Name, aVariant ) );
3963 if( !instance || !instance->
m_Variants.contains( aVariantName ) )
3971 const wxString& aNewName )
3976 if( !instance || !instance->
m_Variants.contains( aOldName ) )
3981 variant.
m_Name = aNewName;
3983 instance->
m_Variants.insert( std::make_pair( aNewName, variant ) );
3988 const wxString& aNewVariant )
3993 if( !instance || !instance->
m_Variants.contains( aSourceVariant ) )
3998 variant.
m_Name = aNewVariant;
3999 instance->
m_Variants.insert( std::make_pair( aNewVariant, variant ) );
4049 for(
unsigned i = 0; i <
m_pins.size(); ++i )
4058 if( m_instanceReferences != symbol.m_instanceReferences )
4084 double aLineWidth,
bool aHorizontal )
4088 double x_right = aSize / 1.6180339887;
4089 double x_middle = x_right / 2.0;
4102 aShapeList.back().SetStart( bottomPt );
4103 aShapeList.back().SetBezierC1( bottomAnchorPt );
4104 aShapeList.back().SetBezierC2( leftSideAnchorPt1 );
4105 aShapeList.back().SetEnd( leftPt );
4109 aShapeList.back().SetStart( leftPt );
4110 aShapeList.back().SetBezierC1( leftSideAnchorPt2 );
4111 aShapeList.back().SetBezierC2( rightSideAnchorPt2 );
4112 aShapeList.back().SetEnd( rightPt );
4115 aShapeList.back().SetStart( rightPt );
4116 aShapeList.back().SetBezierC1( rightSideAnchorPt1 );
4117 aShapeList.back().SetBezierC2( bottomAnchorPt );
4118 aShapeList.back().SetEnd( bottomPt );
4121 aShapeList.back().SetCenter( ( leftPt + rightPt ) / 2.0 );
4122 aShapeList.back().SetRadius( aSize / 15.0 );
4127 shape.Rotate(
VECTOR2I( 0, 0 ),
true );
4138 if( instance.m_Path == aSheetPath )
4150 if( instance.m_Path == aSheetPath )
4188 auto hasLibPart = [](
INSPECTABLE* aItem ) ->
bool
4191 return symbol->GetLibSymbolRef() !=
nullptr;
4204 const wxString groupFields =
_HKI(
"Fields" );
4224 auto multiUnit = [=](
INSPECTABLE* aItem ) ->
bool
4227 return symbol->IsMultiUnit();
4232 auto multiBodyStyle = [=](
INSPECTABLE* aItem ) ->
bool
4235 return symbol->IsMultiBodyStyle();
4246 wxPGChoices choices;
4250 for(
int ii = 1; ii <= symbol->GetUnitCount(); ii++ )
4251 choices.Add( symbol->GetUnitDisplayName( ii,
false ), ii );
4263 wxPGChoices choices;
4267 for(
int ii = 1; ii <= symbol->GetBodyStyleCount(); ii++ )
4268 choices.Add( symbol->GetBodyStyleDescription( ii,
false ) );
4274 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,...
const EDA_ANGLE & GetTextAngle() const
void SetTextPos(const VECTOR2I &aPoint)
void Offset(const VECTOR2I &aOffset)
static ENUM_MAP< T > & Instance()
A text control validator used for validating the text allowed in fields.
bool DoValidate(const wxString &aValue, wxWindow *aParent)
Class that other classes need to inherit from, in order to be inspectable.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
wxString AsString() const
A logical library item identifier and consists of various portions much like a URI.
const UTF8 & 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