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 );
638 const auto cn_items = std::equal_range( aCNItems.begin(), aCNItems.end(), aNet->
GetNetCode(),
641 for(
auto i = cn_items.first; i != cn_items.second; ++i )
647 new_item->AddPadDieLength(
static_cast<PAD*
>( item )->GetPadToDieLength() );
651 new_item->AddLayerWireLength( track->GetLength(), 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 );
724 top_layer =
via->TopLayer();
726 bottom_layer =
via->BottomLayer();
736 int effectiveBottomLayer;
738 if(
via->BottomLayer() ==
B_Cu )
739 effectiveBottomLayer =
F_Cu + dielectricLayers;
741 effectiveBottomLayer =
via->BottomLayer();
743 int layerCount = effectiveBottomLayer -
via->TopLayer();
745 return layerCount * layerThickness;
762 std::optional<LIST_ITEM_ITER> cur_net_row =
m_data_model->findItem( aNet );
772 std::unique_ptr<LIST_ITEM> new_list_item =
buildNewItem( aNet, node_count,
781 const std::unique_ptr<LIST_ITEM>& cur_list_item = *cur_net_row.value();
783 if( cur_list_item->GetNetName() != new_list_item->GetNetName() )
793 cur_list_item->SetPadCount( new_list_item->GetPadCount() );
794 cur_list_item->SetViaCount( new_list_item->GetViaCount() );
795 cur_list_item->SetLayerWireLength( new_list_item->GetLayerWireLength() );
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 );
903 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( i->GetNet() );
910 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
911 int len = track->GetLength();
913 list_item->AddLayerWireLength( len, track->GetLayer() );
917 list_item->AddViaCount( 1 );
931 for(
const PAD*
pad : footprint->Pads() )
933 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem(
pad->GetNet() );
943 r =
m_data_model->addItem( std::make_unique<LIST_ITEM>(
pad->GetNet() ) );
948 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
949 int len =
pad->GetPadToDieLength();
951 list_item->AddPadCount( 1 );
952 list_item->AddPadDieLength( len );
966 std::vector<BOARD_ITEM*>& aBoardItems )
968 if( !IsShownOnScreen() )
972 if( aBoardItems.size() > 25 )
989 if( !IsShownOnScreen() )
998 for(
const PAD*
pad : footprint->Pads() )
1000 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem(
pad->GetNet() );
1004 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
1005 int len =
pad->GetPadToDieLength();
1007 list_item->SubPadCount( 1 );
1008 list_item->SubPadDieLength( len );
1019 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( i->GetNet() );
1026 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
1027 int len = track->GetLength();
1029 list_item->SubLayerWireLength( len, track->GetLayer() );
1033 list_item->SubViaCount( 1 );
1049 std::vector<BOARD_ITEM*>& aBoardItems )
1051 if( !IsShownOnScreen() )
1054 if( aBoardItems.size() > 25 )
1071 if( !IsShownOnScreen() )
1081 if( !IsShownOnScreen() )
1085 ||
dynamic_cast<FOOTPRINT*
>( aBoardItem ) !=
nullptr )
1094 std::vector<BOARD_ITEM*>& aBoardItems )
1096 if( !IsShownOnScreen() )
1105 std::vector<BOARD_ITEM*>& aAddedItems,
1106 std::vector<BOARD_ITEM*>& aRemovedItems,
1107 std::vector<BOARD_ITEM*>& aDeletedItems )
1109 if( !IsShownOnScreen() )
1130 wxDataViewItemArray new_selection;
1131 new_selection.Alloc( selected_codes.size() );
1133 for(
int code : selected_codes )
1135 if( std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( code ) )
1136 new_selection.Add( wxDataViewItem( &***r ) );
1141 if( !new_selection.IsEmpty() )
1142 m_netsList->EnsureVisible( new_selection.Item( 0 ) );
1162 bool multipleSelections =
false;
1165 if(
m_netsList->GetSelectedItemsCount() == 1 )
1171 if(
m_netsList->GetSelectedItemsCount() > 1 )
1172 multipleSelections =
true;
1179 _(
"Highlight Selected Net" ),
1180 wxEmptyString, wxITEM_NORMAL );
1184 _(
"Clear Net Highlighting" ),
1185 wxEmptyString, wxITEM_NORMAL );
1186 menu.Append( clearHighlighting );
1191 if( selected_codes.size() == 0 )
1192 clearHighlighting->Enable(
false );
1194 menu.AppendSeparator();
1196 wxMenuItem* renameNet =
new wxMenuItem( &menu,
ID_RENAME_NET,
_(
"Rename Selected Net" ),
1197 wxEmptyString, wxITEM_NORMAL );
1198 menu.Append( renameNet );
1200 wxMenuItem* deleteNet =
new wxMenuItem( &menu,
ID_DELETE_NET,
_(
"Delete Selected Net" ),
1201 wxEmptyString, wxITEM_NORMAL );
1202 menu.Append( deleteNet );
1204 menu.AppendSeparator();
1206 wxMenuItem* addNet =
new wxMenuItem( &menu,
ID_ADD_NET,
_(
"Add Net" ),
1207 wxEmptyString, wxITEM_NORMAL );
1208 menu.Append( addNet );
1210 if( !selItem && !multipleSelections )
1213 deleteNet->Enable(
false );
1214 renameNet->Enable(
false );
1218 if( multipleSelections || selItem->
GetIsGroup() )
1220 highlightNet->SetItemLabel(
_(
"Highlight Selected Nets" ) );
1221 renameNet->Enable(
false );
1222 deleteNet->SetItemLabel(
_(
"Delete Selected Nets" ) );
1226 menu.AppendSeparator();
1229 _(
"Remove Selected Custom Group" ),
1230 wxEmptyString, wxITEM_NORMAL );
1231 menu.Append( removeSelectedGroup );
1234 removeSelectedGroup->Enable(
false );
1251 wxString newGroupName;
1255 wxStaticText*
help =
new wxStaticText( &dlg, wxID_ANY,
1256 _(
"(Use /.../ to indicate a regular expression.)" ) );
1260 dlg.GetSizer()->SetSizeHints( &dlg );
1267 if( newGroupName ==
"" )
1271 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1273 return rule->GetPattern().Upper() == newGroupName.Upper();
1320 if(
m_netsList->GetSelectedItemsCount() == 1 )
1329 _(
"Filter by Net Name" ),
1330 wxEmptyString, wxITEM_CHECK );
1331 filterByNetName->Check( cfg.filter_by_net_name );
1332 menu.Append( filterByNetName );
1335 _(
"Filter by Netclass" ),
1336 wxEmptyString, wxITEM_CHECK );
1337 filterByNetclass->Check( cfg.filter_by_netclass );
1338 menu.Append( filterByNetclass );
1340 menu.AppendSeparator();
1350 _(
"Group by Netclass" ),
1351 wxEmptyString, wxITEM_CHECK );
1353 menu.Append( groupNetclass );
1355 menu.AppendSeparator();
1357 wxMenuItem* addGroup =
new wxMenuItem( &menu,
ID_ADD_GROUP,
_(
"Add Custom Group" ),
1358 wxEmptyString, wxITEM_NORMAL );
1359 menu.Append( addGroup );
1362 _(
"Remove Selected Custom Group" ),
1363 wxEmptyString, wxITEM_NORMAL );
1364 menu.Append( removeSelectedGroup );
1367 removeSelectedGroup->Enable(
false );
1370 _(
"Remove All Custom Groups" ),
1371 wxEmptyString, wxITEM_NORMAL );
1372 menu.Append( removeCustomGroups );
1375 menu.AppendSeparator();
1378 _(
"Show Zero Pad Nets" ),
1379 wxEmptyString, wxITEM_CHECK );
1381 menu.Append( showZeroNetPads );
1384 _(
"Show Unconnected Nets" ),
1385 wxEmptyString, wxITEM_CHECK );
1387 menu.Append( showUnconnectedNets );
1389 menu.AppendSeparator();
1393 _(
"Save Net Inspector Report" ),
1394 wxEmptyString, wxITEM_NORMAL );
1397 menu.AppendSeparator();
1400 wxMenu* colsMenu =
new wxMenu();
1402 menu.AppendSubMenu( colsMenu,
_(
"Show / Hide Columns" ) );
1415 wxEmptyString, wxITEM_CHECK );
1417 target->Append( opt );
1418 opt->Check( !col->IsHidden() );
1421 target->AppendSeparator();
1426 wxEmptyString, wxITEM_CHECK );
1428 target->Append( opt );
1429 opt->Check( !col->IsHidden() );
1436 bool saveAndRebuild =
true;
1438 switch( event.GetId() )
1490 saveAndRebuild =
false;
1495 saveAndRebuild =
false;
1500 saveAndRebuild =
false;
1509 col->SetWidth( std::max( col->GetWidth(), 10 ) );
1510 col->SetHidden( !col->IsHidden() );
1515 if( saveAndRebuild )
1525 if(
m_netsList->GetSelectedItemsCount() == 1 )
1529 if( selItem->GetIsGroup() )
1533 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1535 return rule->GetPattern() == groupName;
1551 wxFileDialog dlg(
this,
_(
"Save Net Inspector Report File" ),
"",
"",
1553 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1555 if( dlg.ShowModal() == wxID_CANCEL )
1558 wxTextFile f( dlg.GetPath() );
1573 txt += wxString::Format(
_(
"%s (%s)" ),
1579 txt += col.csv_name;
1582 txt += wxT(
"\";" );
1588 const unsigned int num_rows =
m_data_model->itemCount();
1590 for(
unsigned int row = 0; row < num_rows; row++ )
1594 if( i.GetIsGroup() || i.GetNetCode() == 0 )
1602 txt +=
'"' +
m_data_model->valueAt( col.num, row ).GetString() + wxT(
"\";" );
1604 txt +=
m_data_model->valueAt( col.num, row ).GetString() +
';';
1635 wxDataViewItemArray sel;
1640 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1647 renderSettings->
SetHighlight(
true, ( *c )->GetNetCode(), true );
1683 wxString newNetName;
1699 wxString::Format(
_(
"Net name '%s' is already in use." ), newNetName ) );
1700 newNetName = wxEmptyString;
1719 if(
m_netsList->GetSelectedItemsCount() == 1 )
1729 wxString shortNetName;
1731 if( fullNetName.Contains( wxT(
"/" ) ) )
1733 netPath = fullNetName.BeforeLast(
'/' ) +
'/';
1734 shortNetName = fullNetName.AfterLast(
'/' );
1738 shortNetName = fullNetName;
1752 unescapedShortName = dlg.
GetValue();
1754 if( unescapedShortName.IsEmpty() )
1756 DisplayError(
this, wxString::Format(
_(
"Net name cannot be empty." ),
1757 unescapedShortName ) );
1762 fullNetName = netPath + shortNetName;
1766 DisplayError(
this, wxString::Format(
_(
"Net name '%s' is already in use." ),
1767 unescapedShortName ) );
1768 unescapedShortName = wxEmptyString;
1778 if( boardItem->GetNet() == net )
1794 boardItem->SetNet( net );
1799 if( std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( net ) )
1800 m_netsList->Select( wxDataViewItem( r.value()->get() ) );
1818 wxDataViewItemArray sel;
1821 auto delete_one = [
this](
const LIST_ITEM* i )
1823 if( i->GetPadCount() == 0
1824 ||
IsOK(
this, wxString::Format(
_(
"Net '%s' is in use. Delete anyway?" ),
1825 i->GetNetName() ) ) )
1829 int removedCode = i->GetNetCode();
1836 if( boardItem && boardItem->GetNetCode() == removedCode )
1843 text->ClearRenderCache();
1844 text->ClearBoundingBoxCache();
1858 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1865 &&
IsOK(
this, wxString::Format(
_(
"Delete all nets in group '%s'?" ),
1870 std::vector<const LIST_ITEM*> children;
1934 wxDataViewColumn* sortingCol =
m_netsList->GetSortingColumn();
1935 cfg.sorting_column = sortingCol ?
static_cast<int>( sortingCol->GetModelColumn() ) : -1;
1936 cfg.sort_order_asc = sortingCol ? sortingCol->IsSortOrderAscending() :
true;
1943 for(
unsigned int ii = 0; ii <
m_data_model->columnCount(); ++ii )
1945 cfg.col_order[ii] = (int)
m_netsList->GetColumn( ii )->GetModelColumn();
1946 cfg.col_widths[ii] =
m_netsList->GetColumn( ii )->GetWidth();
1947 cfg.col_hidden[ii] =
m_netsList->GetColumn( ii )->IsHidden();
1951 cfg.expanded_rows.clear();
1952 std::vector<std::pair<wxString, wxDataViewItem>> groupItems =
1955 for( std::pair<wxString, wxDataViewItem>& item : groupItems )
1958 cfg.expanded_rows.push_back( item.first );
1962 cfg.custom_group_rules.clear();
1965 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.
LSET GetEnabledLayers() const
Return a bit-mask of all the layers that are enabled.
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.
int GetCopperLayerCount() const
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.
LSET is a set of PCB_LAYER_IDs.
copper_layers_iterator copper_layers_end() const
copper_layers_iterator copper_layers_begin() const
LSEQ Seq(const LSEQ &aSequence) 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
Gets the consolidated name of this netclass (which may be an aggregate)
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.