45#include <unordered_set>
57 const char* aCallerName )
59 std::set<const LIB_SYMBOL*> visited;
60 visited.insert( aSymbol );
62 std::shared_ptr<LIB_SYMBOL> current = aSymbol->
SharedPtr();
63 std::shared_ptr<LIB_SYMBOL> parent = aSymbol->
GetParent().lock();
67 if( visited.count( parent.get() ) )
75 chain += wxT(
" -> " ) + sym->GetName();
78 chain += wxT(
" -> " ) + parent->GetName() + wxT(
" (CYCLE)" );
81 wxT(
"%s: Circular inheritance detected in symbol '%s' (lib: %s). "
83 aCallerName, aSymbol->
GetName(),
90 visited.insert( parent.get() );
92 parent = parent->GetParent().lock();
107 if( root.get() !=
this )
108 shownText = root->GetDescriptionField().GetShownText(
false, aDepth );
119 std::function<bool( wxString* )> libSymbolResolver = [&]( wxString* token ) ->
bool
132 std::vector<SEARCH_TERM> terms;
138 wxStringTokenizer keywordTokenizer(
GetShownKeyWords(),
" \t\r\n", wxTOKEN_STRTOK );
140 while( keywordTokenizer.HasMoreTokens() )
141 terms.emplace_back(
SEARCH_TERM( keywordTokenizer.GetNextToken(), 4 ) );
149 if( !footprint.IsEmpty() )
163 aColumnMap[field->
GetName()] = field->EDA_TEXT::GetShownText(
false );
193 auto addField = [&](
FIELD_T id,
bool visible )
251 wxFAIL_MSG(
"Failed to clone SCH_ITEM." );
262 if( &aSymbol ==
this )
338 std::set<const LIB_SYMBOL*> visited;
339 visited.insert(
this );
341 std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock();
346 if( visited.count( parent.get() ) )
349 wxT(
"GetInheritanceDepth: Circular inheritance detected in symbol '%s' "
355 visited.insert( parent.get() );
357 parent = parent->m_parent.lock();
366 std::set<const LIB_SYMBOL*> visited;
367 visited.insert(
this );
369 std::shared_ptr<LIB_SYMBOL> current =
m_me;
370 std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock();
375 if( visited.count( parent.get() ) )
378 wxT(
"GetRootSymbol: Circular inheritance detected in symbol '%s' "
384 visited.insert( parent.get() );
386 parent = parent->m_parent.lock();
409 return aLabel ?
_(
"Alternate" ) : wxString(
_HKI(
"Alternate" ) );
411 return aLabel ?
_(
"Standard" ) : wxString(
_HKI(
"Standard" ) );
426 m_libId.SetLibItemName( aName );
435 std::set<const LIB_SYMBOL*> visited;
436 visited.insert(
this );
438 std::shared_ptr<LIB_SYMBOL> ancestor = aParent->
SharedPtr();
442 if( visited.count( ancestor.get() ) )
445 wxT(
"SetParent: Rejecting parent '%s' for symbol '%s' - would create "
446 "circular inheritance (lib: %s)" ),
453 visited.insert( ancestor.get() );
454 ancestor = ancestor->m_parent.lock();
468 std::unique_ptr<LIB_SYMBOL> retv;
473 std::vector<const LIB_SYMBOL*> parentChain;
474 std::set<const LIB_SYMBOL*> visited;
475 visited.insert(
this );
477 std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock();
479 wxCHECK_MSG( parent, retv, wxString::Format(
"Parent of derived symbol '%s' undefined",
m_name ) );
484 if( visited.count( parent.get() ) )
487 wxT(
"Flatten: Circular inheritance detected in symbol '%s' (lib: %s)" ),
492 visited.insert( parent.get() );
493 parentChain.push_back( parent.get() );
494 parent = parent->m_parent.lock();
498 if( !parentChain.empty() )
500 retv = std::make_unique<LIB_SYMBOL>( *parentChain.back() );
503 for(
int i =
static_cast<int>( parentChain.size() ) - 2; i >= 0; --i )
511 *retv->GetField( fieldId ) = *derived->
GetField( fieldId );
529 retv->AddDrawItem( newField );
533 retv->RemoveDrawItem( parentField );
534 retv->AddDrawItem( newField );
548 retv = std::make_unique<LIB_SYMBOL>( *
this );
549 retv->m_parent.reset();
561 *retv->GetField( fieldId ) = *
GetField( fieldId );
580 retv->AddDrawItem( newField );
584 retv->RemoveDrawItem( parentField );
585 retv->AddDrawItem( newField );
599 retv->AddFile( newFile );
603 if( !parentChain.empty() )
605 retv->SetExcludedFromSim( parentChain.front()->GetExcludedFromSim() );
606 retv->SetExcludedFromBOM( parentChain.front()->GetExcludedFromBOM() );
607 retv->SetExcludedFromBoard( parentChain.front()->GetExcludedFromBoard() );
610 retv->m_parent.reset();
614 retv = std::make_unique<LIB_SYMBOL>( *
this );
626 return m_libId.GetLibNickname();
636 if( root.get() !=
this )
637 return root->IsLocalPower();
650 if( root.get() !=
this )
652 root->SetLocalPower();
667 if( root.get() !=
this )
668 return root->IsGlobalPower();
687 if( root.get() !=
this )
689 root->SetGlobalPower();
704 if( root.get() !=
this )
705 return root->IsNormal();
718 if( root.get() !=
this )
739 u = ( aUnit - 1 ) % 26;
740 suffix = wxChar( aInitialLetter + u ) + suffix;
741 aUnit = ( aUnit - u ) / 26;
742 }
while( aUnit > 0 );
759 footprint = field.
GetShownText(
nullptr,
false, aDepth + 1 );
763 *token = field.
GetShownText(
nullptr,
false, aDepth + 1 );
770 if( token->IsSameAs( wxT(
"SIM.DEVICE" ) ) || token->IsSameAs( wxT(
"SIM.TYPE" ) )
771 || token->IsSameAs( wxT(
"SIM.PINS" ) ) || token->IsSameAs( wxT(
"SIM.PARAMS" ) )
772 || token->IsSameAs( wxT(
"SIM.LIBRARY" ) ) || token->IsSameAs( wxT(
"SIM.NAME" ) ) )
774 *token = wxEmptyString;
778 if( token->IsSameAs( wxT(
"FOOTPRINT_LIBRARY" ) ) )
780 wxArrayString parts = wxSplit( footprint,
':' );
782 if( parts.Count() > 0 )
785 *token = wxEmptyString;
789 else if( token->IsSameAs( wxT(
"FOOTPRINT_NAME" ) ) )
791 wxArrayString parts = wxSplit( footprint,
':' );
793 if( parts.Count() > 1 )
794 *token = parts[std::min( 1, (
int) parts.size() - 1 )];
796 *token = wxEmptyString;
800 else if( token->IsSameAs( wxT(
"SYMBOL_LIBRARY" ) ) )
802 *token =
m_libId.GetUniStringLibNickname();
805 else if( token->IsSameAs( wxT(
"SYMBOL_NAME" ) ) )
807 *token =
m_libId.GetUniStringLibItemName();
810 else if( token->IsSameAs( wxT(
"SYMBOL_DESCRIPTION" ) ) )
815 else if( token->IsSameAs( wxT(
"SYMBOL_KEYWORDS" ) ) )
820 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOM" ) ) )
825 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_BOARD" ) ) )
830 else if( token->IsSameAs( wxT(
"EXCLUDE_FROM_SIM" ) ) )
835 else if( token->IsSameAs( wxT(
"DNP" ) ) )
837 *token = this->
GetDNP() ?
_(
"DNP" ) : wxString(
"" );
846 const VECTOR2I& aOffset,
bool aDimmed )
848 wxASSERT( aPlotter !=
nullptr );
863 color = color.
Mix( bg, 0.5f );
871 if( item.IsPrivate() )
879 if( aUnit && item.m_unit && ( item.m_unit != aUnit ) )
882 if( aBodyStyle && item.m_bodyStyle && ( item.m_bodyStyle != aBodyStyle ) )
885 item.Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed );
891 int aBodyStyle,
const VECTOR2I& aOffset,
bool aDimmed )
893 wxASSERT( aPlotter !=
nullptr );
905 color = color.
Mix( bg, 0.5f );
919 wxString tmp = field.
GetText();
922 item.Plot( aPlotter, aBackground, aPlotOpts, aUnit, aBodyStyle, aOffset, aDimmed );
931 std::vector<SCH_SHAPE*> potential_top_items;
932 std::vector<SCH_ITEM*> bottom_items;
941 potential_top_items.push_back( &shape );
943 bottom_items.push_back( &item );
947 bottom_items.push_back( &item );
951 std::sort( potential_top_items.begin(), potential_top_items.end(),
954 return a->GetBoundingBox().GetArea() > b->GetBoundingBox().GetArea();
957 for(
SCH_SHAPE* item : potential_top_items )
959 for(
SCH_ITEM* bottom_item : bottom_items )
961 if( item->GetBoundingBox().Contains( bottom_item->GetBoundingBox() ) )
973 wxASSERT( aItem !=
nullptr );
979 if(
static_cast<SCH_FIELD*
>( aItem )->IsMandatory() )
985 for( LIB_ITEMS::iterator i = items.begin(); i != items.end(); i++ )
1016 if( root.get() !=
this )
1017 return root->GetGraphicalPins( aUnit, aBodyStyle );
1020 std::vector<SCH_PIN*> pins;
1032 if( aUnit && item.m_unit && ( item.m_unit != aUnit ) )
1036 if( aBodyStyle && item.m_bodyStyle && ( item.m_bodyStyle != aBodyStyle ) )
1044 "GetGraphicalPins: lib='%s' unit=%d body=%d -> include pin name='%s' number='%s' shownNum='%s'",
1046 pin->GetShownNumber() ) );
1047 pins.push_back(
pin );
1056 std::vector<UNIT_PIN_INFO> units;
1063 VECTOR2I positionB = b->GetPosition();
1065 if( positionA.
x != positionB.
x )
1066 return positionA.
x < positionB.
x;
1068 return positionA.
y < positionB.
y;
1071 for(
int unitIdx = 1; unitIdx <= unitCount; ++unitIdx )
1078 std::sort( pinList.begin(), pinList.end(), compareByPosition );
1080 std::unordered_set<wxString> seenNumbers;
1082 for(
SCH_PIN* basePin : pinList )
1084 bool stackedValid =
false;
1085 std::vector<wxString> expandedNumbers = basePin->GetStackedPinNumbers( &stackedValid );
1087 if( stackedValid && !expandedNumbers.empty() )
1089 for(
const wxString& number : expandedNumbers )
1091 if( seenNumbers.insert( number ).second )
1098 const wxString& number = basePin->GetNumber();
1100 if( !number.IsEmpty() && seenNumbers.insert( number ).second )
1104 units.push_back( std::move( unitInfo ) );
1113 std::vector<LOGICAL_PIN> out;
1118 std::vector<wxString> expanded =
pin->GetStackedPinNumbers( &valid );
1120 if( valid && !expanded.empty() )
1122 for(
const wxString& num : expanded )
1126 wxString::Format(
"GetLogicalPins: base='%s' -> '%s'",
pin->GetShownNumber(), num ) );
1133 wxString::Format(
"GetLogicalPins: base='%s' (no expansion)",
pin->GetShownNumber() ) );
1147 int pinCount =
pin->GetStackedPinCount();
1151 wxLogTrace(
"CVPCB_PINCOUNT",
"LIB_SYMBOL::GetPinCount total for lib='%s' => %d",
GetLibId().
Format().wx_str(),
1162 if( aNumber ==
pin->GetNumber() )
1171 bool aTestOrientation,
bool aTestLength )
const
1176 bool foundMatch =
false;
1180 wxASSERT( otherPin );
1183 if(
pin->GetUnit() != otherPin->GetUnit() )
1187 if(
pin->GetBodyStyle() != otherPin->GetBodyStyle() )
1191 if(
pin->GetPosition() != otherPin->GetPosition() )
1195 if( aTestNums && (
pin->GetNumber() != otherPin->GetNumber() ) )
1199 if( aTestNames && (
pin->GetName() != otherPin->GetName() ) )
1203 if( aTestType && (
pin->GetType() != otherPin->GetType() ) )
1207 if( aTestOrientation && (
pin->GetOrientation() != otherPin->GetOrientation() ) )
1211 if( aTestLength && (
pin->GetLength() != otherPin->GetLength() ) )
1238 bool aIgnoreLabelsOnInvisiblePins )
const
1246 if( root.get() !=
this )
1247 bBox = root->GetUnitBoundingBox( aUnit, aBodyStyle, aIgnoreHiddenFields, aIgnoreLabelsOnInvisiblePins );
1252 if( item.m_unit > 0 &&
m_unitCount > 1 && aUnit > 0 && aUnit != item.m_unit )
1255 if( item.m_bodyStyle > 0 && aBodyStyle > 0 && aBodyStyle != item.m_bodyStyle )
1258 if( aIgnoreHiddenFields && item.Type() ==
SCH_FIELD_T )
1260 if( !
static_cast<const SCH_FIELD&
>( item ).IsVisible() )
1264 if( item.Type() ==
SCH_PIN_T && !aIgnoreLabelsOnInvisiblePins )
1267 bBox.
Merge(
pin.GetBoundingBox(
true,
true,
false ) );
1271 bBox.
Merge( item.GetBoundingBox() );
1280 bool aIncludePrivateItems )
const
1286 if( item.m_unit > 0 && aUnit > 0 && aUnit != item.m_unit )
1289 if( item.m_bodyStyle > 0 && aBodyStyle > 0 && aBodyStyle != item.m_bodyStyle )
1292 if( item.IsPrivate() && !aIncludePrivateItems )
1302 if(
pin.IsVisible() )
1308 bbox.
Merge(
pin.GetBoundingBox(
false,
false,
false ) );
1315 bbox.
Merge( item.GetBoundingBox() );
1339 for(
const SCH_FIELD& src : aFieldsList )
1364 aList.push_back(
const_cast<SCH_FIELD*
>( field ) );
1367 std::sort( aList.begin(), aList.end(),
1370 return lhs->GetOrdinal() < rhs->GetOrdinal();
1377 std::vector<SCH_FIELD*> orderedFields;
1382 aList.emplace_back( *field );
1391 ordinal = std::max( ordinal,
static_cast<const SCH_FIELD*
>( &item )->GetOrdinal() + 1 );
1403 if( field->
GetId() == aFieldType )
1417 if( field->
GetId() == aFieldType )
1431 if( field.
GetName() == aFieldName )
1445 if( field.
GetName() == aFieldName )
1470 wxASSERT( field !=
nullptr );
1478 wxASSERT( field !=
nullptr );
1486 wxASSERT( field !=
nullptr );
1494 wxASSERT( field !=
nullptr );
1502 wxASSERT( field !=
nullptr );
1511 refDesignator.Replace( wxS(
"~" ), wxS(
" " ) );
1513 wxString prefix = refDesignator;
1515 while( prefix.Length() )
1517 wxUniCharRef last = prefix.Last();
1519 if( ( last >=
'0' && last <=
'9' ) || last ==
'?' || last ==
'*' )
1520 prefix.RemoveLast();
1526 prefix.Trim(
true );
1527 prefix.Trim(
false );
1543 item.Move( aOffset );
1563 if( root.get() !=
this )
1564 return root->HasLegacyAlternateBodyStyle();
1577 if( root.get() !=
this )
1578 return root->GetMaxPinNumber();
1581 int maxPinNumber = 0;
1586 long currentPinNumber = 0;
1588 if(
pin->GetNumber().ToLong( ¤tPinNumber ) )
1589 maxPinNumber = std::max( maxPinNumber, (
int) currentPinNumber );
1592 return maxPinNumber;
1601 item.ClearTempFlags();
1610 item.ClearEditFlags();
1618 if( ( aUnit && item.m_unit && aUnit != item.m_unit )
1619 || ( aBodyStyle && item.m_bodyStyle && aBodyStyle != item.m_bodyStyle )
1625 if( item.HitTest( aPoint ) )
1658 if( item.IsType( aScanTypes ) )
1683 if( it->m_unit > aCount )
1690 else if( aDuplicateDrawItems )
1697 std::vector<SCH_ITEM*> tmp;
1701 if( item.m_unit != 1 )
1704 for(
int j = prevCount + 1; j <= aCount; j++ )
1708 tmp.push_back( newItem );
1727 if( root.get() !=
this )
1728 return root->GetUnitCount();
1743 if( aDuplicateDrawItems || aDuplicatePins )
1745 std::vector<SCH_ITEM*> tmp;
1749 if( item.Type() !=
SCH_PIN_T && !aDuplicateDrawItems )
1752 if( item.m_bodyStyle == 1 )
1756 tmp.push_back( newItem );
1772 if( i->m_bodyStyle > 1 )
1785 std::vector<SCH_ITEM*> unitItems;
1792 if( ( aBodyStyle == -1 && item.GetUnit() == aUnit ) || ( aUnit == -1 && item.GetBodyStyle() == aBodyStyle )
1793 || ( aUnit == item.GetUnit() && aBodyStyle == item.GetBodyStyle() ) )
1795 unitItems.push_back( &item );
1805 std::vector<LIB_SYMBOL_UNIT> units;
1812 int unit = item.GetUnit();
1813 int bodyStyle = item.GetBodyStyle();
1815 auto it = std::find_if( units.begin(), units.end(),
1818 return a.m_unit == unit && a.m_bodyStyle == bodyStyle;
1821 if( it == units.end() )
1824 newUnit.
m_unit = item.GetUnit();
1826 newUnit.
m_items.push_back( &item );
1827 units.emplace_back( newUnit );
1831 it->m_items.push_back( &item );
1839#define REPORT( msg ) \
1842 aReporter->Report( msg ); \
1844#define ITEM_DESC( item ) ( item )->GetItemDescription( &unitsProvider, false )
1873 REPORT(
_(
"Power flag differs." ) );
1882 REPORT(
_(
"Unit count differs." ) );
1890 std::set<const SCH_ITEM*, SCH_ITEM::cmp_items> aShapes;
1891 std::set<const SCH_FIELD*> aFields;
1892 std::set<const SCH_PIN*> aPins;
1897 aShapes.insert( &( *it ) );
1899 aFields.insert(
static_cast<const SCH_FIELD*
>( &( *it ) ) );
1901 aPins.insert(
static_cast<const SCH_PIN*
>( &( *it ) ) );
1904 std::set<const SCH_ITEM*, SCH_ITEM::cmp_items> bShapes;
1905 std::set<const SCH_FIELD*> bFields;
1906 std::set<const SCH_PIN*> bPins;
1911 bShapes.insert( &( *it ) );
1913 bFields.insert(
static_cast<const SCH_FIELD*
>( &( *it ) ) );
1915 bPins.insert(
static_cast<const SCH_PIN*
>( &( *it ) ) );
1918 if(
int tmp =
static_cast<int>( aShapes.size() - bShapes.size() ) )
1921 REPORT(
_(
"Graphic item count differs." ) );
1928 for(
auto aIt = aShapes.begin(), bIt = bShapes.begin(); aIt != aShapes.end(); aIt++, bIt++ )
1930 if(
int tmp2 = ( *aIt )->compare( *( *bIt ), aCompareFlags ) )
1933 REPORT( wxString::Format(
_(
"Graphic item differs: %s; %s." ),
ITEM_DESC( *aIt ),
1942 for(
const SCH_PIN* aPin : aPins )
1944 const SCH_PIN* bPin = aRhs.
GetPin( aPin->GetNumber(), aPin->GetUnit(), aPin->GetBodyStyle() );
1949 REPORT( wxString::Format(
_(
"Extra pin in schematic symbol: %s." ),
ITEM_DESC( aPin ) ) );
1954 else if(
int tmp = aPin->SCH_ITEM::compare( *bPin, aCompareFlags ) )
1957 REPORT( wxString::Format(
_(
"Pin %s differs: %s; %s" ), aPin->GetNumber(),
ITEM_DESC( aPin ),
1965 for(
const SCH_PIN* bPin : bPins )
1967 const SCH_PIN* aPin = aRhs.
GetPin( bPin->GetNumber(), bPin->GetUnit(), bPin->GetBodyStyle() );
1972 REPORT( wxString::Format(
_(
"Missing pin in schematic symbol: %s." ),
ITEM_DESC( bPin ) ) );
1979 for(
const SCH_FIELD* aField : aFields )
1983 if( aField->IsMandatory() )
1984 bField = aRhs.
GetField( aField->GetId() );
1986 bField = aRhs.
GetField( aField->GetName() );
1991 REPORT( wxString::Format(
_(
"Extra field in schematic symbol: %s." ),
ITEM_DESC( aField ) ) );
2005 tmp = aField->GetText().compare( bField->
GetText() );
2011 tmp = aField->SCH_ITEM::compare( *bField, aCompareFlags );
2017 REPORT( wxString::Format(
_(
"Field '%s' differs: %s; %s." ), aField->GetName(
false ),
2026 for(
const SCH_FIELD* bField : bFields )
2030 if( bField->IsMandatory() )
2031 aField = aRhs.
GetField( bField->GetId() );
2033 aField = aRhs.
GetField( bField->GetName() );
2038 REPORT( wxString::Format(
_(
"Missing field in schematic symbol: %s." ),
ITEM_DESC( bField ) ) );
2048 REPORT(
_(
"Footprint filter count differs." ) );
2055 for(
size_t i = 0; i <
m_fpFilters.GetCount(); i++ )
2060 REPORT(
_(
"Footprint filters differ." ) );
2071 REPORT(
_(
"Symbol keywords differ." ) );
2080 REPORT(
_(
"Symbol pin name offsets differ." ) );
2091 REPORT(
_(
"Show pin names settings differ." ) );
2100 REPORT(
_(
"Show pin numbers settings differ." ) );
2109 REPORT(
_(
"Exclude from simulation settings differ." ) );
2118 REPORT(
_(
"Exclude from bill of materials settings differ." ) );
2127 REPORT(
_(
"Exclude from board settings differ." ) );
2136 REPORT(
_(
"Exclude from position files settings differ." ) );
2172 return Compare( *tmp, aCompareFlags );
2181 double similarity = 0.0;
2190 double max_similarity = 0.0;
2194 double temp_similarity = item.Similarity( otherItem );
2195 max_similarity = std::max( max_similarity, temp_similarity );
2197 if( max_similarity == 1.0 )
2201 similarity += max_similarity;
2207 double max_similarity = 0.0;
2211 double temp_similarity =
pin->Similarity( *otherPin );
2212 max_similarity = std::max( max_similarity, temp_similarity );
2214 if( max_similarity == 1.0 )
2218 similarity += max_similarity;
2221 if( totalItems == 0 )
2224 similarity /= totalItems;
2276 std::set<const LIB_SYMBOL*> visited;
2277 visited.insert(
this );
2279 std::shared_ptr<LIB_SYMBOL> parent =
m_parent.lock();
2284 if( visited.count( parent.get() ) )
2287 wxT(
"AppendParentEmbeddedFiles: Circular inheritance detected in "
2288 "symbol '%s' (lib: %s)" ),
2293 visited.insert( parent.get() );
2294 aStack.push_back( parent->GetEmbeddedFiles() );
2295 parent = parent->GetParent().lock();
2304 std::set<KIFONT::OUTLINE_FONT*>
fonts;
2312 if(
auto* font =
text.GetFont(); font && !font->IsStroke() )
2317 if( permission == EMBEDDING_PERMISSION::EDITABLE || permission == EMBEDDING_PERMISSION::INSTALLABLE )
2319 fonts.insert( outline );
2345 if(
group.contains( aPinNumber ) )
2349 return std::nullopt;
2360 const wxString groupFields =
_HKI(
"Fields" );
2378 const wxString groupSymbolDef =
_HKI(
"Symbol Definition" );
2389 const wxString groupPinDisplay =
_HKI(
"Pin Display" );
2405 const wxString groupAttributes =
_HKI(
"Attributes" );
2424 const wxString groupUnits =
_HKI(
"Units and Body Styles" );
2434 auto multiBodyStyle = [=](
INSPECTABLE* aItem ) ->
bool
2437 return symbol->IsMultiBodyStyle();
2449 wxPGChoices choices;
2453 for(
int ii = 1; ii <= symbol->GetBodyStyleCount(); ii++ )
2454 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 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.
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
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.
void SetExcludedFromBoardProp(bool aExclude)
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.
void SetExcludedFromPosFilesProp(bool aExclude)
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
bool GetExcludedFromPosFilesProp() const
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)
bool GetExcludedFromBoardProp() const
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.
virtual const wxString & GetText() const override
Return the string associated with the text object.
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
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).
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.
bool m_excludedFromPosFiles
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.
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.
bool GetExcludedFromBoard(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
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 traceSymbolInheritance
Flag to enable tracing of circular symbol inheritance detection.
const wxChar *const traceStackedPins
Flag to enable debug output for stacked pins handling in symbol/pin code.
static std::shared_ptr< LIB_SYMBOL > GetSafeRootSymbol(const LIB_SYMBOL *aSymbol, const char *aCallerName)
Helper to safely get the root symbol, detecting and logging circular inheritance.
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".
const SHAPE_LINE_CHAIN chain
wxLogTrace helper definitions.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
VECTOR2< int32_t > VECTOR2I