44 const wxString& aSearchText )
52 if( !aSearchHierarchy )
71 found = ( *aPath ==
path );
75 found = ( aReference && aReference->CmpNoCase( candidate->
GetRef( &sheet ) ) == 0 );
81 sheetWithSymbolFound = &sheet;
90 int unit =
pin->GetLibPin()->GetUnit();
92 if( unit != 0 && unit != symbol->
GetUnit() )
146 displayRef = *aReference;
155 msg.Printf(
_(
"%s pin %s found" ), displayRef, aSearchText );
157 msg.Printf(
_(
"%s found but pin %s not found" ), displayRef, aSearchText );
161 msg.Printf(
_(
"%s found" ), displayRef );
166 msg.Printf(
_(
"%s not found" ), displayRef );
195 strncpy( line, cmdline,
sizeof( line ) - 1 );
196 line[
sizeof( line ) - 1 ] =
'\0';
198 char* idcmd = strtok( line,
" \n\r" );
199 char*
text = strtok(
nullptr,
"\"\n\r" );
201 if( idcmd ==
nullptr )
206 if( strcmp( idcmd,
"$CONFIG" ) == 0 )
211 else if( strcmp( idcmd,
"$ERC" ) == 0 )
216 else if( strcmp( idcmd,
"$NET:" ) == 0 )
223 if(
auto sg =
Schematic().ConnectionGraph()->FindFirstSubgraphByName( netName ) )
231 SetStatusText(
_(
"Selected net:" ) + wxS(
" " ) +
UnescapeString( netName ) );
234 else if( strcmp( idcmd,
"$CLEAR:" ) == 0 )
243 if(
text ==
nullptr )
246 if( strcmp( idcmd,
"$PART:" ) != 0 )
252 idcmd = strtok(
nullptr,
" \n\r" );
254 if( idcmd ==
nullptr )
261 text = strtok(
nullptr,
"\"\n\r" );
263 if(
text ==
nullptr )
268 if( strcmp( idcmd,
"$REF:" ) == 0 )
274 else if( strcmp( idcmd,
"$VAL:" ) == 0 )
280 else if( strcmp( idcmd,
"$PAD:" ) == 0 )
293 std::vector<wxString> parts;
297 switch( item->Type() )
314 parts.push_back( wxT(
"S" ) + full_path );
337 std::string command =
"$SELECT: 0,";
339 for( wxString part : parts )
368 if( !packet.empty() )
393 if( aConnection->
IsNet() )
399 if( aConnection->
Members().empty() )
404 wxString nets = all_members[0]->Name();
406 if( all_members.size() == 1 )
416 for(
size_t i = 1; i < all_members.size(); i++ )
417 nets <<
"," << all_members[i]->Name();
421 if( !packet.empty() )
438 std::string packet =
"$CLEAR\n";
456 std::unordered_map<wxString, std::vector<SCH_REFERENCE>>& aSyncSymMap,
457 std::unordered_map<wxString, std::unordered_map<wxString, SCH_PIN*>>& aSyncPinMap,
458 bool aRecursive =
false )
474 aSheetPath.
GetSymbols( references,
false,
true );
476 for(
unsigned ii = 0; ii < references.
GetCount(); ii++ )
485 wxString fullRef = schRef.
GetRef() + refNum;
488 if( fullRef.StartsWith( wxS(
"#" ) ) )
492 if( refNum.compare( wxS(
"?" ) ) == 0 )
496 auto symMatchIt = aSyncSymMap.find( fullRef );
498 if( symMatchIt != aSyncSymMap.end() )
500 symMatchIt->second.emplace_back( schRef );
507 auto symPinMatchIt = aSyncPinMap.find( fullRef );
509 if( symPinMatchIt != aSyncPinMap.end() )
511 std::unordered_map<wxString, SCH_PIN*>& pinMap = symPinMatchIt->second;
512 std::vector<SCH_PIN*> pinsOnSheet = symbol->
GetPins( &aSheetPath );
516 int pinUnit =
pin->GetLibPin()->GetUnit();
518 if( pinUnit > 0 && pinUnit != schRef.
GetUnit() )
521 auto pinIt = pinMap.find(
pin->GetNumber() );
523 if( pinIt != pinMap.end() )
535 std::unordered_map<wxString, std::vector<SCH_REFERENCE>>& aSyncSymMap,
536 std::unordered_map<wxString, std::unordered_map<wxString, SCH_PIN*>>& aSyncPinMap,
537 std::unordered_map<SCH_SHEET_PATH, bool>& aCache )
539 auto cacheIt = aCache.find( aSheetPath );
541 if( cacheIt != aCache.end() )
542 return cacheIt->second;
551 aSyncPinMap, aCache );
555 aCache.emplace( aSheetPath,
false );
561 aSheetPath.
GetSymbols( references,
false,
true );
565 aCache.emplace( aSheetPath,
false );
569 for(
unsigned ii = 0; ii < references.
GetCount(); ii++ )
577 wxString fullRef = schRef.
GetRef() + refNum;
580 if( fullRef.StartsWith( wxS(
"#" ) ) )
584 if( refNum.compare( wxS(
"?" ) ) == 0 )
587 if( aSyncSymMap.find( fullRef ) == aSyncSymMap.end() )
589 aCache.emplace( aSheetPath,
false );
593 if( aSyncPinMap.find( fullRef ) != aSyncPinMap.end() )
595 aCache.emplace( aSheetPath,
false );
600 aCache.emplace( aSheetPath,
true );
605std::optional<std::tuple<SCH_SHEET_PATH, SCH_ITEM*, std::vector<SCH_ITEM*>>>
609 wxArrayString syncArray = wxStringTokenize( aSyncStr, wxS(
"," ) );
611 std::unordered_map<wxString, std::vector<SCH_REFERENCE>> syncSymMap;
612 std::unordered_map<wxString, std::unordered_map<wxString, SCH_PIN*>> syncPinMap;
613 std::unordered_map<SCH_SHEET_PATH, double> symScores;
614 std::unordered_map<SCH_SHEET_PATH, bool> fullyWantedCache;
616 std::optional<wxString> focusSymbol;
617 std::optional<std::pair<wxString, wxString>> focusPin;
618 std::unordered_map<SCH_SHEET_PATH, std::vector<SCH_ITEM*>> focusItemResults;
624 orderedSheets.reserve( allSheetsList.size() );
630 orderedSheets.push_back( sheetPath );
634 for(
size_t i = 0; i < syncArray.size(); i++ )
636 wxString syncEntry = syncArray[i];
638 if( syncEntry.empty() )
641 wxString syncData = syncEntry.substr( 1 );
643 switch( syncEntry.GetChar( 0 ).GetValue() )
649 if( aFocusOnFirst && ( i == 0 ) )
650 focusSymbol = symRef;
652 syncSymMap[symRef] = std::vector<SCH_REFERENCE>();
660 if( aFocusOnFirst && ( i == 0 ) )
661 focusPin = std::make_pair( symRef, padNum );
663 syncPinMap[symRef][padNum] =
nullptr;
671 auto flattenSyncMaps = [&syncSymMap, &syncPinMap]() -> std::vector<SCH_ITEM*>
673 std::vector<SCH_ITEM*> allVec;
675 for(
auto const& pairSym : syncSymMap )
683 for(
auto const& pairSym : syncPinMap )
685 for(
auto const& pairPin : pairSym.second )
688 allVec.push_back( pairPin.second );
695 auto clearSyncMaps = [&syncSymMap, &syncPinMap]()
697 for(
auto& pairSym : syncSymMap )
699 pairSym.second.clear();
702 for(
auto& pairSym : syncPinMap )
704 for(
auto& pairPin : pairSym.second )
706 pairPin.second =
nullptr;
711 auto syncMapsValuesEmpty = [&syncSymMap, &syncPinMap]() ->
bool
713 for(
auto const& pairSym : syncSymMap )
715 if( pairSym.second.size() > 0 )
719 for(
auto const& pairSym : syncPinMap )
721 for(
auto const& pairPin : pairSym.second )
735 auto findIt = syncSymMap.find( *focusSymbol );
736 if( findIt != syncSymMap.end() )
738 if( findIt->second.size() > 0 )
740 focusItemResults[aSheetPath].push_back( findIt->second.front().GetSymbol() );
746 auto findIt = syncPinMap.find( focusPin->first );
747 if( findIt != syncPinMap.end() )
749 if( findIt->second[focusPin->second] )
751 focusItemResults[aSheetPath].push_back( findIt->second[focusPin->second] );
763 std::vector<SCH_ITEM*> itemsVector = flattenSyncMaps();
769 kiidPath.push_back( item->m_Uuid );
771 std::optional<SCH_SHEET_PATH> subsheetPath =
780 itemsVector.push_back( item );
784 return std::make_tuple( aSheet, aFocusItem, itemsVector );
795 checkFocusItems( sheetPath );
798 if( focusItemResults.size() > 0 )
802 auto vec = focusItemResults[sheetPath];
805 return makeRetForSheet( sheetPath, vec.front() );
817 if( !syncMapsValuesEmpty() )
820 return makeRetForSheet( sheetPath,
nullptr );
840 if( !
eeconfig()->m_CrossProbing.on_selection )
853 std::string prefix =
"$SELECT: ";
855 std::string paramStr = payload.substr( prefix.size() );
857 if( paramStr.size() < 2 )
860 std::string syncStr = paramStr.substr( 2 );
862 bool focusOnFirst = ( paramStr[0] ==
'1' );
864 std::optional<std::tuple<SCH_SHEET_PATH, SCH_ITEM*, std::vector<SCH_ITEM*>>> findRet =
869 auto& [sheetPath, focusItem, items] = *findRet;
884 if( !payload.empty() )
886 wxString annotationMessage( payload );
907 KIID uuid( payload );
913 payload =
static_cast<SCH_SHEET*
>( item )->GetShownName(
false );
917 payload = item->GetFriendlyName();
946 std::stringstream ss( payload );
949 std::string formatStr;
950 wxCHECK( std::getline( ss, formatStr, delim ), );
952 std::string fnameStr;
953 wxCHECK( std::getline( ss, fnameStr, delim ), );
954 wxASSERT( !fnameStr.empty() );
960 importFormat = std::stoi( formatStr );
962 catch( std::invalid_argument& )
972 std::string key, value;
974 if( !std::getline( ss, key, delim ) )
977 std::getline( ss, value, delim );
979 props.emplace( key, value );
983 if( importFormat >= 0 )
984 importFile( fnameStr, importFormat, props.empty() ?
nullptr : &props );
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.
static TOOL_ACTION runERC
static TOOL_ACTION updateNetHighlighting
EE_TYPE OfType(KICAD_T aType) const
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
bool IsSingle() const
Is this KIFACE running under single_top?
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)
Send aPayload to aDestination from aSource.
Generate the KiCad netlist format supported by Pcbnew.
void Format(OUTPUTFORMATTER *aOutputFormatter, int aCtl)
Output this s-expression netlist into aOutputFormatter.
Holds all the data relating to one schematic.
SCH_SHEET_PATH & CurrentSheet() const override
void SetCurrentSheet(const SCH_SHEET_PATH &aPath) override
SCH_SHEET_LIST GetSheets() const override
Builds and returns an updated schematic hierarchy TODO: can this be cached?
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.
Handle actions specific to the schematic editor.
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
bool importFile(const wxString &aFileName, int aFileType, const STRING_UTF8_MAP *aProperties=nullptr)
Load the given filename but sets the path to the current project path.
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
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)
void SendCrossProbeNetName(const wxString &aNetName)
Send a net name to Pcbnew for highlighting.
void RecalculateConnections(SCH_COMMIT *aCommit, SCH_CLEANUP_FLAGS aCleanupFlags)
Generate the connection data for the entire schematic hierarchy.
void DisplayCurrentSheet()
Draw the current sheet on the display.
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 FocusOnItem(SCH_ITEM *aItem)
void KiwayMailIn(KIWAY_EXPRESS &aEvent) override
Receive KIWAY_EXPRESS messages from other players.
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()
Gets 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.
SCH_ITEM * GetItem(const KIID &aID, SCH_SHEET_PATH *aPathOut=nullptr) const
Fetch a SCH_ITEM by ID.
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 wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const
Return the reference for the given sheet path.
SCH_FIELD * GetField(MANDATORY_FIELD_T aFieldType)
Return a mandatory field in this symbol.
std::vector< SCH_PIN * > GetPins(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve a list of the SCH_PINs for the given sheet path.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
SCH_PIN * GetPin(const wxString &number) const
Find a symbol pin by number.
A name/value tuple with unique names and optional values.
bool SendCommand(int aService, const std::string &aMessage)
Used by a client to sent (by a socket connection) a data to a server.
bool findSymbolsAndPins(const SCHEMATIC &aSchematic, 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)
std::optional< std::tuple< SCH_SHEET_PATH, SCH_ITEM *, std::vector< SCH_ITEM * > > > findItemsFromSyncSelection(const SCHEMATIC &aSchematic, const std::string aSyncStr, bool aFocusOnFirst)
bool sheetContainsOnlyWantedItems(const SCHEMATIC &aSchematic, 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)
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
@ ALL
All except INITIAL_ADD.
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.
std::vector< SCH_SHEET_PATH > SCH_SHEET_PATHS
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
Field Reference of part, i.e. "IC21".