45#include <unordered_set>
55 if( std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock() )
56 shownText = parent->GetShownDescription( aDepth );
67 std::function<bool( wxString* )> libSymbolResolver = [&]( wxString* token ) ->
bool
80 std::vector<SEARCH_TERM> terms;
86 wxStringTokenizer keywordTokenizer(
GetShownKeyWords(),
" \t\r\n", wxTOKEN_STRTOK );
88 while( keywordTokenizer.HasMoreTokens() )
89 terms.emplace_back(
SEARCH_TERM( keywordTokenizer.GetNextToken(), 4 ) );
97 if( !footprint.IsEmpty() )
111 aColumnMap[field->
GetName()] = field->EDA_TEXT::GetShownText(
false );
141 auto addField = [&](
FIELD_T id,
bool visible )
199 wxFAIL_MSG(
"Failed to clone SCH_ITEM." );
210 if( &aSymbol ==
this )
285 if(
const std::shared_ptr<LIB_SYMBOL> parent =
GetParent().lock() )
294 if(
const std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock() )
317 return aLabel ?
_(
"Alternate" ) : wxString(
_HKI(
"Alternate" ) );
319 return aLabel ?
_(
"Standard" ) : wxString(
_HKI(
"Standard" ) );
334 m_libId.SetLibItemName( aName );
349 std::unique_ptr<LIB_SYMBOL> retv;
353 std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock();
355 wxCHECK_MSG( parent, retv, wxString::Format(
"Parent of derived symbol '%s' undefined",
m_name ) );
358 if( parent->IsDerived() )
359 retv = parent->Flatten();
361 retv = std::make_unique<LIB_SYMBOL>( *parent.get() );
370 *retv->GetField( fieldId ) = *
GetField( fieldId );
389 retv->AddDrawItem( newField );
393 retv->RemoveDrawItem( parentField );
394 retv->AddDrawItem( newField );
404 retv->AddFile( newFile );
407 retv->SetExcludedFromSim( parent->GetExcludedFromSim() );
408 retv->SetExcludedFromBOM( parent->GetExcludedFromBOM() );
409 retv->SetExcludedFromBoard( parent->GetExcludedFromBoard() );
411 retv->m_parent.reset();
415 retv = std::make_unique<LIB_SYMBOL>( *
this );
427 return m_libId.GetLibNickname();
433 if(
const std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock() )
434 return parent->IsLocalPower();
442 if( std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock() )
444 parent->SetLocalPower();
454 if(
const std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock() )
455 return parent->IsGlobalPower();
469 if( std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock() )
471 parent->SetGlobalPower();
481 if(
const std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock() )
482 return parent->IsNormal();
490 if( std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock() )
510 u = ( aUnit - 1 ) % 26;
511 suffix = wxChar( aInitialLetter + u ) + suffix;
512 aUnit = ( aUnit - u ) / 26;
513 }
while( aUnit > 0 );
530 footprint = field.
GetShownText(
nullptr,
false, aDepth + 1 );
534 *token = field.
GetShownText(
nullptr,
false, aDepth + 1 );
541 if( token->IsSameAs( wxT(
"SIM.DEVICE" ) ) || token->IsSameAs( wxT(
"SIM.TYPE" ) )
542 || token->IsSameAs( wxT(
"SIM.PINS" ) ) || token->IsSameAs( wxT(
"SIM.PARAMS" ) )
543 || token->IsSameAs( wxT(
"SIM.LIBRARY" ) ) || token->IsSameAs( wxT(
"SIM.NAME" ) ) )
545 *token = wxEmptyString;
549 if( token->IsSameAs( wxT(
"FOOTPRINT_LIBRARY" ) ) )
551 wxArrayString parts = wxSplit( footprint,
':' );
553 if( parts.Count() > 0 )
556 *token = wxEmptyString;
560 else if( token->IsSameAs( wxT(
"FOOTPRINT_NAME" ) ) )
562 wxArrayString parts = wxSplit( footprint,
':' );
564 if( parts.Count() > 1 )
565 *token = parts[std::min( 1, (
int) parts.size() - 1 )];
567 *token = wxEmptyString;
571 else if( token->IsSameAs( wxT(
"SYMBOL_LIBRARY" ) ) )
573 *token =
m_libId.GetUniStringLibNickname();
576 else if( token->IsSameAs( wxT(
"SYMBOL_NAME" ) ) )
578 *token =
m_libId.GetUniStringLibItemName();
581 else if( token->IsSameAs( wxT(
"SYMBOL_DESCRIPTION" ) ) )
586 else if( token->IsSameAs( wxT(
"SYMBOL_KEYWORDS" ) ) )
591 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOM" ) ) )
596 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOARD" ) ) )
601 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_SIM" ) ) )
606 else if( token->IsSameAs( wxT(
"DNP" ) ) )
608 *token = this->
GetDNP() ?
_(
"DNP" ) : wxString(
"" );
617 const VECTOR2I& aOffset,
bool aDimmed )
619 wxASSERT( aPlotter !=
nullptr );
634 color = color.
Mix( bg, 0.5f );
642 if( item.IsPrivate() )
650 if( aUnit && item.m_unit && ( item.m_unit != aUnit ) )
653 if( aBodyStyle && item.m_bodyStyle && ( item.m_bodyStyle != aBodyStyle ) )
656 item.Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed );
662 int aBodyStyle,
const VECTOR2I& aOffset,
bool aDimmed )
664 wxASSERT( aPlotter !=
nullptr );
676 color = color.
Mix( bg, 0.5f );
690 wxString tmp = field.
GetText();
693 item.Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed );
702 std::vector<SCH_SHAPE*> potential_top_items;
703 std::vector<SCH_ITEM*> bottom_items;
712 potential_top_items.push_back( &shape );
714 bottom_items.push_back( &item );
718 bottom_items.push_back( &item );
722 std::sort( potential_top_items.begin(), potential_top_items.end(),
725 return a->GetBoundingBox().GetArea() > b->GetBoundingBox().GetArea();
728 for(
SCH_SHAPE* item : potential_top_items )
730 for(
SCH_ITEM* bottom_item : bottom_items )
732 if( item->GetBoundingBox().Contains( bottom_item->GetBoundingBox() ) )
744 wxASSERT( aItem !=
nullptr );
750 if(
static_cast<SCH_FIELD*
>( aItem )->IsMandatory() )
756 for( LIB_ITEMS::iterator i = items.begin(); i != items.end(); i++ )
783 if( std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock() )
784 return parent->GetGraphicalPins( aUnit, aBodyStyle );
786 std::vector<SCH_PIN*> pins;
798 if( aUnit && item.m_unit && ( item.m_unit != aUnit ) )
802 if( aBodyStyle && item.m_bodyStyle && ( item.m_bodyStyle != aBodyStyle ) )
810 "GetGraphicalPins: lib='%s' unit=%d body=%d -> include pin name='%s' number='%s' shownNum='%s'",
812 pin->GetShownNumber() ) );
813 pins.push_back(
pin );
822 std::vector<UNIT_PIN_INFO> units;
829 VECTOR2I positionB = b->GetPosition();
831 if( positionA.
x != positionB.
x )
832 return positionA.
x < positionB.
x;
834 return positionA.
y < positionB.
y;
837 for(
int unitIdx = 1; unitIdx <= unitCount; ++unitIdx )
844 std::sort( pinList.begin(), pinList.end(), compareByPosition );
846 std::unordered_set<wxString> seenNumbers;
848 for(
SCH_PIN* basePin : pinList )
850 bool stackedValid =
false;
851 std::vector<wxString> expandedNumbers = basePin->GetStackedPinNumbers( &stackedValid );
853 if( stackedValid && !expandedNumbers.empty() )
855 for(
const wxString& number : expandedNumbers )
857 if( seenNumbers.insert( number ).second )
864 const wxString& number = basePin->GetNumber();
866 if( !number.IsEmpty() && seenNumbers.insert( number ).second )
870 units.push_back( std::move( unitInfo ) );
879 std::vector<LOGICAL_PIN> out;
884 std::vector<wxString> expanded =
pin->GetStackedPinNumbers( &valid );
886 if( valid && !expanded.empty() )
888 for(
const wxString& num : expanded )
892 wxString::Format(
"GetLogicalPins: base='%s' -> '%s'",
pin->GetShownNumber(), num ) );
899 wxString::Format(
"GetLogicalPins: base='%s' (no expansion)",
pin->GetShownNumber() ) );
913 int pinCount =
pin->GetStackedPinCount();
917 wxLogTrace(
"CVPCB_PINCOUNT",
"LIB_SYMBOL::GetPinCount total for lib='%s' => %d",
GetLibId().
Format().wx_str(),
928 if( aNumber ==
pin->GetNumber() )
937 bool aTestOrientation,
bool aTestLength )
const
942 bool foundMatch =
false;
946 wxASSERT( otherPin );
949 if(
pin->GetUnit() != otherPin->GetUnit() )
953 if(
pin->GetBodyStyle() != otherPin->GetBodyStyle() )
957 if(
pin->GetPosition() != otherPin->GetPosition() )
961 if( aTestNums && (
pin->GetNumber() != otherPin->GetNumber() ) )
965 if( aTestNames && (
pin->GetName() != otherPin->GetName() ) )
969 if( aTestType && (
pin->GetType() != otherPin->GetType() ) )
973 if( aTestOrientation && (
pin->GetOrientation() != otherPin->GetOrientation() ) )
977 if( aTestLength && (
pin->GetLength() != otherPin->GetLength() ) )
1004 bool aIgnoreLabelsOnInvisiblePins )
const
1008 if( std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock() )
1009 bBox = parent->GetUnitBoundingBox( aUnit, aBodyStyle, aIgnoreHiddenFields, aIgnoreLabelsOnInvisiblePins );
1013 if( item.m_unit > 0 &&
m_unitCount > 1 && aUnit > 0 && aUnit != item.m_unit )
1016 if( item.m_bodyStyle > 0 && aBodyStyle > 0 && aBodyStyle != item.m_bodyStyle )
1019 if( aIgnoreHiddenFields && item.Type() ==
SCH_FIELD_T )
1021 if( !
static_cast<const SCH_FIELD&
>( item ).IsVisible() )
1025 if( item.Type() ==
SCH_PIN_T && !aIgnoreLabelsOnInvisiblePins )
1028 bBox.
Merge(
pin.GetBoundingBox(
true,
true,
false ) );
1032 bBox.
Merge( item.GetBoundingBox() );
1041 bool aIncludePrivateItems )
const
1047 if( item.m_unit > 0 && aUnit > 0 && aUnit != item.m_unit )
1050 if( item.m_bodyStyle > 0 && aBodyStyle > 0 && aBodyStyle != item.m_bodyStyle )
1053 if( item.IsPrivate() && !aIncludePrivateItems )
1063 if(
pin.IsVisible() )
1069 bbox.
Merge(
pin.GetBoundingBox(
false,
false,
false ) );
1076 bbox.
Merge( item.GetBoundingBox() );
1100 for(
const SCH_FIELD& src : aFieldsList )
1125 aList.push_back(
const_cast<SCH_FIELD*
>( field ) );
1128 std::sort( aList.begin(), aList.end(),
1131 return lhs->GetOrdinal() < rhs->GetOrdinal();
1138 std::vector<SCH_FIELD*> orderedFields;
1143 aList.emplace_back( *field );
1152 ordinal = std::max( ordinal,
static_cast<const SCH_FIELD*
>( &item )->GetOrdinal() + 1 );
1164 if( field->
GetId() == aFieldType )
1178 if( field->
GetId() == aFieldType )
1192 if( field.
GetName() == aFieldName )
1206 if( field.
GetName() == aFieldName )
1231 wxASSERT( field !=
nullptr );
1239 wxASSERT( field !=
nullptr );
1247 wxASSERT( field !=
nullptr );
1255 wxASSERT( field !=
nullptr );
1263 wxASSERT( field !=
nullptr );
1272 refDesignator.Replace( wxS(
"~" ), wxS(
" " ) );
1274 wxString prefix = refDesignator;
1276 while( prefix.Length() )
1278 wxUniCharRef last = prefix.Last();
1280 if( ( last >=
'0' && last <=
'9' ) || last ==
'?' || last ==
'*' )
1281 prefix.RemoveLast();
1287 prefix.Trim(
true );
1288 prefix.Trim(
false );
1304 item.Move( aOffset );
1320 if( std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock() )
1321 return parent->HasLegacyAlternateBodyStyle();
1329 if( std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock() )
1330 return parent->GetMaxPinNumber();
1332 int maxPinNumber = 0;
1337 long currentPinNumber = 0;
1339 if(
pin->GetNumber().ToLong( ¤tPinNumber ) )
1340 maxPinNumber = std::max( maxPinNumber, (
int) currentPinNumber );
1343 return maxPinNumber;
1352 item.ClearTempFlags();
1361 item.ClearEditFlags();
1369 if( ( aUnit && item.m_unit && aUnit != item.m_unit )
1370 || ( aBodyStyle && item.m_bodyStyle && aBodyStyle != item.m_bodyStyle )
1376 if( item.HitTest( aPoint ) )
1409 if( item.IsType( aScanTypes ) )
1434 if( it->m_unit > aCount )
1441 else if( aDuplicateDrawItems )
1448 std::vector<SCH_ITEM*> tmp;
1452 if( item.m_unit != 1 )
1455 for(
int j = prevCount + 1; j <= aCount; j++ )
1459 tmp.push_back( newItem );
1474 if( std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock() )
1475 return parent->GetUnitCount();
1489 if( aDuplicateDrawItems || aDuplicatePins )
1491 std::vector<SCH_ITEM*> tmp;
1495 if( item.Type() !=
SCH_PIN_T && !aDuplicateDrawItems )
1498 if( item.m_bodyStyle == 1 )
1502 tmp.push_back( newItem );
1518 if( i->m_bodyStyle > 1 )
1531 std::vector<SCH_ITEM*> unitItems;
1538 if( ( aBodyStyle == -1 && item.GetUnit() == aUnit ) || ( aUnit == -1 && item.GetBodyStyle() == aBodyStyle )
1539 || ( aUnit == item.GetUnit() && aBodyStyle == item.GetBodyStyle() ) )
1541 unitItems.push_back( &item );
1551 std::vector<LIB_SYMBOL_UNIT> units;
1558 int unit = item.GetUnit();
1559 int bodyStyle = item.GetBodyStyle();
1561 auto it = std::find_if( units.begin(), units.end(),
1564 return a.m_unit == unit && a.m_bodyStyle == bodyStyle;
1567 if( it == units.end() )
1570 newUnit.
m_unit = item.GetUnit();
1572 newUnit.
m_items.push_back( &item );
1573 units.emplace_back( newUnit );
1577 it->m_items.push_back( &item );
1585#define REPORT( msg ) \
1588 aReporter->Report( msg ); \
1590#define ITEM_DESC( item ) ( item )->GetItemDescription( &unitsProvider, false )
1619 REPORT(
_(
"Power flag differs." ) );
1628 REPORT(
_(
"Unit count differs." ) );
1636 std::set<const SCH_ITEM*, SCH_ITEM::cmp_items> aShapes;
1637 std::set<const SCH_FIELD*> aFields;
1638 std::set<const SCH_PIN*> aPins;
1643 aShapes.insert( &( *it ) );
1645 aFields.insert(
static_cast<const SCH_FIELD*
>( &( *it ) ) );
1647 aPins.insert(
static_cast<const SCH_PIN*
>( &( *it ) ) );
1650 std::set<const SCH_ITEM*, SCH_ITEM::cmp_items> bShapes;
1651 std::set<const SCH_FIELD*> bFields;
1652 std::set<const SCH_PIN*> bPins;
1657 bShapes.insert( &( *it ) );
1659 bFields.insert(
static_cast<const SCH_FIELD*
>( &( *it ) ) );
1661 bPins.insert(
static_cast<const SCH_PIN*
>( &( *it ) ) );
1664 if(
int tmp =
static_cast<int>( aShapes.size() - bShapes.size() ) )
1667 REPORT(
_(
"Graphic item count differs." ) );
1674 for(
auto aIt = aShapes.begin(), bIt = bShapes.begin(); aIt != aShapes.end(); aIt++, bIt++ )
1676 if(
int tmp2 = ( *aIt )->compare( *( *bIt ), aCompareFlags ) )
1679 REPORT( wxString::Format(
_(
"Graphic item differs: %s; %s." ),
ITEM_DESC( *aIt ),
1688 for(
const SCH_PIN* aPin : aPins )
1690 const SCH_PIN* bPin = aRhs.
GetPin( aPin->GetNumber(), aPin->GetUnit(), aPin->GetBodyStyle() );
1695 REPORT( wxString::Format(
_(
"Extra pin in schematic symbol: %s." ),
ITEM_DESC( aPin ) ) );
1700 else if(
int tmp = aPin->SCH_ITEM::compare( *bPin, aCompareFlags ) )
1703 REPORT( wxString::Format(
_(
"Pin %s differs: %s; %s" ), aPin->GetNumber(),
ITEM_DESC( aPin ),
1711 for(
const SCH_PIN* bPin : bPins )
1713 const SCH_PIN* aPin = aRhs.
GetPin( bPin->GetNumber(), bPin->GetUnit(), bPin->GetBodyStyle() );
1718 REPORT( wxString::Format(
_(
"Missing pin in schematic symbol: %s." ),
ITEM_DESC( bPin ) ) );
1725 for(
const SCH_FIELD* aField : aFields )
1729 if( aField->IsMandatory() )
1730 bField = aRhs.
GetField( aField->GetId() );
1732 bField = aRhs.
GetField( aField->GetName() );
1737 REPORT( wxString::Format(
_(
"Extra field in schematic symbol: %s." ),
ITEM_DESC( aField ) ) );
1751 tmp = aField->GetText().compare( bField->
GetText() );
1757 tmp = aField->SCH_ITEM::compare( *bField, aCompareFlags );
1763 REPORT( wxString::Format(
_(
"Field '%s' differs: %s; %s." ), aField->GetName(
false ),
1772 for(
const SCH_FIELD* bField : bFields )
1776 if( bField->IsMandatory() )
1777 aField = aRhs.
GetField( bField->GetId() );
1779 aField = aRhs.
GetField( bField->GetName() );
1784 REPORT( wxString::Format(
_(
"Missing field in schematic symbol: %s." ),
ITEM_DESC( bField ) ) );
1794 REPORT(
_(
"Footprint filter count differs." ) );
1801 for(
size_t i = 0; i <
m_fpFilters.GetCount(); i++ )
1806 REPORT(
_(
"Footprint filters differ." ) );
1817 REPORT(
_(
"Symbol keywords differ." ) );
1826 REPORT(
_(
"Symbol pin name offsets differ." ) );
1837 REPORT(
_(
"Show pin names settings differ." ) );
1846 REPORT(
_(
"Show pin numbers settings differ." ) );
1855 REPORT(
_(
"Exclude from simulation settings differ." ) );
1864 REPORT(
_(
"Exclude from bill of materials settings differ." ) );
1873 REPORT(
_(
"Exclude from board settings differ." ) );
1909 return Compare( *tmp, aCompareFlags );
1918 double similarity = 0.0;
1927 double max_similarity = 0.0;
1931 double temp_similarity = item.Similarity( otherItem );
1932 max_similarity = std::max( max_similarity, temp_similarity );
1934 if( max_similarity == 1.0 )
1938 similarity += max_similarity;
1944 double max_similarity = 0.0;
1948 double temp_similarity =
pin->Similarity( *otherPin );
1949 max_similarity = std::max( max_similarity, temp_similarity );
1951 if( max_similarity == 1.0 )
1955 similarity += max_similarity;
1958 if( totalItems == 0 )
1961 similarity /= totalItems;
2010 std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock();
2014 aStack.push_back( parent->GetEmbeddedFiles() );
2015 parent = parent->GetParent().lock();
2024 std::set<KIFONT::OUTLINE_FONT*>
fonts;
2032 if(
auto* font =
text.GetFont(); font && !font->IsStroke() )
2037 if( permission == EMBEDDING_PERMISSION::EDITABLE || permission == EMBEDDING_PERMISSION::INSTALLABLE )
2039 fonts.insert( outline );
2065 if(
group.contains( aPinNumber ) )
2069 return std::nullopt;
2080 const wxString groupFields =
_HKI(
"Fields" );
2098 const wxString groupSymbolDef =
_HKI(
"Symbol Definition" );
2109 const wxString groupPinDisplay =
_HKI(
"Pin Display" );
2125 const wxString groupAttributes =
_HKI(
"Attributes" );
2139 const wxString groupUnits =
_HKI(
"Units and Body Styles" );
2149 auto multiBodyStyle = [=](
INSPECTABLE* aItem ) ->
bool
2152 return symbol->IsMultiBodyStyle();
2164 wxPGChoices choices;
2168 for(
int ii = 1; ii <= symbol->GetBodyStyleCount(); ii++ )
2169 choices.Add( symbol->GetBodyStyleDescription( ii,
false ) );
constexpr EDA_IU_SCALE schIUScale
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
static const COLOR4D WHITE
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
virtual void ClearEditFlags()
KICAD_T Type() const
Returns the type of object.
virtual void SetParent(EDA_ITEM *aParent)
virtual EDA_ITEM * Clone() const
Create a duplicate of this item with linked list members set to NULL.
EDA_ITEM_FLAGS GetFlags() const
virtual void ClearTempFlags()
FILL_T GetFillMode() const
virtual const wxString & GetText() const
Return the string associated with the text object.
virtual bool IsVisible() const
virtual void SetVisible(bool aVisible)
EMBEDDED_FILES & operator=(EMBEDDED_FILES &&other) noexcept
EMBEDDED_FILE * AddFile(const wxFileName &aName, bool aOverwrite)
Load a file from disk and adds it to the collection.
const std::map< wxString, EMBEDDED_FILE * > & EmbeddedFileMap() const
Class that other classes need to inherit from, in order to be inspectable.
Class OUTLINE_FONT implements outline font drawing.
EMBEDDING_PERMISSION GetEmbeddingPermission() const
A color representation with 4 components: red, green, blue, alpha.
std::optional< wxString > m_text
COLOR4D & Desaturate()
Removes color (in HSL model)
COLOR4D Mix(const COLOR4D &aColor, double aFactor) const
Return a color that is mixed with the input by a factor.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
Object used to load, save, search, and otherwise manipulate symbol library files.
Define a library symbol object.
LIB_ITEMS_CONTAINER m_drawings
bool ResolveTextVar(wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
SCH_FIELD & GetDescriptionField()
Return reference to the description field.
const LIB_ID & GetLibId() const override
const BOX2I GetUnitBoundingBox(int aUnit, int aBodyStyle, bool aIgnoreHiddenFields=true, bool aIgnoreLabelsOnInvisiblePins=true) const
Get the bounding box for the symbol.
wxString GetKeyWords() const override
std::weak_ptr< LIB_SYMBOL > & GetParent()
wxString GetBodyStyleProp() const override
LIBRENTRYOPTIONS m_options
Special symbol features such as POWER or NORMAL.
wxString GetRefProp() const
bool PinsConflictWith(const LIB_SYMBOL &aOtherSymbol, bool aTestNums, bool aTestNames, bool aTestType, bool aTestOrientation, bool aTestLength) const
Return true if this symbol's pins do not match another symbol's pins.
bool GetUnitsInterchangeableProp() const
void GetFields(std::vector< SCH_FIELD * > &aList, bool aVisibleOnly=false) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
bool IsPower() const override
wxString GetShownKeyWords(int aDepth=0) const override
SCH_FIELD & GetDatasheetField()
Return reference to the datasheet field.
std::weak_ptr< LIB_SYMBOL > m_parent
Use for inherited symbols.
std::vector< struct LIB_SYMBOL_UNIT > GetUnitDrawItems()
Return a list of SCH_ITEM objects separated by unit and convert number.
std::map< int, wxString > m_unitDisplayNames
std::vector< std::set< wxString > > m_jumperPinGroups
A list of jumper pin groups, each of which is a set of pin numbers that should be jumpered together (...
void ClearTempFlags() override
Clears the status flag all draw objects in this symbol.
void SetKeywordsProp(const wxString &aKeywords)
std::map< int, wxString > & GetUnitDisplayNames()
bool m_demorgan
True if there are two body styles: normal and De Morgan If false, the body style count is taken from ...
wxString GetFootprint() override
For items with footprint fields.
const wxString GetLibraryName() const
void SetFields(const std::vector< SCH_FIELD > &aFieldsList)
Overwrite all the existing fields in this symbol with fields supplied in aFieldsList.
std::vector< SEARCH_TERM > GetSearchTerms() override
void SetLib(LEGACY_SYMBOL_LIB *aLibrary)
bool GetPowerSymbolProp() const
bool IsMultiBodyStyle() const override
int GetMaxPinNumber() const
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.
SCH_FIELD & GetFootprintField()
Return reference to the footprint field.
int Compare(const LIB_SYMBOL &aRhs, int aCompareFlags=0, REPORTER *aReporter=nullptr) const
Comparison test that can be used for operators.
void FixupDrawItems()
This function finds the filled draw items that are covering up smaller draw items and replaces their ...
SCH_PIN * GetPin(const wxString &aNumber, int aUnit=0, int aBodyStyle=0) const
Return pin object with the requested pin aNumber.
bool IsNormal() const override
void SetUnitsInterchangeableProp(bool aInterchangeable)
std::set< KIFONT::OUTLINE_FONT * > GetFonts() const override
LEGACY_SYMBOL_LIB * m_library
SCH_FIELD * FindFieldCaseInsensitive(const wxString &aFieldName)
wxString m_keyWords
Search keywords.
SCH_ITEM * LocateDrawItem(int aUnit, int aBodyStyle, KICAD_T aType, const VECTOR2I &aPoint)
Locate a draw object.
static wxString LetterSubReference(int aUnit, wxChar aInitialLetter)
double Similarity(const SCH_ITEM &aSymbol) const override
Return a measure of similarity between this symbol and aSymbol.
static LIB_SYMBOL * GetDummy()
Returns a dummy LIB_SYMBOL, used when one is missing in the schematic.
void PlotFields(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed)
Plot symbol fields.
wxString GetDatasheetProp() const
std::shared_ptr< LIB_SYMBOL > GetRootSymbol() const
Get the parent symbol that does not have another parent.
void SetRefProp(const wxString &aRef)
void SetParent(LIB_SYMBOL *aParent=nullptr)
std::vector< UNIT_PIN_INFO > GetUnitPinInfo() const
Return pin-number lists for each unit, ordered consistently for gate swapping.
wxString GetName() const override
void SetUnitCount(int aCount, bool aDuplicateDrawItems)
Set the units per symbol count.
std::shared_ptr< LIB_SYMBOL > m_me
wxString GetValueProp() const
bool GetExcludedFromBOMProp() const
SCH_FIELD & GetValueField()
Return reference to the value field.
bool IsLocalPower() const override
LIB_SYMBOL(const wxString &aName, LIB_SYMBOL *aParent=nullptr, LEGACY_SYMBOL_LIB *aLibrary=nullptr)
void RemoveDrawItem(SCH_ITEM *aItem)
Remove draw aItem from list.
void GetChooserFields(std::map< wxString, wxString > &aColumnMap) override
Retrieves a key/value map of the fields on this item that should be exposed to the library browser/ch...
bool HasLegacyAlternateBodyStyle() const
Before V10 we didn't store the number of body styles in a symbol – we just looked through all its dra...
std::shared_ptr< LIB_SYMBOL > SharedPtr() const
http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/sp_techniques.html#weak_without_shared.
bool GetPinNamesInsideProp() const
const std::vector< wxString > & GetBodyStyleNames() const
void SetBodyStyleProp(const wxString &aBodyStyle) override
int compare(const SCH_ITEM &aOther, int aCompareFlags=SCH_ITEM::COMPARE_FLAGS::EQUALITY) const override
The library symbol specific sort order is as follows:
timestamp_t m_lastModDate
void SetExcludedFromSimProp(bool aExclude)
std::optional< const std::set< wxString > > GetJumperPinGroup(const wxString &aPinNumber) const
Retrieves the jumper group containing the specified pin number, if one exists.
std::vector< SCH_PIN * > GetPins() const override
void SetBodyStyleCount(int aCount, bool aDuplicateDrawItems, bool aDuplicatePins)
Set or clear the alternate body style (DeMorgan) for the symbol.
wxString GetLibNickname() const override
Sets the Description field text value.
void SetFootprintProp(const wxString &aFootprint)
std::vector< LOGICAL_PIN > GetLogicalPins(int aUnit, int aBodyStyle) const
Return all logical pins (expanded) filtered by unit/body.
bool HasDeMorganBodyStyles() const override
const LIB_SYMBOL & operator=(const LIB_SYMBOL &aSymbol)
bool m_unitsLocked
True if symbol has multiple units and changing one unit does not automatically change another unit.
wxArrayString m_fpFilters
List of suitable footprint names for the symbol (wild card names accepted).
void Move(const VECTOR2I &aOffset) override
Move the symbol aOffset.
void CopyFields(std::vector< SCH_FIELD > &aList)
Create a copy of the SCH_FIELDs, sorted in ordinal order.
void RunOnChildren(const std::function< void(SCH_ITEM *)> &aFunction, RECURSE_MODE aMode) override
std::vector< SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
bool GetExcludedFromSimProp() const
int GetBodyStyleCount() const override
void SetDatasheetProp(const wxString &aDatasheet)
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...
EMBEDDED_FILES * GetEmbeddedFiles() override
void SetPowerSymbolProp(bool aIsPower)
void SetExcludedFromBOMProp(bool aExclude)
int m_unitCount
Number of units (parts) per package.
wxString GetShownDescription(int aDepth=0) const override
bool IsGlobalPower() const override
wxString GetBodyStyleDescription(int aBodyStyle, bool aLabel) const override
unsigned GetInheritanceDepth() const
Get the number of parents for this symbol.
int GetUnitCount() const override
wxString GetKeywordsProp() const
std::vector< wxString > m_bodyStyleNames
void AppendParentEmbeddedFiles(std::vector< EMBEDDED_FILES * > &aStack) const
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
BOX2I GetBodyBoundingBox() const override
Return a bounding box for the symbol body but not the pins or fields.
void SetValueProp(const wxString &aValue)
int GetPinCount() override
void AddField(SCH_FIELD *aField)
Add a field.
void ClearEditFlags() override
bool GetLocalPowerSymbolProp() const
LIB_ID GetLIB_ID() const override
bool m_duplicatePinNumbersAreJumpers
Flag that this symbol should automatically treat sets of two or more pins with the same number as jum...
void SetUnitProp(int aUnits)
wxString GetFootprintProp() const
void SetPinNamesInsideProp(bool aInside)
void AddDrawItem(SCH_ITEM *aItem, bool aSort=true)
Add a new draw aItem to the draw object list and sort according to aSort.
wxString GetUnitDisplayName(int aUnit, bool aLabel) const override
Return the user-defined display name for aUnit for symbols with units.
void EmbedFonts() override
void SetLocalPowerSymbolProp(bool aIsLocalPower)
virtual void SetName(const wxString &aName)
SCH_FIELD & GetReferenceField()
Return reference to the reference designator field.
int GetNextFieldOrdinal() const
Return the next ordinal for a user field for this symbol.
static constexpr int FIRST_TYPE
ITERATOR_BASE< SCH_ITEM, MULTIVECTOR< SCH_ITEM, FIRST_TYPE_VAL, LAST_TYPE_VAL >, typename ITEM_PTR_VECTOR::iterator > ITERATOR
ITERATOR end(int aType=UNDEFINED_TYPE)
static constexpr int LAST_TYPE
ITERATOR begin(int aType=UNDEFINED_TYPE)
Base plotter engine class.
bool GetColorMode() const
virtual void SetColor(const COLOR4D &color)=0
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.
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.
A pure virtual class used to derive REPORTER objects from.
wxString GetFullText(int unit=1) const
Return the text of a field.
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
bool ShowInChooser() const
void SetText(const wxString &aText) override
SCH_RENDER_SETTINGS * getRenderSettings(PLOTTER *aPlotter) const
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
wxString ResolveText(const wxString &aText, const SCH_SHEET_PATH *aPath, int aDepth=0) const
VECTOR2I GetPosition() const override
const KIGFX::COLOR4D & GetBackgroundColor() const override
Return current background color settings.
A base class for LIB_SYMBOL and SCH_SYMBOL.
void SetExcludedFromBoard(bool aExcludeFromBoard) override
Set or clear exclude from board netlist flag.
virtual bool GetDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
Set or clear the 'Do Not Populate' flag.
virtual void SetShowPinNumbers(bool aShow)
Set or clear the pin number visibility flag.
int GetPinNameOffset() const
virtual void SetShowPinNames(bool aShow)
Set or clear the pin name visibility flag.
bool GetExcludedFromBoard() const override
virtual bool GetExcludedFromBOM(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
virtual bool GetShowPinNames() const
void SetPinNameOffset(int aOffset)
Set the offset in mils of the pin name text from the pin symbol.
virtual bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
SYMBOL & operator=(const SYMBOL &aItem)
virtual bool GetShowPinNumbers() const
int m_pinNameOffset
The offset in mils to draw the pin name.
wxString ResolveTextVars(const wxString &aSource, const std::function< bool(wxString *)> *aResolver, int &aDepth)
Multi-pass text variable expansion and math expression evaluation.
#define DEFAULT_PIN_NAME_OFFSET
The intersheets references prefix string.
const INSPECTOR_FUNC & INSPECTOR
std::function passed to nested users by ref, avoids copying std::function.
#define IGNORE_PARENT_GROUP
#define IS_NEW
New item, just created.
#define STRUCT_DELETED
flag indication structures to be erased
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
@ FILLED_WITH_BG_BODYCOLOR
TRANSFORM DefaultTransform
const wxChar *const traceStackedPins
Flag to enable debug output for stacked pins handling in symbol/pin code.
static struct LIB_SYMBOL_DESC _LIB_SYMBOL_DESC
bool operator<(const LIB_SYMBOL &aItem1, const LIB_SYMBOL &aItem2)
LIB_ITEMS_CONTAINER::ITEM_PTR_VECTOR LIB_ITEMS
@ PT_SIZE
Size expressed in distance units (mm/inch)
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Logical pins: Return expanded logical pins based on stacked-pin notation.
std::vector< wxString > m_pinNumbers
int m_bodyStyle
The alternate body style of the unit.
std::vector< SCH_ITEM * > m_items
The items unique to this unit and alternate body style.
int m_unit
The unit number.
A structure for storing weighted search terms.
http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/sp_techniques.html#weak_without_shared
void operator()(void const *) const
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
@ 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".
wxLogTrace helper definitions.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
VECTOR2< int32_t > VECTOR2I