KiCad PCB EDA Suite
pcbnew/tools/selection_tool.cpp File Reference
#include <limits>
#include <functional>
#include <class_board.h>
#include <class_board_item.h>
#include <class_track.h>
#include <class_module.h>
#include <class_pcb_text.h>
#include <class_drawsegment.h>
#include <class_zone.h>
#include <pcb_edit_frame.h>
#include <collectors.h>
#include <confirm.h>
#include <dialog_find.h>
#include <dialog_block_options.h>
#include <class_draw_panel_gal.h>
#include <view/view_controls.h>
#include <view/view_group.h>
#include <preview_items/selection_area.h>
#include <painter.h>
#include <bitmaps.h>
#include <hotkeys.h>
#include <tool/tool_event.h>
#include <tool/tool_manager.h>
#include <router/router_tool.h>
#include <connectivity/connectivity_data.h>
#include <footprint_viewer_frame.h>
#include "tool_event_utils.h"
#include "selection_tool.h"
#include "pcb_bright_box.h"
#include "pcb_actions.h"
#include "kicad_plugin.h"

Go to the source code of this file.

Classes

class  SELECT_MENU
 
class  SELECTION_TOOL::PRIV
 Private implementation of firewalled private data. More...
 

Functions

static EDA_RECT getRect (const BOARD_ITEM *aItem)
 
void connectedTrackFilter (const VECTOR2I &aPt, GENERAL_COLLECTOR &aCollector)
 
void connectedItemFilter (const VECTOR2I &, GENERAL_COLLECTOR &aCollector)
 
static bool itemIsIncludedByFilter (const BOARD_ITEM &aItem, const BOARD &aBoard, const DIALOG_BLOCK_OPTIONS::OPTIONS &aBlockOpts)
 Function itemIsIncludedByFilter() More...
 
static double calcArea (const BOARD_ITEM *aItem)
 
static double calcMaxArea (GENERAL_COLLECTOR &aCollector, KICAD_T aType)
 
static double calcCommonArea (const BOARD_ITEM *aItem, const BOARD_ITEM *aOther)
 
double calcRatio (double a, double b)
 

Function Documentation

◆ calcArea()

static double calcArea ( const BOARD_ITEM aItem)
static

Definition at line 1932 of file pcbnew/tools/selection_tool.cpp.

References EDA_RECT::GetArea(), TRACK::GetLength(), getRect(), TRACK::GetWidth(), PCB_TRACE_T, and EDA_ITEM::Type().

Referenced by calcMaxArea(), and SELECTION_TOOL::guessSelectionCandidates().

1933 {
1934  if( aItem->Type() == PCB_TRACE_T )
1935  {
1936  const TRACK* t = static_cast<const TRACK*>( aItem );
1937  return ( t->GetWidth() + t->GetLength() ) * t->GetWidth();
1938  }
1939 
1940  return getRect( aItem ).GetArea();
1941 }
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:95
double GetLength() const
Function GetLength returns the length of the track using the hypotenuse calculation.
Definition: class_track.h:179
double GetArea() const
Function GetArea returns the area of the rectangle.
int GetWidth() const
Definition: class_track.h:120
static EDA_RECT getRect(const BOARD_ITEM *aItem)
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201

◆ calcCommonArea()

static double calcCommonArea ( const BOARD_ITEM aItem,
const BOARD_ITEM aOther 
)
inlinestatic

Definition at line 1977 of file pcbnew/tools/selection_tool.cpp.

References EDA_RECT::Common(), EDA_RECT::GetArea(), and getRect().

Referenced by SELECTION_TOOL::guessSelectionCandidates().

1978 {
1979  if( !aItem || !aOther )
1980  return 0;
1981 
1982  return getRect( aItem ).Common( getRect( aOther ) ).GetArea();
1983 }
EDA_RECT Common(const EDA_RECT &aRect) const
Function Common returns the area that is common with another rectangle.
double GetArea() const
Function GetArea returns the area of the rectangle.
static EDA_RECT getRect(const BOARD_ITEM *aItem)

◆ calcMaxArea()

static double calcMaxArea ( GENERAL_COLLECTOR aCollector,
KICAD_T  aType 
)
static

Definition at line 1962 of file pcbnew/tools/selection_tool.cpp.

References calcArea(), COLLECTOR::GetCount(), i, max, and EDA_ITEM::Type().

Referenced by SELECTION_TOOL::guessSelectionCandidates().

