42#include <wx/wupdlock.h>
43#include <wx/filedlg.h>
149 const std::vector<std::function<void(
void )>> add_col{
153 wxDATAVIEW_CELL_INERT, -1, wxALIGN_LEFT,
154 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_SORTABLE );
159 wxDATAVIEW_CELL_INERT, -1, wxALIGN_LEFT,
160 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
165 wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
166 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
171 wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
172 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
177 wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
178 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
183 wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
184 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
190 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
195 wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
196 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
216 const int totalNumColumns = (int) add_col.size() +
m_board->GetCopperLayerCount();
218 if( (
int) cfg->
col_order.size() != totalNumColumns
219 || (
int) cfg->
col_hidden.size() != totalNumColumns )
221 cfg->
col_order.resize( totalNumColumns );
224 for(
int i = 0; i < totalNumColumns; ++i )
234 if( col_order_set.size() != cfg->
col_order.size() )
236 for( std::size_t i = 0; i < cfg->
col_order.size(); ++i )
237 cfg->
col_order[i] =
static_cast<int>( i );
253 const int addModelColumn = i;
255 if( addModelColumn >= (
int) add_col.size() )
258 m_columns[addModelColumn], wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
259 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
283 constexpr int margins = 15;
284 constexpr int extra_width = 30;
286 int headerWidth = GetTextExtent(
m_columns[aModelColumn].display_name ).x;
287 headerWidth += ( aModelColumn ==
COLUMN_NAME ) ? extra_width : margins;
295 if( !aCol || aCol->IsHidden() )
298 const unsigned int modelCol = aCol->GetModelColumn();
303 constexpr int margins = 15;
304 constexpr int extra_width = 30;
305 const bool isNameCol = ( modelCol ==
COLUMN_NAME );
306 const int padding = isNameCol ? extra_width : margins;
311 for(
unsigned int row = 0; row <
m_dataModel->itemCount(); ++row )
313 wxVariant value =
m_dataModel->valueAt( modelCol, row );
314 int textWidth = GetTextExtent( value.GetString() ).x + padding;
315 maxWidth = std::max( maxWidth, textWidth );
323 wxVariant childValue =
m_dataModel->valueForItem( *it, modelCol );
324 int childWidth = GetTextExtent( childValue.GetString() ).x + padding;
327 childWidth += indent;
329 maxWidth = std::max( maxWidth, childWidth );
334 aCol->SetWidth( maxWidth );
344 int minValueWidth = GetTextExtent( wxT(
"00000,000 mm" ) ).x;
345 int minNumberWidth = GetTextExtent( wxT(
"000" ) ).x;
346 int minNameWidth = GetTextExtent( wxT(
"MMMMMMMMMMMM" ) ).x;
352 constexpr int margins = 15;
353 constexpr int extra_width = 30;
355 auto getTargetWidth =
360 case COLUMN_NAME:
return minNameWidth + extra_width;
364 default:
return minValueWidth + margins;
370 for(
size_t i = 0; i <
m_columns.size(); ++i )
372 const int modelColumn = cfg->
col_order[i];
373 int titleSize = GetTextExtent(
m_columns[modelColumn].display_name ).x;
374 titleSize = modelColumn ==
COLUMN_NAME ? titleSize + extra_width : titleSize + margins;
375 const int valSize = getTargetWidth( modelColumn );
376 m_netsList->GetColumn( i )->SetWidth( std::max( titleSize, valSize ) );
384 for(
size_t ii = 0; ii <
m_columns.size(); ++ii )
386 const int modelCol =
static_cast<int>(
m_netsList->GetColumn( ii )->GetModelColumn() );
390 m_netsList->GetColumn( ii )->SetWidth( std::max( newWidth, minWidth ) );
401 if( sortingColumnId != -1 )
405 col->SetSortOrder( sortOrderAsc );
417 for(
unsigned int i = 0; i <
m_netsList->GetColumnCount(); ++i )
419 wxDataViewColumn* col =
m_netsList->GetColumn( i );
421 if(
static_cast<int>( col->GetModelColumn() ) == columnId )
465 for(
const auto& [groupName, groupItem] :
model->getGroupDataViewItems() )
473 wxDataViewItemArray sel;
476 std::vector<int> prev_selected_netcodes;
477 prev_selected_netcodes.reserve( sel.GetCount() );
479 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
482 prev_selected_netcodes.push_back( item->
GetNetCode() );
488 if( wxDataViewColumn* sorting_column =
m_netsList->GetSortingColumn() )
492 sorting_column_id =
static_cast<int>( sorting_column->GetModelColumn() );
493 sort_order_asc = sorting_column->IsSortOrderAscending();
497 sorting_column->UnsetAsSortKey();
514 std::vector<NETINFO_ITEM*> netCodes;
519 netCodes.emplace_back( ni );
522 std::ranges::sort( netCodes,
544 std::vector<std::pair<wxString, wxDataViewItem>> groupItems =
m_dataModel->getGroupDataViewItems();
549 [&groupName](
const std::pair<wxString, wxDataViewItem>& item )
551 return groupName == item.first;
554 auto tableItem = std::ranges::find_if( groupItems, pred );
556 if( tableItem != groupItems.end() )
566 for(
const int& nc : prev_selected_netcodes )
568 if( std::optional<LIST_ITEM_ITER> r =
m_dataModel->findItem( nc ) )
570 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
571 sel.Add( wxDataViewItem( list_item.get() ) );
609 bool matched =
false;
612 if( filterString.Length() == 0 )
616 if( !matched && cfg->
filter_by_netclass && netClassName.Find( filterString ) != wxNOT_FOUND )
620 if( !matched && cfg->
filter_by_net_name && netName.Find( filterString ) != wxNOT_FOUND )
627 matched = !netName.StartsWith( wxT(
"UNCONNECTED-(" ) );
648 const auto type_bits = std::bitset<MAX_STRUCT_TYPE_ID>().set(
PCB_TRACE_T )
653 std::vector<CN_ITEM*> cn_items;
654 cn_items.reserve( 1024 );
656 for(
CN_ITEM* cn_item :
m_board->GetConnectivity()->GetConnectivityAlgo()->ItemList() )
658 if( cn_item->Valid() && type_bits[cn_item->Parent()->Type()] )
659 cn_items.push_back( cn_item );
668std::vector<std::unique_ptr<PCB_NET_INSPECTOR_PANEL::LIST_ITEM>>
671 std::vector<std::unique_ptr<LIST_ITEM>> results;
679 std::unordered_map<int, std::vector<LENGTH_DELAY_CALCULATION_ITEM>> netItemsMap;
680 std::vector<NETINFO_ITEM*> foundNets;
682 auto itemItr = conItems.begin();
683 auto netCodeItr = aNetCodes.begin();
685 while( itemItr != conItems.end() && netCodeItr != aNetCodes.end() )
687 const int curNetCode = ( *netCodeItr )->GetNetCode();
688 const int curItemNetCode = ( *itemItr )->Net();
690 if( curItemNetCode == curNetCode )
692 if( foundNets.empty() || foundNets.back() != *netCodeItr )
693 foundNets.emplace_back( *netCodeItr );
697 netItemsMap[curItemNetCode].emplace_back( std::move( lengthItem ) );
700 else if( curItemNetCode < curNetCode )
703 while( itemItr != conItems.end() && ( *itemItr )->Net() < curNetCode )
706 else if( curItemNetCode > curNetCode )
709 while( netCodeItr != aNetCodes.end() && curItemNetCode > ( *netCodeItr )->GetNetCode() )
716 std::mutex resultsMutex;
719 auto resultsFuture =
tp.submit_loop(
721 [&,
this, calc](
const int i )
723 int netCode = foundNets[i]->GetNetCode();
725 constexpr PATH_OPTIMISATIONS opts = { .OptimiseViaLayers = true,
727 .OptimiseTracesInPads = true,
728 .InferViaInPad = false };
731 netItemsMap[netCode],
739 if( aIncludeZeroPadNets || lengthDetails.NumPads > 0 )
741 std::unique_ptr<LIST_ITEM> new_item = std::make_unique<LIST_ITEM>( foundNets[i] );
743 new_item->SetPadCount( lengthDetails.NumPads );
744 new_item->SetLayerCount( m_board->GetCopperLayerCount() );
745 new_item->SetPadDieLength( lengthDetails.PadToDieLength );
746 new_item->SetPadDieDelay( lengthDetails.PadToDieDelay );
747 new_item->SetViaCount( lengthDetails.NumVias );
748 new_item->SetViaLength( lengthDetails.ViaLength );
749 new_item->SetViaDelay( lengthDetails.ViaDelay );
750 new_item->SetLayerWireLengths( *lengthDetails.LayerLengths );
752 if( m_showTimeDomainDetails )
753 new_item->SetLayerWireDelays( *lengthDetails.LayerDelays );
755 std::scoped_lock lock( resultsMutex );
756 results.emplace_back( std::move( new_item ) );
775 return wxString::Format( wxT(
"%.3d" ), aNet->
GetNetCode() );
787 return wxString::Format( wxT(
"%u" ), aValue );
793 return m_frame->MessageTextFromValue( aValue,
800 return m_frame->MessageTextFromValue( aValue,
811 wxDataViewItemArray sel;
853 const std::vector<BOARD_ITEM*> item{ aBoardItem };
866 if( !IsShownOnScreen() )
870 if( aBoardItems.size()
877 std::vector<NETINFO_ITEM*> changedNets;
885 changedNets.emplace_back( net );
889 changedNets.emplace_back( i->GetNet() );
893 for(
const PAD*
pad : footprint->Pads() )
896 changedNets.emplace_back(
pad->GetNet() );
901 std::ranges::sort( changedNets,
916 std::vector<NETINFO_ITEM*> netsToUpdate;
917 std::unordered_set<NETINFO_ITEM*> netsToDelete;
922 netsToDelete.insert( net );
926 netsToUpdate.emplace_back( net );
929 wxWindowUpdateLocker updateLocker(
m_netsList );
931 std::vector<std::unique_ptr<LIST_ITEM>> newListItems =
calculateNets( aNets,
true );
933 for( std::unique_ptr<LIST_ITEM>& newListItem : newListItems )
936 netsToDelete.erase( newListItem->GetNet() );
938 std::optional<LIST_ITEM_ITER> curNetRow =
m_dataModel->findItem( newListItem->GetNetCode() );
952 const std::unique_ptr<LIST_ITEM>& curListItem = *curNetRow.value();
954 if( curListItem->GetNetName() != newListItem->GetNetName() )
962 curListItem->SetPadCount( newListItem->GetPadCount() );
963 curListItem->SetPadDieLength( newListItem->GetPadDieLength() );
964 curListItem->SetPadDieDelay( newListItem->GetPadDieDelay() );
965 curListItem->SetViaCount( newListItem->GetViaCount() );
966 curListItem->SetViaLength( newListItem->GetViaLength() );
967 curListItem->SetViaDelay( newListItem->GetViaDelay() );
968 curListItem->SetLayerWireLengths( newListItem->GetLayerWireLengths() );
971 curListItem->SetLayerWireDelays( newListItem->GetLayerWireDelays() );
985 const std::vector<BOARD_ITEM*> item{ aBoardItem };
998 if( !IsShownOnScreen() )
1007 const std::vector<BOARD_ITEM*> item{ aBoardItem };
1019 std::vector<BOARD_ITEM*>& aAddedItems,
1020 std::vector<BOARD_ITEM*>& aRemovedItems,
1021 std::vector<BOARD_ITEM*>& aChangedItems )
1023 if( !IsShownOnScreen() )
1026 std::vector<BOARD_ITEM*> allItems{ aAddedItems.begin(), aAddedItems.end() };
1027 allItems.insert( allItems.end(), aRemovedItems.begin(), aRemovedItems.end() );
1028 allItems.insert( allItems.end(), aChangedItems.begin(), aChangedItems.end() );
1038 if( !
m_board->IsHighLightNetON() )
1044 const std::set<int>& selected_codes =
m_board->GetHighLightNetCodes();
1046 wxDataViewItemArray new_selection;
1047 new_selection.Alloc( selected_codes.size() );
1049 for(
const int code : selected_codes )
1051 if( std::optional<LIST_ITEM_ITER> r =
m_dataModel->findItem( code ) )
1052 new_selection.Add( wxDataViewItem( &***r ) );
1057 if( !new_selection.IsEmpty() )
1058 m_netsList->EnsureVisible( new_selection.Item( 0 ) );
1078 bool multipleSelections =
false;
1081 if(
m_netsList->GetSelectedItemsCount() == 1 )
1087 if(
m_netsList->GetSelectedItemsCount() > 1 )
1088 multipleSelections =
true;
1095 wxEmptyString, wxITEM_NORMAL );
1098 wxMenuItem* clearHighlighting =
new wxMenuItem( &menu,
ID_CLEAR_HIGHLIGHTING,
_(
"Clear Net Highlighting" ),
1099 wxEmptyString, wxITEM_NORMAL );
1100 menu.Append( clearHighlighting );
1105 if( selected_codes.size() == 0 )
1106 clearHighlighting->Enable(
false );
1108 menu.AppendSeparator();
1110 wxMenuItem* renameNet =
new wxMenuItem( &menu,
ID_RENAME_NET,
_(
"Rename Selected Net..." ), wxEmptyString,
1112 menu.Append( renameNet );
1114 wxMenuItem* deleteNet =
new wxMenuItem( &menu,
ID_DELETE_NET,
_(
"Delete Selected Net" ), wxEmptyString,
1116 menu.Append( deleteNet );
1118 menu.AppendSeparator();
1120 wxMenuItem* addNet =
new wxMenuItem( &menu,
ID_ADD_NET,
_(
"Add Net..." ), wxEmptyString, wxITEM_NORMAL );
1121 menu.Append( addNet );
1123 if( !selItem && !multipleSelections )
1126 deleteNet->Enable(
false );
1127 renameNet->Enable(
false );
1131 if( multipleSelections || selItem->
GetIsGroup() )
1133 highlightNet->SetItemLabel(
_(
"Highlight Selected Nets" ) );
1134 renameNet->Enable(
false );
1135 deleteNet->SetItemLabel(
_(
"Delete Selected Nets" ) );
1139 menu.AppendSeparator();
1142 _(
"Remove Selected Custom Group" ),
1143 wxEmptyString, wxITEM_NORMAL );
1144 menu.Append( removeSelectedGroup );
1147 removeSelectedGroup->Enable(
false );
1164 wxString newGroupName;
1168 wxStaticText*
help =
new wxStaticText( &dlg, wxID_ANY,
_(
"(Use /.../ to indicate a regular expression.)" ) );
1172 dlg.GetSizer()->SetSizeHints( &dlg );
1179 if( newGroupName ==
"" )
1183 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1185 return rule->GetPattern() == newGroupName;
1201 m_frame->GetCanvas()->GetView()->GetPainter()->GetSettings()->SetHighlight(
false );
1202 m_frame->GetCanvas()->GetView()->UpdateAllLayersColor();
1203 m_frame->GetCanvas()->Refresh();
1224 menu.AppendSeparator();
1239 if(
m_netsList->GetSelectedItemsCount() == 1 )
1248 wxEmptyString, wxITEM_CHECK );
1249 menu.Append( filterByNetName );
1250 filterByNetName->Check( cfg.filter_by_net_name );
1253 wxEmptyString, wxITEM_CHECK );
1254 menu.Append( filterByNetclass );
1255 filterByNetclass->Check( cfg.filter_by_netclass );
1257 menu.AppendSeparator();
1267 wxEmptyString, wxITEM_CHECK );
1268 menu.Append( groupNetclass );
1271 menu.AppendSeparator();
1273 wxMenuItem* addGroup =
new wxMenuItem( &menu,
ID_ADD_GROUP,
_(
"Add Custom Group..." ),
1274 wxEmptyString, wxITEM_NORMAL );
1275 menu.Append( addGroup );
1278 _(
"Remove Selected Custom Group" ),
1279 wxEmptyString, wxITEM_NORMAL );
1280 menu.Append( removeSelectedGroup );
1283 removeSelectedGroup->Enable(
false );
1285 wxMenuItem* removeCustomGroups =
new wxMenuItem( &menu,
ID_REMOVE_GROUPS,
_(
"Remove All Custom Groups" ),
1286 wxEmptyString, wxITEM_NORMAL );
1287 menu.Append( removeCustomGroups );
1290 menu.AppendSeparator();
1293 wxEmptyString, wxITEM_CHECK );
1294 menu.Append( showZeroNetPads );
1298 wxEmptyString, wxITEM_CHECK );
1299 menu.Append( showUnconnectedNets );
1302 menu.AppendSeparator();
1305 _(
"Show Time Domain Details" ),
1306 wxEmptyString, wxITEM_CHECK );
1307 menu.Append( showTimeDomainDetails );
1310 menu.AppendSeparator();
1314 wxEmptyString, wxITEM_NORMAL );
1317 menu.AppendSeparator();
1320 wxMenu* colsMenu =
new wxMenu();
1322 menu.AppendSubMenu( colsMenu,
_(
"Show / Hide Columns" ) );
1335 wxEmptyString, wxITEM_CHECK );
1337 target->Append( opt );
1338 opt->Check( !col->IsHidden() );
1341 target->AppendSeparator();
1346 wxEmptyString, wxITEM_CHECK );
1348 target->Append( opt );
1349 opt->Check( !col->IsHidden() );
1356 bool saveAndRebuild =
true;
1358 switch( event.GetId() )
1414 saveAndRebuild =
false;
1419 saveAndRebuild =
false;
1424 saveAndRebuild =
false;
1431 saveAndRebuild =
false;
1435 for(
unsigned int i = 0; i <
m_netsList->GetColumnCount(); ++i )
1438 saveAndRebuild =
false;
1447 col->SetWidth( std::max( col->GetWidth(), 10 ) );
1448 col->SetHidden( !col->IsHidden() );
1453 if( saveAndRebuild )
1463 if(
m_netsList->GetSelectedItemsCount() == 1 )
1467 if( selItem->GetIsGroup() )
1469 const wxString groupName = selItem->GetGroupName();
1471 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1473 return rule->GetPattern() == groupName;
1489 wxFileDialog dlg(
this,
_(
"Save Net Inspector Report File" ),
"",
"",
1491 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1495 if( dlg.ShowModal() == wxID_CANCEL )
1498 wxTextFile f( dlg.GetPath() );
1513 txt += wxString::Format(
_(
"%s (%s)" ),
1519 txt += col.csv_name;
1522 txt += wxT(
"\";" );
1528 const unsigned int num_rows =
m_dataModel->itemCount();
1530 for(
unsigned int row = 0; row < num_rows; row++ )
1534 if( i.GetIsGroup() || i.GetNetCode() == 0 )
1542 txt +=
'"' +
m_dataModel->valueAt( col.num, row ).GetString() + wxT(
"\";" );
1544 txt +=
m_dataModel->valueAt( col.num, row ).GetString() +
';';
1575 wxDataViewItemArray sel;
1580 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1587 renderSettings->
SetHighlight(
true, ( *c )->GetNetCode(),
true );
1600 m_frame->GetCanvas()->GetView()->UpdateAllLayersColor();
1601 m_frame->GetCanvas()->Refresh();
1623 wxString newNetName;
1636 if(
m_board->FindNet( newNetName ) )
1638 DisplayError(
this, wxString::Format(
_(
"Net name '%s' is already in use." ), newNetName ) );
1639 newNetName = wxEmptyString;
1658 if(
m_netsList->GetSelectedItemsCount() == 1 )
1668 wxString shortNetName;
1670 if( fullNetName.Contains( wxT(
"/" ) ) )
1672 netPath = fullNetName.BeforeLast(
'/' ) +
'/';
1673 shortNetName = fullNetName.AfterLast(
'/' );
1677 shortNetName = fullNetName;
1691 unescapedShortName = dlg.
GetValue();
1693 if( unescapedShortName.IsEmpty() )
1700 fullNetName = netPath + shortNetName;
1702 if(
m_board->FindNet( shortNetName ) ||
m_board->FindNet( fullNetName ) )
1704 DisplayError(
this, wxString::Format(
_(
"Net name '%s' is already in use." ), unescapedShortName ) );
1705 unescapedShortName = wxEmptyString;
1715 if( boardItem->GetNet() == net )
1731 boardItem->SetNet( net );
1736 if( std::optional<LIST_ITEM_ITER> r =
m_dataModel->findItem( net ) )
1737 m_netsList->Select( wxDataViewItem( r.value()->get() ) );
1745 m_frame->GetCanvas()->Refresh();
1755 wxDataViewItemArray sel;
1758 auto delete_one = [
this](
const LIST_ITEM* i )
1760 if( i->GetPadCount() == 0
1761 ||
IsOK(
this, wxString::Format(
_(
"Net '%s' is in use. Delete anyway?" ), i->GetNetName() ) ) )
1765 int removedCode = i->GetNetCode();
1767 m_frame->GetCanvas()->GetView()->UpdateAllItemsConditionally(
1772 if( boardItem && boardItem->GetNetCode() == removedCode )
1779 text->ClearRenderCache();
1780 text->ClearBoundingBoxCache();
1787 m_board->Remove( i->GetNet() );
1794 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1801 &&
IsOK(
this, wxString::Format(
_(
"Delete all nets in group '%s'?" ), ii->
GetGroupName() ) ) )
1805 std::vector<const LIST_ITEM*> children;
1853 bool displayed =
false;
1855 for(
unsigned int ii = 0; ii <
m_dataModel->columnCount() && !displayed; ++ii )
1857 if(
m_netsList->GetColumn( ii )->GetWidth() > 0 )
1878 wxDataViewColumn* sortingCol =
m_netsList->GetSortingColumn();
1879 cfg.sorting_column = sortingCol ?
static_cast<int>( sortingCol->GetModelColumn() ) : -1;
1880 cfg.sort_order_asc = sortingCol ? sortingCol->IsSortOrderAscending() :
true;
1883 cfg.col_order.resize(
m_dataModel->columnCount() );
1884 cfg.col_widths.resize(
m_dataModel->columnCount() );
1885 cfg.col_hidden.resize(
m_dataModel->columnCount() );
1887 for(
unsigned int ii = 0; ii <
m_dataModel->columnCount(); ++ii )
1889 cfg.col_order[ii] = (int)
m_netsList->GetColumn( ii )->GetModelColumn();
1890 cfg.col_widths[ii] =
m_netsList->GetColumn( ii )->GetWidth();
1891 cfg.col_hidden[ii] =
m_netsList->GetColumn( ii )->IsHidden();
1895 cfg.expanded_rows.clear();
1896 std::vector<std::pair<wxString, wxDataViewItem>> groupItems =
m_dataModel->getGroupDataViewItems();
1898 for( std::pair<wxString, wxDataViewItem>& item : groupItems )
1901 cfg.expanded_rows.push_back( item.first );
1905 cfg.custom_group_rules.clear();
1908 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)
int getMinColumnWidth(int aModelColumn) const
Computes the minimum display width for a column based on its header text.
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.
void autosizeColumn(wxDataViewColumn *aCol)
Auto-sizes a column to fit both its header text and content.
wxDataViewColumn * m_contextMenuColumn
Tracks which column the header context menu was opened for.
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 OnHeaderContextMenu(wxDataViewEvent &event)
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.
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.