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

1805 {
1806  if( aItem->Type() == PCB_TRACE_T )
1807  {
1808  const TRACK* t = static_cast<const TRACK*>( aItem );
1809  return ( t->GetWidth() + t->GetLength() ) * t->GetWidth();
1810  }
1811 
1812  return getRect( aItem ).GetArea();
1813 }
static EDA_RECT getRect(const BOARD_ITEM *aItem)
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: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 1849 of file selection_tool.cpp.

1850 {
1851  if( !aItem || !aOther )
1852  return 0;
1853 
1854  return getRect( aItem ).Common( getRect( aOther ) ).GetArea();
1855 }
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 1834 of file selection_tool.cpp.

1835 {
1836  double best = 0.0;
1837 
1838  for( int i = 0; i < aCollector.GetCount(); i++ )
1839  {
1840  BOARD_ITEM* item = aCollector[i];
1841  if( item->Type() == aType )
1842  best = std::max( best, calcArea( item ) );
1843  }
1844 
1845  return best;
1846 }
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:597
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 1858 of file selection_tool.cpp.

1859 {
1860  if( a == 0.0 && b == 0.0 )
1861  return 1.0;
1862 
1863  if( b == 0.0 )
1865 
1866  return a / b;
1867 }
#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 811 of file selection_tool.cpp.

812 {
813  // Narrow the collection down to a single BOARD_CONNECTED_ITEM for each represented net.
814  // All other items types are removed.
815  std::set<int> representedNets;
816 
817  for( int i = aCollector.GetCount() - 1; i >= 0; i-- )
818  {
819  BOARD_CONNECTED_ITEM* item = dynamic_cast<BOARD_CONNECTED_ITEM*>( aCollector[i] );
820  if( !item )
821  aCollector.Remove( i );
822  else if ( representedNets.count( item->GetNetCode() ) )
823  aCollector.Remove( i );
824  else
825  representedNets.insert( item->GetNetCode() );
826  }
827 }
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:597

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

753 {
754  // Narrow the collection down to a single TRACK item for a trivial connection, or
755  // multiple TRACK items for non-trivial connections.
756  for( int i = aCollector.GetCount() - 1; i >= 0; i-- )
757  {
758  if( !dynamic_cast<TRACK*>( aCollector[i] ) )
759  aCollector.Remove( i );
760  }
761 
762  ROUTER_TOOL::NeighboringSegmentFilter( aPt, aCollector );
763 }
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:597
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 1795 of file selection_tool.cpp.

1796 {
1797  if( aItem->Type() == PCB_MODULE_T )
1798  return static_cast<const MODULE*>( aItem )->GetFootprintRect();
1799 
1800  return aItem->GetBoundingBox();
1801 }
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 1147 of file selection_tool.cpp.

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