Consolidate on a more widely used sub-type architecture.

This commit is contained in:
Jeff Young 2022-08-23 11:57:07 +01:00
parent 2ddbfd7c57
commit 1871812f2b
6 changed files with 43 additions and 92 deletions

View File

@ -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:

View File

@ -52,16 +52,10 @@ public:
bool IsType( const std::vector<KICAD_T>& 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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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 <maciej.suminski@cern.ch>
*
* 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 <board_connected_item.h>
#include <pcb_shape.h>
#include <functional>
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<SHAPE_T> 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<const BOARD_CONNECTED_ITEM*>( aitem );
const BOARD_CONNECTED_ITEM* item = dynamic_cast<const BOARD_CONNECTED_ITEM*>( 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<BOARD_ITEM*>( i );
const BOARD_ITEM* item = static_cast<const BOARD_ITEM*>( 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<SHAPE_T> 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<const PCB_SHAPE*>( item )->GetShape();
if( !aTypes.count( shape ) )
return false;
}
return true;
}

View File

@ -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 <maciej.suminski@cern.ch>
*
@ -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<SHAPE_T> 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<SHAPE_T> aTypes );
};
#endif /* PCB_SELECTION_CONDITIONS_H_ */