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

static double calcArea ( const BOARD_ITEM aItem)
static

Definition at line 1896 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().

1897 {
1898  if( aItem->Type() == PCB_TRACE_T )
1899  {
1900  const TRACK* t = static_cast<const TRACK*>( aItem );
1901  return ( t->GetWidth() + t->GetLength() ) * t->GetWidth();
1902  }
1903 
1904  return getRect( aItem ).GetArea();
1905 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:95
double GetArea() const
Function GetArea returns the area of the rectangle.
int GetWidth() const
Definition: class_track.h:116
static EDA_RECT getRect(const BOARD_ITEM *aItem)
double GetLength() const
Function GetLength returns the length of the track using the hypotenuse calculation.
Definition: class_track.h:175
static double calcCommonArea ( const BOARD_ITEM aItem,
const BOARD_ITEM aOther 
)
inlinestatic

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

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

Referenced by SELECTION_TOOL::guessSelectionCandidates().

1942 {
1943  if( !aItem || !aOther )
1944  return 0;
1945 
1946  return getRect( aItem ).Common( getRect( aOther ) ).GetArea();
1947 }
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)
static double calcMaxArea ( GENERAL_COLLECTOR aCollector,
KICAD_T  aType 
)
static

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

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

Referenced by SELECTION_TOOL::guessSelectionCandidates().

1927 {
1928  double best = 0.0;
1929 
1930  for( int i = 0; i < aCollector.GetCount(); i++ )
1931  {
1932  BOARD_ITEM* item = aCollector[i];
1933  if( item->Type() == aType )
1934  best = std::max( best, calcArea( item ) );
1935  }
1936 
1937  return best;
1938 }
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:114
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
#define max(a, b)
Definition: auxiliary.h:86
size_t i
Definition: json11.cpp:597
static double calcArea(const BOARD_ITEM *aItem)
double calcRatio ( double  a,
double  b 
)

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

References max.

Referenced by SELECTION_TOOL::guessSelectionCandidates().

1951 {
1952  if( a == 0.0 && b == 0.0 )
1953  return 1.0;
1954 
1955  if( b == 0.0 )
1957 
1958  return a / b;
1959 }
#define max(a, b)
Definition: auxiliary.h:86
void connectedItemFilter ( const VECTOR2I ,
GENERAL_COLLECTOR aCollector 
)

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

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

Referenced by SELECTION_TOOL::selectCopper().

915 {
916  /* Narrow the collection down to a single BOARD_CONNECTED_ITEM for each
917  * represented net. All other items types are removed.
918  */
919  std::set<int> representedNets;
920 
921  for( int i = aCollector.GetCount() - 1; i >= 0; i-- )
922  {
923  BOARD_CONNECTED_ITEM* item = dynamic_cast<BOARD_CONNECTED_ITEM*>( aCollector[i] );
924  if( !item )
925  aCollector.Remove( i );
926  else if ( representedNets.count( item->GetNetCode() ) )
927  aCollector.Remove( i );
928  else
929  representedNets.insert( item->GetNetCode() );
930  }
931 }
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:114
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 GetNetCode() const
Function GetNetCode.
size_t i
Definition: json11.cpp:597
void connectedTrackFilter ( const VECTOR2I aPt,
GENERAL_COLLECTOR aCollector 
)

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

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

Referenced by SELECTION_TOOL::selectConnection().

861 {
862  /* Narrow the collection down to a single TRACK item for a trivial
863  * connection, or multiple TRACK items for non-trivial connections.
864  */
865  for( int i = aCollector.GetCount() - 1; i >= 0; i-- )
866  {
867  if( !dynamic_cast<TRACK*>( aCollector[i] ) )
868  aCollector.Remove( i );
869  }
870 
871  ROUTER_TOOL::NeighboringSegmentFilter( aPt, aCollector );
872 }
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:114
void Remove(int aIndex)
Function Remove removes the item at aIndex (first position is 0);.
Definition: collector.h:143
size_t i
Definition: json11.cpp:597
static void NeighboringSegmentFilter(const VECTOR2I &aPt, GENERAL_COLLECTOR &aCollector)
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 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201
virtual const EDA_RECT GetBoundingBox() const
Function GetBoundingBox returns the orthogonal, bounding box of this object for display purposes...
class MODULE, a footprint
Definition: typeinfo.h:89
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 1280 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(), MODULE::IsLocked(), PCB_TOOL::module(), 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().

1283 {
1284  bool include = true;
1285  const PCB_LAYER_ID layer = aItem.GetLayer();
1286 
1287  // can skip without even checking item type
1288  // fixme: selecting items on invisible layers does not work in GAL
1289  if( !aBlockOpts.includeItemsOnInvisibleLayers
1290  && !aBoard.IsLayerVisible( layer ) )
1291  {
1292  include = false;
1293  }
1294 
1295  // if the item needs to be checked against the options
1296  if( include )
1297  {
1298  switch( aItem.Type() )
1299  {
1300  case PCB_MODULE_T:
1301  {
1302  const auto& module = static_cast<const MODULE&>( aItem );
1303 
1304  include = aBlockOpts.includeModules;
1305 
1306  if( include && !aBlockOpts.includeLockedModules )
1307  {
1308  include = !module.IsLocked();
1309  }
1310 
1311  break;
1312  }
1313  case PCB_TRACE_T:
1314  {
1315  include = aBlockOpts.includeTracks;
1316  break;
1317  }
1318  case PCB_VIA_T:
1319  {
1320  include = aBlockOpts.includeVias;
1321  break;
1322  }
1323  case PCB_ZONE_AREA_T:
1324  {
1325  include = aBlockOpts.includeZones;
1326  break;
1327  }
1328  case PCB_LINE_T:
1329  case PCB_TARGET_T:
1330  case PCB_DIMENSION_T:
1331  {
1332  if( layer == Edge_Cuts )
1333  include = aBlockOpts.includeBoardOutlineLayer;
1334  else
1335  include = aBlockOpts.includeItemsOnTechLayers;
1336  break;
1337  }
1338  case PCB_TEXT_T:
1339  {
1340  include = aBlockOpts.includePcbTexts;
1341  break;
1342  }
1343  default:
1344  {
1345  // no filtering, just select it
1346  break;
1347  }
1348  }
1349  }
1350 
1351  return include;
1352 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:201
virtual PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
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
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
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:457