From c549a214c9883d038f5c073b97cf092af6e964a0 Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Fri, 21 Jun 2024 19:07:42 +0100 Subject: [PATCH] Performance: don't alloc std::vector in critical areas. For some history, see also aa2ad3b44c3e533cf00a5077db17fb0ee7e302eb --- common/tool/selection.cpp | 5 +- eeschema/bus-wire-junction.cpp | 2 +- .../dialog_global_edit_text_and_graphics.cpp | 7 +- eeschema/sch_edit_frame.cpp | 12 +-- eeschema/sch_field.cpp | 11 ++- eeschema/sch_label.cpp | 7 +- eeschema/sch_screen.cpp | 6 +- eeschema/tools/ee_point_editor.cpp | 20 ++-- eeschema/tools/ee_selection_tool.cpp | 32 +++++-- eeschema/tools/sch_edit_tool.cpp | 95 +++++++++++-------- eeschema/tools/symbol_editor_pin_tool.cpp | 4 +- pcbnew/board.cpp | 9 +- pcbnew/connectivity/connectivity_algo.cpp | 32 +++---- pcbnew/connectivity/connectivity_algo.h | 3 +- pcbnew/connectivity/connectivity_data.cpp | 6 +- pcbnew/connectivity/connectivity_data.h | 8 +- pcbnew/netinfo_item.cpp | 12 ++- pcbnew/pcb_edit_frame.cpp | 81 ++++++++-------- pcbnew/router/router_tool.cpp | 2 +- pcbnew/tools/convert_tool.cpp | 53 ++++++----- pcbnew/tools/edit_tool.cpp | 59 +++++++----- pcbnew/tools/pad_tool.cpp | 4 +- pcbnew/tools/pcb_selection_tool.cpp | 4 +- pcbnew/tracks_cleaner.cpp | 12 ++- 24 files changed, 279 insertions(+), 207 deletions(-) diff --git a/common/tool/selection.cpp b/common/tool/selection.cpp index 900900664a..ac30e3c3ce 100644 --- a/common/tool/selection.cpp +++ b/common/tool/selection.cpp @@ -92,7 +92,8 @@ bool SELECTION::Contains( EDA_ITEM* aItem ) const /// Returns the center point of the selection area bounding box. VECTOR2I SELECTION::GetCenter() const { - bool hasOnlyText = true; + static const std::vector textTypes = { SCH_TEXT_T, SCH_LABEL_LOCATE_ANY_T }; + bool hasOnlyText = true; // If the selection contains only texts calculate the center as the mean of all positions // instead of using the center of the total bounding box. Otherwise rotating the selection will @@ -100,7 +101,7 @@ VECTOR2I SELECTION::GetCenter() const for( EDA_ITEM* item : m_items ) { - if( !item->IsType( { SCH_TEXT_T, SCH_LABEL_LOCATE_ANY_T } ) ) + if( !item->IsType( textTypes ) ) { hasOnlyText = false; break; diff --git a/eeschema/bus-wire-junction.cpp b/eeschema/bus-wire-junction.cpp index 2faa8830e2..5ba003406f 100644 --- a/eeschema/bus-wire-junction.cpp +++ b/eeschema/bus-wire-junction.cpp @@ -376,7 +376,7 @@ void SCH_EDIT_FRAME::DeleteJunction( SCH_COMMIT* aCommit, SCH_ITEM* aJunction ) { SCH_LINE* line = static_cast( item ); - if( line->IsType( { SCH_ITEM_LOCATE_WIRE_T, SCH_ITEM_LOCATE_BUS_T } ) + if( ( line->IsWire() || line->IsBus() ) && line->IsEndPoint( aJunction->GetPosition() ) && !( line->GetEditFlags() & STRUCT_DELETED ) ) { diff --git a/eeschema/dialogs/dialog_global_edit_text_and_graphics.cpp b/eeschema/dialogs/dialog_global_edit_text_and_graphics.cpp index 34d7c44dfc..1e956b1be9 100644 --- a/eeschema/dialogs/dialog_global_edit_text_and_graphics.cpp +++ b/eeschema/dialogs/dialog_global_edit_text_and_graphics.cpp @@ -419,6 +419,9 @@ void DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::visitItem( SCH_COMMIT* aCommit, } } + static const std::vector wireLabelTypes = { SCH_LABEL_LOCATE_WIRE_T }; + static const std::vector busLabelTypes = { SCH_LABEL_LOCATE_BUS_T }; + switch( aItem->Type() ) { case SCH_SYMBOL_T: @@ -508,10 +511,10 @@ void DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::visitItem( SCH_COMMIT* aCommit, case SCH_GLOBAL_LABEL_T: case SCH_HIER_LABEL_T: case SCH_DIRECTIVE_LABEL_T: - if( m_wires->GetValue() && aItem->IsType( { SCH_LABEL_LOCATE_WIRE_T } ) ) + if( m_wires->GetValue() && aItem->IsType( wireLabelTypes ) ) processItem( aCommit, aSheetPath, aItem ); - if( m_buses->GetValue() && aItem->IsType( { SCH_LABEL_LOCATE_BUS_T } ) ) + if( m_buses->GetValue() && aItem->IsType( busLabelTypes ) ) processItem( aCommit, aSheetPath, aItem ); if( m_globalLabels->GetValue() && aItem->Type() == SCH_GLOBAL_LABEL_T ) diff --git a/eeschema/sch_edit_frame.cpp b/eeschema/sch_edit_frame.cpp index 40ab7ac6aa..d342abcb94 100644 --- a/eeschema/sch_edit_frame.cpp +++ b/eeschema/sch_edit_frame.cpp @@ -1605,14 +1605,14 @@ void SCH_EDIT_FRAME::RefreshOperatingPointDisplay() for( SCH_ITEM* item : subgraph->GetItems() ) { - if( item->IsType( { SCH_ITEM_LOCATE_WIRE_T } ) ) + if( item->Type() == SCH_LINE_T ) { - SCH_LINE* wire = static_cast( item ); + SCH_LINE* line = static_cast( item ); - if( wire->GetLength() > length ) + if( line->IsWire() && line->GetLength() > length ) { - longestWire = wire; - length = wire->GetLength(); + longestWire = line; + length = line->GetLength(); } } } @@ -1630,7 +1630,7 @@ void SCH_EDIT_FRAME::RefreshOperatingPointDisplay() void SCH_EDIT_FRAME::AutoRotateItem( SCH_SCREEN* aScreen, SCH_ITEM* aItem ) { - if( aItem->IsType( { SCH_GLOBAL_LABEL_T, SCH_HIER_LABEL_T } ) ) + if( aItem->Type() == SCH_GLOBAL_LABEL_T || aItem->Type() == SCH_HIER_LABEL_T ) { SCH_LABEL_BASE* label = static_cast( aItem ); diff --git a/eeschema/sch_field.cpp b/eeschema/sch_field.cpp index 951c16f129..950bf4e9dc 100644 --- a/eeschema/sch_field.cpp +++ b/eeschema/sch_field.cpp @@ -52,6 +52,9 @@ #include #include "sim/sim_lib_mgr.h" +static const std::vector labelTypes = { SCH_LABEL_LOCATE_ANY_T }; + + SCH_FIELD::SCH_FIELD( const VECTOR2I& aPos, int aFieldId, SCH_ITEM* aParent, const wxString& aName ) : SCH_ITEM( aParent, SCH_FIELD_T ), @@ -173,7 +176,7 @@ void SCH_FIELD::SetId( int aId ) default: SetLayer( LAYER_FIELDS ); break; } } - else if( m_parent && m_parent->IsType( { SCH_LABEL_LOCATE_ANY_T } ) ) + else if( m_parent && m_parent->IsType( labelTypes ) ) { // We can't use defined IDs for labels because there can be multiple net class // assignments. @@ -271,7 +274,7 @@ wxString SCH_FIELD::GetShownText( const SCH_SHEET_PATH* aPath, bool aAllowExtraT text = ExpandTextVars( text, &symbolResolver ); else if( m_parent && m_parent->Type() == SCH_SHEET_T ) text = ExpandTextVars( text, &sheetResolver ); - else if( m_parent && m_parent->IsType( { SCH_LABEL_LOCATE_ANY_T } ) ) + else if( m_parent && m_parent->IsType( labelTypes ) ) text = ExpandTextVars( text, &labelResolver ); else if( Schematic() ) { @@ -1178,7 +1181,7 @@ wxString SCH_FIELD::GetName( bool aUseDefaultName ) const else if( m_name.IsEmpty() && aUseDefaultName ) return SCH_SHEET::GetDefaultFieldName( m_id ); } - else if( m_parent && m_parent->IsType( { SCH_LABEL_LOCATE_ANY_T } ) ) + else if( m_parent && m_parent->IsType( labelTypes ) ) { return SCH_LABEL_BASE::GetDefaultFieldName( m_name, aUseDefaultName ); } @@ -1201,7 +1204,7 @@ wxString SCH_FIELD::GetCanonicalName() const else if( m_id == SHEETFILENAME ) return wxT( "Sheetfile" ); } - else if( m_parent && m_parent->IsType( { SCH_LABEL_LOCATE_ANY_T } ) ) + else if( m_parent && m_parent->IsType( labelTypes ) ) { // These should be stored in canonical format, but just in case: if( m_name == _( "Net Class" ) || m_name == wxT( "Net Class" ) ) diff --git a/eeschema/sch_label.cpp b/eeschema/sch_label.cpp index 34e12fb9de..62485d66d0 100644 --- a/eeschema/sch_label.cpp +++ b/eeschema/sch_label.cpp @@ -259,6 +259,9 @@ const wxString SCH_LABEL_BASE::GetDefaultFieldName( const wxString& aName, bool bool SCH_LABEL_BASE::IsType( const std::vector& aScanTypes ) const { + static const std::vector wireAndPinTypes = { SCH_ITEM_LOCATE_WIRE_T, SCH_PIN_T }; + static const std::vector busTypes = { SCH_ITEM_LOCATE_BUS_T }; + if( SCH_TEXT::IsType( aScanTypes ) ) return true; @@ -283,7 +286,7 @@ bool SCH_LABEL_BASE::IsType( const std::vector& aScanTypes ) const { for( SCH_ITEM* connection : item_set ) { - if( connection->IsType( { SCH_ITEM_LOCATE_WIRE_T, SCH_PIN_T } ) ) + if( connection->IsType( wireAndPinTypes ) ) return true; } } @@ -292,7 +295,7 @@ bool SCH_LABEL_BASE::IsType( const std::vector& aScanTypes ) const { for( SCH_ITEM* connection : item_set ) { - if( connection->IsType( { SCH_ITEM_LOCATE_BUS_T } ) ) + if( connection->IsType( busTypes ) ) return true; } } diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp index 4a22bfff6d..d7cca68758 100644 --- a/eeschema/sch_screen.cpp +++ b/eeschema/sch_screen.cpp @@ -1224,9 +1224,13 @@ void SCH_SCREEN::EnsureAlternateReferencesExist() void SCH_SCREEN::GetHierarchicalItems( std::vector* aItems ) const { + static const std::vector hierarchicalTypes = { SCH_SYMBOL_T, + SCH_SHEET_T, + SCH_LABEL_LOCATE_ANY_T }; + for( SCH_ITEM* item : Items() ) { - if( item->IsType( { SCH_SYMBOL_T, SCH_SHEET_T, SCH_LABEL_LOCATE_ANY_T } ) ) + if( item->IsType( hierarchicalTypes ) ) aItems->push_back( item ); } } diff --git a/eeschema/tools/ee_point_editor.cpp b/eeschema/tools/ee_point_editor.cpp index b59d33eada..576070ff22 100644 --- a/eeschema/tools/ee_point_editor.cpp +++ b/eeschema/tools/ee_point_editor.cpp @@ -40,9 +40,15 @@ using namespace std::placeholders; #include #include #include -#include -#include -#include + + +static const std::vector pointEditorTypes = { SCH_SHAPE_T, + SCH_RULE_AREA_T, + SCH_TEXTBOX_T, + SCH_TABLECELL_T, + SCH_SHEET_T, + SCH_ITEM_LOCATE_GRAPHIC_LINE_T, + SCH_BITMAP_T }; // Few constants to avoid using bare numbers for point indices @@ -380,13 +386,7 @@ int EE_POINT_EDITOR::Main( const TOOL_EVENT& aEvent ) const EE_SELECTION& selection = m_selectionTool->GetSelection(); - if( selection.Size() != 1 || !selection.Front()->IsType( { SCH_SHAPE_T, - SCH_RULE_AREA_T, - SCH_TEXTBOX_T, - SCH_TABLECELL_T, - SCH_SHEET_T, - SCH_ITEM_LOCATE_GRAPHIC_LINE_T, - SCH_BITMAP_T } ) ) + if( selection.Size() != 1 || !selection.Front()->IsType( pointEditorTypes ) ) { return 0; } diff --git a/eeschema/tools/ee_selection_tool.cpp b/eeschema/tools/ee_selection_tool.cpp index a542d66c3c..7ee65d33e7 100644 --- a/eeschema/tools/ee_selection_tool.cpp +++ b/eeschema/tools/ee_selection_tool.cpp @@ -198,6 +198,22 @@ static std::vector connectedTypes = SCH_JUNCTION_T }; +static std::vector connectedLineTypes = +{ + SCH_ITEM_LOCATE_WIRE_T, + SCH_ITEM_LOCATE_BUS_T +}; + +static std::vector crossProbingTypes = +{ + SCH_SYMBOL_T, + SCH_PIN_T, + SCH_SHEET_T +}; + +static std::vector lineTypes = { SCH_LINE_T }; +static std::vector sheetTypes = { SCH_SHEET_T }; +static std::vector tableCellTypes = { SCH_TABLECELL_T }; bool EE_SELECTION_TOOL::Init() { @@ -217,16 +233,12 @@ bool EE_SELECTION_TOOL::Init() m_isSymbolViewer = symbolViewerFrame != nullptr; } - auto linesSelection = E_C::MoreThan( 0 ) && - E_C::OnlyTypes( { SCH_ITEM_LOCATE_WIRE_T, SCH_ITEM_LOCATE_BUS_T, - SCH_ITEM_LOCATE_GRAPHIC_LINE_T } ); - auto wireOrBusSelection = E_C::Count( 1 ) && - E_C::OnlyTypes( { SCH_ITEM_LOCATE_WIRE_T, - SCH_ITEM_LOCATE_BUS_T } ); + auto linesSelection = E_C::MoreThan( 0 ) && E_C::OnlyTypes( lineTypes ); + auto wireOrBusSelection = E_C::Count( 1 ) && E_C::OnlyTypes( connectedLineTypes ); auto connectedSelection = E_C::Count( 1 ) && E_C::OnlyTypes( connectedTypes ); - auto sheetSelection = E_C::Count( 1 ) && E_C::OnlyTypes( { SCH_SHEET_T } ); - auto crossProbingSelection = E_C::MoreThan( 0 ) && E_C::HasTypes( { SCH_SYMBOL_T, SCH_PIN_T, SCH_SHEET_T } ); - auto tableCellSelection = E_C::MoreThan( 0 ) && E_C::OnlyTypes( { SCH_TABLECELL_T } ); + auto sheetSelection = E_C::Count( 1 ) && E_C::OnlyTypes( sheetTypes ); + auto crossProbingSelection = E_C::MoreThan( 0 ) && E_C::HasTypes( crossProbingTypes ); + auto tableCellSelection = E_C::MoreThan( 0 ) && E_C::OnlyTypes( tableCellTypes ); auto schEditSheetPageNumberCondition = [&] ( const SELECTION& aSel ) @@ -234,7 +246,7 @@ bool EE_SELECTION_TOOL::Init() if( m_isSymbolEditor || m_isSymbolViewer ) return false; - return E_C::LessThan( 2 )( aSel ) && E_C::OnlyTypes( { SCH_SHEET_T } )( aSel ); + return E_C::LessThan( 2 )( aSel ) && E_C::OnlyTypes( sheetTypes )( aSel ); }; auto schEditCondition = diff --git a/eeschema/tools/sch_edit_tool.cpp b/eeschema/tools/sch_edit_tool.cpp index b0909edfac..5a1a526305 100644 --- a/eeschema/tools/sch_edit_tool.cpp +++ b/eeschema/tools/sch_edit_tool.cpp @@ -243,7 +243,9 @@ bool SCH_EDIT_TOOL::Init() return false; }; - auto sheetSelection = E_C::Count( 1 ) && E_C::OnlyTypes( { SCH_SHEET_T } ); + static const std::vector sheetTypes = { SCH_SHEET_T }; + + auto sheetSelection = E_C::Count( 1 ) && E_C::OnlyTypes( sheetTypes ); auto haveHighlight = [&]( const SELECTION& sel ) @@ -378,61 +380,74 @@ bool SCH_EDIT_TOOL::Init() // allTextTypes does not include SCH_SHEET_PIN_T because one cannot convert other // types to/from this type, living only in a SHEET - static std::vector allTextTypes = { SCH_LABEL_T, - SCH_DIRECTIVE_LABEL_T, - SCH_GLOBAL_LABEL_T, - SCH_HIER_LABEL_T, - SCH_TEXT_T, - SCH_TEXTBOX_T }; + static const std::vector allTextTypes = { SCH_LABEL_T, + SCH_DIRECTIVE_LABEL_T, + SCH_GLOBAL_LABEL_T, + SCH_HIER_LABEL_T, + SCH_TEXT_T, + SCH_TEXTBOX_T }; auto toChangeCondition = ( E_C::OnlyTypes( allTextTypes ) ); - auto toLabelCondition = ( E_C::Count( 1 ) && E_C::OnlyTypes( { SCH_DIRECTIVE_LABEL_T, - SCH_GLOBAL_LABEL_T, - SCH_HIER_LABEL_T, - SCH_TEXT_T, - SCH_TEXTBOX_T } ) ) + static const std::vector toLabelTypes = { SCH_DIRECTIVE_LABEL_T, + SCH_GLOBAL_LABEL_T, + SCH_HIER_LABEL_T, + SCH_TEXT_T, + SCH_TEXTBOX_T }; + + auto toLabelCondition = ( E_C::Count( 1 ) && E_C::OnlyTypes( toLabelTypes ) ) || ( E_C::MoreThan( 1 ) && E_C::OnlyTypes( allTextTypes ) ); - auto toCLabelCondition = ( E_C::Count( 1 ) && E_C::OnlyTypes( { SCH_LABEL_T, - SCH_HIER_LABEL_T, - SCH_GLOBAL_LABEL_T, - SCH_TEXT_T, - SCH_TEXTBOX_T } ) ) + static const std::vector toCLabelTypes = { SCH_LABEL_T, + SCH_HIER_LABEL_T, + SCH_GLOBAL_LABEL_T, + SCH_TEXT_T, + SCH_TEXTBOX_T }; + + auto toCLabelCondition = ( E_C::Count( 1 ) && E_C::OnlyTypes( toCLabelTypes ) ) || ( E_C::MoreThan( 1 ) && E_C::OnlyTypes( allTextTypes ) ); - auto toHLabelCondition = ( E_C::Count( 1 ) && E_C::OnlyTypes( { SCH_LABEL_T, - SCH_DIRECTIVE_LABEL_T, - SCH_GLOBAL_LABEL_T, - SCH_TEXT_T, - SCH_TEXTBOX_T } ) ) + static const std::vector toHLabelTypes = { SCH_LABEL_T, + SCH_DIRECTIVE_LABEL_T, + SCH_GLOBAL_LABEL_T, + SCH_TEXT_T, + SCH_TEXTBOX_T }; + + auto toHLabelCondition = ( E_C::Count( 1 ) && E_C::OnlyTypes( toHLabelTypes ) ) || ( E_C::MoreThan( 1 ) && E_C::OnlyTypes( allTextTypes ) ); - auto toGLabelCondition = ( E_C::Count( 1 ) && E_C::OnlyTypes( { SCH_LABEL_T, - SCH_DIRECTIVE_LABEL_T, - SCH_HIER_LABEL_T, - SCH_TEXT_T, - SCH_TEXTBOX_T } ) ) + static const std::vector toGLabelTypes = { SCH_LABEL_T, + SCH_DIRECTIVE_LABEL_T, + SCH_HIER_LABEL_T, + SCH_TEXT_T, + SCH_TEXTBOX_T }; + + auto toGLabelCondition = ( E_C::Count( 1 ) && E_C::OnlyTypes( toGLabelTypes ) ) || ( E_C::MoreThan( 1 ) && E_C::OnlyTypes( allTextTypes ) ); - auto toTextCondition = ( E_C::Count( 1 ) && E_C::OnlyTypes( { SCH_LABEL_T, - SCH_DIRECTIVE_LABEL_T, - SCH_GLOBAL_LABEL_T, - SCH_HIER_LABEL_T, - SCH_TEXTBOX_T } ) ) + static const std::vector toTextTypes = { SCH_LABEL_T, + SCH_DIRECTIVE_LABEL_T, + SCH_GLOBAL_LABEL_T, + SCH_HIER_LABEL_T, + SCH_TEXTBOX_T }; + + auto toTextCondition = ( E_C::Count( 1 ) && E_C::OnlyTypes( toTextTypes ) ) || ( E_C::MoreThan( 1 ) && E_C::OnlyTypes( allTextTypes ) ); - auto toTextBoxCondition = ( E_C::Count( 1 ) && E_C::OnlyTypes( { SCH_LABEL_T, - SCH_DIRECTIVE_LABEL_T, - SCH_GLOBAL_LABEL_T, - SCH_HIER_LABEL_T, - SCH_TEXT_T } ) ) + static const std::vector toTextBoxTypes = { SCH_LABEL_T, + SCH_DIRECTIVE_LABEL_T, + SCH_GLOBAL_LABEL_T, + SCH_HIER_LABEL_T, + SCH_TEXT_T }; + + auto toTextBoxCondition = ( E_C::Count( 1 ) && E_C::OnlyTypes( toTextBoxTypes ) ) || ( E_C::MoreThan( 1 ) && E_C::OnlyTypes( allTextTypes ) ); - auto entryCondition = E_C::MoreThan( 0 ) && E_C::OnlyTypes( { SCH_BUS_WIRE_ENTRY_T, - SCH_BUS_BUS_ENTRY_T} ); + static const std::vector busEntryTypes = { SCH_BUS_WIRE_ENTRY_T, SCH_BUS_BUS_ENTRY_T}; - auto singleSheetCondition = E_C::Count( 1 ) && E_C::OnlyTypes( { SCH_SHEET_T } ); + auto entryCondition = E_C::MoreThan( 0 ) && E_C::OnlyTypes( busEntryTypes ); + + auto singleSheetCondition = E_C::Count( 1 ) && E_C::OnlyTypes( sheetTypes ); auto makeSymbolUnitMenu = [&]( TOOL_INTERACTIVE* tool ) diff --git a/eeschema/tools/symbol_editor_pin_tool.cpp b/eeschema/tools/symbol_editor_pin_tool.cpp index 80abf4e559..63c2370e79 100644 --- a/eeschema/tools/symbol_editor_pin_tool.cpp +++ b/eeschema/tools/symbol_editor_pin_tool.cpp @@ -103,7 +103,9 @@ bool SYMBOL_EDITOR_PIN_TOOL::Init() return editor->IsSymbolEditable() && !editor->IsSymbolAlias(); }; - auto singlePinCondition = EE_CONDITIONS::Count( 1 ) && EE_CONDITIONS::OnlyTypes( { SCH_PIN_T } ); + static const std::vector pinTypes = { SCH_PIN_T }; + + auto singlePinCondition = EE_CONDITIONS::Count( 1 ) && EE_CONDITIONS::OnlyTypes( pinTypes ); CONDITIONAL_MENU& selToolMenu = m_selectionTool->GetToolMenu().GetMenu(); diff --git a/pcbnew/board.cpp b/pcbnew/board.cpp index 2a64baae0c..9ec0a90507 100644 --- a/pcbnew/board.cpp +++ b/pcbnew/board.cpp @@ -2188,9 +2188,12 @@ std::tuple BOARD::GetTrackLength( const PCB_TRACK& aTrack ) BOARD_STACKUP& stackup = GetDesignSettings().GetStackupDescriptor(); bool useHeight = GetDesignSettings().m_UseHeightForLengthCalcs; - for( BOARD_CONNECTED_ITEM* item : connectivity->GetConnectedItems( - static_cast( &aTrack ), - { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T, PCB_PAD_T } ) ) + static const std::vector baseConnectedTypes = { PCB_TRACE_T, + PCB_ARC_T, + PCB_VIA_T, + PCB_PAD_T }; + + for( BOARD_CONNECTED_ITEM* item : connectivity->GetConnectedItems( &aTrack, baseConnectedTypes ) ) { count++; diff --git a/pcbnew/connectivity/connectivity_algo.cpp b/pcbnew/connectivity/connectivity_algo.cpp index cecb1566f0..1f39052425 100644 --- a/pcbnew/connectivity/connectivity_algo.cpp +++ b/pcbnew/connectivity/connectivity_algo.cpp @@ -317,26 +317,26 @@ void CN_CONNECTIVITY_ALGO::searchConnections() const CN_CONNECTIVITY_ALGO::CLUSTERS CN_CONNECTIVITY_ALGO::SearchClusters( CLUSTER_SEARCH_MODE aMode ) { - if( aMode == CSM_PROPAGATE ) - { - return SearchClusters( aMode, - { PCB_TRACE_T, PCB_ARC_T, PCB_PAD_T, PCB_VIA_T, PCB_FOOTPRINT_T, - PCB_SHAPE_T }, - -1 ); - } - else - { - return SearchClusters( aMode, - { PCB_TRACE_T, PCB_ARC_T, PCB_PAD_T, PCB_VIA_T, PCB_ZONE_T, - PCB_FOOTPRINT_T, PCB_SHAPE_T }, - -1 ); - } + static const std::vector withoutZones = { PCB_TRACE_T, + PCB_ARC_T, + PCB_PAD_T, + PCB_VIA_T, + PCB_FOOTPRINT_T, + PCB_SHAPE_T }; + static const std::vector withZones = { PCB_TRACE_T, + PCB_ARC_T, + PCB_PAD_T, + PCB_VIA_T, + PCB_ZONE_T, + PCB_FOOTPRINT_T, + PCB_SHAPE_T }; + + return SearchClusters( aMode, aMode == CSM_PROPAGATE ? withoutZones : withZones, -1 ); } const CN_CONNECTIVITY_ALGO::CLUSTERS -CN_CONNECTIVITY_ALGO::SearchClusters( CLUSTER_SEARCH_MODE aMode, - const std::initializer_list& aTypes, +CN_CONNECTIVITY_ALGO::SearchClusters( CLUSTER_SEARCH_MODE aMode, const std::vector& aTypes, int aSingleNet, CN_ITEM* rootItem ) { bool withinAnyNet = ( aMode != CSM_PROPAGATE ); diff --git a/pcbnew/connectivity/connectivity_algo.h b/pcbnew/connectivity/connectivity_algo.h index 862e81050d..7f7fc671dc 100644 --- a/pcbnew/connectivity/connectivity_algo.h +++ b/pcbnew/connectivity/connectivity_algo.h @@ -226,8 +226,7 @@ public: bool Remove( BOARD_ITEM* aItem ); bool Add( BOARD_ITEM* aItem ); - const CLUSTERS SearchClusters( CLUSTER_SEARCH_MODE aMode, - const std::initializer_list& aTypes, + const CLUSTERS SearchClusters( CLUSTER_SEARCH_MODE aMode, const std::vector& aTypes, int aSingleNet, CN_ITEM* rootItem = nullptr ); const CLUSTERS SearchClusters( CLUSTER_SEARCH_MODE aMode ); diff --git a/pcbnew/connectivity/connectivity_data.cpp b/pcbnew/connectivity/connectivity_data.cpp index f122ac78b5..9e35055787 100644 --- a/pcbnew/connectivity/connectivity_data.cpp +++ b/pcbnew/connectivity/connectivity_data.cpp @@ -531,7 +531,7 @@ void CONNECTIVITY_DATA::ClearRatsnest() const std::vector CONNECTIVITY_DATA::GetConnectedItems( const BOARD_CONNECTED_ITEM *aItem, - const std::initializer_list& aTypes, + const std::vector& aTypes, bool aIgnoreNetcodes ) const { std::vector rv; @@ -562,7 +562,7 @@ CONNECTIVITY_DATA::GetConnectedItems( const BOARD_CONNECTED_ITEM *aItem, const std::vector -CONNECTIVITY_DATA::GetNetItems( int aNetCode, const std::initializer_list& aTypes ) const +CONNECTIVITY_DATA::GetNetItems( int aNetCode, const std::vector& aTypes ) const { std::vector items; items.reserve( 32 ); @@ -877,7 +877,7 @@ bool CONNECTIVITY_DATA::TestTrackEndpointDangling( PCB_TRACK* aTrack, bool aIgno const std::vector CONNECTIVITY_DATA::GetConnectedItemsAtAnchor( const BOARD_CONNECTED_ITEM* aItem, const VECTOR2I& aAnchor, - const std::initializer_list& aTypes, + const std::vector& aTypes, const int& aMaxError ) const { CN_CONNECTIVITY_ALGO::ITEM_MAP_ENTRY& entry = m_connAlgo->ItemEntry( aItem ); diff --git a/pcbnew/connectivity/connectivity_data.h b/pcbnew/connectivity/connectivity_data.h index 008fc49126..8081d22256 100644 --- a/pcbnew/connectivity/connectivity_data.h +++ b/pcbnew/connectivity/connectivity_data.h @@ -211,8 +211,7 @@ public: */ const std::vector GetConnectedItemsAtAnchor( const BOARD_CONNECTED_ITEM* aItem, const VECTOR2I& aAnchor, - const std::initializer_list& aTypes, - const int& aMaxError = 0 ) const; + const std::vector& aTypes, const int& aMaxError = 0 ) const; void RunOnUnconnectedEdges( std::function aFunc ); @@ -248,8 +247,7 @@ public: * @param aTypes allows one to filter by item types. */ const std::vector - GetConnectedItems( const BOARD_CONNECTED_ITEM* aItem, - const std::initializer_list& aTypes, + GetConnectedItems( const BOARD_CONNECTED_ITEM* aItem, const std::vector& aTypes, bool aIgnoreNetcodes = false ) const; /** @@ -259,7 +257,7 @@ public: * @param aTypes allows one to filter by item types. */ const std::vector - GetNetItems( int aNetCode, const std::initializer_list& aTypes ) const; + GetNetItems( int aNetCode, const std::vector& aTypes ) const; void BlockRatsnestItems( const std::vector& aItems ); diff --git a/pcbnew/netinfo_item.cpp b/pcbnew/netinfo_item.cpp index deaa91908d..4f2a7fb544 100644 --- a/pcbnew/netinfo_item.cpp +++ b/pcbnew/netinfo_item.cpp @@ -151,14 +151,18 @@ bool NETINFO_ITEM::Matches( const EDA_SEARCH_DATA& aSearchData, void* aAuxData ) const BOX2I NETINFO_ITEM::GetBoundingBox() const { + static const std::vector netItemTypes = { PCB_TRACE_T, + PCB_ARC_T, + PCB_VIA_T, + PCB_ZONE_T, + PCB_PAD_T, + PCB_SHAPE_T }; + std::shared_ptr conn = GetBoard()->GetConnectivity(); BOX2I bbox; - for( BOARD_ITEM* item : conn->GetNetItems( m_netCode, { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T, - PCB_ZONE_T, PCB_PAD_T } ) ) - { + for( BOARD_ITEM* item : conn->GetNetItems( m_netCode, netItemTypes ) ) bbox.Merge( item->GetBoundingBox() ); - } return bbox; } diff --git a/pcbnew/pcb_edit_frame.cpp b/pcbnew/pcb_edit_frame.cpp index 45b8eb1dcc..ada7c3814d 100644 --- a/pcbnew/pcb_edit_frame.cpp +++ b/pcbnew/pcb_edit_frame.cpp @@ -744,41 +744,41 @@ void PCB_EDIT_FRAME::setupUIConditions() #define ENABLE( x ) ACTION_CONDITIONS().Enable( x ) #define CHECK( x ) ACTION_CONDITIONS().Check( x ) +// clang-format off - mgr->SetConditions( ACTIONS::save, ENABLE( SELECTION_CONDITIONS::ShowAlways ) ); - mgr->SetConditions( ACTIONS::undo, ENABLE( undoCond ) ); - mgr->SetConditions( ACTIONS::redo, ENABLE( cond.RedoAvailable() ) ); + mgr->SetConditions( ACTIONS::save, ENABLE( SELECTION_CONDITIONS::ShowAlways ) ); + mgr->SetConditions( ACTIONS::undo, ENABLE( undoCond ) ); + mgr->SetConditions( ACTIONS::redo, ENABLE( cond.RedoAvailable() ) ); - mgr->SetConditions( ACTIONS::toggleGrid, CHECK( cond.GridVisible() ) ); + mgr->SetConditions( ACTIONS::toggleGrid, CHECK( cond.GridVisible() ) ); mgr->SetConditions( ACTIONS::toggleGridOverrides, CHECK( cond.GridOverrides() ) ); - mgr->SetConditions( ACTIONS::toggleCursorStyle, CHECK( cond.FullscreenCursor() ) ); - mgr->SetConditions( ACTIONS::togglePolarCoords, CHECK( cond.PolarCoordinates() ) ); - mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MILLIMETRES ) ) ); - mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCHES ) ) ); - mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) ); + mgr->SetConditions( ACTIONS::toggleCursorStyle, CHECK( cond.FullscreenCursor() ) ); + mgr->SetConditions( ACTIONS::togglePolarCoords, CHECK( cond.PolarCoordinates() ) ); + mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MILLIMETRES ) ) ); + mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCHES ) ) ); + mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) ); - mgr->SetConditions( ACTIONS::cut, ENABLE( cond.HasItems() ) ); - mgr->SetConditions( ACTIONS::copy, ENABLE( cond.HasItems() ) ); - mgr->SetConditions( ACTIONS::paste, - ENABLE( SELECTION_CONDITIONS::Idle && cond.NoActiveTool() ) ); - mgr->SetConditions( ACTIONS::pasteSpecial, - ENABLE( SELECTION_CONDITIONS::Idle && cond.NoActiveTool() ) ); - mgr->SetConditions( ACTIONS::selectAll, ENABLE( cond.HasItems() ) ); - mgr->SetConditions( ACTIONS::unselectAll, ENABLE( cond.HasItems() ) ); - mgr->SetConditions( ACTIONS::doDelete, ENABLE( cond.HasItems() ) ); - mgr->SetConditions( ACTIONS::duplicate, ENABLE( cond.HasItems() ) ); + mgr->SetConditions( ACTIONS::cut, ENABLE( cond.HasItems() ) ); + mgr->SetConditions( ACTIONS::copy, ENABLE( cond.HasItems() ) ); + mgr->SetConditions( ACTIONS::paste, ENABLE( SELECTION_CONDITIONS::Idle && cond.NoActiveTool() ) ); + mgr->SetConditions( ACTIONS::pasteSpecial, ENABLE( SELECTION_CONDITIONS::Idle && cond.NoActiveTool() ) ); + mgr->SetConditions( ACTIONS::selectAll, ENABLE( cond.HasItems() ) ); + mgr->SetConditions( ACTIONS::unselectAll, ENABLE( cond.HasItems() ) ); + mgr->SetConditions( ACTIONS::doDelete, ENABLE( cond.HasItems() ) ); + mgr->SetConditions( ACTIONS::duplicate, ENABLE( cond.HasItems() ) ); - mgr->SetConditions( PCB_ACTIONS::group, ENABLE( SELECTION_CONDITIONS::NotEmpty ) ); - mgr->SetConditions( PCB_ACTIONS::ungroup, ENABLE( SELECTION_CONDITIONS::HasTypes( - { PCB_GROUP_T, PCB_GENERATOR_T } ) ) ); - mgr->SetConditions( PCB_ACTIONS::lock, ENABLE( PCB_SELECTION_CONDITIONS::HasUnlockedItems ) ); - mgr->SetConditions( PCB_ACTIONS::unlock, ENABLE( PCB_SELECTION_CONDITIONS::HasLockedItems ) ); + static const std::vector groupTypes = { PCB_GROUP_T, PCB_GENERATOR_T }; - mgr->SetConditions( PCB_ACTIONS::padDisplayMode, CHECK( !cond.PadFillDisplay() ) ); - mgr->SetConditions( PCB_ACTIONS::viaDisplayMode, CHECK( !cond.ViaFillDisplay() ) ); + mgr->SetConditions( PCB_ACTIONS::group, ENABLE( SELECTION_CONDITIONS::NotEmpty ) ); + mgr->SetConditions( PCB_ACTIONS::ungroup, ENABLE( SELECTION_CONDITIONS::HasTypes( groupTypes ) ) ); + mgr->SetConditions( PCB_ACTIONS::lock, ENABLE( PCB_SELECTION_CONDITIONS::HasUnlockedItems ) ); + mgr->SetConditions( PCB_ACTIONS::unlock, ENABLE( PCB_SELECTION_CONDITIONS::HasLockedItems ) ); + + mgr->SetConditions( PCB_ACTIONS::padDisplayMode, CHECK( !cond.PadFillDisplay() ) ); + mgr->SetConditions( PCB_ACTIONS::viaDisplayMode, CHECK( !cond.ViaFillDisplay() ) ); mgr->SetConditions( PCB_ACTIONS::trackDisplayMode, CHECK( !cond.TrackFillDisplay() ) ); mgr->SetConditions( PCB_ACTIONS::graphicsOutlines, CHECK( !cond.GraphicsFillDisplay() ) ); - mgr->SetConditions( PCB_ACTIONS::textOutlines, CHECK( !cond.TextFillDisplay() ) ); + mgr->SetConditions( PCB_ACTIONS::textOutlines, CHECK( !cond.TextFillDisplay() ) ); if( SCRIPTING::IsWxAvailable() ) mgr->SetConditions( PCB_ACTIONS::showPythonConsole, CHECK( cond.ScriptingConsoleVisible() ) ); @@ -945,23 +945,24 @@ void PCB_EDIT_FRAME::setupUIConditions() mgr->SetConditions( PCB_ACTIONS::highlightNet, ENABLE( SELECTION_CONDITIONS::ShowAlways ) ); mgr->SetConditions( PCB_ACTIONS::highlightNetSelection, ENABLE( SELECTION_CONDITIONS::ShowAlways ) ); - mgr->SetConditions( PCB_ACTIONS::selectNet, - ENABLE( SELECTION_CONDITIONS::OnlyTypes( { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T } ) ) ); - mgr->SetConditions( PCB_ACTIONS::deselectNet, - ENABLE( SELECTION_CONDITIONS::OnlyTypes( { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T } ) ) ); - mgr->SetConditions( PCB_ACTIONS::selectUnconnected, - ENABLE( SELECTION_CONDITIONS::OnlyTypes( { PCB_FOOTPRINT_T, PCB_PAD_T, PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T } ) ) ); - mgr->SetConditions( PCB_ACTIONS::selectSameSheet, - ENABLE( SELECTION_CONDITIONS::OnlyTypes( { PCB_FOOTPRINT_T } ) ) ); - mgr->SetConditions( PCB_ACTIONS::selectOnSchematic, - ENABLE( SELECTION_CONDITIONS::HasTypes( { PCB_PAD_T, PCB_FOOTPRINT_T, PCB_GROUP_T } ) ) ); + static const std::vector trackTypes = { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T }; + static const std::vector padOwnerTypes = { PCB_FOOTPRINT_T, PCB_PAD_T }; + static const std::vector footprintTypes = { PCB_FOOTPRINT_T }; + static const std::vector crossProbeTypes = { PCB_PAD_T, PCB_FOOTPRINT_T, PCB_GROUP_T }; + static const std::vector zoneTypes = { PCB_ZONE_T }; + + mgr->SetConditions( PCB_ACTIONS::selectNet, ENABLE( SELECTION_CONDITIONS::OnlyTypes( trackTypes ) ) ); + mgr->SetConditions( PCB_ACTIONS::deselectNet, ENABLE( SELECTION_CONDITIONS::OnlyTypes( trackTypes ) ) ); + mgr->SetConditions( PCB_ACTIONS::selectUnconnected, ENABLE( SELECTION_CONDITIONS::OnlyTypes( padOwnerTypes ) ) ); + mgr->SetConditions( PCB_ACTIONS::selectSameSheet, ENABLE( SELECTION_CONDITIONS::OnlyTypes( footprintTypes ) ) ); + mgr->SetConditions( PCB_ACTIONS::selectOnSchematic, ENABLE( SELECTION_CONDITIONS::HasTypes( crossProbeTypes ) ) ); SELECTION_CONDITION singleZoneCond = SELECTION_CONDITIONS::Count( 1 ) - && SELECTION_CONDITIONS::OnlyTypes( { PCB_ZONE_T } ); + && SELECTION_CONDITIONS::OnlyTypes( zoneTypes ); SELECTION_CONDITION zoneMergeCond = SELECTION_CONDITIONS::MoreThan( 1 ) - && SELECTION_CONDITIONS::OnlyTypes( { PCB_ZONE_T } ); + && SELECTION_CONDITIONS::OnlyTypes( zoneTypes ); mgr->SetConditions( PCB_ACTIONS::zoneDuplicate, ENABLE( singleZoneCond ) ); mgr->SetConditions( PCB_ACTIONS::drawZoneCutout, ENABLE( singleZoneCond ) ); @@ -978,7 +979,6 @@ void PCB_EDIT_FRAME::setupUIConditions() CURRENT_TOOL( ACTIONS::selectionTool ); CURRENT_TOOL( PCB_ACTIONS::localRatsnestTool ); - auto isDRCIdle = [this] ( const SELECTION& ) { @@ -1028,6 +1028,7 @@ void PCB_EDIT_FRAME::setupUIConditions() #undef CURRENT_EDIT_TOOL #undef ENABLE #undef CHECK +// clang-format on } diff --git a/pcbnew/router/router_tool.cpp b/pcbnew/router/router_tool.cpp index 1b966eaf69..c14600f1b6 100644 --- a/pcbnew/router/router_tool.cpp +++ b/pcbnew/router/router_tool.cpp @@ -2104,7 +2104,7 @@ bool ROUTER_TOOL::CanInlineDrag( int aDragMode ) if( item->IsType( GENERAL_COLLECTOR::DraggableItems ) ) { // Footprints cannot be dragged freely. - if( item->IsType( { PCB_FOOTPRINT_T } ) ) + if( item->Type() == PCB_FOOTPRINT_T ) return !( aDragMode & PNS::DM_FREE_ANGLE ); else return true; diff --git a/pcbnew/tools/convert_tool.cpp b/pcbnew/tools/convert_tool.cpp index 693968965a..cebe8cfba9 100644 --- a/pcbnew/tools/convert_tool.cpp +++ b/pcbnew/tools/convert_tool.cpp @@ -259,43 +259,52 @@ bool CONVERT_TOOL::Init() m_menu->SetIcon( BITMAPS::convert ); m_menu->SetTitle( _( "Create from Selection" ) ); - auto shapes = S_C::OnlyTypes( { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_RECT_T, - PCB_SHAPE_LOCATE_CIRCLE_T, PCB_SHAPE_LOCATE_ARC_T, - PCB_SHAPE_LOCATE_BEZIER_T, - PCB_FIELD_T, PCB_TEXT_T } ) - && P_S_C::SameLayer(); + static const std::vector padTypes = { PCB_PAD_T }; + static const std::vector segmentTypes = { PCB_TRACE_T, + PCB_SHAPE_LOCATE_SEGMENT_T }; + static const std::vector shapeTypes = { PCB_SHAPE_LOCATE_SEGMENT_T, + PCB_SHAPE_LOCATE_RECT_T, + PCB_SHAPE_LOCATE_CIRCLE_T, + PCB_SHAPE_LOCATE_ARC_T, + PCB_SHAPE_LOCATE_BEZIER_T, + PCB_FIELD_T, + PCB_TEXT_T }; + static const std::vector trackTypes = { PCB_TRACE_T, + PCB_ARC_T, + PCB_VIA_T }; + static const std::vector toTrackTypes = { PCB_SHAPE_LOCATE_SEGMENT_T, + PCB_SHAPE_LOCATE_ARC_T }; + static const std::vector polyTypes = { PCB_ZONE_T, + PCB_SHAPE_LOCATE_POLY_T, + PCB_SHAPE_LOCATE_RECT_T }; - auto graphicToTrack = S_C::OnlyTypes( { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_ARC_T } ); + auto shapes = S_C::OnlyTypes( shapeTypes ) && P_S_C::SameLayer(); + auto graphicToTrack = S_C::OnlyTypes( toTrackTypes ); + auto anyTracks = S_C::MoreThan( 0 ) && S_C::OnlyTypes( trackTypes ) && P_S_C::SameLayer(); + auto anyPolys = S_C::OnlyTypes( polyTypes ); + auto anyPads = S_C::OnlyTypes( padTypes ); - auto anyTracks = S_C::MoreThan( 0 ) && S_C::OnlyTypes( { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T } ) - && P_S_C::SameLayer(); - - auto anyPolys = S_C::OnlyTypes( { PCB_ZONE_T, PCB_SHAPE_LOCATE_POLY_T, PCB_SHAPE_LOCATE_RECT_T } ); - - auto anyPads = S_C::OnlyTypes( { PCB_PAD_T } ); - - auto canCreateArcs = S_C::Count( 1 ) - && S_C::OnlyTypes( { PCB_TRACE_T, PCB_SHAPE_LOCATE_SEGMENT_T } ); - auto canCreateArray = S_C::MoreThan( 0 ); - auto canCreatePolyType = shapes || anyPolys || anyTracks; + auto canCreateArcs = S_C::Count( 1 ) && S_C::OnlyTypes( segmentTypes ); + auto canCreateArray = S_C::MoreThan( 0 ); + auto canCreatePoly = shapes || anyPolys || anyTracks; if( m_frame->IsType( FRAME_FOOTPRINT_EDITOR ) ) - canCreatePolyType = shapes || anyPolys || anyTracks || anyPads; + canCreatePoly = shapes || anyPolys || anyTracks || anyPads; auto canCreateLines = anyPolys; auto canCreateTracks = anyPolys || graphicToTrack; - auto canCreate = canCreatePolyType + auto canCreate = canCreatePoly || canCreateLines || canCreateTracks || canCreateArcs || canCreateArray; - m_menu->AddItem( PCB_ACTIONS::convertToPoly, canCreatePolyType ); + m_menu->AddItem( PCB_ACTIONS::convertToPoly, canCreatePoly ); if( m_frame->IsType( FRAME_PCB_EDITOR ) ) - m_menu->AddItem( PCB_ACTIONS::convertToZone, canCreatePolyType ); + m_menu->AddItem( PCB_ACTIONS::convertToZone, canCreatePoly ); - m_menu->AddItem( PCB_ACTIONS::convertToKeepout, canCreatePolyType ); + m_menu->AddItem( PCB_ACTIONS::convertToKeepout, canCreatePoly ); m_menu->AddItem( PCB_ACTIONS::convertToLines, canCreateLines ); m_menu->AppendSeparator(); diff --git a/pcbnew/tools/edit_tool.cpp b/pcbnew/tools/edit_tool.cpp index 5f4917389e..25072fba13 100644 --- a/pcbnew/tools/edit_tool.cpp +++ b/pcbnew/tools/edit_tool.cpp @@ -73,6 +73,34 @@ using namespace std::placeholders; const unsigned int EDIT_TOOL::COORDS_PADDING = pcbIUScale.mmToIU( 20 ); +static const std::vector padTypes = { PCB_PAD_T }; + +static const std::vector footprintTypes = { PCB_FOOTPRINT_T }; + +static const std::vector groupTypes = { PCB_GROUP_T }; + +static const std::vector trackTypes = { PCB_TRACE_T, + PCB_ARC_T, + PCB_VIA_T }; + +static const std::vector baseConnectedTypes = { PCB_PAD_T, + PCB_VIA_T, + PCB_TRACE_T, + PCB_ARC_T }; + +static const std::vector connectedTypes = { PCB_TRACE_T, + PCB_ARC_T, + PCB_VIA_T, + PCB_PAD_T, + PCB_ZONE_T }; + +static const std::vector unroutableTypes = { PCB_TRACE_T, + PCB_ARC_T, + PCB_VIA_T, + PCB_PAD_T, + PCB_FOOTPRINT_T }; + + EDIT_TOOL::EDIT_TOOL() : PCB_TOOL_BASE( "pcbnew.InteractiveEdit" ), m_selectionTool( nullptr ), @@ -239,18 +267,18 @@ bool EDIT_TOOL::Init() [ this ]( const SELECTION& aSelection ) { if( !m_isFootprintEditor - && SELECTION_CONDITIONS::OnlyTypes( { PCB_PAD_T } )( aSelection ) ) + && SELECTION_CONDITIONS::OnlyTypes( padTypes )( aSelection ) ) { return false; } - if( SELECTION_CONDITIONS::HasTypes( { PCB_GROUP_T } )( aSelection ) ) + if( SELECTION_CONDITIONS::HasTypes( groupTypes )( aSelection ) ) return true; return SELECTION_CONDITIONS::HasTypes( EDIT_TOOL::MirrorableItems )( aSelection ); }; - auto singleFootprintCondition = SELECTION_CONDITIONS::OnlyTypes( { PCB_FOOTPRINT_T } ) + auto singleFootprintCondition = SELECTION_CONDITIONS::OnlyTypes( footprintTypes ) && SELECTION_CONDITIONS::Count( 1 ); auto multipleFootprintsCondition = @@ -296,22 +324,6 @@ bool EDIT_TOOL::Init() return frame()->IsCurrentTool( PCB_ACTIONS::moveIndividually ); }; - static std::vector connectedTypes = { PCB_TRACE_T, - PCB_ARC_T, - PCB_VIA_T, - PCB_PAD_T, - PCB_ZONE_T }; - - static std::vector unroutableTypes = { PCB_TRACE_T, - PCB_ARC_T, - PCB_VIA_T, - PCB_PAD_T, - PCB_FOOTPRINT_T }; - - static std::vector trackTypes = { PCB_TRACE_T, - PCB_ARC_T, - PCB_VIA_T }; - // Add context menu entries that are displayed when selection tool is active CONDITIONAL_MENU& menu = m_selectionTool->GetToolMenu().GetMenu(); @@ -331,7 +343,7 @@ bool EDIT_TOOL::Init() && SELECTION_CONDITIONS::OnlyTypes( GENERAL_COLLECTOR::DraggableItems ) ); menu.AddItem( PCB_ACTIONS::dragFreeAngle, SELECTION_CONDITIONS::Count( 1 ) && SELECTION_CONDITIONS::OnlyTypes( GENERAL_COLLECTOR::DraggableItems ) - && !SELECTION_CONDITIONS::OnlyTypes( { PCB_FOOTPRINT_T } ) ); + && !SELECTION_CONDITIONS::OnlyTypes( footprintTypes ) ); menu.AddItem( PCB_ACTIONS::filletTracks, SELECTION_CONDITIONS::OnlyTypes( trackTypes ) ); menu.AddItem( PCB_ACTIONS::rotateCcw, SELECTION_CONDITIONS::NotEmpty ); menu.AddItem( PCB_ACTIONS::rotateCw, SELECTION_CONDITIONS::NotEmpty ); @@ -613,8 +625,7 @@ int EDIT_TOOL::DragArcTrack( const TOOL_EVENT& aEvent ) for( int i = 0; i < 3; i++ ) { itemsOnAnchor = conn->GetConnectedItemsAtAnchor( theArc, aAnchor, - { PCB_PAD_T, PCB_VIA_T, - PCB_TRACE_T, PCB_ARC_T }, + baseConnectedTypes, allowedDeviation ); allowedDeviation /= 2; @@ -1029,9 +1040,7 @@ int EDIT_TOOL::FilletTracks( const TOOL_EVENT& aEvent ) VECTOR2I anchor = aStartPoint ? aTrack->GetStart() : aTrack->GetEnd(); std::vector itemsOnAnchor; - itemsOnAnchor = c->GetConnectedItemsAtAnchor( aTrack, anchor, - { PCB_PAD_T, PCB_VIA_T, - PCB_TRACE_T, PCB_ARC_T } ); + itemsOnAnchor = c->GetConnectedItemsAtAnchor( aTrack, anchor, baseConnectedTypes ); if( itemsOnAnchor.size() > 0 && selection.Contains( itemsOnAnchor.at( 0 ) ) diff --git a/pcbnew/tools/pad_tool.cpp b/pcbnew/tools/pad_tool.cpp index 9e8a29bf83..7ff1c096b2 100644 --- a/pcbnew/tools/pad_tool.cpp +++ b/pcbnew/tools/pad_tool.cpp @@ -84,6 +84,8 @@ void PAD_TOOL::Reset( RESET_REASON aReason ) bool PAD_TOOL::Init() { + static const std::vector padTypes = { PCB_PAD_T }; + PCB_SELECTION_TOOL* selTool = m_toolMgr->GetTool(); if( selTool ) @@ -93,7 +95,7 @@ bool PAD_TOOL::Init() SELECTION_CONDITION padSel = SELECTION_CONDITIONS::HasType( PCB_PAD_T ); SELECTION_CONDITION singlePadSel = SELECTION_CONDITIONS::Count( 1 ) && - SELECTION_CONDITIONS::OnlyTypes( { PCB_PAD_T } ); + SELECTION_CONDITIONS::OnlyTypes( padTypes ); auto explodeCondition = [&]( const SELECTION& aSel ) diff --git a/pcbnew/tools/pcb_selection_tool.cpp b/pcbnew/tools/pcb_selection_tool.cpp index 5775d357ee..df6917ac08 100644 --- a/pcbnew/tools/pcb_selection_tool.cpp +++ b/pcbnew/tools/pcb_selection_tool.cpp @@ -172,6 +172,8 @@ bool PCB_SELECTION_TOOL::Init() selectMenu->SetTool( this ); m_menu.RegisterSubMenu( selectMenu ); + static const std::vector tableCellTypes = { PCB_TABLECELL_T }; + auto& menu = m_menu.GetMenu(); auto activeToolCondition = @@ -198,7 +200,7 @@ bool PCB_SELECTION_TOOL::Init() }; auto tableCellSelection = SELECTION_CONDITIONS::MoreThan( 0 ) - && SELECTION_CONDITIONS::OnlyTypes( { PCB_TABLECELL_T } ); + && SELECTION_CONDITIONS::OnlyTypes( tableCellTypes ); if( frame && frame->IsType( FRAME_PCB_EDITOR ) ) { diff --git a/pcbnew/tracks_cleaner.cpp b/pcbnew/tracks_cleaner.cpp index 2fcfa1040c..c1d4306e41 100644 --- a/pcbnew/tracks_cleaner.cpp +++ b/pcbnew/tracks_cleaner.cpp @@ -560,14 +560,16 @@ void TRACKS_CLEANER::cleanup( bool aDeleteDuplicateVias, bool aDeleteNullSegment const std::vector& TRACKS_CLEANER::getConnectedItems( PCB_TRACK* aTrack ) { + static const std::vector connectedTypes = { PCB_TRACE_T, + PCB_ARC_T, + PCB_VIA_T, + PCB_PAD_T, + PCB_ZONE_T }; + const std::shared_ptr& connectivity = m_brd->GetConnectivity(); if( m_connectedItemsCache.count( aTrack ) == 0 ) - { - m_connectedItemsCache[ aTrack ] = - connectivity->GetConnectedItems( aTrack, { PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T, - PCB_PAD_T, PCB_ZONE_T } ); - } + m_connectedItemsCache[ aTrack ] = connectivity->GetConnectedItems( aTrack, connectedTypes ); return m_connectedItemsCache[ aTrack ]; }