1963 {
1964  double best = 0.0;
1965 
1966  for( int i = 0; i < aCollector.GetCount(); i++ )
1967  {
1968  BOARD_ITEM* item = aCollector[i];
1969  if( item->Type() == aType )
1970  best = std::max( best, calcArea( item ) );
1971  }
1972 
1973  return best;
1974 }
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:114
#define max(a, b)
Definition: auxiliary.h:86
size_t i
Definition: json11.cpp:597
static double calcArea(const BOARD_ITEM *aItem)
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201

◆ calcRatio()

double calcRatio ( double  a,
double  b 
)

Definition at line 1986 of file pcbnew/tools/selection_tool.cpp.

References max.

Referenced by SELECTION_TOOL::guessSelectionCandidates().

1987 {
1988  if( a == 0.0 && b == 0.0 )
1989  return 1.0;
1990 
1991  if( b == 0.0 )
1993 
1994  return a / b;
1995 }
#define max(a, b)
Definition: auxiliary.h:86

◆ connectedItemFilter()

void connectedItemFilter ( const VECTOR2I ,
GENERAL_COLLECTOR aCollector 
)

Definition at line 945 of file pcbnew/tools/selection_tool.cpp.

References COLLECTOR::GetCount(), BOARD_CONNECTED_ITEM::GetNetCode(), i, and COLLECTOR::Remove().

Referenced by SELECTION_TOOL::selectCopper().

946 {
947  /* Narrow the collection down to a single BOARD_CONNECTED_ITEM for each
948  * represented net. All other items types are removed.
949  */
950  std::set<int> representedNets;
951 
952  for( int i = aCollector.GetCount() - 1; i >= 0; i-- )
953  {
954  BOARD_CONNECTED_ITEM* item = dynamic_cast<BOARD_CONNECTED_ITEM*>( aCollector[i] );
955  if( !item )
956  aCollector.Remove( i );
957  else if ( representedNets.count( item->GetNetCode() ) )
958  aCollector.Remove( i );
959  else
960  representedNets.insert( item->GetNetCode() );
961  }
962 }
int GetNetCode() const
Function GetNetCode.
Class BOARD_CONNECTED_ITEM is a base class derived from BOARD_ITEM for items that can be connected an...
void Remove(int aIndex)
Function Remove removes the item at aIndex (first position is 0);.
Definition: collector.h:143
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:114
size_t i
Definition: json11.cpp:597

◆ connectedTrackFilter()

void connectedTrackFilter ( const VECTOR2I aPt,
GENERAL_COLLECTOR aCollector 
)

Definition at line 891 of file pcbnew/tools/selection_tool.cpp.

References COLLECTOR::GetCount(), i, ROUTER_TOOL::NeighboringSegmentFilter(), and COLLECTOR::Remove().

Referenced by SELECTION_TOOL::selectConnection().

892 {
893  /* Narrow the collection down to a single TRACK item for a trivial
894  * connection, or multiple TRACK items for non-trivial connections.
895  */
896  for( int i = aCollector.GetCount() - 1; i >= 0; i-- )
897  {
898  if( !dynamic_cast<TRACK*>( aCollector[i] ) )
899  aCollector.Remove( i );
900  }
901 
902  ROUTER_TOOL::NeighboringSegmentFilter( aPt, aCollector );
903 }
void Remove(int aIndex)
Function Remove removes the item at aIndex (first position is 0);.
Definition: collector.h:143
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:114
size_t i
Definition: json11.cpp:597
static void NeighboringSegmentFilter(const VECTOR2I &aPt, GENERAL_COLLECTOR &aCollector)

◆ getRect()

static EDA_RECT getRect ( const BOARD_ITEM aItem)
static

Definition at line 389 of file pcbnew/tools/selection_tool.cpp.

References EDA_ITEM::GetBoundingBox(), PCB_MODULE_T, and EDA_ITEM::Type().

Referenced by calcArea(), calcCommonArea(), and SELECTION_TOOL::selectMultiple().

390 {
391  if( aItem->Type() == PCB_MODULE_T )
392  return static_cast<const MODULE*>( aItem )->GetFootprintRect();
393 
394  return aItem->GetBoundingBox();
395 }
class MODULE, a footprint
Definition: typeinfo.h:89
virtual const EDA_RECT GetBoundingBox() const
Function GetBoundingBox returns the orthogonal, bounding box of this object for display purposes...
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201

