39#include <wx/wupdlock.h>
40#include <wx/headerctrl.h>
41#include <wx/filedlg.h>
47 m_zero_netitem( nullptr ),
59 if(
m_brd !=
nullptr )
73 m_netsList->Bind( wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK,
75 m_netsList->Bind( wxEVT_DATAVIEW_ITEM_CONTEXT_MENU,
77 m_netsList->Bind( wxEVT_DATAVIEW_ITEM_ACTIVATED,
79 m_netsList->Bind( wxEVT_DATAVIEW_COLUMN_SORTED,
89 if(
m_brd !=
nullptr )
98 m_netsList->Unbind( wxEVT_DATAVIEW_ITEM_COLLAPSED,
100 m_netsList->Unbind( wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK,
102 m_netsList->Unbind( wxEVT_DATAVIEW_ITEM_CONTEXT_MENU,
104 m_netsList->Unbind( wxEVT_DATAVIEW_ITEM_ACTIVATED,
106 m_netsList->Unbind( wxEVT_DATAVIEW_COLUMN_SORTED,
140 std::vector<std::function<void(
void )>> add_col{
146 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_SORTABLE );
153 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
154 | wxDATAVIEW_COL_SORTABLE );
161 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
162 | wxDATAVIEW_COL_SORTABLE );
169 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
170 | wxDATAVIEW_COL_SORTABLE );
177 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
178 | wxDATAVIEW_COL_SORTABLE );
185 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
186 | wxDATAVIEW_COL_SORTABLE );
193 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
194 | wxDATAVIEW_COL_SORTABLE );
201 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
202 | wxDATAVIEW_COL_SORTABLE );
233 if( (
int) cfg->
col_order.size() != totalNumColumns
234 || (
int) cfg->
col_hidden.size() != totalNumColumns )
236 cfg->
col_order.resize( totalNumColumns );
239 for(
int i = 0; i < totalNumColumns; ++i )
248 if( col_order_set.size() != cfg->
col_order.size() )
250 for( std::size_t i = 0; i < cfg->
col_order.size(); ++i )
265 for( std::size_t i = 0; i < cfg->
col_order.size(); ++i )
267 const int addModelColumn = cfg->
col_order[i];
269 if( addModelColumn >= (
int) add_col.size() )
272 m_columns[addModelColumn], wxDATAVIEW_CELL_INERT, -1,
274 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
275 | wxDATAVIEW_COL_SORTABLE );
305 int minValueWidth = GetTextExtent( wxT(
"00000,000 mm" ) ).x;
306 int minNumberWidth = GetTextExtent( wxT(
"000" ) ).x;
307 int minNameWidth = GetTextExtent( wxT(
"MMMMMMMMMMMM" ) ).x;
313 const int margins = 15;
314 const int extra_width = 30;
316 auto getTargetWidth =
321 case COLUMN_NAME:
return minNameWidth + extra_width;
325 default:
return minValueWidth + margins;
331 for(
size_t i = 0; i <
m_columns.size(); ++i )
333 const int modelColumn = cfg->
col_order[i];
334 int titleSize = GetTextExtent(
m_columns[modelColumn].display_name ).x;
335 titleSize = modelColumn ==
COLUMN_NAME ? titleSize + extra_width : titleSize + margins;
336 const int valSize = getTargetWidth( modelColumn );
337 m_netsList->GetColumn( i )->SetWidth( std::max( titleSize, valSize ) );
345 for(
size_t ii = 0; ii <
m_columns.size(); ++ii )
349 m_netsList->GetColumn( ii )->SetWidth( std::max( newWidth, 10 ) );
360 if( sortingColumnId != -1 )
364 col->SetSortOrder( sortOrderAsc );
376 for(
unsigned int i = 0; i <
m_netsList->GetColumnCount(); ++i )
378 wxDataViewColumn* col =
m_netsList->GetColumn( i );
380 if( (
int) col->GetModelColumn() == columnId )
416 wxDataViewItemArray sel;
419 std::vector<int> prev_selected_netcodes;
420 prev_selected_netcodes.reserve( sel.GetCount() );
422 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
425 prev_selected_netcodes.push_back( item->
GetNetCode() );
431 if( wxDataViewColumn* sorting_column =
m_netsList->GetSortingColumn() )
435 sorting_column_id =
static_cast<int>( sorting_column->GetModelColumn() );
436 sort_order_asc = sorting_column->IsSortOrderAscending();
440 sorting_column->UnsetAsSortKey();
458 std::vector<std::unique_ptr<LIST_ITEM>> new_items;
466 unsigned int pad_count;
469 struct NET_INFO_CMP_LESS
471 bool operator()(
const NET_INFO& a,
const NET_INFO& b )
const
473 return a.netcode < b.netcode;
475 bool operator()(
const NET_INFO& a,
int b )
const {
return a.netcode < b; }
476 bool operator()(
int a,
const NET_INFO& b )
const {
return a < b.netcode; }
479 std::vector<NET_INFO> nets;
488 nets.emplace_back( NET_INFO{ ni.first, ni.second, 0 } );
495 for(
PAD*
pad : footprint->Pads() )
497 auto i = std::lower_bound( nets.begin(), nets.end(),
pad->GetNetCode(),
498 NET_INFO_CMP_LESS() );
500 if( i != nets.end() && i->netcode ==
pad->GetNetCode() )
505 for( NET_INFO& ni : nets )
508 new_items.emplace_back(
buildNewItem( ni.net, ni.pad_count, prefiltered_cn_items ) );
525 std::vector<std::pair<wxString, wxDataViewItem>> groupItems =
531 [&groupName](
const std::pair<wxString, wxDataViewItem>& item )
533 return groupName == item.first;
536 auto tableItem = std::find_if( groupItems.begin(), groupItems.end(), pred );
538 if( tableItem != groupItems.end() )
548 for(
int& nc : prev_selected_netcodes )
550 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( nc );
554 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
555 sel.Add( wxDataViewItem( list_item.get() ) );
597 bool matched =
false;
600 if( filterString.Length() == 0 )
604 if( !matched && cfg->
filter_by_netclass && netClassName.Find( filterString ) != wxNOT_FOUND )
608 if( !matched && cfg->
filter_by_net_name && netName.Find( filterString ) != wxNOT_FOUND )
615 matched = !netName.StartsWith( wxT(
"UNCONNECTED-(" ) );
632std::unique_ptr<PCB_NET_INSPECTOR_PANEL::LIST_ITEM>
634 const std::vector<CN_ITEM*>& aCNItems )
636 std::unique_ptr<LIST_ITEM> new_item = std::make_unique<LIST_ITEM>( aNet );
638 new_item->SetPadCount( aPadCount );
641 const auto cn_items = std::equal_range( aCNItems.begin(), aCNItems.end(), aNet->
GetNetCode(),
644 for(
auto i = cn_items.first; i != cn_items.second; ++i )
650 new_item->AddPadDieLength(
static_cast<PAD*
>( item )->GetPadToDieLength() );
654 new_item->AddLayerWireLength( track->GetLength(), track->GetLayer() );
658 new_item->AddViaCount( 1 );
673 const auto type_bits = std::bitset<MAX_STRUCT_TYPE_ID>()
679 std::vector<CN_ITEM*> cn_items;
680 cn_items.reserve( 1024 );
684 if( cn_item->Valid() && type_bits[cn_item->Parent()->Type()] )
685 cn_items.push_back( cn_item );
727 top_layer =
via->TopLayer();
729 bottom_layer =
via->BottomLayer();
739 int effectiveBottomLayer;
741 if(
via->BottomLayer() ==
B_Cu )
742 effectiveBottomLayer =
F_Cu + dielectricLayers;
744 effectiveBottomLayer =
via->BottomLayer();
746 int layerCount = effectiveBottomLayer -
via->TopLayer();
748 return layerCount * layerThickness;
765 std::optional<LIST_ITEM_ITER> cur_net_row =
m_data_model->findItem( aNet );
775 std::unique_ptr<LIST_ITEM> new_list_item =
buildNewItem( aNet, node_count,
784 const std::unique_ptr<LIST_ITEM>& cur_list_item = *cur_net_row.value();
786 if( cur_list_item->GetNetName() != new_list_item->GetNetName() )
796 cur_list_item->SetPadCount( new_list_item->GetPadCount() );
797 cur_list_item->SetViaCount( new_list_item->GetViaCount() );
798 cur_list_item->SetLayerWireLength( new_list_item->GetLayerWireLength() );
799 cur_list_item->SetPadDieLength( new_list_item->GetPadDieLength() );
815 return wxString::Format( wxT(
"%.3d" ), aNet->
GetNetCode() );
827 return wxString::Format( wxT(
"%u" ), aValue );
844 wxDataViewItemArray sel;
868 if(
m_brd !=
nullptr )
885 if( !IsShownOnScreen() )
895 std::unique_ptr<LIST_ITEM> new_item = std::make_unique<LIST_ITEM>( net );
906 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( i->GetNet() );
913 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
914 int len = track->GetLength();
916 list_item->AddLayerWireLength( len, track->GetLayer() );
920 list_item->AddViaCount( 1 );
934 for(
const PAD*
pad : footprint->Pads() )
936 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem(
pad->GetNet() );
946 r =
m_data_model->addItem( std::make_unique<LIST_ITEM>(
pad->GetNet() ) );
951 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
952 int len =
pad->GetPadToDieLength();
954 list_item->AddPadCount( 1 );
955 list_item->AddPadDieLength( len );
969 std::vector<BOARD_ITEM*>& aBoardItems )
971 if( !IsShownOnScreen() )
975 if( aBoardItems.size() > 25 )
992 if( !IsShownOnScreen() )
1001 for(
const PAD*
pad : footprint->Pads() )
1003 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem(
pad->GetNet() );
1007 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
1008 int len =
pad->GetPadToDieLength();
1010 list_item->SubPadCount( 1 );
1011 list_item->SubPadDieLength( len );
1022 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( i->GetNet() );
1029 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
1030 int len = track->GetLength();
1032 list_item->SubLayerWireLength( len, track->GetLayer() );
1036 list_item->SubViaCount( 1 );
1052 std::vector<BOARD_ITEM*>& aBoardItems )
1054 if( !IsShownOnScreen() )
1057 if( aBoardItems.size() > 25 )
1074 if( !IsShownOnScreen() )
1084 if( !IsShownOnScreen() )
1088 ||
dynamic_cast<FOOTPRINT*
>( aBoardItem ) !=
nullptr )
1097 std::vector<BOARD_ITEM*>& aBoardItems )
1099 if( !IsShownOnScreen() )
1108 std::vector<BOARD_ITEM*>& aAddedItems,
1109 std::vector<BOARD_ITEM*>& aRemovedItems,
1110 std::vector<BOARD_ITEM*>& aDeletedItems )
1112 if( !IsShownOnScreen() )
1133 wxDataViewItemArray new_selection;
1134 new_selection.Alloc( selected_codes.size() );
1136 for(
int code : selected_codes )
1138 if( std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( code ) )
1139 new_selection.Add( wxDataViewItem( &***r ) );
1144 if( !new_selection.IsEmpty() )
1145 m_netsList->EnsureVisible( new_selection.Item( 0 ) );
1165 bool multipleSelections =
false;
1168 if(
m_netsList->GetSelectedItemsCount() == 1 )
1174 if(
m_netsList->GetSelectedItemsCount() > 1 )
1175 multipleSelections =
true;
1182 _(
"Highlight Selected Net" ),
1183 wxEmptyString, wxITEM_NORMAL );
1187 _(
"Clear Net Highlighting" ),
1188 wxEmptyString, wxITEM_NORMAL );
1189 menu.Append( clearHighlighting );
1194 if( selected_codes.size() == 0 )
1195 clearHighlighting->Enable(
false );
1197 menu.AppendSeparator();
1199 wxMenuItem* renameNet =
new wxMenuItem( &menu,
ID_RENAME_NET,
_(
"Rename Selected Net" ),
1200 wxEmptyString, wxITEM_NORMAL );
1201 menu.Append( renameNet );
1203 wxMenuItem* deleteNet =
new wxMenuItem( &menu,
ID_DELETE_NET,
_(
"Delete Selected Net" ),
1204 wxEmptyString, wxITEM_NORMAL );
1205 menu.Append( deleteNet );
1207 menu.AppendSeparator();
1209 wxMenuItem* addNet =
new wxMenuItem( &menu,
ID_ADD_NET,
_(
"Add Net" ),
1210 wxEmptyString, wxITEM_NORMAL );
1211 menu.Append( addNet );
1213 if( !selItem && !multipleSelections )
1216 deleteNet->Enable(
false );
1217 renameNet->Enable(
false );
1221 if( multipleSelections || selItem->
GetIsGroup() )
1223 highlightNet->SetItemLabel(
_(
"Highlight Selected Nets" ) );
1224 renameNet->Enable(
false );
1225 deleteNet->SetItemLabel(
_(
"Delete Selected Nets" ) );
1229 menu.AppendSeparator();
1232 _(
"Remove Selected Custom Group" ),
1233 wxEmptyString, wxITEM_NORMAL );
1234 menu.Append( removeSelectedGroup );
1237 removeSelectedGroup->Enable(
false );
1254 wxString newGroupName;
1258 wxStaticText*
help =
new wxStaticText( &dlg, wxID_ANY,
1259 _(
"(Use /.../ to indicate a regular expression.)" ) );
1263 dlg.GetSizer()->SetSizeHints( &dlg );
1270 if( newGroupName ==
"" )
1274 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1276 return rule->GetPattern().Upper() == newGroupName.Upper();
1323 if(
m_netsList->GetSelectedItemsCount() == 1 )
1332 _(
"Filter by Net Name" ),
1333 wxEmptyString, wxITEM_CHECK );
1334 menu.Append( filterByNetName );
1335 filterByNetName->Check( cfg.filter_by_net_name );
1338 _(
"Filter by Netclass" ),
1339 wxEmptyString, wxITEM_CHECK );
1340 menu.Append( filterByNetclass );
1341 filterByNetclass->Check( cfg.filter_by_netclass );
1343 menu.AppendSeparator();
1353 _(
"Group by Netclass" ),
1354 wxEmptyString, wxITEM_CHECK );
1355 menu.Append( groupNetclass );
1358 menu.AppendSeparator();
1360 wxMenuItem* addGroup =
new wxMenuItem( &menu,
ID_ADD_GROUP,
_(
"Add Custom Group" ),
1361 wxEmptyString, wxITEM_NORMAL );
1362 menu.Append( addGroup );
1365 _(
"Remove Selected Custom Group" ),
1366 wxEmptyString, wxITEM_NORMAL );
1367 menu.Append( removeSelectedGroup );
1370 removeSelectedGroup->Enable(
false );
1373 _(
"Remove All Custom Groups" ),
1374 wxEmptyString, wxITEM_NORMAL );
1375 menu.Append( removeCustomGroups );
1378 menu.AppendSeparator();
1381 _(
"Show Zero Pad Nets" ),
1382 wxEmptyString, wxITEM_CHECK );
1383 menu.Append( showZeroNetPads );
1387 _(
"Show Unconnected Nets" ),
1388 wxEmptyString, wxITEM_CHECK );
1389 menu.Append( showUnconnectedNets );
1392 menu.AppendSeparator();
1396 _(
"Save Net Inspector Report" ),
1397 wxEmptyString, wxITEM_NORMAL );
1400 menu.AppendSeparator();
1403 wxMenu* colsMenu =
new wxMenu();
1405 menu.AppendSubMenu( colsMenu,
_(
"Show / Hide Columns" ) );
1418 wxEmptyString, wxITEM_CHECK );
1420 target->Append( opt );
1421 opt->Check( !col->IsHidden() );
1424 target->AppendSeparator();
1429 wxEmptyString, wxITEM_CHECK );
1431 target->Append( opt );
1432 opt->Check( !col->IsHidden() );
1439 bool saveAndRebuild =
true;
1441 switch( event.GetId() )
1493 saveAndRebuild =
false;
1498 saveAndRebuild =
false;
1503 saveAndRebuild =
false;
1512 col->SetWidth( std::max( col->GetWidth(), 10 ) );
1513 col->SetHidden( !col->IsHidden() );
1518 if( saveAndRebuild )
1528 if(
m_netsList->GetSelectedItemsCount() == 1 )
1532 if( selItem->GetIsGroup() )
1536 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1538 return rule->GetPattern() == groupName;
1554 wxFileDialog dlg(
this,
_(
"Save Net Inspector Report File" ),
"",
"",
1556 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1558 if( dlg.ShowModal() == wxID_CANCEL )
1561 wxTextFile f( dlg.GetPath() );
1576 txt += wxString::Format(
_(
"%s (%s)" ),
1582 txt += col.csv_name;
1585 txt += wxT(
"\";" );
1591 const unsigned int num_rows =
m_data_model->itemCount();
1593 for(
unsigned int row = 0; row < num_rows; row++ )
1597 if( i.GetIsGroup() || i.GetNetCode() == 0 )
1605 txt +=
'"' +
m_data_model->valueAt( col.num, row ).GetString() + wxT(
"\";" );
1607 txt +=
m_data_model->valueAt( col.num, row ).GetString() +
';';
1638 wxDataViewItemArray sel;
1643 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1650 renderSettings->
SetHighlight(
true, ( *c )->GetNetCode(), true );
1686 wxString newNetName;
1702 wxString::Format(
_(
"Net name '%s' is already in use." ), newNetName ) );
1703 newNetName = wxEmptyString;
1722 if(
m_netsList->GetSelectedItemsCount() == 1 )
1732 wxString shortNetName;
1734 if( fullNetName.Contains( wxT(
"/" ) ) )
1736 netPath = fullNetName.BeforeLast(
'/' ) +
'/';
1737 shortNetName = fullNetName.AfterLast(
'/' );
1741 shortNetName = fullNetName;
1755 unescapedShortName = dlg.
GetValue();
1757 if( unescapedShortName.IsEmpty() )
1759 DisplayError(
this, wxString::Format(
_(
"Net name cannot be empty." ),
1760 unescapedShortName ) );
1765 fullNetName = netPath + shortNetName;
1769 DisplayError(
this, wxString::Format(
_(
"Net name '%s' is already in use." ),
1770 unescapedShortName ) );
1771 unescapedShortName = wxEmptyString;
1781 if( boardItem->GetNet() == net )
1797 boardItem->SetNet( net );
1802 if( std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( net ) )
1803 m_netsList->Select( wxDataViewItem( r.value()->get() ) );
1821 wxDataViewItemArray sel;
1824 auto delete_one = [
this](
const LIST_ITEM* i )
1826 if( i->GetPadCount() == 0
1827 ||
IsOK(
this, wxString::Format(
_(
"Net '%s' is in use. Delete anyway?" ),
1828 i->GetNetName() ) ) )
1832 int removedCode = i->GetNetCode();
1839 if( boardItem && boardItem->GetNetCode() == removedCode )
1846 text->ClearRenderCache();
1847 text->ClearBoundingBoxCache();
1861 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1868 &&
IsOK(
this, wxString::Format(
_(
"Delete all nets in group '%s'?" ),
1873 std::vector<const LIST_ITEM*> children;
1937 wxDataViewColumn* sortingCol =
m_netsList->GetSortingColumn();
1938 cfg.sorting_column = sortingCol ?
static_cast<int>( sortingCol->GetModelColumn() ) : -1;
1939 cfg.sort_order_asc = sortingCol ? sortingCol->IsSortOrderAscending() :
true;
1946 for(
unsigned int ii = 0; ii <
m_data_model->columnCount(); ++ii )
1948 cfg.col_order[ii] = (int)
m_netsList->GetColumn( ii )->GetModelColumn();
1949 cfg.col_widths[ii] =
m_netsList->GetColumn( ii )->GetWidth();
1950 cfg.col_hidden[ii] =
m_netsList->GetColumn( ii )->IsHidden();
1954 cfg.expanded_rows.clear();
1955 std::vector<std::pair<wxString, wxDataViewItem>> groupItems =
1958 for( std::pair<wxString, wxDataViewItem>& item : groupItems )
1961 cfg.expanded_rows.push_back( item.first );
1965 cfg.custom_group_rules.clear();
1968 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 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
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)
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)
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.