41#include <wx/wupdlock.h>
42#include <wx/filedlg.h>
147 const std::vector<std::function<void(
void )>> add_col{
151 wxDATAVIEW_CELL_INERT, -1, wxALIGN_LEFT,
152 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_SORTABLE );
157 wxDATAVIEW_CELL_INERT, -1, wxALIGN_LEFT,
158 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
163 wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
164 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
169 wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
170 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
175 wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
176 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
181 wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
182 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
188 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
193 wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
194 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
214 const int totalNumColumns = (int) add_col.size() +
m_board->GetCopperLayerCount();
216 if( (
int) cfg->
col_order.size() != totalNumColumns
217 || (
int) cfg->
col_hidden.size() != totalNumColumns )
219 cfg->
col_order.resize( totalNumColumns );
222 for(
int i = 0; i < totalNumColumns; ++i )
232 if( col_order_set.size() != cfg->
col_order.size() )
234 for( std::size_t i = 0; i < cfg->
col_order.size(); ++i )
235 cfg->
col_order[i] =
static_cast<int>( i );
251 const int addModelColumn = i;
253 if( addModelColumn >= (
int) add_col.size() )
256 m_columns[addModelColumn], wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
257 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
285 int minValueWidth = GetTextExtent( wxT(
"00000,000 mm" ) ).x;
286 int minNumberWidth = GetTextExtent( wxT(
"000" ) ).x;
287 int minNameWidth = GetTextExtent( wxT(
"MMMMMMMMMMMM" ) ).x;
293 constexpr int margins = 15;
294 constexpr int extra_width = 30;
296 auto getTargetWidth =
301 case COLUMN_NAME:
return minNameWidth + extra_width;
305 default:
return minValueWidth + margins;
311 for(
size_t i = 0; i <
m_columns.size(); ++i )
313 const int modelColumn = cfg->
col_order[i];
314 int titleSize = GetTextExtent(
m_columns[modelColumn].display_name ).x;
315 titleSize = modelColumn ==
COLUMN_NAME ? titleSize + extra_width : titleSize + margins;
316 const int valSize = getTargetWidth( modelColumn );
317 m_netsList->GetColumn( i )->SetWidth( std::max( titleSize, valSize ) );
325 for(
size_t ii = 0; ii <
m_columns.size(); ++ii )
329 m_netsList->GetColumn( ii )->SetWidth( std::max( newWidth, 10 ) );
340 if( sortingColumnId != -1 )
344 col->SetSortOrder( sortOrderAsc );
356 for(
unsigned int i = 0; i <
m_netsList->GetColumnCount(); ++i )
358 wxDataViewColumn* col =
m_netsList->GetColumn( i );
360 if(
static_cast<int>( col->GetModelColumn() ) == columnId )
404 for(
const auto& [groupName, groupItem] :
model->getGroupDataViewItems() )
412 wxDataViewItemArray sel;
415 std::vector<int> prev_selected_netcodes;
416 prev_selected_netcodes.reserve( sel.GetCount() );
418 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
421 prev_selected_netcodes.push_back( item->
GetNetCode() );
427 if( wxDataViewColumn* sorting_column =
m_netsList->GetSortingColumn() )
431 sorting_column_id =
static_cast<int>( sorting_column->GetModelColumn() );
432 sort_order_asc = sorting_column->IsSortOrderAscending();
436 sorting_column->UnsetAsSortKey();
453 std::vector<NETINFO_ITEM*> netCodes;
458 netCodes.emplace_back( ni );
461 std::ranges::sort( netCodes,
483 std::vector<std::pair<wxString, wxDataViewItem>> groupItems =
m_dataModel->getGroupDataViewItems();
488 [&groupName](
const std::pair<wxString, wxDataViewItem>& item )
490 return groupName == item.first;
493 auto tableItem = std::ranges::find_if( groupItems, pred );
495 if( tableItem != groupItems.end() )
505 for(
const int& nc : prev_selected_netcodes )
507 if( std::optional<LIST_ITEM_ITER> r =
m_dataModel->findItem( nc ) )
509 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
510 sel.Add( wxDataViewItem( list_item.get() ) );
548 bool matched =
false;
551 if( filterString.Length() == 0 )
555 if( !matched && cfg->
filter_by_netclass && netClassName.Find( filterString ) != wxNOT_FOUND )
559 if( !matched && cfg->
filter_by_net_name && netName.Find( filterString ) != wxNOT_FOUND )
566 matched = !netName.StartsWith( wxT(
"UNCONNECTED-(" ) );
587 const auto type_bits = std::bitset<MAX_STRUCT_TYPE_ID>().set(
PCB_TRACE_T )
592 std::vector<CN_ITEM*> cn_items;
593 cn_items.reserve( 1024 );
595 for(
CN_ITEM* cn_item :
m_board->GetConnectivity()->GetConnectivityAlgo()->ItemList() )
597 if( cn_item->Valid() && type_bits[cn_item->Parent()->Type()] )
598 cn_items.push_back( cn_item );
607std::vector<std::unique_ptr<PCB_NET_INSPECTOR_PANEL::LIST_ITEM>>
610 std::vector<std::unique_ptr<LIST_ITEM>> results;
618 std::unordered_map<int, std::vector<LENGTH_DELAY_CALCULATION_ITEM>> netItemsMap;
619 std::vector<NETINFO_ITEM*> foundNets;
621 auto itemItr = conItems.begin();
622 auto netCodeItr = aNetCodes.begin();
624 while( itemItr != conItems.end() && netCodeItr != aNetCodes.end() )
626 const int curNetCode = ( *netCodeItr )->GetNetCode();
627 const int curItemNetCode = ( *itemItr )->Net();
629 if( curItemNetCode == curNetCode )
631 if( foundNets.empty() || foundNets.back() != *netCodeItr )
632 foundNets.emplace_back( *netCodeItr );
636 netItemsMap[curItemNetCode].emplace_back( std::move( lengthItem ) );
639 else if( curItemNetCode < curNetCode )
642 while( itemItr != conItems.end() && ( *itemItr )->Net() < curNetCode )
645 else if( curItemNetCode > curNetCode )
648 while( netCodeItr != aNetCodes.end() && curItemNetCode > ( *netCodeItr )->GetNetCode() )
655 std::mutex resultsMutex;
658 auto resultsFuture =
tp.submit_loop(
660 [&,
this, calc](
const int i )
662 int netCode = foundNets[i]->GetNetCode();
664 constexpr PATH_OPTIMISATIONS opts = { .OptimiseViaLayers = true,
666 .OptimiseTracesInPads = true,
667 .InferViaInPad = false };
670 netItemsMap[netCode],
678 if( aIncludeZeroPadNets || lengthDetails.NumPads > 0 )
680 std::unique_ptr<LIST_ITEM> new_item = std::make_unique<LIST_ITEM>( foundNets[i] );
682 new_item->SetPadCount( lengthDetails.NumPads );
683 new_item->SetLayerCount( m_board->GetCopperLayerCount() );
684 new_item->SetPadDieLength( lengthDetails.PadToDieLength );
685 new_item->SetPadDieDelay( lengthDetails.PadToDieDelay );
686 new_item->SetViaCount( lengthDetails.NumVias );
687 new_item->SetViaLength( lengthDetails.ViaLength );
688 new_item->SetViaDelay( lengthDetails.ViaDelay );
689 new_item->SetLayerWireLengths( *lengthDetails.LayerLengths );
691 if( m_showTimeDomainDetails )
692 new_item->SetLayerWireDelays( *lengthDetails.LayerDelays );
694 std::scoped_lock lock( resultsMutex );
695 results.emplace_back( std::move( new_item ) );
714 return wxString::Format( wxT(
"%.3d" ), aNet->
GetNetCode() );
726 return wxString::Format( wxT(
"%u" ), aValue );
732 return m_frame->MessageTextFromValue( aValue,
739 return m_frame->MessageTextFromValue( aValue,
750 wxDataViewItemArray sel;
792 const std::vector<BOARD_ITEM*> item{ aBoardItem };
805 if( !IsShownOnScreen() )
809 if( aBoardItems.size()
816 std::vector<NETINFO_ITEM*> changedNets;
824 changedNets.emplace_back( net );
828 changedNets.emplace_back( i->GetNet() );
832 for(
const PAD*
pad : footprint->Pads() )
835 changedNets.emplace_back(
pad->GetNet() );
840 std::ranges::sort( changedNets,
855 std::vector<NETINFO_ITEM*> netsToUpdate;
856 std::unordered_set<NETINFO_ITEM*> netsToDelete;
861 netsToDelete.insert( net );
865 netsToUpdate.emplace_back( net );
868 wxWindowUpdateLocker updateLocker(
m_netsList );
870 std::vector<std::unique_ptr<LIST_ITEM>> newListItems =
calculateNets( aNets,
true );
872 for( std::unique_ptr<LIST_ITEM>& newListItem : newListItems )
875 netsToDelete.erase( newListItem->GetNet() );
877 std::optional<LIST_ITEM_ITER> curNetRow =
m_dataModel->findItem( newListItem->GetNetCode() );
891 const std::unique_ptr<LIST_ITEM>& curListItem = *curNetRow.value();
893 if( curListItem->GetNetName() != newListItem->GetNetName() )
901 curListItem->SetPadCount( newListItem->GetPadCount() );
902 curListItem->SetPadDieLength( newListItem->GetPadDieLength() );
903 curListItem->SetPadDieDelay( newListItem->GetPadDieDelay() );
904 curListItem->SetViaCount( newListItem->GetViaCount() );
905 curListItem->SetViaLength( newListItem->GetViaLength() );
906 curListItem->SetViaDelay( newListItem->GetViaDelay() );
907 curListItem->SetLayerWireLengths( newListItem->GetLayerWireLengths() );
910 curListItem->SetLayerWireDelays( newListItem->GetLayerWireDelays() );
924 const std::vector<BOARD_ITEM*> item{ aBoardItem };
937 if( !IsShownOnScreen() )
946 const std::vector<BOARD_ITEM*> item{ aBoardItem };
958 std::vector<BOARD_ITEM*>& aAddedItems,
959 std::vector<BOARD_ITEM*>& aRemovedItems,
960 std::vector<BOARD_ITEM*>& aChangedItems )
962 if( !IsShownOnScreen() )
965 std::vector<BOARD_ITEM*> allItems{ aAddedItems.begin(), aAddedItems.end() };
966 allItems.insert( allItems.end(), aRemovedItems.begin(), aRemovedItems.end() );
967 allItems.insert( allItems.end(), aChangedItems.begin(), aChangedItems.end() );
977 if( !
m_board->IsHighLightNetON() )
983 const std::set<int>& selected_codes =
m_board->GetHighLightNetCodes();
985 wxDataViewItemArray new_selection;
986 new_selection.Alloc( selected_codes.size() );
988 for(
const int code : selected_codes )
990 if( std::optional<LIST_ITEM_ITER> r =
m_dataModel->findItem( code ) )
991 new_selection.Add( wxDataViewItem( &***r ) );
996 if( !new_selection.IsEmpty() )
997 m_netsList->EnsureVisible( new_selection.Item( 0 ) );
1017 bool multipleSelections =
false;
1020 if(
m_netsList->GetSelectedItemsCount() == 1 )
1026 if(
m_netsList->GetSelectedItemsCount() > 1 )
1027 multipleSelections =
true;
1034 wxEmptyString, wxITEM_NORMAL );
1037 wxMenuItem* clearHighlighting =
new wxMenuItem( &menu,
ID_CLEAR_HIGHLIGHTING,
_(
"Clear Net Highlighting" ),
1038 wxEmptyString, wxITEM_NORMAL );
1039 menu.Append( clearHighlighting );
1044 if( selected_codes.size() == 0 )
1045 clearHighlighting->Enable(
false );
1047 menu.AppendSeparator();
1049 wxMenuItem* renameNet =
new wxMenuItem( &menu,
ID_RENAME_NET,
_(
"Rename Selected Net..." ), wxEmptyString,
1051 menu.Append( renameNet );
1053 wxMenuItem* deleteNet =
new wxMenuItem( &menu,
ID_DELETE_NET,
_(
"Delete Selected Net" ), wxEmptyString,
1055 menu.Append( deleteNet );
1057 menu.AppendSeparator();
1059 wxMenuItem* addNet =
new wxMenuItem( &menu,
ID_ADD_NET,
_(
"Add Net..." ), wxEmptyString, wxITEM_NORMAL );
1060 menu.Append( addNet );
1062 if( !selItem && !multipleSelections )
1065 deleteNet->Enable(
false );
1066 renameNet->Enable(
false );
1070 if( multipleSelections || selItem->
GetIsGroup() )
1072 highlightNet->SetItemLabel(
_(
"Highlight Selected Nets" ) );
1073 renameNet->Enable(
false );
1074 deleteNet->SetItemLabel(
_(
"Delete Selected Nets" ) );
1078 menu.AppendSeparator();
1081 _(
"Remove Selected Custom Group" ),
1082 wxEmptyString, wxITEM_NORMAL );
1083 menu.Append( removeSelectedGroup );
1086 removeSelectedGroup->Enable(
false );
1103 wxString newGroupName;
1107 wxStaticText*
help =
new wxStaticText( &dlg, wxID_ANY,
_(
"(Use /.../ to indicate a regular expression.)" ) );
1111 dlg.GetSizer()->SetSizeHints( &dlg );
1118 if( newGroupName ==
"" )
1122 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1124 return rule->GetPattern() == newGroupName;
1140 m_frame->GetCanvas()->GetView()->GetPainter()->GetSettings()->SetHighlight(
false );
1141 m_frame->GetCanvas()->GetView()->UpdateAllLayersColor();
1142 m_frame->GetCanvas()->Refresh();
1171 if(
m_netsList->GetSelectedItemsCount() == 1 )
1180 wxEmptyString, wxITEM_CHECK );
1181 menu.Append( filterByNetName );
1182 filterByNetName->Check( cfg.filter_by_net_name );
1185 wxEmptyString, wxITEM_CHECK );
1186 menu.Append( filterByNetclass );
1187 filterByNetclass->Check( cfg.filter_by_netclass );
1189 menu.AppendSeparator();
1199 wxEmptyString, wxITEM_CHECK );
1200 menu.Append( groupNetclass );
1203 menu.AppendSeparator();
1205 wxMenuItem* addGroup =
new wxMenuItem( &menu,
ID_ADD_GROUP,
_(
"Add Custom Group..." ),
1206 wxEmptyString, wxITEM_NORMAL );
1207 menu.Append( addGroup );
1210 _(
"Remove Selected Custom Group" ),
1211 wxEmptyString, wxITEM_NORMAL );
1212 menu.Append( removeSelectedGroup );
1215 removeSelectedGroup->Enable(
false );
1217 wxMenuItem* removeCustomGroups =
new wxMenuItem( &menu,
ID_REMOVE_GROUPS,
_(
"Remove All Custom Groups" ),
1218 wxEmptyString, wxITEM_NORMAL );
1219 menu.Append( removeCustomGroups );
1222 menu.AppendSeparator();
1225 wxEmptyString, wxITEM_CHECK );
1226 menu.Append( showZeroNetPads );
1230 wxEmptyString, wxITEM_CHECK );
1231 menu.Append( showUnconnectedNets );
1234 menu.AppendSeparator();
1237 _(
"Show Time Domain Details" ),
1238 wxEmptyString, wxITEM_CHECK );
1239 menu.Append( showTimeDomainDetails );
1242 menu.AppendSeparator();
1246 wxEmptyString, wxITEM_NORMAL );
1249 menu.AppendSeparator();
1252 wxMenu* colsMenu =
new wxMenu();
1254 menu.AppendSubMenu( colsMenu,
_(
"Show / Hide Columns" ) );
1267 wxEmptyString, wxITEM_CHECK );
1269 target->Append( opt );
1270 opt->Check( !col->IsHidden() );
1273 target->AppendSeparator();
1278 wxEmptyString, wxITEM_CHECK );
1280 target->Append( opt );
1281 opt->Check( !col->IsHidden() );
1288 bool saveAndRebuild =
true;
1290 switch( event.GetId() )
1346 saveAndRebuild =
false;
1351 saveAndRebuild =
false;
1356 saveAndRebuild =
false;
1365 col->SetWidth( std::max( col->GetWidth(), 10 ) );
1366 col->SetHidden( !col->IsHidden() );
1371 if( saveAndRebuild )
1381 if(
m_netsList->GetSelectedItemsCount() == 1 )
1385 if( selItem->GetIsGroup() )
1387 const wxString groupName = selItem->GetGroupName();
1389 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1391 return rule->GetPattern() == groupName;
1407 wxFileDialog dlg(
this,
_(
"Save Net Inspector Report File" ),
"",
"",
1409 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1413 if( dlg.ShowModal() == wxID_CANCEL )
1416 wxTextFile f( dlg.GetPath() );
1431 txt += wxString::Format(
_(
"%s (%s)" ),
1437 txt += col.csv_name;
1440 txt += wxT(
"\";" );
1446 const unsigned int num_rows =
m_dataModel->itemCount();
1448 for(
unsigned int row = 0; row < num_rows; row++ )
1452 if( i.GetIsGroup() || i.GetNetCode() == 0 )
1460 txt +=
'"' +
m_dataModel->valueAt( col.num, row ).GetString() + wxT(
"\";" );
1462 txt +=
m_dataModel->valueAt( col.num, row ).GetString() +
';';
1493 wxDataViewItemArray sel;
1498 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1505 renderSettings->
SetHighlight(
true, ( *c )->GetNetCode(),
true );
1518 m_frame->GetCanvas()->GetView()->UpdateAllLayersColor();
1519 m_frame->GetCanvas()->Refresh();
1541 wxString newNetName;
1554 if(
m_board->FindNet( newNetName ) )
1556 DisplayError(
this, wxString::Format(
_(
"Net name '%s' is already in use." ), newNetName ) );
1557 newNetName = wxEmptyString;
1576 if(
m_netsList->GetSelectedItemsCount() == 1 )
1586 wxString shortNetName;
1588 if( fullNetName.Contains( wxT(
"/" ) ) )
1590 netPath = fullNetName.BeforeLast(
'/' ) +
'/';
1591 shortNetName = fullNetName.AfterLast(
'/' );
1595 shortNetName = fullNetName;
1609 unescapedShortName = dlg.
GetValue();
1611 if( unescapedShortName.IsEmpty() )
1618 fullNetName = netPath + shortNetName;
1620 if(
m_board->FindNet( shortNetName ) ||
m_board->FindNet( fullNetName ) )
1622 DisplayError(
this, wxString::Format(
_(
"Net name '%s' is already in use." ), unescapedShortName ) );
1623 unescapedShortName = wxEmptyString;
1633 if( boardItem->GetNet() == net )
1649 boardItem->SetNet( net );
1654 if( std::optional<LIST_ITEM_ITER> r =
m_dataModel->findItem( net ) )
1655 m_netsList->Select( wxDataViewItem( r.value()->get() ) );
1663 m_frame->GetCanvas()->Refresh();
1673 wxDataViewItemArray sel;
1676 auto delete_one = [
this](
const LIST_ITEM* i )
1678 if( i->GetPadCount() == 0
1679 ||
IsOK(
this, wxString::Format(
_(
"Net '%s' is in use. Delete anyway?" ), i->GetNetName() ) ) )
1683 int removedCode = i->GetNetCode();
1685 m_frame->GetCanvas()->GetView()->UpdateAllItemsConditionally(
1690 if( boardItem && boardItem->GetNetCode() == removedCode )
1697 text->ClearRenderCache();
1698 text->ClearBoundingBoxCache();
1705 m_board->Remove( i->GetNet() );
1712 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1719 &&
IsOK(
this, wxString::Format(
_(
"Delete all nets in group '%s'?" ), ii->
GetGroupName() ) ) )
1723 std::vector<const LIST_ITEM*> children;
1771 bool displayed =
false;
1773 for(
unsigned int ii = 0; ii <
m_dataModel->columnCount() && !displayed; ++ii )
1775 if(
m_netsList->GetColumn( ii )->GetWidth() > 0 )
1796 wxDataViewColumn* sortingCol =
m_netsList->GetSortingColumn();
1797 cfg.sorting_column = sortingCol ?
static_cast<int>( sortingCol->GetModelColumn() ) : -1;
1798 cfg.sort_order_asc = sortingCol ? sortingCol->IsSortOrderAscending() :
true;
1801 cfg.col_order.resize(
m_dataModel->columnCount() );
1802 cfg.col_widths.resize(
m_dataModel->columnCount() );
1803 cfg.col_hidden.resize(
m_dataModel->columnCount() );
1805 for(
unsigned int ii = 0; ii <
m_dataModel->columnCount(); ++ii )
1807 cfg.col_order[ii] = (int)
m_netsList->GetColumn( ii )->GetModelColumn();
1808 cfg.col_widths[ii] =
m_netsList->GetColumn( ii )->GetWidth();
1809 cfg.col_hidden[ii] =
m_netsList->GetColumn( ii )->IsHidden();
1813 cfg.expanded_rows.clear();
1814 std::vector<std::pair<wxString, wxDataViewItem>> groupItems =
m_dataModel->getGroupDataViewItems();
1816 for( std::pair<wxString, wxDataViewItem>& item : groupItems )
1819 cfg.expanded_rows.push_back( item.first );
1823 cfg.custom_group_rules.clear();
1826 cfg.custom_group_rules.push_back( rule->GetPattern() );
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Information pertinent to a Pcbnew printed circuit board.
CN_ITEM represents a BOARD_CONNETED_ITEM in the connectivity system (ie: a pad, track/arc/via,...
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
const std::set< int > & GetHighlightNetCodes() const
Return the netcode of currently highlighted net.
void SetHighlight(bool aEnabled, int aNetcode=-1, bool aMulti=false)
Turns on/off highlighting.
An abstract base class for deriving all objects that can be added to a VIEW.
Lightweight class which holds a pad, via, or a routed trace outline.
Class which calculates lengths (and associated routing statistics) in a BOARD context.
LENGTH_DELAY_CALCULATION_ITEM GetLengthCalculationItem(const BOARD_CONNECTED_ITEM *aBoardItem) const
Return a LENGTH_CALCULATION_ITEM constructed from the given BOARD_CONNECTED_ITEM.
LENGTH_DELAY_STATS CalculateLengthDetails(std::vector< LENGTH_DELAY_CALCULATION_ITEM > &aItems, PATH_OPTIMISATIONS aOptimisations, const PAD *aStartPad=nullptr, const PAD *aEndPad=nullptr, LENGTH_DELAY_LAYER_OPT aLayerOpt=LENGTH_DELAY_LAYER_OPT::NO_LAYER_DETAIL, LENGTH_DELAY_DOMAIN_OPT aDomain=LENGTH_DELAY_DOMAIN_OPT::NO_DELAY_DETAIL) const
Calculates the electrical length of the given items.
A collection of nets and the parameters used to route or test these nets.
const wxString GetName() const
Gets the name of this (maybe aggregate) netclass in a format for internal usage or for export to exte...
Handle the data for a net.
void SetNetname(const wxString &aNewName)
Set the long netname to aNetName, the short netname to the last token in the long netname's path,...
const wxString & GetNetname() const
NET_INSPECTOR_PANEL(wxWindow *parent, EDA_BASE_FRAME *aFrame, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1, -1), long style=wxTAB_TRAVERSAL, const wxString &name=wxEmptyString)
wxDataViewCtrl * m_netsList
wxSearchCtrl * m_searchCtrl
The main frame for Pcbnew.
Data model for display in the Net Inspector panel.
Primary data item for entries in the Net Inspector list.
auto ChildrenBegin() const
unsigned int ChildrenCount() const
const wxString & GetGroupName() const
NETINFO_ITEM * GetNet() const
void OnBoardItemRemoved(BOARD &aBoard, BOARD_ITEM *aBoardItem) override
void OnBoardHighlightNetChanged(BOARD &aBoard) override
void generateReport()
Generates a CSV report from currently disaplyed data.
PCB_NET_INSPECTOR_PANEL(wxWindow *parent, PCB_EDIT_FRAME *aFrame)
void onDeleteSelectedNet()
Deletes a selected net.
bool restoreSortColumn(int sortingColumnId, bool sortOrderAsc) const
Sets the sort column in the grid to that showing the given model ID column.
void OnBoardItemsChanged(BOARD &aBoard, std::vector< BOARD_ITEM * > &aBoardItems) override
void adjustListColumnSizes(PANEL_NET_INSPECTOR_SETTINGS *cfg) const
Adjust the sizing of list columns.
BOARD * m_board
Parent BOARD.
void OnSearchTextChanged(wxCommandEvent &event) override
void updateDisplayedRowValues(const std::optional< LIST_ITEM_ITER > &aRow) const
Refreshes displayed data for the given rows.
void onAddNet()
Adds a new user-specified net to the board.
PCB_EDIT_FRAME * m_frame
Owning edit frame.
void OnBoardItemsRemoved(BOARD &aBoard, std::vector< BOARD_ITEM * > &aBoardItems) override
void onClearHighlighting()
Clears highlighting from nets.
void onContextMenuSelection(wxCommandEvent &event)
Handle a net row(s) context menu selection.
static wxString formatNetCode(const NETINFO_ITEM *aNet)
void OnBoardChanged() override
Update panel when board is changed.
void generateShowHideColumnMenu(wxMenu *target)
Generates a sub-menu for the show / hide columns submenu.
std::vector< std::unique_ptr< LIST_ITEM > > calculateNets(const std::vector< NETINFO_ITEM * > &aNetCodes, bool aIncludeZeroPadNets) const
Calculates the length statistics for each given netcode.
bool m_showTimeDomainDetails
static wxString formatCount(unsigned int aValue)
std::vector< std::unique_ptr< EDA_COMBINED_MATCHER > > m_custom_group_rules
Custom net grouping rules.
std::vector< CN_ITEM * > relevantConnectivityItems() const
Fetches an ordered (by NetCode) list of all board connectivity items.
bool m_showUnconnectedNets
void highlightSelectedNets()
Highlight the currently selected net.
void updateNets(const std::vector< NETINFO_ITEM * > &aNets) const
Updates displayed statistics for the given nets.
void OnBoardItemsAdded(BOARD &aBoard, std::vector< BOARD_ITEM * > &aBoardItems) override
void OnLanguageChangedImpl() override
Reloads strings on an application language change.
void onAddGroup()
Adds a custom display grouping of nets.
void OnNetsListContextMenu(wxDataViewEvent &event)
void OnBoardNetSettingsChanged(BOARD &aBoard) override
void OnBoardCompositeUpdate(BOARD &aBoard, std::vector< BOARD_ITEM * > &aAddedItems, std::vector< BOARD_ITEM * > &aRemovedItems, std::vector< BOARD_ITEM * > &aChangedItems) override
void OnNetsListItemActivated(wxDataViewEvent &event)
void OnColumnSorted(wxDataViewEvent &event)
void onRemoveSelectedGroup()
Removes a custom display grouping.
@ ID_SHOW_UNCONNECTED_NETS
@ ID_REMOVE_SELECTED_GROUP
@ ID_HIGHLIGHT_SELECTED_NETS
@ ID_SHOW_TIME_DOMAIN_DETAILS
virtual ~PCB_NET_INSPECTOR_PANEL()
void buildColumns()
Build the required columns in the net inspector grid.
void OnBoardItemAdded(BOARD &aBoard, BOARD_ITEM *aBoardItem) override
void OnParentSetupChanged() override
Updates the netlist based on global board changes (e.g.
void OnHeaderContextMenu(wxCommandEvent &event)
bool netFilterMatches(NETINFO_ITEM *aNet, PANEL_NET_INSPECTOR_SETTINGS *cfg=nullptr) const
Filter to determine whether a board net should be included in the net inspector.
void OnConfigButton(wxCommandEvent &event) override
void buildNetsList(bool rebuildColumns=false)
Rebuilds the net inspector list, removing all previous entries.
wxString formatLength(int64_t aValue) const
void SaveSettings() override
Persist the net inspector configuration to project / global settings.
void onRenameSelectedNet()
Renames a selected net.
void onUnitsChanged(wxCommandEvent &event)
Handle an application-level change of units.
void OnExpandCollapseRow(wxCommandEvent &event)
void updateBoardItems(const std::vector< BOARD_ITEM * > &aBoardItems)
Unified handling of added / deleted / modified board items.
wxString formatDelay(int64_t aValue) const
wxObjectDataPtr< DATA_MODEL > m_dataModel
The bound data model to display.
wxDataViewColumn * getDisplayedColumnForModelField(int columnId) const
Fetches the displayed grid view column for the given model column ID.
static wxString formatNetName(const NETINFO_ITEM *aNet)
void OnBoardItemChanged(BOARD &aBoard, BOARD_ITEM *aBoardItem) override
std::vector< COLUMN_DESC > m_columns
All displayed (or hidden) columns.
void OnShowPanel() override
Prepare the panel when shown in the editor.
virtual SETTINGS_MANAGER & GetSettingsManager() const
The project local settings are things that are attached to a particular project, but also might be pa...
PANEL_NET_INSPECTOR_SETTINGS m_NetInspectorPanel
The state of the net inspector panel.
virtual PROJECT_LOCAL_SETTINGS & GetLocalSettings() const
PROJECT & Prj() const
A helper while we are not MDI-capable – return the one and only project.
wxBoxSizer * m_ContentSizer
A KICAD version of wxTextEntryDialog which supports the various improvements/work-arounds from DIALOG...
wxString GetValue() const
void SetTextValidator(const wxTextValidator &validator)
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
This file is part of the common library.
#define CANDIDATE
flag indicating that the structure is connected
Abstract pattern-matching tool and implementations.
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
PCB_LAYER_ID
A quick note on layer IDs:
KICOMMON_API wxString GetLabel(EDA_UNITS aUnits, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
Get the units string for a given units type.
@ REPAINT
Item needs to be redrawn.
@ GEOMETRY
Position or shape has changed.
KICOMMON_API wxFont GetInfoFont(wxWindow *aWindow)
PGM_BASE & Pgm()
The global program "get" accessor.
static bool highlightNet(TOOL_MANAGER *aToolMgr, const VECTOR2D &aPosition)
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:...
Holds length measurement result details and statistics.
bool operator()(const CN_ITEM *a, const CN_ITEM *b) const
bool operator()(int a, const CN_ITEM *b) const
bool operator()(const CN_ITEM *a, int b) const
Persisted state for the net inspector panel.
std::vector< int > col_order
std::vector< bool > col_hidden
std::vector< wxString > expanded_rows
std::vector< int > col_widths
bool show_time_domain_details
std::vector< wxString > custom_group_rules
thread_pool & GetKiCadThreadPool()
Get a reference to the current thread pool.
BS::priority_thread_pool thread_pool
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
Custom text control validator definitions.
wxString AddFileExtListToFilter(const std::vector< std::string > &aExts)
Build the wildcard extension file dialog wildcard filter to add to the base message dialog.
Definition of file extensions used in Kicad.