44#include <wx/wupdlock.h>
45#include <wx/filedlg.h>
155 const std::vector<std::function<void(
void )>> add_col{
159 wxDATAVIEW_CELL_INERT, -1, wxALIGN_LEFT,
160 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_SORTABLE );
165 wxDATAVIEW_CELL_INERT, -1, wxALIGN_LEFT,
166 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
171 wxDATAVIEW_CELL_INERT, -1, wxALIGN_LEFT,
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 );
184 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
189 wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
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 );
201 wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
202 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
208 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
213 wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
214 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
234 const int totalNumColumns = (int) add_col.size() +
m_board->GetCopperLayerCount();
236 if( (
int) cfg->
col_order.size() != totalNumColumns
237 || (
int) cfg->
col_hidden.size() != totalNumColumns )
239 cfg->
col_order.resize( totalNumColumns );
242 for(
int i = 0; i < totalNumColumns; ++i )
252 if( col_order_set.size() != cfg->
col_order.size() )
254 for( std::size_t i = 0; i < cfg->
col_order.size(); ++i )
255 cfg->
col_order[i] =
static_cast<int>( i );
271 const int addModelColumn = i;
273 if( addModelColumn >= (
int) add_col.size() )
276 m_columns[addModelColumn], wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER,
277 wxDATAVIEW_COL_RESIZABLE|wxDATAVIEW_COL_REORDERABLE|wxDATAVIEW_COL_SORTABLE );
301 constexpr int margins = 15;
302 constexpr int extra_width = 30;
304 int headerWidth = GetTextExtent(
m_columns[aModelColumn].display_name ).x;
305 headerWidth += ( aModelColumn ==
COLUMN_NAME ) ? extra_width : margins;
313 if( !aCol || aCol->IsHidden() )
316 const unsigned int modelCol = aCol->GetModelColumn();
321 constexpr int margins = 15;
322 constexpr int extra_width = 30;
323 const bool isNameCol = ( modelCol ==
COLUMN_NAME );
324 const int padding = isNameCol ? extra_width : margins;
329 for(
unsigned int row = 0; row <
m_dataModel->itemCount(); ++row )
331 wxVariant value =
m_dataModel->valueAt( modelCol, row );
332 int textWidth = GetTextExtent( value.GetString() ).x + padding;
333 maxWidth = std::max( maxWidth, textWidth );
341 wxVariant childValue =
m_dataModel->valueForItem( *it, modelCol );
342 int childWidth = GetTextExtent( childValue.GetString() ).x + padding;
345 childWidth += indent;
347 maxWidth = std::max( maxWidth, childWidth );
352 aCol->SetWidth( maxWidth );
362 int minValueWidth = GetTextExtent( wxT(
"00000,000 mm" ) ).x;
363 int minNumberWidth = GetTextExtent( wxT(
"000" ) ).x;
364 int minNameWidth = GetTextExtent( wxT(
"MMMMMMMMMMMM" ) ).x;
370 constexpr int margins = 15;
371 constexpr int extra_width = 30;
373 auto getTargetWidth =
378 case COLUMN_NAME:
return minNameWidth + extra_width;
382 default:
return minValueWidth + margins;
388 for(
size_t i = 0; i <
m_columns.size(); ++i )
390 const int modelColumn = cfg->
col_order[i];
391 int titleSize = GetTextExtent(
m_columns[modelColumn].display_name ).x;
392 titleSize = modelColumn ==
COLUMN_NAME ? titleSize + extra_width : titleSize + margins;
393 const int valSize = getTargetWidth( modelColumn );
394 m_netsList->GetColumn( i )->SetWidth( std::max( titleSize, valSize ) );
402 for(
size_t ii = 0; ii <
m_columns.size(); ++ii )
404 const int modelCol =
static_cast<int>(
m_netsList->GetColumn( ii )->GetModelColumn() );
408 m_netsList->GetColumn( ii )->SetWidth( std::max( newWidth, minWidth ) );
419 if( sortingColumnId != -1 )
423 col->SetSortOrder( sortOrderAsc );
435 for(
unsigned int i = 0; i <
m_netsList->GetColumnCount(); ++i )
437 wxDataViewColumn* col =
m_netsList->GetColumn( i );
439 if(
static_cast<int>( col->GetModelColumn() ) == columnId )
484 for(
const auto& [groupName, groupItem] :
model->getGroupDataViewItems() )
492 wxDataViewItemArray sel;
495 std::vector<int> prev_selected_netcodes;
496 prev_selected_netcodes.reserve( sel.GetCount() );
498 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
501 prev_selected_netcodes.push_back( item->
GetNetCode() );
507 if( wxDataViewColumn* sorting_column =
m_netsList->GetSortingColumn() )
511 sorting_column_id =
static_cast<int>( sorting_column->GetModelColumn() );
512 sort_order_asc = sorting_column->IsSortOrderAscending();
516 sorting_column->UnsetAsSortKey();
533 std::vector<NETINFO_ITEM*> netCodes;
538 netCodes.emplace_back( ni );
541 std::ranges::sort( netCodes,
563 std::vector<std::pair<wxString, wxDataViewItem>> groupItems =
m_dataModel->getGroupDataViewItems();
568 [&groupName](
const std::pair<wxString, wxDataViewItem>& item )
570 return groupName == item.first;
573 auto tableItem = std::ranges::find_if( groupItems, pred );
575 if( tableItem != groupItems.end() )
585 for(
const int& nc : prev_selected_netcodes )
587 if( std::optional<LIST_ITEM_ITER> r =
m_dataModel->findItem( nc ) )
589 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
590 sel.Add( wxDataViewItem( list_item.get() ) );
628 bool matched =
false;
631 if( filterString.Length() == 0 )
635 if( !matched && cfg->
filter_by_netclass && netClassName.Find( filterString ) != wxNOT_FOUND )
639 if( !matched && cfg->
filter_by_net_name && netName.Find( filterString ) != wxNOT_FOUND )
646 matched = !netName.StartsWith( wxT(
"UNCONNECTED-(" ) );
667 const auto type_bits = std::bitset<MAX_STRUCT_TYPE_ID>().set(
PCB_TRACE_T )
672 std::vector<CN_ITEM*> cn_items;
673 cn_items.reserve( 1024 );
675 for(
CN_ITEM* cn_item :
m_board->GetConnectivity()->GetConnectivityAlgo()->ItemList() )
677 if( cn_item->Valid() && type_bits[cn_item->Parent()->Type()] )
678 cn_items.push_back( cn_item );
687std::vector<std::unique_ptr<PCB_NET_INSPECTOR_PANEL::LIST_ITEM>>
690 std::vector<std::unique_ptr<LIST_ITEM>> results;
698 std::unordered_map<int, std::vector<LENGTH_DELAY_CALCULATION_ITEM>> netItemsMap;
699 std::vector<NETINFO_ITEM*> foundNets;
701 auto itemItr = conItems.begin();
702 auto netCodeItr = aNetCodes.begin();
704 while( itemItr != conItems.end() && netCodeItr != aNetCodes.end() )
706 const int curNetCode = ( *netCodeItr )->GetNetCode();
707 const int curItemNetCode = ( *itemItr )->Net();
709 if( curItemNetCode == curNetCode )
711 if( foundNets.empty() || foundNets.back() != *netCodeItr )
712 foundNets.emplace_back( *netCodeItr );
716 netItemsMap[curItemNetCode].emplace_back( std::move( lengthItem ) );
719 else if( curItemNetCode < curNetCode )
722 while( itemItr != conItems.end() && ( *itemItr )->Net() < curNetCode )
725 else if( curItemNetCode > curNetCode )
728 while( netCodeItr != aNetCodes.end() && curItemNetCode > ( *netCodeItr )->GetNetCode() )
735 std::mutex resultsMutex;
738 auto resultsFuture =
tp.submit_loop(
740 [&,
this, calc](
const int i )
742 int netCode = foundNets[i]->GetNetCode();
744 constexpr PATH_OPTIMISATIONS opts = { .OptimiseVias = true,
746 .OptimiseTracesInPads = true,
747 .InferViaInPad = false };
750 netItemsMap[netCode],
758 if( aIncludeZeroPadNets || lengthDetails.NumPads > 0 )
760 std::unique_ptr<LIST_ITEM> new_item = std::make_unique<LIST_ITEM>( foundNets[i] );
762 new_item->SetPadCount( lengthDetails.NumPads );
763 new_item->SetLayerCount( m_board->GetCopperLayerCount() );
764 new_item->SetPadDieLength( lengthDetails.PadToDieLength );
765 new_item->SetPadDieDelay( lengthDetails.PadToDieDelay );
766 new_item->SetViaCount( lengthDetails.NumVias );
767 new_item->SetViaLength( lengthDetails.ViaLength );
768 new_item->SetViaDelay( lengthDetails.ViaDelay );
769 new_item->SetLayerWireLengths( *lengthDetails.LayerLengths );
771 if( m_showTimeDomainDetails )
772 new_item->SetLayerWireDelays( *lengthDetails.LayerDelays );
774 new_item->SetNetChainName( foundNets[i]->GetNetChain() );
775 new_item->SetNetChainLength( lengthDetails.TotalLength() );
777 std::scoped_lock lock( resultsMutex );
778 results.emplace_back( std::move( new_item ) );
784 std::map<wxString, int64_t> netChainLengths;
786 for(
const std::unique_ptr<LIST_ITEM>& item : results )
788 if( !item->GetNetChainName().IsEmpty() )
789 netChainLengths[item->GetNetChainName()] += item->GetTotalLength();
792 for(
FOOTPRINT* fp : m_board->Footprints() )
794 std::vector<PAD*> chainPads;
796 for(
PAD*
pad : fp->Pads() )
798 if(
pad->GetNet() && !
pad->GetNet()->GetNetChain().IsEmpty() )
799 chainPads.push_back(
pad );
802 for(
size_t i = 0; i < chainPads.size(); ++i )
804 for(
size_t j = i + 1; j < chainPads.size(); ++j )
812 VECTOR2I p1 = chainPads[i]->GetPosition();
813 VECTOR2I p2 = chainPads[j]->GetPosition();
814 int64_t dx = p1.
x - p2.
x;
815 int64_t dy = p1.
y - p2.
y;
816 int64_t dist =
KiROUND( std::hypot( (
double) dx, (
double) dy ) );
823 for( std::unique_ptr<LIST_ITEM>& item : results )
825 if( !item->GetNetChainName().IsEmpty() )
826 item->SetNetChainLength( netChainLengths[item->GetNetChainName()] );
842 return wxString::Format( wxT(
"%.3d" ), aNet->
GetNetCode() );
854 return wxString::Format( wxT(
"%u" ), aValue );
860 return m_frame->MessageTextFromValue( aValue,
867 return m_frame->MessageTextFromValue( aValue,
878 wxDataViewItemArray sel;
920 const std::vector<BOARD_ITEM*> item{ aBoardItem };
933 if( !IsShownOnScreen() )
937 if( aBoardItems.size()
944 std::vector<NETINFO_ITEM*> changedNets;
952 changedNets.emplace_back( net );
956 changedNets.emplace_back( i->GetNet() );
960 for(
const PAD*
pad : footprint->Pads() )
963 changedNets.emplace_back(
pad->GetNet() );
968 std::ranges::sort( changedNets,
983 std::vector<NETINFO_ITEM*> netsToUpdate;
984 std::unordered_set<NETINFO_ITEM*> netsToDelete;
989 netsToDelete.insert( net );
993 netsToUpdate.emplace_back( net );
996 wxWindowUpdateLocker updateLocker(
m_netsList );
998 std::vector<std::unique_ptr<LIST_ITEM>> newListItems =
calculateNets( aNets,
true );
1000 for( std::unique_ptr<LIST_ITEM>& newListItem : newListItems )
1003 netsToDelete.erase( newListItem->GetNet() );
1005 std::optional<LIST_ITEM_ITER> curNetRow =
m_dataModel->findItem( newListItem->GetNetCode() );
1019 const std::unique_ptr<LIST_ITEM>& curListItem = *curNetRow.value();
1021 if( curListItem->GetNetName() != newListItem->GetNetName() )
1029 curListItem->SetPadCount( newListItem->GetPadCount() );
1030 curListItem->SetPadDieLength( newListItem->GetPadDieLength() );
1031 curListItem->SetPadDieDelay( newListItem->GetPadDieDelay() );
1032 curListItem->SetViaCount( newListItem->GetViaCount() );
1033 curListItem->SetViaLength( newListItem->GetViaLength() );
1034 curListItem->SetViaDelay( newListItem->GetViaDelay() );
1035 curListItem->SetLayerWireLengths( newListItem->GetLayerWireLengths() );
1036 curListItem->SetNetChainName( newListItem->GetNetChainName() );
1037 curListItem->SetNetChainLength( newListItem->GetNetChainLength() );
1040 curListItem->SetLayerWireDelays( newListItem->GetLayerWireDelays() );
1054 const std::vector<BOARD_ITEM*> item{ aBoardItem };
1067 if( !IsShownOnScreen() )
1076 const std::vector<BOARD_ITEM*> item{ aBoardItem };
1088 std::vector<BOARD_ITEM*>& aAddedItems,
1089 std::vector<BOARD_ITEM*>& aRemovedItems,
1090 std::vector<BOARD_ITEM*>& aChangedItems )
1092 if( !IsShownOnScreen() )
1095 std::vector<BOARD_ITEM*> allItems{ aAddedItems.begin(), aAddedItems.end() };
1096 allItems.insert( allItems.end(), aRemovedItems.begin(), aRemovedItems.end() );
1097 allItems.insert( allItems.end(), aChangedItems.begin(), aChangedItems.end() );
1107 if( !
m_board->IsHighLightNetON() )
1113 const std::set<int>& selected_codes =
m_board->GetHighLightNetCodes();
1115 wxDataViewItemArray new_selection;
1116 new_selection.Alloc( selected_codes.size() );
1118 for(
const int code : selected_codes )
1120 if( std::optional<LIST_ITEM_ITER> r =
m_dataModel->findItem( code ) )
1121 new_selection.Add( wxDataViewItem( &***r ) );
1126 if( !new_selection.IsEmpty() )
1127 m_netsList->EnsureVisible( new_selection.Item( 0 ) );
1147 bool multipleSelections =
false;
1150 if(
m_netsList->GetSelectedItemsCount() == 1 )
1156 if(
m_netsList->GetSelectedItemsCount() > 1 )
1157 multipleSelections =
true;
1164 wxEmptyString, wxITEM_NORMAL );
1167 wxMenuItem* clearHighlighting =
new wxMenuItem( &menu,
ID_CLEAR_HIGHLIGHTING,
_(
"Clear Net Highlighting" ),
1168 wxEmptyString, wxITEM_NORMAL );
1169 menu.Append( clearHighlighting );
1174 if( selected_codes.size() == 0 )
1175 clearHighlighting->Enable(
false );
1177 menu.AppendSeparator();
1179 wxMenuItem* renameNet =
new wxMenuItem( &menu,
ID_RENAME_NET,
_(
"Rename Selected Net..." ), wxEmptyString,
1181 menu.Append( renameNet );
1183 wxMenuItem* deleteNet =
new wxMenuItem( &menu,
ID_DELETE_NET,
_(
"Delete Selected Net" ), wxEmptyString,
1185 menu.Append( deleteNet );
1187 menu.AppendSeparator();
1189 wxMenuItem* addNet =
new wxMenuItem( &menu,
ID_ADD_NET,
_(
"Add Net..." ), wxEmptyString, wxITEM_NORMAL );
1190 menu.Append( addNet );
1192 if( !selItem && !multipleSelections )
1195 deleteNet->Enable(
false );
1196 renameNet->Enable(
false );
1200 if( multipleSelections || selItem->
GetIsGroup() )
1202 highlightNet->SetItemLabel(
_(
"Highlight Selected Nets" ) );
1203 renameNet->Enable(
false );
1204 deleteNet->SetItemLabel(
_(
"Delete Selected Nets" ) );
1208 menu.AppendSeparator();
1211 _(
"Remove Selected Custom Group" ),
1212 wxEmptyString, wxITEM_NORMAL );
1213 menu.Append( removeSelectedGroup );
1216 removeSelectedGroup->Enable(
false );
1233 wxString newGroupName;
1237 wxStaticText*
help =
new wxStaticText( &dlg, wxID_ANY,
_(
"(Use /.../ to indicate a regular expression.)" ) );
1241 dlg.GetSizer()->SetSizeHints( &dlg );
1248 if( newGroupName ==
"" )
1252 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1254 return rule->GetPattern() == newGroupName;
1270 m_frame->GetCanvas()->GetView()->GetPainter()->GetSettings()->SetHighlight(
false );
1271 m_frame->GetCanvas()->GetView()->UpdateAllLayersColor();
1272 m_frame->GetCanvas()->Refresh();
1293 menu.AppendSeparator();
1308 if(
m_netsList->GetSelectedItemsCount() == 1 )
1317 wxEmptyString, wxITEM_CHECK );
1318 menu.Append( filterByNetName );
1319 filterByNetName->Check( cfg.filter_by_net_name );
1322 wxEmptyString, wxITEM_CHECK );
1323 menu.Append( filterByNetclass );
1324 filterByNetclass->Check( cfg.filter_by_netclass );
1326 menu.AppendSeparator();
1336 wxEmptyString, wxITEM_CHECK );
1337 menu.Append( groupNetclass );
1341 _(
"Group by Net Chain" ),
1342 wxEmptyString, wxITEM_CHECK );
1343 menu.Append( groupSignal );
1346 menu.AppendSeparator();
1348 wxMenuItem* addGroup =
new wxMenuItem( &menu,
ID_ADD_GROUP,
_(
"Add Custom Group..." ),
1349 wxEmptyString, wxITEM_NORMAL );
1350 menu.Append( addGroup );
1353 _(
"Remove Selected Custom Group" ),
1354 wxEmptyString, wxITEM_NORMAL );
1355 menu.Append( removeSelectedGroup );
1358 removeSelectedGroup->Enable(
false );
1360 wxMenuItem* removeCustomGroups =
new wxMenuItem( &menu,
ID_REMOVE_GROUPS,
_(
"Remove All Custom Groups" ),
1361 wxEmptyString, wxITEM_NORMAL );
1362 menu.Append( removeCustomGroups );
1365 menu.AppendSeparator();
1368 wxEmptyString, wxITEM_CHECK );
1369 menu.Append( showZeroNetPads );
1373 wxEmptyString, wxITEM_CHECK );
1374 menu.Append( showUnconnectedNets );
1377 menu.AppendSeparator();
1380 _(
"Show Time Domain Details" ),
1381 wxEmptyString, wxITEM_CHECK );
1382 menu.Append( showTimeDomainDetails );
1385 menu.AppendSeparator();
1389 wxEmptyString, wxITEM_NORMAL );
1392 menu.AppendSeparator();
1395 wxMenu* colsMenu =
new wxMenu();
1397 menu.AppendSubMenu( colsMenu,
_(
"Show / Hide Columns" ) );
1410 wxEmptyString, wxITEM_CHECK );
1412 target->Append( opt );
1413 opt->Check( !col->IsHidden() );
1416 target->AppendSeparator();
1421 wxEmptyString, wxITEM_CHECK );
1423 target->Append( opt );
1424 opt->Check( !col->IsHidden() );
1431 bool saveAndRebuild =
true;
1433 switch( event.GetId() )
1493 saveAndRebuild =
false;
1498 saveAndRebuild =
false;
1503 saveAndRebuild =
false;
1510 saveAndRebuild =
false;
1514 for(
unsigned int i = 0; i <
m_netsList->GetColumnCount(); ++i )
1517 saveAndRebuild =
false;
1526 col->SetWidth( std::max( col->GetWidth(), 10 ) );
1527 col->SetHidden( !col->IsHidden() );
1532 if( saveAndRebuild )
1542 if(
m_netsList->GetSelectedItemsCount() == 1 )
1546 if( selItem->GetIsGroup() )
1548 const wxString groupName = selItem->GetGroupName();
1550 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1552 return rule->GetPattern() == groupName;
1568 wxFileDialog dlg(
this,
_(
"Save Net Inspector Report File" ),
"",
"",
1570 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1574 if( dlg.ShowModal() == wxID_CANCEL )
1577 wxTextFile f( dlg.GetPath() );
1592 txt += wxString::Format(
_(
"%s (%s)" ),
1598 txt += col.csv_name;
1601 txt += wxT(
"\";" );
1607 const unsigned int num_rows =
m_dataModel->itemCount();
1609 for(
unsigned int row = 0; row < num_rows; row++ )
1613 if( i.GetIsGroup() || i.GetNetCode() == 0 )
1621 txt +=
'"' +
m_dataModel->valueAt( col.num, row ).GetString() + wxT(
"\";" );
1623 txt +=
m_dataModel->valueAt( col.num, row ).GetString() +
';';
1654 wxDataViewItemArray sel;
1659 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1666 renderSettings->
SetHighlight(
true, ( *c )->GetNetCode(),
true );
1679 m_frame->GetCanvas()->GetView()->UpdateAllLayersColor();
1680 m_frame->GetCanvas()->Refresh();
1702 wxString newNetName;
1715 if(
m_board->FindNet( newNetName ) )
1717 DisplayError(
this, wxString::Format(
_(
"Net name '%s' is already in use." ), newNetName ) );
1718 newNetName = wxEmptyString;
1737 if(
m_netsList->GetSelectedItemsCount() == 1 )
1747 wxString shortNetName;
1749 if( fullNetName.Contains( wxT(
"/" ) ) )
1751 netPath = fullNetName.BeforeLast(
'/' ) +
'/';
1752 shortNetName = fullNetName.AfterLast(
'/' );
1756 shortNetName = fullNetName;
1770 unescapedShortName = dlg.
GetValue();
1772 if( unescapedShortName.IsEmpty() )
1779 fullNetName = netPath + shortNetName;
1781 if(
m_board->FindNet( shortNetName ) ||
m_board->FindNet( fullNetName ) )
1783 DisplayError(
this, wxString::Format(
_(
"Net name '%s' is already in use." ), unescapedShortName ) );
1784 unescapedShortName = wxEmptyString;
1794 if( boardItem->GetNet() == net )
1810 boardItem->SetNet( net );
1815 if( std::optional<LIST_ITEM_ITER> r =
m_dataModel->findItem( net ) )
1816 m_netsList->Select( wxDataViewItem( r.value()->get() ) );
1824 m_frame->GetCanvas()->Refresh();
1834 wxDataViewItemArray sel;
1837 auto delete_one = [
this](
const LIST_ITEM* i )
1839 if( i->GetPadCount() == 0
1840 ||
IsOK(
this, wxString::Format(
_(
"Net '%s' is in use. Delete anyway?" ), i->GetNetName() ) ) )
1844 int removedCode = i->GetNetCode();
1846 m_frame->GetCanvas()->GetView()->UpdateAllItemsConditionally(
1851 if( boardItem && boardItem->GetNetCode() == removedCode )
1858 text->ClearRenderCache();
1859 text->ClearBoundingBoxCache();
1866 m_board->Remove( i->GetNet() );
1873 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1880 &&
IsOK(
this, wxString::Format(
_(
"Delete all nets in group '%s'?" ), ii->
GetGroupName() ) ) )
1884 std::vector<const LIST_ITEM*> children;
1932 bool displayed =
false;
1934 for(
unsigned int ii = 0; ii <
m_dataModel->columnCount() && !displayed; ++ii )
1936 if(
m_netsList->GetColumn( ii )->GetWidth() > 0 )
1958 wxDataViewColumn* sortingCol =
m_netsList->GetSortingColumn();
1959 cfg.sorting_column = sortingCol ?
static_cast<int>( sortingCol->GetModelColumn() ) : -1;
1960 cfg.sort_order_asc = sortingCol ? sortingCol->IsSortOrderAscending() :
true;
1963 cfg.col_order.resize(
m_dataModel->columnCount() );
1964 cfg.col_widths.resize(
m_dataModel->columnCount() );
1965 cfg.col_hidden.resize(
m_dataModel->columnCount() );
1967 for(
unsigned int ii = 0; ii <
m_dataModel->columnCount(); ++ii )
1969 cfg.col_order[ii] = (int)
m_netsList->GetColumn( ii )->GetModelColumn();
1970 cfg.col_widths[ii] =
m_netsList->GetColumn( ii )->GetWidth();
1971 cfg.col_hidden[ii] =
m_netsList->GetColumn( ii )->IsHidden();
1975 cfg.expanded_rows.clear();
1976 std::vector<std::pair<wxString, wxDataViewItem>> groupItems =
m_dataModel->getGroupDataViewItems();
1978 for( std::pair<wxString, wxDataViewItem>& item : groupItems )
1981 cfg.expanded_rows.push_back( item.first );
1985 cfg.custom_group_rules.clear();
1988 cfg.custom_group_rules.push_back( rule->GetPattern() );
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
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.
const wxString & GetNetChain() const
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.
@ COLUMN_NET_CHAIN_LENGTH
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.
VECTOR2< int32_t > VECTOR2I
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.