KiCad PCB EDA Suite
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_drawsegment.h>
#include <class_zone.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 <preview_items/selection_area.h>
#include <painter.h>
#include <bitmaps.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 <id.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

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 EDA_RECT getRect (const BOARD_ITEM *aItem)
 
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 1824 of file selection_tool.cpp.

1825 {
1826  if( aItem->Type() == PCB_TRACE_T )
1827  {
1828  const TRACK* t = static_cast<const TRACK*>( aItem );
1829  return ( t->GetWidth() + t->GetLength() ) * t->GetWidth();
1830  }
1831 
1832  return getRect( aItem ).GetArea();
1833 }
static EDA_RECT getRect(const BOARD_ITEM *aItem)
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:96
double GetLength() const
Function GetLength returns the length of the track using the hypotenuse calculation.
Definition: class_track.h:149
double GetArea() const
Function GetArea returns the area of the rectangle.
int GetWidth() const
Definition: class_track.h:103
KICAD_T Type() const
Function Type()
Definition: base_struct.h:210

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

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

◆ calcCommonArea()

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

Definition at line 1869 of file selection_tool.cpp.

1870 {
1871  if( !aItem || !aOther )
1872  return 0;
1873 
1874  return getRect( aItem ).Common( getRect( aOther ) ).GetArea();
1875 }
static EDA_RECT getRect(const BOARD_ITEM *aItem)
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.

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

Referenced by SELECTION_TOOL::GuessSelectionCandidates().

◆ calcMaxArea()

static double calcMaxArea ( GENERAL_COLLECTOR aCollector,
KICAD_T  aType 
)
static

Definition at line 1854 of file selection_tool.cpp.

1855 {
1856  double best = 0.0;
1857 
1858  for( int i = 0; i < aCollector.GetCount(); i++ )
1859  {
1860  BOARD_ITEM* item = aCollector[i];
1861  if( item->Type() == aType )
1862  best = std::max( best, calcArea( item ) );
1863  }
1864 
1865  return best;
1866 }
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class,...
static double calcArea(const BOARD_ITEM *aItem)
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:113
#define max(a, b)
Definition: auxiliary.h:86
size_t i
Definition: json11.cpp:649
KICAD_T Type() const
Function Type()
Definition: base_struct.h:210

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

Referenced by SELECTION_TOOL::GuessSelectionCandidates().

◆ calcRatio()

double calcRatio ( double  a,
double  b 
)

Definition at line 1878 of file selection_tool.cpp.

1879 {
1880  if( a == 0.0 && b == 0.0 )
1881  return 1.0;
1882 
1883  if( b == 0.0 )
1885 
1886  return a / b;
1887 }
#define max(a, b)
Definition: auxiliary.h:86

References max.

Referenced by SELECTION_TOOL::GuessSelectionCandidates().

◆ connectedItemFilter()

void connectedItemFilter ( const VECTOR2I ,
GENERAL_COLLECTOR aCollector 
)

Definition at line 815 of file selection_tool.cpp.

816 {
817  // Narrow the collection down to a single BOARD_CONNECTED_ITEM for each represented net.
818  // All other items types are removed.
819  std::set<int> representedNets;
820 
821  for( int i = aCollector.GetCount() - 1; i >= 0; i-- )
822  {
823  BOARD_CONNECTED_ITEM* item = dynamic_cast<BOARD_CONNECTED_ITEM*>( aCollector[i] );
824  if( !item )
825  aCollector.Remove( i );
826  else if ( representedNets.count( item->GetNetCode() ) )
827  aCollector.Remove( i );
828  else
829  representedNets.insert( item->GetNetCode() );
830  }
831 }
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:142
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:113
size_t i
Definition: json11.cpp:649

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

Referenced by SELECTION_TOOL::selectCopper().

◆ connectedTrackFilter()

void connectedTrackFilter ( const VECTOR2I aPt,
GENERAL_COLLECTOR aCollector 
)

Definition at line 756 of file selection_tool.cpp.

757 {
758  // Narrow the collection down to a single TRACK item for a trivial connection, or
759  // multiple TRACK items for non-trivial connections.
760  for( int i = aCollector.GetCount() - 1; i >= 0; i-- )
761  {
762  if( !dynamic_cast<TRACK*>( aCollector[i] ) )
763  aCollector.Remove( i );
764  }
765 
766  ROUTER_TOOL::NeighboringSegmentFilter( aPt, aCollector );
767 }
void Remove(int aIndex)
Function Remove removes the item at aIndex (first position is 0);.
Definition: collector.h:142
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:113
size_t i
Definition: json11.cpp:649
static void NeighboringSegmentFilter(const VECTOR2I &aPt, GENERAL_COLLECTOR &aCollector)

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

Referenced by SELECTION_TOOL::selectConnection().

◆ getRect()

static EDA_RECT getRect ( const BOARD_ITEM aItem)
static

Definition at line 1815 of file selection_tool.cpp.

1816 {
1817  if( aItem->Type() == PCB_MODULE_T )
1818  return static_cast<const MODULE*>( aItem )->GetFootprintRect();
1819 
1820  return aItem->GetBoundingBox();
1821 }
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:210

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

Referenced by calcArea(), and calcCommonArea().

◆ 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 1151 of file selection_tool.cpp.

1154 {
1155  bool include = true;
1156  const PCB_LAYER_ID layer = aItem.GetLayer();
1157 
1158  // can skip without even checking item type
1159  // fixme: selecting items on invisible layers does not work in GAL
1160  if( !aBlockOpts.includeItemsOnInvisibleLayers
1161  && !aBoard.IsLayerVisible( layer ) )
1162  {
1163  include = false;
1164  }
1165 
1166  // if the item needs to be checked against the options
1167  if( include )
1168  {
1169  switch( aItem.Type() )
1170  {
1171  case PCB_MODULE_T:
1172  {
1173  const auto& module = static_cast<const MODULE&>( aItem );
1174 
1175  include = aBlockOpts.includeModules;
1176 
1177  if( include && !aBlockOpts.includeLockedModules )
1178  {
1179  include = !module.IsLocked();
1180  }
1181 
1182  break;
1183  }
1184  case PCB_TRACE_T:
1185  {
1186  include = aBlockOpts.includeTracks;
1187  break;
1188  }
1189  case PCB_VIA_T:
1190  {
1191  include = aBlockOpts.includeVias;
1192  break;
1193  }
1194  case PCB_ZONE_AREA_T:
1195  {
1196  include = aBlockOpts.includeZones;
1197  break;
1198  }
1199  case PCB_LINE_T:
1200  case PCB_TARGET_T:
1201  case PCB_DIMENSION_T:
1202  {
1203  if( layer == Edge_Cuts )
1204  include = aBlockOpts.includeBoardOutlineLayer;
1205  else
1206  include = aBlockOpts.includeItemsOnTechLayers;
1207  break;
1208  }
1209  case PCB_TEXT_T:
1210  {
1211  include = aBlockOpts.includePcbTexts;
1212  break;
1213  }
1214  default:
1215  {
1216  // no filtering, just select it
1217  break;
1218  }
1219  }
1220  }
1221 
1222  return include;
1223 }
class ZONE_CONTAINER, a zone area
Definition: typeinfo.h:101
class TEXTE_PCB, text on a layer
Definition: typeinfo.h:92
class TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:96
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:99
class PCB_TARGET, a target (graphic item)
Definition: typeinfo.h:100
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:450
class VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:97
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:210

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().