47 const wxString& aSearchText )
56 if( !aSearchHierarchy )
75 found = ( *aPath ==
path );
79 found = ( aReference && aReference->CmpNoCase( candidate->
GetRef( &sheet ) ) == 0 );
85 sheetWithSymbolFound = &sheet;
96 int unit =
pin->GetLibPin()->GetUnit();
98 if( unit != 0 && unit != symbol->
GetUnit() )
105 pos =
pin->GetPosition();
155 displayRef = *aReference;
164 msg.Printf(
_(
"%s pin %s found" ), displayRef, aSearchText );
166 msg.Printf(
_(
"%s found but pin %s not found" ), displayRef, aSearchText );
170 msg.Printf(
_(
"%s found" ), displayRef );
175 msg.Printf(
_(
"%s not found" ), displayRef );
205 strncpy( line, cmdline,
sizeof( line ) - 1 );
206 line[
sizeof( line ) - 1 ] =
'\0';
208 char* idcmd = strtok( line,
" \n\r" );
209 char*
text = strtok(
nullptr,
"\"\n\r" );
211 if( idcmd ==
nullptr )
216 if( strcmp( idcmd,
"$CONFIG" ) == 0 )
221 else if( strcmp( idcmd,
"$ERC" ) == 0 )
226 else if( strcmp( idcmd,
"$NET:" ) == 0 )
233 if(
auto sg =
Schematic().ConnectionGraph()->FindFirstSubgraphByName( netName ) )
240 SetStatusText(
_(
"Selected net:" ) + wxS(
" " ) +
UnescapeString( netName ) );
243 else if( strcmp( idcmd,
"$CLEAR:" ) == 0 )
252 if(
text ==
nullptr )
255 if( strcmp( idcmd,
"$PART:" ) != 0 )
261 idcmd = strtok(
nullptr,
" \n\r" );
263 if( idcmd ==
nullptr )
270 text = strtok(
nullptr,
"\"\n\r" );
272 if(
text ==
nullptr )
277 if( strcmp( idcmd,
"$REF:" ) == 0 )
283 else if( strcmp( idcmd,
"$VAL:" ) == 0 )
289 else if( strcmp( idcmd,
"$PAD:" ) == 0 )
302 std::vector<wxString> parts;
306 switch( item->Type() )
326 parts.push_back( wxT(
"S" ) + full_path );
353 std::string command =
"$SELECT: 0,";
355 for( wxString part : parts )
384 if( !packet.empty() )
409 if( aConnection->
IsNet() )
415 if( aConnection->
Members().empty() )
420 wxString nets = all_members[0]->Name();
422 if( all_members.size() == 1 )
432 for(
size_t i = 1; i < all_members.size(); i++ )
433 nets <<
"," << all_members[i]->Name();
437 if( !packet.empty() )
454 std::string packet =
"$CLEAR\n";
472 std::unordered_map<wxString, std::vector<SCH_REFERENCE>>& aSyncSymMap,
473 std::unordered_map<wxString, std::unordered_map<wxString, SCH_PIN*>>& aSyncPinMap,
474 bool aRecursive =
false )
490 aSheetPath.
GetSymbols( references,
false,
true );
492 for(
unsigned ii = 0; ii < references.
GetCount(); ii++ )
501 wxString fullRef = schRef.
GetRef() + refNum;
504 if( fullRef.StartsWith( wxS(
"#" ) ) )
508 if( refNum.compare( wxS(
"?" ) ) == 0 )
512 auto symMatchIt = aSyncSymMap.find( fullRef );
514 if( symMatchIt != aSyncSymMap.end() )
516 symMatchIt->second.emplace_back( schRef );
523 auto symPinMatchIt = aSyncPinMap.find( fullRef );
525 if( symPinMatchIt != aSyncPinMap.end() )
527 std::unordered_map<wxString, SCH_PIN*>& pinMap = symPinMatchIt->second;
528 std::vector<SCH_PIN*> pinsOnSheet = symbol->
GetPins( &aSheetPath );
532 int pinUnit =
pin->GetLibPin()->GetUnit();
534 if( pinUnit > 0 && pinUnit != schRef.
GetUnit() )
537 auto pinIt = pinMap.find(
pin->GetNumber() );
539 if( pinIt != pinMap.end() )
551 std::unordered_map<wxString, std::vector<SCH_REFERENCE>>& aSyncSymMap,
552 std::unordered_map<wxString, std::unordered_map<wxString, SCH_PIN*>>& aSyncPinMap,
553 std::unordered_map<SCH_SHEET_PATH, bool>& aCache )
555 auto cacheIt = aCache.find( aSheetPath );
557 if( cacheIt != aCache.end() )
558 return cacheIt->second;
567 aSyncPinMap, aCache );
571 aCache.emplace( aSheetPath,
false );
577 aSheetPath.
GetSymbols( references,
false,
true );
581 aCache.emplace( aSheetPath,
false );
585 for(
unsigned ii = 0; ii < references.
GetCount(); ii++ )
593 wxString fullRef = schRef.
GetRef() + refNum;
596 if( fullRef.StartsWith( wxS(
"#" ) ) )
600 if( refNum.compare( wxS(
"?" ) ) == 0 )
603 if( aSyncSymMap.find( fullRef ) == aSyncSymMap.end() )
605 aCache.emplace( aSheetPath,
false );
609 if( aSyncPinMap.find( fullRef ) != aSyncPinMap.end() )
611 aCache.emplace( aSheetPath,
false );
616 aCache.emplace( aSheetPath,
true );
621std::optional<std::tuple<SCH_SHEET_PATH, SCH_ITEM*, std::vector<SCH_ITEM*>>>
625 wxArrayString syncArray = wxStringTokenize( aSyncStr, wxS(
"," ) );
627 std::unordered_map<wxString, std::vector<SCH_REFERENCE>> syncSymMap;
628 std::unordered_map<wxString, std::unordered_map<wxString, SCH_PIN*>> syncPinMap;
629 std::unordered_map<SCH_SHEET_PATH, double> symScores;
630 std::unordered_map<SCH_SHEET_PATH, bool> fullyWantedCache;
632 std::optional<wxString> focusSymbol;
633 std::optional<std::pair<wxString, wxString>> focusPin;
634 std::unordered_map<SCH_SHEET_PATH, std::vector<SCH_ITEM*>> focusItemResults;
640 orderedSheets.reserve( allSheetsList.size() );
646 orderedSheets.push_back( sheetPath );
650 for(
size_t i = 0; i < syncArray.size(); i++ )
652 wxString syncEntry = syncArray[i];
654 if( syncEntry.empty() )
657 wxString syncData = syncEntry.substr( 1 );
659 switch( syncEntry.GetChar( 0 ).GetValue() )
665 if( aFocusOnFirst && ( i == 0 ) )
666 focusSymbol = symRef;
668 syncSymMap[symRef] = std::vector<SCH_REFERENCE>();
676 if( aFocusOnFirst && ( i == 0 ) )
677 focusPin = std::make_pair( symRef, padNum );
679 syncPinMap[symRef][padNum] =
nullptr;
687 auto flattenSyncMaps = [&syncSymMap, &syncPinMap]() -> std::vector<SCH_ITEM*>
689 std::vector<SCH_ITEM*> allVec;
691 for(
auto const& pairSym : syncSymMap )
699 for(
auto const& pairSym : syncPinMap )
701 for(
auto const& pairPin : pairSym.second )
704 allVec.push_back( pairPin.second );
711 auto clearSyncMaps = [&syncSymMap, &syncPinMap]()
713 for(
auto& pairSym : syncSymMap )
715 pairSym.second.clear();
718 for(
auto& pairSym : syncPinMap )
720 for(
auto& pairPin : pairSym.second )
722 pairPin.second =
nullptr;
727 auto syncMapsValuesEmpty = [&syncSymMap, &syncPinMap]() ->
bool
729 for(
auto const& pairSym : syncSymMap )
731 if( pairSym.second.size() > 0 )
735 for(
auto const& pairSym : syncPinMap )
737 for(
auto const& pairPin : pairSym.second )
751 auto findIt = syncSymMap.find( *focusSymbol );
752 if( findIt != syncSymMap.end() )
754 if( findIt->second.size() > 0 )
756 focusItemResults[aSheetPath].push_back( findIt->second.front().GetSymbol() );
762 auto findIt = syncPinMap.find( focusPin->first );
763 if( findIt != syncPinMap.end() )
765 if( findIt->second[focusPin->second] )
767 focusItemResults[aSheetPath].push_back( findIt->second[focusPin->second] );
779 std::vector<SCH_ITEM*> itemsVector = flattenSyncMaps();
785 kiidPath.push_back( item->m_Uuid );
787 std::optional<SCH_SHEET_PATH> subsheetPath =
796 itemsVector.push_back( item );
800 return std::make_tuple( aSheet, aFocusItem, itemsVector );
811 checkFocusItems( sheetPath );
814 if( focusItemResults.size() > 0 )
818 auto vec = focusItemResults[sheetPath];
821 return makeRetForSheet( sheetPath, vec.front() );
833 if( !syncMapsValuesEmpty() )
836 return makeRetForSheet( sheetPath,
nullptr );
856 if( !
eeconfig()->m_CrossProbing.on_selection )
869 std::string prefix =
"$SELECT: ";
871 std::string paramStr = payload.substr( prefix.size() );
873 if( paramStr.size() < 2 )
876 std::string syncStr = paramStr.substr( 2 );
878 bool focusOnFirst = ( paramStr[0] ==
'1' );
880 std::optional<std::tuple<SCH_SHEET_PATH, SCH_ITEM*, std::vector<SCH_ITEM*>>> findRet =
885 auto& [sheetPath, focusItem, items] = *findRet;
900 if( !payload.empty() )
902 wxString annotationMessage( payload );
944 size_t split = payload.find(
'\n' );
945 wxCHECK(
split != std::string::npos, );
950 importFormat = std::stoi( payload.substr( 0,
split ) );
952 catch( std::invalid_argument& )
958 std::string
path = payload.substr(
split + 1 );
959 wxASSERT( !
path.empty() );
961 if( importFormat >= 0 )
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
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.
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 RecalculateConnections(SCH_CLEANUP_FLAGS aCleanupFlags)
Generate the connection data for the entire schematic hierarchy.
void SendCrossProbeNetName(const wxString &aNetName)
Send a net name to Pcbnew for highlighting.
bool importFile(const wxString &aFileName, int aFileType)
Load the given filename but sets the path to the current project path.
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.
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.
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.
VECTOR2I GetPosition() const override
SCH_PIN * GetPin(const wxString &number) const
Find a symbol pin by number.
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 ...
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
static wxString FROM_UTF8(const char *cstring)
Convert a UTF8 encoded C string to a wxString for all wxWidgets build modes.
@ 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 EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
static std::vector< std::string > split(const std::string &aStr, const std::string &aDelim)
Split the input string into a vector of output strings.
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".