39#include <wx/wupdlock.h>
40#include <wx/headerctrl.h>
41#include <wx/filedlg.h>
57 if(
m_brd !=
nullptr )
71 m_netsList->Bind( wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK,
73 m_netsList->Bind( wxEVT_DATAVIEW_ITEM_CONTEXT_MENU,
75 m_netsList->Bind( wxEVT_DATAVIEW_ITEM_ACTIVATED,
77 m_netsList->Bind( wxEVT_DATAVIEW_COLUMN_SORTED,
87 if(
m_brd !=
nullptr )
96 m_netsList->Unbind( wxEVT_DATAVIEW_ITEM_COLLAPSED,
98 m_netsList->Unbind( wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK,
100 m_netsList->Unbind( wxEVT_DATAVIEW_ITEM_CONTEXT_MENU,
102 m_netsList->Unbind( wxEVT_DATAVIEW_ITEM_ACTIVATED,
104 m_netsList->Unbind( wxEVT_DATAVIEW_COLUMN_SORTED,
138 std::vector<std::function<void(
void )>> add_col{
144 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_SORTABLE );
151 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
152 | wxDATAVIEW_COL_SORTABLE );
159 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
160 | wxDATAVIEW_COL_SORTABLE );
167 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
168 | wxDATAVIEW_COL_SORTABLE );
175 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
176 | wxDATAVIEW_COL_SORTABLE );
183 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
184 | wxDATAVIEW_COL_SORTABLE );
191 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
192 | wxDATAVIEW_COL_SORTABLE );
199 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
200 | wxDATAVIEW_COL_SORTABLE );
231 if( (
int) cfg->
col_order.size() != totalNumColumns
232 || (
int) cfg->
col_hidden.size() != totalNumColumns )
234 cfg->
col_order.resize( totalNumColumns );
237 for(
int i = 0; i < totalNumColumns; ++i )
246 if( col_order_set.size() != cfg->
col_order.size() )
248 for( std::size_t i = 0; i < cfg->
col_order.size(); ++i )
263 for( std::size_t i = 0; i < cfg->
col_order.size(); ++i )
265 const int addModelColumn = cfg->
col_order[i];
267 if( addModelColumn >= (
int) add_col.size() )
270 m_columns[addModelColumn], wxDATAVIEW_CELL_INERT, -1,
272 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
273 | wxDATAVIEW_COL_SORTABLE );
303 int minValueWidth = GetTextExtent( wxT(
"00000,000 mm" ) ).x;
304 int minNumberWidth = GetTextExtent( wxT(
"000" ) ).x;
305 int minNameWidth = GetTextExtent( wxT(
"MMMMMMMMMMMM" ) ).x;
311 const int margins = 15;
312 const int extra_width = 30;
314 auto getTargetWidth = [&](
int columnID )
318 case COLUMN_NAME:
return minNameWidth + extra_width;
322 default:
return minValueWidth + margins;
328 for(
size_t i = 0; i <
m_columns.size(); ++i )
330 const int modelColumn = cfg->
col_order[i];
331 int titleSize = GetTextExtent(
m_columns[modelColumn].display_name ).x;
332 titleSize = modelColumn ==
COLUMN_NAME ? titleSize + extra_width : titleSize + margins;
333 const int valSize = getTargetWidth( modelColumn );
334 m_netsList->GetColumn( i )->SetWidth( std::max( titleSize, valSize ) );
342 for(
size_t ii = 0; ii <
m_columns.size(); ++ii )
346 m_netsList->GetColumn( ii )->SetWidth( std::max( newWidth, 10 ) );
357 if( sortingColumnId != -1 )
361 col->SetSortOrder( sortOrderAsc );
373 for(
unsigned int i = 0; i <
m_netsList->GetColumnCount(); ++i )
375 wxDataViewColumn* col =
m_netsList->GetColumn( i );
377 if( (
int) col->GetModelColumn() == columnId )
413 wxDataViewItemArray sel;
416 std::vector<int> prev_selected_netcodes;
417 prev_selected_netcodes.reserve( sel.GetCount() );
419 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
422 prev_selected_netcodes.push_back( item->
GetNetCode() );
428 if( wxDataViewColumn* sorting_column =
m_netsList->GetSortingColumn() )
432 sorting_column_id =
static_cast<int>( sorting_column->GetModelColumn() );
433 sort_order_asc = sorting_column->IsSortOrderAscending();
437 sorting_column->UnsetAsSortKey();
455 std::vector<std::unique_ptr<LIST_ITEM>> new_items;
463 unsigned int pad_count;
466 struct NET_INFO_CMP_LESS
468 bool operator()(
const NET_INFO& a,
const NET_INFO& b )
const
470 return a.netcode < b.netcode;
472 bool operator()(
const NET_INFO& a,
int b )
const {
return a.netcode < b; }
473 bool operator()(
int a,
const NET_INFO& b )
const {
return a < b.netcode; }
476 std::vector<NET_INFO> nets;
485 nets.emplace_back( NET_INFO{ ni.first, ni.second, 0 } );
492 for(
PAD*
pad : footprint->Pads() )
494 auto i = std::lower_bound( nets.begin(), nets.end(),
pad->GetNetCode(),
495 NET_INFO_CMP_LESS() );
497 if( i != nets.end() && i->netcode ==
pad->GetNetCode() )
502 for( NET_INFO& ni : nets )
505 new_items.emplace_back(
buildNewItem( ni.net, ni.pad_count, prefiltered_cn_items ) );
522 std::vector<std::pair<wxString, wxDataViewItem>> groupItems =
528 [&groupName](
const std::pair<wxString, wxDataViewItem>& item )
530 return groupName == item.first;
533 auto tableItem = std::find_if( groupItems.begin(), groupItems.end(), pred );
535 if( tableItem != groupItems.end() )
545 for(
int& nc : prev_selected_netcodes )
547 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( nc );
551 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
552 sel.Add( wxDataViewItem( list_item.get() ) );
594 bool matched =
false;
597 if( filterString.Length() == 0 )
601 if( !matched && cfg->
filter_by_netclass && netClassName.Find( filterString ) != wxNOT_FOUND )
605 if( !matched && cfg->
filter_by_net_name && netName.Find( filterString ) != wxNOT_FOUND )
612 matched = !netName.StartsWith( wxT(
"UNCONNECTED-(" ) );
629std::unique_ptr<PCB_NET_INSPECTOR_PANEL::LIST_ITEM>
631 const std::vector<CN_ITEM*>& aCNItems )
633 std::unique_ptr<LIST_ITEM> new_item = std::make_unique<LIST_ITEM>( aNet );
635 new_item->SetPadCount( aPadCount );
637 const auto cn_items = std::equal_range( aCNItems.begin(), aCNItems.end(), aNet->
GetNetCode(),
640 for(
auto i = cn_items.first; i != cn_items.second; ++i )
646 new_item->AddPadDieLength(
static_cast<PAD*
>( item )->GetPadToDieLength() );
650 new_item->AddLayerWireLength( track->GetLength(),
651 static_cast<int>( track->GetLayer() ) );
655 new_item->AddViaCount( 1 );
670 const auto type_bits = std::bitset<MAX_STRUCT_TYPE_ID>()
676 std::vector<CN_ITEM*> cn_items;
677 cn_items.reserve( 1024 );
681 if( cn_item->Valid() && type_bits[cn_item->Parent()->Type()] )
682 cn_items.push_back( cn_item );
709 for(
int layer =
via->TopLayer(); layer <=
via->BottomLayer(); ++layer )
721 top_layer =
via->TopLayer();
723 bottom_layer =
via->BottomLayer();
733 int effectiveBottomLayer;
735 if(
via->BottomLayer() ==
B_Cu )
736 effectiveBottomLayer =
F_Cu + dielectricLayers;
738 effectiveBottomLayer =
via->BottomLayer();
740 int layerCount = effectiveBottomLayer -
via->TopLayer();
742 return layerCount * layerThickness;
759 std::optional<LIST_ITEM_ITER> cur_net_row =
m_data_model->findItem( aNet );
769 std::unique_ptr<LIST_ITEM> new_list_item =
buildNewItem( aNet, node_count,
778 const std::unique_ptr<LIST_ITEM>& cur_list_item = *cur_net_row.value();
780 if( cur_list_item->GetNetName() != new_list_item->GetNetName() )
790 cur_list_item->SetPadCount( new_list_item->GetPadCount() );
791 cur_list_item->SetViaCount( new_list_item->GetViaCount() );
794 cur_list_item->SetLayerWireLength( new_list_item->GetLayerWireLength( ii ), ii );
796 cur_list_item->SetPadDieLength( new_list_item->GetPadDieLength() );
812 return wxString::Format( wxT(
"%.3d" ), aNet->
GetNetCode() );
824 return wxString::Format( wxT(
"%u" ), aValue );
841 wxDataViewItemArray sel;
865 if(
m_brd !=
nullptr )
882 if( !IsShownOnScreen() )
892 std::unique_ptr<LIST_ITEM> new_item = std::make_unique<LIST_ITEM>( net );
902 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( i->GetNet() );
909 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
910 int len = track->GetLength();
912 list_item->AddLayerWireLength( len,
static_cast<int>( track->GetLayer() ) );
916 list_item->AddViaCount( 1 );
930 for(
const PAD*
pad : footprint->Pads() )
932 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem(
pad->GetNet() );
942 r =
m_data_model->addItem( std::make_unique<LIST_ITEM>(
pad->GetNet() ) );
947 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
948 int len =
pad->GetPadToDieLength();
950 list_item->AddPadCount( 1 );
951 list_item->AddPadDieLength( len );
964 std::vector<BOARD_ITEM*>& aBoardItems )
966 if( !IsShownOnScreen() )
970 if( aBoardItems.size() > 25 )
987 if( !IsShownOnScreen() )
996 for(
const PAD*
pad : footprint->Pads() )
998 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem(
pad->GetNet() );
1002 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
1003 int len =
pad->GetPadToDieLength();
1005 list_item->SubPadCount( 1 );
1006 list_item->SubPadDieLength( len );
1017 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( i->GetNet() );
1024 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
1025 int len = track->GetLength();
1027 list_item->SubLayerWireLength( len,
static_cast<int>( track->GetLayer() ) );
1031 list_item->SubViaCount( 1 );
1047 std::vector<BOARD_ITEM*>& aBoardItems )
1049 if( !IsShownOnScreen() )
1052 if( aBoardItems.size() > 25 )
1069 if( !IsShownOnScreen() )
1079 if( !IsShownOnScreen() )
1083 ||
dynamic_cast<FOOTPRINT*
>( aBoardItem ) !=
nullptr )
1092 std::vector<BOARD_ITEM*>& aBoardItems )
1094 if( !IsShownOnScreen() )
1103 std::vector<BOARD_ITEM*>& aAddedItems,
1104 std::vector<BOARD_ITEM*>& aRemovedItems,
1105 std::vector<BOARD_ITEM*>& aDeletedItems )
1107 if( !IsShownOnScreen() )
1128 wxDataViewItemArray new_selection;
1129 new_selection.Alloc( selected_codes.size() );
1131 for(
int code : selected_codes )
1133 if( std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( code ) )
1134 new_selection.Add( wxDataViewItem( &***r ) );
1139 if( !new_selection.IsEmpty() )
1140 m_netsList->EnsureVisible( new_selection.Item( 0 ) );
1160 bool multipleSelections =
false;
1163 if(
m_netsList->GetSelectedItemsCount() == 1 )
1169 if(
m_netsList->GetSelectedItemsCount() > 1 )
1170 multipleSelections =
true;
1177 _(
"Highlight Selected Net" ),
1178 wxEmptyString, wxITEM_NORMAL );
1182 _(
"Clear Net Highlighting" ),
1183 wxEmptyString, wxITEM_NORMAL );
1184 menu.Append( clearHighlighting );
1189 if( selected_codes.size() == 0 )
1190 clearHighlighting->Enable(
false );
1192 menu.AppendSeparator();
1194 wxMenuItem* renameNet =
new wxMenuItem( &menu,
ID_RENAME_NET,
_(
"Rename Selected Net" ),
1195 wxEmptyString, wxITEM_NORMAL );
1196 menu.Append( renameNet );
1198 wxMenuItem* deleteNet =
new wxMenuItem( &menu,
ID_DELETE_NET,
_(
"Delete Selected Net" ),
1199 wxEmptyString, wxITEM_NORMAL );
1200 menu.Append( deleteNet );
1202 menu.AppendSeparator();
1204 wxMenuItem* addNet =
new wxMenuItem( &menu,
ID_ADD_NET,
_(
"Add Net" ),
1205 wxEmptyString, wxITEM_NORMAL );
1206 menu.Append( addNet );
1208 if( !selItem && !multipleSelections )
1211 deleteNet->Enable(
false );
1212 renameNet->Enable(
false );
1216 if( multipleSelections || selItem->
GetIsGroup() )
1218 highlightNet->SetItemLabel(
_(
"Highlight Selected Nets" ) );
1219 renameNet->Enable(
false );
1220 deleteNet->SetItemLabel(
_(
"Delete Selected Nets" ) );
1224 menu.AppendSeparator();
1227 _(
"Remove Selected Custom Group" ),
1228 wxEmptyString, wxITEM_NORMAL );
1229 menu.Append( removeSelectedGroup );
1232 removeSelectedGroup->Enable(
false );
1249 wxString newGroupName;
1253 wxStaticText*
help =
new wxStaticText( &dlg, wxID_ANY,
1254 _(
"(Use /.../ to indicate a regular expression.)" ) );
1258 dlg.GetSizer()->SetSizeHints( &dlg );
1260 if( dlg.ShowModal() != wxID_OK || dlg.
GetValue().IsEmpty() )
1265 if( newGroupName ==
"" )
1269 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1271 return rule->GetPattern().Upper() == newGroupName.Upper();
1318 if(
m_netsList->GetSelectedItemsCount() == 1 )
1327 _(
"Filter by Net Name" ),
1328 wxEmptyString, wxITEM_CHECK );
1329 filterByNetName->Check( cfg.filter_by_net_name );
1330 menu.Append( filterByNetName );
1333 _(
"Filter by Netclass" ),
1334 wxEmptyString, wxITEM_CHECK );
1335 filterByNetclass->Check( cfg.filter_by_netclass );
1336 menu.Append( filterByNetclass );
1338 menu.AppendSeparator();
1348 _(
"Group by Netclass" ),
1349 wxEmptyString, wxITEM_CHECK );
1351 menu.Append( groupNetclass );
1353 menu.AppendSeparator();
1355 wxMenuItem* addGroup =
new wxMenuItem( &menu,
ID_ADD_GROUP,
_(
"Add Custom Group" ),
1356 wxEmptyString, wxITEM_NORMAL );
1357 menu.Append( addGroup );
1360 _(
"Remove Selected Custom Group" ),
1361 wxEmptyString, wxITEM_NORMAL );
1362 menu.Append( removeSelectedGroup );
1365 removeSelectedGroup->Enable(
false );
1368 _(
"Remove All Custom Groups" ),
1369 wxEmptyString, wxITEM_NORMAL );
1370 menu.Append( removeCustomGroups );
1373 menu.AppendSeparator();
1376 _(
"Show Zero Pad Nets" ),
1377 wxEmptyString, wxITEM_CHECK );
1379 menu.Append( showZeroNetPads );
1382 _(
"Show Unconnected Nets" ),
1383 wxEmptyString, wxITEM_CHECK );
1385 menu.Append( showUnconnectedNets );
1387 menu.AppendSeparator();
1391 _(
"Save Net Inspector Report" ),
1392 wxEmptyString, wxITEM_NORMAL );
1395 menu.AppendSeparator();
1398 wxMenu* colsMenu =
new wxMenu();
1400 menu.AppendSubMenu( colsMenu,
_(
"Show / Hide Columns" ) );
1413 wxEmptyString, wxITEM_CHECK );
1415 target->Append( opt );
1416 opt->Check( !col->IsHidden() );
1419 target->AppendSeparator();
1424 wxEmptyString, wxITEM_CHECK );
1426 target->Append( opt );
1427 opt->Check( !col->IsHidden() );
1434 bool saveAndRebuild =
true;
1436 switch( event.GetId() )
1488 saveAndRebuild =
false;
1493 saveAndRebuild =
false;
1498 saveAndRebuild =
false;
1507 col->SetWidth( std::max( col->GetWidth(), 10 ) );
1508 col->SetHidden( !col->IsHidden() );
1513 if( saveAndRebuild )
1523 if(
m_netsList->GetSelectedItemsCount() == 1 )
1527 if( selItem->GetIsGroup() )
1531 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1533 return rule->GetPattern() == groupName;
1549 wxFileDialog dlg(
this,
_(
"Save Net Inspector Report File" ),
"",
"",
1551 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1553 if( dlg.ShowModal() == wxID_CANCEL )
1556 wxTextFile f( dlg.GetPath() );
1571 txt += wxString::Format(
_(
"%s (%s)" ),
1577 txt += col.csv_name;
1580 txt += wxT(
"\";" );
1586 const unsigned int num_rows =
m_data_model->itemCount();
1588 for(
unsigned int row = 0; row < num_rows; row++ )
1592 if( i.GetIsGroup() || i.GetNetCode() == 0 )
1600 txt +=
'"' +
m_data_model->valueAt( col.num, row ).GetString() + wxT(
"\";" );
1602 txt +=
m_data_model->valueAt( col.num, row ).GetString() +
';';
1633 wxDataViewItemArray sel;
1638 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1645 renderSettings->
SetHighlight(
true, ( *c )->GetNetCode(), true );
1681 wxString newNetName;
1689 if( dlg.ShowModal() != wxID_OK || dlg.
GetValue().IsEmpty() )
1697 wxString::Format(
_(
"Net name '%s' is already in use." ), newNetName ) );
1698 newNetName = wxEmptyString;
1717 if(
m_netsList->GetSelectedItemsCount() == 1 )
1727 wxString shortNetName;
1729 if( fullNetName.Contains( wxT(
"/" ) ) )
1731 netPath = fullNetName.BeforeLast(
'/' ) +
'/';
1732 shortNetName = fullNetName.AfterLast(
'/' );
1736 shortNetName = fullNetName;
1747 if( dlg.ShowModal() != wxID_OK || dlg.
GetValue() == unescapedShortName )
1750 unescapedShortName = dlg.
GetValue();
1752 if( unescapedShortName.IsEmpty() )
1754 DisplayError(
this, wxString::Format(
_(
"Net name cannot be empty." ),
1755 unescapedShortName ) );
1760 fullNetName = netPath + shortNetName;
1764 DisplayError(
this, wxString::Format(
_(
"Net name '%s' is already in use." ),
1765 unescapedShortName ) );
1766 unescapedShortName = wxEmptyString;
1776 if( boardItem->GetNet() == net )
1792 boardItem->SetNet( net );
1797 if( std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( net ) )
1798 m_netsList->Select( wxDataViewItem( r.value()->get() ) );
1816 wxDataViewItemArray sel;
1819 auto delete_one = [
this](
const LIST_ITEM* i )
1821 if( i->GetPadCount() == 0
1822 ||
IsOK(
this, wxString::Format(
_(
"Net '%s' is in use. Delete anyway?" ),
1823 i->GetNetName() ) ) )
1827 int removedCode = i->GetNetCode();
1834 if( boardItem && boardItem->GetNetCode() == removedCode )
1841 text->ClearRenderCache();
1842 text->ClearBoundingBoxCache();
1856 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1863 &&
IsOK(
this, wxString::Format(
_(
"Delete all nets in group '%s'?" ),
1868 std::vector<const LIST_ITEM*> children;
1932 wxDataViewColumn* sortingCol =
m_netsList->GetSortingColumn();
1933 cfg.sorting_column = sortingCol ?
static_cast<int>( sortingCol->GetModelColumn() ) : -1;
1934 cfg.sort_order_asc = sortingCol ? sortingCol->IsSortOrderAscending() :
true;
1941 for(
unsigned int ii = 0; ii <
m_data_model->columnCount(); ++ii )
1943 cfg.col_order[ii] = (int)
m_netsList->GetColumn( ii )->GetModelColumn();
1944 cfg.col_widths[ii] =
m_netsList->GetColumn( ii )->GetWidth();
1945 cfg.col_hidden[ii] =
m_netsList->GetColumn( ii )->IsHidden();
1949 cfg.expanded_rows.clear();
1950 std::vector<std::pair<wxString, wxDataViewItem>> groupItems =
1953 for( std::pair<wxString, wxDataViewItem>& item : groupItems )
1956 cfg.expanded_rows.push_back( item.first );
1960 cfg.custom_group_rules.clear();
1963 cfg.custom_group_rules.push_back( rule->GetPattern() );
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
Container for design settings for a BOARD object.
int GetBoardThickness() const
The full thickness of the board including copper and masks.
BOARD_STACKUP & GetStackupDescriptor()
int GetCopperLayerCount() const
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Manage layers needed to make a physical board.
int GetLayerDistance(PCB_LAYER_ID aFirstLayer, PCB_LAYER_ID aSecondLayer) const
Calculate the distance (height) between the two given copper layers.
Information pertinent to a Pcbnew printed circuit board.
const NETINFO_LIST & GetNetInfo() const
LSET GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
const std::set< int > & GetHighLightNetCodes() const
const std::vector< BOARD_CONNECTED_ITEM * > AllConnectedItems()
void AddListener(BOARD_LISTENER *aListener)
Add a listener to the board to receive calls whenever something on the board has been modified.
NETINFO_ITEM * FindNet(int aNetcode) const
Search for a net with the given netcode.
const FOOTPRINTS & Footprints() const
unsigned GetNodesCount(int aNet=-1) const
bool IsHighLightNetON() const
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
void RemoveListener(BOARD_LISTENER *aListener)
Remove the specified listener.
void Remove(BOARD_ITEM *aBoardItem, REMOVE_MODE aMode=REMOVE_MODE::NORMAL) override
Removes an item from the container.
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
CN_ITEM represents a BOARD_CONNETED_ITEM in the connectivity system (ie: a pad, track/arc/via,...
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
KICAD_T Type() const
Returns the type of object.
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
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.
void UpdateAllLayersColor()
Apply the new coloring scheme to all layers.
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
void UpdateAllItemsConditionally(int aUpdateFlags, std::function< bool(VIEW_ITEM *)> aCondition)
Update items in the view according to the given flags and condition.
LSEQ Seq(const PCB_LAYER_ID *aWishListSequence, unsigned aCount) const
Return an LSEQ from the union of this LSET and a desired sequence.
A collection of nets and the parameters used to route or test these nets.
const wxString GetName() const
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
const NETCODES_MAP & NetsByNetcode() const
Return the netcode map, at least for python.
A base class used to implement docking net inspector panels.
wxDataViewCtrl * m_netsList
wxSearchCtrl * m_searchCtrl
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
The main frame for Pcbnew.
void OnModify() override
Must be called after a board change to set the modified flag.
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
virtual void OnBoardItemRemoved(BOARD &aBoard, BOARD_ITEM *aBoardItem) override
virtual void OnBoardHighlightNetChanged(BOARD &aBoard) override
void generateReport()
Generates a CSV report from currently disaplyed data.
wxString formatCount(unsigned int aValue) const
PCB_NET_INSPECTOR_PANEL(wxWindow *parent, PCB_EDIT_FRAME *aFrame)
void onDeleteSelectedNet()
virtual void OnBoardItemsChanged(BOARD &aBoard, std::vector< BOARD_ITEM * > &aBoardItems) override
virtual void OnSearchTextChanged(wxCommandEvent &event) override
virtual void OnBoardItemsRemoved(BOARD &aBoard, std::vector< BOARD_ITEM * > &aBoardItems) override
void onClearHighlighting()
bool m_in_build_nets_list
virtual void OnBoardChanged() override
Update panel when board is changed.
void generateShowHideColumnMenu(wxMenu *target)
Generates a sub-menu for the show / hide columns submenu.
wxString formatNetCode(const NETINFO_ITEM *aNet) const
bool m_filter_by_net_name
std::unique_ptr< LIST_ITEM > buildNewItem(NETINFO_ITEM *aNet, unsigned int aPadCount, const std::vector< CN_ITEM * > &aCNItems)
Constructs a LIST_ITEM for storage in the data model from a board net item.
std::vector< std::unique_ptr< EDA_COMBINED_MATCHER > > m_custom_group_rules
bool m_show_zero_pad_nets
wxString formatNetName(const NETINFO_ITEM *aNet) const
void onSettingsMenu(wxCommandEvent &event)
std::vector< CN_ITEM * > relevantConnectivityItems() const
Filters connectivity items from a board update to remove those not related to net / track metrics.
unsigned int calculateViaLength(const PCB_TRACK *) const
Calculates the length of a via from the board stackup.
void highlightSelectedNets()
Highlight the currently selected net.
NETINFO_ITEM * m_zero_netitem
virtual void OnBoardCompositeUpdate(BOARD &aBoard, std::vector< BOARD_ITEM * > &aAddedItems, std::vector< BOARD_ITEM * > &aRemovedItems, std::vector< BOARD_ITEM * > &aDeletedItems) override
virtual void OnBoardItemsAdded(BOARD &aBoard, std::vector< BOARD_ITEM * > &aBoardItems) override
wxObjectDataPtr< DATA_MODEL > m_data_model
bool m_filter_by_netclass
bool m_group_by_constraint
void updateNet(NETINFO_ITEM *aNet)
Updates the stored LIST_ITEMs for a given updated board net item.
virtual void OnLanguageChangedImpl() override
Reloads strings on an application language change.
void OnNetsListContextMenu(wxDataViewEvent &event)
virtual void OnBoardNetSettingsChanged(BOARD &aBoard) override
void OnNetsListItemActivated(wxDataViewEvent &event)
void OnColumnSorted(wxDataViewEvent &event)
void updateDisplayedRowValues(const std::optional< LIST_ITEM_ITER > &aRow)
void onRemoveSelectedGroup()
@ ID_SHOW_UNCONNECTED_NETS
@ ID_REMOVE_SELECTED_GROUP
@ ID_HIGHLIGHT_SELECTED_NETS
virtual ~PCB_NET_INSPECTOR_PANEL()
virtual void OnBoardItemAdded(BOARD &aBoard, BOARD_ITEM *aBoardItem) override
virtual 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.
virtual void OnConfigButton(wxCommandEvent &event) override
void buildNetsList(bool rebuildColumns=false)
bool restoreSortColumn(int sortingColumnId, bool sortOrderAsc)
Sets the sort column in the grid to that showing the given model ID column.
wxString formatLength(int64_t aValue) const
virtual void SaveSettings() override
Persist the net inspector configuration to project / global settings.
void onRenameSelectedNet()
void onUnitsChanged(wxCommandEvent &event)
void OnExpandCollapseRow(wxCommandEvent &event)
wxDataViewColumn * getDisplayedColumnForModelField(int columnId)
Fetches the displayed grid view column for the given model column ID.
void adjustListColumnSizes(PANEL_NET_INSPECTOR_SETTINGS *cfg)
Adjust the sizing of list columns.
virtual void OnBoardItemChanged(BOARD &aBoard, BOARD_ITEM *aBoardItem) override
std::vector< COLUMN_DESC > m_columns
All displayed (or hidden) columns.
bool m_show_unconnected_nets
virtual 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.
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
EDA_UNITS GetUserUnits() const
wxBoxSizer * m_ContentSizer
A KICAD version of wxTextEntryDialog which supports the various improvements/work-arounds from DIALOG...
wxString GetValue() const
void SetTextValidator(wxTextValidatorStyle style)
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, int aDisplayTime)
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)
Tests 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)
void delete_matching(_Container &__c, _Value __value)
Covers for the horrifically named std::remove and std::remove_if (neither of which remove anything).
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:...
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
std::vector< wxString > custom_group_rules
@ 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.