diff --git a/include/core/typeinfo.h b/include/core/typeinfo.h index 12a98e611c..bb0a8bcda0 100644 --- a/include/core/typeinfo.h +++ b/include/core/typeinfo.h @@ -114,6 +114,9 @@ enum KICAD_T PCB_NETINFO_T, ///< class NETINFO_ITEM, a description of a net PCB_GROUP_T, ///< class PCB_GROUP, a set of BOARD_ITEMs + // Be prudent with these types: + // they should be used only to locate specific item sub-types + // N.B. If you add a type here, be sure to add it below to the BaseType() PCB_LOCATE_STDVIA_T, PCB_LOCATE_UVIA_T, PCB_LOCATE_BBVIA_T, @@ -124,6 +127,13 @@ enum KICAD_T PCB_LOCATE_NPTH_T, PCB_LOCATE_BOARD_EDGE_T, + // Same for locating shapes types from PCB_SHAPE_T and PCB_FP_SHAPE_T items + PCB_SHAPE_LOCATE_SEGMENT_T, + PCB_SHAPE_LOCATE_RECT_T, + PCB_SHAPE_LOCATE_CIRCLE_T, + PCB_SHAPE_LOCATE_ARC_T, + PCB_SHAPE_LOCATE_POLY_T, + // Schematic draw Items. The order of these items effects the sort order. // It is currently ordered to mimic the old Eeschema locate behavior where // the smallest item is the selected item. @@ -268,6 +278,13 @@ constexpr KICAD_T BaseType( const KICAD_T aType ) case PCB_LOCATE_NPTH_T: return PCB_LOCATE_HOLE_T; + case PCB_SHAPE_LOCATE_SEGMENT_T: + case PCB_SHAPE_LOCATE_RECT_T: + case PCB_SHAPE_LOCATE_CIRCLE_T: + case PCB_SHAPE_LOCATE_ARC_T: + case PCB_SHAPE_LOCATE_POLY_T: + return PCB_SHAPE_T; + case PCB_DIM_ALIGNED_T: case PCB_DIM_CENTER_T: case PCB_DIM_RADIAL_T: diff --git a/pcbnew/fp_shape.h b/pcbnew/fp_shape.h index 17b3a7d1c2..92f5209351 100644 --- a/pcbnew/fp_shape.h +++ b/pcbnew/fp_shape.h @@ -52,16 +52,10 @@ public: bool IsType( const std::vector& aScanTypes ) const override { - if( BOARD_ITEM::IsType( aScanTypes ) ) + if( PCB_SHAPE::IsType( aScanTypes ) ) return true; - for( KICAD_T scanType : aScanTypes ) - { - if( scanType == PCB_LOCATE_GRAPHIC_T ) - return true; - else if( scanType == PCB_LOCATE_BOARD_EDGE_T ) - return m_layer == Edge_Cuts; - } + // No special processing above and beyond PCB_SHAPE at present.... return false; } diff --git a/pcbnew/pcb_shape.h b/pcbnew/pcb_shape.h index e58882ace1..3c72266aa4 100644 --- a/pcbnew/pcb_shape.h +++ b/pcbnew/pcb_shape.h @@ -68,6 +68,16 @@ public: return true; else if( scanType == PCB_LOCATE_BOARD_EDGE_T ) return m_layer == Edge_Cuts; + else if( scanType == PCB_SHAPE_LOCATE_ARC_T ) + return m_shape == SHAPE_T::ARC; + else if( scanType == PCB_SHAPE_LOCATE_CIRCLE_T ) + return m_shape == SHAPE_T::CIRCLE; + else if( scanType == PCB_SHAPE_LOCATE_RECT_T ) + return m_shape == SHAPE_T::RECT; + else if( scanType == PCB_SHAPE_LOCATE_SEGMENT_T ) + return m_shape == SHAPE_T::SEGMENT; + else if( scanType == PCB_SHAPE_LOCATE_POLY_T ) + return m_shape == SHAPE_T::POLY; } return false; diff --git a/pcbnew/tools/convert_tool.cpp b/pcbnew/tools/convert_tool.cpp index 63fef2cdb4..a369649f6e 100644 --- a/pcbnew/tools/convert_tool.cpp +++ b/pcbnew/tools/convert_tool.cpp @@ -150,22 +150,20 @@ bool CONVERT_TOOL::Init() m_menu->SetIcon( BITMAPS::convert ); m_menu->SetTitle( _( "Create from Selection" ) ); - auto graphicLines = P_S_C::OnlyGraphicShapeTypes( { SHAPE_T::SEGMENT, SHAPE_T::RECT, - SHAPE_T::CIRCLE, SHAPE_T::ARC } ) + auto graphicLines = S_C::OnlyTypes( { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_RECT_T, + PCB_SHAPE_LOCATE_CIRCLE_T, PCB_SHAPE_LOCATE_ARC_T } ) && P_S_C::SameLayer(); - auto graphicToTrack = P_S_C::OnlyGraphicShapeTypes( { SHAPE_T::SEGMENT, SHAPE_T::ARC } ); + auto graphicToTrack = S_C::OnlyTypes( { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_ARC_T } ); auto trackLines = S_C::MoreThan( 1 ) && S_C::OnlyTypes( { PCB_TRACE_T, PCB_ARC_T } ) && P_S_C::SameLayer(); auto anyLines = graphicLines || trackLines; - auto anyPolys = S_C::OnlyTypes( { PCB_ZONE_T, PCB_FP_ZONE_T } ) - || P_S_C::OnlyGraphicShapeTypes( { SHAPE_T::POLY, SHAPE_T::RECT } ); + auto anyPolys = S_C::OnlyTypes( { PCB_ZONE_T, PCB_FP_ZONE_T, + PCB_SHAPE_LOCATE_POLY_T, PCB_SHAPE_LOCATE_RECT_T } ); - auto lineToArc = S_C::Count( 1 ) - && ( P_S_C::OnlyGraphicShapeTypes( { SHAPE_T::SEGMENT } ) - || S_C::OnlyTypes( { PCB_TRACE_T } ) ); + auto lineToArc = S_C::Count( 1 ) && S_C::OnlyTypes( { PCB_TRACE_T, PCB_SHAPE_LOCATE_SEGMENT_T } ); auto showConvert = anyPolys || anyLines || lineToArc; auto canCreatePolyType = anyLines || anyPolys; diff --git a/pcbnew/tools/pcb_selection_conditions.cpp b/pcbnew/tools/pcb_selection_conditions.cpp index 97b9acead1..2d1da13f1a 100644 --- a/pcbnew/tools/pcb_selection_conditions.cpp +++ b/pcbnew/tools/pcb_selection_conditions.cpp @@ -2,6 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2014 CERN + * Copyright (C) 2017-2022 KiCad Developers, see AUTHORS.txt for contributors. * @author Maciej Suminski * * This program is free software; you can redistribute it and/or @@ -25,50 +26,23 @@ #include "pcb_selection_conditions.h" #include "pcb_selection_tool.h" #include -#include #include using namespace std::placeholders; -using S_C = SELECTION_CONDITION; - -bool PCB_SELECTION_CONDITIONS::OnlyConnectedItems( const SELECTION& aSelection ) -{ - if( aSelection.Empty() ) - return false; - - for( const auto &item : aSelection ) - { - auto type = item->Type(); - - if( type != PCB_PAD_T && type != PCB_VIA_T && type != PCB_TRACE_T && type != PCB_ZONE_T ) - return false; - } - - return true; -} - - -S_C PCB_SELECTION_CONDITIONS::SameNet( bool aAllowUnconnected ) +SELECTION_CONDITION PCB_SELECTION_CONDITIONS::SameNet( bool aAllowUnconnected ) { return std::bind( &PCB_SELECTION_CONDITIONS::sameNetFunc, _1, aAllowUnconnected ); } -S_C PCB_SELECTION_CONDITIONS::SameLayer() +SELECTION_CONDITION PCB_SELECTION_CONDITIONS::SameLayer() { return std::bind( &PCB_SELECTION_CONDITIONS::sameLayerFunc, _1 ); } -S_C PCB_SELECTION_CONDITIONS::OnlyGraphicShapeTypes( const std::set aTypes ) -{ - return std::bind( &PCB_SELECTION_CONDITIONS::onlyGraphicShapeTypesFunc, _1, aTypes ); -} - - - bool PCB_SELECTION_CONDITIONS::sameNetFunc( const SELECTION& aSelection, bool aAllowUnconnected ) { if( aSelection.Empty() ) @@ -76,12 +50,11 @@ bool PCB_SELECTION_CONDITIONS::sameNetFunc( const SELECTION& aSelection, bool aA int netcode = -1; // -1 stands for 'net code is not yet determined' - for( const auto& aitem : aSelection ) + for( const EDA_ITEM* aitem : aSelection ) { int current_netcode = -1; - const BOARD_CONNECTED_ITEM* item = - dynamic_cast( aitem ); + const BOARD_CONNECTED_ITEM* item = dynamic_cast( aitem ); if( item ) { @@ -123,9 +96,9 @@ bool PCB_SELECTION_CONDITIONS::sameLayerFunc( const SELECTION& aSelection ) LSET layerSet; layerSet.set(); - for( const auto& i : aSelection ) + for( const EDA_ITEM* i : aSelection ) { - auto item = static_cast( i ); + const BOARD_ITEM* item = static_cast( i ); layerSet &= item->GetLayerSet(); if( !layerSet.any() ) // there are no common layers left @@ -136,22 +109,3 @@ bool PCB_SELECTION_CONDITIONS::sameLayerFunc( const SELECTION& aSelection ) } -bool PCB_SELECTION_CONDITIONS::onlyGraphicShapeTypesFunc( const SELECTION& aSelection, - const std::set aTypes ) -{ - if( aSelection.Empty() ) - return false; - - for( const EDA_ITEM* item : aSelection ) - { - if( item->Type() != PCB_SHAPE_T && item->Type() != PCB_FP_SHAPE_T ) - return false; - - SHAPE_T shape = static_cast( item )->GetShape(); - - if( !aTypes.count( shape ) ) - return false; - } - - return true; -} diff --git a/pcbnew/tools/pcb_selection_conditions.h b/pcbnew/tools/pcb_selection_conditions.h index 9dd5e8f493..d7389c368c 100644 --- a/pcbnew/tools/pcb_selection_conditions.h +++ b/pcbnew/tools/pcb_selection_conditions.h @@ -2,7 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2014 CERN - * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2017-2022 KiCad Developers, see AUTHORS.txt for contributors. * * @author Maciej Suminski * @@ -35,14 +35,6 @@ class PCB_SELECTION_CONDITIONS : public SELECTION_CONDITIONS { public: - /** - * Test if selection contains exclusively connected items (pads, tracks, vias, zones). - * - * @param aSelection is the selection to be tested. - * @return True if there are only connected items connected. - */ - static bool OnlyConnectedItems( const SELECTION& aSelection ); - /** * Create a functor that tests if selection contains items belonging to the same net or are * unconnected if aAllowUnconnected == true. @@ -64,17 +56,6 @@ public: */ static SELECTION_CONDITION SameLayer(); - /** - * Create a functor that tests if the selection contains PCB_SHAPE* items of certain shapes. - * - * This implicitly includes an OnlyType( PCB_SHAPE_T ) as part of the test. - * - * @param aTypes is a list of allowed PCB_SHAPE shapes (@see SHAPE_T) - * @return functor testing if selected items match the given list of allowed shapes - */ - static SELECTION_CONDITION OnlyGraphicShapeTypes( const std::set aTypes ); - - private: ///< Helper function used by SameNet() static bool sameNetFunc( const SELECTION& aSelection, bool aAllowUnconnected ); @@ -82,9 +63,6 @@ private: ///< Helper function used by SameLayer() static bool sameLayerFunc( const SELECTION& aSelection ); - ///< Helper function used by OnlyGraphicShapeTypes() - static bool onlyGraphicShapeTypesFunc( const SELECTION& aSelection, - const std::set aTypes ); }; #endif /* PCB_SELECTION_CONDITIONS_H_ */