52 const wxString& aSearchText )
60 if( !aSearchHierarchy )
61 sheetList.push_back(
m_frame->GetCurrentSheet() );
63 sheetList =
m_frame->Schematic().Hierarchy();
79 found = ( *aPath ==
path );
83 found = ( aReference && aReference->CmpNoCase( candidate->
GetRef( &sheet ) ) == 0 );
89 sheetWithSymbolFound = &sheet;
98 int unit =
pin->GetLibPin()->GetUnit();
100 if( unit != 0 && unit != symbol->
GetUnit() )
127 if( *sheetWithSymbolFound !=
m_frame->GetCurrentSheet() )
130 sheetWithSymbolFound );
145 m_frame->FocusOnItem( symbol );
154 displayRef = *aReference;
163 msg.Printf(
_(
"%s pin %s found" ), displayRef, aSearchText );
165 msg.Printf(
_(
"%s found but pin %s not found" ), displayRef, aSearchText );
169 msg.Printf(
_(
"%s found" ), displayRef );
174 msg.Printf(
_(
"%s not found" ), displayRef );
178 m_frame->GetCanvas()->Refresh();
203 strncpy( line, cmdline,
sizeof( line ) - 1 );
204 line[
sizeof( line ) - 1 ] =
'\0';
206 char* idcmd = strtok( line,
" \n\r" );
207 char*
text = strtok(
nullptr,
"\"\n\r" );
209 if( idcmd ==
nullptr )
214 if( strcmp( idcmd,
"$CONFIG" ) == 0 )
219 else if( strcmp( idcmd,
"$ERC" ) == 0 )
224 else if( strcmp( idcmd,
"$NET:" ) == 0 )
231 if(
auto sg =
Schematic().ConnectionGraph()->FindFirstSubgraphByName( netName ) )
239 SetStatusText(
_(
"Highlighted net:" ) + wxS(
" " ) +
UnescapeString( netName ) );
242 else if( strcmp( idcmd,
"$CLEAR:" ) == 0 )
251 if(
text ==
nullptr )
254 if( strcmp( idcmd,
"$PART:" ) != 0 )
260 idcmd = strtok(
nullptr,
" \n\r" );
262 if( idcmd ==
nullptr )
269 text = strtok(
nullptr,
"\"\n\r" );
271 if(
text ==
nullptr )
276 if( strcmp( idcmd,
"$REF:" ) == 0 )
282 else if( strcmp( idcmd,
"$VAL:" ) == 0 )
288 else if( strcmp( idcmd,
"$PAD:" ) == 0 )
301 std::vector<wxString> parts;
305 switch( item->Type() )
322 parts.push_back( wxT(
"S" ) + full_path );
345 std::string command =
"$SELECT: 0,";
347 for( wxString part : parts )
376 if( !packet.empty() )
401 if( aConnection->
IsNet() )
407 if( aConnection->
Members().empty() )
412 wxString nets = all_members[0]->Name();
414 if( all_members.size() == 1 )
424 for(
size_t i = 1; i < all_members.size(); i++ )
425 nets <<
"," << all_members[i]->Name();
429 if( !packet.empty() )
446 std::string packet =
"$CLEAR\n";
464 std::unordered_map<wxString, std::vector<SCH_REFERENCE>>& aSyncSymMap,
465 std::unordered_map<wxString, std::unordered_map<wxString, SCH_PIN*>>& aSyncPinMap,
466 bool aRecursive =
false )
483 aSheetPath.
GetSymbols( references,
false,
true );
485 for(
unsigned ii = 0; ii < references.
GetCount(); ii++ )
494 wxString fullRef = schRef.
GetRef() + refNum;
497 if( fullRef.StartsWith( wxS(
"#" ) ) )
501 if( refNum.compare( wxS(
"?" ) ) == 0 )
505 auto symMatchIt = aSyncSymMap.find( fullRef );
507 if( symMatchIt != aSyncSymMap.end() )
509 symMatchIt->second.emplace_back( schRef );
516 auto symPinMatchIt = aSyncPinMap.find( fullRef );
518 if( symPinMatchIt != aSyncPinMap.end() )
520 std::unordered_map<wxString, SCH_PIN*>& pinMap = symPinMatchIt->second;
521 std::vector<SCH_PIN*> pinsOnSheet = symbol->
GetPins( &aSheetPath );
525 int pinUnit =
pin->GetLibPin()->GetUnit();
527 if( pinUnit > 0 && pinUnit != schRef.
GetUnit() )
530 auto pinIt = pinMap.find(
pin->GetNumber() );
532 if( pinIt != pinMap.end() )
544 std::unordered_map<wxString, std::vector<SCH_REFERENCE>>& aSyncSymMap,
545 std::unordered_map<wxString, std::unordered_map<wxString, SCH_PIN*>>& aSyncPinMap,
546 std::unordered_map<SCH_SHEET_PATH, bool>& aCache )
548 auto cacheIt = aCache.find( aSheetPath );
550 if( cacheIt != aCache.end() )
551 return cacheIt->second;
560 aSyncPinMap, aCache );
564 aCache.emplace( aSheetPath,
false );
570 aSheetPath.
GetSymbols( references,
false,
true );
574 aCache.emplace( aSheetPath,
false );
578 for(
unsigned ii = 0; ii < references.
GetCount(); ii++ )
586 wxString fullRef = schRef.
GetRef() + refNum;
589 if( fullRef.StartsWith( wxS(
"#" ) ) )
593 if( refNum.compare( wxS(
"?" ) ) == 0 )
596 if( aSyncSymMap.find( fullRef ) == aSyncSymMap.end() )
598 aCache.emplace( aSheetPath,
false );
602 if( aSyncPinMap.find( fullRef ) != aSyncPinMap.end() )
604 aCache.emplace( aSheetPath,
false );
609 aCache.emplace( aSheetPath,
true );
614std::optional<std::tuple<SCH_SHEET_PATH, SCH_ITEM*, std::vector<SCH_ITEM*>>>
618 wxArrayString syncArray = wxStringTokenize( aSyncStr, wxS(
"," ) );
620 std::unordered_map<wxString, std::vector<SCH_REFERENCE>> syncSymMap;
621 std::unordered_map<wxString, std::unordered_map<wxString, SCH_PIN*>> syncPinMap;
622 std::unordered_map<SCH_SHEET_PATH, double> symScores;
623 std::unordered_map<SCH_SHEET_PATH, bool> fullyWantedCache;
625 std::optional<wxString> focusSymbol;
626 std::optional<std::pair<wxString, wxString>> focusPin;
627 std::unordered_map<SCH_SHEET_PATH, std::vector<SCH_ITEM*>> focusItemResults;
632 std::vector<SCH_SHEET_PATH> orderedSheets;
633 orderedSheets.reserve( allSheetsList.size() );
639 orderedSheets.push_back( sheetPath );
643 for(
size_t i = 0; i < syncArray.size(); i++ )
645 wxString syncEntry = syncArray[i];
647 if( syncEntry.empty() )
650 wxString syncData = syncEntry.substr( 1 );
652 switch( syncEntry.GetChar( 0 ).GetValue() )
658 if( aFocusOnFirst && ( i == 0 ) )
659 focusSymbol = symRef;
661 syncSymMap[symRef] = std::vector<SCH_REFERENCE>();
670 if( aFocusOnFirst && ( i == 0 ) )
671 focusPin = std::make_pair( symRef, padNum );
673 syncPinMap[symRef][padNum] =
nullptr;
683 auto flattenSyncMaps =
684 [&syncSymMap, &syncPinMap]() -> std::vector<SCH_ITEM*>
686 std::vector<SCH_ITEM*> allVec;
688 for(
const auto& [symRef, symbols] : syncSymMap )
691 allVec.push_back( ref.GetSymbol() );
694 for(
const auto& [symRef, pinMap] : syncPinMap )
696 for(
const auto& [padNum,
pin] : pinMap )
699 allVec.push_back(
pin );
707 [&syncSymMap, &syncPinMap]()
709 for(
auto& [symRef, symbols] : syncSymMap )
712 for(
auto& [reference, pins] : syncPinMap )
714 for(
auto& [number,
pin] : pins )
719 auto syncMapsValuesEmpty =
720 [&syncSymMap, &syncPinMap]() ->
bool
722 for(
const auto& [symRef, symbols] : syncSymMap )
724 if( symbols.size() > 0 )
728 for(
const auto& [symRef, pins] : syncPinMap )
730 for(
const auto& [padNum,
pin] : pins )
740 auto checkFocusItems =
745 auto findIt = syncSymMap.find( *focusSymbol );
747 if( findIt != syncSymMap.end() )
749 if( findIt->second.size() > 0 )
750 focusItemResults[aSheet].push_back( findIt->second.front().GetSymbol() );
755 auto findIt = syncPinMap.find( focusPin->first );
757 if( findIt != syncPinMap.end() )
759 if( findIt->second[focusPin->second] )
760 focusItemResults[aSheet].push_back( findIt->second[focusPin->second] );
765 auto makeRetForSheet =
772 std::vector<SCH_ITEM*> itemsVector = flattenSyncMaps();
778 kiidPath.push_back( item->m_Uuid );
780 std::optional<SCH_SHEET_PATH> subsheetPath =
787 syncPinMap, fullyWantedCache ) )
789 itemsVector.push_back( item );
793 return std::make_tuple( aSheet, aFocusItem, itemsVector );
804 checkFocusItems( sheetPath );
807 if( focusItemResults.size() > 0 )
811 const std::vector<SCH_ITEM*>& items = focusItemResults[sheetPath];
814 return makeRetForSheet( sheetPath, items.front() );
826 if( !syncMapsValuesEmpty() )
829 return makeRetForSheet( sheetPath,
nullptr );
846 std::stringstream ss( payload );
850 std::optional<LIBRARY_TABLE*> optTable =
853 wxCHECK_RET( optTable,
"Could not load symbol lib table." );
857 while( std::getline( ss, file,
'\n' ) )
862 wxFileName fn( file );
866 if( type == SCH_IO_MGR::SCH_FILE_UNKNOWN )
868 wxLogTrace(
"KIWAY",
"Unknown file type: %s", fn.GetFullPath() );
872 pi.reset( SCH_IO_MGR::FindPlugin( type ) );
874 if( !
table->HasRow( fn.GetName() ) )
878 row.
SetURI( fn.GetFullPath() );
881 table->Save().map_error(
884 wxLogError(
_(
"Error saving project-specific library table:\n\n%s" ),
889 adapter->
LoadOne( fn.GetName() );
905 if( !
eeconfig()->m_CrossProbing.on_selection )
919 std::string prefix =
"$SELECT: ";
921 std::string paramStr = payload.substr( prefix.size() );
924 if( paramStr.size() < 2 )
927 std::string syncStr = paramStr.substr( 2 );
929 bool focusOnFirst = ( paramStr[0] ==
'1' );
931 std::optional<std::tuple<SCH_SHEET_PATH, SCH_ITEM*, std::vector<SCH_ITEM*>>> findRet =
936 auto& [sheetPath, focusItem, items] = *findRet;
945 if(
eeconfig()->m_CrossProbing.flash_selection )
947 wxLogTrace(
traceCrossProbeFlash,
"MAIL_SELECTION(_FORCE): flash enabled, items=%zu", items.size() );
954 std::vector<SCH_ITEM*> itemPtrs;
955 std::copy( items.begin(), items.end(), std::back_inserter( itemPtrs ) );
971 if( !payload.empty() )
973 wxString annotationMessage( payload );
994 KIID uuid( payload );
1000 payload =
static_cast<SCH_SHEET*
>( item )->GetShownName(
false );
1002 payload =
static_cast<SCH_SYMBOL*
>( item )->GetRef( &
path,
true );
1004 payload = item->GetFriendlyName();
1034 std::stringstream ss( payload );
1037 std::string formatStr;
1038 wxCHECK( std::getline( ss, formatStr, delim ), );
1040 std::string fnameStr;
1041 wxCHECK( std::getline( ss, fnameStr, delim ), );
1047 importFormat = std::stoi( formatStr );
1049 catch( std::invalid_argument& )
1055 std::map<std::string, UTF8> props;
1059 std::string key, value;
1061 if( !std::getline( ss, key, delim ) )
1064 std::getline( ss, value, delim );
1066 props.emplace( key, value );
1070 if( importFormat >= 0 )
1071 importFile( fnameStr, importFormat, props.empty() ?
nullptr : &props );
1078 payload =
"success";
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
static TOOL_ACTION showSymbolLibTable
static TOOL_ACTION updateSchematicFromPcb
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
CROSS_PROBING_SETTINGS m_CrossProbing
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
A base class for most all the KiCad significant classes used in schematics and boards.
virtual const wxString & GetText() const
Return the string associated with the text object.
EE_TYPE OfType(KICAD_T aType) const
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
wxString AsString() const
Carry a payload from one KIWAY_PLAYER to another within a PROJECT.
std::string & GetPayload()
Return the payload, which can be any text but it typically self identifying s-expression.
MAIL_T Command()
Returns the MAIL_T associated with this mail.
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr, bool aFromOtherThread=false)
Send aPayload to aDestination from aSource.
std::optional< LIBRARY_TABLE * > Table(LIBRARY_TABLE_TYPE aType, LIBRARY_TABLE_SCOPE aScope)
Retrieves a given table; creating a new empty project table if a valid project is loaded and the give...
void SetNickname(const wxString &aNickname)
void SetType(const wxString &aType)
void SetURI(const wxString &aUri)
Generate the KiCad netlist format supported by Pcbnew.
void Format(OUTPUTFORMATTER *aOutputFormatter, int aCtl)
Output this s-expression netlist into aOutputFormatter.
virtual LIBRARY_MANAGER & GetLibraryManager() const
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
Holds all the data relating to one schematic.
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
SCH_SHEET_PATH & CurrentSheet() const
static TOOL_ACTION runERC
Inspection and Editing.
static TOOL_ACTION changeSheet
static TOOL_ACTION updateNetHighlighting
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void SyncView()
Mark all items for refresh.
EESCHEMA_SETTINGS * eeconfig() const
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
const std::vector< std::shared_ptr< SCH_CONNECTION > > AllMembers() const
wxString Name(bool aIgnoreSheet=false) const
const std::vector< std::shared_ptr< SCH_CONNECTION > > & Members() const
KIGFX::SCH_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void AssignFootprints(const std::string &aChangedSetOfReferences)
SCH_ITEM * FindSymbolAndItem(const wxString *aPath, const wxString *aReference, bool aSearchHierarchy, SCH_SEARCH_T aSearchType, const wxString &aSearchText)
Find a symbol in the schematic and an item in this symbol and select it.
bool ReadyToNetlist(const wxString &aAnnotateMessage)
Check if we are ready to write a netlist file for the current schematic.
bool m_syncingPcbToSchSelection
friend class SCH_EDITOR_CONTROL
void SendSelectItemsToPcb(const std::vector< EDA_ITEM * > &aItems, bool aForce)
Send items to board editor for selection.
void SendCrossProbeClearHighlight()
Tell Pcbnew to clear the existing highlighted net, if one exists.
SCHEMATIC * m_schematic
The currently loaded schematic.
SCH_SHEET_PATH & GetCurrentSheet() const
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags, PROGRESS_REPORTER *aProgressReporter=nullptr)
Generate the connection data for the entire schematic hierarchy.
SCHEMATIC & Schematic() const
void ExecuteRemoteCommand(const char *cmdline) override
Execute a remote command sent via a socket on port KICAD_SCH_PORT_SERVICE_NUMBER (which defaults to 4...
void RefreshNetNavigator(const NET_NAVIGATOR_ITEM_DATA *aSelection=nullptr)
SCH_DESIGN_BLOCK_PANE * m_designBlocksPane
bool importFile(const wxString &aFileName, int aFileType, const std::map< std::string, UTF8 > *aProperties=nullptr)
Load the given filename but sets the path to the current project path.
void SendCrossProbeNetName(const wxString &aNetName)
Send a net name to Pcbnew for highlighting.
void StartCrossProbeFlash(const std::vector< SCH_ITEM * > &aItems)
wxString m_highlightedConn
The highlighted net or bus or empty string.
void SetCrossProbeConnection(const SCH_CONNECTION *aConnection)
Send a connection (net or bus) to Pcbnew for highlighting.
void TestDanglingEnds()
Test all of the connectable objects in the schematic for unused connection points.
bool SaveProject(bool aSaveAs=false)
Save the currently-open schematic (including its hierarchy) and associated project.
void KiwayMailIn(KIWAY_EXPRESS &aEvent) override
Receive KIWAY_EXPRESS messages from other players.
static const wxString ShowType(SCH_FILE_T aFileType)
Return a brief name for a plugin, given aFileType enum.
static SCH_FILE_T GuessPluginTypeFromLibPath(const wxString &aLibPath, int aCtl=0)
Return a plugin type given a symbol library using the file extension of aLibPath.
Base class for any item which can be embedded within the SCHEMATIC container class,...
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
A helper to define a symbol's reference designator in a schematic.
void Split()
Attempt to split the reference designator into a name (U) and number (1).
bool IsSplitNeeded()
Determine if this reference needs to be split or if it likely already has been.
SCH_SYMBOL * GetSymbol() const
wxString GetRefNumber() const
EE_RTREE & Items()
Get the full RTree, usually for iterating.
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
std::optional< SCH_SHEET_PATH > GetSheetPathByKIIDPath(const KIID_PATH &aPath, bool aIncludeLastSheet=true) const
Finds a SCH_SHEET_PATH that matches the provided KIID_PATH.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Adds SCH_REFERENCE object to aReferences for each symbol in the sheet.
KIID_PATH Path() const
Get the sheet path as an KIID_PATH.
SCH_SCREEN * LastScreen()
bool IsContainedWithin(const SCH_SHEET_PATH &aSheetPathToTest) const
Check if this path is contained inside aSheetPathToTest.
wxString PathAsString() const
Return the path of time stamps which do not changes even when editing sheet parameters.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet) const
Retrieve a list of the SCH_PINs for the given sheet path.
SCH_PIN * GetPin(const wxString &number) const
Find a symbol pin by number.
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.
An interface to the global shared library manager that is schematic-specific and linked to one projec...
std::optional< LIB_STATUS > LoadOne(const wxString &aNickname)
Loads or reloads the given library, if it exists.
A base class for LIB_SYMBOL and SCH_SYMBOL.
virtual const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const =0
bool SendCommand(int aService, const std::string &aMessage)
Used by a client to sent (by a socket connection) a data to a server.
std::optional< std::tuple< SCH_SHEET_PATH, SCH_ITEM *, std::vector< SCH_ITEM * > > > findItemsFromSyncSelection(const SCHEMATIC &aSchematic, const std::string aSyncStr, bool aFocusOnFirst)
bool findSymbolsAndPins(const SCH_SHEET_LIST &aSchematicSheetList, const SCH_SHEET_PATH &aSheetPath, std::unordered_map< wxString, std::vector< SCH_REFERENCE > > &aSyncSymMap, std::unordered_map< wxString, std::unordered_map< wxString, SCH_PIN * > > &aSyncPinMap, bool aRecursive=false)
bool sheetContainsOnlyWantedItems(const SCH_SHEET_LIST &aSchematicSheetList, const SCH_SHEET_PATH &aSheetPath, std::unordered_map< wxString, std::vector< SCH_REFERENCE > > &aSyncSymMap, std::unordered_map< wxString, std::unordered_map< wxString, SCH_PIN * > > &aSyncPinMap, std::unordered_map< SCH_SHEET_PATH, bool > &aCache)
@ FRAME_SCH_SYMBOL_EDITOR
const wxChar *const traceCrossProbeFlash
Flag to enable debug output for cross-probe flash operations.
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
@ ALL
All except INITIAL_ADD.
PGM_BASE & Pgm()
The global program "get" accessor.
int StrPrintf(std::string *result, const char *format,...)
This is like sprintf() but the output is appended to a std::string instead of to a character array.
SCH_SEARCH_T
Schematic search type used by the socket link with Pcbnew.
KIWAY Kiway(KFCTL_STANDALONE)
wxString UnescapeString(const wxString &aSource)
wxString From_UTF8(const char *cstring)
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
bool on_selection
Synchronize the selection for multiple items too.
bool zoom_to_fit
Zoom to fit items (ignored if center_on_items is off).
bool center_on_items
Automatically pan to cross-probed items.
bool auto_highlight
Automatically turn on highlight mode in the target frame.
@ REFERENCE
Field Reference of part, i.e. "IC21".
wxLogTrace helper definitions.