◆ itemIsIncludedByFilter()

static bool itemIsIncludedByFilter ( const BOARD_ITEM aItem,
const BOARD aBoard,
const DIALOG_BLOCK_OPTIONS::OPTIONS aBlockOpts 
)
static

Function itemIsIncludedByFilter()

Determine if an item is included by the filter specified

Returns
true if the parameter indicate the items should be selected by this filter (i..e not filtered out)

Definition at line 1311 of file pcbnew/tools/selection_tool.cpp.

References Edge_Cuts, BOARD_ITEM::GetLayer(), DIALOG_BLOCK_OPTIONS::OPTIONS::includeBoardOutlineLayer, DIALOG_BLOCK_OPTIONS::OPTIONS::includeItemsOnInvisibleLayers, DIALOG_BLOCK_OPTIONS::OPTIONS::includeItemsOnTechLayers, DIALOG_BLOCK_OPTIONS::OPTIONS::includeLockedModules, DIALOG_BLOCK_OPTIONS::OPTIONS::includeModules, DIALOG_BLOCK_OPTIONS::OPTIONS::includePcbTexts, DIALOG_BLOCK_OPTIONS::OPTIONS::includeTracks, DIALOG_BLOCK_OPTIONS::OPTIONS::includeVias, DIALOG_BLOCK_OPTIONS::OPTIONS::includeZones, BOARD::IsLayerVisible(), PCB_DIMENSION_T, PCB_LINE_T, PCB_MODULE_T, PCB_TARGET_T, PCB_TEXT_T, PCB_TRACE_T, PCB_VIA_T, PCB_ZONE_AREA_T, and EDA_ITEM::Type().

Referenced by SELECTION_TOOL::filterSelection().

1314 {
1315  bool include = true;
1316  const PCB_LAYER_ID layer = aItem.GetLayer();
1317 
1318  // can skip without even checking item type
1319  // fixme: selecting items on invisible layers does not work in GAL
1320  if( !aBlockOpts.includeItemsOnInvisibleLayers
1321  && !aBoard.IsLayerVisible( layer ) )
1322  {
1323  include = false;
1324  }
1325 
1326  // if the item needs to be checked against the options
1327  if( include )
1328  {
1329  switch( aItem.Type() )
1330  {
1331  case PCB_MODULE_T:
1332  {
1333  const auto& module = static_cast<const MODULE&>( aItem );
1334 
1335  include = aBlockOpts.includeModules;
1336 
1337  if( include && !aBlockOpts.includeLockedModules )
1338  {
1339  include = !module.IsLocked();
1340  }
1341 
1342  break;
1343  }
1344  case PCB_TRACE_T:
1345  {
1346  include = aBlockOpts.includeTracks;
1347  break;
1348  }
1349  case PCB_VIA_T:
1350  {
1351  include = aBlockOpts.includeVias;
1352  break;
1353  }
1354  case PCB_ZONE_AREA_T:
1355  {
1356  include = aBlockOpts.includeZones;
1357  break;
1358  }
1359  case PCB_LINE_T:
1360  case PCB_TARGET_T:
1361  case PCB_DIMENSION_T:
1362  {
1363  if( layer == Edge_Cuts )
1364  include = aBlockOpts.includeBoardOutlineLayer;
1365  else
1366  include = aBlockOpts.includeItemsOnTechLayers;
1367  break;
1368  }
1369  case PCB_TEXT_T:
1370  {
1371  include = aBlockOpts.includePcbTexts;
1372  break;
1373  }
1374  default:
1375  {
1376  // no filtering, just select it
1377  break;
1378  }
1379  }
1380  }
1381 
1382  return include;
1383 }
class ZONE_CONTAINER, a zone area
Definition: typeinfo.h:102
class TEXTE_PCB, text on a layer
Definition: typeinfo.h:92
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:95
class MODULE, a footprint
Definition: typeinfo.h:89
PCB_LAYER_ID
A quick note on layer IDs:
class DIMENSION, a dimension (graphic item)
Definition: typeinfo.h:100
class PCB_TARGET, a target (graphic item)
Definition: typeinfo.h:101
bool IsLayerVisible(PCB_LAYER_ID aLayer) const
Function IsLayerVisible is a proxy function that calls the correspondent function in m_BoardSettings ...
Definition: class_board.h:458
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:96
class DRAWSEGMENT, a segment not on copper layers
Definition: typeinfo.h:91
virtual PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201