27#include <boost/property_tree/ptree.hpp>
50#include <fmt/ranges.h>
55 bool aProcessFootprints,
bool aProcessValues,
56 bool aProcessReferences,
bool aProcessNetNames,
57 bool aProcessAttributes,
bool aProcessOtherFields,
58 bool aPreferUnitSwaps,
bool aPreferPinSwaps,
bool aDryRun ) :
88 m_reporter.ReportTail(
_(
"Select at least one property to back annotate." ),
113 "in stand-alone mode.\n"
114 "You must launch the KiCad project manager and create "
123 wxFileName fn(
m_frame->Prj().GetProjectFullName() );
124 fn.SetExt( FILEEXT::PcbFileExtension );
137 std::string nullPayload;
145 auto getStr = [](
const PTREE& pt ) -> wxString
147 return UTF8( pt.front().first );
157 Scan( &doc, &lexer );
159 PTREE& tree = doc.get_child(
"pcb_netlist" );
163 for(
const std::pair<const std::string, PTREE>& item : tree )
165 wxString
path, value, footprint;
166 bool dnp =
false, exBOM =
false;
167 std::map<wxString, wxString> pinNetMap, fieldsMap;
168 wxASSERT( item.first ==
"ref" );
169 wxString ref = getStr( item.second );
176 path = getStr( item.second.get_child(
"timestamp" ) );
180 msg.Printf(
_(
"Footprint '%s' has no assigned symbol." ), ref );
185 footprint = getStr( item.second.get_child(
"fpid" ) );
186 value = getStr( item.second.get_child(
"value" ) );
189 boost::optional<const PTREE&> fields = item.second.get_child_optional(
"fields" );
194 for(
const std::pair<const std::string, PTREE>& field : fields.get() )
196 if( field.first !=
"field" )
200 const auto& fieldName = field.second.get_child_optional(
"name" );
201 const std::string& fieldValue = field.second.back().first;
206 fieldsMap[getStr( fieldName.get() )] = wxString::FromUTF8( fieldValue );
212 for(
const auto& child : item.second )
214 if( child.first !=
"property" )
217 auto property = child.second;
218 auto name =
property.get_child_optional(
"name" );
223 if(
name.get().front().first ==
"dnp" )
227 else if(
name.get().front().first ==
"exclude_from_bom" )
233 boost::optional<const PTREE&> nets = item.second.get_child_optional(
"nets" );
237 for(
const std::pair<const std::string, PTREE>& pin_net : nets.get() )
239 wxASSERT( pin_net.first ==
"pin_net" );
240 wxString pinNumber =
UTF8( pin_net.second.front().first );
241 wxString netName =
UTF8( pin_net.second.back().first );
242 pinNetMap[ pinNumber ] = netName;
248 wxLogWarning(
"Cannot parse PCB netlist for back-annotation." );
257 msg.Printf(
_(
"Footprints '%s' and '%s' linked to same symbol." ),
258 nearestItem->second->m_ref,
265 auto data = std::make_shared<PCB_FP_DATA>( ref, footprint, value, dnp, exBOM,
266 pinNetMap, fieldsMap );
275 for( std::pair<
const wxString, std::shared_ptr<PCB_FP_DATA>>& fpData :
m_pcbFootprints )
277 const wxString& pcbPath = fpData.first;
278 auto& pcbData = fpData.second;
280 bool foundInMultiunit =
false;
282 for( std::pair<const wxString, SCH_REFERENCE_LIST>& item :
m_multiUnitsRefs )
287 refIndex = refList.
FindRef( pcbPath );
295 foundInMultiunit =
true;
297 for(
size_t i = 0; i < refList.
GetCount(); ++i )
299 refList[ i ].GetSymbol()->ClearFlags(
SKIP_STRUCT );
307 if( foundInMultiunit )
311 refIndex =
m_refs.FindRef( pcbPath );
313 refIndex =
m_refs.FindRefByFullPath( pcbPath );
323 wxString msg = wxString::Format(
_(
"Cannot find symbol for footprint '%s'." ),
337 return SCH_REFERENCE_LIST::sortByTimeStamp( a.first, b.first );
346 while( i <
m_refs.GetCount() &&
m_refs[i].GetPath() != item.first.GetPath() )
352 wxString msg = wxString::Format(
_(
"Footprint '%s' is not present on PCB. "
353 "Corresponding symbols in schematic must be "
354 "manually deleted (if desired)." ),
366 "annotated schematic." ) ) )
378 std::set<CHANGELIST_ITEM*> unitSwapItems;
388 std::map<std::shared_ptr<PCB_FP_DATA>, std::vector<CHANGELIST_ITEM*>> changesPerFp;
390 msg.Printf( wxT(
"DEBUG(unit-swap): grouped changelist into %zu footprint(s) for unit-swap processing:" ),
391 changesPerFp.size() );
398 changesPerFp[item.second].push_back( &item );
399 msg += wxT(
" " ) + item.first.GetRef();
405 for(
auto& fpChangelistPair : changesPerFp )
407 std::set<SCH_SYMBOL*> swappedSymbols;
408 std::set<CHANGELIST_ITEM*> swappedItems;
409 std::shared_ptr<PCB_FP_DATA> fp = fpChangelistPair.first;
410 auto& changedFpItems = fpChangelistPair.second;
423 std::map<wxString, wxString> schNetsByPin;
424 std::map<wxString, wxString> pcbNetsByPin;
425 std::vector<wxString> unitPinNumbers;
426 std::vector<wxString> schNetsInUnitOrder;
427 std::vector<wxString> pcbNetsInUnitOrder;
431 std::vector<SYM_UNIT> symbolUnits;
433 std::map<LIB_SYMBOL*, std::vector<LIB_SYMBOL::UNIT_PIN_INFO>> unitPinsByLibSymbol;
436 [&](
SCH_SYMBOL* symbol,
int unitNumber ) -> std::vector<wxString>
438 if( unitNumber <= 0 )
449 auto found = unitPinsByLibSymbol.find( libSymbol );
451 if( found == unitPinsByLibSymbol.end() )
452 found = unitPinsByLibSymbol.emplace( libSymbol,
455 const std::vector<LIB_SYMBOL::UNIT_PIN_INFO>& unitInfos = found->second;
457 if( unitNumber >
static_cast<int>( unitInfos.size() ) )
460 return unitInfos[unitNumber - 1].m_pinNumbers;
464 auto netsInUnitOrder =
465 [](
const std::vector<wxString>& pins,
466 const std::map<wxString, wxString>& netByPin )
468 std::vector<wxString> nets;
472 nets.reserve( pins.size() );
474 for(
const wxString& pinNum : pins )
476 auto it = netByPin.find( pinNum );
477 nets.push_back( it != netByPin.end() ? it->second : wxString() );
482 nets.reserve( netByPin.size() );
484 for(
const std::pair<const wxString, wxString>&
kv : netByPin )
485 nets.push_back(
kv.second );
503 symbolUnit.sym = symbol;
504 symbolUnit.screen = screen;
507 symbolUnit.changeItem = changedItem;
509 int currentUnit = ref.
GetUnit();
511 if( currentUnit <= 0 )
514 if( currentUnit <= 0 )
515 currentUnit = symbol->
GetUnit();
517 symbolUnit.currentUnit = currentUnit;
518 symbolUnit.unitPinNumbers = getUnitPins( symbol, symbolUnit.currentUnit );
524 const wxString& pinNum =
pin->GetNumber();
527 auto it = fp->m_pinMap.find( pinNum );
528 symbolUnit.pcbNetsByPin[pinNum] = ( it != fp->m_pinMap.end() ) ? it->second : wxString();
534 symbolUnit.schNetsByPin[pinNum] = connection->Name(
true );
536 symbolUnit.schNetsByPin[pinNum] = wxString();
539 symbolUnit.schNetsByPin[pinNum] = wxString();
542 symbolUnit.pcbNetsInUnitOrder = netsInUnitOrder( symbolUnit.unitPinNumbers, symbolUnit.pcbNetsByPin );
543 symbolUnit.schNetsInUnitOrder = netsInUnitOrder( symbolUnit.unitPinNumbers, symbolUnit.schNetsByPin );
545 symbolUnits.push_back( symbolUnit );
548 auto vectorToString = [](
const std::vector<wxString>& values ) -> wxString
550 return fmt::format(
L"{}", fmt::join( values,
L", " ) );
553 auto mapToString = [vectorToString](
const std::map<wxString, wxString>& pinMap ) -> wxString
555 std::vector<wxString> entries;
557 for(
const std::pair<const wxString, wxString>&
pin : pinMap )
558 entries.push_back(
pin.first +
'=' +
pin.second );
560 return vectorToString( entries );
563 msg.Printf( wxT(
"DEBUG(unit-swap): footprint %s processed (%zu units, dryRun=%d)." ), fp->m_ref,
564 symbolUnits.size(),
m_dryRun ? 1 : 0 );
568 std::sort( symbolUnits.begin(), symbolUnits.end(),
569 [](
const SYM_UNIT& a,
const SYM_UNIT& b )
571 return a.ref < b.ref;
575 std::vector<SYM_UNIT*> symbolUnitPtrs;
577 for( SYM_UNIT& su : symbolUnits )
578 symbolUnitPtrs.push_back( &su );
580 for(
const SYM_UNIT& su : symbolUnits )
582 wxString pcbPins = mapToString( su.pcbNetsByPin );
583 wxString schPins = mapToString( su.schNetsByPin );
584 wxString unitPins = vectorToString( su.unitPinNumbers );
585 wxString pcbUnitNetSeq = vectorToString( su.pcbNetsInUnitOrder );
586 wxString schUnitNetSeq = vectorToString( su.schNetsInUnitOrder );
588 msg.Printf( wxT(
"DEBUG(unit-swap): unit %d: %s pcbPins[%s] schPins[%s] unitPins[%s] pcbUnitNets[%s] "
589 "schUnitNets[%s]." ),
590 su.currentUnit, su.ref, pcbPins, schPins, unitPins, pcbUnitNetSeq, schUnitNetSeq );
594 if( symbolUnits.size() < 2 )
602 std::map<SYM_UNIT*, SYM_UNIT*> desiredTarget;
603 std::set<SYM_UNIT*> usedTargets;
604 bool mappingOk =
true;
606 for( SYM_UNIT* symbolUnit : symbolUnitPtrs )
608 SYM_UNIT* match =
nullptr;
610 for( SYM_UNIT* potentialMatch : symbolUnitPtrs )
612 if( usedTargets.count( potentialMatch ) )
615 if( symbolUnit->pcbNetsInUnitOrder == potentialMatch->schNetsInUnitOrder )
617 match = potentialMatch;
624 wxString pcbPins = mapToString( symbolUnit->pcbNetsByPin );
625 wxString schPins = mapToString( symbolUnit->schNetsByPin );
626 wxString unitPins = vectorToString( symbolUnit->unitPinNumbers );
627 wxString pcbUnitNetSeq = vectorToString( symbolUnit->pcbNetsInUnitOrder );
628 wxString schUnitNetSeq = vectorToString( symbolUnit->schNetsInUnitOrder );
630 msg.Printf( wxT(
"DEBUG(unit-swap): no schematic match for %s (%s) pcbPins[%s] schPins[%s] "
631 "unitPins[%s] pcbUnitNets[%s] schUnitNets[%s]." ),
632 symbolUnit->ref, fp->m_ref, pcbPins, schPins, unitPins, pcbUnitNetSeq, schUnitNetSeq );
638 msg.Printf( wxT(
"DEBUG(unit-swap): %s matches %s for footprint %s." ), symbolUnit->ref, match->ref,
641 desiredTarget[symbolUnit] = match;
642 usedTargets.insert( match );
647 msg.Printf( wxT(
"DEBUG(unit-swap): mapping failed for footprint %s." ), fp->m_ref );
653 bool isIdentity =
true;
655 for( SYM_UNIT* su : symbolUnitPtrs )
657 auto it = desiredTarget.find( su );
659 if( it == desiredTarget.end() || it->second != su )
668 msg.Printf( wxT(
"DEBUG(unit-swap): footprint %s already aligned (identity mapping)." ), fp->m_ref );
674 std::set<SYM_UNIT*> visited;
676 for( SYM_UNIT* symbolUnit : symbolUnitPtrs )
678 SYM_UNIT* start = symbolUnit;
680 if( visited.count( start ) )
684 std::vector<SYM_UNIT*> cycle;
685 SYM_UNIT* cur = start;
687 while( !visited.count( cur ) )
689 visited.insert( cur );
690 cycle.push_back( cur );
692 auto nextIt = desiredTarget.find( cur );
694 if( nextIt == desiredTarget.end() )
697 SYM_UNIT* nextSym = nextIt->second;
699 if( !nextSym || nextSym == cur )
705 if( cycle.size() < 2 )
707 msg.Printf( wxT(
"DEBUG(unit-swap): cycle length %zu for footprint %s starting at %s." ),
708 cycle.size(), fp->m_ref, start->ref );
717 for( SYM_UNIT* s : cycle )
718 commit.
Modify( s->sym, s->screen );
721 for(
size_t i = cycle.size() - 1; i > 0; --i )
723 SYM_UNIT* a = cycle[i - 1];
724 SYM_UNIT* b = cycle[i];
725 int aUnit = a->currentUnit;
726 int bUnit = b->currentUnit;
731 a->sym->SetUnit( bUnit );
732 b->sym->SetUnit( aUnit );
735 a->sym->SetUnitSelection( sheet, bUnit );
738 b->sym->SetUnitSelection( sheet, aUnit );
741 a->currentUnit = bUnit;
742 b->currentUnit = aUnit;
744 swappedSymbols.insert( a->sym );
745 swappedSymbols.insert( b->sym );
750 swappedItems.insert( a->changeItem );
751 unitSwapItems.insert( a->changeItem );
756 swappedItems.insert( b->changeItem );
757 unitSwapItems.insert( b->changeItem );
760 wxString baseRef = a->sym->GetRef( a->sheetPath,
false );
761 wxString unitAString = a->sym->SubReference( aUnit,
false );
762 wxString unitBString = b->sym->SubReference( bUnit,
false );
764 if( unitAString.IsEmpty() )
765 unitAString.Printf( wxT(
"%d" ), aUnit );
767 if( unitBString.IsEmpty() )
768 unitBString.Printf( wxT(
"%d" ), bUnit );
770 msg.Printf(
_(
"Swap %s unit %s with unit %s." ), baseRef, unitAString, unitBString );
775 msg.Printf( wxT(
"DEBUG(unit-swap): applied %zu swap steps for footprint %s." ), cycle.size() - 1,
785 SCH_SYMBOL* symbol = changedItem->first.GetSymbol();
790 if( swappedItems.count( changedItem ) || swappedSymbols.count( symbol ) )
793 int updatedUnit = symbol->
GetUnitSelection( &changedItem->first.GetSheetPath() );
794 changedItem->first.SetUnit( updatedUnit );
812 bool skip = ( ref.
GetSymbol()->GetFlags() &
SKIP_STRUCT ) > 0 || unitSwapItems.count( &item ) > 0;
815 [](
bool b ) -> wxString
817 return b ?
_(
"true" ) :
_(
"false" );
829 msg.Printf(
_(
"Change %s reference designator to '%s'." ),
843 msg.Printf(
_(
"Change %s footprint assignment from '%s' to '%s'." ),
858 msg.Printf(
_(
"Change %s value from '%s' to '%s'." ),
872 msg.Printf(
_(
"Change %s 'Do not populate' from '%s' to '%s'." ),
874 boolString( oldDNP ),
875 boolString( fpData.
m_DNP ) );
886 msg.Printf(
_(
"Change %s 'Exclude from bill of materials' from '%s' to '%s'." ),
888 boolString( oldExBOM ),
897 std::set<wxString> swappedPins;
905 for(
const std::pair<const wxString, wxString>& entry : fpData.
m_pinMap )
907 const wxString& pinNumber = entry.first;
908 const wxString& shortNetName = entry.second;
912 if( swappedPins.count( pinNumber ) > 0 )
917 msg.Printf(
_(
"Cannot find %s pin '%s'." ),
927 if( connection && connection->
Name(
true ) != shortNetName )
930 connection->
Name(
true ), shortNetName );
938 for(
const std::pair<const wxString, wxString>& field : fpData.
m_fieldsMap )
940 const wxString& fpFieldName = field.first;
941 const wxString& fpFieldValue = field.second;
960 msg.Printf(
_(
"Change %s field '%s' value to '%s'." ),
966 symField->
SetText( fpFieldValue );
972 if( symField ==
nullptr )
975 msg.Printf(
_(
"Add %s field '%s' with value '%s'." ),
983 newField.
SetText( fpFieldValue );
998 if( field.IsMandatory() )
1005 msg.Printf(
_(
"Delete %s field '%s.'" ),
1020 unitSwapItems.erase( &item );
1028 m_frame->UpdateNetHighlightStatus();
1030 commit.
Push(
_(
"Update Schematic from PCB" ) );
1073 ORIENT o = orientations[ 0 ];
1082 for(
const ORIENT& i : orientations )
1084 if( i.flag == symbolOrientation )
1091 for(
int i = 0; i < o.n_rots; i++ )
1105 std::set<SCH_ITEM*>& connectedItems )
1107 if( connectedItems.insert( aItem ).second )
1120 std::set<wxString> swappedPins;
1130 wxCHECK(
m_frame, swappedPins );
1137 wxString currentNet;
1141 std::vector<PIN_CHANGE> mismatches;
1144 std::map<wxString, std::vector<size_t>> pinsByCurrentNet;
1147 for(
const std::pair<const wxString, wxString>& entry : aFpData.
m_pinMap )
1149 const wxString& pinNumber = entry.first;
1150 const wxString& desiredNet = entry.second;
1159 if( !
pin ||
pin->IsPower() || !
pin->IsConnectable() )
1163 wxString currentNet = connection ? connection->
Name(
true ) : wxString();
1165 if( desiredNet.IsEmpty() || currentNet.IsEmpty() )
1168 if( desiredNet == currentNet )
1171 size_t idx = mismatches.size();
1172 mismatches.push_back( {
pin, pinNumber, currentNet, desiredNet } );
1173 pinsByCurrentNet[currentNet].push_back( idx );
1176 if( mismatches.size() < 2 )
1181 std::vector<bool> handled( mismatches.size(),
false );
1182 std::vector<SCH_PIN*> swappedPinObjects;
1183 bool swappedLibPins =
false;
1186 bool allowPinSwaps =
false;
1187 wxString currentProjectName =
m_frame->Prj().GetProjectName();
1190 allowPinSwaps =
m_frame->eeconfig()->m_Input.allow_unconstrained_pin_swaps;
1192 std::set<wxString> sharedSheetPaths;
1193 std::set<wxString> sharedProjectNames;
1194 bool sharedSheetSymbol =
1197 std::set<wxString> friendlySheetNames;
1199 if( sharedSheetSymbol && !sharedSheetPaths.empty() )
1204 for(
size_t i = 0; i < mismatches.size(); ++i )
1210 PIN_CHANGE& change = mismatches[i];
1213 auto range = pinsByCurrentNet.find( change.targetNet );
1216 if( range == pinsByCurrentNet.end() )
1220 size_t partnerIdx = std::numeric_limits<size_t>::max();
1223 for(
size_t candidateIdx : range->second )
1225 if( candidateIdx == i || handled[candidateIdx] )
1228 PIN_CHANGE& candidate = mismatches[candidateIdx];
1232 if( candidate.targetNet == change.currentNet )
1234 partnerIdx = candidateIdx;
1241 if( partnerIdx == std::numeric_limits<size_t>::max() )
1244 PIN_CHANGE& partner = mismatches[partnerIdx];
1248 if( change.pin->GetParentSymbol() != partner.pin->GetParentSymbol() )
1251 if( !allowPinSwaps || sharedSheetSymbol )
1253 if( !sharedProjectNames.empty() )
1255 std::vector<wxString> otherProjects;
1257 for(
const wxString&
name : sharedProjectNames )
1259 if( !currentProjectName.IsEmpty() &&
name.IsSameAs( currentProjectName ) )
1262 otherProjects.push_back(
name );
1267 if( projects.IsEmpty() )
1269 msg.Printf(
_(
"Would swap %s pins %s and %s to match PCB, but the symbol is shared across other projects." ),
1271 EscapeHTML( partner.pin->GetShownNumber() ) );
1275 msg.Printf(
_(
"Would swap %s pins %s and %s to match PCB, but the symbol is shared across other "
1278 EscapeHTML( partner.pin->GetShownNumber() ), projects );
1281 else if( !friendlySheetNames.empty() )
1285 msg.Printf(
_(
"Would swap %s pins %s and %s to match PCB, but the symbol is used by multiple sheet "
1286 "instances (%s)." ),
1288 EscapeHTML( partner.pin->GetShownNumber() ), sheets );
1290 else if( sharedSheetSymbol )
1292 msg.Printf(
_(
"Would swap %s pins %s and %s to match PCB, but the symbol is shared." ),
1294 EscapeHTML( partner.pin->GetShownNumber() ) );
1298 msg.Printf(
_(
"Would swap %s pins %s and %s to match PCB, but unconstrained pin swaps are disabled in "
1299 "the schematic preferences." ),
1301 EscapeHTML( partner.pin->GetShownNumber() ) );
1306 handled[partnerIdx] =
true;
1312 wxCHECK2( aCommit,
continue );
1323 handled[partnerIdx] =
true;
1326 swappedPins.insert( change.pinNumber );
1327 swappedPins.insert( partner.pinNumber );
1328 swappedPinObjects.push_back( change.pin );
1329 swappedPinObjects.push_back( partner.pin );
1333 msg.Printf(
_(
"Swap %s pins %s and %s to match PCB." ), aReference.
GetRef(),
1339 if( swappedPinObjects.empty() )
1344 if( swappedLibPins )
1347 m_frame->UpdateItem( aSymbol,
false,
true );
1356 for(
SCH_PIN* swappedPin : swappedPinObjects )
1357 cleanupSelection.
Add( swappedPin );
1359 lwbTool->TrimOverLappingWires( aCommit, &cleanupSelection );
1360 lwbTool->AddJunctionsIfNeeded( aCommit, &cleanupSelection );
1364 m_frame->Schematic().CleanUp( aCommit );
1373 const wxString& aOldName,
const wxString& aNewName )
1381 std::set<SCH_ITEM*> connectedItems;
1387 for(
SCH_ITEM* item : connectedItems )
1391 if( priority > driverPriority )
1394 driverPriority = priority;
1398 switch( driver->
Type() )
1406 msg.Printf(
_(
"Change %s pin %s net label from '%s' to '%s'." ),
1428 msg.Printf(
_(
"Net %s cannot be changed to %s because it is driven by a power pin." ),
1437 msg.Printf(
_(
"Add label '%s' to %s pin %s net." ),
1452 aCommit->
Add( label, screen );
void addConnections(SCH_ITEM *aItem, const SCH_SHEET_PATH &aSheetPath, std::set< SCH_ITEM * > &connectedItems)
static SPIN_STYLE orientLabel(SCH_PIN *aPin)
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
bool BackAnnotateSymbols(const std::string &aNetlist)
Run back annotation algorithm.
SCH_MULTI_UNIT_REFERENCE_MAP m_multiUnitsRefs
std::deque< CHANGELIST_ITEM > m_changelist
std::pair< SCH_REFERENCE, std::shared_ptr< PCB_FP_DATA > > CHANGELIST_ITEM
bool m_processOtherFields
void getPcbModulesFromString(const std::string &aPayload)
Parse netlist sent over KiWay express mail interface and fill m_pcbModules.
void checkForUnusedSymbols()
Check if some symbols are not represented in PCB footprints and vice versa.
SCH_REFERENCE_LIST m_refs
bool FetchNetlistFromPCB(std::string &aNetlist)
Get netlist from the Pcbnew.
PCB_FOOTPRINTS_MAP m_pcbFootprints
void processNetNameChange(SCH_COMMIT *aCommit, const wxString &aRef, SCH_PIN *aPin, const SCH_CONNECTION *aConnection, const wxString &aOldName, const wxString &aNewName)
BACK_ANNOTATE(SCH_EDIT_FRAME *aFrame, REPORTER &aReporter, bool aRelinkFootprints, bool aProcessFootprints, bool aProcessValues, bool aProcessReferences, bool aProcessNetNames, bool aProcessAttributes, bool aProcessOtherFields, bool aPreferUnitSwaps, bool aPreferPinSwaps, bool aDryRun)
std::set< wxString > applyPinSwaps(SCH_SYMBOL *aSymbol, const SCH_REFERENCE &aReference, const PCB_FP_DATA &aFpData, SCH_COMMIT *aCommit)
Handle footprint pad net swaps with symbol pin swaps where possible.
void applyChangelist()
Apply changelist to the schematic.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
PRIORITY GetDriverPriority()
Implement a lexical analyzer for the SPECCTRA DSN file format.
virtual VECTOR2I GetPosition() const
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM_FLAGS GetFlags() const
void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
void SetTextPos(const VECTOR2I &aPoint)
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
virtual void SetVisible(bool aVisible)
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
virtual bool OpenProjectFiles(const std::vector< wxString > &aFileList, int aCtl=0)
Open a project or set of files given by aFileList.
Define a library symbol object.
std::vector< UNIT_PIN_INFO > GetUnitPinInfo() const
Return pin-number lists for each unit, ordered consistently for gate swapping.
static REPORTER & GetInstance()
A pure virtual class used to derive REPORTER objects from.
virtual REPORTER & ReportHead(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Places the report at the beginning of the list for objects that support ordering.
These are loaded from Eeschema settings but then overwritten by the project settings.
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Execute the changes.
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
SCH_SHEET_PATH Sheet() const
wxString Name(bool aIgnoreSheet=false) const
Schematic editor (Eeschema) main window.
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
void SetText(const wxString &aText) override
Base class for any item which can be embedded within the SCHEMATIC container class,...
const SCH_ITEM_VEC & ConnectedItems(const SCH_SHEET_PATH &aPath)
Retrieve the set of items connected to this item on the given sheet.
const SYMBOL * GetParentSymbol() const
virtual void SetSpinStyle(SPIN_STYLE aSpinStyle)
wxString GetShownNumber() const
SCH_PIN * GetLibPin() const
PIN_ORIENTATION GetOrientation() const
bool IsPower() const
Check if the pin is either a global or local power pin.
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
int FindRef(const wxString &aPath) const
Search the list for a symbol with a given reference.
int FindRefByFullPath(const wxString &aFullPath) const
Search the list for a symbol with the given KIID path (as string).
A helper to define a symbol's reference designator in a schematic.
const SCH_SHEET_PATH & GetSheetPath() const
const wxString GetFootprint() const
SCH_SYMBOL * GetSymbol() const
const wxString GetValue() const
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
void GetMultiUnitSymbols(SCH_MULTI_UNIT_REFERENCE_MAP &aRefList, bool aIncludePowerSymbols=true) const
Add a SCH_REFERENCE_LIST object to aRefList for each same-reference set of multi-unit parts in the li...
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_SCREEN * LastScreen()
virtual void SetDNP(bool aEnable, const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) override
void SetValueFieldText(const wxString &aValue)
void RemoveField(const wxString &aFieldName)
Remove a user field from the symbol.
bool GetExcludedFromBOM(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
void UpdatePins()
Updates the cache of SCH_PIN objects for each pin.
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
void SetFootprintFieldText(const wxString &aFootprint)
VECTOR2I GetPosition() const override
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
SCH_FIELD * AddField(const SCH_FIELD &aField)
Add a field to the symbol.
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.
int GetOrientation() const override
Get the display symbol orientation.
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.
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
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
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this symbol.
virtual void Add(EDA_ITEM *aItem)
SPIN_STYLE MirrorX()
Mirror the label spin style across the X axis or simply swaps up and bottom.
SPIN_STYLE MirrorY()
Mirror the label spin style across the Y axis or simply swaps left and right.
bool GetExcludedFromBoard() const override
An 8 bit string that is assuredly encoded in UTF8, and supplies special conversion support to and fro...
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
#define IS_NEW
New item, just created.
#define SKIP_STRUCT
flag indicating that the structure should be ignored
@ PIN_UP
The pin extends upwards from the connection point: Probably on the bottom side of the symbol.
@ PIN_RIGHT
The pin extends rightwards from the connection point.
@ PIN_LEFT
The pin extends leftwards from the connection point: Probably on the right side of the symbol.
@ PIN_DOWN
The pin extends downwards from the connection: Probably on the top side of the symbol.
void Scan(PTREE *aTree, DSNLEXER *aLexer)
Fill an empty PTREE with information from a KiCad s-expression stream.
boost::property_tree::ptree PTREE
Definition of the SCH_SHEET_PATH and SCH_SHEET_LIST classes for Eeschema.
wxString EscapeHTML(const wxString &aString)
Return a new wxString escaped for embedding in HTML.
wxString From_UTF8(const char *cstring)
void AccumulateDescriptions(wxString &aDesc, const T &aItemCollection)
Build a comma-separated list from a collection of wxStrings.
Container for Pcbnew footprint data.Map to hold NETLIST footprints data.
std::map< wxString, wxString > m_pinMap
std::map< wxString, wxString > m_fieldsMap
@ USER
The field ID hasn't been set yet; field is invalid.
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
wxString GetCanonicalFieldName(FIELD_T aFieldType)
VECTOR2< int32_t > VECTOR2I
Definition of file extensions used in Kicad.