KiCad PCB EDA Suite
Loading...
Searching...
No Matches
net_navigator.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2023 Rivos
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * @author Wayne Stambaugh <[email protected]>
8 *
9 * This program is free software: you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation, either version 3 of the License, or (at your
12 * option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23#include <wx/log.h>
24#include <wx/wupdlock.h>
25#include <core/profile.h>
26#include <tool/tool_manager.h>
27#include <kiface_base.h>
28#include <sch_edit_frame.h>
29#include <sch_bus_entry.h>
30#include <sch_line.h>
31#include <sch_junction.h>
32#include <sch_no_connect.h>
33#include <sch_sheet_pin.h>
34#include <string_utils.h>
35#include <trace_helpers.h>
36#include <connection_graph.h>
38#include <tools/sch_actions.h>
39
40
41static wxString GetNetNavigatorItemText( const SCH_ITEM* aItem,
42 const SCH_SHEET_PATH& aSheetPath,
43 UNITS_PROVIDER* aUnitsProvider )
44{
45 wxString retv;
46
47 wxCHECK( aItem && aUnitsProvider, retv );
48
49 switch( aItem->Type() )
50 {
51 case SCH_LINE_T:
52 {
53 const SCH_LINE* line = static_cast<const SCH_LINE*>( aItem );
54
55 if( aItem->GetLayer() == LAYER_WIRE )
56 {
57 retv.Printf( _( "Wire from %s, %s to %s, %s" ),
58 aUnitsProvider->MessageTextFromValue( line->GetStartPoint().x ),
59 aUnitsProvider->MessageTextFromValue( line->GetStartPoint().y ),
60 aUnitsProvider->MessageTextFromValue( line->GetEndPoint().x ),
61 aUnitsProvider->MessageTextFromValue( line->GetEndPoint().y ) );
62 }
63 else if( aItem->GetLayer() == LAYER_BUS )
64 {
65 retv.Printf( _( "Bus from %s, %s to %s, %s" ),
66 aUnitsProvider->MessageTextFromValue( line->GetStartPoint().x ),
67 aUnitsProvider->MessageTextFromValue( line->GetStartPoint().y ),
68 aUnitsProvider->MessageTextFromValue( line->GetEndPoint().x ),
69 aUnitsProvider->MessageTextFromValue( line->GetEndPoint().y ) );
70 }
71 else
72 {
73 retv = _( "Graphic line not connectable" );
74 }
75
76 break;
77 }
78 case SCH_PIN_T:
79 {
80 const SCH_PIN* pin = static_cast<const SCH_PIN*>( aItem );
81
82 if( const SYMBOL* symbol = pin->GetParentSymbol() )
83 {
84 retv.Printf( _( "Symbol '%s' pin '%s'" ),
85 symbol->GetRef( &aSheetPath, true ),
86 UnescapeString( pin->GetNumber() ) );
87
88 if( wxString pinName = UnescapeString( pin->GetShownName() ); !pinName.IsEmpty() )
89 {
90 retv += wxString::Format( " (%s)", pinName );
91 }
92 }
93
94 break;
95 }
96 case SCH_SHEET_PIN_T:
97 {
98 const SCH_SHEET_PIN* pin = static_cast<const SCH_SHEET_PIN*>( aItem );
99
100 if( SCH_SHEET* sheet = pin->GetParent() )
101 {
102 retv.Printf( _( "Sheet '%s' pin '%s'" ),
103 sheet->GetName(),
104 UnescapeString( pin->GetText() ) );
105 }
106
107 break;
108 }
109 case SCH_LABEL_T:
110 {
111 const SCH_LABEL* label = static_cast<const SCH_LABEL*>( aItem );
112
113 retv.Printf( _( "Label '%s' at %s, %s" ),
114 UnescapeString( label->GetText() ),
115 aUnitsProvider->MessageTextFromValue( label->GetPosition().x ),
116 aUnitsProvider->MessageTextFromValue( label->GetPosition().y ) );
117 break;
118 }
120 {
121 const SCH_GLOBALLABEL* label = static_cast<const SCH_GLOBALLABEL*>( aItem );
122
123 retv.Printf( _( "Global label '%s' at %s, %s" ),
124 UnescapeString( label->GetText() ),
125 aUnitsProvider->MessageTextFromValue( label->GetPosition().x ),
126 aUnitsProvider->MessageTextFromValue( label->GetPosition().y ) );
127 break;
128 }
129 case SCH_HIER_LABEL_T:
130 {
131 const SCH_HIERLABEL* label = static_cast<const SCH_HIERLABEL*>( aItem );
132
133 retv.Printf( _( "Hierarchical label '%s' at %s, %s" ),
134 UnescapeString( label->GetText() ),
135 aUnitsProvider->MessageTextFromValue( label->GetPosition().x ),
136 aUnitsProvider->MessageTextFromValue( label->GetPosition().y ) );
137 break;
138 }
139 case SCH_JUNCTION_T:
140 {
141 const SCH_JUNCTION* junction = static_cast<const SCH_JUNCTION*>( aItem );
142
143 retv.Printf( _( "Junction at %s, %s" ),
144 aUnitsProvider->MessageTextFromValue( junction->GetPosition().x ),
145 aUnitsProvider->MessageTextFromValue( junction->GetPosition().y ) );
146 break;
147 }
148 case SCH_NO_CONNECT_T:
149 {
150 const SCH_NO_CONNECT* nc = static_cast<const SCH_NO_CONNECT*>( aItem );
151
152 retv.Printf( _( "No-Connect at %s, %s" ),
153 aUnitsProvider->MessageTextFromValue( nc->GetPosition().x ),
154 aUnitsProvider->MessageTextFromValue( nc->GetPosition().y ) );
155 break;
156 }
158 {
159 const SCH_BUS_WIRE_ENTRY* entry = static_cast<const SCH_BUS_WIRE_ENTRY*>( aItem );
160
161 retv.Printf( _( "Bus to wire entry from %s, %s to %s, %s" ),
162 aUnitsProvider->MessageTextFromValue( entry->GetPosition().x ),
163 aUnitsProvider->MessageTextFromValue( entry->GetPosition().y ),
164 aUnitsProvider->MessageTextFromValue( entry->GetEnd().x ),
165 aUnitsProvider->MessageTextFromValue( entry->GetEnd().y ) );
166 break;
167 }
169 {
170 const SCH_BUS_BUS_ENTRY* entry = static_cast<const SCH_BUS_BUS_ENTRY*>( aItem );
171
172 retv.Printf( _( "Bus to bus entry from %s, %s to %s, %s" ),
173 aUnitsProvider->MessageTextFromValue( entry->GetPosition().x ),
174 aUnitsProvider->MessageTextFromValue( entry->GetPosition().y ),
175 aUnitsProvider->MessageTextFromValue( entry->GetEnd().x ),
176 aUnitsProvider->MessageTextFromValue( entry->GetEnd().y ) );
177 break;
178 }
180 {
181 const SCH_DIRECTIVE_LABEL* entry = static_cast<const SCH_DIRECTIVE_LABEL*>( aItem );
182
183 retv.Printf( _( "Netclass label '%s' at %s, %s" ),
184 UnescapeString( entry->GetText() ),
185 aUnitsProvider->MessageTextFromValue( entry->GetPosition().x ),
186 aUnitsProvider->MessageTextFromValue( entry->GetPosition().y ) );
187 break;
188 }
189 default:
190 retv.Printf( _( "Unhandled item type %d" ), aItem->Type() );
191 }
192
193 return retv;
194}
195
196
197void SCH_EDIT_FRAME::MakeNetNavigatorNode( const wxString& aNetName, wxTreeItemId aParentId,
198 const NET_NAVIGATOR_ITEM_DATA* aSelection,
199 bool aSingleSheetSchematic )
200{
201 wxCHECK( !aNetName.IsEmpty(), /* void */ );
202 wxCHECK( m_schematic, /* void */ );
203 wxCHECK( m_netNavigator, /* void */ );
204
205 wxTreeItemId expandId = aParentId;
206 CONNECTION_GRAPH* connectionGraph = m_schematic->ConnectionGraph();
207
208 wxCHECK( connectionGraph, /* void */ );
209
210 std::set<CONNECTION_SUBGRAPH*> subgraphs;
211
212 {
213 const std::vector<CONNECTION_SUBGRAPH*>& tmp = connectionGraph->GetAllSubgraphs( aNetName );
214 subgraphs.insert( tmp.begin(), tmp.end() );
215 }
216
217 for( CONNECTION_SUBGRAPH* sg : subgraphs )
218 {
219 for( const auto& [_, bus_sgs] : sg->GetBusParents() )
220 {
221 for( const CONNECTION_SUBGRAPH* bus_sg : bus_sgs )
222 {
223 const std::vector<CONNECTION_SUBGRAPH*>& tmp =
224 connectionGraph->GetAllSubgraphs( bus_sg->GetNetName() );
225 subgraphs.insert( tmp.begin(), tmp.end() );
226 }
227 }
228 }
229
230 std::map<wxString, wxTreeItemId> sheetIds;
231
232 for( const CONNECTION_SUBGRAPH* subGraph : subgraphs )
233 {
234 NET_NAVIGATOR_ITEM_DATA* itemData = nullptr;
235 SCH_SHEET_PATH sheetPath = subGraph->GetSheet();
236
237 wxCHECK2( subGraph && sheetPath.Last(), continue );
238
239 if( subGraph->GetItems().empty() )
240 continue;
241
242 itemData = new NET_NAVIGATOR_ITEM_DATA( sheetPath, nullptr );
243
244 bool stripTrailingSeparator = !sheetPath.Last()->IsRootSheet();
245 wxString txt = sheetPath.PathHumanReadable( true, stripTrailingSeparator );
246
247 wxTreeItemId sheetId;
248
249 if( auto sheetIdIt = sheetIds.find( txt ); sheetIdIt != sheetIds.end() )
250 {
251 sheetId = sheetIdIt->second;
252 }
253 else
254 {
255 sheetIds[txt] = m_netNavigator->AppendItem( aParentId, txt, -1, -1, itemData );
256 sheetId = sheetIds[txt];
257 }
258
259 if( aSelection && *aSelection == *itemData )
260 m_netNavigator->SelectItem( sheetId );
261
262 // If there is only one sheet in the schematic, always expand the sheet tree.
263 if( aSingleSheetSchematic )
264 expandId = sheetId;
265
266 for( const SCH_ITEM* item : subGraph->GetItems() )
267 {
268 if( item->Type() == SCH_LINE_T
269 || item->Type() == SCH_JUNCTION_T
270 || item->Type() == SCH_BUS_WIRE_ENTRY_T
271 || item->Type() == SCH_BUS_BUS_ENTRY_T )
272 {
273 continue;
274 }
275
276 itemData = new NET_NAVIGATOR_ITEM_DATA( sheetPath, item );
277 wxTreeItemId id = m_netNavigator->AppendItem( sheetId,
278 GetNetNavigatorItemText( item, sheetPath, this ),
279 -1, -1, itemData );
280
281 if( aSelection && *aSelection == *itemData )
282 {
283 expandId = sheetId;
284 m_netNavigator->EnsureVisible( id );
285 m_netNavigator->SelectItem( id );
286 }
287 }
288
289 m_netNavigator->SortChildren( sheetId );
290 }
291
292 // Sort the items in the tree control alphabetically
293 m_netNavigator->SortChildren( aParentId );
294 m_netNavigator->Expand( aParentId );
295}
296
297
299{
300 wxCHECK( m_netNavigator, /* void */ );
301
302 if( !m_netNavigator->IsShown() )
303 return;
304
305 bool singleSheetSchematic = m_schematic->Hierarchy().size() == 1;
306 size_t nodeCnt = 0;
307
308 wxWindowUpdateLocker updateLock( m_netNavigator );
309 PROF_TIMER timer;
310
311 if( m_highlightedConn.IsEmpty() )
312 {
313 m_netNavigator->DeleteAllItems();
314
315 // Create a tree of all nets in the schematic.
316 wxTreeItemId rootId = m_netNavigator->AddRoot( _( "Nets" ), 0 );
317
318 const NET_MAP& netMap = m_schematic->ConnectionGraph()->GetNetMap();
319
320 for( const auto& net : netMap )
321 {
322 // Skip bus member subgraphs for the moment.
323 if( net.first.Name.IsEmpty() )
324 continue;
325
326 nodeCnt++;
327 wxTreeItemId netId = m_netNavigator->AppendItem( rootId, UnescapeString( net.first.Name ) );
328 MakeNetNavigatorNode( net.first.Name, netId, aSelection, singleSheetSchematic );
329 }
330
331 m_netNavigator->Expand( rootId );
332 }
333 else if( !m_netNavigator->IsEmpty() )
334 {
335 const wxString shownNetName = m_netNavigator->GetItemText( m_netNavigator->GetRootItem() );
336
337 if( shownNetName != m_highlightedConn )
338 {
339 m_netNavigator->DeleteAllItems();
340
341 nodeCnt++;
342
343 wxTreeItemId rootId = m_netNavigator->AddRoot( UnescapeString( m_highlightedConn ), 0 );
344
345 MakeNetNavigatorNode( m_highlightedConn, rootId, aSelection, singleSheetSchematic );
346 }
347 else
348 {
349 NET_NAVIGATOR_ITEM_DATA* itemData = nullptr;
350
351 wxTreeItemId selection = m_netNavigator->GetSelection();
352
353 if( selection.IsOk() )
354 itemData = dynamic_cast<NET_NAVIGATOR_ITEM_DATA*>( m_netNavigator->GetItemData( selection ) );
355
356 m_netNavigator->DeleteAllItems();
357 nodeCnt++;
358
359 wxTreeItemId rootId = m_netNavigator->AddRoot( UnescapeString( m_highlightedConn ), 0 );
360
361 MakeNetNavigatorNode( m_highlightedConn, rootId, itemData, singleSheetSchematic );
362 }
363 }
364 else
365 {
366 nodeCnt++;
367
368 wxTreeItemId rootId = m_netNavigator->AddRoot( UnescapeString( m_highlightedConn ), 0 );
369
370 MakeNetNavigatorNode( m_highlightedConn, rootId, aSelection, singleSheetSchematic );
371 }
372
373 timer.Stop();
374
375 wxLogTrace( traceUiProfile, wxS( "Adding %zu nodes to net navigator took %s." ),
376 nodeCnt, timer.to_string() );
377}
378
379
381{
382 wxCHECK( m_netNavigator, nullptr );
383
384 wxTreeItemId id = m_netNavigator->GetSelection();
385
386 if( !id.IsOk() )
387 return nullptr;
388
389 wxTreeItemId nextId;
390 wxTreeItemId netNode = m_netNavigator->GetRootItem();
391
392 std::vector<wxTreeItemId> netItems;
393 std::list<wxTreeItemId> itemList;
394 itemList.push_back( netNode );
395
396 while( !itemList.empty() )
397 {
398 wxTreeItemId current = itemList.front();
399 itemList.pop_front();
400
401 wxTreeItemIdValue cookie;
402 wxTreeItemId child = m_netNavigator->GetFirstChild( current, cookie );
403
404 while( child.IsOk() )
405 {
406 if( m_netNavigator->ItemHasChildren( child ) )
407 itemList.push_back( child );
408 else
409 netItems.push_back( child );
410
411 child = m_netNavigator->GetNextSibling( child );
412 }
413 }
414
415 // Locate current item and move forward or backward with wrap
416 auto it = std::find( netItems.begin(), netItems.end(), id );
417
418 if( it != netItems.end() )
419 {
420 if( aNext )
421 {
422 ++it;
423 if( it == netItems.end() )
424 it = netItems.begin();
425 }
426 else
427 {
428 if( it == netItems.begin() )
429 it = netItems.end();
430 --it;
431 }
432 nextId = *it;
433 }
434
435 if( nextId.IsOk() )
436 {
437 if( !m_netNavigator->IsVisible( nextId ) )
438 {
439 m_netNavigator->CollapseAll();
440 m_netNavigator->EnsureVisible( nextId );
441 }
442
443 m_netNavigator->UnselectAll();
444 m_netNavigator->SelectItem( nextId );
445
446 auto* data = static_cast<NET_NAVIGATOR_ITEM_DATA*>( m_netNavigator->GetItemData( nextId ) );
447
448 if( data && data->GetItem() )
449 return data->GetItem();
450 }
451
452 return nullptr;
453}
454
455
457{
458 wxCHECK( m_netNavigator, /* void */ );
459 wxCHECK( !m_netNavigator->IsFrozen(), /* void */ );
460
461 // Maybe in the future we can do something like collapse the tree for an empty selection.
462 // For now, leave the tree selection in its current state.
463 if( !aSelection )
464 return;
465
466 wxTreeItemId rootId = m_netNavigator->GetRootItem();
467
468 if( !rootId.IsOk() )
469 return;
470
471 wxTreeItemIdValue sheetCookie;
472 NET_NAVIGATOR_ITEM_DATA* itemData = nullptr;
473 wxTreeItemId sheetId = m_netNavigator->GetFirstChild( rootId, sheetCookie );
474
475 while( sheetId.IsOk() )
476 {
477 if( m_netNavigator->ItemHasChildren( sheetId ) )
478 {
479 wxTreeItemIdValue itemCookie;
480 wxTreeItemId itemId = m_netNavigator->GetFirstChild( sheetId, itemCookie );
481
482 while( itemId.IsOk() )
483 {
484 itemData = dynamic_cast<NET_NAVIGATOR_ITEM_DATA*>( m_netNavigator->GetItemData( itemId ) );
485
486 wxCHECK2( itemData, continue );
487
488 if( *itemData == *aSelection )
489 {
490 if( !m_netNavigator->IsVisible( itemId ) )
491 {
492 m_netNavigator->CollapseAll();
493 m_netNavigator->EnsureVisible( itemId );
494 }
495
496 m_netNavigator->SelectItem( itemId );
497 return;
498 }
499
500 itemId = m_netNavigator->GetNextSibling( itemId );
501 }
502
503 sheetId = m_netNavigator->GetNextSibling( sheetId );
504 }
505 }
506}
507
508
510{
511 if( !m_netNavigator || m_netNavigator->IsFrozen() )
512 return nullptr;
513
514 wxTreeItemId id = m_netNavigator->GetSelection();
515
516 if( !id.IsOk() || ( id == m_netNavigator->GetRootItem() ) )
517 return nullptr;
518
519 auto* itemData = dynamic_cast<NET_NAVIGATOR_ITEM_DATA*>( m_netNavigator->GetItemData( id ) );
520
521 wxCHECK( itemData, nullptr );
522
523 return itemData->GetItem();
524}
525
526
528{
529 if( !m_netNavigator || m_netNavigator->IsFrozen() )
530 return;
531
532 wxTreeItemId id = aEvent.GetItem();
533
534 // Clicking on the root item (net name ) does nothing.
535 if( id == m_netNavigator->GetRootItem() )
536 return;
537
538 auto* itemData = dynamic_cast<NET_NAVIGATOR_ITEM_DATA*>( m_netNavigator->GetItemData( id ) );
539
540 // Just a net name when we have all nets displayed.
541 if( !itemData )
542 return;
543
544 if( GetCurrentSheet() != itemData->GetSheetPath() )
545 GetToolManager()->RunAction<SCH_SHEET_PATH*>( SCH_ACTIONS::changeSheet, &itemData->GetSheetPath() );
546
547 // Do not focus on item when a sheet tree node is selected.
548 if( m_netNavigator->GetItemParent( id ) != m_netNavigator->GetRootItem() && itemData->GetItem() )
549 {
550 // Make sure we didn't remove the item and/or the screen it resides on before we access it.
551 const SCH_ITEM* item = itemData->GetItem();
552
553 // Don't search for child items in screen r-tree.
554 item = ( item->Type() == SCH_SHEET_PIN_T || item->Type() == SCH_PIN_T )
555 ? static_cast<const SCH_ITEM*>( item->GetParent() )
556 : item;
557
558 const SCH_SCREEN* screen = itemData->GetSheetPath().LastScreen();
559
560 wxCHECK( screen, /* void */ );
561 wxCHECK( screen->Items().contains( item, true ), /* void */ );
562
563 FocusOnLocation( itemData->GetItem()->GetBoundingBox().Centre() );
564 }
565
566 GetCanvas()->Refresh();
567}
568
569
571{
572 if( !m_netNavigator || m_netNavigator->IsFrozen() )
573 return;
574
575 aEvent.Skip();
576}
577
578
580{
582
583 wxCHECK( cfg, /* void */ );
584
585 wxAuiPaneInfo& netNavigatorPane = m_auimgr.GetPane( NetNavigatorPaneName() );
586
587 netNavigatorPane.Show( !netNavigatorPane.IsShown() );
589
590 cfg->m_AuiPanels.show_net_nav_panel = netNavigatorPane.IsShown();
591
592 if( netNavigatorPane.IsShown() )
593 {
594 if( netNavigatorPane.IsFloating() )
595 {
596 netNavigatorPane.FloatingSize( cfg->m_AuiPanels.net_nav_panel_float_size );
597 m_auimgr.Update();
598 }
599 else if( cfg->m_AuiPanels.net_nav_panel_docked_size.GetWidth() > 0 )
600 {
601 // SetAuiPaneSize also updates m_auimgr
602 SetAuiPaneSize( m_auimgr, netNavigatorPane,
603 cfg->m_AuiPanels.net_nav_panel_docked_size.GetWidth(), -1 );
604 }
605 }
606 else
607 {
608 if( netNavigatorPane.IsFloating() )
609 {
610 cfg->m_AuiPanels.net_nav_panel_float_size = netNavigatorPane.floating_size;
611 }
612 else
613 {
615 }
616
617 m_auimgr.Update();
618 }
619
620 if( netNavigatorPane.IsShown() )
621 {
622 NET_NAVIGATOR_ITEM_DATA* itemData = nullptr;
623
624 wxTreeItemId selection = m_netNavigator->GetSelection();
625
626 if( selection.IsOk() )
627 itemData = dynamic_cast<NET_NAVIGATOR_ITEM_DATA*>( m_netNavigator->GetItemData( selection ) );
628
629 RefreshNetNavigator( itemData );
630 }
631}
632
633
634void SCH_EDIT_FRAME::onResizeNetNavigator( wxSizeEvent& aEvent )
635{
636 aEvent.Skip();
637
638 // Called when resizing the Hierarchy Navigator panel
639 // Store the current pane size
640 // It allows to retrieve the last defined pane size when switching between
641 // docked and floating pane state
642 // Note: *DO NOT* call m_auimgr.Update() here: it crashes KiCad at least on Windows
643
644 EESCHEMA_SETTINGS* cfg = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
645
646 wxCHECK( cfg, /* void */ );
647
648 wxAuiPaneInfo& netNavigatorPane = m_auimgr.GetPane( NetNavigatorPaneName() );
649
650 if( m_netNavigator->IsShownOnScreen() )
651 {
652 cfg->m_AuiPanels.net_nav_panel_float_size = netNavigatorPane.floating_size;
653
654 // initialize net_nav_panel_docked_width and best size only if the netNavigatorPane
655 // width is > 0 (i.e. if its size is already set and has meaning)
656 // if it is floating, its size is not initialized (only floating_size is initialized)
657 // initializing netNavigatorPane.best_size is useful when switching to float pane and
658 // after switching to the docked pane, to retrieve the last docked pane width
659 if( netNavigatorPane.rect.width > 50 ) // 50 is a good margin
660 {
661 cfg->m_AuiPanels.net_nav_panel_docked_size.SetWidth( netNavigatorPane.rect.width );
662 netNavigatorPane.best_size.x = netNavigatorPane.rect.width;
663 }
664 }
665}
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
Calculate the connectivity of a schematic and generates netlists.
const NET_MAP & GetNetMap() const
const std::vector< CONNECTION_SUBGRAPH * > & GetAllSubgraphs(const wxString &aNetName) const
A subgraph is a set of items that are electrically connected on a single sheet.
wxAuiManager m_auimgr
void FocusOnLocation(const VECTOR2I &aPos)
Useful to focus on a particular location, in find functions.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:110
EDA_ITEM * GetParent() const
Definition: eda_item.h:112
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:97
bool contains(const SCH_ITEM *aItem, bool aRobust=false) const
Determine if a given item exists in the tree.
Definition: sch_rtree.h:128
APP_SETTINGS_BASE * KifaceSettings() const
Definition: kiface_base.h:95
Tree view item data for the net navigator.
const SCH_ITEM * GetItem() const
A small class to help profiling.
Definition: profile.h:49
void Stop()
Save the time when this function was called, and set the counter stane to stop.
Definition: profile.h:88
std::string to_string()
Definition: profile.h:155
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
Definition: schematic.cpp:258
CONNECTION_GRAPH * ConnectionGraph() const
Definition: schematic.h:183
static TOOL_ACTION changeSheet
Definition: sch_actions.h:217
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
EESCHEMA_SETTINGS * eeconfig() const
Class for a bus to bus entry.
VECTOR2I GetPosition() const override
VECTOR2I GetEnd() const
Class for a wire to bus entry.
wxTreeCtrl * m_netNavigator
void ToggleNetNavigator()
void onResizeNetNavigator(wxSizeEvent &aEvent)
void updateSelectionFilterVisbility() override
Selection filter panel doesn't have a dedicated visibility control, so show it if any other AUI panel...
void onNetNavigatorSelChanging(wxTreeEvent &aEvent)
void MakeNetNavigatorNode(const wxString &aNetName, wxTreeItemId aParentId, const NET_NAVIGATOR_ITEM_DATA *aSelection, bool aSingleSheetSchematic)
SCHEMATIC * m_schematic
The currently loaded schematic.
SCH_SHEET_PATH & GetCurrentSheet() const
const SCH_ITEM * GetSelectedNetNavigatorItem() const
void RefreshNetNavigator(const NET_NAVIGATOR_ITEM_DATA *aSelection=nullptr)
const SCH_ITEM * SelectNextPrevNetNavigatorItem(bool aNext)
void SelectNetNavigatorItem(const NET_NAVIGATOR_ITEM_DATA *aSelection=nullptr)
wxString m_highlightedConn
The highlighted net or bus or empty string.
static const wxString NetNavigatorPaneName()
void onNetNavigatorSelection(wxTreeEvent &aEvent)
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition: sch_item.h:168
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition: sch_item.h:313
VECTOR2I GetPosition() const override
Definition: sch_junction.h:107
Segment description base class to describe items which have 2 end points (track, wire,...
Definition: sch_line.h:42
VECTOR2I GetEndPoint() const
Definition: sch_line.h:144
VECTOR2I GetStartPoint() const
Definition: sch_line.h:139
VECTOR2I GetPosition() const override
EE_RTREE & Items()
Get the full RTree, usually for iterating.
Definition: sch_screen.h:117
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
const SCH_SHEET * GetSheet(unsigned aIndex) const
wxString PathHumanReadable(bool aUseShortRootName=true, bool aStripTrailingSeparator=false) const
Return the sheet path in a human readable form made from the sheet names.
SCH_SHEET * Last() const
Return a pointer to the last SCH_SHEET of the list.
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Definition: sch_sheet_pin.h:66
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:47
bool IsRootSheet() const
Definition: sch_sheet.cpp:169
VECTOR2I GetPosition() const override
Definition: sch_text.h:141
A base class for LIB_SYMBOL and SCH_SYMBOL.
Definition: symbol.h:63
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:150
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
std::unordered_map< NET_NAME_CODE_CACHE_KEY, std::vector< CONNECTION_SUBGRAPH * > > NET_MAP
Associate a #NET_CODE_NAME with all the subgraphs in that net.
#define _(s)
const wxChar *const traceUiProfile
Flag to enable user interface profile tracing.
@ LAYER_WIRE
Definition: layer_ids.h:442
@ LAYER_BUS
Definition: layer_ids.h:443
static wxString GetNetNavigatorItemText(const SCH_ITEM *aItem, const SCH_SHEET_PATH &aSheetPath, UNITS_PROVIDER *aUnitsProvider)
wxString UnescapeString(const wxString &aSource)
wxLogTrace helper definitions.
@ SCH_LINE_T
Definition: typeinfo.h:164
@ SCH_NO_CONNECT_T
Definition: typeinfo.h:161
@ SCH_DIRECTIVE_LABEL_T
Definition: typeinfo.h:172
@ SCH_LABEL_T
Definition: typeinfo.h:168
@ SCH_HIER_LABEL_T
Definition: typeinfo.h:170
@ SCH_BUS_BUS_ENTRY_T
Definition: typeinfo.h:163
@ SCH_SHEET_PIN_T
Definition: typeinfo.h:175
@ SCH_BUS_WIRE_ENTRY_T
Definition: typeinfo.h:162
@ SCH_GLOBAL_LABEL_T
Definition: typeinfo.h:169
@ SCH_JUNCTION_T
Definition: typeinfo.h:160
@ SCH_PIN_T
Definition: typeinfo.h:154
void SetAuiPaneSize(wxAuiManager &aManager, wxAuiPaneInfo &aPane, int aWidth, int aHeight)
Sets the size of an AUI pane, working around http://trac.wxwidgets.org/ticket/13180.