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 );
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() );
792 cur_list_item->SetLayerWireLength( new_list_item->GetLayerWireLength() );
793 cur_list_item->SetPadDieLength( new_list_item->GetPadDieLength() );
809 return wxString::Format( wxT(
"%.3d" ), aNet->
GetNetCode() );
821 return wxString::Format( wxT(
"%u" ), aValue );
838 wxDataViewItemArray sel;
862 if(
m_brd !=
nullptr )
879 if( !IsShownOnScreen() )
889 std::unique_ptr<LIST_ITEM> new_item = std::make_unique<LIST_ITEM>( net );
900 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( i->GetNet() );
907 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
908 int len = track->GetLength();
910 list_item->AddLayerWireLength( len, track->GetLayer() );
914 list_item->AddViaCount( 1 );
928 for(
const PAD*
pad : footprint->Pads() )
930 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem(
pad->GetNet() );
940 r =
m_data_model->addItem( std::make_unique<LIST_ITEM>(
pad->GetNet() ) );
945 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
946 int len =
pad->GetPadToDieLength();
948 list_item->AddPadCount( 1 );
949 list_item->AddPadDieLength( len );
963 std::vector<BOARD_ITEM*>& aBoardItems )
965 if( !IsShownOnScreen() )
969 if( aBoardItems.size() > 25 )
986 if( !IsShownOnScreen() )
995 for(
const PAD*
pad : footprint->Pads() )
997 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem(
pad->GetNet() );
1001 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
1002 int len =
pad->GetPadToDieLength();
1004 list_item->SubPadCount( 1 );
1005 list_item->SubPadDieLength( len );
1016 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( i->GetNet() );
1023 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
1024 int len = track->GetLength();
1026 list_item->SubLayerWireLength( len, track->GetLayer() );
1030 list_item->SubViaCount( 1 );
1046 std::vector<BOARD_ITEM*>& aBoardItems )
1048 if( !IsShownOnScreen() )
1051 if( aBoardItems.size() > 25 )
1068 if( !IsShownOnScreen() )
1078 if( !IsShownOnScreen() )
1082 ||
dynamic_cast<FOOTPRINT*
>( aBoardItem ) !=
nullptr )
1091 std::vector<BOARD_ITEM*>& aBoardItems )
1093 if( !IsShownOnScreen() )
1102 std::vector<BOARD_ITEM*>& aAddedItems,
1103 std::vector<BOARD_ITEM*>& aRemovedItems,
1104 std::vector<BOARD_ITEM*>& aDeletedItems )
1106 if( !IsShownOnScreen() )
1127 wxDataViewItemArray new_selection;
1128 new_selection.Alloc( selected_codes.size() );
1130 for(
int code : selected_codes )
1132 if( std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( code ) )
1133 new_selection.Add( wxDataViewItem( &***r ) );
1138 if( !new_selection.IsEmpty() )
1139 m_netsList->EnsureVisible( new_selection.Item( 0 ) );
1159 bool multipleSelections =
false;
1162 if(
m_netsList->GetSelectedItemsCount() == 1 )
1168 if(
m_netsList->GetSelectedItemsCount() > 1 )
1169 multipleSelections =
true;
1176 _(
"Highlight Selected Net" ),
1177 wxEmptyString, wxITEM_NORMAL );
1181 _(
"Clear Net Highlighting" ),
1182 wxEmptyString, wxITEM_NORMAL );
1183 menu.Append( clearHighlighting );
1188 if( selected_codes.size() == 0 )
1189 clearHighlighting->Enable(
false );
1191 menu.AppendSeparator();
1193 wxMenuItem* renameNet =
new wxMenuItem( &menu,
ID_RENAME_NET,
_(
"Rename Selected Net" ),
1194 wxEmptyString, wxITEM_NORMAL );
1195 menu.Append( renameNet );
1197 wxMenuItem* deleteNet =
new wxMenuItem( &menu,
ID_DELETE_NET,
_(
"Delete Selected Net" ),
1198 wxEmptyString, wxITEM_NORMAL );
1199 menu.Append( deleteNet );
1201 menu.AppendSeparator();
1203 wxMenuItem* addNet =
new wxMenuItem( &menu,
ID_ADD_NET,
_(
"Add Net" ),
1204 wxEmptyString, wxITEM_NORMAL );
1205 menu.Append( addNet );
1207 if( !selItem && !multipleSelections )
1210 deleteNet->Enable(
false );
1211 renameNet->Enable(
false );
1215 if( multipleSelections || selItem->
GetIsGroup() )
1217 highlightNet->SetItemLabel(
_(
"Highlight Selected Nets" ) );
1218 renameNet->Enable(
false );
1219 deleteNet->SetItemLabel(
_(
"Delete Selected Nets" ) );
1223 menu.AppendSeparator();
1226 _(
"Remove Selected Custom Group" ),
1227 wxEmptyString, wxITEM_NORMAL );
1228 menu.Append( removeSelectedGroup );
1231 removeSelectedGroup->Enable(
false );
1248 wxString newGroupName;
1252 wxStaticText*
help =
new wxStaticText( &dlg, wxID_ANY,
1253 _(
"(Use /.../ to indicate a regular expression.)" ) );
1257 dlg.GetSizer()->SetSizeHints( &dlg );
1259 if( dlg.ShowModal() != wxID_OK || dlg.
GetValue().IsEmpty() )
1264 if( newGroupName ==
"" )
1268 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1270 return rule->GetPattern().Upper() == newGroupName.Upper();
1317 if(
m_netsList->GetSelectedItemsCount() == 1 )
1326 _(
"Filter by Net Name" ),
1327 wxEmptyString, wxITEM_CHECK );
1328 filterByNetName->Check( cfg.filter_by_net_name );
1329 menu.Append( filterByNetName );
1332 _(
"Filter by Netclass" ),
1333 wxEmptyString, wxITEM_CHECK );
1334 filterByNetclass->Check( cfg.filter_by_netclass );
1335 menu.Append( filterByNetclass );
1337 menu.AppendSeparator();
1347 _(
"Group by Netclass" ),
1348 wxEmptyString, wxITEM_CHECK );
1350 menu.Append( groupNetclass );
1352 menu.AppendSeparator();
1354 wxMenuItem* addGroup =
new wxMenuItem( &menu,
ID_ADD_GROUP,
_(
"Add Custom Group" ),
1355 wxEmptyString, wxITEM_NORMAL );
1356 menu.Append( addGroup );
1359 _(
"Remove Selected Custom Group" ),
1360 wxEmptyString, wxITEM_NORMAL );
1361 menu.Append( removeSelectedGroup );
1364 removeSelectedGroup->Enable(
false );
1367 _(
"Remove All Custom Groups" ),
1368 wxEmptyString, wxITEM_NORMAL );
1369 menu.Append( removeCustomGroups );
1372 menu.AppendSeparator();
1375 _(
"Show Zero Pad Nets" ),
1376 wxEmptyString, wxITEM_CHECK );
1378 menu.Append( showZeroNetPads );
1381 _(
"Show Unconnected Nets" ),
1382 wxEmptyString, wxITEM_CHECK );
1384 menu.Append( showUnconnectedNets );
1386 menu.AppendSeparator();
1390 _(
"Save Net Inspector Report" ),
1391 wxEmptyString, wxITEM_NORMAL );
1394 menu.AppendSeparator();
1397 wxMenu* colsMenu =
new wxMenu();
1399 menu.AppendSubMenu( colsMenu,
_(
"Show / Hide Columns" ) );
1412 wxEmptyString, wxITEM_CHECK );
1414 target->Append( opt );
1415 opt->Check( !col->IsHidden() );
1418 target->AppendSeparator();
1423 wxEmptyString, wxITEM_CHECK );
1425 target->Append( opt );
1426 opt->Check( !col->IsHidden() );
1433 bool saveAndRebuild =
true;
1435 switch( event.GetId() )
1487 saveAndRebuild =
false;
1492 saveAndRebuild =
false;
1497 saveAndRebuild =
false;
1506 col->SetWidth( std::max( col->GetWidth(), 10 ) );
1507 col->SetHidden( !col->IsHidden() );
1512 if( saveAndRebuild )
1522 if(
m_netsList->GetSelectedItemsCount() == 1 )
1526 if( selItem->GetIsGroup() )
1530 [&]( std::unique_ptr<EDA_COMBINED_MATCHER>& rule )
1532 return rule->GetPattern() == groupName;
1548 wxFileDialog dlg(
this,
_(
"Save Net Inspector Report File" ),
"",
"",
1550 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1552 if( dlg.ShowModal() == wxID_CANCEL )
1555 wxTextFile f( dlg.GetPath() );
1570 txt += wxString::Format(
_(
"%s (%s)" ),
1576 txt += col.csv_name;
1579 txt += wxT(
"\";" );
1585 const unsigned int num_rows =
m_data_model->itemCount();
1587 for(
unsigned int row = 0; row < num_rows; row++ )
1591 if( i.GetIsGroup() || i.GetNetCode() == 0 )
1599 txt +=
'"' +
m_data_model->valueAt( col.num, row ).GetString() + wxT(
"\";" );
1601 txt +=
m_data_model->valueAt( col.num, row ).GetString() +
';';
1632 wxDataViewItemArray sel;
1637 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1644 renderSettings->
SetHighlight(
true, ( *c )->GetNetCode(), true );
1680 wxString newNetName;
1688 if( dlg.ShowModal() != wxID_OK || dlg.
GetValue().IsEmpty() )
1696 wxString::Format(
_(
"Net name '%s' is already in use." ), newNetName ) );
1697 newNetName = wxEmptyString;
1716 if(
m_netsList->GetSelectedItemsCount() == 1 )
1726 wxString shortNetName;
1728 if( fullNetName.Contains( wxT(
"/" ) ) )
1730 netPath = fullNetName.BeforeLast(
'/' ) +
'/';
1731 shortNetName = fullNetName.AfterLast(
'/' );
1735 shortNetName = fullNetName;
1746 if( dlg.ShowModal() != wxID_OK || dlg.
GetValue() == unescapedShortName )
1749 unescapedShortName = dlg.
GetValue();
1751 if( unescapedShortName.IsEmpty() )
1753 DisplayError(
this, wxString::Format(
_(
"Net name cannot be empty." ),
1754 unescapedShortName ) );
1759 fullNetName = netPath + shortNetName;
1763 DisplayError(
this, wxString::Format(
_(
"Net name '%s' is already in use." ),
1764 unescapedShortName ) );
1765 unescapedShortName = wxEmptyString;
1775 if( boardItem->GetNet() == net )
1791 boardItem->SetNet( net );
1796 if( std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( net ) )
1797 m_netsList->Select( wxDataViewItem( r.value()->get() ) );
1815 wxDataViewItemArray sel;
1818 auto delete_one = [
this](
const LIST_ITEM* i )
1820 if( i->GetPadCount() == 0
1821 ||
IsOK(
this, wxString::Format(
_(
"Net '%s' is in use. Delete anyway?" ),
1822 i->GetNetName() ) ) )
1826 int removedCode = i->GetNetCode();
1833 if( boardItem && boardItem->GetNetCode() == removedCode )
1840 text->ClearRenderCache();
1841 text->ClearBoundingBoxCache();
1855 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
1862 &&
IsOK(
this, wxString::Format(
_(
"Delete all nets in group '%s'?" ),
1867 std::vector<const LIST_ITEM*> children;
1931 wxDataViewColumn* sortingCol =
m_netsList->GetSortingColumn();
1932 cfg.sorting_column = sortingCol ?
static_cast<int>( sortingCol->GetModelColumn() ) : -1;
1933 cfg.sort_order_asc = sortingCol ? sortingCol->IsSortOrderAscending() :
true;
1940 for(
unsigned int ii = 0; ii <
m_data_model->columnCount(); ++ii )
1942 cfg.col_order[ii] = (int)
m_netsList->GetColumn( ii )->GetModelColumn();
1943 cfg.col_widths[ii] =
m_netsList->GetColumn( ii )->GetWidth();
1944 cfg.col_hidden[ii] =
m_netsList->GetColumn( ii )->IsHidden();
1948 cfg.expanded_rows.clear();
1949 std::vector<std::pair<wxString, wxDataViewItem>> groupItems =
1952 for( std::pair<wxString, wxDataViewItem>& item : groupItems )
1955 cfg.expanded_rows.push_back( item.first );
1959 cfg.custom_group_rules.clear();
1962 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.
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.
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.