38#include <wx/wupdlock.h>
39#include <wx/headerctrl.h>
40#include <wx/filedlg.h>
56 if(
m_brd !=
nullptr )
70 m_netsList->Bind( wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK,
72 m_netsList->Bind( wxEVT_DATAVIEW_ITEM_CONTEXT_MENU,
74 m_netsList->Bind( wxEVT_DATAVIEW_ITEM_ACTIVATED,
76 m_netsList->Bind( wxEVT_DATAVIEW_COLUMN_SORTED,
86 if(
m_brd !=
nullptr )
95 m_netsList->Unbind( wxEVT_DATAVIEW_ITEM_COLLAPSED,
97 m_netsList->Unbind( wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK,
99 m_netsList->Unbind( wxEVT_DATAVIEW_ITEM_CONTEXT_MENU,
101 m_netsList->Unbind( wxEVT_DATAVIEW_ITEM_ACTIVATED,
103 m_netsList->Unbind( wxEVT_DATAVIEW_COLUMN_SORTED,
137 std::vector<std::function<void(
void )>> add_col{
143 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_SORTABLE );
150 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
151 | wxDATAVIEW_COL_SORTABLE );
158 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
159 | wxDATAVIEW_COL_SORTABLE );
166 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
167 | wxDATAVIEW_COL_SORTABLE );
174 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
175 | wxDATAVIEW_COL_SORTABLE );
182 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
183 | wxDATAVIEW_COL_SORTABLE );
190 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
191 | wxDATAVIEW_COL_SORTABLE );
198 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
199 | wxDATAVIEW_COL_SORTABLE );
230 if( (
int) cfg->
col_order.size() != totalNumColumns
231 || (
int) cfg->
col_hidden.size() != totalNumColumns )
233 cfg->
col_order.resize( totalNumColumns );
236 for(
int i = 0; i < totalNumColumns; ++i )
245 if( col_order_set.size() != cfg->
col_order.size() )
247 for( std::size_t i = 0; i < cfg->
col_order.size(); ++i )
262 for( std::size_t i = 0; i < cfg->
col_order.size(); ++i )
264 const int addModelColumn = cfg->
col_order[i];
266 if( addModelColumn >= (
int) add_col.size() )
269 m_columns[addModelColumn], wxDATAVIEW_CELL_INERT, -1,
271 wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_REORDERABLE
272 | wxDATAVIEW_COL_SORTABLE );
302 int minValueWidth = GetTextExtent( wxT(
"00000,000 mm" ) ).x;
303 int minNumberWidth = GetTextExtent( wxT(
"000" ) ).x;
304 int minNameWidth = GetTextExtent( wxT(
"MMMMMMMMMMMM" ) ).x;
310 const int margins = 15;
311 const int extra_width = 30;
313 auto getTargetWidth = [&](
int columnID )
317 case COLUMN_NAME:
return minNameWidth + extra_width;
321 default:
return minValueWidth + margins;
327 for(
size_t i = 0; i <
m_columns.size(); ++i )
329 const int modelColumn = cfg->
col_order[i];
330 int titleSize = GetTextExtent(
m_columns[modelColumn].display_name ).x;
331 titleSize = modelColumn ==
COLUMN_NAME ? titleSize + extra_width : titleSize + margins;
332 const int valSize = getTargetWidth( modelColumn );
333 m_netsList->GetColumn( i )->SetWidth( std::max( titleSize, valSize ) );
341 for(
size_t ii = 0; ii <
m_columns.size(); ++ii )
345 m_netsList->GetColumn( ii )->SetWidth( std::max( newWidth, 10 ) );
356 if( sortingColumnId != -1 )
360 col->SetSortOrder( sortOrderAsc );
372 for(
unsigned int i = 0; i <
m_netsList->GetColumnCount(); ++i )
374 wxDataViewColumn* col =
m_netsList->GetColumn( i );
376 if( (
int) col->GetModelColumn() == columnId )
412 wxDataViewItemArray sel;
415 std::vector<int> prev_selected_netcodes;
416 prev_selected_netcodes.reserve( sel.GetCount() );
418 for(
unsigned int i = 0; i < sel.GetCount(); ++i )
421 prev_selected_netcodes.push_back( item->
GetNetCode() );
427 if( wxDataViewColumn* sorting_column =
m_netsList->GetSortingColumn() )
431 sorting_column_id =
static_cast<int>( sorting_column->GetModelColumn() );
432 sort_order_asc = sorting_column->IsSortOrderAscending();
436 sorting_column->UnsetAsSortKey();
449 std::vector<std::unique_ptr<LIST_ITEM>> new_items;
457 unsigned int pad_count;
460 struct NET_INFO_CMP_LESS
462 bool operator()(
const NET_INFO& a,
const NET_INFO& b )
const
464 return a.netcode < b.netcode;
466 bool operator()(
const NET_INFO& a,
int b )
const {
return a.netcode < b; }
467 bool operator()(
int a,
const NET_INFO& b )
const {
return a < b.netcode; }
470 std::vector<NET_INFO> nets;
479 nets.emplace_back( NET_INFO{ ni.first, ni.second, 0 } );
486 for(
PAD*
pad : footprint->Pads() )
488 auto i = std::lower_bound( nets.begin(), nets.end(),
pad->GetNetCode(),
489 NET_INFO_CMP_LESS() );
491 if( i != nets.end() && i->netcode ==
pad->GetNetCode() )
496 for( NET_INFO& ni : nets )
499 new_items.emplace_back(
buildNewItem( ni.net, ni.pad_count, prefiltered_cn_items ) );
516 std::vector<std::pair<wxString, wxDataViewItem>> groupItems =
521 auto pred = [&groupName](
const std::pair<wxString, wxDataViewItem>& item )
523 return groupName == item.first;
526 auto tableItem = std::find_if( groupItems.begin(), groupItems.end(), pred );
528 if( tableItem != groupItems.end() )
540 for(
int& nc : prev_selected_netcodes )
542 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( nc );
546 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
547 sel.Add( wxDataViewItem( list_item.get() ) );
589 bool matched =
false;
592 if( filterString.Length() == 0 )
596 if( !matched && cfg->
filter_by_netclass && netClassName.Find( filterString ) != wxNOT_FOUND )
600 if( !matched && cfg->
filter_by_net_name && netName.Find( filterString ) != wxNOT_FOUND )
607 matched = !netName.StartsWith( wxT(
"UNCONNECTED-(" ) );
624std::unique_ptr<PCB_NET_INSPECTOR_PANEL::LIST_ITEM>
626 const std::vector<CN_ITEM*>& aCNItems )
628 std::unique_ptr<LIST_ITEM> new_item = std::make_unique<LIST_ITEM>( aNet );
630 new_item->SetPadCount( aPadCount );
632 const auto cn_items = std::equal_range( aCNItems.begin(), aCNItems.end(), aNet->
GetNetCode(),
635 for(
auto i = cn_items.first; i != cn_items.second; ++i )
640 new_item->AddPadDieLength(
static_cast<PAD*
>( item )->GetPadToDieLength() );
644 new_item->AddLayerWireLength( track->GetLength(),
645 static_cast<int>( track->GetLayer() ) );
649 new_item->AddViaCount( 1 );
664 const auto type_bits = std::bitset<MAX_STRUCT_TYPE_ID>()
670 std::vector<CN_ITEM*> cn_items;
671 cn_items.reserve( 1024 );
675 if( cn_item->Valid() && type_bits[cn_item->Parent()->Type()] )
676 cn_items.push_back( cn_item );
703 for(
int layer =
via->TopLayer(); layer <=
via->BottomLayer(); ++layer )
715 top_layer =
via->TopLayer();
717 bottom_layer =
via->BottomLayer();
727 int effectiveBottomLayer;
729 if(
via->BottomLayer() ==
B_Cu )
730 effectiveBottomLayer =
F_Cu + dielectricLayers;
732 effectiveBottomLayer =
via->BottomLayer();
734 int layerCount = effectiveBottomLayer -
via->TopLayer();
736 return layerCount * layerThickness;
753 std::optional<LIST_ITEM_ITER> cur_net_row =
m_data_model->findItem( aNet );
763 std::unique_ptr<LIST_ITEM> new_list_item =
772 const std::unique_ptr<LIST_ITEM>& cur_list_item = *cur_net_row.value();
774 if( cur_list_item->GetNetName() != new_list_item->GetNetName() )
784 cur_list_item->SetPadCount( new_list_item->GetPadCount() );
785 cur_list_item->SetViaCount( new_list_item->GetViaCount() );
788 cur_list_item->SetLayerWireLength( new_list_item->GetLayerWireLength( ii ), ii );
790 cur_list_item->SetPadDieLength( new_list_item->GetPadDieLength() );
806 return wxString::Format( wxT(
"%.3d" ), aNet->
GetNetCode() );
818 return wxString::Format( wxT(
"%u" ), aValue );
825 static_cast<long long int>( aValue ),
835 wxDataViewItemArray sel;
859 if(
m_brd !=
nullptr )
876 if( !IsShownOnScreen() )
886 std::unique_ptr<LIST_ITEM> new_item = std::make_unique<LIST_ITEM>( net );
896 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( i->GetNet() );
903 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
904 int len = track->GetLength();
906 list_item->AddLayerWireLength( len,
static_cast<int>( track->GetLayer() ) );
910 list_item->AddViaCount( 1 );
924 for(
const PAD*
pad : footprint->Pads() )
926 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem(
pad->GetNet() );
936 r =
m_data_model->addItem( std::make_unique<LIST_ITEM>(
pad->GetNet() ) );
941 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
942 int len =
pad->GetPadToDieLength();
944 list_item->AddPadCount( 1 );
945 list_item->AddPadDieLength( len );
958 std::vector<BOARD_ITEM*>& aBoardItems )
960 if( !IsShownOnScreen() )
964 if( aBoardItems.size() > 25 )
981 if( !IsShownOnScreen() )
990 for(
const PAD*
pad : footprint->Pads() )
992 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem(
pad->GetNet() );
996 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
997 int len =
pad->GetPadToDieLength();
999 list_item->SubPadCount( 1 );
1000 list_item->SubPadDieLength( len );
1011 std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( i->GetNet() );
1018 const std::unique_ptr<LIST_ITEM>& list_item = *r.value();
1019 int len = track->GetLength();
1021 list_item->SubLayerWireLength( len,
static_cast<int>( track->GetLayer() ) );
1025 list_item->SubViaCount( 1 );
1041 std::vector<BOARD_ITEM*>& aBoardItems )
1043 if( !IsShownOnScreen() )
1046 if( aBoardItems.size() > 25 )
1063 if( !IsShownOnScreen() )
1073 if( !IsShownOnScreen() )
1077 ||
dynamic_cast<FOOTPRINT*
>( aBoardItem ) !=
nullptr )
1086 std::vector<BOARD_ITEM*>& aBoardItems )
1088 if( !IsShownOnScreen() )
1097 std::vector<BOARD_ITEM*>& aAddedItems,
1098 std::vector<BOARD_ITEM*>& aRemovedItems,
1099 std::vector<BOARD_ITEM*>& aDeletedItems )
1101 if( !IsShownOnScreen() )
1122 wxDataViewItemArray new_selection;
1123 new_selection.Alloc( selected_codes.size() );
1125 for(
int code : selected_codes )
1127 if( std::optional<LIST_ITEM_ITER> r =
m_data_model->findItem( code ) )
1128 new_selection.Add( wxDataViewItem( &***r ) );
1133 if( !new_selection.IsEmpty() )
1134 m_netsList->EnsureVisible( new_selection.Item( 0 ) );
1154 bool multipleSelections =
false;
1157 if(
m_netsList->GetSelectedItemsCount() == 1 )
1163 if(
m_netsList->GetSelectedItemsCount() > 1 )
1164 multipleSelections =
true;
1172 wxEmptyString, wxITEM_NORMAL );
1175 wxMenuItem* clearHighlighting =
1177 wxEmptyString, wxITEM_NORMAL );
1178 menu.Append( clearHighlighting );
1183 if( selected_codes.size() == 0 )
1184 clearHighlighting->Enable(
false );
1186 menu.AppendSeparator();
1188 wxMenuItem* renameNet =
new wxMenuItem( &menu,
ID_RENAME_NET,
_(
"Rename Selected Net" ),
1189 wxEmptyString, wxITEM_NORMAL );
1190 menu.Append( renameNet );
1192 wxMenuItem* deleteNet =
new wxMenuItem( &menu,
ID_DELETE_NET,
_(
"Delete Selected Net" ),
1193 wxEmptyString, wxITEM_NORMAL );
1194 menu.Append( deleteNet );
1196 menu.AppendSeparator();
1198 wxMenuItem* addNet =
1199 new wxMenuItem( &menu,
ID_ADD_NET,
_(
"Add Net" ), wxEmptyString, wxITEM_NORMAL );
1200 menu.Append( addNet );
1202 if( !selItem && !multipleSelections )
1205 deleteNet->Enable(
false );
1206 renameNet->Enable(
false );
1210 if( multipleSelections || selItem->
GetIsGroup() )
1212 highlightNet->SetItemLabel(
_(
"Highlight Selected Nets" ) );
1213 renameNet->Enable(
false );
1214 deleteNet->SetItemLabel(
_(
"Delete Selected Nets" ) );
1218 menu.AppendSeparator();
1220 wxMenuItem* removeSelectedGroup =
1222 wxEmptyString, wxITEM_NORMAL );
1223 menu.Append( removeSelectedGroup );
1227 removeSelectedGroup->Enable(
false );
1245 wxString newGroupName;
1251 if( dlg.ShowModal() != wxID_OK || dlg.
GetValue().IsEmpty() )
1256 if( newGroupName ==
"" )
1261 auto pred = [&]( wxString& rule )
1263 return rule.Upper() == newGroupName.Upper();
1312 if(
m_netsList->GetSelectedItemsCount() == 1 )
1320 wxMenuItem* filterByNetName =
new wxMenuItem(
1322 filterByNetName->Check( cfg.filter_by_net_name );
1323 menu.Append( filterByNetName );
1325 wxMenuItem* filterByNetclass =
new wxMenuItem(
1327 filterByNetclass->Check( cfg.filter_by_netclass );
1328 menu.Append( filterByNetclass );
1330 menu.AppendSeparator();
1339 wxMenuItem* groupNetclass =
new wxMenuItem(
1342 menu.Append( groupNetclass );
1344 menu.AppendSeparator();
1346 wxMenuItem* addGroup =
new wxMenuItem( &menu,
ID_ADD_GROUP,
_(
"Add Custom Group" ),
1347 wxEmptyString, wxITEM_NORMAL );
1348 menu.Append( addGroup );
1350 wxMenuItem* removeSelectedGroup =
1352 wxEmptyString, wxITEM_NORMAL );
1353 menu.Append( removeSelectedGroup );
1357 removeSelectedGroup->Enable(
false );
1360 wxMenuItem* removeCustomGroups =
1361 new wxMenuItem( &menu,
ID_REMOVE_GROUPS,
_(
"Remove All Custom Groups" ), wxEmptyString,
1363 menu.Append( removeCustomGroups );
1366 menu.AppendSeparator();
1368 wxMenuItem* showZeroNetPads =
new wxMenuItem(
1371 menu.Append( showZeroNetPads );
1373 wxMenuItem* showUnconnectedNets =
1375 wxEmptyString, wxITEM_CHECK );
1377 menu.Append( showUnconnectedNets );
1379 menu.AppendSeparator();
1384 wxEmptyString, wxITEM_NORMAL );
1387 menu.AppendSeparator();
1390 wxMenu* colsMenu =
new wxMenu();
1392 menu.AppendSubMenu( colsMenu,
_(
"Show / Hide Columns" ) );
1405 wxEmptyString, wxITEM_CHECK );
1407 target->Append( opt );
1408 opt->Check( !col->IsHidden() );
1411 target->AppendSeparator();
1416 wxEmptyString, wxITEM_CHECK );
1418 target->Append( opt );
1419 opt->Check( !col->IsHidden() );
1426 bool saveAndRebuild =
true;
1428 switch( event.GetId() )
1493 saveAndRebuild =
false;
1499 saveAndRebuild =
false;
1505 saveAndRebuild =
false;
1515 col->SetWidth( std::max( col->GetWidth(), 10 ) );
1516 col->SetHidden( !col->IsHidden() );
1522 if( saveAndRebuild )
1532 if(
m_netsList->GetSelectedItemsCount() == 1 )
1556 wxFileDialog dlg(
this,
_(
"Save Net Inspector Report File" ),
"",
"",
1558 wxFD_SAVE | wxFD_OVERWRITE_PROMPT );
1560 if( dlg.ShowModal() == wxID_CANCEL )
1563 wxTextFile f( dlg.GetPath() );
1578 txt += wxString::Format(
_(
"%s (%s)" ), col.csv_name,
1583 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;
1694 if( dlg.ShowModal() != wxID_OK || dlg.
GetValue().IsEmpty() )
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;
1752 if( dlg.ShowModal() != wxID_OK || dlg.
GetValue() == unescapedShortName )
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 )
1962 cfg.expanded_rows.push_back( item.first );
1967 cfg.custom_group_rules.clear();
1971 cfg.custom_group_rules.push_back( rule );
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.
std::vector< wxString > m_custom_group_rules
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.
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
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
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.
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.